ドキュメント1.0 (latest)
ページバックテスト · 16 / 29

バックテスト

QuantCraft IDE の Test ボタン(コードの実行)を使うと Run backtest が開きます。ここでシンボル、価格データ、任意のファンダメンタルデータ、シミュレーション期間、初期残高、約定コスト、(スクリプトが使う場合は)1 回の実行用の入力パラメータを設定します。エンジンはストラテジーのライフサイクルのコールバックを呼び出します。結果はテスト結果に表示されます。バーの形式については OHLCV を参照してください。

ダイアログ本体の上部にある Load または Save で、実行プリセット(.qcs)を再利用できます。それ以外の項目は最大 3 つのタブにまとめられているため、バックテストを開始する前にフォームを順に確認できます。

Run backtest ダイアログのタブ

タブ設定する内容
Scriptスクリプトが params.NAME 入力を宣言している場合のみ表示されます。パラメータ値に加えて Optimize(総当たりグリッドまたは遺伝的探索)。入力パラメータと最適化を参照してください。
Symbol & dataPrice feed(接続済みブローカーのフィードまたは QuantCraft B2)、Symbol source、Asset class、Bar timeframe(ブローカーフィード)/ Timeframe(B2)、rt.get_bar 用の Additional timeframes (optional)、Min bars (optional)(ブローカーフィード)、Uses fundamentals (select if your strategy requires fundamental data)、Include Fama-French factors (global)、Include calendar data (dividends, splits, earnings dates)(Premium/無料データの例外。デフォルトでオン)。
Simulation開始日/終了日(デフォルト:直近 1 か月)、warmup bars(デフォルト 45)、starting balance(デフォルト 100,000)、手数料とスリッページのモデル。アカウントモデルを参照してください。

クロック/プライマリシンボル: ダイアログにはプライマリシンボルの設定項目はありません。Selected symbols では、バーのクロックはスクリプト内の SYMBOL 定数(そのティッカーが読み込み済みリストにある場合)を使い、なければ最初に読み込まれたシンボルを使います。Screener ではクロックシンボルはまったくありません。実行中にシンボル集合が変化するため、各ティッカーの履歴はそれぞれの bar.close[i] オフセットで読んでください。ストラテジーのライフサイクルを参照してください。

タイマー/on_timer: Run backtest ダイアログではタイマー間隔を設定しません。on_timer は、タイマー設定を持つフォワード/バルク/チャートフォワード実行向けであり、IDE のバックテスト向けではありません。


価格ソース(ブローカーフィード vs. B2)

Symbol & data タブで価格フィードを選択します。

  • 接続済みブローカーのフィード — 日中足と日足の時間枠が使えます(アプリで認証情報が設定された、接続済みのブローカーアカウントが必要です)。
  • QuantCraft B2 — 無料プランでは OHLCV の日足(d)、週足(w)、**月足(m)**のみ利用できます。Premium では日中足と拡張 B2 時間枠が使えます。B2 の OHLCV(および有効化した場合はファンダメンタルデータ)のためにセッショントークンを送信できるよう、QuantCraft にログインしている必要があります。

選択は 実行プリセット(.qcs)に ohlcvSource("alpaca" または "b2")として保存されます。


バーの時間枠とアセットクラス(ブローカーフィードのみ)

価格ソースが接続済みブローカーのフィードの場合、次を設定できます。

フィールド目的
Bar timeframe実行時のローソク足の粒度。たとえば 1 日、1 時間、4 時間、1 週間、複数の分足(1 / 5 / 15 / 30 分)。
Asset classUS equity または Crypto。検索するシンボルリストと、ブローカーがデータを取得する方法を決めます。
Min bars (optional)設定すると、日付範囲の適用後に直近 N 本のバーだけをエンジンが保持します。空欄のままにすると、開始日と終了日から決まる全範囲を使います。

価格ソースが B2 の場合は Timeframe のみを選びます。無料プランでは Daily、Weekly、Monthly。Premium では日中足と拡張 B2 時間枠が加わります(B2 のコードは OHLCV とバーデータを参照)。


追加の時間枠(任意)

Symbol & data の Additional timeframes を使うと、プライマリ時間枠に加えて別のバーサイズを読み込めます。ストラテジーコードでは rt.get_bar(Timeframe.X, shift) で読み取ります。OHLCV とバーデータとストラテジーのライフサイクルを参照してください。

  • ストラテジーに必要な追加の時間枠を複数選択します(たとえばプライマリが 5 分足のときの日足)。
  • プライマリ時間枠も、Additional timeframes に列挙しなくても rt.get_bar で使えます。
  • その時間枠のバッファが実行に存在しない場合、Screener ソースの場合、またはデータがない場合は None を返します。
  • バックテストでは、get_bar は現在のステップまでのバーしか参照できず、常にクロックシンボルのバーを読みます。別のティッカーの履歴には、そのティッカーの bar.close[i] オフセットを使ってください。
  • 設定は 実行プリセット(.qcs)の secondaryTimeframes に保存できます。

