Diskussion zum Artikel "R-squared als Gütemaß der Saldenkurve einer Strategie"

 
 

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

Oh! Ich dachte immer, es wären 100. Danke, interessanter Artikel.

Man kann also mit Sicherheit sagen, dass das Bestimmtheitsmaß R-Quadrat eine wichtige Ergänzung zu den bestehenden MetaTrader 5-Testmetriken darstellt. Es ermöglicht Ihnen, die Glattheit der Gleichgewichtskurve einer Strategie zu bewerten, was an sich schon eine nicht triviale Metrik ist. R-Quadrat ist einfach zu verwenden: Sein Wertebereich ist fest und reicht von -1,0 bis +1,0, was einen negativen Trend der Strategiebilanz (Werte nahe -1,0), keinen Trend (Werte nahe 0,0) und einen positiven Trend (Werte mit Tendenz zu +1,0) anzeigt. Aufgrund all dieser Eigenschaften, der Zuverlässigkeit und der Einfachheit kann R-square für den Aufbau eines profitablen Handelssystems empfohlen werden.

Wahnsinn! Ich dachte immer, dass Ryx - das Bestimmtheitsmaß - dazu dient, die Qualität der linearen Regression zu bewerten. DasBestimmtheitsmaßfür einModellmit einerKonstantenimmt Wertezwischen0und1 an.

Es ist auch üblich, Signifikanztests für den Regressionskoeffizienten durchzuführen. Sogar Alglib hat sie :-)

PearsonCorrelationSignificance(), SpearmanRankCorrelationSignificance().

 
verwenden wir den vorgefertigten Expert Advisor CImpulse 2.0, dessen Funktionsweise im Artikel"Universal Trading Expert Advisor: Arbeiten mit Pending Orders" beschrieben wird. Er wurde wegen seiner Einfachheit und der Tatsache ausgewählt, dass er im Gegensatz zu den Expert Advisors aus der Standardauslieferung von MetaTrader 5 optimiert werden kann, was für die Zwecke unseres Artikels äußerst wichtig ist

Was war gemeint?

Es gibt eine spezielle statistische Metrik im MetaTrader-Terminalbericht. Sie heißt LR-Korrelation und zeigt die Korrelation zwischen der Gleichgewichtslinie und der für diese Linie gefundenen linearen Regression an.

Die Art und Weise der Berechnung des Bestimmtheitsmaßes R^2 ähnelt der Art und Weise der Berechnung der LR-Korrelation. Aber die endgültige Zahl ist zusätzlich quadriert.

Eine Zahl, die uns hier am meisten interessiert, ist R-Quadrat oder R-squared. Diese Metrik weist einen Wert von 0,5903 auf. Somit erklärt die lineare Regression 59,03 % aller Werte und die restlichen 41 % bleiben unerklärt.

Aus den obigen Zitaten ergibt sich, dass R^2 = LR^2 ist. Das Kriterium für die Suche nach einer linearen Funktion, die "Lineare Regression" genannt wird, ist also der MNC der Varianzen oder - was dasselbe ist - die Maximierung des absoluten Werts des Pearsonschen RQ, der MathAbs(LR) ist. Und die Maximierung von MathAbs(LR) ist dasselbe wie die Maximierung von R^2, da MathAbs(LR) = MathSqrt(R^2).


Insgesamt ergibt sich, dass die lineare Regression durch das Maximierungskriterium MathAbs(R)^n gefunden wird, wobei n eine beliebige positive Zahl ist.

Was bringt es dann, von 59,03% aller Werte zu sprechen, die durch LR erklärt werden, wenn man z.B. bei n = 1 76,8% und bei n = 4 - 34,8% erhält?


Falsche Aussage

R^2 ist nichts anderes als die Korrelation zwischen einem Graphen und seinem linearen Modell

   //-- R^2 und sein Vorzeichen finden
   double r2 = MathPow(corr, 2.0);
 
Способ расчета коэффициента детерминации R^2 аналогичен способу расчета LR Correlation. Но итоговое число дополнительно возводится в квадрат.

Die Darstellung der LR-Korrelations- und R^2-Verteilung für die 10.000 unabhängigen Beispiele, die in dem Artikel vorgestellt werden, zeigt, dass R^2 != LR^2 ist.

Das Erstaunliche daran ist, dass wir durch eine einfache mathematische Maßnahme (zweiter Grad) die unerwünschten Randeffekte der Verteilung vollständig entfernt haben.

Ich verstehe nicht, warum der zweite Grad der ursprünglichen "konkaven" Verteilung sie "flach" macht?
 
Lassen Sie uns nun den besten Lauf anhand des Parameters R-Quadrat ermitteln. Dazu speichern Sie die Optimierungsläufe in einer XML-Datei. Wenn Microsoft Excel auf Ihrem Computer installiert ist, wird die Datei automatisch in Excel geöffnet. Wir werden mit Sortierung und Filtern arbeiten, also markieren wir den Tabellenkopf und klicken auf die gleichnamige Schaltfläche (Home -> Sortieren und Filtern -> Filtern), woraufhin Sie die Spalten flexibel anzeigen können. Отсортируем прогоны по пользовательскому критерию оптимизации

