今回は「分解モンテカルロ法」をZigzagBreakoutという当方が開発したEAに組み込んで、その実力を確認してみたいと思います。
分解モンテカルロ法についてはお手数ですが下記の記事を先にご覧ください。
ZigzagBreakoutに分解モンテカルロ法を組み込む
以前作成したライブラリを使用してZigzagBreakoutに組み込んでみました。
UseMonteCalroをtrueにして、MoteCalroModeをDMonteCalroにすると分解モンテカルロ法で動作するようにしました。
まずはモンテカルロ法無しでバックテストしてみます。
USDJPY H1 2015年1月~2024年2月
ドル円の1時間足、フィルタはすべてOFFにしました。単純にZigzagの頂点をブレイクアウトしたら仕掛けるシステムです。ブレークイーブン、トレイリングも使用しません。Zigzagの設定も既定値のまま。StopLossとTakeProfitは1:2になるようにします。(モンテカルロ法のルールです)
期間が2015年1月からなのはAxioryのヒストリカルデータを使用していて、一番古いデータが2015年からだからで、2024年2月までなのは2月までしかデータを取り込んでいないからです。
それではバックテストを実行してみましょう。スプレッドは5にしました。
意外といい感じです。PF1.33で純益33,774.93ドルです。最大ドローダウンが5,425.72ドルになっています。
ちなみにStopLossは400points(40pips)、TakeProfitは800points(80pips)にしています。
ちなみにモデリング品質が89.84%になっているのはよくわかりません‥。ヒストリカルデータの問題だろうと思って深くは追求しませんでした。(この記事はEAの販売ページではありませんので)
分解モンテカルロ法を有効化
設定はそのまま、分解モンテカルロ法を有効化しました。分解モンテカルロ法の初期ロットは1.0です。
分解モンテカルロ法を使用した場合、PFが1.50、純益が135,913.52と大幅に良くなりました。
しかし、最大ドローダウンは22,772.57。さすがにドローダウンが増えています。(ロットが増加するので当然です)
資金が1万ドルの場合、溶けてしまう可能性があります。初期ロットを4分の1くらいにした方が良さそうです。
自動ロット計算有効化
分解モンテカルロ法に自動ロット計算(証拠金の増減に伴ってロットを増減する機能)を加えます。初期ロットは0.25が良いようなのでパラメーターのRiskを2.5にします。こうすると1万ドルの証拠金の場合、初期ロットが0.25になります。
PFは1.26、純益は201,075.40。最後、ロットが巨大化した状態、分解モンテカルロ法による資金管理システムが途中で終わってしまったので微妙な結果となりました。
最後は57.2Lotsになっており、ロットサイズがかなり大きくなってしまっています。安定稼働させるのであれば、初期ロットをもっと落とした方が良さそうです。
トレーリングストップを加える
トレーリングの開始を900points(90pips)とし、トレール幅を100points(10pips)としました。トレーリングストップを設定する場合にはリスクリワード比1:2(リスクリワードレシオ2.0)以上になるように設定する必要があります。(ストップロスが400pointsの場合、利益は800pointsかそれ以上になる必要がある)
PFは1.49、純益は86,490.67です。一時期ちょっと苦戦してロットが大きくなったため、利益が大幅に伸びました。勝率34.88%なので勝率的にはギリギリ。これ以上悪化するとモンテカルロ法は使えません。
設定の注意点
モンテカルロ法の注意点として、リスクリワード比を1:2にすること、3回に1回以上勝利すること、という条件があります。この条件から外れなければ、例えばフィルタを入れてトレードを厳選しても問題ありません。
ブレークイーブンの使用はおすすめしません。
ブレークイーブンで終わった場合には「そのトレードは無かった」ものとしてモンテカルロ法の勝敗に含めないようなロジックにするという手はありそうです。(今回はそういったロジックは組み込んでいません)
また、本来のモンテカルロ法にトレードコストのようなものはありません。それゆえに、トレードコストが高いと勝率が高くても破綻しやすくなります。
ここでいうトレードコストとは「手数料」「スプレッド」「スワップ」などです。スワップは無視されがちですが、トレード頻度が多く、持ちっぱなしになる時間が長いシステムの場合は特に影響が大きくなります。
分解モンテカルロ法の検証記事のコメントでUSDJPYのロング(買い)とショート(売り)の場合だと、ロングが圧倒的によく、逆にショートだと全然良くないというご連絡を頂きました。前回の動作確認用システムは「持ちっぱなしで常時保持するシステム」ですから、毎日スワップが徴収されます。
こういったシステムだと、ロングとショートではまるで結果が変わっても不思議ではありません。
ちなみに、MetaTraderのヒストリカルデータにはスワップ情報がありません。スワップの計算は過去のスワップではなく「今現在」のスワップでバックテストされる点にご注意ください。(※FX業者によってはバックテストでスワップが計算されないものもあるようです。ご注意ください。)
というわけで、トレードコストが低めな別の通貨ペアでもバックテストしてみます。
EURUSD H1 2015年1月~2024年2月
分解モンテカルロ法は未使用でロットは0.01固定、スプレッドが5でバックテストしました。PF1.20、純益254.77、StopLossは200points(20pips)、TakeProfitは400points(40pips)にしています。
見た感じ悪くは無さそうです。それではこれに分解モンテカルロ法を適用してみましょう。
分解モンテカルロ法を有効化
PF1.33、純益が5179.68となりました。初期ロットは0.01です。
大きくロットが増えている箇所があるため、初期ロットを大きめにすると資金が耐えられずに破綻する危険性があります。
EURJPY H1 2015年1月~2024年2月
分解モンテカルロ法を使用して、初期ロットは0.01、スプレッドが5でバックテストしました。PF1.36、純益2716.92、StopLossは400points(40pips)、TakeProfitは800points(80pips)にしています。
ドル円ほどの安定性は無いので、こちらも初期ロットは小さめにしておくのが良さそうです。
まとめ
システムに優位性があれば分解モンテカルロ法を適用することで「(分解モンテカルロ法を使用しないよりも)短期間で回収」することができます。
ただし、モンテカルロ法やマーチンゲール法ほどではありませんが、負けが多くなるとロットが大きくなってしまう点には注意が必要です。破綻しづらいように初期ロットは小さめに設定しておく方が良いでしょう。
また、分解モンテカルロ法の特徴として「ロットが戻りづらい」という点があります。ロットの上昇が緩やかな分、初期ロットへ戻るのに時間がかかる傾向にあるようです。
破綻しなければ多少苦戦したほうが利益が大きくなりやすい、というのが個人的にはちょっとモヤっとします。
私は分解モンテカルロ法について、まだまだ検証が足りないと思っているので、記事にするかどうかはわかりませんが検証を続けます。
例えば、モンテカルロ法は「3回に1回の勝率で最も効果を発揮するらしい(未検証)」ですが、分解モンテカルロ法も同様と考えて良いのか?リスクリワード比が1:1で勝率が50%の場合と1:2で33.33‥の場合で違いが出るのか。
また、分解モンテカルロ法の優位性が崩れるのはトレードコストいくらの時か‥(スプレッド、手数料、スワップを含めて何pipsまで耐えられるのか)
そもそもこの分解モンテカルロ法は本当に大丈夫なのか。
日本の、一個人が考えたものなので、どこかに穴があるかもしれないとちょっと疑っています。正しく、堅牢なシステムなのか、私が納得いくまで調べてみるつもりです。
→ 【作ってみた】分解モンテカルロ法検証機に続きます。
コメント
素晴らしいですね。私はプログラミングが出来ずに数列の表現が難しかったので、数列とは異なる変数で疑似的に分解モンテカルロを再現していました。疑似なのでロットの増減が若干ですが大きくなりがちで行き詰っていたのですが、こちらでコード拝見し、活路を見出しているところです(勝手ながら)。
さらに、分解モンテカルロの改良版なんてものをChisiki!氏のnoteで拝見しまして、今はそちらに挑戦中です。既存の分解モンテカルロにストックの獲得と消費、数列の平均化を行うことで、連敗中のロット増加を緩やかにするそうです。処理自体は、勝ったか負けたかが起点になるのは変わらないので、うまい事既存のコードに組めないか思案中です(こちらの日記でも扱われることを期待しながら…)。
コメントありがとうございます。
分解モンテカルロの改良版‥ちょっとややこしい感じですね‥。
今は別の開発作業に着手しているので手が出せませんが、手が空いたら試し見てる‥かも知れません。(あまり期待しないでください‥;;)