シンボル

シンボルソース

Symbol & data タブの Symbol source で、バックテストが売買するティッカーを決めます。

ソース動作
Selected symbols選んだ固定リストと、Paste tickers で追加したものを売買します。
Screenerバックテストの進行に合わせてスクリーンを再実行し、シミュレーション上のその時点で該当していた銘柄を売買します。

Screener を選択した場合は、スクリーン自体を設定します。

設定動作
Screener sourceScreener preset または Python script。
Sort column / Direction上限を適用する前に、プリセットの該当銘柄をどう並べるか。
Rank directionスクリプト用。rank() スコアのどちら側を先に取るか。
Limitリバランスごとに売買するシンボル数。0 は該当するものすべて。
Refresh interval (days)スクリーンを再実行する頻度(シミュレーション上の暦日)。スクリプトでは 7 日以上が必要です。
Keep tickers with an open position該当しなくなった後もシンボルを売買可能なままにし、建玉を引き続き管理できるようにします。

スクリーナー駆動のバックテストの制限:開始日と終了日の明示が必要です。追加の時間枠はサポートされません。Python スクリプトのスクリーンには 7 日以上の Refresh interval が必要です。Debug Test は Screener ソースをサポートしません(Selected symbols に切り替えるよう促すメッセージを表示して停止します)。ファンダメンタルデータをオンにすると、スクリーニングされた各シンボルのファンダメンタルデータが自動的に付与されます。結果には Logs の隣に Screener Output タブが含まれ、各リバランスを、その期間に売買されたシンボル付きの折りたたみ可能な日付として表示します。スクリーンの作成方法やポイントインタイム、生存者バイアスの詳細は Screener を参照してください。

Selected symbols

Symbol & data で、実行する1 つ以上のティッカーを選びます。

  • 接続済みブローカーのフィードでは、リストはブローカーのアセットユニバース(Asset class に応じて株式または暗号資産)から取得されます。検索と複数選択が可能です。
  • B2 では、サーバー上のファンダメンタルデータのパスと同じカタログから取得されます。

ルール:

  • 少なくとも 1 つのシンボルが必要です。
  • シンボルは実行時に大文字へ正規化されます。
  • 使用できる文字:英字、数字、.、-(BRK.B や RHM.XETRA のような取引所サフィックスで一般的)。

ストラテジーが読み込み済みのティッカーに一致するトップレベルの SYMBOL = "..." を設定していない限り、選択順で最初のシンボルがデフォルトのクロックシンボルになります。ダイアログには独立したプライマリシンボルの設定項目はありません。


ファンダメンタルデータ(任意)

ストラテジーが on_bar / on_tick(バックテスト)、またはフォワード実行の on_timer で fundamentals 引数を読む場合、あるいはファンダメンタルデータを意識したロジックを使う場合は、Symbol & data で Uses fundamentals (select if your strategy requires fundamental data) をオンにします。

ビルドでファンダメンタルデータ機能が有効な場合にチェックボックスが表示されますが、Premium であるか無料データアクセスが有効でない限り無効(Premium のヒント付き)です。ファンダメンタルデータをオンにすると:

  • ログインしている必要があります(B2 のファンダメンタルデータファイルを読み込むために QuantCraft トークンが送信されます)。
  • 複数選択から1 つ以上のファンダメンタルデータパックを選びます(fundamentals/AAPL.json.gz のようなパス)。各選択の下に正規化されたパスが表示されます。

重要:OHLCV のシンボルとファンダメンタルデータのシンボルは独立しています。 ブローカーフィードで RNMBY をバックテストしながら、RHM.XETRA のファンダメンタルデータを読み込むことができます。その場合は、コード内で fundamentals.current(..., symbol="RHM.XETRA")(またはそれに相当するもの)に正しいティッカーを渡す必要があることを、UI が注意喚起します。

複数のファンダメンタルデータパックを選ぶと、エンジンはパスごとのマップを構築します。バーに揃えたスナップショットに使うプライマリのファンダメンタルデータパックは、デフォルトでは売買対象のシンボル(またはアルファベット順で最初のパック)です。複数シンボルおよび Screener の実行では、プライマリが現在のティッカーとは限らないため、fundamentals.current / get_data_with_offset には必ず symbol= を渡してください。


Fama-French ファクター(任意)

ストラテジーが fama_french.qc を通じてグローバルな月次ファクターリターンを読む場合は、Symbol & data で Include Fama-French factors (global) をオンにします。API の詳細は Fama-French ファクターを参照してください。

