cTrader Automate【cBotのバックテストと最適化】

はじめに

バックテストは、特定の事前定義された条件下で、過去の市場データで取引させることにより、cBotを評価するために行います。

バックテストでは、過去の市場の動きに対してcBotインスタンスを実行できます。その後、cBotによって実行された取引操作と最終的なエクイティ/バランス統計に関する詳細なレポートを得られます。

cBotのバックテスト時に実行された取引操作は、口座に影響を与えることはありません。バックテストは実際の資金を扱うものではありません。代わりに、この機能は分析目的でのみ存在します。

cBotをバックテストするには、そのインスタンスの1つを選択し、「バックテスト」タブに切り替えます。

バックテストの設定

バックテストの方法を設定するには、UIの左上隅にある「歯車」アイコンをクリックします。

このメニューのオプションは以下のように定義されます。すべてのお金に関連するパラメーター(例:開始資本)は USD で指定されます。

オプション名動作と説明
取引開始時の資金      cBotの取引開始資金を定義します。
コミッション100万取引単位当たりの手数料率を設定。
データcBotがテストされる時系列データを選択します。利用可能なオプションは以下のとおりです。
データはティックごとにサーバーから直接取得されます。これは最も正確なヒストリカル・データ・ソースです。データは、CSVファイルのserver.M1バーによって生成された1分間のバーから取得されます。データは、ローカルに保存されたCSVファイルに定義された1分足のバーから取得されます。サーバーからのH1バーのデータは、サーバーによって生成された1時間足のバーから取得されます。
スプレッド    バックテスト中に適用されるスプレッドの値を選択します。固定値。バックテスト中、1つの値のみが適用されます。ドロップダウンメニューから選択するか、カスタム値を入力するか、または現在のシンボルのスプレッド(ティックごとに更新される)に値を合わせることができます。最小スプレッド率と最大スプレッド率を設定します。cBotが注文を発注する際、選択したレートの間のランダムなスプレッド値がこの注文に適用されます。

M1サンプルCSVデータ

ローカルマシンから取引データを取得するには、以下のデータを含むカンマ区切りのCSVファイルを作成してください。

  • 日付
  • 時間
  • 始値
  • 高値
  • 安値
  • 終値
  • 出来高

例:

1 2 3 42003.06.18,16:01,1.11423,1.11428,1.11332,1.11374,19 2003.06.18,16:02,1.11364,1.11436,1.11361,1.11405,7 2003.06.18,16:03,1.11402,1.11455,1.11400,1.11440,5 2003.06.18,16:04,1.11446,1.11461,1.11401,1.11447,14

バックテストの手順とモード

以下のいずれかの方法でテストする期間を指定します。

  • 「バックテスト」タブの上部にあるインタラクティブ・スライダーを使用する。
  • スライダーの左右にあるカレンダー・メニューから必要な値を選択する。
  • スライダーの両側にあるフィールドにカスタム値(DD:MM:YYYYフォーマットを使用)を入力する。

以下のモードを使ってバックテストを実行することができます。

  • 非リアルタイムテスト:
    ボットは必要なすべての操作を順番に実行します。その後、取引統計、チャートなどの最終結果のみにアクセスできます。
  • リアルタイム(ビジュアルモード)テスト:
    お客様が提供したヒストリカルデータは、お客様がカスタマイズできる一定の再生速度でcBotに渡されます。その結果、取引操作が行われるのを見ることができます。すべての取引統計も選択した再生速度で更新されます。

非リアルタイムテスト

セットアップが完了したら、スライダーの右にある「再生」ボタンをクリックします。
指定期間の長さやローカルマシンのスペックによっては、cTrader Automateが結果を生成するまで数分待つ必要があります。

リアルタイム(ビジュアルモード)テスト

テスト期間を含む必要な設定を指定し、カレンダースライダーの下にある「ビジュアルモード」を有効にします。

