TradingViewバックテスト期間の決め方|準備期間・開始日・データ範囲
「2022年から検証した」と書いてあっても、2022年からしかデータを読んでいないのか、それ以前を指標計算に使い2022年から注文したのかで意味は違います。TradingViewの履歴開始点、Pineの計算準備、注文可能期間、期間末の未決済を分けなければ、同じ設定を再実行しても標本がそろいません。本記事は未使用期間やウォークフォワードの設計ではなく、その前段にある時間範囲の整合だけを扱います。
この記事が役立つ方: バックテスト開始日を固定したい人/期間を変えると取引数や結果が大きく変わるPine開発者/比較可能なCSVを作りたい人
まず押さえる重要ポイント
- データ取得範囲、ウォームアップ範囲、注文可能範囲、決済完了範囲を一つの「期間」と呼ばず分けて記録する。
- 開始日フィルターは開始日前の計算まで止めず、指標を準備したうえで注文だけを許可する設計が基本になる。
calc_bars_countはスクリプトが利用する最近の履歴バー数を制限し、過去データを新しく作り出す設定ではない。- 通常のストラテジーテスターとディープバックテストは利用する履歴範囲が異なり得るため、同じ結果になると仮定しない。
- 比較用CSVには設定した開始・終了日だけでなく、最初/最後の実取引時刻、取引数、未決済の有無も添える。
開始日より前のバーにも役割がある
- 01
Pineが読み得る母体
- 02
指標を準備し、注文は出さない
- 03
条件が整えば注文可能
- 04
未決済取引と確定標本を分ける
結論:「計算した期間」と「取引した期間」を分ける
再現可能な期間設定は、一本の開始日と終了日では表せません。最低でも①Pineが利用できた履歴、②指標や状態変数を準備した準備期間、③新規注文を許可した期間、④期間末に建玉をどう扱ったか、の四つを記録します。
| 層 | 開始を決めるもの | 終了を決めるもの | 結果への影響 |
|---|---|---|---|
| 取得可能なデータ | 銘柄・時間足・プラン・通常/ディープバックテスト | 実行時点とデータ上限 | 計算できる母集団 |
| 準備期間 | 計算開始バー | 全依存系列が利用可能になるバー | 初期naと状態の安定性 |
| 注文可能期間 | input.time()などの開始条件 | 終了条件 | エントリー候補と取引数 |
| 終了処理の境界 | 最終エントリーまたは終了処理 | 最後の決済 | 決済済み取引/未決済取引の区分 |
同じ「2022–2025」でも四層のどこを指すかで意味が変わります。
チャートに見える範囲とストラテジーが計算した範囲を混同しない
通常のストラテジーは、現在のデータセットでアクセスできる歴史バーを順に計算します。利用可能な開始点は銘柄、時間足、データ提供状況、利用プラン、実行時点で変わり得ます。今日と後日の通常テストで最初のバーが動けば、累積状態や初期取引が変わる可能性があります。
ディープバックテストは、チャートに現在読み込まれたバーだけでなく、選択銘柄についてTradingViewが保持する利用可能履歴を使い、指定日付範囲でレポートを計算する別モードです。通常モードと母体が違えば、同じコード・入力値でも結果が一致する保証はありません。また日内履歴の長さは銘柄と時間足で異なり、公式のバー/取引上限もあります。
| 要因 | 変わるもの | 記録する値 |
|---|---|---|
| Symbol | 上場開始・データ欠損・取引所履歴 | 完全なticker ID |
| Timeframe | バー数と到達できる年月 | 時間足文字列 |
| 通常/ディープバックテスト | 計算対象の履歴母体 | テストモード |
| プラン/実行日 | 利用可能バー上限・移動開始点 | 実行日とプラン条件 |
| calc_bars_count | スクリプトが使う最近のバー数 | 設定したバー数 |
「全期間」と書かず、最初と最後の利用可能バーを実測して残します。
最大参照期間だけでなく依存関係が準備完了かを確認する
単純移動平均50なら、少なくとも初期バーでは値がnaになります。しかし準備期間を常に「最大期間と同じ」と決めるのも危険です。ATRを平均し、その結果を百分位へ入れるような連鎖では、外側の関数が利用できる系列を得るまで追加バーが必要です。再帰型のEMAや状態機械は、値が出た最初のバーと十分に馴染んだバーを同一視できません。
必要な準備期間 ≠ 常に入力期間の最大値利用可能な評価バー数 = 取得可能バー数 − 準備期間バー数 − 期間末バッファカバー率 = 利用可能な評価バー数 ÷ 希望する評価バー数 × 100準備状況はコードの依存グラフで決めます。統計的な「十分な標本数」とは別問題です。- エントリー条件に使う全系列が非naか
- 高時間足参照要求の最初の確定値が利用可能か
- varで保持する状態が意図した初期状態から始まったか
- 期間開始前の保有中の建玉や未約定注文が残っていないか
- 最初の対象取引だけ異常な数量・価格になっていないか
開始日前も計算し、開始日から注文だけを許可する
input.time()で開始・終了時刻を受け取り、timeを比較すれば、バーが注文可能期間にあるか判定できます。重要なのは、移動平均やATRなどの計算をifの外で毎バー実行し、期間条件をエントリー条件へ追加することです。開始日前のバーを準備期間へ使いながら、過去注文は作りません。
終了日の意味も決めます。終了後は新規エントリーだけ止めて既存建玉の自然な決済を待つのか、最初の終了後バーでstrategy.close_all()するのかで、最後の取引と損益が変わります。どちらが普遍的に正しいわけではありませんが、比較する全実行で同じ規則が必要です。
| 方式 | 新規エントリー | 既存建玉 | 注意 |
|---|---|---|---|
| エントリー終了境界 | 終了日で停止 | 通常決済まで継続 | 最後の決済が終了日を越える |
| 強制終了 | 終了日で停止 | 終了後に成行決済 | 人工的な期間末決済が入る |
| 決済済み取引のみ | 任意の期間条件 | 未決済取引を集計対象外として記録 | 画面集計と外部集計の範囲差を確認 |
ファイル名と分析メモに採用方式を残します。
準備期間と日付条件を別の真偽値で可視化する
次のコードは、長い移動平均が非naになったことをready、設定した日付範囲をinWindowとして別々に表示します。単純な交差条件は仕組み確認用であり、投資判断や将来成績を示しません。終了後は新規エントリーを止め、未決済の買い建玉があれば一度だけ決済します。
//@version=6
strategy("Warm-up and date-window audit", overlay = true,
initial_capital = 100000, margin_long = 100, margin_short = 100)
int fastLength = input.int(20, "Fast length", minval = 1)
int slowLength = input.int(100, "Slow length", minval = 2)
int startTime = input.time(timestamp("01 Jan 2020 00:00 +0000"), "Entry start")
int endTime = input.time(timestamp("31 Dec 2024 23:59 +0000"), "Entry end")
float fast = ta.sma(close, fastLength)
float slow = ta.sma(close, slowLength)
bool ready = not na(fast) and not na(slow)
bool inWindow = time >= startTime and time <= endTime
bool mayEnter = ready and inWindow
if mayEnter and ta.crossover(fast, slow) and strategy.position_size == 0
strategy.entry("Long", strategy.long)
if ready and ta.crossunder(fast, slow) and strategy.position_size > 0
strategy.close("Long", comment = "Rule exit")
if time > endTime and time[1] <= endTime and strategy.position_size != 0
strategy.close_all(comment = "Window end")
bgcolor(not ready ? color.new(color.gray, 86) :
not inWindow ? color.new(color.orange, 90) : color.new(color.green, 92))
plot(fast, "Fast", color.aqua)
plot(slow, "Slow", color.orange)日付、タイムゾーン、終了処理は検証目的に合わせて固定してください。終了バーがデータに存在しない場合の挙動も確認します。
デバッグ時は、灰色=準備未完了、橙=計算済みだが注文対象外、緑=注文対象という三状態をスクリーンショットと設定記録に残します。開始日を変えても準備完了開始バーが同じか、終了処理が一度だけ実行されたかを取引一覧で確認します。
希望期間ではなく実際に残った対象バーを数える
期間を設定しても、銘柄にデータがなければそのバーは生まれません。準備期間と期間末バッファを引いた後の利用可能なバー数が希望評価バーを下回るなら、日付ラベルだけが長くても標本は不足しています。ミニ計算機ではこの算術的な不足を可視化します。取引数の統計的十分性は別途評価してください。
- 設定した日付範囲を記録
模擬取引の範囲と実際のバックテスト範囲を控えます。
- 最初の準備完了バーを記録
全依存系列が利用可能になった時刻をPineで表示します。
- 最初と最後のエントリーを記録
設定日ではなく実際の取引時刻を取引一覧から取ります。
- 未決済取引を分類
期間末決済、自然決済、未決済除外のどれかを記録します。
- CSVへ前提を添える
方式、銘柄、時間足、実行日、開始/終了、準備期間、取引数を一緒に保存します。
四つの境界を再現条件表として固定する
- 銘柄、時間足、通常/ディープバックテスト、実行日を記録したか
- 設定開始日と最初の実取引日を分けたか
- 準備期間根拠と最初の準備完了バーを残したか
- 終了後のエントリー停止と未決済取引の処理を明文化したか
- 最初/最後の取引、決済済み取引数、未決済件数を確認したか
- 期間以外の入力値、数量、コストを固定したか
日付欄だけでは再現できないため、取得可能なデータ、準備期間、注文可能期間、終了処理の境界を一行ずつ持つ四境界の再現条件表を作ります。各行に設定値だけでなく、最初/最後に実際に観測したバーまたは取引時刻を入れ、期待窓と実測窓を分けます。
再現条件表にはバージョンID、銘柄、時間足、通常/ディープバックテストの方式、実行日、タイムゾーン、最初の取得可能バー、最初の準備完了バー、最初/最後の対象注文、終了時の未決済建玉方針を保存します。この鍵が一致しないCSV同士は比較対象へ入れません。
準備期間後の評価バー数
利用可能バーから準備期間と期間末バッファを引き、希望評価バーをどこまで満たすか確認します。
計算:利用可能=max(a−b−d,0)、対象範囲=min(利用可能÷c×100,100)、不足=max(c−利用可能,0)。欠損、取引休止、インジケーターの安定性、取引数の十分性は評価しません。
よくある質問
バックテスト開始日とデータ開始日は同じですか?
同じとは限りません。データと計算は開始日前から存在し、注文だけを設定開始日から許可できます。この設計なら開始日前のバーを準備期間へ使えます。
準備期間は最長のインジケーター 期間と同じで十分ですか?
常に十分とは限りません。複数段の計算、高時間足参照要求、再帰型指標、状態変数など、依存関係全体を確認します。非naになった最初のバーと安定した状態も区別します。
calc_bars_countを増やせば過去データも増えますか?
存在する履歴のうちスクリプトが利用するバー数へ関係する設定であり、TradingViewに存在しない市場データを作るものではありません。銘柄・時間足・プラン側の履歴上限も残ります。
期間終了時に保有中の建玉が残ったらどう扱いますか?
普遍的な一択はありません。終了前に新規エントリーを止めて自然決済を待つ、境界で明示決済する、未決済として別集計する等の方針を先に決め、全版へ同じ規則を適用して再現条件表へ記録します。
根拠資料と確認先
- TradingView Pine Script — Execution model利用可能バー、calc_bars_count、履歴バーの実行順序に関する公式仕様。
- TradingView Pine Script — Strategies FAQ日付・時間フィルター、履歴開始点による結果変化の公式FAQ。
- TradingView Pine Script — Strategiesストラテジーテスターの日付範囲、プロパティ、バックテストに関する公式解説。
- TradingView Help — How Deep Backtesting worksディープバックテストの範囲選択と表示に関する公式説明。
- TradingView Help — Deep Backtesting data availability銘柄・時間足による履歴範囲の違いと現行上限。
編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。
重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。

