🪨バックテストとは
トレードにおけるエッジがあるかどうかを検証する📝シミュレーションでの仮説検証.
バックテスト (Back Test) とは, システムトレードなどを利用する場合にプログラムなどを利用して当該ストラテジーを過去の為替レートや株価などに当てはめた場合にどのような動きをするのかをチェックするテストのこと.
バックテストには2種類ある.
- 過去のヒストリカルデータのシミュレーション.
- 過去に発生しなかった事象のシミュレーション.
📝ウォークフォワード法
ウォークフォワード(Warl-Forward, WF)法.
投資戦略か過去にどのように振る舞ったかをシミュレートする方法. バックテストというと一般的にこれを指すことが多い.
✅フォワードテスト
トレードにおけるエッジがあるかどうかを検証する, 本番環境での仮説検証. ペーパーテスト(Paper Trading), フロントラン.
バックテスト種別
ベクトル化バックテストとイベントベースバックテストがある.
📝ベクトル化バックテスト
Vectorised Backtest. 約定履歴等を配列(ベクトル)に入れて一括処理する. イメージとしては表の列を追加していく感じ. データサイエンス的にデータフレームを処理していく.
pros
- インタラクティブで探索的な戦略の検証.
- 計算が速い(!=逐次計算).
- 可視化がしやすい.
cons
コンテキストを保持するのが難しい. やろうとすると, 途中計算やフラグを列で追加する. ただし, それは単純なロジックならばいいけれども複雑なロジックになると難しい.
これがイベントベースバックテストになると, loopを回しながら状態を更新するような処理でできる.
ベクトル演算を活用する
ベクトル化, 言い換えると🔖Dataframeライブラリを活用することによる利点は, ベクトル演算にある. 基本的に列(Series)で演算をかんがえるところがポイント. これは慣れが必要.
さらには列演算のためのUtilを活用する. 自力実装はきつい…
- shift: 数列をずらす.
- cumsum, cumprod: 累積計算.
- 自力でやるとaccumulatorのようなもので計算結果を保持しつつ計算する必要がある.
- 考え方としては, cumsumやcumprodとフラグ制御(ture/falseとか0, 1, -1)を駆使して計算用の列を活用してつつ処理する.
References
📝イベントベースバックテスト
Event-Based, Event-Driven Backtesting.
イベントを逐次処理する. ループを回して逐次的に結果を評価するイメージ.
インプットとしての📝バー(Bar)をどうするかということが見極め. barとはある時点でサンプリングしたデータセット.
step関数が呼ばれる類のものはイベントベースバックテストのパラダイム下にある.
Resources
- 🔧backtesting.py
- 📈TradingView
- Event-Driven Backtesting with Python - Part I | QuantStart
- 思い出深い記事. OANDAのシステムトレードをPythonでやろうとしたとき, この英語の記事くらいしか参考になる情報源がなかったので読み込んだ.
- https://github.com/tobiasbrodd/backtester
バックテスト指標
バックテストで扱う統計量.
Cumulative returns
累積リターン.
Sharpe ratio
Refs
ツール
🔧backtesting.py
とても有名なPythonライブラリ.
https://kernc.github.io/backtesting.py/
バックテスト検証サービス
Topics
💡バックテストでのベッドサイズの決定
Insights
🤔ベクトル化バックテストはコンテキストを伴う戦略の実装が難しい
ある時刻における条件で投資判断をするならばベクトル化バックテストは容易. 行を見ればいいだけなので.
問題は過去のある時点の条件をもとに現在の投資判断をする場合. たとえばシグナルXが立ったあとにシグナルYでエントリみたいな. ポジション管理も同じ. ある時点でのポジションを参考に次を決めるみたいな.
イベントベースバックテストならば計算結果を状態保持しながら逐次計算. ベクトル化バックテストも必要な列だけ逐次計算することになる. loopを回すかreducerを使うか, いずれにしろ計算結果のaccumulateされた結果のリストがアウトプットの列になる.