「スピード」スライダーをドラッグするか、その右のメニューでデータの再生速度を調整します。設定が終わったら、「再生」ボタンを押してください。

cTraderは選択した期間の取引チャートを、設定した再生速度でリアルタイムに加速して表示し始めます。再生速度は、バックテスト中にも調整することができます。

cBotは、チャートに表示されるテクニカル分析のシグナルに反応して、リアルタイムで取引操作を実行します。バックテストの統計は、cBotが実行したアクションに基づいて自動的に更新されます。

選択した期間と再生速度によっては、ビジュアルモードのテストに時間がかかる場合があります。それでも、cBotが期待通りに動作しない場合、ビジュアルモードテストとCSVファイルから取得したカスタム取引データを使用して、様々な市場状況に対する反応をテストすることができます。

レンコチャートやレンジバーを用いたテスト

cTrader は、レンコチャートやレンジバーチャートでの cBot のバックテストをサポートしています。このようなバックテストを行うには、新しいcBotインスタンスを作成し、接続する取引チャートとしてレンコ/レンジバーチャートを選択します。

または、cBotインスタンスがすでに選択されている状態で、画面上部の「…」アイコンをクリックして、チャートセレクタメニューを使用します。表示されたメニューで、レンコまたはレンジ・バーいずれかの閾値を選択します。

cTraderが選択したシンボルのRenko/レンジ・バー・チャートを生成したら、「バックテスト」タブに切り替えます。このタブで、通常と同じようにバックテストのモードや設定を行います。再生」アイコンをクリックして、選択したチャートでバックテストを実行します。

バックテストの結果

cTrader Automateでは、バックテスト結果を表示するためにいくつかの取引統計を生成されます。このデータを表示するには、「パラメータ」ウィンドウの右側にあるタブに進みます。

証拠金チャート

バックテストが実行されると (ビジュアルモードを使用しているかどうかにかかわらず)、X軸に取引数、Y軸に口座残高を示すチャートを生成します。これには以下の統計が含まれます。

  • 黄色の線は、取引ごとに変化する口座残高を示します。
  • グレーの線は、Botの取引によって有効証拠金がどのように増減するかを示します。

有効証拠金チャートが何をするのかをよりよく理解するために、上の例を考えてみましょう。これは、Botがバックテスト中に290回以上の取引を行ったことを示しています。口座残高が変化するたびに、それに対応する有効証拠金の変化も見ることができます。

取引統計

「取引統計」タブには、バックテストを通じてcBotがどのように正確に実行したかのデータが表示されます。

上記の例では、初期資本から+848%のリターンを達成することができました。「取引統計」タブには以下のフィールドがあります。

概要定義
純利益全取引の純利益の合計。
プロフィットファクター純利益の合計を純損失の合計で割った比率。
手数料cBotが行った取引に対して支払われた手数料の合計額。
最大口座残高ドローダウン口座残高ドロップダウンの最大額。
最大有効証拠金ドローダウン有効証拠金ドロップダウンの最大額。
合計取引件数cBotによって実行された取引の合計数。
勝利取引件数実現利益を得た取引の総数。
最大連続勝利取引件数実現利益を上げた連続取引回数の最大値。
最大勝利取引1回の取引で生じた最大の実現利益。
負け取引件数実現損を出した取引の総数。
最大連続損失取引件数実現損を出した連続取引回数の最大値。
最大損失取引1回の取引で発生した多額の実現損失。
平均取引全取引が生み出す平均実現損益。
シャープレシオボットのリスク調整後のパフォーマンスを測定する比率。cBotの総リターンをその標準偏差で割ることによって計算されます。比率の値が高いほど、パフォーマンスが高いことを示しています。
ソルティノレシオシャープレシオの代替。計算に標準偏差を使用する代わりに、下方偏差を使用します。

ポジション

[ポジション]タブには、cBotが現在オープンしているすべてのポジションが表示されます。このタブは、通常の「トレードウォッチ」の「ポジション」タブと同様の構造になっており、同様のデータが含まれています。

