Именно поэтому количество сделок должно быть достаточно большим. Но что подразумевать под достаточностью? Принято считать, что любая выборка должна содержать как минимум 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().
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);
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.
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).
//+------------------------------------------------------------------+ //| 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.
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.
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)); }
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.