ファクターをオンにすると:

  • Premium(または有効な場合は無料データアクセス)が必要で、ログインしている必要があります。
  • データゲートが許可する場合、チェックボックスはデフォルトでオンです。その実行でファクターデータをスキップするにはオフにします。
  • OHLCV のシンボル、ファンダメンタルデータパック、Fama-French ファクターは独立しています。必要な組み合わせをオンにしてください。
  • コールバック引数 factors= はありません。quantcraft.fama_french をインポートし、コールバック内(on_init、on_bar、on_tick など)で fama_french.qc を読み取ります。

カレンダーデータとコーポレートアクション(任意)

Symbol & data の Include calendar data は、配当履歴、株式分割履歴、決算日、SEC 提出書類をバックテストに追加します。デフォルトでオンで、選択は次回の実行にも記憶されます。

なぜ重要か

バックテストの価格バーは調整されていません。カレンダーデータがないと、4 対 1 の株式分割は一夜にして価格が 75% 暴落したように見え、シミュレーション上のポジションも一緒に暴落します。配当も一切入ってこないため、長く保有するポジションのトータルリターンが目立たない形で過小評価されます。

サブオプション

2 つのサブオプションが、シミュレーション中に建玉へアクションを適用する方法を制御します。

サブオプション動作
Adjust positions for stock splits分割の効力発生日に、株数に分割比率を掛け、取得原価をその比率で割ります。ストップ価格と目標価格も再スケールされます。qty × entry_price は変わらないため、資産曲線は分割をまたいでも連続のままです。
Credit dividends to cash権利落ち日に、買いポジションでは qty × amount を現金に加算し、売りポジションでは差し引きます(空売りした側は貸し手に配当を支払う義務があります)。これは資産残高とすべてのリターン指標に反映されますが、realized_pnl には反映されません。

カレンダーデータがオンの場合、両方のサブオプションはデフォルトでオンです。

権利落ち日の推定に関する注記: EDGAR は配当落ち日を公表していません。取引所のデータがない限り、権利落ち日は宣言日から推定され(精度は約 ±7 日)、テスト結果では est. と表示されます。推定配当はデフォルトで計上されます。スキップするには、.qcs プリセットで dividendDatePolicy を exact_only(または off)に設定してください。ダイアログにはこの設定項目はありません。ストラテジーが正確な日付に敏感な場合は、コード内で d.estimated によって絞り込んでください。

スクリーナーのユニバース

カレンダーデータは Screener のシンボルソースでも機能します。カレンダーは、スクリーンが完全なティッカーリストを確定した後に読み込まれます。該当しても価格バーがないシンボルについては、カレンダーのリクエストは発生しません。広範なスクリーンには、サーバー上にカレンダーがないシンボルが含まれることがあります。実行ログは、失敗するのではなくその件数を報告します。

確認できる場所

  • 出力パネル — 実行中に適用されたコーポレートアクションごとに [calendar] 行が 1 行、最後に要約行が 1 行。
  • Test Results — Split と Dividend の行が、決済済み取引の表(このとき Closed trades & events という名称になります)の中に混在して表示され、1 株あたりの比率または金額と現金への影響を示します。

BacktestCalendar API の詳細と calendar コールバック引数については、カレンダーデータを参照してください。


シミュレーション — 日付、残高、約定コスト

以下はすべて Simulation タブにあります。

フィールド目的
Start date必須(デフォルト:約 1 か月前)。実行期間に含まれる最初の UTC 暦日(YYYY-MM-DD)。
End date必須。 含まれる最後の UTC 暦日。開始日以降でなければなりません。
Warmup bars (indicators)移動平均などの指標に履歴を持たせるため、開始日の前(バーと同じ時間枠)に追加で読み込むバー。**コールバックは引き続き開始日から終了日の間でのみ実行されます。**デフォルトは 45。追加のウォームアップを無効にするには 0 を入力します。
Starting balance**必須。**シミュレーション上の PaperAccount の初期現金(デフォルト 100,000)。
Commission / slippage約定を取引コストでどう調整するか。以下およびアカウントモデルを参照。

Run backtest ダイアログではタイマー間隔を設定しません。on_timer は、timerIntervalMs が設定されているフォワード実行(チャートフォワードテスト、バルクフォワード/QuantCloud)でのみ利用できます。ストラテジーのライフサイクルを参照してください。

任意のデフォルトのストップロス/テイクプロフィット/リスクサイジングは、存在する場合は .qcs プリセットに現れることがありますが、Run backtest ダイアログは現在 SL/TP/リスクの入力を公開していません。ヘルパーが対応していれば、コードまたはプリセットで設定してください。アカウントモデルと実行プリセット(.qcs)を参照してください。

手数料とスリッページ