右下の「歯車」アイコンをクリックすると、中央の表に表示されるデータをカスタマイズできます。

注文

「注文」タブには、cBot が発注した注文に関する情報が表示されます。その構成と外観は、メインの「トレードウォッチ」表示の「注文」タブと同様です。

履歴

「履歴」タブには、バックテスト中に記録されたすべての始値と終値の統計が表示されます。上述した他のタブと同様に、「履歴」タブは「トレードウォッチ」表示の「履歴」タブと同様です。

イベント

「イベント」タブには、サーバー関連の通信がすべてリストされ、各イベントのさまざまなパラメータが表示されます。

ログ

最後に、「ログ」タブは、バックテスト中のcBotの出力を表示します。
メッセージのリストは完全に検索可能で、イベントタイプとインスタンスでフィルタリングできます。

最適化

cBotの最適な初期パラメータを指定するのは難しい場合が多くあります。
この問題に対処するため、cTraderは組み込みのボット最適化機能を提供しています。
最適化機能は、お客様のコードを様々なパラメータ値に基づいて各「パス」で数回実行します。そして、最適なパラメータ設定を定義するために使用できるカスタマイズ可能な結果のセットを提示します。

この機能を使用するには、cBotインスタンスを選択し、「最適化」タブに切り替えます。

その後、ドロップダウンカレンダーを使用するか、スライダーをドラッグして、最適化のためのバックテスト期間を指定します。

最適化の設定

最適化は基本的に一連のバックテストに過ぎないため、「バックテスト」タブでバックテストと同様の設定を行うことができます。

最適化パラメータ

カレンダースライダーの左にある「パラメーター」ボタンをクリックしてください。以下のウィンドウが表示されます。

その中で、最適化したいcBotパラメータの横にあるフラグをチェックします。’Timeframe’パラメーターは全てのcBotで使用可能です。

最適化の基準

「最適化パラメーター」ボタンの右にある「最適化基準」ボタンを押します。

最適化基準は、バックテスト後に最適化アルゴリズムが結果をどのようにランク付けするかを定義します。以下のオプションから選択できます。

  • 標準:最小化または最大化を目指すことができる一連の定義済み基準。これを行うには、右側のドロップダウンメニューから基準を選択し、左側の関連メニューで最適化の方向を選択します。新しい基準を追加するには、’基準を追加’をクリックします。
  • カスタム:以下の例に示すように、GetFitness()メソッドを使用してcBotコード内で定義されたカスタム基準。

例:

1
2
3
4
5
protected override double GetFitness(GetFitnessArgs args)
 {
   // Maximize the winning trades/losing trades ratio.
   return args.WinningTrades / args.LosingTrades;
 }

複数基準の計算

パラメータの有効性を計算するために複数の基準が使用されている場合、cTraderは最適化パスのフィットネス値を計算するためにそれらすべてを等しく使用します。

具体的には、プラットフォームは、すべての最大化基準の値を乗算し、すべての最小化基準の値を別々に乗算します。その後、最大化基準の絶対乗算値を、最小化基準の同じ値で割ります。

以下のコードの例では、多基準フィットネス値がどのように計算されるかを示しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
numerator = 1.0
if (valuesToMaximize.Length > 0)
numerator = Abs(Multiply(criteriaValuesToMaximize))

denominator = 1.0
if (valuesToMinimize.Length > 0)
denominator += Abs(Multiply(criteriaValuesToMinimize))

/* The 'sign' variable can be either +` or -1 depending on whether
there are criteria for which their values are less than 0. */
sign = criteriaValuesToMinimize.Concat(criteriaValuesToMaximize).Any(v => v < 0) ? -1 : 1

fitness = sign * numerator / denominator

最適化方法

