Beginnend mit "Die Prognose von Aktienkursen und Wechselkursen scheint interessant zu sein" und "Lesen wir einige Artikel", wenn Sie einige Artikel und akademische Materialien herunterladen und lesen, an denen Sie persönlich interessiert sein könnten Ich war beeindruckt, ein Material zu finden, das äußerst interessant erscheint. Wenn es dort endet, Dame. Ich hatte den Aktienkurs und die Umtauschdaten bis jetzt nicht berührt, weil ich versucht hatte, sie auf meine eigene Weise zu implementieren, nicht nur zu lesen, sondern die Daten zu erhalten und zu einem Formular zu machen.
Ziel: Für diejenigen, die die Grundlagen wie die vier Regeln der Programmierung, if-Anweisung und for-Anweisung verstehen und an der Analyse von Aktienkursen und Wechselkursen interessiert sind. Es ist so geschrieben, dass Erst- und Zweitklässler, die mit dem Programmieren an der Universität begonnen haben, es lesen können. Es ist nicht für Leute, die fortgeschrittenes Wissen haben und verschiedene Vorhersagen und Analysen machen können (ich kann nicht zuerst schreiben ... lol))
Überblick: Der Fluss der Clusterbildung über Dollar-Yen unter Verwendung der k-Medoids-Methode und das Finden der richtigen Antwortrate wird beschrieben.
Dieses Mal haben wir tägliche Daten von Dollar-Yen für die letzten 15 Jahre und stündliche Daten für die letzten 5 Jahre erfasst. Ich wusste nicht einmal, dass ich die Daten bekommen könnte, also nahm ich mir hier viel Zeit, aber ich entdeckte zufällig die Existenz von "oanda api" und schaffte es, sie zu erhalten, indem ich mich auf Qiita bezog, das zusammenfasst, wie man sie verwendet. Die erfassten täglichen Daten sehen folgendermaßen aus (siehe Abbildung unten). Das Excel fühlt sich intimer an.
Ich verweise auf Wie man eine große Menge vergangener Austauschdaten von der FX-API erhält (für maschinelles Lernen) Ich habe die Daten bekommen. Die Verwendung der API hat viel Zeit in Anspruch genommen. Hier sind die Schritte. Zunächst einmal ist oanda api eine API, die vom FX-Anbieter oanda bereitgestellt wird. Sie benötigen eine ID und einen Schlüssel, um es zu verwenden, und Sie müssen ein Demo-Konto für oanda eröffnen. "Oandas Homepage" https://www.oanda.jp Wählen Sie auf der Homepage "Neues Konto eröffnen" -> "Neues Demo-Konto eröffnen". Geben Sie verschiedene Informationen in das kostenlose Formular zur Eröffnung des Demokontos ein und geben Sie eine Demo-Konto-ID aus. Danach wird eine E-Mail mit der ID und dem Passwort an Sie gesendet. Melden Sie sich daher beim Demo-Konto an. In den Kontoinformationen im mittleren Teil der folgenden Abbildung befindet sich "Konto-ID". Geben Sie unter "API-Zugriff verwalten" unten rechts ein und erhalten Sie ein persönliches Zugriffstoken. Wenn Sie die AccountID und den AccessKey (PersonalAccessToken) erhalten können, können Sie die API verwenden.
Installieren Sie ein Paket namens oandapy
pip install git+https://github.com/oanda/oandapy.git
Erhalten Sie Austauschinformationen. Laden Sie die gewünschte Bibliothek und versuchen Sie, den aktuellen Dollar-Yen-Kurs zu ermitteln.
import pandas as pd
import oandapy
import configparser
import datetime
from datetime import datetime, timedelta
import pytz
account_id = "xxxxx"
access_key = "xxxxx"
#oanda API-Aufruf
oanda = oanda.API(access_token = access_key, environment = "practice")
#Holen Sie sich den Dollar-Yen-Kurs für die aktuelle Zeit
res = oanda.get_prices(instruments = "USD_JPY")
Ausgabeergebnis ↓ ↓ ↓ {'prices': [{'ask': 107.321, 'bid': 107.317, 'instrument': 'USD_JPY', 'time': '2020-03-05T06:12:23.365940Z'}]} Aufgrund des Einflusses des Koronavirus ist es von 112 Yen auf 107 Yen gesunken. Gehen Sie von nun an zu So erhalten Sie eine große Menge früherer Austauschdaten von der FX-API (für maschinelles Lernen). Es ist sehr leicht verständlich geschrieben. Lesen Sie daher diesen Artikel, um Daten für den gewünschten Zeitraum zu erhalten.
Führen Sie die Analyse gemäß den folgenden Schritten durch. Schritt 1: Bestimmen Sie den Prognosezeitraum, den Datenerfassungszeitraum und den Überprüfungszeitraum Schritt 2: Cluster der Datenerfassungsperiode Schritt 3: Handel des Überprüfungszeitraums im Prognosezeitraum Schritt 4: Fügen Sie die Daten des von Ihnen durchgeführten Transaktionszeitraums zum Datenerfassungszeitraum hinzu Schritt 5: Wenn der Überprüfungszeitraum nicht abgelaufen ist, kehren Sie zu Schritt 2 zurück und enden, wenn der Überprüfungszeitraum abgelaufen ist.
<img width = "600"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512508/db4b3cf1-8577-914c-fc19-7580deeab002.png ">
Jede Periode hat die folgende Bedeutung. Datenerfassungszeitraum: Zeitraum für die Bezugnahme auf vergangene Preisbewegungen (im Allgemeinen Trainingsdaten) Überprüfungszeitraum: Zeitraum für die Bewertung der korrekten Antwortrate (im Allgemeinen Testdaten) Prognosezeitraum: Was wird nächsten Monat, nächste Woche, morgen passieren? Vorhersagezeitraum (Wir haben drei Monate, Wochen und Tage vorbereitet)
Der Prognosezeitraum ist beispielsweise monatlich, der Datenerfassungszeitraum beträgt 156 Monate von 2003 bis Ende 2015 und der Überprüfungszeitraum beträgt 36 Monate von 2016 bis Ende 2018. (Wenn Sie ihn verstanden haben, ändern Sie einfach den Zeitraum.) In der Abbildung sieht es so aus. (Abbildung unten)
Wenden Sie die k-medoid-Methode auf den Datenerfassungszeitraum in Schritt 2 an. Das Bild lautet: "Wenn der Datenerfassungszeitraum in mehrere Muster unterteilt ist, welches Muster wird der erwartete Zeitraum sein?" Zuerst klassifizieren wir den Datenerfassungszeitraum in mehrere Muster. Da die Preisbewegungen des Charts grundsätzlich in drei Muster von Steigen, Nivellieren und Fallen unterteilt sind, klassifizieren wir sie hier in drei Klassen.
Hier finden Sie eine Zusammenfassung der Preisbewegungen für 156 Monate (siehe Abbildung unten).
Die Anzahl der Serien beträgt 156, und der Grund, warum die Anzahl der Elemente variiert, besteht darin, dass es Unterschiede gibt, z. B. Monate, die in 30 Tagen enden, Monate, die in 31 Tagen enden, und Februar. Außerdem werden an Feiertagen und Neujahr keine Devisen gehandelt, sodass die Anzahl der Elemente in jeder Serie zwischen 18 und 22 liegt.
Um die Eigenschaften jeder Reihe zu verstehen, teilen Sie jedes Element durch den Wert zu Beginn jeder Periode (Element [0]). Dann sieht es so aus (siehe Abbildung unten).
Als nächstes werde ich diese verwirrten Serien in drei klassifizieren. Aber die Frage hier ist, wie man klassifiziert? Ist es möglich, jede Form in Zeitreihen quantitativ zu bewerten? Ich dachte, aber es kann mit einer Messmethode namens DTW-Entfernung gelöst werden. Dies ist ein Wert, der zurückgegeben wird, wenn Sie die beiden zu vergleichenden Zeitreihen in die DTW-Funktion einfügen. Mit diesem Wert können Sie die einzelnen Zeitreihen quantitativ auswerten.
Zum Beispiel, wenn es eine Zeitreihe von A bis E gibt, wie unten gezeigt
Wenn Sie die Zeitreihen von A und B in die DTW-Funktion einfügen, ist dies 297. Die folgende Tabelle zeigt die DTW-Funktion für alle Kombinationen von A bis E. Der DTW-Abstand der nächsten Zeitreihen A und B beträgt 297, und der DTW-Abstand der am weitesten entfernten Zeitreihen D und E beträgt 2900. Sie können die als nah oder fern erkannten Informationen quantitativ auswerten, wenn Sie sich das Diagramm ansehen. ..
Der Algorithmus sieht folgendermaßen aus: Schritt 1: Erstellen Sie eine Kostenmatrix der Länge M x Länge N für die Differenz zwischen den Absolutwerten jedes Punkts. Schritt 2: Erstellen Sie eine M × N Dist-Matrix, $ Dist {(1, 1)} = Cost {(1,1)} $. Initialisieren Sie, indem Sie andere Elemente durch $ ∞ $ ersetzen. Schritt 3: Fügen Sie in der 1. Zeile und 1. Spalte der Dist-Matrix den Wert des vorherigen Werts und den Wert der Kostenmatrix an derselben Position hinzu. Schritt 4: Erstellen Sie eine Dist-Matrix gemäß der folgenden Formel.
Dist_{(i, j)} = Cost{(i, j)} + min(Dist{(i, j-1)}, Dist{(i-1, j)}, Dist{(i-1, j-1)})
Schritt 5: Sei $ Dist {(M, N)} $ der DTW-Abstand. Achten Sie zunächst auf die Zeitreihen von A und B und was passiert beim Messen der DTW-Entfernung? Wenn Sie eine Kostenmatrix erstellen, die die Differenz zwischen den Absolutwerten jedes Punkts aus Schritt 1 ermittelt, die Dist-Matrix aus Schritt 2 und Schritt 3 initialisieren und eine Dist-Matrix gemäß Schritt 4 erstellen, lautet das Ergebnis wie folgt. Ab Schritt 5 wird der DTW-Abstand zwischen den Zeitreihen A und B mit 297 berechnet. Das Folgende ist eine Funktion davon.
#dtw Funktion zum Ermitteln der Entfernung
def dtw(x, y):
#Erstellen Sie eine Distanzmatrix.
X, Y = np.meshgrid(x, y)
dist = abs(X-Y) #Euklidische Entfernung
#print(dist)
#Initialisierung der Matrix, die dtw berechnet
#Auf dem dtw-Algorithmus, dtw[-1][-1]Um zuerst darauf zu verweisen,Linie,Ursprüngliche Zeitreihenlänge für beide Spalten+Sichern Sie eine dtw-Matrix von 1
dtw = np.full((len(y) + 1, len(x) + 1), np.inf)
dtw[0, 0] = 0
for i in range(1, len(y) + 1):
for j in range(1, len(x) + 1):
dtw[i, j] = min(
dtw[i - 1, j],
dtw[i, j - 1],
dtw[i - 1, j - 1]) + dist[i - 1, j - 1]
return dtw[-1, -1]
Verwenden Sie die Funktion dtw, um eine dtw-Matrix zu erstellen, in der die dtw-Abstandswerte zwischen den einzelnen Zeitreihen gespeichert sind (die Tabelle, die alle obigen Kombinationen A bis E enthält).
def make_dtw_matrix(data):
dtw_matrix = [[0 for i in range(len(data))] for j in range(len(data))]
for i in range(0, len(data)):
for j in range(0, len(data)):
dtw_matrix[i][j] = dtw(data[i], data[j])
return dtw_matrix
Als nächstes werden wir schließlich das Clustering mit der k-Medoids-Methode durchführen. Die k-Medoids-Methode ist eine teilungsoptimierte Clustering-Methode ähnlich der k-means-Methode. Die Punkte, die die Summe der Abstände zu allen Punkten minimieren, werden als Basispunkte (Medoide) verwendet. Daher hat die k-Mittelwert-Methode den Nachteil, dass sie leicht von Abweichungswerten von der Berechnungsmethode des Schwerpunkts beeinflusst wird, aber k- Die Medoids-Methode hat den Vorteil, dass die Auswirkung von Ausreißern verringert wird, da eine der nicht klassifizierten Daten den Medoids zugeordnet ist (ich habe auf die k-means-Methode verwiesen, aber diesen Artikel, ohne es zu wissen. Kann gelesen werden, also ist es okay.)
Der Abstand zwischen Zeitreihen wird durch den DTW-Abstand quantifiziert, und die quantifizierte dtw-Matrix wird unter Verwendung der k-Medoiden-Methode klassifiziert.
In drei Klassen sieht es so aus (Abbildung unten). Irgendwie ist es in eine flache Klasse (53er Serie), eine fallende Klasse (66er Serie) und eine aufsteigende Klasse (37er Serie) unterteilt.
Der Algorithmus wird im nächsten Schritt fortgesetzt. Schritt 1: Wählen Sie zufällig Punkte für k Klassen aus. (Medoid) Schritt 2: Ordnen Sie jeden Punkt der nächsten Medoidklasse zu. Schritt 3: Machen Sie den Punkt, an dem der Gesamtabstand zu allen anderen Punkten in jeder Klasse als neues Medoid minimal ist. Schritt 4: Wenn es keine Änderung gibt, endet es und wenn es eine Änderung gibt, kehrt es zu Schritt 2 zurück. Der Code ist unten angegeben.
Was passiert beispielsweise, wenn wir die Zeitreihen A bis E in zwei Klassen einteilen? Ich werde das machen. Die dtw-Matrix ist eine symmetrische Matrix mit 5 × 5 Diagonalkomponenten 0 in der obigen Tabelle.
Wählen Sie zunächst in Schritt 1 zwei zufällige Serien aus. Wählen Sie hier die Serien A und B als Medoid aus. Entspricht initialize_medoids im Code. Ein Medoid ist dasjenige in der Klasse, das den Gesamtabstand zu allen Punkten in der Klasse minimiert. Diesmal haben wir also zwei Medoide. Die Medoide, die die Medoide speichern, sind Medoide = \ [A, B ](programmatisch Medoide = [0, 1]).
Schritt 2 Ordnen Sie jede Serie (A bis E) der nächsten Medoidklasse zu. Entspricht "assign_to_nearest" im Code. Hier wird die zugewiesene Klasse als Label bezeichnet, und da sie in zwei Klassen klassifiziert ist, bereiten wir zwei Labels vor, "0" und "1". Da wir noch nichts getan haben, jedes der aktuellen Die der Serie zugewiesene Bezeichnung lautet label = \ [?,?,?,?,? ](Bezeichnung = [∞, ∞, ∞, ∞, ∞] im Programm).
Mit Schwerpunkt auf der dtw-Matrix sind die für Medoid ausgewählten Reihen A und B. Das Medoid mit Label 0 ist jetzt Serie A, und das Medoid mit Label 1 ist jetzt Serie B. Wenn Sie sich ansehen, welchem Medoid jede Serie näher kommt, sehen Sie den roten Kreis unten.
Daher ist das Label, dem das Medoid zugeordnet ist, das jeder Serie am nächsten liegt, label = \ [0, 1, 0, 0, 1 ].
Schritt 3: Der Punkt, an dem der Gesamtabstand zu allen anderen Punkten in jeder Klasse minimiert wird, wird neu als medoid festgelegt. Entspricht update_medoids im Code. Konzentrieren Sie sich auf jede Serie in der Klasse, bereiten Sie einen Mindist vor, der den Wert speichert, der den Gesamtabstand von dieser Serie zu allen anderen Serien in der Klasse minimiert, und Medoide, die neue Medoide speichern. Es befindet sich im Zustand von Mindist = \ [?,? ], Medoids = \ [?,? ]. Welches Label ist dann A bis E zugeordnet? , Wie groß ist der Gesamtabstand zu anderen Etiketten? Lassen Sie uns die Serie mit dem geringsten Gesamtabstand zu anderen Labels zum neuen Medoid aktualisieren. Erste Serie A. Serie A entspricht der Bezeichnung 0, und andere Serien, die 0 zugewiesen sind, entsprechen dem roten Kreis unten, wenn die Werte aus Serie C und Serie D überprüft werden. Dtw-Matrix. Da 363 + 1388 = 1751, Mindist = \ [1751 ,? ], Medoids = \ [0,?]. Serie B. Serie B ist mit 1 gekennzeichnet, und die einzige andere Serie, die 1 zugewiesen ist, ist Serie E. Wenn Sie also den Wert aus der dtw-Matrix 1156 überprüfen. Daher ist mindist = \ [1751, 1156 ], medoids = \ [0, 1 ](bisher hat sich nichts geändert) Serie C. Serie C ist mit 0 gekennzeichnet, und die anderen Serien, die 0 zugewiesen sind, sind Serie A und Serie D. Wenn Sie also die Werte aus der dtw-Matrix überprüfen, beträgt die Summe 1447 (363 + 1084). Da dies kleiner als 1751 ist, aktualisieren Sie mindist = \ [1447, 1156 ], medoids = \ [2, 1 ]. Serie D hat die Bezeichnung 0, und wenn Sie die Werte aus der dtw-Matrix überprüfen, beträgt die Summe 2472, was durch ist, weil der Mindist nicht aktualisiert wird. Serie E überprüft den Wert aus der dtw-Matrix sowie der Bezeichnung 1 und aktualisiert den Mindist nicht, sodass er abgeschlossen ist.
Von oben wurde Medoid von \ [0, 1 ] auf \ [2, 1 ] aktualisiert. Ordnen Sie dieses neue Medoid dem Medoid zu, das jeder Serie am nächsten liegt, und verwenden Sie dabei das gleiche Verfahren wie in Schritt 2. Es kann in gute Gefühle unterteilt werden.
Ich denke, dass die Erklärung überflüssig und schwer zu verstehen ist, aber die k-Medoids-Methode besteht darin, das obige Verfahren zu wiederholen, bis das Medoid nicht aktualisiert und klassifiziert ist.
Unten finden Sie ein Programm der in Python geschriebenen k-medoids-Methode. (Ich habe es bisher geschrieben, aber es ist einfacher zu verwenden, da die Bibliothek vorbereitet ist ...)
#Algorithmus der kmedoids-Methode
def kmedoids(dtw_matrix, total_class_num):
medoids = initialize_medoids(dtw_matrix, total_class_num)
label = [0 for i in range(len(dtw_matrix))] #len(dtw_matrix)Enthält 0 der Länge von,Jetzt sind alle Zeitreihenbezeichnungen 0
for i in range(0, 100):
new_label = assign_to_nearest(dtw_matrix, medoids)
if new_label == label:
break
label = new_label
medoids = update_medoids(dtw_matrix, label, total_class_num)
return (label, medoids)
def update_medoids(dtw_matrix, label, total_class_num):
n = len(dtw_matrix)
mindists = [np.inf for i in range(total_class_num)] #Array mit inf für die Anzahl der Klassen. k=Wenn 3[inf, inf, inf]
medoids = [np.inf for i in range(total_class_num)]
for i in range(0, n):
ts_label = label[i]
dist_total = 0
for j in range(0, n):
if label[j] == ts_label:
dist_total += dtw_matrix[i][j]
if dist_total < mindists[ts_label]:
mindists[ts_label] = dist_total
medoids[ts_label] = i
return medoids
def assign_to_nearest(dtw_matrix, medoids):
total_class_num = len(medoids)
label = [0 for i in range(len(dtw_matrix))]
for i in range(0, len(dtw_matrix)):
mindist = np.inf
nearest = 0
for j in range(0, total_class_num):
if dtw_matrix[i][medoids[j]] < mindist:
mindist = dtw_matrix[i][medoids[j]]
nearest = j
label[i] = nearest
return label
def initialize_medoids(dtw_matrix, total_class_num):
medoids = list(range(len(dtw_matrix)))
return medoids[0:total_class_num]
Dann machen Sie einen Deal. Konzentrieren Sie sich unmittelbar vor der vorhergesagten Serie auf die Serie und überprüfen Sie, zu welcher Klasse die Serie gehört. Wenn mehr als die Hälfte der Serien in dieser Klasse steigt (fällt), sagen wir voraus, dass sie in Zukunft steigen (fallen) und eine Kauf- (Verkaufs-) Entscheidung treffen werden. Wenn es tatsächlich nur geringfügig ansteigt, wird es als Erfolg gewertet, und die vorhergesagte Periode wird in der Datenerfassungsperiode gespeichert und das Clustering wird erneut durchgeführt.
Im vorherigen Beispiel wird bei der Vorhersage von Januar 2016, dem ersten der Überprüfungsperiode (2016 bis Ende 2018), die klassifizierte Klasse der Serie von Dezember 2015 verwendet, bei der es sich um die vorherige Serie handelt. Bestätigung: Transaktion nach Klasse, nach dem Ende wird die Serie von Januar 2016 im Datenerfassungszeitraum gespeichert und erneut geclustert, und dann wird die Serie von Februar 2016 vorhergesagt. <img width = "600"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512508/db4b3cf1-8577-914c-fc19-7580deeab002.png ">
Auf diese Weise wurde die korrekte Antwortrate berechnet, indem verschiedene Datenerfassungs- und Überprüfungszeiträume festgelegt und der Vorhersagezeitraum geändert wurden.
Wenn Sie mit dem Schreiben des Codes fertig sind, können Sie reich werden, wenn Sie ihn genau analysieren können! Ich war aufgeregt. Aber es war nicht so süß. Die Ergebnisse sind wie folgt.
Die Anzahl der Klassen war auf 5 Muster von 3 bis 7 begrenzt (es änderte sich nicht viel, selbst wenn ich es erhöhte) und das Ergebnis wurde erhalten. Alle Ergebnisse haben eine korrekte Antwortrate von etwa 40 bis 50%, was etwas enttäuschend ist. Es gibt aber noch viel Raum für Verbesserungen.
Nachdem wir die Handelsmethode überprüft und zwei Hypothesen geprüft und umgesetzt hatten, konnten wir für jede Woche eine durchschnittliche korrekte Antwortrate von etwa 65% erreichen. Ich werde dies in einem anderen Artikel zusammenfassen.
Es ist sehr lang. In Fällen, in denen der Vorhersagezeitraum täglich ist, dauert die einmalige Ausführung etwa 100 Minuten. Ich wollte früher Ergebnisse erzielen. Ich verwende ein MacBook Air (Anfang 2015), einen 1,6-GHz-Dual-Core-Intel Core i5-Prozessor und 8 GB Speicher, den ich nicht angepasst habe, aber neulich einen neuen Computer gekauft habe.
Die technischen Daten sind CPU: Core i7-9850H (2,6 GHz, 6 Kerne), Speicher: 16 GB, NVIDIA GeForce MX150 (GPU).
Zusätzlich zu diesem Programm denke ich darüber nach, zu vergleichen, wie viel Zeitunterschied es gibt, wenn ein maschinelles Lernprogramm basierend auf Büchern usw. auf einem MacBook Air und einem mit GPU ausgestatteten Laptop ausgeführt wird.
・ So erhalten Sie eine große Menge früherer Austauschdaten von der FX-API (für maschinelles Lernen) ・ Aktienkursprognose unter Verwendung der Ähnlichkeit von Aktienkursschwankungsmustern ・ Anwendung der Marktprognose k-Medoids Clustering mit Indexing Dynamic Time Warping auf den Aktienmarkt unter Verwendung von Kursschwankungsmustern / _pdf) ・ Analyse des Wertpapier- / Börsen- / virtuellen Währungsmarktes nach Preisschwankungsmustern