Forexバックテストに使うPython——スタック・リサーチの流れ・正直な但し書き
MT5のストラテジーテスターは、戦略がその前提の中に収まっているうちは十分に役立ちます。単純なエントリールール、一つの銘柄、面倒なデータ加工が不要な場面です。ところが少しでも独自の仕組みを試そうとすると途端に窮屈になり、だからこそシステマティックなトレーダーは何年も前からバックテストをPythonで回してきました。理由は単純で、ルールを完全に制御でき、科学計算ライブラリが使え、あらゆるデータソースを一つのスクリプトにまとめられ、アイデアからエクイティカーブまでの時間が数分に縮むからです。
なぜトレーダーはストラテジーテスターの先へ進むのか
ストラテジーテスターは、一つのEAを一つの通貨ペア・一つの時間軸で最適化する作業が得意です。しかし得意なのはそこまでです。FX会社以外のデータを混ぜたい、複数のペアを一つのシグナルにまとめたい、Sharpeレシオをドローダウンの分布と並べて計算したい——こうなると、結局Excel上でCSVファイルを継ぎ接ぎする羽目になります。Pythonはこの作業を一つのスクリプトに圧縮します。FX会社の気配値は`pandas`に流れ込み、マクロ経済データは同じ`merge`で結合され、リスク指標は学術的なライブラリから得られます。自動化という技術全般の背景は実践・ワークショップのまとめに、MetaQuotesとPythonの取捨選択は戦略の組み立て方に整理してあります。
実用的なスタック
スタックは短くて済みます。データ処理は`pandas`と`numpy`が担い、前者がM1からH1へのリサンプリングを含む時系列を受け持ち、後者が指標の土台となるベクトル化された算術を受け持ちます。バックテストのエンジンは、イベント駆動のStrategyとCerebroのスタイルで使うDaniel Rodriguez作の`backtrader`か、数百通りのパラメータの組み合わせを数十秒で総当たりしたいときに使うOleg Polakov作の`vectorbt`が一般的です。チャートは静的なレポート向けの`matplotlib`と、インタラクティブな検証向けの`plotly`から得られます。ヒストリカルデータは、日足の終値なら`yfinance`、暗号資産なら`ccxt`、FX会社の気配値なら公式の`MetaTrader5`パッケージを通じて流れ込みます。スタック全体が無料でオープンソースです。
リサーチのループ——ルールから検証まで
プロジェクトは、できるだけ分けて進めたい四つのステップを通って動きます。第一に、エントリーとエグジットのルールを平易な日本語で書き出すことです。「EMA-50の傾きがプラスで、終値が直近20日の高値を上抜けたら買う」と言えないのなら、エディタを開く意味はありません。第二に、そのルールをベクトル化された`pandas`の式に翻訳します。一本ずつのループではなく、列全体に対する一つの条件です。だからこそ10年分のH1データが数秒でテストできるのです。第三に、手数料・スリッページ・損切り(ストップロス)・利確(テイクプロフィット)を組み込んだうえで全履歴に対してエンジンを走らせ、エクイティカーブとトレード一覧を読み取ります。第四に——初心者がこっそり飛ばすところですが——アウトオブサンプルで検証します。直近の2年を取り分けておき、それより前の期間だけで最適化し、手をつけていないデータから結論を読み取るのです。ローリングウィンドウの仕組みはリスク管理の考え方に通じる発想で、より広い文脈はバックテストの進め方の解説に整理してあります。
Pythonが勝手にやってはくれないこと
使い始めたばかりの人は`backtrader`のドキュメントを読み、ライブラリがすべてを処理してくれると思い込みます。そうではありません。デフォルトのエンジンは、あなたのFX会社のスプレッドについて何も知らず、指標発表の前後で気配値が数pip揺れることも知らず、ECN口座が両建て両側で1ロットあたり7ドルを課すことも知りません。それらはあなた自身が入力します——`commission`、`slippage_perc`、時間帯ごとに変動する独自のスプレッドモデルです。第二の静かな罠はデータ品質です。無料の`yfinance`の系列は週末のギャップを抱えており、Dukascopyのティックデータはエキゾチックなペアで歯抜けになりがちです。第三の罪はなめらかな曲線への愛着です。五つの最適化パラメータを持つインサンプルのバックテストは、ほぼ必ず年率200パーセントを謳います——変数を一つ取り除き、最適化が一度も触れていないデータ上の曲線を眺めるまでは。現実的なテストは、たいてい素朴な版が約束した数字より30から50パーセント低く出ます。
説明用の一例——EUR/USDの仮想プロジェクト
M15足を使ったEUR/USDのロンドン・オープン戦略を考えてみましょう。ワルシャワ時間9時以降、価格が直近5本の高値を上抜けたら買い、安値を下抜けたら売り、損切りは20期間ATRの1.5倍、利確はその2倍の位置に置きます。`MetaTrader5`パッケージで2018年から2024年までのデータを取得し、`pandas`に読み込んでM15へリサンプリングします。1ロットあたり6ドルの手数料、指標発表時間帯を除いて一律0.8pipのスプレッド、エントリーに1pipのランダム化されたスリッページを組み込んだバックテストは、勝率51パーセント、プロフィットファクター1.28、最大ドローダウン14パーセント、Sharpe 0.9を返します。履歴をインサンプル4年とアウトオブサンプル2年に分けると、アウトオブサンプルの平均はおよそ3分の1下がり——導入の判断は妥当な土台に乗りますが、目を見張るほどではありません。上記の数字はすべて説明用です。答えの形を示すものであって、約束ではありません。
「Pythonは金融業界にとって強力なプログラミング言語およびエコシステムとなりました——金融データの分析からアルゴリズム取引、リスク管理まで、あらゆることに使えます。」 — Yves Hilpisch, Python for Finance: Mastering Data-Driven Finance, O'Reilly, 2018
どのレポートにも添えるべき正直な但し書き
バックテストが終わったら、短い但し書きの欄を添えてください。第一に、どのスプレッドを想定したか、そしてマクロ指標発表の前後でそれを広げたかどうか——NFP時に一律0.8と現実的な2.5pipの差が、エッジそのものであることはよくあります。第二に、データがlook-ahead bias(先読みバイアス)から自由かどうか、つまり、実時間ではまだ知り得ない現在足の終値から指標を計算していないかどうかです。第三に、同時にいくつのパラメータを最適化したか——五つが閾値で、それを超えるとウォークフォワードでさえもう守ってくれません。第四に、結果がアウトオブサンプルで生き残ったのか、それとも全履歴上でだけ成り立ったのかです。この四つの文がなければ、レポートは監査ではなく宣伝です。ForexMechanicsのトレーダーズ・ワークショップが、より広いリサーチの手順を扱っています。
今すぐやるべきこと
- Python 3.11以降を`pandas`・`numpy`・`backtrader`・`matplotlib`と公式の`MetaTrader5`パッケージとともにインストールしてください——一回の`pip install`でスタック全体が揃います——そのうえで、実際に取引しているペアのH1データを2年分ダウンロードし、CSVとして保存しておくと、後の反復作業が安定したローカルの元データから進められます。
- 戦略のルールをまず平易な日本語で書き出し——エントリー、エグジット、損切り、利確それぞれを一文ずつ——それからベクトル化された`pandas`の式に翻訳してください。テスト全体が一本ずつのループなしで30行に収まることを目指し、この段階ではパラメータの最適化をぐっとこらえます。
- 実際の手数料、一定のスプレッド、1pipのランダム化されたスリッページを入れてバックテストを走らせ、コストなしの版と比較してください。その差が、想定したエッジのうちどれだけが仲値約定の産物かを教えてくれます——コストが粗利益の半分以上を食うなら、その戦略はライブで回すには薄すぎます。
- 履歴をインサンプル4年とアウトオブサンプル1年に分け、インサンプル期間で最適化するパラメータは2つまでにとどめ、勝った組み合わせを固定したうえで、アウトオブサンプルのテストを一度だけ走らせてください。勝率が3分の1を超えて下がるなら、より良い最適化を探すのではなく、ロジックを単純にします。
- 素朴なノート——同じリポジトリ内のMarkdownファイル——を保ち、バックテストのたびに四つの文を書いてください。どのスプレッドを使ったか、指標がlook-aheadを避けているか、いくつのパラメータを調整したか、アウトオブサンプルのエクイティがインサンプルの半分を上回ったままか。その記録がなければ、3か月のうちに、どのレポートが正直だったかを忘れてしまいます。
出典・参考文献
-
Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
-
vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
-
O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
-
MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
-
pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗
よくある質問
始めるのに高度なPythonの知識は必要ですか?
基本的なPythonで十分です——ループ、リスト、関数、ライブラリのインポート、そしてCSVの読み込みです。残りはすべてpandasで、進めながら身につきます。どのバックテストのプロジェクトも同じ少数の操作しか使わないからです。データの読み込み、リサンプリング、指標の計算、エントリー条件の定義、結果の集計。最初の戦略はたいてい30行のコードに収まるので、「Pythonを完全にマスターする」まで待つ意味はありません。より健全なリズムは、二つの流れを並行して保つことです。短い基礎コース(1日1時間で4〜6週間)と、いま練習している実際のプロジェクトです。数式の入ったExcelのシートを作れて、関数とは何かを理解しているなら、最低限は満たしています——pandasは表計算ソフトをほぼ完全に置き換え、より速く動き、作業をきちんとアウトオブサンプルで検証させてくれます。
なぜvectorbtではなくbacktraderを選ぶのか、あるいはその逆なのか?
二つのライブラリは異なる思想に従っています。backtraderはイベント駆動です。エンジンが一本ずつバーをたどり、あなたのStrategyクラスのnext()メソッドを呼び、実際のライブ取引の流れをそのまま写し取ります——だからポジション管理、トレーリングストップ、部分決済を組み込むのが素直にできます。その代償は速度です。一つのペアの10年分のM5データに数分かかることもあります。vectorbtは逆の道を行きます——戦略全体をpandasの列に対するベクトル化された演算として表現し、エンジンはすべてをnumpyで並列に計算し、100通りのパラメータの総当たりが数十秒で終わります。代償は表現の幅です。ポートフォリオの状態に依存する複雑なエントリーロジックは、こちらでは書きにくくなります。実際には、トレーダーは両方を手元に置きます——速い探索とパラメータの総当たりにはvectorbt、最良の候補を現実的な手数料とスリッページのモデルで最終検証するにはbacktraderです。
信頼できるヒストリカルデータはどこで手に入りますか?
三つの情報源を、分別のある順に挙げます。第一に、公式の`MetaTrader5`パッケージ——自分自身のFX会社から直接、履歴を受け取れるので、バックテストのスプレッド・スワップ(ロールオーバー)・手数料が、後にライブ口座で目にするものと一致します。実際に運用するつもりのある戦略にとって、これが最も正直な選択肢です。第二に、Dukascopyは主要ペアのティックデータとM1データを2003年までさかのぼって公開しています——機関投資家レベルの品質ですが、そこのスプレッドはあなたのFX会社ではなくDukascopyのプラットフォーム由来です。第三に、日足の終値ならyfinance、暗号資産市場ならccxt——どちらもプロトタイピングには十分ですが、週末のギャップと時折欠落する分足のせいで、デイトレード戦略の検証には向きません。情報源は毎回スクリプトのヘッダーに記録しておきましょう。半年後でも、そのレポートが何に基づいていたかが分かるようにするためです——監査が机に届いたときに作業を救う、小さな心がけです。
バックテストが出来すぎていて怪しいと、どう見分ければよいですか?
四つのサインで十分です。第一に、200回を超えるトレードで勝率が75パーセントを超えること——これは非常に狭い市場でのスキャルピング以外ではほぼ到達不可能なので、look-ahead biasかデータの誤りを示しています。第二に、目立った下落のないエクイティカーブ——現実の戦略は二桁のドローダウンを記録するので、きれいな右肩上がりの直線はカーブフィットの警告です。第三に、3.5を超えるプロフィットファクター——ECNスプレッドだけでもエッジの二桁パーセントを食ってしまうForex市場では、めったに見られません。第四に、パラメータへの鋭敏な感応度、つまり移動平均の期間を14から12に変えただけで結果が崩れる状況です——これは、戦略が構造ではなくノイズを学んでしまった証拠です。四つのうち二つが同時に点灯したら、表向きの指標がどうであれそのレポートは疑わしいと考えてください。ロジックを単純にし、パラメータを一つか二つ減らし、アウトオブサンプルでテストをやり直しましょう。