「GA」ボタン(GAまたは#のどちらかを選択)を押します。下のメニューで、プラットフォームが使用する最適化方法を選択します。

  • 遺伝的アルゴリズム:このアルゴリズムは生物学的進化のプロセスをエミュレートしています。その詳細な説明については、別のセクションを参照してください。
  • グリッド(しらみつぶし検索):こ各パラメータの可能なセットを順次バックテストします。

遺伝的アルゴリズムの方が、最適なパラメータ値を見つけるのが圧倒的に速い傾向にあります。

リソース

「リソース」ボタンをクリックして、CPU負荷のどの割合をバックテストに割り当てるかを選択します。スライダーを動かしてCPU使用率を設定します。

より多くのリソースを割り当てるほど、最適化プロセスはより速く完了します。ただし、他のアプリケーションを使用している場合、パフォーマンスが著しく低下することがあります。

なお、CPUリソースは最適化の最中でも調整可能です。

最適化手順の開始と管理

最適化を進めるには、カレンダースライダーの右にある「再生」ボタンをクリックしてください。マシンのリソース、最適化の設定、cBotの複雑さによっては、最適化に時間がかかる場合があります。

カレンダー・スライダーのすぐ下にあるUIバーには、完了したバックテスト・パスの数、経過時間、残りの推定時間が表示されます。

一方、「最適化」タブの中央画面には、アルゴリズムが完了したすべてのバックテスト・パスに関する情報を含むリアルタイム・グリッドが表示される。

特定のパスでテストされたパラメーターセットを適用するには、「適用」ボタンを押します。
これは、そのパスで最適化が実行されていない場合にのみ有効になります。

または、左上隅の「Autoselect the best pass(最良のパスを自動選択)」フラグをチェックすると、指定した最適化基準に従って最良の結果を達成したパス(およびパラメータ)が選択されます。

最適化の結果

最適化が完了すると、中央のテーブルにすべてのバックテスト・パスとその結果の最終リストが表示されます。

この表には以下の列があります。グリッドは完全に設定可能であるため、テーブル上で右クリックし、コンテキスト・メニューからこれらの列の選択を解除した後、これらの列をドラッグ・アンド・ドロップしたり、完全に無効にしたりすることができます。

フィールド定義
パスパス番号。
フィットネスパスが最適化基準にどれだけ適合しているかを示す値。
有効証拠金パス終了時の有効証拠金合計。
口座残高パス終了時の総残高。
純利益最終残高と開始残高の差。
取引クローズしたポジションの総数。
勝利取引件数パス中に達成した勝ちトレードの総数。
損失取引件数パス中に達成した負けトレードの総数。
プロフィットファクター総利益/総損失率。
最大有効証拠金ドローダウン (%)最大有効証拠金ドローダウンの最大パーセンテージ。
最大口座残高ドローダウン (%)最大口座残高ドローダウンの最大パーセンテージ。
最大有効証拠金ドローダウン口座の預金通貨で指定された最大有効証拠金ドローダウン。
最大口座残高ドローダウン口座の預金通貨で指定された最大口座残高ドローダウン。
シャープレシオボットのリスク調整後のパフォーマンスを測定する比率。
cBotの総リターンをその標準偏差で割ることによって計算されます。比率の値が高いほど、パフォーマンスが高いことを示しています。
ソルティノレシオシャープレシオの代替。計算に標準偏差を用いる代わりに、下方偏差を用いる。
平均取引パス中に行われた全取引の平均利益。
パラメーターを渡すこの欄の「適用」ボタンをクリックすると、そのパスのパラメータがcBotに適用されます。

任意のパスを選択すると、中央のグリッドの下にそのパスの詳細な統計情報が表示されます。

この表示の最初の7つのタブは、「バックテスト」ウィンドウの同じタブと同じ情報を提供します。
「パラメーターを渡す」タブは最適化独自のものです。

パラメーターを渡す

「パラメーターを渡す」タブには以下の情報が表示されます。

Automateは、最適化されたすべてのパラメーターを緑色でハイライトし、固定パラメーター(「パラメーター」メニューで有効化されていないもの)はハイライトされないままとなります。