Abbildung 19: LR-Korrelationsverteilung für 10.000 Random Walks
Abbildung 20: Verteilung von R^2 für 10.000 zufällige Spaziergänge
Ich verstehe nicht, wie R^2 die negativen Werte annehmen kann, die im zweiten Diagramm gezeigt werden? Ja, und es gibt Fragen zum ersten Diagramm. Wenn die lineare Regression korrekt dargestellt wird, sollte der Pearsonsche RQ (LR) nicht negativ sein. Aber in der Grafik ist er nicht negativ. Wo liege ich falsch?
Ich hab's. Ich liege nirgendwo falsch, es ist nur so, dass die Graphen benutzerdefinierte R^2 und LR haben - die Multiplikation mit -1 des realen Wertes tritt auf, wenn das letzte Element der numerischen Reihe kleiner ist als das erste. Es wäre gut, darüber zu schreiben, bevor die Graphen.
Die Graphen der LR-Korrelations- und R^2-Verteilung für die 10.000 unabhängigen Beispiele, die in dem Artikel vorgestellt werden, zeigen, dass R^2 != LR^2 ist.
Ich verstehe nicht, warum der zweite Grad der ursprünglichen "konkaven" Verteilung sie "flach" macht?
Hier wurde ich eines Besseren belehrt. Für mich ist die Aussage überhaupt nicht offensichtlich
Erstaunlich ist, dass wirdurch eine einfache mathematische Maßnahme (durch Erhöhen auf den zweiten Grad) die unerwünschten Randeffekte der Verteilung vollständig beseitigt haben.
Also habe ich beschlossen, dies experimentell mit Hilfe einer Animation zu bestätigen (und mich nicht auf mein Wort zu verlassen)
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Normal.mqh>
#include <Math\Alglib\Alglib.mqh>
// Gibt die Y-Werte der Linie zurück (y(x)=a*x+b)void GetLine( constdouble a, constdouble b, constint Amount, double &Result[] )
{
ArrayResize(Result, Amount);
for (int i = 0; i < Amount; i++)
Result[i] = a * i + b;
}
// Liefert eine lineare Regression über CAlglib::LRBuild + CAlglib::LRUnpackvoid GetLinearRegression( constdouble &Array[], double &Result[] )
{
constint Total = ArraySize(Array);
CMatrixDouble XY(Total, 2);
for (int i = 0; i < Total; i++)
{
XY[i].Set(0, i);
XY[i].Set(1, Array[i]);
}
int retcode;
CLinearModelShell lm;
CLRReportShell ar;
//--- Arrays zum Speichern von Regressionsergebnissendouble lr_coeff[];
//--- Berechnung der linearen Regressionskoeffizienten
CAlglib::LRBuild(XY, Total, 1, retcode, lm, ar);
//--- Ermittlung der linearen Regressionskoeffizienten
CAlglib::LRUnpack(lm, lr_coeff, retcode);
GetLine(lr_coeff[0], lr_coeff[1], Total, Result);
}
// Berechnet Rdouble GetCustomR( constdouble &Array[] )
{
double Estimate[];
GetLinearRegression(Array, Estimate);
constdouble R = CAlglib::PearsonCorr2(Array, Estimate);
return((Array[0] > Array[ArraySize(Array) - 1]) ? -R : R);
}
// Berechnet R zufällige Vektorenvoid GetRandomCustomR( constint Amount, constint VectorSize, double &Result[] )
{
double Random[];
double Sum[];
MathSrand(GetTickCount());
ArrayResize(Result, Amount);
for (int i = 0; i < Amount; i++)
{
MathRandomNormal(0, 1, VectorSize, Random);
MathCumulativeSum(Random, Sum);
Result[i] = GetCustomR(Sum);
}
}
void ToChart( constdouble &X[], constdouble &Y[], conststring Str = NULL, constint X0 = 0, constint Y0 = 0, constint Width = 780, constint Height = 380 )
{
staticconststring Name = __FILE__;
CGraphic Graphic;
if (ObjectFind(0, Name)<0)
Graphic.Create(0, Name, 0, X0, Y0, Width, Height);
else
Graphic.Attach(0, Name);
Graphic.BackgroundMain(Str);
Graphic.BackgroundMainSize(16);
Graphic.CurveAdd(X, Y, CURVE_HISTOGRAM).HistogramWidth(6);
Graphic.CurvePlotAll();
Graphic.Update();
}
voidMathPow( double &Result[], constdouble &Array[], constdouble Pow )
{
constint Size = ArrayResize(Result, ArraySize(Array));
for (int i = 0; i < Size; i++)
Result[i] = (Array[i] < 0) ? -MathPow(-Array[i], Pow) : MathPow(Array[i], Pow);
}
// https://www.mql5.com/de/docs/standardlibrary/mathematics/stat/normal//+------------------------------------------------------------------+ //| Häufigkeiten für den Datensatz berechnen| //+------------------------------------------------------------------+ bool CalculateHistogramArray(constdouble &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,constint cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) returnfalse;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- die Zentren der Intervalle festlegen for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- Ausfüllen der Intervallfrequenzen for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
void DistributionToChart( constdouble &Array[], conststring Str = NULL, constint NCells = 51 )
{
double X[]; // Histogramm-Intervallzentren double Y[]; // Anzahl der Werte aus der Stichprobe, die in das Intervall fallen double Max, Min; // Höchst- und Mindestwerte in der Stichprobe
CalculateHistogramArray(Array, X, Y, Max, Min, NCells);
ToChart(X, Y, Str);
}
voidOnInit()
{
double R[];
GetRandomCustomR(1 e3, 1 e4, R);
double Array[];
constint Max = 50;
while (!IsStopped())
for (int i = 1; !IsStopped() && i < (Max << 1); i++)
{
constdouble Pow = (i > Max) ? ((Max << 1) - i) * 0.1 : i * 0.1;
MathPow(Array, R, Pow);
DistributionToChart(Array, "Distribution of R^" + DoubleToString(Pow, 1));
Sleep(100);
}
}
Abb. 21: R^2-Wert als benutzerdefiniertes Optimierungskriterium
Wo ist in MQL die LR-Korrelation, die auf dem Bild zu sehen ist? Oder werden dieser und viele andere Parameter nur für einzelne Läufe berechnet, so dass sie in ENUM_STATISTICS nicht vorhanden sind?
Wenn ja, schlagen sie vor, diesen Parameter aus den in diesem Artikel erwähnten vernünftigen Überlegungen zu berechnen: durch Eigenkapital ohne MM und quadriert.
ZЫ Ich habe gemessen, wie viel Zeit die Berechnung von GetCustomR für ein Array mit einer Million Werten (wie equity) in Anspruch nimmt - 2,5 Sekunden. Das ist eine Menge Zeit. Alles wird für die LR-Berechnung verwendet(CAlglib::LRBuild + CAlglib::LRUnpack). Aber manchmal ist gekrümmte LR durch CLinReg::LRLine um eine Größenordnung schneller. Wenn man es aufpeppt, wird es in Optimierungen als Optimierungskriterium tolerierbar.
Максимальная просадка баланса в процентах. В процессе торговли баланс может испытать множество просадок, для каждой фиксируется относительное значение просадки в процентах. Возвращается наибольшее значение Максимальная...
Ich stimme dem zu, der ganze Rest muss aus den Klassen herausgerissen werden, um ihn in Ihr System einzufügen... es wäre besser, alles in separaten f-Fällen oder einem separaten includnik zu haben.
Nehmen Sie Ihre Equity-Berechnung (oder den von fxsaber vorgestellten Code) als Double-Array und fügen Sie es in die R^2-Berechnungsfunktion ein. Sie müssen nichts herausreißen, Sie müssen keine Klassen und CStrategy verwenden.
Ich verstehe nicht, wie R^2 negative Werte annehmen kann, wie im zweiten Diagramm gezeigt? Auch beim ersten Diagramm gibt es Fragen. Wenn die lineare Regression richtig konstruiert ist, sollte Pearson's LR eigentlich nicht negativ sein. In der Grafik ist sie es aber nicht. Wo liege ich falsch?
Ich hab's. Ich liege nirgends falsch, es ist nur so, dass die Graphen ein individuelles R^2 und LR haben - die Multiplikation mit -1 des realen Wertes tritt auf, wenn das letzte Element der Zahlenreihe kleiner ist als das erste. Es wäre gut, dies vor den Graphen zu erwähnen.
Es ist in dem Artikel versteckt:
Unser Skript berechnet sowohl die LR-Korrelation als auch R^2. Wir werden den Unterschied zwischen beiden etwas später sehen. Es gibt einen kleinen Zusatz zum Skript. Wir multiplizieren den resultierenden Korrelationskoeffizienten mit dem endgültigen Vorzeichen des synthetischen Graphen. Wenn das Ergebnis kleiner als Null ist, ist die Korrelation negativ, wenn sie größer ist, positiv. Auf diese Weise lassen sich negative Ergebnisse schnell und einfach von positiven trennen, ohne dass man auf andere Statistiken zurückgreifen muss. So funktioniert die LR-Korrelation in MetaTrader 5, und R^2 wird nach demselben Prinzip erstellt.
Vielleicht hätte ich an anderer Stelle und mehrmals darüber schreiben sollen.
Abbildung 19: LR-Korrelationsverteilung für 10.000 Random Walks
Abbildung 20: Verteilung von R^2 für 10.000 zufällige Spaziergänge
Ich verstehe nicht, wie R^2 die negativen Werte annehmen kann, die im zweiten Diagramm gezeigt werden? Ja, und es gibt Fragen zum ersten Diagramm. Wenn die lineare Regression korrekt dargestellt wird, sollte der Pearsonsche RQ (LR) nicht negativ sein. Aber in der Grafik ist er nicht negativ. Wo liege ich falsch?
Ich hab's. Ich liege nirgendwo falsch, es ist nur so, dass die Graphen benutzerdefinierte R^2 und LR haben - die Multiplikation mit -1 des realen Wertes tritt auf, wenn das letzte Element der numerischen Reihe kleiner ist als das erste. Es wäre gut, darüber zu schreiben, bevor die Graphen.
In diesem Papier wird die lineare Regression mit einem Fehler betrachtet - über CLinReg::LRLine.
Beweis
Ergebnis
Das Vorzeichen ist falsch. Alternative LR-Implementierung (CAlglib::LRBuild + CAlglib::LRUnpack) zählt korrekt:
Die Graphen der LR-Korrelations- und R^2-Verteilung für die 10.000 unabhängigen Beispiele, die in dem Artikel vorgestellt werden, zeigen, dass R^2 != LR^2 ist.
Ich verstehe nicht, warum der zweite Grad der ursprünglichen "konkaven" Verteilung sie "flach" macht?Hier wurde ich eines Besseren belehrt. Für mich ist die Aussage überhaupt nicht offensichtlich
Erstaunlich ist, dass wirdurch eine einfache mathematische Maßnahme (durch Erhöhen auf den zweiten Grad) die unerwünschten Randeffekte der Verteilung vollständig beseitigt haben.
Also habe ich beschlossen, dies experimentell mit Hilfe einer Animation zu bestätigen (und mich nicht auf mein Wort zu verlassen)
Es scheint so zu sein.
Abb. 21: R^2-Wert als benutzerdefiniertes Optimierungskriterium
Wo ist in MQL die LR-Korrelation, die auf dem Bild zu sehen ist? Oder werden dieser und viele andere Parameter nur für einzelne Läufe berechnet, so dass sie in ENUM_STATISTICS nicht vorhanden sind?
Wenn ja, schlagen sie vor, diesen Parameter aus den in diesem Artikel erwähnten vernünftigen Überlegungen zu berechnen: durch Eigenkapital ohne MM und quadriert.
ZЫ Ich habe gemessen, wie viel Zeit die Berechnung von GetCustomR für ein Array mit einer Million Werten (wie equity) in Anspruch nimmt - 2,5 Sekunden. Das ist eine Menge Zeit. Alles wird für die LR-Berechnung verwendet(CAlglib::LRBuild + CAlglib::LRUnpack). Aber manchmal ist gekrümmte LR durch CLinReg::LRLine um eine Größenordnung schneller. Wenn man es aufpeppt, wird es in Optimierungen als Optimierungskriterium tolerierbar.
Oh! Ich dachte immer, es wären 100. Danke, interessanter Artikel.
Ja, das ist eine Zahl, die mir in seriösen Büchern über R und Statistik begegnet ist. Aber leider konnte ich den Link nicht finden, tut mir leid.
Es ist auch üblich, Signifikanztests für den Regressionskoeffizienten durchzuführen. Sogar Alglib hat sie :-)
Offensichtlich sind die Tests für Normalverteilung. Wir haben eine Gleichverteilung.
PearsonCorrelationSignifikanz(), SpearmanRankCorrelationSignifikanz().
Danke für den Link, ich werde ihn mir merken.
ZY Falsche Aussage
R^2 ist nichts anderes als die Korrelation zwischen einer Grafik und ihrem linearen Modell
Ja, in der Tat, ein grober Fehler in der Formulierung. Ich bin überrascht, dass ich so etwas überhaupt geschrieben habe. Ich werde es korrigieren.
Wenn man sich all die anderen MQL-Codes ansieht, versteht man nicht, warum sie angegeben sind, denn sie sind ohne CStrategy-Kenntnisse völlig unlesbar
CStrategy wird nur zum Sammeln von Requisiten benötigt. Der Hauptcode ist, wie schon richtig bemerkt wurde, die eigentliche Berechnung von R2.
Der 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.
Schauen wir ihn uns an.
Ich stimme dem zu, der ganze Rest muss aus den Klassen herausgerissen werden, um ihn in Ihr System einzufügen... es wäre besser, alles in separaten f-Fällen oder einem separaten includnik zu haben.
Nehmen Sie Ihre Equity-Berechnung (oder den von fxsaber vorgestellten Code) als Double-Array und fügen Sie es in die R^2-Berechnungsfunktion ein. Sie müssen nichts herausreißen, Sie müssen keine Klassen und CStrategy verwenden.
Ich verstehe nicht, wie R^2 negative Werte annehmen kann, wie im zweiten Diagramm gezeigt? Auch beim ersten Diagramm gibt es Fragen. Wenn die lineare Regression richtig konstruiert ist, sollte Pearson's LR eigentlich nicht negativ sein. In der Grafik ist sie es aber nicht. Wo liege ich falsch?
Ich hab's. Ich liege nirgends falsch, es ist nur so, dass die Graphen ein individuelles R^2 und LR haben - die Multiplikation mit -1 des realen Wertes tritt auf, wenn das letzte Element der Zahlenreihe kleiner ist als das erste. Es wäre gut, dies vor den Graphen zu erwähnen.
Es ist in dem Artikel versteckt:
Unser Skript berechnet sowohl die LR-Korrelation als auch R^2. Wir werden den Unterschied zwischen beiden etwas später sehen. Es gibt einen kleinen Zusatz zum Skript. Wir multiplizieren den resultierenden Korrelationskoeffizienten mit dem endgültigen Vorzeichen des synthetischen Graphen. Wenn das Ergebnis kleiner als Null ist, ist die Korrelation negativ, wenn sie größer ist, positiv. Auf diese Weise lassen sich negative Ergebnisse schnell und einfach von positiven trennen, ohne dass man auf andere Statistiken zurückgreifen muss. So funktioniert die LR-Korrelation in MetaTrader 5, und R^2 wird nach demselben Prinzip erstellt.