EAを自作した際、『もう少しプロフィットファクターあげられないかな』と思ったりしませんか?
今回は、プロフィットファクターを合理的に底上げする方法について解説します。
はじめに
2021年に新規運用した自作EAですが調子がいまいちだった(微利益で1年終わっちゃった)ので2022年版に改良しました。
その際に行ったプロフィットファクターの上げ方について記載しています。
トレード内容を振り返る
では、どうトレードすればプロフィットファクターや利益がもっと上がるかを確認していきます。
まず、去年のEAのトレード結果を見て何が悪かったのか等をざっくりでいいので洗い出していきましょう。
私の場合は、
②あまり有効でなさそうな場所でエントリーする時がある
この2点が大きな問題でした。この問題にフォーカスしてソース修正をしていきます。
ただ、これだけでは漠然とし過ぎていてどこを修正したらいいのかわからん!
ということで、どうしたらいいのか次に記載していきます。
バックテストでBADトレードを確認する
どこのソースを修正していくかですが、オススメはバックテストのビジュアルモードを使って実際に悪いトレードを探す事です。
普段からトレード結果を見ている場合は、その問題があったトレードの期間をバックテストしてもいいですし、ざっくり去年からとかでバックテストを始めてもいいのでとにかく悪いトレードを見つけ出します。
見つけ出したらバックテストを止めて日付をしっかり覚えます。上記の画像はショートで2回エントリーしていますが『このトレードは修正の余地がある!』といった具合です。
ソースコードの修正
トレード内容を見直す方法として、簡単なのは『決済方法を見直す事』と『不要なエントリーを省く事』です。
①決済位置を見直す
まず、1回目のトレードですがエントリー部分はいいのですが決済部分はもう少し待っても良いのかなと思いました。
決済ポイントは直前のZigZagの安値(黄色い水平線部分)を下に更新できなかったと判断して、決済してしまっています。ここのトレードを見て思う事はもう少し決済するのを様子見したいという事です。こんな感じ。
修正前は水色の部分で決済してしまっていましたが、修正を加えた事で最後の黄色の部分でストップロスに引っかかって決済されています。
※最後の黄色丸の左側に小さく黄色「-」があるのがストップロスです
直近の安値を更新できなかったら決済 ⇒
直近の安値を更新できなかったら直近の高値付近にストップロスを置く
このようにソース修正しました。
まずは、こんな感じで決済される箇所を見直しましょう。
②不要なエントリーを省く
次の修正はエントリー部分です。以下の画像は下げた後の戻りをショートでエントリーしています。が、戻りの割合が直近の下げに対して大きすぎるという風に思いました。
直近の高値と安値でフィボナッチを引いて確認しても61.8%以上戻しちゃってるので、こういう戻しが大きい場合(61.8%等)は以下のように修正しました。
戻しは大きくても直近のZigZagのTOP値を超えていなければエントリー ⇒
戻しが60%以上の場合はエントリーしない
このようにソース修正しました。
エントリー箇所はかなりダイレクトに影響してくるので慎重に行いましょう。
修正箇所の確認
修正すると当然他のトレードにも影響してくるので他のトレードもビジュアルモードで確認します。
しっかりと自分が修正した内容でトレードされている事を数エントリー分確認しましょう。
・安値を切り上げた場合、 直近の高値付近にストップロスを置くいていること
・ 戻しが60%以上の場合はエントリーしないこと
これが確認できたら、次の作業に移りましょう!
バックテストで総合的に良くなったかを確認する
ソース修正をした事で先ほどの部分のトレードが良くなっていても、他の部分で致命的に悪くなっている事も結構(かなり)あります。
結局先ほどの修正が良かったのか悪かったのかは長期的なバックテストの結果を持って判断します。ここでのバックテストはビジュアルモードでは確認せず結果のみで確認します。
修正前
修正前のプロフィットファクタは1.45で総取引数は3286回でした。結果でよく見る部分を赤枠で囲っています。
修正後
修正後のプロフィットファクタは1.63で総取引数は2875回でした。総取引数は400回近く減っているのに純益が増えているので1回あたりのトレードの質が上がっている(期待利得が上がっている)事がわかります。勝率は2%程下がりましたがこれは仕方ない(質の悪い勝ちトレードが減った)ことなのでOKです。
一番下のグラフをみても2020年~2021年にかけて修正前は横一直線だったのが右肩上がりに変わっています。
修正前と修正後で明らかに修正後の成績が落ちた場合
今回のようにトレードの1部分をみて良い感じにトレードするように修正しても、全体のバックテストであまり良くならない、むしろ悪化することも結構な割合であります。
ということは、直近の安値を更新でいなければさっさと決済したほうが良かったのかもしれないですし、7割戻していてもエントリーしていた方がよかったのかもしれません。
修正を1つづつ行いどの修正が有効性が高いのかを確認していく必要があります。
修正内容を見直し(6割戻しを5割戻しにして見るなど)をしていきますが、いくら修正しても全然成績がよくならない場合は今回の修正内容は適用しないという判断をする場合もあります。
私も上記の修正をすると成績があがったので記事にしていますが、他の修正も当然したりしていて成績が悪化したのも結構あったのでその修正は戻したりしています。
過去の値動きに特化しすぎた修正をしていないか確認する
ビジュアルモードでトレードを見ていると、あのトレードも直したいこのトレードも直したいってなってきます。悪いトレードを直すのは良い事なんですが問題が1つあります。
カーブフィッティング(曲線あてはめ)です。
カーブフィッティングを行うと当然プロフィットファクターは良くなります。既にあるデータに対して良くなるような超限定的な修正になってしまうからです。
あれ?この修正はカーブフィッティングっぽいなって思った場合の簡単なオススメ確認法は、『別通貨でバックテストしてみる』です。私の場合、今回のEAは米ドル/円で運用するものですがポンド/円でも確認しました。
修正前
修正後
修正後の方が成績が良くなっているので、純粋にトレードの質が向上したという事がわかります。
さいごに
以上が、『簡単にEAのプロフィットファクターを上げる方法』でした。
EAの修正の仕方は個人で結構ばらばらだと思いますが、私の場合はこんな感じで修正を加えています。
有効そうな修正内容とバックテストでの確認を含めるとこれだけでも数十時間はかかりますが、根拠のある修正でプロフィットファクターをあげるため、EAが成長したと実感できます。EAの継続的な改善は必要だと思いますので定期的にやっていけたらいいですね!
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント
はじめまして。どの記事もとてもわかりやすくて大いに参考にさせてもらっています。
本記事の決済位置修正について質問があります。
「直近の安値を更新できなかったら直近の高値付近にストップロスを置く」の「直近の安値」と「直近の高値」は、チャートでのZigZagの頂点なのでしょうか?(パラメーターSL_Gosaの分、余裕を持たせている?)
もし可能でしたら、修正部分のソースを教えていただけると大変ありがたいです。
はじめまして、pokoさん。
記事を見て頂き有難うございます!
「直近の安値」と「直近の高値」についてですが、「直近のZigZagの安値」と「直近のローソク足の高値」という感じです。(自分で見直しても?でした、すみません)
修正ソースについてですが、私のサイトで公開しているソースでは決済部分を作りこんでいないので参考になるかどうかわからないですが一応お伝えします。
//売りエントリー中に、ZigZagのZigBottomが切り上げたら決済する
if(OrderType() == OP_SELL && ZigBottom[0] > ZigBottom[1] && orderPtn !=2){
if(BottomPoint == 0 && ZigAtai3 != 0 && ZigAtai2 == 0 && ZigAtai1 == 0 && rosokuValueCloseP > MA_BASE){
//OrderKekka = funcOrder_Close(20,MagicNumber,clrMediumSpringGreen);
OrderKekka = funcOrder_Modify(Bid + 60 * Point,OrderTakeProfit(),MagicNumber);
}
}
【サンプルにない各変数、関数の説明】
ZigAtai3、ZigAtai2、ZigAtai1は、ZigZagの安値が確定してから2ローソク足分でその安値を更新できなかった場合って感じで使ってます。ZigZagの安値が確定してから、次のローソク足でそのZigZagの安値を更新するとそれが最新のZigZag安値になるのでその場合は決済したくないためです。(要は下げ止まった場合に決済したくて、下げ続けている場合は決済したくない)
あとrosokuValueCloseP はローソク足のクローズ値、MA_BASEは15分足の21EMAです。
funcOrder_Close()関数は決済注文、funcOrder_Modify()関数は変更注文として自作の関数です。
早々のご丁寧なお返事ありがとうございます!
ただ、記事中の画像での黄色「-」が出ているバーは、ZigBottomが切り下がっていて、さらにZigZagの安値が確定してから1ローソク足分のように思えるのですが、なにか勘違いでしょうか…
それと、条件にMAも使っているんですね。
試してみたところ、当該のバーで「クローズ値>15分足の21EMA」とならないのですが、これもなにか間違っているのでしょうか。以下のようにしています。
rosokuValueCloseP = Close[1];
MA_BASE = iMA(NULL, 0, 21, 0, MODE_EMA, PRICE_CLOSE, 1);
続けざまに細かいところをすみませんが、お返事いただけたら幸いです。
なるほど、よく見られている・・・!
ZigBottomが切り下げ確定したタイミングで、1つ前のZigBottom前後(パラメータのSL_Gosa_S分)にSL設定する処理は元々いれていたのですが、記事の画像の通り切り下げる前に決済されてしまっていたので今回の直近のローソク足の高値にSL設定する処理を追加しました。この処理を入れた事で元々いれていた1つ前のZigBottom前後にSL設定する処理が実行された形になります。
MAの件は同じ日時で確認されたという事でしょうか?
MAの値が違うからでしょうか。私はEMA(13)で見てました。
double MA_BASE = iMA(NULL, 0, 13, 0, MODE_EMA, PRICE_CLOSE, 1);
double rosokuValueCloseP = iClose(NULL, 0, 1);
なるほど、そういう処理が元々あったのですね、わかりました。
トレールのやり方にも、色々考えようがあるんですね。
聞いてみたいことは尽きないのですが、お手をわずらわせるのも申し訳ないので自分で色々試してみます。ご解説ありがとうございました!
はーい。もし何か分からない事があれば、問合せフォームからご質問頂ければわかる範囲で回答いたします。