Aus irgendeinem Grund sehe ich nicht, dass Leute so viel tun, deshalb werde ich versuchen, den Aktienkurs mithilfe von Deep Learning vorherzusagen. Sowohl Deep Learning als auch Python sind Anfänger. Über Bibliotheken, Implementierungsmethoden, Theorien usw. ist wenig bekannt. Wir warten auf Tsukkomi etc.
――Mit den Lagerdaten für mehrere Tage können Sie vorhersagen, ob der durchschnittliche Aktienkurs von Nikkei für den nächsten Tag „steigen“, „fallen“ oder „sich ändern“ wird. (Kategorie)
――Der Schlusskurs des nächsten Tages wird verwendet, um zu bestimmen, ob er „hoch“, „runter“ oder „unverändert“ war.
TensorFlow 0.7 Ubuntu 14.04 Python 2.7 AWS EC2 micro instance
Bereiten Sie so viele Nikkei-Durchschnittsdaten wie möglich vor. Dieses Mal habe ich die Daten von [Yahoo Finance] verwendet (http://stocks.finance.yahoo.co.jp/stocks/detail/?code=998407.o).
Der Nikkei-Durchschnitt ist ein Text. (Weil es mühsam ist, es jedes Mal zu holen) Dieses Mal werde ich mir die Daten für 10 Tage ansehen und den Aktienkurs für den nächsten Tag vorhersagen. Wenn der Schlusskurs am nächsten Tag 0,5% oder mehr vom Schlusskurs am Vortag beträgt, ist er "hoch", wenn er 0,5% oder weniger beträgt, ist er "runter", andernfalls ist er "unverändert". Der Grund für diese Zahl ist, dass diese drei nur etwa 33% sind.
if array_base[idx][3] > (array_base[idx+1][3] * (1.0+flg_range)):
y_flg_array.append([1., 0., 0.])
up += 1
elif array_base[idx][3] < (array_base[idx+1][3] * (1.0-flg_range)):
y_flg_array.append([0., 0., 1.])
down += 1
else:
y_flg_array.append([0., 1., 0.])
keep += 1
Das Verhältnis der Daten als Ganzes ist wie folgt. Erhöht: 33,9% Verringert: 32,7% Keine Veränderung: 33,4%
Der Code sieht so aus. Es ist ein kleines Spaghetti mit einer Kopie, aber es ist leicht zu sehen. (Ausrede)
def inference(x_ph, keep_prob):
with tf.name_scope('hidden1'):
weights = tf.Variable(tf.truncated_normal([data_num * 4, NUM_HIDDEN1]), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN1]), name='biases')
hidden1 = tf.nn.sigmoid(tf.matmul(x_ph, weights) + biases)
with tf.name_scope('hidden2'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN1, NUM_HIDDEN2]), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN2]), name='biases')
hidden2 = tf.nn.sigmoid(tf.matmul(hidden1, weights) + biases)
with tf.name_scope('hidden3'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN2, NUM_HIDDEN3]), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN3]), name='biases')
hidden3 = tf.nn.sigmoid(tf.matmul(hidden2, weights) + biases)
with tf.name_scope('hidden4'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN3, NUM_HIDDEN4]), name='weights')
biases = tf.Variable(tf.zeros([NUM_HIDDEN4]), name='biases')
hidden4 = tf.nn.sigmoid(tf.matmul(hidden3, weights) + biases)
#DropOut
dropout = tf.nn.dropout(hidden4, keep_prob)
with tf.name_scope('softmax'):
weights = tf.Variable(tf.truncated_normal([NUM_HIDDEN4, 3]), name='weights')
biases = tf.Variable(tf.zeros([3]), name='biases')
y = tf.nn.softmax(tf.matmul(dropout, weights) + biases)
return y
Ein Platzhalter, in dem x_ph die Aktienkursdaten bis zum Vortag enthält. Die Daten sind enthalten als [vor 1 Tag Schlusskurs, vor 1 Tag Eröffnungskurs, vor 1 Tag Hochpreis, vor 1 Tag Niedrigpreis, vor 2 Tagen Schlusskurs, ...]. Die Anzahl der versteckten Ebeneneinheiten beträgt 100, 50, 30, 10. Das heißt, es ist unten definiert.
# DEFINITION
NUM_HIDDEN1 = 100
NUM_HIDDEN2 = 50
NUM_HIDDEN3 = 30
NUM_HIDDEN4 = 10
Übrigens sind die Anzahl der Einheiten und die Anzahl der Schichten angemessen. Ist es nicht besser, mehr zu haben? Ich entschied mich mit der Absicht. Ich würde mich freuen, wenn Sie mir Richtlinien zur Bestimmung dieser Zahlen m (_ _) m mitteilen könnten
Die Optimierung verwendet ADAM. Ich kenne die Details nicht, aber meiner Erfahrung nach ist es schwieriger, davon abzuweichen als beim GradientDescentOptimizer.
def optimize(loss):
optimizer = tf.train.AdamOptimizer(learning_rate)
train_step = optimizer.minimize(loss)
return train_step
Das Training sieht wie folgt aus. Die Chargengröße beträgt 100. Wenn es zu groß ist, wird es Moos sein. (Unzureichender Speicher. Es ist in Ordnung, wenn Sie nicht stecken bleiben.)
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})
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)
Nach dem Training wie folgt bewerten. Es ist im Grunde eine Kopie aus dem Tutorial.
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}))
Wenn man sich das TensorBoard ansieht, sieht es so aus, als ob es wie folgt konvergiert hat.
Betrachtet man jedoch den Prozentsatz der richtigen Antworten,
0.3375
Eine schreckliche Niederlage. : Schrei: Wie oben erwähnt, beträgt die Wahrscheinlichkeit für jede Kategorie (hoch, runter, unverändert) etwa 33%, sodass das Ergebnis dem Erraten entspricht. (Lol)
In Bezug auf die Ursache dieses Fehlers sind die möglichen Ursachen wie folgt.
Ich habe verschiedene Dinge ausprobiert, indem ich die Anzahl der für die Eingabe verwendeten Tage, die Anzahl der ausgeblendeten Ebenen, die Anzahl der Einheiten, die Aktivierungsfunktion usw. geändert habe, aber es gab keine besondere Änderung in den Ergebnissen. : Schluchzen:
Ich bin nicht sehr vertraut mit Matrixberechnung oder Deep Learning, aber wenn ich die Gliederung verstehen kann, kann ich so etwas mit TensorFlow machen! : zufrieden:
Offizielles Tutorial Spielen, um den Rennwert vorherzusagen und mit TensorFlow aus dem Pokemon-Namen zu tippen [Deep Learning (professionelle Serie für maschinelles Lernen)](http://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-%E6 % A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 83% 97% E3% 83% AD% E3% 83% 95% E3% 82% A7% E3% 83 % 83% E3% 82% B7% E3% 83% A7% E3% 83% 8A% E3% 83% AB% E3% 82% B7% E3% 83% AA% E3% 83% BC% E3% 82% BA -% E5% B2% A1% E8% B0% B7-% E8% B2% B4% E4% B9% 8B / dp / 4061529021)
Recommended Posts