バックテストの資産曲線が右肩上がりでも、同じ条件を実際に注文すると利益が消えることがあります。原因は手法そのものより、未来の終値を同じ終値で約定させる、現在残っている銘柄だけを使う、指値が触れれば全株約定とする、手数料を0円にするといった検証条件にあります。
バックテストは「過去なら儲かったか」を眺める作業ではありません。ある時点で入手できた情報から注文を作り、次に約定できる価格と数量を通し、費用を引いて資産を更新する再現実験です。この記事では、必要データ、先読み・生存者バイアス、約定モデル、費用、時系列分割、比較対象、注文・撤退・数量・見送りまでを、日足の架空例で順番に解説します。
検証を始める前に、情報時点、シグナル時刻、注文時刻、注文種別、約定価格、未約定、費用、数量、対象銘柄、評価指標を文書で固定します。終値で判定する日足戦略なら、原則として同じ終値ではなく翌営業日の実行可能価格を使います。結果を見て条件を変えたら、別の未使用期間で評価し直してください。
バックテストとは?売買ルールを時系列で再生する検証
バックテストは、あらかじめ定めた売買ルールを過去データへ適用し、シグナル、注文、約定、費用、保有残高、損益を時系列に沿って計算する方法です。目的は未来の利益を保証することではなく、ルールの性質、弱い相場、費用への感度、必要資金、過去に起きた最大損失を把握することです。
価格条件だけでは売買ルールになりません。「20日高値を超えたら買う」にも、終値確定で判定するのか場中に発注するのか、成行か指値か、何株か、いつ取り消すか、ギャップ時にどうするか、損切りと利確が同じ足で触れたらどちらを先にするかが必要です。
| 固定する項目 | 悪い記述 | 再現できる記述例 |
|---|---|---|
| 判定 | 上がりそうなら買う | t日の終値が過去20営業日の最高値を上回れば買い候補 |
| 注文 | シグナルで買う | t日引け後に注文を作り、t+1日寄りで成行 |
| 数量 | 100万円分 | 1回の予定損失を口座の0.5%以内、単元へ切り下げ |
| 撤退 | 弱くなれば売る | 終値が10日安値割れ、または20営業日経過で翌日成行 |
| 費用 | 考慮する | 料金表の手数料+売買スプレッド+不利なスリッページ |
| 見送り | 危険なら見送る | 翌日寄りが予定価格より5%超上なら新規注文を取り消す |

最初にそろえるデータ――価格より「その時点」を重視する
株式の日足検証では、日付、始値、高値、安値、終値、出来高に加え、銘柄コード、上場・廃止日、市場区分、株式分割・併合、配当、売買停止、値幅制限などを用途に応じてそろえます。財務指標を使うなら、決算対象期間だけでなく公表日時が必要です。後日修正された値を、修正前の日付から使わないためです。
JPXグループのJ-Quants APIは、ヒストリカル株価や企業財務情報などを配信し、2026年にはV2へ移行しています。データ仕様は更新され得るため、取得日、API版、フィールド、調整方法を保存します(J-Quants API公式仕様)。再検証で結果が変わったとき、ルール変更なのかデータ改訂なのかを分けるためです。
調整価格と実際の注文価格を混同しない
株式分割をまたぐ移動平均は連続性を保つ調整価格で計算できます。しかし、過去の注文を現在単位へ置き換えた調整価格そのもので約定したわけではありません。シグナル計算用の系列と、当時の実価格・株数・配当キャッシュフローを区別します。調整の考え方はチャートの価格調整の記事も参照してください。
生存者バイアスを避ける
2026年に上場している銘柄だけを過去へさかのぼらせると、倒産、上場廃止、吸収合併で消えた銘柄が抜けます。過去時点の指数構成や市場在籍銘柄を再現し、廃止までの価格と最終処理を含めます。完全な履歴を得られない場合は、対象を「現在の銘柄集合」と明記し、結果が上方へ偏る可能性を限界として残します。
先読みバイアスとは?まだ知らない情報を使う誤り
先読みバイアスは、検証時点では利用できなかった未来の情報を判定や約定に使うことです。典型例は「t日の終値が移動平均を上回った」とt日の引け後に確定したのに、t日の終値で買えたことにする処理です。終値を確定させる最後の取引と、判定後の自分の注文を同じ価格・同じ時刻へ重ねています。
日足で引け後に計算するなら、成行注文の基本モデルは翌営業日の寄りです。TradingViewの公式ドキュメントも、標準の計算ではバー終値で注文を生成し、ブローカーエミュレーターが約定できる最初の時点は次の利用可能なティック、すなわち次のバーの始値になると説明しています(TradingView「Strategies」)。同日引け注文を実際に出せる商品・締切・仕組みがある場合だけ、その時刻までに利用できた情報で別モデルを作ります。

