私は現在、研究しており、株式市場の動きを予測する(非常に単純な)pythonスクリプトを改良しようとしています。lstmニューラルネットワークが異常に同じ値を出力
問題:私は同じ出力値を得ていますが、なぜこのチャートに近いと思われるのか分かりません(赤い線は得られるはずの予測で、青い線は真のデータです):
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import datetime
import math, time
import itertools
from sklearn import preprocessing
import datetime
from operator import itemgetter
from sklearn.metrics import mean_squared_error
from math import sqrt
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.recurrent import LSTM
def get_stock_data(stock_name, normalized=0):
url = 'http://chart.finance.yahoo.com/table.csv?s=%s&a=11&b=15&c=2011&d=29&e=10&f=2016&g=d&ignore=.csv' % stock_name
col_names = ['Date','Open','High','Low','Close','Volume','Adj Close']
stocks = pd.read_csv(url, header=0, names=col_names)
df = pd.DataFrame(stocks)
date_split = df['Date'].str.split('-').str
df['Year'], df['Month'], df['Day'] = date_split
df["Volume"] = df["Volume"]/10000
df.drop(df.columns[[0,3,5,6, 7,8,9]], axis=1, inplace=True)
return df
stock_name = 'GOOGL'
df = get_stock_data(stock_name,0)
df.head()
today = datetime.date.today()
file_name = stock_name+'_stock_%s.csv' % today
df.to_csv(file_name)
df['High'] = df['High']/100
df['Open'] = df['Open']/100
df['Close'] = df['Close']/100
df.head(5)
def load_data(stock, seq_len):
amount_of_features = len(stock.columns)
data = stock.as_matrix() #pd.DataFrame(stock)
sequence_length = seq_len + 1
result = []
for index in range(len(data) - sequence_length):
result.append(data[index: index + sequence_length])
result = np.array(result)
row = round(0.9 * result.shape[0])
train = result[:int(row), :]
x_train = train[:, :-1]
y_train = train[:, -1][:,-1]
x_test = result[int(row):, :-1]
y_test = result[int(row):, -1][:,-1]
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features))
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features))
return [x_train, y_train, x_test, y_test]
def build_model2(layers):
d = 0.2
model = Sequential()
model.add(LSTM(128, input_shape=(layers[1], layers[0]), return_sequences=True))
model.add(Dropout(d))
model.add(LSTM(64, input_shape=(layers[1], layers[0]), return_sequences=False))
model.add(Dropout(d))
model.add(Dense(16,init='uniform',activation='relu'))
model.add(Dense(1,init='uniform',activation='linear'))
model.compile(loss='mse',optimizer='adam',metrics=['accuracy'])
return model
window = 22
X_train, y_train, X_test, y_test = load_data(df[::-1], window)
print("X_train", X_train.shape)
print("y_train", y_train.shape)
print("X_test", X_test.shape)
print("y_test", y_test.shape)
model = build_model2([3,window,1])
model.fit(
X_train,
y_train,
batch_size=512,
nb_epoch=500,
validation_split=0.1,
verbose=1)
trainScore = model.evaluate(X_train, y_train, verbose=0)
print('Train Score: %.2f MSE (%.2f RMSE)' % (trainScore[0], math.sqrt(trainScore[0])))
testScore = model.evaluate(X_test, y_test, verbose=0)
print('Test Score: %.2f MSE (%.2f RMSE)' % (testScore[0],math.sqrt(testScore[0])))
# print(X_test[-1])
diff=[]
ratio=[]
p = model.predict(X_test)
for u in range(len(y_test)):
pr = p[u][0]
ratio.append((y_test[u]/pr)-1)
diff.append(abs(y_test[u]- pr))
#print(u, y_test[u], pr, (y_test[u]/pr)-1, abs(y_test[u]- pr))
import matplotlib.pyplot as plt2
plt2.plot(p,color='red', label='prediction')
plt2.plot(y_test,color='blue', label='y_test')
plt2.legend(loc='upper left')
plt2.show()
出力私は取得しています:ここで
https://i.stack.imgur.com/dvQvY.pngはコードであるhttps://i.stack.imgur.com/6TVRb.png
(私はすでにバッチサイズとエポックの数を変更しようとしました)
私は現在、(MacOSXのシエラに)使用しています:
のPython 3.6.0(デフォルト、2017年1月2日、午後06時14分29秒) [GCC 4.2.1互換性のあるアップルLLVM 8.0.0(clang- 800.0.42.1)] on darwin 詳細については、「著作権」、「クレジット」または「ライセンス()」と入力してください。 警告:使用中のTcl/Tk(8.5.9)のバージョンが不安定になることがあります。
前のコードで使用されるすべてのモジュールが最新のものである(2017年4月24日)
私はいくつかに関する情報を忘れてしまったことが、私に尋ねることを躊躇しないでください。
おかげ
リンクした元の画像を出力すると思われる原因は何ですか? – Grr
それは一度だけでしたし、少なくとも私はスクリプトが単純な直線(例えば、平均以下のもの)とは異なる何かを出力することを期待しています。私には問題があると思うのは、入力したデータの種類(リンゴストック、グーグルなど)に関係なく、出力は常に赤い直線です。私はニューラルネットワークを初めて使っているので、正直言って、何が期待される出力であるべきかは分かりません。それが正常な動作であれば、正しい動作を引き起こすものを見つける方法を知ることができます。 – Frank
平均= 0にデータを拡大しようとしましたか? – lz96