バックテストスコアの計算方法【バージョン1.0】

Pocket
LINEで送る

バックテストスコアの算出方法を説明します。

現在のバージョンは1.0となります。

 

年間期待収益を計算

まず最初に、1年でどれくらい儲けを期待できるかを計算します。

純益の取得

まずはバックテストの純益の値を取得します。

純益はバックテスト結果の赤枠の部分の数値です。

 

単位ロットあたりの純益に修正

バックテスト時のロット数の設定は、バックテスト毎にバラバラの値です。

ロット数が変われば当然純益も変わってくるので、共通のロット数での純益になるよう修正を加える必要があります。

 

平均数量を算出

1取引あたりの平均数量を下記の式で求めます。

 

平均数量 = 合計数量 ÷ 総取引数

 

合計数量は個別の取引履歴から算出します。

合計数量は取引種別がclose, s/l, t/p, close at stopのいずれかの履歴の数量の総和です。

 

総取引数はバックテストの赤枠部分から取得します。

 

1ロットあたりの純益に変換

1ロット(10万通貨)を基準として、1ロットの場合の純益に変換します。

次の式で計算できます。

 

1ロットあたりの純益 = 純益 × (1 ÷ 平均数量)

 

スプレッドによる補正をかける

取得した純益はそのまま使用するわけではありません。

取得した純益はバックテスト時のスプレッドによる純益です。

スプレッドを変更すると当然純益の値も変わってきます。

バックテストはスプレッドが狭ければ狭いほど有利であり、逆にスプレッドが広いと不利です。

スプレッドの違いによる成績の差を減らすため、スプレッドに応じた補正をかけます。

 

1Pointあたりの損益を算出

スプレッドの補正値を計算する前に、値幅1pointあたりの損益を算出します。

この値は後の計算で必要となります。

1pointとは通貨ペアの最小値幅のことです。

USDJPYなどの小数点以下3桁の口座では0.001円が1pointとなります。

 

1pointあたりの損益は次の手順で計算します。

まずバックテストから取引履歴を一つ抽出します。数量・損益・獲得値幅の3つを取得します。

獲得値幅は買い取引なら決済価格 – エントリー価格です。

売り取引の場合はエントリー価格 – 決済価格で計算できます。

損益と獲得値幅が計算できたら、1pointあたりの損益は次の式で求められます。

 

1pointあたりの損益 = 損益 ÷ (獲得値幅 ÷ 1pointの価格) × (1 ÷ 数量)

 

スプレッド基準値との差を計算

予め通貨ペア毎にスプレッド基準値を決めておきます。

バックテストから取得したスプレッドとスプレッド基準値との差を求めて、この差に応じて補正をかけます。

 

スプレッド差 = スプレッド基準値 – スプレッド

 

例えばUSDJPYの場合、スプレッド基準値を10point (=1銭)とします。

バックテストのスプレッドが5の場合、スプレッド差は10 – 5 = 5となります。

 

ちなみに古いバージョンのMT4では、バックテスト結果にスプレッドが表示されません。

この場合、スプレッドを1と仮定して計算を行います。

 

スプレッドによる補正をかける

1pointあたりの損益とスプレッド差が求まったら、いよいよ補正をかけていきます。

まず1取引あたりの補正値は下記のようになります。

 

1取引あたりの補正値 = 1pointあたりの損益 × スプレッド差

 

例えば1pointあたりの損益が100円、スプレッド差が5とすると、1取引あたりの補正値は100 × 5 = 500円となります。

続いて全体の補正値を計算します。

取引全体のスプレッド補正値は下記のようになります。

 

スプレッド補正値 = 1取引あたりの補正値 × 総取引数

 

ちなみにこの補正値は1ロットあたりの補正値となっております。

1pointあたりの収益計算時に、1ロットで1point動いた場合の収益となるよう求めてあります。

 

求まったスプレッド補正値を最初に取得した純益から差し引くことで、スプレッド差による成績の違いを減らした純益が求まります。

ここではこの値を期待収益と呼ぶこととします。

 

期待収益 = 1ロットあたりの純益 – スプレッド補正値

 

基本的な考えとしては、スプレッド基準値よりも有利なスプレッドでテストしたEAほど、純益から大きな値を差し引いて期待収益を小さくします。

逆にスプレッド基準値よりも不利な条件でテストしたEAほど純益に加算して期待収益は大きくなります。

 

年間期待収益を計算

ここまでで計算した期待収益は全期間の値なので、これを1年あたりの金額に直します。

1年あたりの金額に直すには、バックテスト期間を取得します。

バックテストから開始日と終了日を取得し、テスト日数を求めます。

開始日と終了日は赤枠の部分の日付を使用します。

 

あとは下記の式で1年あたりの収益が計算できます。

 

年間収益 = 純益 ✕ 365 ÷ テスト日数

 

本来取引が発生するのは月曜〜金曜日ですが、計算を簡単にするために土日も含めた計算しています。

また、閏年や年末年始、クリスマスの誤差も無視して計算しています。

 

これで1年あたりの期待収益が求まりました。

 

必要資金

続いてこのEAを運用するのに必要な資金を計算します。

必要資金の計算は必要証拠金と最大ドローダウンから算出する。

 

必要証拠金の取得

必要証拠金の計算には、まず最大取引数量を算出します。

 

最大取引数量の算出

最大取引数量の算出には、まず取引履歴から最大数量を取得します。

取引履歴を検査し、同時に保有した最大数量を算出します。

最大取引数量倍率は下記の式で計算します。

 

最大取引数量倍率 = 最大数量 ÷ 平均数量

 

平均数量は単位ロットあたりの数量を算出した際に求めた値です。

 

最大数量倍率に基準となるロット数をかけて最大数量を求めます。