| 情報 | 使える最初の目安 | よくある先読み |
|---|---|---|
| 日足終値 | 当日の引け後 | 終値で判定し、同じ終値で約定 |
| 決算数値 | 公表日時以後 | 決算期末から公表日までを無視 |
| 指数採用 | 公表・適用ルールに従う | 現在の構成銘柄を過去にも使用 |
| 後日修正値 | 修正公表後 | 最新版を元の公表日から使用 |
| 当日高値・安値 | その価格が付いた後 | 日中順序を知らず両方を都合よく約定 |
約定モデル――「価格に触れた」と「買えた」は違う
バックテストの約定モデルは、注文種別ごとに分けます。成行は次の利用可能価格、買い指値は指値以下で売り手がいる場合、買い逆指値はトリガー後に成行または指値へ変わる、といった順序です。日足OHLCだけでは、同じ日の高値と安値のどちらが先か分かりません。損切りと利確が同じ足に入った場合、利益側を常に先にすると成績が上がります。
TradingViewのブローカーエミュレーターは、下位足がない標準設定でOHLCから足内の値動きを仮定し、ギャップをまたいで注文価格を通過した場合は次のバー始値で約定させます。また、指値は価格到達だけでは現実に必ず全数量が約定するとは限らないとし、価格検証や高詳細データの設定を用意しています(同公式資料「Broker emulator」)。どのソフトを使っても、既定値を成績の真実とせず、仮定を成績表へ書きます。
| 注文 | 保守的な日足モデル例 | 見落としやすい点 |
|---|---|---|
| 成行 | 次のバー始値+不利なスリッページ | 窓開け、寄り付きの急な気配 |
| 指値 | 価格到達に加え、出来高・価格余裕を要求 | 順番待ち、部分約定、タッチだけ |
| 逆指値 | トリガー後の次の可能価格 | ストップ価格で必ず売れるとは限らない |
| 同一足の利確と損切り | 下位足確認、なければ不利側を先にする | OHLCだけでは順序不明 |
| 大口注文 | 出来高比率へ上限、分割約定 | 自分の注文による市場インパクト |
架空の1取引で時刻を確認する
説明用に、t日の終値1,000円で買い条件が確定し、翌日の寄りが1,040円だったとします。同じ終値1,000円で買った検証は40円のギャップを消しています。100株なら入口だけで4,000円の差です。さらに売り注文のギャップ、手数料、スプレッド、スリッページが加わります。これは手法の実績ではなく、約定時刻の違いを示す架空例です。入口の40円だけでも、株数を掛けると無視できない差になります。架空例の小さなずれから、自分が実際に買える条件へ戻る意味が見えます。
手数料・スプレッド・スリッページを毎回引く
費用後損益は、売却代金から購入代金、売買手数料、取引所等の費用、スプレッド、スリッページ、必要に応じて信用金利・貸株料・配当相当額を差し引きます。税は口座や個人条件で異なるため、手法固有の費用と分けてシナリオ計算すると比較しやすくなります。
費用後損益 = 売却約定代金 − 購入約定代金 − 手数料 − 金利等 − 執行摩擦
検証ソフトの初期値が0だから0円でよい、とは限りません。TradingView公式資料は、手数料を指定しなければ約定へ手数料を適用しないこと、既定のスリッページも0であることを明記しています。また、スリッページは変動性、流動性、注文量などで動き、正確な再現はできないと説明しています(Commission、Slippage and unfilled limits)。通常時だけでなく、費用を2倍・3倍にした感度分析も行います。
| 摩擦 | 基本シナリオ | 悪化シナリオ | 見送り条件例 |
|---|---|---|---|
| 手数料 | 現行料金表 | 最低料金・変更後も試算 | 費用後期待値が負 |
| スプレッド | 通常時の中央値 | 寄り・引け・急変時 | 想定利益幅の一定割合超 |
| スリッページ | 実績中央値 | 上位10%や固定tick増 | 損益分岐を超える |
| 出来高 | 注文量を出来高の小割合 | 出来高半減を想定 | 部分約定で数量を満たせない |
| 信用・空売り | 金利・貸株料を日割り | 逆日歩・在庫制約 | 在庫なし、費用不明 |
条件調整と評価期間を分ける
全期間を見ながら移動平均日数、損切り幅、利確幅を調整し、同じ全期間の最高成績を採用すると、過去の偶然へ合わせています。パラメータを10通り、100通りと試すほど、実力がなくても良く見える組み合わせが生まれます。CarrとLópez de Pradoの研究は、履歴シミュレーションで多数の代替設定を調整することがバックテスト過剰適合を生み、アウト・オブ・サンプルの低迷につながる問題を扱っています(“Determining Optimal Trading Rules without Backtesting”)。
時系列は無作為に混ぜません。scikit-learnの公式文書も、通常の交差検証では未来データで学習して過去を評価することになるため、時間順データにはTimeSeriesSplitを用いると説明しています(TimeSeriesSplit公式文書)。学習・調整に使う期間、その後の検証期間、最後に一度だけ見る未使用期間を前後関係のまま分けます。

