[PYTHON] Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt

Entwickle einen automatischen Handelsalgorithmus für KI-Börsen und verdiene Gappori ~ ~ ~

Es ist ein Traum, den jeder hat. (Vielleicht nur ich)

** Dieses Mal haben wir ein Klassifizierungsmodell erstellt, das vorhersagt, ob der Dollar-Yen-Kurs in einem zufälligen Wald steigen, fallen oder gleich bleiben wird. ** **.

Machen Sie zuerst eine Richtlinie

Auswahl des Regressionsmodells oder Klassifizierungsmodells → Machen wir es zu einem Klassifizierungsmodell

Warum haben Sie zunächst das Klassifizierungsmodell (dh die ternäre Klassifizierung, ob die Rate steigt, fällt oder gleich bleibt) anstelle des Regressionsmodells (dh des Modells, das die Rate mit Don Pisha schätzt) gewählt? Es gibt verschiedene Gründe.

・ Die Bewertung des Klassifizierungsmodells ist intuitiver als das Regressionsmodell (diesmal wurde die Verwirrungsmatrix berechnet). ・ Es gibt nur drei Aktionen, die Menschen tatsächlich in fx ausführen (kaufen, verkaufen, nichts tun). Ist das nicht gut für die Klassifizierung? ・ Zufälliger Wald Ich wollte ihn nur implementieren.

Deshalb habe ich mich für die Klassifizierungsvorhersage entschieden.

(Wenn Sie später darüber nachdenken, ist das Transaktionsvolumen auch im Transithandel wichtig. Da die spezifische Rate bei der Bestimmung des Transaktionsvolumens wichtig ist, frage ich mich, ob ein Regressionsmodell, das die Rate genau vorhersagen kann, besser war Ich frage mich. Ich werde es beim nächsten Mal erneut versuchen.)

Was tun mit der Feature-Menge? → Verwenden wir technische Indikatoren

Was soll ich mit dem Funktionsbetrag tun, wenn ich ein Ratenvorhersagemodell für fx einrichte? Wenn Sie dann darüber nachdenken, was Menschen tatsächlich verwenden, um Dollar und Yen zu kaufen und zu verkaufen, kann Ihnen die Menge an Funktionen in den Sinn kommen.

Die Analyse, die Menschen beim Handel mit FX durchführen, ist grob in technische Analyse und Fundamentalanalyse unterteilt. Die technische Analyse dient dazu, Preisbewegungen anhand sogenannter Charts vorherzusagen. Andererseits besteht die Fundamentalanalyse darin, Preisbewegungen aus Nachrichten und Weltgeschehen vorherzusagen.

Dieses Mal werden wir technische Analysen verwenden, die als Merkmal des maschinellen Lernens leicht zu integrieren sind. Der Grund für den einfachen Import liegt darin, dass sich die technische Analyse nur mit Zahlen befasst und einfach zu programmieren ist.

Auf der anderen Seite ist es schwierig, Grundlagen (wie z. B. Text Mining) zu integrieren, und Grundlagen werden häufig für den Kauf und Verkauf aus einer langfristigen Perspektive verwendet, sodass wir sie nicht verwenden.

Datensatz

Nachdem die Richtlinie festgelegt wurde, suchen wir nach einem Datensatz. Dieses Mal haben wir die täglichen Daten der letzten 20 Jahre unter investieren.com verwendet. Es können ca. 250 Tage (FX-Transaktionen nur an Wochentagen) x 20 Jahre bis 5000 Daten erfasst werden.

Implementierung! !! !!

1. Lesen Sie die CSV-Datei mit den Tarifinformationen

import pandas as pd
df = pd.read_csv("USD_JPY.csv")

2. Erstellung der Merkmalsmenge (erklärende Variable)

Wie oben erwähnt, verwenden wir diesmal den numerischen Wert der technischen Analyse als Merkmalsgröße. Insbesondere habe ich fünf der SMA5-, SMA20-, RSI14-, MACD- und Bollinger-Bänder (2σ) verwendet. Bitte googeln Sie für die detaillierten Funktionen der einzelnen technischen Indikatoren. ** Bei der Auswahl eines technischen Index, der als Merkmalsgröße verwendet werden soll, ist es jedoch wichtig, nicht statistisch zu analysieren, sondern Multico (multiple Co-Linearität) so weit wie möglich zu vermeiden, so technisch, dass nicht so viel wie möglich miteinander korreliert wird. Bitte wählen Sie einen Index. ** **.

