記事"戦略バランス曲線の品質評価としての R 乗"についてのディスカッション

 

新しい記事 戦略バランス曲線の品質評価としての R 乗 はパブリッシュされました:

この記事では、カスタム最適化基準R乗の構築について扱います。 この基準は、戦略のバランス曲線の品質を推定し、安定した戦略を構築するために使うことができます。 今回は、このメトリックのプロパティと品質の推定に使用される、構造と統計的手法について説明します。

しかし、どのすれば正しく直線を描画することができるでしょうか。 数学的メソッドは、すべての利用可能なポイントがこのラインへの距離の最小の合計を持つような方法で線形回帰係数を最適に計算するために使用することができます。 これについては、次の表で説明します。 5つの任意のポイントを通過する2つのラインがあると仮定します。 2つのラインから、ポイントまでの距離の最小合計を持つものを選択する必要があります:


図14. 最適な線形回帰の選択

作者: Vasiliy Sokolov

 

Именно поэтому количество сделок должно быть достаточно большим. Но что подразумевать под достаточностью? Принято считать, что любая выборка должна содержать как минимум 37 измерений. Это магическое число в статистике, именно оно является нижней границей репрезентативности параметра. Конечно, для оценки торговой системы этого количества сделок недостаточно. Для надежного результата желательно совершить не менее 100 — 150 сделок. Более того, для многих профессиональных трейдеров и этого недостаточно. Они проектируют системы, совершающие не менее 500-1000 сделок, и уже потом, на основании этих результатов, рассматривают возможность запуска системы на реальных торгах...

ああ!ずっと100 だと思ってた。ありがとうございます。

このように、R二乗決定係数はMetaTrader 5のテストメトリクスの既存のセットに追加された重要なものであると言ってよいでしょう。これによって、ストラテジーのバランスライン曲線の滑らかさを評価することができ、それ自体が自明な指標ではありません。R二乗は使いやすく、値の範囲は固定で-1.0から+1.0まであり、ストラテジーバランスのマイナス傾向(-1.0に近い値)、傾向なし(0.0に近い値)、プラス傾向(+1.0に近い値)を示します。これらすべての特性、信頼性、簡便性から、R-squareは収益性の高い取引システムの構築に使用することをお勧めします。

すごい!私は、Ryx- 決定係数 - は 線形回帰の 品質を評価するために使用されると思って いました。定数を持つモデルの決定 係数は0から1の値をとります

回帰係数の有意性検定もよく行われます。Alglibにもあります:-)

PearsonCorrelationSignificance(), SpearmanRankCorrelationSignificance().

 
ここでは、「Universal Trading Expert Advisor: Working with Pending Orders」の記事で説明されている既製のExpert AdvisorCImpulse 2.0 を使用します。このExpert Advisorは、シンプルであることと、標準のMetaTrader 5のExpert Advisorとは異なり、最適化が可能である ことから選ばれました。

どういう意味か?

MetaTraderターミナルのレポートには特別な統計指標があります。それはLR相関と 呼ばれ、バランスラインとこのラインのために発見された線形回帰の間の相関を示しています。

決定係数 R^2 の計算方法は、LR 相関の計算方法と似ています。しかし、最終的な数値はさらに2乗されます。

ここで最も関心のある数値は、R2乗またはR-squaredです。この指標は、0.5903という値を示します。したがって、線形回帰はすべての値の59.03%を説明 し、残りの41%は説明できないままである。

上記の引用から、R^2 = LR^2 が成り立つ。したがって、"線形回帰 "と呼ばれる線形関数を見つける基準は、分散のMNC、または同じことです -MathAbs(LR) であるピアソンのRQの絶対値を最大化することです。そして、MathAbs(LR) = MathSqrt(R^2)なので、MathAbs(LR)を 最大化することは、R^2を 最大化することと同じです。


合計すると、線形回帰は最大化基準MathAbs(R)^n(n は任意の正数)によって見つけられる。

それなら、例えば、n = 1では 76.8%、n = 4では- 34.8%を得ることができるのに、LRによって説明されるすべての値の59.03%について話すことに何の意味があるのでしょうか?


誤った記述

R^2はグラフとその線形モデルとの相関に過ぎない。

   //-- R^2とその符号を求める
   double r2 = MathPow(corr, 2.0);
 
Способ расчета коэффициента детерминации R^2 аналогичен способу расчета LR Correlation. Но итоговое число дополнительно возводится в квадрат.

記事で紹介されている10,000の独立した例に対するLR相関分布とR^2分布のプロットは、R^2 != LR^2 であることを示している。

驚くべきことは、単純な数学的作用(2次)によって、分布の望ましくない周辺効果を完全に除去していることである。

なぜ元の「凹」分布の2次が「平」分布になるのか理解できない。
 
それでは、R2乗パラメータで最適なランを見つけましょう。これを行うには、最適化の実行をXMLファイルに保存します。お使いのコンピューターにMicrosoft Excelがインストールされていれば、ファイルは自動的にExcelで開きます。並べ替えとフィルターを使って作業するので、表のヘッダーをハイライトして、同じ名前のボタン(ホーム -> 並べ替えとフィルター -> フィルター)をクリックしよう。Отсортируем прогоны по пользовательскому критерию оптимизации

Tester自体で全てがソートされているのに、なぜExcelを使うのでしょうか?

 
НедостаткиРешение
Применим исключительно для оценки линейных процессов, или систем, торгующих фиксированным лотом.Не применять для торговых систем, использующих систему капитализации (мани-менеджемент).

