すべての記事

開発日誌約 5 分で読めます

私たちのバックテストエンジンの中身

最初から最後まで読める 1 パスのシミュレーター、すべて先読みバイアスを検査した 46 のインジケーター、現実的な約定とコスト、そして結果を信じる前に行うストレステスト。

QuantPrompt が表示するすべての数字は、私たちが自分で書き、テストしているシミュレーターから出ています。純粋な NumPy と pandas で価格バーを 1 回走査するだけで、最初から最後まで読める短さです。だから各結果が何を前提にしているかを正確に説明できます。

注文は実際の口座と同じように約定します

  • シグナルはバーの終値で決まり、次のバーの始値で約定します。判断に使った終値で約定させるのは先読みです。
  • 手数料とスリッページはすべての取引の売買両側で発生し、ストップロスと利益確定の決済にもスリッページがかかります。ちょうど指定価格で約定するストップは、バックテストの中だけの幻想です。
  • 同じバーでエントリーとエグジットが同時に出た場合は、ポジションに合う方が優先されます。ノーポジションならエントリー、保有中ならエグジットです。
  • 各取引のサイズを利用可能な現金の割合で決められます。残りは現金のままです。
  • 最後にまだ残っているポジションは最終終値で評価され、こっそり決済されずに未決済として表示されます。

市場のカレンダーに沿った指標

シャープ、ソルティノ、年率リターンは、データに実際にあるバーの密度で年率換算します。日足の株式で年約 252 本、暗号資産で 365 本、米国株の 1 時間足で約 1,764 本です。すべて 365 日と仮定すると、株式戦略のシャープを約 20% 過大評価してしまいます。

46 のインジケーター、すべて先読みを検査済み

インジケーターはすべて純粋な NumPy と pandas で書かれています。自動テストが各インジケーターをある価格履歴で計算し、次に同じ履歴を途中で切ったもので計算します。後のバーを追加したときに過去の値が一つでも変われば、テストは失敗します。インジケーターがまだウォームアップ中のバーで取引が発生することはありません。

リファレンスと照合済み

使い始める前に、広く使われているオープンソースのバックテストライブラリとシミュレーターを並べ、ランダムに生成した 60 組の価格系列とシグナルで実行し、約定、手数料、資産曲線をバーごとに比較しました。ストップ決済のスリッページのように、意図的により厳しくした部分を除いて結果は一致します。

結果を信じる前のストレステスト

  • すべての結果は、同じ資産を単に買って持ち続けた場合と並べて表示されます。
  • プラトー分析は、近いパラメータで作った 9×9 のグリッド、つまり同じデータで 81 回のバックテストを実行し、優位性が広いプラトーなのか孤立したピークなのかを確かめます。
  • さらにコストを 2 倍にし、期間の前半と後半を別々にテストし、利益のうち上位 3 件の取引がどれだけを占めたかを測ります。
  • 条件分析は各ルールを一つずつ外し、比較で一度も学習に使っていない履歴の最後の 30% で評価します。

何度でも回せる速さ

価格データは 1 回の実行につき一度だけ取得し、すべてのバリエーションで再利用します。81 回のバックテストのスイープでもダウンロードは 1 回です。各実行では解析、データ、インジケーター、シミュレーションにかかった時間を記録しており、遅い工程はそこから見つけて直しています。

エンジンを自分たちで持つということは、その前提を正確に説明できるということです。中身を確かめられないバックテストは、信じるしかない数字にすぎません。

この戦略を試す

Buy AAPL when the close crosses above its 50-day SMA, sell when it crosses below. 5% stop loss.

この文章を入力済みの新しいバックテストを開きます。

出典

自分のアイデアを試す

戦略を普通の言葉で説明すると、コスト込みで過去にどうなったかがわかります。

バックテストを始める

ジャーナルの他の記事