Verwenden Sie für die Berechnung technischer Indikatoren eine Bibliothek namens talib, was äußerst praktisch ist. Der technische Index wird auf einmal berechnet.

Hier werden die technischen Werte wie für RSI und MACD verwendet, die Werte für SMA und Bollinger-Band jedoch nicht. (Selbst wenn der SMA-Wert 105 ist, ist er beispielsweise nicht als Merkmalsgröße geeignet, da nicht bekannt ist, ob der Wert von 105 so hoch oder niedrig ist.) Daher werden wir die Werte von SMA und Bollinger-Band durch den Wert von close dividieren, um sie in relative und vergleichbare Werte umzuwandeln, bevor wir sie als Merkmalsgrößen verwenden.

Ich denke, es gibt viele andere Möglichkeiten, dies zu tun. Probieren Sie also die aus, die Ihnen am besten gefallen!


import talib as ta
import numpy as np

#Verwenden Sie die Schlussrate für alle nachfolgenden Berechnungen
close = np.array(df["Schlusskurs"])

#Erstellen Sie einen leeren Datenrahmen, um die Features zu platzieren
df_feature = pd.DataFrame(index=range(len(df)),columns=["SMA5/current", "SMA20/current","RSI","MACD","BBANDS+2σ","BBANDS-2σ"])

#Im Folgenden wird der technische Index (in diesem Lernprogramm verwendete Merkmalsmenge) mit talib und df berechnet_Feature Feature

#Der einfache gleitende Durchschnitt verwendet das Verhältnis des einfachen gleitenden Durchschnittswerts zum Schlusskurs des Tages als Merkmalsgröße.
df_feature["SMA5/current"]= ta.SMA(close, timeperiod=5) / close
df_feature["SMA20/current"]= ta.SMA(close, timeperiod=20) / close

#RSI
df_feature["RSI"] = ta.RSI(close, timeperiod=14)

#MACD
df_feature["MACD"], _ , _= ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

#Bollinger Band
upper, middle, lower = ta.BBANDS(close, timeperiod=20, nbdevup=3, nbdevdn=3)
df_feature["BBANDS+2σ"] = upper / close
df_feature["BBANDS-2σ"] = lower / close

3. Erstellung von Lehrerdaten (Zielvariable)

