俺様仕様の最適化
EAもcBotも出来上がったら、「もし過去の相場で稼働させていたら成績はどうだったのか」を確認するバックテストを必ず行います。
また、バックテストと同時により良い成績がだせるようにパラメータを調整する最適化という作業も行うことが多いです。
最適化をするにしても何を指標として最適化するのか、というのが難しいところです。利益額さえ大きければいい?とにかくドローダウンだけを抑える?ひたすら勝率を追い求める?
これらのような単純な指標であれば簡単ですが、たとえば、「勝率はこれ以上はほしいけど、ドローダウンがこれ以下に抑えられるなら勝率は低くてよくて、でも利益が取れるならドローダウンは・・・」どうのこうのとややこしい指標を設定したいこともあるでしょう。
そんなときのために、cTraderでは自分の好きなように最適化の指標をプログラムすることができるようになっています。
俺様仕様最適化の設定方法
Optimization画面でOptimization Criteria をCustomに設定すると、自分でオーバーライドしたGetFitness()メソッドが使われるようになります。
最適化はパラメータの値を少しずつ変更しながらバックテストを繰り返して、最適なパラメータを探す作業です。
バックテストが1回終わるたびにRobot.GetFitness()が呼び出され、計算結果をdouble値で返します。要は返り値が「点数」です。
最適化ではこの点数(返り値)を最大化するようなパラメータを探してバックテストが繰り返されます。
Robot.GetFitness()のオーバーライド
cBot本体のクラスに自分でprotected override double GetFitness(GetFitnessArgs args){...}を追加します。
渡されるGetFitnessArgs型の引数がバックテストの結果を持ってるため、これを使ってバックテストの結果を採点する処理を書きます。
GetFitnessArgs
RobotのGetFitnessはこの型の引数を一つ持ちます。
public interface GetFitnessArgs
中にはバックテストの結果が入ってます。
プロパティ
(double) TotalTrades
総トレード数を取得します。
(double) WinningTrades
勝ちトレード数を取得します。
(double) LosingTrades
負けトレード数を取得します。
(double) AverageTrade
すべてのトレードの平均利益を取得します。
(double) NetProfit
すべてのトレードの合計損益を取得します。
(double) Equity
最終の資金(口座資金+含み損益)を取得します。
(double) MaxBalanceDrawdown
最大の口座資金のドローダウン金額を取得します。
(double) MaxBalanceDrawdownPercentages
最大の口座資金ドローダウンの率を取得します。
(double) MaxEquityDrawdown
最大の含み損込みのドローダウン金額を取得します。
(double) MaxEquityDrawdownPercentages
最大の含み損込みのドローダウンの率を取得します。
(double) ProfitFactor
プロフィットファクター(総利益÷総損失)を取得します。
(double) SharpeRatio
シャープレシオを取得します。
(double) SortinoRatio
ソルティノレシオを取得します。
(History) History
すべてのトレード履歴を取得します。
(Positions) Positions
すべてのポジションを取得します。
(PendingOrders) PendingOrders
すべての待機注文を取得します。
サンプルコード
//-----------------------------------------------------------------
// トレード回数が100回以上で利益額が大きいほど優秀と判断する
protected override double GetFitness(GetFitnessArgs args) {
if (args.TotalTrades >= 100) {
return args.NetProfit;
} else {
// トレード回数99回以下ならおもいっきり評価を下げる
return args.NetProfit / 1000;
}
}
(最適化でのみ使われるため、cBotを起動させても動作確認はできません)
最適化の計算処理と考えると難しく感じるかもしれませんが、このように「トレード回数が一定数以下の結果を切り捨てる」みたいな目的でも使えます。
最適化してて、どうも自分の思うように進まないと思ったら、自分仕様のGetFitnessを作ることを検討してみてもよいでしょう。