ウォークフォワードでは、過去の一定期間でルールを固定し、直後の期間で評価し、窓を先へ進めます。再調整の頻度も事前に決めます。毎日成績が悪いから微調整すると、実運用中にもノイズへ追随します。パラメータ一点だけでなく、近い設定でも成績が崩れないかを確認し、試した総数を記録します。
結果は何と比べる?現金・指数・単純ルールを置く
利益が出たというだけでは手法の価値は分かりません。同期間の現金、配当込み市場指数、同程度の株式エクスポージャー、単純な買い持ちと比べます。手法が市場に参加していた比率、平均保有期間、最大投下資金もそろえます。資金の20%しか使わない手法と常時100%の指数を、総利益だけで競わせると判断を誤ります。
最低限、総リターン、年率リターン、取引数、勝率、平均利益・損失、期待値、プロフィットファクター、最大ドローダウン、最大連敗、回復期間、月次・年次、売買回転率、費用前後を出します。指標の式と読み方は勝率・期待値・最大ドローダウンの記事で詳しく解説しています。
| 見る軸 | 確認する問い | 赤信号 |
|---|---|---|
| 再現性 | 未使用期間・別銘柄群でも方向が同じか | 学習期間だけ突出 |
| 集中 | 利益が1銘柄・1年・1回へ偏っていないか | 最大利益を除くとマイナス |
| 費用耐性 | 摩擦を増やしても残るか | 小さな費用増で期待値が負 |
| 下落 | DDの深さと回復期間を許容できるか | 必要資金・心理限界を超える |
| 実行可能性 | 出来高・単元・注文時刻に無理がないか | 理論数量を約定できない |
仮想成績を実績のように扱わない
バックテストは実際の売買記録ではありません。米CFTC規則17 CFR 4.41は、仮想・シミュレーション成績には本質的な限界があり、実際の売買ではないこと、流動性などの市場要因を過大・過小評価し得ること、後知恵で作られることなどを注意表示の中心に置いています(eCFR §4.41)。対象法域や商品にかかわらず、記事や成績表では「バックテスト」「架空例」「実績」を分けて表示します。
また、米SECの投資助言業者向けマーケティングFAQは、グロス成績とネット成績を同じ期間・同じ種類のリターン・同じ方法で計算し、比較しやすく示す考え方を確認しています(2026年1月15日更新、SEC公式FAQ)。個人の学習用検証でも、費用前の良い数字だけを大きく見せず、費用後を同じ条件で並べるのが安全です。
注文・撤退・数量・見送りへ変換する
検証結果は、実際に実行できる規則へ変換して初めて役に立ちます。以下は成績ではなく設計例です。口座資金500万円、1回の許容損失0.5%=2万5,000円、買い予定1,040円、初期ストップ970円、ギャップ・費用余裕を1株30円とすると、1株リスクは100円です。数量上限は25,000÷100=250株なので、100株単位なら200株へ切り下げます。
- 注文:終値確定後に作成し、翌日寄り成行。寄りが予定より5%超高ければ取り消す。
- 撤退:終値で損切り条件が確定した翌日寄り、または事前に置いた逆指値。ギャップ約定を許容する。
- 数量:許容損失÷(入口とストップの差+費用余裕)。単元へ切り下げ、出来高上限も適用する。
- 見送り:必要データが欠損、売買停止、決算またぎ禁止、スプレッド過大、1単元で許容損失超過。
- 停止:実績スリッページが想定を継続超過、資産DDが警戒線到達、データ・実装不具合、市場制度変更。
数量計算の詳しい考え方はポジションサイズの記事も参照してください。バックテストの最大ドローダウンは将来損失の上限ではないため、検証値へ達する前に縮小・停止線を置きます。
実装ミスを見つける小さなテスト
コードを書き終えたら、いきなり10年分を流すのではなく、手計算できる5〜10本の架空バーで単体テストをします。シグナルが出ない期間、ちょうど閾値と同じ価格、窓を開けた寄り、指値へ触れない日、分割日、売買停止、最終日に未決済のポジションなどを意図的に含めます。1件ずつ、入力、判定、注文、約定、残高を表計算と照合します。
特に注意したいのが境界条件です。「20日高値超え」を > とするか >= とするか、指値が安値と同値なら約定とするか、欠損日に前日の価格を埋めるかで結果が変わります。欠損を0や前日値で自動補完すると、存在しない取引日や出来高を作る場合があります。欠損理由を調べ、売買しない、銘柄を除外する、データを再取得する、のどれかを明示します。
売買ログは少なくとも、銘柄、情報時点、シグナル時刻、注文時刻、注文種別、注文価格・数量、有効期限、約定時刻・価格・数量、未約定理由、各費用、ポジション、現金、時価、総資産を1行ごとに保存します。集計表だけでは「なぜこの日に買ったか」を追えません。乱数を使うスリッページや順序モデルでは乱数シードも保存し、同じ入力から同じ結果を再現できるようにします。
バージョンを変えたら結果を混ぜない
ルール、データ、コード、料金、銘柄集合のどれかを変えたら、検証IDを新しくします。「v1は翌日寄り、v2は翌日VWAP」「v1は手数料0、v2は現行料金」のように差分を残します。良くなった部分だけを旧版へ足すと、採用理由と試行回数が見えなくなります。公開時は使用版、検証日、変更履歴を添え、後から同じ数字を復元できる状態にします。
バックテスト公開前の15項目チェックリスト
- ルールを結果を見る前に文書化した。
- データ提供元、取得日、版、対象期間を保存した。
- 過去時点の銘柄集合と上場廃止を扱った。
- 分割・併合・配当と株数を整合させた。
- 財務・指数情報は公表時刻以後だけで使った。
- シグナル時刻より前の価格で約定していない。
- 成行・指値・逆指値の約定条件を分けた。
- 同一足で複数注文が触れる場合の順序を決めた。
- 未約定・部分約定・出来高上限を扱った。
- 手数料、スプレッド、スリッページ、金利等を引いた。
- 学習・調整と未使用テストを時間順に分けた。
- 試した条件数と不採用条件も記録した。
- 現金・指数・単純ルールと同条件で比較した。
- 費用前後、DD、連敗、期間別の結果を示した。
- 注文・撤退・数量・見送り・停止へ変換した。
まとめ:良いバックテストは、良い資産曲線より良い監査ログ
バックテストの精度を決めるのは、指標の種類より情報と注文の順番です。過去時点のデータを使い、知り得た時刻の後で注文し、次の実行可能価格で約定させ、未約定と費用を含めます。現在の生存銘柄だけを使わず、調整価格と実価格を分け、結果を見た期間は未使用扱いに戻しません。知った後に注文できる価格で考える。この地味な順番を守った結果こそ、自分の売買を見直す材料にしたいです。きれいな資産曲線への期待とは分けておきます。
魅力的な資産曲線より、データ、シグナル、注文、約定、費用、資産更新を追える監査ログの方が価値があります。再現できない好成績は採用せず、条件を1つずつ保守的にしても残るかを確認してください。投資辞典の索引から、期待値、資金管理、出口ルールと組み合わせると、検証を実運用の判断へつなげられます。
本記事は投資手法の学習を目的とし、特定銘柄の売買を推奨するものではありません。数値例は架空で、バックテストおよびシミュレーションは将来の利益・損失を保証しません。投資判断はご自身の責任でお願いいたします。記載の数値は、本文中に示した日付時点の決算短信・会社のIR資料などの公開情報に基づきます。最新の情報は各社の開示でご確認ください。

