Fortsetzung von Letztes Mal. Es ist eine Geschichte, dass wir den Aktienkurs mit TensorFlow vorhersagen werden, einem Rahmen für tiefes Lernen. Das letzte Mal war es übrigens ein völliger Misserfolg. Letztes Mal kommentiert von tawago ["Google macht dasselbe"]( Ich habe die Informationen https://cloud.google.com/solutions/machine-learning-with-financial-time-series-data) erhalten, habe sie also kopiert und versucht, sie zu inspirieren.
Beim letzten Mal wurde "der Nikkei-Durchschnitt mehrere Tage lang verwendet, um vorherzusagen, ob der Nikkei-Durchschnitt für den nächsten Tag steigen, fallen oder sich nicht ändern wird (3 Auswahlmöglichkeiten)". In der Google-Demo "verwenden wir globale Aktienindizes im Wert von mehreren Tagen (Dow, Nikkei Average, FTSE100, DAX usw.), um vorherzusagen, ob S & P am nächsten Tag steigen oder fallen wird (2 Auswahlmöglichkeiten)." Es war der Inhalt. Im Folgenden sind die wichtigsten Änderungen gegenüber dem letzten Mal aufgeführt. ――Zwei Möglichkeiten von "hoch" und "runter"
Weitere Informationen zur Google-Demo finden Sie unter dieses Video. (Englisch)
TensorFlow 0.7 Ubuntu 14.04 Python 2.7 AWS EC2 micro instance
Es scheint, dass die Daten von der Website Quandl heruntergeladen werden können. Es gab jedoch ein Problem, dass die veröffentlichten Daten zu groß waren, um zu wissen, welche heruntergeladen werden sollten. Daher werde ich dieses Mal nur vier verwenden, Nikkei, Dow, Hong Kong Hansen und Deutschland. Ich habe ungefähr 8 in der Google-Demo verwendet.
Die abgelegten Daten werden in einer Tabelle zusammengefasst und als CSV gespeichert. Es gibt kein bestimmtes Skript. Ich habe es manuell mit der VLOOKUP-Funktion von Excel gemacht. Wenn Sie können, können Sie es in die Datenbank stellen und gut damit umgehen ...
Dieses Mal gibt es zwei Möglichkeiten: "Auf" oder "Ab". Das richtige Flag lautet also wie folgt.
if array_base[idx][3] > array_base[idx+1][3]:
y_flg_array.append([1., 0.])
up += 1
else:
y_flg_array.append([0., 1.])
down += 1
Als ganze Probe Zunahme: 50,6% Rückgang: 49,4% ist geworden.
Das Diagramm ahmt fast den Code von Google nach. Die Anzahl der ausgeblendeten Ebenen und die Anzahl der Einheiten befinden sich noch im Google-Code. Möglicherweise gab es keinen Ausfall.
NUM_HIDDEN1 = 50
NUM_HIDDEN2 = 25
def inference(x_ph, keep_prob):
with tf.name_scope('hidden1'):
weights = tf.Variable(tf.truncated_normal([data_num * price_num, NUM_HIDDEN1], stddev=stddev), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN1]), name='biases')
hidden1 = tf.nn.relu(tf.matmul(x_ph, weights) + biases)
with tf.name_scope('hidden2'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN1, NUM_HIDDEN2], stddev=stddev), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN2]), name='biases')
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
#DropOut
dropout = tf.nn.dropout(hidden2, keep_prob)
with tf.name_scope('softmax'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN2, 2], stddev=stddev), name='weights')
biases = tf.Variable(tf.zeros([2]), name='biases')
y = tf.nn.softmax(tf.matmul(dropout, weights) + biases)
return y
Der Verlust, den ich beim letzten Mal vergessen habe zu schreiben, ist wie folgt definiert. Es ist das gleiche wie beim letzten Mal, aber es ist das gleiche wie bei Google.
def loss(y, target):
return -tf.reduce_sum(target * tf.log(y))
Die Optimierung ist die gleiche wie beim letzten Mal.
def optimize(loss):
optimizer = tf.train.AdamOptimizer(learning_rate)
train_step = optimizer.minimize(loss)
return train_step
Kein Training ist wie beim letzten Mal.
def training(sess, train_step, loss, x_train_array, y_flg_train_array):
summary_op = tf.merge_all_summaries()
init = tf.initialize_all_variables()
sess.run(init)
summary_writer = tf.train.SummaryWriter(LOG_DIR, graph_def=sess.graph_def)
for i in range(int(len(x_train_array) / bach_size)):
batch_xs = getBachArray(x_train_array, i * bach_size, bach_size)
batch_ys = getBachArray(y_flg_train_array, i * bach_size, bach_size)
sess.run(train_step, feed_dict={x_ph: batch_xs, y_ph: batch_ys, keep_prob: 0.8})
ce = sess.run(loss, feed_dict={x_ph: batch_xs, y_ph: batch_ys, keep_prob: 1.0})
summary_str = sess.run(summary_op, feed_dict={x_ph: batch_xs, y_ph: batch_ys, keep_prob: 1.0})
summary_writer.add_summary(summary_str, i)
Die Bewertung ist die gleiche wie beim letzten Mal.
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_ph, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x_ph: x_test_array, y_ph: y_flg_test_array, keep_prob: 1.0}))
Infolgedessen ist die Genauigkeit
0.50295
** · · · Nein. ** **.
Als Eingabe habe ich den Aktienindex jedes Landes so verwendet, wie er ist, aber ich habe ihn ein wenig korrigiert. Ich entschied mich einzugeben, "wie stark der Aktienindex im Vergleich zum Vortag geschwankt hat". (Ich bin nicht sicher, aber es schien, als hätte Google das im Video getan.) Der Code sieht so aus. (Es kann schwer zu verstehen sein)
tmp_array = []
for j in xrange(idx+1, idx + data_num + 1):
for row, sprice in enumerate(array_base[j]):
tmp_array.append(sprice)
x_array.append(tmp_array)
Oben wie unten geändert.
tmp_array = []
for j in xrange(idx+1, idx + data_num + 1):
for k in range(price_num):
tmp_array.append(((array_base[j][k]) - (array_base[j+1][k])) / array_base[j][k] * 100)
x_array.append(tmp_array)
0.63185
Es scheint, dass es irgendwie eine bedeutungsvolle Zahl wurde. Mit 63% können wir vorhersagen, ob es steigen oder fallen wird. Man kann also sagen, dass wir bessere Ergebnisse erzielen als raten. Deshalb ist es ein Erfolg (^ _ ^;) Ich denke, dass die Genauigkeit in der Google-Demo etwa 72% betrug, aber ich denke, dass dies daran liegt, dass die Anzahl der hier verwendeten Aktienindizes gering ist.
»Ich bin froh, dass es vorerst so aussieht! ――TensorFlow enthält viele Teile, die nicht geändert werden müssen, z. B. Trainingsteile, auch wenn sich die Daten geringfügig ändern. Sobald Sie also eine Vorlage erstellt haben, ist die Codierung einfach. Wenn überhaupt, ist die Verarbeitung der Eingabedaten problematischer. ―― Aus den oben genannten Gründen ist es einfacher, die Zahlen so konstant wie möglich zu halten.
Wenn jemand eine Website kennt, auf der Sie 5, 15, 30 Minuten Austauschdaten herunterladen können, lassen Sie es mich bitte wissen. m (__) m
Recommended Posts