基準としているロット数は1ロットですので、実際には最大数量倍率 = 最大数量となります。

 

証拠金の算出

1ロットあたりの証拠金は計算を簡略化するために全通貨ペアで10000pointとしています。

 

必要証拠金 = 最大取引数量 × 10000 × 1pointあたりの損益

 

最大ドローダウンの取得

最大ドローダウンはバックテスト結果から取得します。

 

最大ドローダウンには金額ベースの値とパーセンテージがありますが、金額ベースの値となります。

上の画像の例ですと99799.56を使用します。

取得した最大ドローダウンを1ロットの場合の最大ドローダウンへ変換しました。

 

1ロットあたりの最大ドローダウン = 最大ドローダウン ✕ (1 ÷ 平均数量)

 

必要資金の算出

必要資金は下記の式で計算します。

 

必要資金 = 必要証拠金 +1ロットあたりの最大ドローダウン × 2

 

最大ドローダウンは2倍の値を必要資金としています。

バックテストの最大ドローダウンはあくまでバックテスト期間中の最大ドローダウンですので、運用開始後にそれ以上のドローダウンが発生する可能性があります。

そのため安全性を考慮して最大ドローダウンの2倍を必要数としております。

 

年利の計算

年間期待収益と必要資金から、年利を求めます。

この年利がバックテストスコアの基準となる値です。

年利は下記の式で計算できます。

 

年利[%] = 年間期待収益 ÷ 必要資金 × 100

 

この年利の値に補正をいくつかかけた結果がバックテストスコアとなります。

この年利を仮にスコア基準値と呼ぶこととします。

仮に年利が100%であれば、スコア基準値も100となります。

 

スコア基準値の補正

上記までで求めたスコア基準値に、4種類の補正をかけることで最終的なバックテストスコアとします。

モデリング品質による補正

バックテストの精度を測る指標として、バックテストファイルにはモデリング品質という項目があります。

 

バックテストスコアはバックテストの結果を元にして算出しますので、バックテスト自体の精度が低いと意味がありません。

そのためモデリング品質が低いバックテストはバックテストスコアも低下するよう補正をかけています。

具体的には下記の式で補正値を求め、バックテストスコアに掛け合わせることで補正をおこないます。

 

モデリング品質補正値 = (モデリング品質[%] + 10) ÷ 100

 

例として、モデリング品質90%のバックテストは、補正値が(90 + 10) ÷ 100 = 1となります。

 

モデリング品質補正値は最大値を1としています。

モデリング品質が仮に100%のテスト結果があったとしても、補正値は1.1とはならず1となります。

 

1分足のモデリング品質の扱い

1分足の場合、モデリング品質は最高値が25%です。

バックテストスコアでは1分足のテスト結果であっても他の時間足と同等に扱います。

そのため1分足の計算式はそれ以外の時間足と異なり、下記のようになります。

 

モデリング品質補正値 = (モデリング品質[%] × 90 ÷ 25 + 10) ÷ 100

 

モデリング品質n/aの扱い

モデリング品質が最も低い場合、バックテストには0%ではなくn/aと記載されます。

もしモデリング品質n/a場合はモデリング品質を0%と仮定して計算を行います。

具体的にモデリング品質n/aの場合、モデリング品質補正値は0.1となります。

これはたとえn/aであっても全く成績であるとは考えず、多少は実際の取引に近い結果となっている可能性を考慮した上で、最終的なバックテストスコアが0とはならないよう配慮した結果です。

 

取引期間による補正

取引期間が短いEAは短い期間に最適化されたEAである可能性があります。

短い期間に最適化されている場合、運用開始後に成績が下がる場合があるため、取引期間の短いバックテストはスコアが下がるよう調整します。

取引期間は10年(3650日)を基準とし、取引期間が10年未満のバックテストはスコアを下方修正するよう調整をおこないます。

 

取引期間補正値 = テスト日数 ÷ 3650

 

取引期間補正値は最大値を1.0としており、取引期間10年以上のバックテストは補正値が一律1.0となります。

 

取引数による補正

取引回数が多いほどバックテストの結果は信頼できるデータであると言えます。

具体的には総取引数1000回を基準としています。

1000回未満の総取引数では、バックテストスコアを下方修正するよう調整を加えます。

 

取引数補正値 = 総取引数 ÷ 1000

 

取引数補正値は最大値を1.0としており、取引数が1000回以上のバックテストは補正値が一律1.0となります。

 

modify数による補正

ポジションにTP/SLなどの注文変更を加えると、バックテストには取引種別modifyとして記載されます。

MT4のバックテストは1分足の4本値に関するデータがもっとも正確な値で、それ以下のティック毎の値動きは一定のアルゴリズムによる自動生成されています。

そのためより実際の成績に近いテストをおこなうには、始値のタイミングでのみ取引するのが理想です。

modifyが多いEAは実際の取引とのズレが増えると考え、取引数に対してmodify数が多いEAはスコアを下げる補正を加えています。

総取引数に対して10倍以上のmodify数のバックテストはスコアを下方修正します。

 

modify補正値 = 総取引数 × 10 ÷ modify数

 

modify補正値も他の補正値同様最大値は1.0です。

また、modify数が0でもmodify補正値は1.0となります。

 

バックテストスコアの算出

これまでに算出した4つの補正値をスコア基準値にかけあわせてバックテストスコアを算出します。

 

バックテストスコア = スコア基準値 × モデリング品質補正値 × 取引期間補正値 × 取引数補正値 × modify補正値

 

上記の式で求めたバックテストスコアの値を、整数に直して最終的なバックテストスコアとします。

このとき四捨五入はせず、小数点以下を全て切り捨てます。

 

以上でバックテストスコアの算出は全て完了です。

 

Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)