Warum Excel verwenden, wenn alles im Tester selbst sortiert ist?

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

Das Eigenkapital für die R^2-Berechnung sollte nicht als AccountEquity ( == AccountBalance + Sum(Profit[i])), sondern als Sum(Profit[i] / Lots[i]) gezählt werden (für einstellige TS).

 
Von allen MQL-Quellen in diesem Artikel ist nur eine nützlich
//+------------------------------------------------------------------+
//| Gibt den R^2-Wert zurück, der auf der Grundlage des Eigenkapitals der Strategie berechnet wurde |
//| Eigenkapitalwerte werden als Eigenkapital-Array übergeben.
//+------------------------------------------------------------------+
double CustomR2Equity(double& equity[], ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
   int total = ArraySize(equity);
   if(total == 0)
      return 0.0;
   //-- Füllen der Matrix Y - Aktienwert, X - Ordnungszahl des Wertes
   CMatrixDouble xy(total, 2);
   for(int i = 0; i < total; i++)
   {
      xy[i].Set(0, i);
      xy[i].Set(1, equity[i]);
   }
   //-- Ermitteln Sie die Koeffizienten a und b des linearen Modells y = a*x + b;
   int retcode = 0;
   double a, b;
   CLinReg::LRLine(xy, total, retcode, a, b);
   //-- Erzeugen von linearen Regressionswerten für jedes X;
   double estimate[];
   ArrayResize(estimate, total);
   for(int x = 0; x < total; x++)
      estimate[x] = x*a+b;
   //-- Ermittlung des Korrelationskoeffizienten von Werten mit ihrer linearen Regression
   double corr = 0.0;
   if(corr_type == CORR_PEARSON)
      corr = CAlglib::PearsonCorr2(equity, estimate);
   else
      corr = CAlglib::SpearmanCorr2(equity, estimate);
   //-- R^2 und sein Vorzeichen finden
   double r2 = MathPow(corr, 2.0);
   int sign = 1;
   if(equity[0] > equity[total-1])
      sign = -1;
   r2 *= sign;
   //-- Rückgabe der normalisierten Schätzung von R^2, mit Hundertstel Genauigkeit
   return NormalizeDouble(r2,2);
}

Sie ist universell - sie eignet sich für alle Double-Arrays (nicht nur Equity).

Wenn man sich alle anderen MQL-Codes ansieht, versteht man nicht, warum sie angegeben werden, da sie ohne Kenntnisse von CStrategy überhaupt nicht lesbar sind.


Danke an den Autor für den Artikel, er hat mich zum Nachdenken gebracht.


ZY Die gelb markierten Zeilen im Quellcode sind umstritten.

 

Sehr interessant, vielen Dank. Ich habe nie darüber nachgedacht, dass die Metriken der Tester durch die Kapitalisierung verzerrt werden, so dass die Optimierung weniger effizient ist als bei einem festen Volumen. Und R^2 ist natürlich sehr nützlich. Ich frage mich, ob es den Optimierungsprozess im Vergleich zu Gewinnfaktor und maximalem Gleichgewicht beschleunigen wird.

 
fxsaber:
Von allen MQL-Quellen in dem Artikel ist nur eine nützlich

Dem stimme ich zu, alle anderen müssen aus den Klassen herausgerissen werden, um sie Ihrem System hinzuzufügen... es wäre besser, alles in separaten fs oder einem separaten includnik zu haben.

 
fxsaber:

Das Eigenkapital für die R^2-Berechnung sollte nicht als AccountEquity ( == AccountBalance + Sum(Profit[i])), sondern als Sum(Profit[i] / Lots[i]) berechnet werden (für einstellige TS).

Code zur Berechnung des "Eigenkapitals", geeignet für R^2. Er ist im MT4-Stil geschrieben, es ist nicht schwierig, ihn in MT5 zu übersetzen...

// Eigenkapitalberechnung ohne MM (Variante für einstellige TS)
class EQUITY
{
protected:
  int PrevHistoryTotal;
  double Balance;
  double PrevEquity;
  
  // Hinzufügen eines Elements an das Ende eines beliebigen Arrays
  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()); // Provisionen und Tauschgeschäfte sind manchmal sinnvollerweise zu ignorieren
  }
  
  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()) // 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;
    }
  }
};


Verwendung

EQUITY Equity;

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

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

Code zur Berechnung von "Equity", geeignet für R^2. Geschrieben im MT4-Stil, es ist nicht schwierig, es zu MT5.... übersetzen.


Verwendung


Cool, Sie können es einfach bei jedem neuen Bar aufrufen, so dass das System nicht mit einem Timer geladen wird. Für Systeme mit neuer Balkenkontrolle.