English

MQL5の書き方(for MQL4デザイナー)

 

2024.10

林貴晴/AMSER Inc.

標準偏差を活用したストップロスの設定

トレードにおいて、損切(ストップロス)の設定は、リスクを制御するための重要な要素です。この記事では、過去の取引履歴の「標準偏差」を使い、ストップロスを適切に設定する方法をわかりやすく解説します。

ストップロスは、取引で損失を一定の範囲内に抑えるために設定する損切りラインです。トレードのリスク管理をする上で重要な要素であり、予期せぬ価格変動による損失を制限するための仕組みです。

バックテストは、大量の『過去データ』を使用して取引ロジックを検証する方法です。この結果が示すのは、将来も同様の成績が得られる可能性が高いということです。バックテストで最も重要なのは再現性です。
しかし、メタトレーダーの最適化機能でストップロスの値を決定すると、過剰最適化のリスクが生じ、再現性が低下する恐れがあります。

そこで今回は、バックテストの取引履歴から「標準偏差」を計算しストップロスを設定する統計学的アプローチを行います。

標準偏差は、データのばらつきを表す指標で、「σ(シグマ)」と呼ばれます。データが平均からどれくらい離れているかを示し、標準偏差(σ)が大きいほどデータの分散が大きく、小さいほどデータが平均に集約していることを示します。

正規分布している場合、平均-σにストップロスを設定すると、ストップロスが発動する確率は全取引の約15.9%です。例えば、バックテストで1,000取引を行った場合、約159回ストップロスが発動する計算になります。ただし、実際の取引結果が正規分布することは稀であり、発動回数には多少の誤差が生じます。

再現性を高めるためにストップロスを設定する際は、元々のEAロジックにもよりますが、平均-0.84σから平均-1.5σ程度が適正な範囲とされています。σにかける係数を低くするとストップロスの発動回数が増え、成績が極端に悪化する傾向があります。一方、係数を大きくすると偶然の要素が強まり、再現性が低下するリスクが高まります。

ストップロス設定 発動率(%)
平均 - 0.84σ 20.0%
平均 - 1σ 15.9%
平均 - 1.28σ 10.0%
平均 - 1.5σ 6.7%
平均 - 2σ 2.3%

取引結果の平均と標準偏差の計算コード

以下のコードをEAのソースの末尾に追加することで、Print()関数を使用して平均値と標準偏差(σ)を出力できます。

double OnTester()
   {
   // 注文履歴の取得
   HistorySelect(D'1970.01.01', TimeCurrent());
   
   // 約定数(in,outそれぞれ1回)の取得
   int Trades = HistoryDealsTotal();
   
   // 平均・標準偏差用基礎値の計算
   double Sum = 0, Squared = 0,Cnt=0;   
   for(int i = 0; i < Trades; i++)
      {
      ulong Ticket = HistoryDealGetTicket(i);
      // 重複カウント回避(outでない場合はスキップ)
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) != DEAL_ENTRY_OUT) continue;

      double Profit = HistoryDealGetDouble(Ticket, DEAL_PROFIT);
      Sum += Profit;
      Squared += Profit * Profit;
      Cnt++;
      }
      
   // 取引数が0の場合終了(ゼロ除算回避)  
   if(!Cnt)return 0;
   
   // 平均計算
   double Avg = Sum / Cnt;
   
   // 標準偏差計算
   double Std_Dev = MathSqrt(Squared / Cnt - Avg * Avg);

   // 平均と標準偏差を表示
   Print("取引の平均利益: ", Avg);
   Print("取引の標準偏差 (σ): ", Std_Dev);

   // OnTester の戻り値として標準偏差を返す
   return Std_Dev;
   }
                    
 

OnTester()関数は、バックテストが終了した時や、最適化において各条件が終了するたびに実行されます。Returnで返せる値は1つのみのため、今回は標準偏差(σ)の値を返しています。平均値は期待利得と同じ値になるため、平均値を確認したい場合は期待利得を参照してください。

MQL4にはiMAOnArray()関数やiStdDevOnArray()関数があるため、取引結果の配列を関数に渡すだけで平均や標準偏差を計算することができます。しかし、MQL5には~OnArray()関数がないために、自分で計算する必要があります。

平均 = 損益の合計 ÷ 取引回数

標準偏差 = (損益の二乗の合計 ÷ 取引数 − 平均の二乗)の平方根

過去データはDEALで取得しますが、1つの取引にはin(ポジション保有)とout(決済)の2つのデータが含まれるため、重複を避けるためにoutのデータのみを用いて計算します。

if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) != DEAL_ENTRY_OUT) continue                        
                    
 

今回は、再現性の高いバックテストを行うため、統計学的アプローチを用いた方法を紹介しました。
バックテストの再現性を高めることで、運用計画の精度高めることを願っています。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。