R^2計算のための資本は、AccountEquity( == AccountBalance + Sum(Profit[i]))ではなくSum(Profit[i] / Lots[i])(1文字のTSの場合)としてカウントされるべきである。

 
記事中のすべてのMQLソースの中で、有用なのは1つだけである。
//+------------------------------------------------------------------+
//| ストラテジーのエクイティに基づいて計算された R^2 スコアを返します。
//| 株式の値は株式の配列として渡される。
//+------------------------------------------------------------------+
double CustomR2Equity(double& equity[], ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
   int total = ArraySize(equity);
   if(total == 0)
      return 0.0;
   //-- 行列を埋める Y - 株式価値, X - 価値の序数
   CMatrixDouble xy(total, 2);
   for(int i = 0; i < total; i++)
   {
      xy[i].Set(0, i);
      xy[i].Set(1, equity[i]);
   }
   //-- 線形モデル y = a*x + b の係数 a と b を求める;
   int retcode = 0;
   double a, b;
   CLinReg::LRLine(xy, total, retcode, a, b);
   //-- 各 X に対して線形回帰値を生成する;
   double estimate[];
   ArrayResize(estimate, total);
   for(int x = 0; x < total; x++)
      estimate[x] = x*a+b;
   //-- 値の線形回帰との相関係数を求める
   double corr = 0.0;
   if(corr_type == CORR_PEARSON)
      corr = CAlglib::PearsonCorr2(equity, estimate);
   else
      corr = CAlglib::SpearmanCorr2(equity, estimate);
   //-- R^2とその符号を求める
   double r2 = MathPow(corr, 2.0);
   int sign = 1;
   if(equity[0] > equity[total-1])
      sign = -1;
   r2 *= sign;
   //-- R^2の正規化推定値を100分の1の精度で返す。
   return NormalizeDouble(r2,2);
}

Equityだけでなく)あらゆるダブル配列に適している。

他のすべてのMQLコードを見ると、なぜそのようなコードが与えられているのか理解できません。


この記事を書いてくれた著者に感謝します。


ZY ソースコードの黄色でハイライトされている行は議論の余地があります。

 

とても興味深い。テスターの指標はキャプチタリゼーションによって歪められるので、最適化は固定ボリュームよりも効率が悪くなるという事実は考えもしませんでした。そしてR^2はもちろん非常に有用で、例えばプロフィットファクター+マックスバランスと比較して最適化プロセスをスピードアップできるかどうか疑問です。

 
fxsaber:
記事にあるMQLソースの中で、有用なのは1つだけだ。

残りはすべて、あなたのシステムに追加するためにクラスから切り離さなければならないだろう......すべてを別のFSか別のincludnikにしたほうがいいだろう。

 
fxsaber:

R^2 計算のためのエクイティは、AccountEquity ( == AccountBalance + Sum(Profit[i]))ではなくSum(Profit[i] / Lots[i])(1文字 TS の場合)として計算する必要があります。

R^2に適した「エクイティ」の計算コード。MT4スタイルで書かれているので、MT5に翻訳するのは難しくないが...。

// MMを使用しない場合の持分計算(1文字TSの場合のバリエーション)
class EQUITY
{
protected:
  int PrevHistoryTotal;
  double Balance;
  double PrevEquity;
  
  // 任意の配列の末尾に要素を追加する。
  template <typename T>
  static void AddArrayElement( T &Array[], const T Value, const int Reserve = 0 )
  {
    const int Size = ::ArraySize(Array);
  
    ::ArrayResize(Array, Size + 1, Reserve);
  
    Array[Size] = Value;
  }

  static double GetOrderProfit( void )
  {
    return((OrderProfit()/* + OrderCommission() + OrderSwap()*/) / OrderLots()); // 手数料とスワップは無視したほうがいい場合もある
  }
  
  static double GetProfit( void )
  {
    double Res = 0;
    
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
        Res += EQUITY::GetOrderProfit();
    
    return(Res);
  }
  
  double GetBalance( void )
  {
    const int HistoryTotal = OrdersHistoryTotal();
    
    if (HistoryTotal != this.PrevHistoryTotal)
    {
      for (int i = HistoryTotal - 1; i >= PrevHistoryTotal; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) && OrderLots()) // オーダーロット - CloseBy
          this.Balance += EQUITY::GetOrderProfit();
      
      this.PrevHistoryTotal = HistoryTotal;
    }
    
    return(this.Balance);
  }
  
public:
  double Data[];

  EQUITY( void ) : PrevHistoryTotal(0), Balance(0), PrevEquity(0)
  {
  }
  
  virtual void OnTimer( void )
  {
    const double NewEquity = this.GetBalance() + EQUITY::GetProfit();
    
    if (NewEquity != this.PrevEquity)    
    {
      EQUITY::AddArrayElement(this.Data, NewEquity, 1 e4);
      
      this.PrevEquity = NewEquity;
    }
  }
};


使用法

EQUITY Equity;

void OnTimer()
{
  Equity.OnTimer();
}

double OnTester()
{
  return(CustomR2Equity(Equity.Data));
}
 
fxsaber:

R^2に適した「エクイティ」を計算するコード。MT4スタイルで書かれているので、MT5に翻訳するのは簡単です。


使い方


システムがタイマーでロードされないように、新しいバー ごとに呼び出すことができます。新しいバーのコントロールがあるシステムの場合。