開発日誌約 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.