設定目的
Commission model1 株あたり(デフォルト)、1 取引あたり、またはゼロ
Commission cost1 株あたりのコスト、または 1 注文あたりの固定手数料($)— デフォルトは 1 株あたり $0.001
Minimum trade cost1 株あたり手数料を使う場合の 1 注文あたりの下限($)— デフォルトは $0
Slippage model出来高参加率(デフォルト)、固定スプレッド、またはゼロ
Volume limit / Price impact出来高参加率スリッページのパラメータ(volume_limit は新規建て時の数量も減らします)
Spread固定スプレッドスリッページ用の 1 株あたりの合計スプレッド($)

シミュレーション設定は 実行プリセット(.qcs)に保存できます。


スクリプトパラメータ(単一実行)

ストラテジーが from quantcraft.inputs import params(既存スクリプトでは古いパス quantcraft.inputs_module / ide.inputs_module も引き続き認識されます)をインポートし、params.NAME を参照している場合、ダイアログには、検出された名前ごとに 1 行ずつ Parameter、Type(int / float / str / bool)、Value を持つ Script タブが表示されます。

開始前にすべての行を入力してください。宣言されたパラメータすべてに値が必要です。値は文字列として送信され、ファイルが読み込まれる前にエンジンが変換するため、params.PERIOD(たとえば)は、モジュールの実行時にはすでに正しい Python 型になっています。

同じタブで、グリッド探索または遺伝的探索のために Optimize をオンにできます。最適化を参照してください。通常の単一バックテストでは Optimize をオフのままにします。


実行を開始するとどうなるか

アプリはフォーム(日付、シンボル、残高、有効な場合はファンダメンタルデータ、スクリプトパラメータの型)を検証します。問題がなければ、組み立てた設定で1 回のバックテストを開始し、進行状況とログは Output パネルに表示され、構造化された結果は Test Results で開きます。


クイックリファレンス

トピック設定する場所
ブローカーフィード vs. B2 価格Symbol & data → 価格フィード(.qcs の ohlcvSource)。
時間枠Bar timeframe(ブローカーフィード)または Timeframe(B2:無料プランは d / w / m、Premium ならそれ以上)。
追加の時間枠Additional timeframes の複数選択 — rt.get_bar(Timeframe.X, shift) 用。
アセットクラスUS equity / Crypto(ブローカーフィードのみ)。
直近 N 本に切り詰めMin bars(ブローカーフィードのみ、任意)。
売買対象Symbol source:Selected symbols(複数選択)または Screener(ファンダメンタルデータ駆動のスクリーン — Screenerを参照)。
クロックシンボル読み込み済みならスクリプトの SYMBOL、なければ最初のシンボル(ダイアログに設定項目なし)。Screener ソースではなし。
財務諸表Uses fundamentals +ファンダメンタルデータの複数選択(Screener ソースでは自動)。ログインが必要。
グローバルなファクターリターンInclude Fama-French factors (global) — Fama-French ファクターを参照。
配当、株式分割、決算日Include calendar data — デフォルトでオン。カレンダーデータを参照。
カレンダーの期間Simulation の Start date / End date(必須)。
開始前の指標履歴Simulation の Warmup bars。
初期現金Simulation の Starting balance。
手数料/スリッページSimulation タブ — アカウントモデルを参照。
on_timerRun backtest にはありません — timerIntervalMs を使うフォワード実行(ストラテジーのライフサイクル)。
on_tick**バックテスト:**1 バーあたり 4 つの合成 OHLC ティック(実際のティック履歴はなし)。**フォワード実行:**ブローカーからの価格更新ごと — ストラテジーのライフサイクルを参照。
コード内の調整可能な値Script タブ(params.*)、実行ごとの単一値(または Optimize)。

ヒント

  • ブローカーフィードのシンボルがまったく読み込まれない場合は、一度 Trade を開くか、ブローカーとの接続を確認してください。B2 の場合は、ログインしていることとシンボルカタログが読み込まれたことを確認してください。
  • ウォームアップが延ばすのは読み込まれる履歴だけです。日付範囲外の取引日が追加されるわけではありません。
  • IDE のバックテストでは on_timer を期待しないでください。このダイアログにはタイマーの設定項目がありません。代わりに on_bar / on_tick を使ってください。タイマーは timerIntervalMs が設定されたフォワード実行で適用されます。
  • バックテストの on_tick は各バーから合成した OHLC を使います(1 バーあたり 4 回の呼び出し)。実際のティックデータではありません。ライブのティックロジックはフォワード実行でテストしてください(ストラテジーのライフサイクル)。
  • OHLCV のティッカーとファンダメンタルデータのティッカーが異なる場合は、コード内で実際に読むティッカーにファンダメンタルデータパックを合わせてください。
  • Min bars は控えめに使ってください。意図したより実行期間を短くしてしまいやすい設定です。
バックテスト — ドキュメント (1.0 (latest)) | QuantCraft