cAlgo API リファレンス

GetFitness【cAlgo API】

2020年11月9日

俺様仕様の最適化

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を作ることを検討してみてもよいでしょう。

-cAlgo API リファレンス
-

© 2021 cTrader's Life Powered by AFFINGER5