Datenwissenschaft und maschinelles Lernen (Teil 04): Vorhersage des aktuellen Börsenkrachs
Einführung
In Teil 02 dieser Artikelserie haben wir ein einfaches logistisches Modell auf der Grundlage der Titanic-Daten erstellt. Heute werden wir ein logistisches Modell erstellen, das uns helfen könnte, den Börsencrash vorherzusagen.
In diesem Artikel werden wir eine nützliche Anwendung unserer logistischen Modelle vornehmen, indem wir ein Vorhersagemodell für den Börsencrash erstellen. Um unser Modell zu testen, werden wir die Testdaten des aktuellen Börsencrashs verwenden, der meines Erachtens für uns alle relevant sein wird.
Börsencrash
Ein Börsencrash ist ein starker und schneller Rückgang des Gesamtwerts des Marktes, wobei die Kurse in der Regel innerhalb weniger Tage um mehr als 10 % fallen. Berühmte Beispiele für große Börsencrashs sind der Schwarze Montag im Jahr 1987 und wegen der Immobilienblase im Jahr 2008. Ein Crash ist in der Regel auf das Platzen einer Kursblase zurückzuführen und entsteht durch einen massiven Ausverkauf, der eintritt, wenn ein Großteil der Börsenteilnehmer versucht, ihre Vermögenswerte gleichzeitig zu veräußern.
Bevor wir weiter in die Sache einsteigen, möchte ich einen Haftungsausschluss geben:
Dies ist keine Finanz- oder Handelsberatung. Hoffentlich glauben Sie nicht, dass ich Mr. Buffet oder Charlie Munger oder ein professioneller Börseninvestor sei, sondern nur ein Datenwissenschaftler, der einen Weg findet, wissenschaftliche Modelle mit dem Handel in Verbindung zu bringen. Nehmen Sie die Dinge in diesem Artikel bitte nicht ernst, da die meisten dieser Ansichten online und von verschiedenen vertrauenswürdigen Quellen gesammelt wurden mit Links im Referenzteil am Ende des Artikels. Recherchieren Sie, bevor Sie sich entscheiden, einen der in diesem Artikel diskutierten Ansätze für Ihre Handelsentscheidungen zu nutzen.
Jetzt, da wir das hinter uns gebracht haben, können wir weitermachen.
Sobald wir diese Faktoren verstehen, haben wir einen Ansatzpunkt, denn diese Faktoren können als Daten (unabhängige Variablen) für unser logistisches Modell verwendet werden.
Faktoren, die die Aktienkurse beeinflussen
Es gibt viele Faktoren, die den Aktienmarkt beeinflussen, die folgenden sind nur einige davon. Denken Sie daran, dass es nie einen eindeutigen Indikator dafür gab, wie sich die Märkte so verhalten, wie sie es tun, daher werde ich die folgenden Faktoren verwenden,
- Angebot und Nachfrage
- Unternehmensbezogene Faktoren
- Zinssätze
- Aktuelle Ereignisse
- Inflation
01: Angebot und Nachfrage
Es gibt viele Faktoren, die sich auf den Aktienmarkt auswirken, aber wenn man alles Äußere abstreift und sich den grundlegenden Faktor ansieht, ist es ganz einfach: Angebot und Nachfrage. Ein Ungleichgewicht zwischen Angebot und Nachfrage wird den Preis der Aktie steigen und fallen lassen.
Wenn Äpfel plötzlich knapp werden, stehen immer mehr Menschen Schlange, um sie zu kaufen, und der Preis für Äpfel wird sofort in die Höhe schnellen.
Ähnlich verhält es sich, wenn es dem Unternehmen gut geht und jeder Aktien desselben Unternehmens kaufen möchte, dann wird es einen Mangel an Aktien geben, der den Aktienkurs eines Unternehmens in die Höhe schießen lässt, und das Gegenteil ist der Fall, wenn es zu viele Aktien gibt, aber niemand sie kaufen möchte; in diesem Fall wird der Aktienkurs abstürzen.
Es ist unmöglich (könnte man sagen), alle Angebots- und Nachfragedaten zu erhalten, die wir in unserem Modell verwenden können, also werden wir diesen Faktor in unserem Datensatz zurücklassen, aber ich glaube, dass jeder, der in der Lage ist, diese Daten genau zu erhalten, dem heiligen Gral einen Schritt näher gekommen ist
02: Unternehmensbezogene Faktoren
Alles, was innerhalb des Unternehmens geschieht, wirkt sich direkt auf den Aktienkurs aus. Wenn das Unternehmen mit erfolgreichen neuen Produkten wächst und höheren Einnahmen, geringeren Schulden und einem größeren Zustrom von Investoren ausweist, dann wird der Kurs eines Unternehmens zwangsläufig steigen, weil jeder Aktien eines solchen Unternehmens kaufen möchte, das von einem Höhepunkt zum nächsten schreitet.
Wenn ein Unternehmen jedoch Verluste verzeichnet, Produktausfälle hat und die Verschuldung zunimmt, dann würde die Mehrheit der Aktionäre die Aktien des Unternehmens abstoßen wollen, was den Aktienkurs senken würde.
Ein gutes Beispiel, um diesen Punkt zu verdeutlichen, sind Netflix und Apple,
Wir haben gesehen, wie Netflix innerhalb der ersten 3 Monate des Jahres 2022 über 200.000 Abonnenten verloren hat, weil die Preise für einige der Mitglieder erhöht wurden, und viele andere Situationen, die innerhalb des Unternehmens auftraten und direkt zu einem Rückgang des Aktienkurses von Netflix führten
Apple hingegen ist seit langem ein erfolgreiches Unternehmen, was auf erfolgreiche, neue Produkte, eine gute Führung im Unternehmen und andere positive Situationen innerhalb des Unternehmens zurückzuführen ist, die in den letzten Jahren zu einem steigenden Aktienkurs geführt haben.
Um die Gesundheit des Unternehmens zu bestimmen, werden wir eine Kennzahl verwenden, die als Kurs-Gewinn-Verhältnis (KGV) bezeichnet wird
Kurs-Gewinn-Verhältnis
Kurs-Gewinn-Verhältnis zur Bewertung eines Unternehmens, das den aktuellen Aktienkurs im Verhältnis zum Gewinn pro Aktie (earnings per share, EPS) misst. Das Kurs-Gewinn-Verhältnis (KGV, engl. Price-To-Earnings ration, PE) kann als Indikator dafür dienen, wie gesund ein Unternehmen ist. So sehen die Charts auf Basis der Aktienkurse und des KGV für Apple und Netflix aus
APPLE:
Datenquelle: macrotrends.net
NETFLIX
Datenquelle: macrotrends.net
Es scheint, dass das KGV vierteljährlich in einem Jahr berechnet wird, also in diesem Fall scheint es, dass das alles war, was die kostenlosen Datenquellen bieten konnten. Ich vermute, dass es mehr bezahlte Quellen gibt. Da wir für unsere Berechnungen in unseren Modellen die gleiche Anzahl von Zeilen in allen Spalten unseres Datensatzes benötigen, um effektiv arbeiten zu können, könnten wir davon ausgehen, dass unsere Daten einige Lücken aufweisen. Das sind die Daten für APPLEL:
Wenn die Daten in jedem Quartal eines Jahres berechnet werden, dann werden wir für den Rest des Quartals die gleichen Daten verwenden, die bis zum nächsten Quartal vorberechnet wurden:
Die gleichen Maßnahmen werden für NETFLIXdurchgeführt .
03: Zinssätze
Die Vorgänge bei der Federal Reserve Bank wirken sich direkt auf die Aktienkurse aus, da die Zentralbanken die Zinssätze in regelmäßigen Abständen ändern, um die Wirtschaft zu stabilisieren. Ein höherer Zinssatz bedeutet natürlich, dass die Unternehmen mehr für Kredite zahlen müssen, was zu geringeren Gewinnen führt und den Aktienkurs senkt. Umgekehrt bedeutet ein niedrigerer Zinssatz, dass die Unternehmen sich Geld von den Banken zu wesentlich geringeren Kosten leihen können, wodurch sie Geld sparen und einen höheren Gewinn erzielen.
> Die US-Notenbank hat kürzlich die Zinsen erhöht, um die Nachfrage zu drosseln und die Unternehmen zu Preissenkungen zu zwingen, was letztlich zu einem Rückgang der Inflation führt.
Die Grafik des Leitzinses der Fed von 2010 bis heute sieht wie folgt aus:
04: Aktuelle Ereignisse
Niemand kann leugnen, dass die Covid-19-Pandemie Ende 2019 und 2020 einen sehr starken negativen Einfluss auf den Aktienmarkt hatte, ebenso wenig wie die Aufstände für Gleichberechtigung in den USA im selben Jahr.
Andere Ereignisse, die den Börsenkurs beeinflussen, sind Kriege und Terroranschläge.
All diese Ereignisse werden zu einem drastischen Rückgang der Aktienkurse führen und die Volatilität des Marktes beeinflussen.
Ich werde keine Daten zu diesem Faktor sammeln, denn es würde so viel Arbeit und weitere Modelle erfordern, um für diese Ereignisse zu trainieren, dass dies den Rahmen dessen sprengen würde, was wir in dieser Artikelserie bereits behandelt haben.
05: Inflation
Inflation ist der Rückgang der Kaufkraft einer bestimmten Währung im Laufe der Zeit. Eine quantitative Schätzung der Rate, mit der der Kaufkraftverlust eintritt, kann durch den Anstieg des durchschnittlichen Preisniveaus eines Warenkorbs ausgewählter Waren und Dienstleistungen in einer Volkswirtschaft über einen bestimmten Zeitraum wiedergegeben werden. Der Anstieg des allgemeinen Preisniveaus, der häufig als Prozentsatz ausgedrückt wird, bedeutet, dass man mit einer Währungseinheit effektiv weniger kaufen kann als in früheren Zeiträumen.
Lesen Sie hier mehr über Inflation https://www.investopedia.com/terms/i/inflation.asp
Im Grunde gibt es also zwei Arten von Inflation: Kerninflation und VPI (Verbraucherpreisindex, eng. CPI):
- Kern VPI - ist alles außer Energie- und Lebensmittelpreisen
- VPI - ist alles, was die Wirtschaft betrifft: Energie, Lebensmittelpreise, Bildung, Unterhaltung, usw. Alles, was im täglichen Leben der Menschen einer bestimmten Wirtschaft existiert.
Da die Inflation den Wert jedes verdienten Dollars verringert, kann es für den Markt schwierig sein, den aktuellen Wert der Unternehmen, aus denen sich die Marktindizes zusammensetzen, zu beurteilen. Darüber hinaus können sich höhere Preise für Materialien, Lagerbestände und Arbeitskräfte bei der Anpassung der Unternehmen auf die Erträge auswirken. Infolgedessen können die Aktienkurse schwanken, was zu Volatilität führt.
Die gute Nachricht ist, dass sich eine straffere Geldpolitik der Fed zwar negativ auf festverzinsliche Anlagen auswirken kann, aber Aktien in der Vergangenheit in solchen Zyklen oft gut abgeschnitten haben.
ein Blick auf die Grafik des US-VPI seit 1970.
Sammeln wir nun alle erforderlichen Daten und speichern sie in einer CSV-Datei.
Beginnend mit APPLE:
Erfassen der Daten
Die Daten, die wir für unsere CSV-Datei sammeln werden, sind Kern-VPI, VPI, Fed's Fund's Zinssätze, EPS und KGV stehen uns alle zur Verfügung.
In unserem Datensatz fehlt nur noch eine Angabe, und das ist unsere abhängige Variable. Aber wir haben nur die Rohwerte der Aktienkurse. Erstellen wir daher ein Skript, das uns sagen kann, ob es in einem bestimmten Monat einen Börsencrash gab oder nicht.
In CrashClassifyScript.mq5
void DetectCrash(double &prices[], int& out_binary[]) { double prev_high = prices[0]; ArrayResize(out_binary,ArraySize(prices)-1); //we reduce the size by one since we ignore the current we predict the previous one for (int i=1; i<ArraySize(prices); i++) { int prev = i-1; if (prices[i] >= prev_high) prev_high = prices[i]; //grab the highest price double percent_crash = ((prev_high - prices[i]) / prev_high) * 100.0; //convert crash to percentage printf("crash percentage %.2f high price %.4f curr price %.4f ", percent_crash,prev_high,prices[i]); //based on the definition of a crash; markets has to fall more than 10% percent if (percent_crash > 10) out_binary[prev] = 0; //downtrend (crash) else out_binary[prev] = 1; //uptrend (no crash ) } }
Wenn Sie auf den ersten prev_high achten, werden Sie feststellen, dass ich ihm in erster Linie den Wert des vorherigen Preises gegeben habe, weil ich die Werte von Apple vom 1. Dezember 2009 anstelle des 1. Januar 2010 kopiert habe. Ich wollte einen Abstand haben, um den Absturz bei der ersten Berechnung zu erkennen, und indem ich diesen Monat hinzufügte, wurde es möglich. Aber wir ignorieren diesen Monat in unserem Ausgabedatensatz, weil wir ihn nicht mehr brauchen, deshalb liegt der vorherige Index out_binary[prev] innen, was eigentlich i-1 bedeutet, weil wir mit dem Index 1 beginnen.
Hier ist die Ausgabe, wenn wir die das binäre Array drucken
CrashClassifyScript DATE 1/1/2010 TREND 1
CrashClassifyScript DATE 2/1/2010 TREND 1
.........
CrashClassifyScript DATE 4/1/2022 TREND 0
CrashClassifyScript DATE 5/1/2022 TREND 0
Wenn wir alle Datenspalten einer csv-Datei in hinzufügen, wird eine csv-Datei erstellt, die wie folgt aussieht:
GROSSARTIG, Jetzt ist alles fertig und wir können mit etwas mehr Code arbeiten.
Wir alle wissen, dass sich hinter den Kulissen unseres logistischen Modells ein linearer Regressionsalgorithmus verbirgt, und bevor wir Daten in einem linearen Modell verwenden können, müssen wir prüfen, ob sie mit der unabhängigen Variable korrelieren. Wir prüfen das, indem wir die Methode corrcoeff aufrufen, die ich unserer LinearRegression Library hinzugefügt habe, die ich im vorherigen erstellt habe.
Innerhalb von TestScript.mq5
m_lr = new CMatrixRegression; Print("Matrix multiple regression"); m_lr.Init(8,"2,4,5,6,7",file_name,",",0.7); m_lr.corrcoeff(); m_lr.MultipleMatLinearRegMain(); delete m_lr;
Das Ergebnis wird sicherlich sein:
Matrix-Mehrfachregression
TestScript Init, Anzahl der gewählten X-Spalten =5
TestScript "2" "4" "5" "6" "7"
TestScript Alle Daten Array-Größe 740 verbraucht 52 Byte im Speicher
TestScript Korrelationskoeffizienten
TestScript Unabhängige Var vs. Trend = 0.225
TestScript Unabhängige Var vs VPI = -0.079
TestScript Unabhängige Var vs Core VPI = -0.460
TestScript Unabhängige Var vs. EPS ($) = -0.743
TestScript Unabhängiger Var vs. KGV = -0,215
Es scheint, dass alle Daten, die ich gerade auf verschiedenen Plätzen gesammelt nicht mit dem Preis der Aktie korrelieren, trotz einer Menge Leute, die das online reklamieren, dass dies die Faktoren sind, die den Aktienmarkt beeinflussen. Ich verstehe, dass die Quellen vorweg einen Haftungsausschluss zeigen, dass es keinen klaren Indikator dafür gibt, wie die Märkte sich verhalten, aber die Zahlen eines linearen Modells zeigen eine ganz andere Geschichte, z.B. der VPI gegenüber dem Preis von Apple. Ich hatte hier eine sehr starke negative Korrelation erwartet, aber es scheint, dass die Korrelation zu schwach ist, um in einer linearen Regression verwendet zu werden, nur der Kern-VPI zeigt eine vielversprechende negative Korrelation von etwa -0,46 Die stärkste von allen ist der EPS (Gewinn pro Aktie), der eine negative Korrelation von etwa 0,743 zeigt, was zu -74,3% umgerechnet werden kann
Es ist sehr wichtig, die Daten in Python zu visualisieren und selbst zu sehen, ob wir etwas in den Zahlen übersehen haben oder ob unsere Berechnungen nicht gut gelaufen sind:
Ausgabe
Ich denke, bis zu diesem Punkt ist es sehr klar, dass es nicht viel starke Beziehung zwischen den meisten der Daten gibt, die wir gesammelt haben, lassen Sie uns unsere Daten filtern,
Wir werden nur die drei unabhängigen Variablen verwenden, um unser Modell zu erstellen, und zwar
- Kern-VPI (korreliert mit etwa -46% bei einer Hälfte)
- EPS (korreliert mit etwa -74,2% am besten mit allen Daten)
- Und schließlich der FED-Fonds-Satz (korreliert mit etwa -33%, am wenigsten. Ich würde dies nicht empfehlen, wenn Sie ein ernsthaftes Modell erstellen wollen )
Okay, jetzt initialisieren wir unsere Bibliothek nur mit den gewünschten Spalten:
log_reg.Init(file_name,delimiter,2,"3,5,6",0.7);
Für diejenigen, die die grundlegende Funktionsweise der logistischen Regression verpasst haben, sei auf diesen Artikel verwiesen.
Weitere Verbesserung der Bibliothek
//These should be called before the Init void FixMissingValues(string columns); void LabelEncoder(string columns, string members);
Logistische Modelle reagieren empfindlich auf fehlende Werte, und da es sich um ein klassifizierendes maschinelles Lernmodell handelt, behandelt es Null-Daten, die darauf hinweisen könnten, dass die Daten fehlen, als klassifizierte Klasse, es kann auch Nan-Werte und Zeichenketten als Null behandeln, je nachdem, wie wir die Dateien in MQL5 lesen, deshalb habe ich einige Verbesserungen an der Bibliothek vorgenommen.
Die Funktion zum Ersetzen der fehlenden Werte durch den Mittelwert und die Funktion zum Kodieren der Strings in Labels.
Diese Funktionen sollten vor der Init-Funktion aufgerufen werden.
Jetzt erbt unsere logistische Bibliothek die Komponenten unserer MatrixRegression-Bibliothek, die wir im vorherigen erstellt haben
class CLogisticRegression: protected CMatrixRegression
Kommen wir nun zum guten Teil und sehen, wie gut unser Modell ist,
Der Ausdruck ist:
Confusion Matrix [ 0 13 ] [ 0 31 ] Tested model accuracy =0.7045
Die Genauigkeit unseres Modells beträgt 70,45 % im Testdatensatz 😲 Mir verschlägt es hier die Sprache
Ich dachte, dass ich wegen des Datenrückstands, den ich früher hatte, nicht einmal die 50%-Marke erreichen konnte. Ich dachte, dass es an irgendeinem Punkt einen Fehler geben muss, bis ich dasselbe mit Python versuchte, um dasselbe Ergebnis zu erzielen.
B A M
Denken Sie daran, dass unsere abhängige Variable die Trendspalte ist, die wir mit unserem Skript zur Erkennung des Crashs zu Beginn dieses Artikels erfasst haben. Die Preisspalte wurde nur verwendet, um die Korrelationskoeffizienten für unsere linearen Modelle zu zeigen, da wir nicht die binären Werte 0 und 1 verwenden können, die den Trend nach unten bzw. nach oben anzeigen, um Korrelationen zu finden, sondern die realen Aktienkurse in diesem Fall
Konzentrieren wir uns jetzt auf NETFLIX
Hier sehen Sie, wie die Korrelationskoeffizienten für diesen Bruder aussehen,
Correlation Coefficients Independent Var Vs Trend = 0.071 Independent Var Vs rate (FEDs rate) = 0.310 Independent Var Vs CPI = 0.509 Independent Var Vs Core CPI = 0.607 Independent Var Vs EPS = 0.917 Independent Var Vs PE Ratio = -0.213
Es hat den Anschein, dass die meisten der unten besprochenen Faktoren einen positiven Einfluss auf NETFLIX haben, der einzige negative Faktor ist das Kurs-Gewinn-Verhältnis. Der stärkste Faktor ist der Gewinn pro Aktie mit einer Korrelation von etwa 92 % zum Aktienkurs, andere sind der Kern-VPI und der Verbraucherpreisindex:
- EPS
- Kern-VPI
- und VPI
Lassen Sie uns unsere Daten noch einmal visualisieren.
Auf NETFLIX sieht es viel besser aus als beim letzten Mal auf Apple.
Lange Rede kurzer Sinn:
log_reg = new CLogisticRegression(); Print("NETFLIX"); file_name = "Netflix Dataset.csv"; log_reg.Init(file_name,delimiter,2,"4,5,6",0.7); log_reg.LogisticRegressionMain(accuracy); printf("Tested model accuracy =%.4f",accuracy); delete log_reg;
Die Ausgabe:
FN 0 07:54:45.106 TestScript NETFLIX PN 0 07:54:45.108 TestScript ==== TRAINED LINEAR REGRESSION MODEL COEFFICIENTS ==== ED 0 07:54:45.108 TestScript [ RO 0 07:54:45.108 TestScript 1.43120 -0.05632 -0.54159 0.48957 EE 0 07:54:45.108 TestScript ] CQ 0 07:54:45.108 TestScript columns = 4 rows = 1 PH 0 07:54:45.108 TestScript ========= LINEAR REGRESSION MODEL TESTING STARTED ========= QP 0 07:54:45.108 TestScript Tested Linear Model R square is = -0.35263665822405277 GR 0 07:54:45.108 TestScript Confusion Matrix EE 0 07:54:45.108 TestScript [ 0 18 ] HN 0 07:54:45.108 TestScript [ 0 26 ] MJ 0 07:54:45.108 TestScript Tested model accuracy =0.5909
Trotz der Daten, die eine starke lineare Korrelation mit dem Aktienkurs aufwiesen, hat das Modell von NETFLIX eine um etwa 60% geringere Genauigkeit verglichen mit der Genauigkeit von APPLE mit 70%. Sie können selbst mit dem Rest des Datensatzes spielen und sehen, wie das Modell aussehen könnte.
Echtzeit-Börsentests
Um in der Lage zu sein, auf dem Live-Markt in unserem Expert Advisor zu testen, müssen wir einige Änderungen an unserer Hauptfunktion LogisticRegression vornehmen. Wir müssen die Funktion dazu bringen, die vorhergesagten Werte mit ihren jeweiligen Daten in einer CSV-Datei zu speichern, die wir im Strategietester verwenden werden, um die Signale darüber zu erhalten, wohin sich der Markt gemäß unserem Modell entwickeln wird.
So sammeln wir die Daten und speichern sie in einer csv-Datei:
WriteToCSV(TestPredicted,dates,"Predicted "+m_filename,m_delimiter);
Denken Sie daran, dass wir nur die Ergebnisse des Testdatensatzes sammeln.
Hier ist ein kurzer Überblick darüber, wie die Daten in einer csv-Datei gespeichert werden:
NETFLIX Predicted, date_time 1,8/1/2018 1,9/1/2018 1,10/1/2018 1,11/1/2018 1,12/1/2018 1,1/1/2019 APPLE Predicted, date_time 1,9/1/2018 1,10/1/2018 1,11/1/2018 1,12/1/2018 1,1/1/2019 1,2/1/2019
Wenn Sie auf den Teil der Matrix geachtet haben, werden Sie feststellen, dass unser Modell ein guter Prädiktor für den Aufwärtstrend ist, Der TP (true positive hatte eine große Anzahl aller Matrixzeilen in der Matrix).
Echtzeit-Aktienkurstest EA
Der erste Schritt bei der Erstellung unseres EA ist das Sammeln von Daten aus unserer CSV-Datei, aber vorher wollen wir unseren Strategietester wissen lassen, dass wir diese Datei beim Testen verwenden werden.
#property tester_file "Predicted Apple Dataset.csv"
Nun noch ein kurzer Überblick über die Funktionen, die ich kodiert habe und die ich in der Funktion aufgerufen habe.
GetColumnDatatoArray(1,Trend); GetColumnDatatoArray(2,dates);
Diese Funktionen sind sehr gebräuchlich, wir haben sie in unserer Bibliothek oft verwendet, grundsätzlich sammeln wir Daten aus der ersten Spalte und speichern sie in einem Trend[]-Array, der gleiche Prozess für das dates[]-Array.
Als Nächstes müssen wir die Zeit, die wir aus einer csv-Datei gesammelt haben, in ein Standard-Zeitformat umwandeln, das in MQL5verstanden werden kann.
ConvertTimeToStandard();
Hier ist der Inhalt dieser Funktion:
void ConvertTimeToStandard() { // A one time attempt to convert the date to yy.mm.dd ArrayResize(date_datetime,ArraySize(dates)); for (int i=0; i<ArraySize(dates); i++) { StringReplace(dates[i],"/","."); //replace comma with period in each and every date //Print(dates[i]); string mm_dd_yy[]; ushort sep = StringGetCharacter(".",0); StringSplit(dates[i],sep,mm_dd_yy); //separate month, day and year //Print("mm dd yy date format"); //ArrayPrint(mm_dd_yy); string year = mm_dd_yy[2]; string day = mm_dd_yy[1]; string month = mm_dd_yy[0]; dates[i] = year+"."+month+"."+day; //store to a yy.mm.dd format date_datetime[i] = StringToTime(dates[i]); //lastly convert the string datetime to an actual date and time } }
Das sind die Funktionen, die es meiner Meinung nach wert sind, erklärt zu werden, was in der Funktion Init() getan wurde.
Als Nächstes testen wir die Vorhersagen des Modells mit der Funktion , die die Säule unseres Expert Advisors darstellt:
datetime today[1]; int trend_signal = -1; //1 is buy signal 0 is sell signal CopyTime(Symbol(),PERIOD_D1,0,1,today); if (isNewBar()) for (int i=0; i<ArraySize(date_datetime); i++) { if (today[0] == date_datetime[i]) //train in that specific day only { if ((int)Trend[i] == 1) trend_signal = 1; else trend_signal = 0; // close all the existing positions since we are coming up with new data signals ClosePosByType(POSITION_TYPE_BUY); ClosePosByType(POSITION_TYPE_SELL); break; } if (MQLInfoInteger(MQL_TESTER) && today[0] > date_datetime[ArrayMaximum(date_datetime)]) { Print("we've run out of the testing data, Tester will be cancelled"); ExpertRemove(); } } //--- Time to trade MqlTick tick; SymbolInfoTick(Symbol(),tick); double ask = tick.ask , bid = tick.bid; //--- if (trend_signal == 1 && PositionCounter(POSITION_TYPE_BUY)<1) { m_trade.Buy(Lots,Symbol(),ask,0,0," Buy trade "); ClosePosByType(POSITION_TYPE_SELL); //if the model predicts a bullish market close all sell trades if available } if (trend_signal == 0 && PositionCounter(POSITION_TYPE_SELL)<1) { m_trade.Sell(Lots,Symbol(),bid,0,0,"Sell trade"); ClosePosByType(POSITION_TYPE_BUY); //vice versa if the model predicts bear market } }
Der Hauptgrund dafür, dass ich mich dafür entschieden habe, das Modell an diesem speziellen Tag zu trainieren und mit dem Ereignis NewBar (neuer Balken) zu trainieren, ist die Reduzierung der Kosten für das Testen unserer Anwendung. Um diese Kosten weiter zu reduzieren, habe ich auch die Bedingung hart kodiert, dass der Strategietester gestoppt werden soll, sobald wir keinen Testdatensatz mehr haben.
Das war's. Siehe den unten verlinkten vollständigen Code. Jetzt ist es an der Zeit, das Modell im Strategietester zu testen.
APPLE Testergebnisse
Grafik
Netflix andererseits, Testbericht
Testdiagramm
Wie Sie sehen können, hatte das Apple-Modell eine Genauigkeit von etwa 70 %, und es hat bisher ein gutes Vorhersagemodell mit einem schönen Diagramm auf dem Strategietester im Vergleich zu seinem Rivalen NETFLIX erstellt.
Die Quintessenz
Das Gute an logistischen Modellen ist, dass sie einfach zu konstruieren und zu trainieren sind und dennoch eine ziemlich gute Arbeit bei der Klassifizierung unserer Daten leisten, obwohl die Suche nach den Daten, die in unserem Modell zu finden sind, etwas ist, das nicht als selbstverständlich angesehen werden sollte, da es zu den wichtigsten Schritten gehört, die bei einem Fehler zu einem ineffizienten Modell führen könnten.
Sie können immer noch weitere Verbesserungen an unserer Bibliothek vornehmen und die Daten erneut sammeln, denn ich glaube immer noch, dass die Art und Weise, wie ich die Daten gesammelt und in das Crashclassify-Skript eingeordnet habe, kein effektiver Weg ist, um den Absturz zu beobachten, jedenfalls ist das zum Lesen.
Github-Repository für diesen Artikel hier verlinkt > https://github.com/MegaJoctan/LogisticRegression-MQL5-and-python.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/10983
- 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.