Wie oben erwähnt, sind die Lehrerdaten für dieses Modell die drei Werte [hoch, runter und (fast) unverändert]. Daher werden Lehrerdaten unter Verwendung des oben angegebenen Verhältnisses in den von [investing.com] heruntergeladenen Daten (https://jp.investing.com/currencies/usd-jpy-historical-data) erstellt.

Die spezifischen Funktionen, die zum Erstellen verwendet werden, sind wie folgt.

def classify(x):
#Im Vergleich zum Vortag-0.2%Gruppe 0 wenn
    if x <= -0.2:
        return 0
#Im Vergleich zum Vortag ist 0.2%<x<0.2%Dann Gruppe 1
    elif -0.2 < x < 0.2:
        return 1
#Im Vergleich zum Vortag ist 0.2%Gruppe 2 oben
    elif 0.2 <= x:
        return 2

Warum haben Sie den Vortag durch -0,2% und 0,2% geteilt?

・ 100 (Yen / Dollar) x 0,002 = 0,2 (Yen / Dollar) = 20 Pips, und ich dachte, dass dieser Wert als Wert geeignet ist, um zu beurteilen, ob sich der Kurs bewegt. ** ・ Durch Aufteilung des Vortages in drei Gruppen von -0,2% und 0,2% werden die Daten fast vorerst vorliegen. (Abbildung unten) ** スクリーンショット 2020-07-29 22.20.33.png

Von links ist dies die Anzahl der Daten in Gruppe 0, Gruppe 1 und Gruppe 2. Es ist fast gleichmäßig aufgeteilt. Es ist sehr wichtig, eine zufällige Gesamtstruktur zu verwenden, damit die Klassen der Lehrerdaten gleichmäßig aufgeteilt werden. (Natürlich können Sie dies auch tun, wenn die Klassen nicht gleichmäßig verteilt sind, aber Sie müssen sie gewichten. Weitere Informationen finden Sie unter Dieser Artikel. .)

Beachten Sie die obigen Punkte und erstellen Sie Lehrerdaten.

df["Der Tag vor Verhältnis_float"] = df["Der Tag vor Verhältnis%"].apply(lambda x: float(x.replace("%", "")))

#Der Tag vor Verhältnis%Wie zu klassifizieren. Teilen Sie die Stichproben jeder Klasse so gleich wie möglich
def classify(x):
    if x <= -0.2:
        return 0
    elif -0.2 < x < 0.2:
        return 1
    elif 0.2 <= x:
        return 2
    

df["Der Tag vor Verhältnis_classified"] = df["Der Tag vor Verhältnis_float"].apply(lambda x: classify(x))

#Verschieben Sie die Daten, die Sie Lehrer werden möchten, um einen Tag (ich denke, Sie können es verstehen, wenn Sie über die Bedeutung nachdenken).
df_y = df["Der Tag vor Verhältnis_classified"].shift()

4. Funktionsmenge und Lehrerdaten vervollständigt!

Mach ein wenig Verarbeitung. Wenn Sie beispielsweise SMA5 zur Berechnung des Funktionsbetrags verwenden, lautet der Wert für die ersten 4 Tage NaN. (Da für die Berechnung des 5-Tage-Durchschnitts Daten im Wert von mindestens 5 Tagen erforderlich sind) Wie Sie sehen können, ist NaN am Anfang der Feature-Daten enthalten, daher werden wir es entfernen.

df_xy = pd.concat([df_feature, df_y], axis=1)
df_xy = df_xy.dropna(how="any")

Damit ist die Vorverarbeitung abgeschlossen. Da diesmal eine zufällige Gesamtstruktur verwendet wird, ist keine Normalisierung / Standardisierung erforderlich.

5. Modelllernen!

Alles was Sie tun müssen, ist zu lernen. Es könnte interessant sein, zu experimentieren, indem Sie die Parameter des zufälligen Waldes ändern ... Die Hyperparameter der zufälligen Gesamtstruktur sind in diesem Artikel leicht zu verstehen.

Auch die Hyperparameter wurden mit optuna optimiert. Beachten Sie bei der Verwendung von optuna, dass die Zielfunktion so eingestellt ist, dass sie das zurückgibt, was Sie minimieren möchten.

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import optuna

X_train, X_test, Y_train, Y_test = train_test_split(df_xy[["SMA5/current", "SMA20/current","RSI","MACD","BBANDS+2σ","BBANDS-2σ"]],df_xy["Der Tag vor Verhältnis_classified"], train_size=0.8)

def objective(trial):
    min_samples_split = trial.suggest_int("min_samples_split", 2,16)
    max_leaf_nodes = int(trial.suggest_discrete_uniform("max_leaf_nodes", 4,64,4))
    criterion = trial.suggest_categorical("criterion", ["gini", "entropy"])
    n_estimators = int(trial.suggest_discrete_uniform("n_estimators", 50,500,50))
    max_depth = trial.suggest_int("max_depth", 3,10)
    clf = RandomForestClassifier(random_state=1, n_estimators = n_estimators, max_leaf_nodes = max_leaf_nodes, max_depth=max_depth, max_features=None,criterion=criterion,min_samples_split=min_samples_split)
    clf.fit(X_train, Y_train)
    return 1 - accuracy_score(Y_test, clf.predict(X_test))

study = optuna.create_study()
study.optimize(objective, n_trials=100)

print(1-study.best_value)
print(study.best_params)

Die Genauigkeit bei der Optimierung der Hyperparameter beträgt

0.6335025380710659 Da es sich um eine Drei-Werte-Klassifizierung handelt, halte ich es für ein recht gutes Ergebnis. Es ist ungefähr doppelt so gut wie wenn Sie es zufällig auswählen.

Wenn die Preisbewegung mit einer Wahrscheinlichkeit von 60% vorhergesagt wird, ist der erwartete Wert positiv, selbst wenn Sie den Spread berücksichtigen!

Betrachten Sie eine Verwirrungsmatrix für die Klassifizierung mehrerer Klassen! スクリーンショット 2020-07-30 13.32.40.png

Um mit Fx einen Gewinn zu erzielen, ist es wünschenswert, dass das Verhältnis von ① und ⑨ hoch ist. Betrachtet man die Verwirrungsmatrix, so ist 1 + 9 = 48,9%, was fast der Hälfte entspricht. Was Sie am meisten vermeiden möchten, sind die Muster ③ und ⑦ (das Muster, von dem Sie vorhergesagt haben, dass es steigt, aber tatsächlich sinkt, und das Muster, von dem Sie vorhergesagt haben, dass es sinkt, aber tatsächlich steigt). Diese beiden sind ziemlich niedrige Werte von ③ + ⑦ = 7,3%.

** Aus den obigen Überlegungen können wir ersehen, dass das diesmal erlernte Modell rentabel sein kann. ** **.

Auch der Hyperparameter bei maximaler Genauigkeit ist

{'min_samples_split': 8,
 'max_leaf_nodes': 40.0,
 'criterion': 'entropy',
 'n_estimators': 310.0,
 'max_depth': 7}

war. Die Beziehung zwischen Hyperparametern und Genauigkeit ist wie folgt. スクリーンショット 2020-07-30 11.45.56.png

(* Beachten Sie, dass subjektiver_Wert = 1 - Genauigkeit! (Optuna-Spezifikationen))

Die hellere Farbe in der obigen Abbildung ist die höhere Genauigkeit. Sicherlich kann gelesen werden, dass max_depth ungefähr 7 ist, max_leaf_nodes ungefähr 30-40 ist und n_estimators ungefähr 300 ist.

Nachtrag: Weitere Experimente

Bisher haben wir drei Werte klassifiziert, aber lassen Sie uns sie in zwei Werte klassifizieren: Ratenerhöhung oder -abnahme.

Ändern Sie nur die 3. Klassifizierungsfunktion für die Erstellung von Lehrerdaten.

def classify(x):
    if x <= 0:
        return 0
    else:
        return 1

Wenn Sie ein Modell auf die gleiche Weise erstellen und die Hyperparameter mit optuna optimieren ...

accuracy=0.7766497461928934

** Ich bin auch sehr reich damit (weiße Augen)! ** **.

Auf diese Weise kann es interessant sein, nicht nur die Datenaufteilungsmethode zu ändern, sondern auch mit den verwendeten technischen Indikatoren zu spielen!

Recommended Posts

Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Inverse Analyse des maschinellen Lernmodells
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken ((1) Implementierung von Blackjack)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
Bewerten Sie die Genauigkeit des Lernmodells durch einen Kreuztest von scikit learn
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Algorithmus für maschinelles Lernen (Implementierung einer Klassifizierung mit mehreren Klassen)
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Bestimmen Sie die Authentizität von veröffentlichten Artikeln durch maschinelles Lernen (Google Prediction API).
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Kostenlose Version von DataRobot! ?? Einführung in "PyCaret", eine Bibliothek, die maschinelles Lernen automatisiert
Eine Geschichte über das Erreichen einer Wiederherstellungsrate von Pferderennen von über 100% durch maschinelles Lernen
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Erstellen eines Positionsschätzungsmodells für den Intelligenzwettbewerb menschlicher Wölfe mithilfe von maschinellem Lernen
[Maschinelles Lernen] Erstellen Sie ein Modell für maschinelles Lernen, indem Sie Transferlernen mit Ihrem eigenen Datensatz durchführen
Ein Modell, das die Gitarre mit fast.ai identifiziert
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Eine Menge von ganzen Zahlen, die ax + by = 1 erfüllen.
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Liste der Links, die Anfänger des maschinellen Lernens lernen
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Klassifizieren Sie Informationen zum maschinellen Lernen nach Themenmodellen
Verbesserung der Leistungsmetrik durch 2-Stufen-Lernmodell
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
Maschinelles Lernen eines jungen Ingenieurs Teil 2
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Implementierung eines Deep Learning-Modells zur Bilderkennung
Tiefes Lernen durch Implementierung (Segmentierung) ~ Implementierung von SegNet ~
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Ich habe "Lobe" ausprobiert, mit dem das von Microsoft veröffentlichte Modell des maschinellen Lernens problemlos trainiert werden kann.
Einfacher Code, der in Kaggles Titanic: Maschinelles Lernen aus Katastrophen eine Punktzahl von 0,81339 ergibt
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
[Python] Ein Programm, das die Anzahl der Täler zählt
Ich habe eine Twitter-App erstellt, die das Bild eines bestimmten Charakters auf der Twitter-Timeline durch Pytorch-Transfer-Lernen identifiziert und speichert
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Informationen zur Datenvorverarbeitung von Systemen, die maschinelles Lernen verwenden
Eindrücke vom Udacity Machine Learning Engineer Nano-Abschluss
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Python-Implementierung der Bayes'schen linearen Regressionsklasse
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Prognostizieren Sie das Geschlecht von Twitter-Nutzern durch maschinelles Lernen
Othello ~ Aus der dritten Zeile von "Implementation Deep Learning" (4) [Ende]
Verfahren zum Generieren und Speichern eines Lernmodells durch maschinelles Lernen, Erstellen eines API-Servers und Kommunizieren mit JSON über einen Browser
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras