Es gibt viele Arten von technischen Indikatoren, die in der Marktanalyse verwendet werden. Grundsätzlich werden jedoch die letzten vier Werte als Eingabedaten verwendet, und einige Berechnungen werden durchgeführt und ausgegeben.
Wenn Sie also die Eingabe- und Ausgabedaten kennen, können Sie abschätzen, welche Art von Berechnung Sie durchführen? Wenn Sie das Berechnungsmodell kennen und nur die darin enthaltenen Parameter festlegen, gibt es verschiedene Methoden wie die Systemidentifikation und den Optimierungsalgorithmus.
Es wäre jedoch ein wenig schwierig, selbst das Berechnungsmodell abzuschätzen, aber wenn der aktuelle Trend zu künstlicher Intelligenz und tiefem Lernen "universell" ist, wird es möglich sein. Nein, wenn Sie nicht so viel tun können, sollten Sie sich nicht künstliche Intelligenz nennen.
Abgesehen davon habe ich diesmal mit TFlearn versucht, herauszufinden, ob ich die technischen Indikatoren lernen kann, die ich im Voraus kannte.
Der grundlegendste technische Indikator ist der gleitende Durchschnitt. Es ist ein einfacher linearer Prozess, Sie müssen also kein neuronales Netzwerk verwenden, aber es ist nicht zu einfach. Ich werde es von der wirklich einfachen versuchen.
Ich kann den Durchschnitt nicht mit einer Eingabe ermitteln, daher werde ich vorerst zwei verwenden. Ändern Sie jedoch die Gewichte auf 1/3 und 2/3.
Dies ist der sogenannte linear gewichtete gleitende Durchschnitt (LWMA) der Periode 2, der MT5 ist.
iMA(_Symbol, 0, 2, 0, MODE_LWMA, PRICE_CLOSE);
Sie kann mit der Funktion von berechnet werden. Das Folgende ist die Dateiausgabe mit den täglichen Daten von USDJPY in MT5-Programm.
Time,Open,High,Low,Close,Ind0
2015.01.02 00:00,120.416,120.74,119.805,120.458,120.257999999996
2015.01.05 00:00,120.531,120.646,119.371,119.631,119.906666666662
2015.01.06 00:00,119.285,119.504,118.05,118.363,118.785666666662
2015.01.07 00:00,118.587,119.647,118.504,119.249,118.953666666662
2015.01.08 00:00,119.314,119.961,119.157,119.652,119.517666666662
2015.01.09 00:00,119.727,119.876,118.415,118.509,118.889999999995
2015.01.12 00:00,118.315,119.315,118.098,118.346,118.400333333328
2015.01.13 00:00,118.363,118.849,117.534,117.925,118.065333333328
2015.01.14 00:00,117.89,117.937,116.067,117.335,117.531666666662
2015.01.15 00:00,117.257,117.941,116.151,116.165,116.554999999995
2015.01.16 00:00,116.183,117.764,115.849,117.541,117.082333333328
2015.01.19 00:00,117.426,117.78,116.919,117.557,117.551666666661
2015.01.20 00:00,117.654,118.866,117.64,118.766,118.362999999995
2015.01.21 00:00,118.67,118.759,117.179,117.956,118.225999999994
2015.01.22 00:00,117.917,118.665,117.245,118.469,118.297999999994
2015.01.23 00:00,118.633,118.813,117.534,117.754,117.992333333328
2015.01.26 00:00,117.634,118.497,117.263,118.447,118.215999999994
2015.01.27 00:00,118.413,118.657,117.334,117.861,118.056333333327
2015.01.28 00:00,117.746,118.262,117.249,117.536,117.644333333327
2015.01.29 00:00,117.489,118.486,117.385,118.257,118.016666666661
2015.01.30 00:00,118.336,118.459,117.296,117.542,117.780333333327
:
Lesen Sie die obige Datei und erstellen Sie Lehrerdaten. Die Datei enthält 4 Werte und Indexwerte, aber hier werden nur der Schlusskurs Close
und der Indexwert Ind0
verwendet.
Erstellen Sie ungefähr 200 Abtastwerte von Eingabedaten (in diesem Fall 2) in "X" und den Indexausgabewert in "Y".
import numpy as np
import pandas as pd
import tensorflow as tf
import tflearn
file = 'USDJPY.f16408.txt'
ohlc = pd.read_csv(file, index_col='Time', parse_dates=True)
close = ohlc.Close.values
ind0 = ohlc.Ind0.values
N = 2
X = np.empty((0,N))
Y = np.empty((0,1))
for i in range(200):
X = np.vstack((X, close[i:i+N]))
Y = np.vstack((Y, ind0[i+N-1:i+N]))
Dies ist die Definition des in TFlearn verwendeten Diagramms. Dieses Mal definieren wir jedoch das Diagramm, das linear mit der Eingabeebene verbunden ist, vorausgesetzt, es handelt sich um ein lineares Modell. Außerdem verwende ich keine Voreingenommenheit, also setze Bias = False
.
Für "Regression" waren die Standardergebnisse jedoch nicht sehr gut, daher habe ich die Lernrate so angepasst, dass sie mit der SGD-Methode allmählich abnimmt.
# Graph definition
layer_in = tflearn.input_data(shape=[None, N])
layer1 = tflearn.fully_connected(layer_in, 1, activation='linear', bias=False)
sgd = tflearn.optimizers.SGD(learning_rate=0.01, lr_decay=0.95, decay_step=100)
regression = tflearn.regression(layer1, optimizer=sgd, loss='mean_square')
Mit TFlearn ist das Lernen einfach zu schreiben. Lernen Sie bis zu 10.000 Generationen.
# Model training
m = tflearn.DNN(regression)
m.fit(X, Y, n_epoch=10000, snapshot_epoch=False, run_id='MAlearn')
Der Gewichtskoeffizient wird als Lernergebnis ausgegeben.
# Weights
print('\nweights')
for i in range(N):
print('W['+str(i)+'] =' ,m.get_weights(layer1.W)[i])
Das Folgende ist die Ausgabe des Lernergebnisses.
---------------------------------
Run id: MAlearn
Log directory: /tmp/tflearn_logs/
---------------------------------
Training samples: 200
Validation samples: 0
--
Training Step: 40000 | total loss: 0.61673
| SGD | epoch: 10000 | loss: 0.61673 -- iter: 200/200
--
weights
W[0] = [ 0.43885291]
W[1] = [ 0.56114811]
Die genauen Gewichte sind "W [0] = 0,3333", "W [1] = 0,6777", es sieht also nicht so aus, als würden Sie richtig lernen.
In diesem Beispiel bestand das Modell nur darin, die lineare Summe zweier Eingaben zu ermitteln. Wenn jedoch die Differenz zwischen den beiden Eingabedaten gering wäre, wäre der Fehler gering und das Lernen nicht erfolgreich. Daher habe ich dieses Mal versucht, nur die Lehrerdaten zu verwenden, wenn der Unterschied zwischen den beiden Daten 1 oder mehr beträgt.
N = 2
X = np.empty((0,N))
Y = np.empty((0,1))
for i in range(200):
if abs(close[i]-close[i+1]) >= 1.0:
X = np.vstack((X, close[i:i+N]))
Y = np.vstack((Y, ind0[i+N-1:i+N]))
Das Ergebnis.
---------------------------------
Run id: MAlearn
Log directory: /tmp/tflearn_logs/
---------------------------------
Training samples: 22
Validation samples: 0
--
Training Step: 10000 | total loss: 1.94699
| SGD | epoch: 10000 | loss: 1.94699 -- iter: 22/22
--
weights
W[0] = [ 0.33961287]
W[1] = [ 0.66053367]
Die Anzahl der Proben ist auf 22 gesunken, aber das Gewicht liegt näher am wahren Wert als zuvor.
Erstens dient das neuronale Netzwerk nicht der genauen numerischen Vorhersage, sondern der fairen Vorhersage.
Daher habe ich dieses Mal Gaußsches Rauschen mit einem Durchschnitt von 0 und einer Standardabweichung von 0,1 zum Indexwert als Lehrerdaten hinzugefügt.
N = 2
X = np.empty((0,N))
Y = np.empty((0,1))
for i in range(200):
if abs(close[i]-close[i+1]) >= 1.0:
X = np.vstack((X, close[i:i+N]))
noise = np.random.normal(0,0.1)
Y = np.vstack((Y, ind0[i+N-1:i+N]+noise))
Das Ergebnis.
---------------------------------
Run id: MAlearn
Log directory: /tmp/tflearn_logs/
---------------------------------
Training samples: 22
Validation samples: 0
--
Training Step: 10000 | total loss: 3.79990
| SGD | epoch: 10000 | loss: 3.79990 -- iter: 22/22
--
weights
W[0] = [ 0.32918188]
W[1] = [ 0.67114329]
Die Ergebnisse ändern sich jedes Mal geringfügig, aber Sie können sehen, dass Sie im Allgemeinen lernen. Der Vorteil des neuronalen Netzwerks besteht darin, dass es selbst bei Rauschen irgendwie vorhersagen kann.
Es ist möglich, 3 oder mehr Daten zu verarbeiten, indem das "N" im Code geändert wird, aber tatsächlich konnte der Gewichtskoeffizient nicht mit sehr guter Genauigkeit erhalten werden, wenn 3 oder mehr Eingaben vorhanden waren. Das Ergebnis wird weggelassen.
Es scheint also noch ein langer Weg zu sein, um einen technischen Index zu erlernen. Vorerst war es ein Artikel über die Vorbereitung.
Der Vorteil von TFlearn besteht darin, dass Sie schnell überprüfen können, ob Ihre Idee gut ist oder nicht.
Recommended Posts