[MT4]EAの結果をモンテカルロ分析する[python]

FX

システムトレードの有益な情報を公開されている藍崎さんのノートを拝見して自分のEAもモンテカルロ分析を試してみたくなりました。

pythonを使えばわりと簡単に実装できそうだったのでやってみようと思います。

ちなみに藍崎さんのノートはこちらです(メッチャ勉強になります)

システムトレーダーのためのデータ分析|藍崎|note
 バックテストでわかるのは、バックテストを行った結果だけであって、そのトレードシステムが将来、「どの程度の利益を見込めるのか」、「いいときと悪いときの振れ幅がどれくらいか」といった未知の数字の推定はできません。  リアルトレードでのEAのドローダウンは「偶然によるものか」、「システムを停止するべき異常事態か」、これを...

モンテカルロ分析(ブートストラップ法)についても↑のノートで丁寧に解説されてるので是非ご覧ください。

スポンサーリンク

EAの結果をCSVで保存する

まずはEAの結果をCSV形式で保存します。

やり方は、まずMT4テスターウィンドウの「結果」タブの画面を適当に右クリックして、コンテキストメニューを出します。メニューの「すべてコピー(Alt+A)」をクリックすると、クリップボードにすべての結果が格納されます。結果タブ

次に、適当なテキストエディタを開いてクリップボードの内容を貼り付けて保存します。

メモ帳

モンテカルロ分析

さきほど保存したcsvファイルを使ってモンテカルロ分析を行い

  • 累積損益のグラフ
  • シミュレーション結果の要約(CSVファイル)

を出力するスクリプトを作りました。

https://mamerium.com/wp-content/uploads/2022/09/monte_carlo.zip

↑のファイルを解凍してCSVファイルと同じフォルダに置いて、Windows PowerShellで

python monte_carlo.py ea.csv 5000

みたいな感じで実行してください。

↑のコマンドの引数は、ea.csvがEA結果のファイル名、5000がランダムサンプリングの試行回数です。

うまくいけば

  • monte_carlo.png(累積損益のグラフ)
  • monte_carlo.csv(シミュレーションの要約)

ができます。

累積損益のグラフ

monte_carlo.csvのサンプル
平均標準偏差上振れ95%下振れ95%
純利益20.5710.9241.98-0.84
期待利得0.110.060.22-0.00
勝率0.380.030.450.31
プロフィットファクター1.680.402.460.91
ペイオフレシオ2.690.463.601.78
最大ドローダウン4.982.048.990.98
リカバリーファクター5.314.2713.68-3.07
シャープレシオ0.130.060.240.02

スクリプトの補足

このスクリプトでは

  1. EAの結果(CSVファイル)を整形してPandasデータフレームに変換してpips損益を計算
  2. pips損益の集合から試行回数分の復元抽出を行ってシミュレーションデータフレームを作成
  3. 2.をもとに累積損益グラフを作成して保存
  4. 2.をもとにシミュレーションの要約を計算して保存

を行っています。

EAの仕様によっては1.の部分でデータフレームへの変換がうまくいかない可能性が高いです。

たぶん複数ポジションを一括決済したり、逆に1つのポジションを分割決済しているEAだと変換に失敗すると思います。

今のところ自分のEAで分割エントリーや分割決済をするものがないので、ココは手抜きをしていますw

ガリガリやるならVSCode+Jupyterで

ブログ用に分析結果を画像やCSVに保存するスクリプトを作ったんですが、普段はVSCode+Jupyterで分析やバックテストを行っています。

VSCode+Jupyterだとパッと思い浮かんだアイデアをサッと試せるし、結果もVSCode上で確認できるので気軽にいろいろ試せるんですよね。

VSCode初心者にはこちらの本がオススメです。

以前はプログラミングにはSublimeText3を使っていたんですが、ライセンス方式が買いきりからサブスク方式に変わってしまったのでVSCodeに乗り換えちゃいました。

ただ、エディタの乗り換えって結構メンドくさいですよね。ショートカットとか覚え直すの大変だし…。

なので、手元に辞書代わりになる本を1冊持っておきたくて、本屋で見比べたらこの本が一番しっくり来ました。

必要最低限の操作+αくらいはこの本だけで覚えられると思います。

コメント

タイトルとURLをコピーしました