2017-04-24 11 views
1

私は現在、研究しており、株式市場の動きを予測する(非常に単純な)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日)

私はいくつかに関する情報を忘れてしまったことが、私に尋ねることを躊躇しないでください。

おかげ

+0

リンクした元の画像を出力すると思われる原因は何ですか? – Grr

+0

それは一度だけでしたし、少なくとも私はスクリプトが単純な直線(例えば、平均以下のもの)とは異なる何かを出力することを期待しています。私には問題があると思うのは、入力したデータの種類(リンゴストック、グーグルなど)に関係なく、出力は常に赤い直線です。私はニューラルネットワークを初めて使っているので、正直言って、何が期待される出力であるべきかは分かりません。それが正常な動作であれば、正しい動作を引き起こすものを見つける方法を知ることができます。 – Frank

+0

平均= 0にデータを拡大しようとしましたか? – lz96

答えて

0

変更nb_epoch=500 nb_epoch=2に、あなたはLSTMが正常に動作することを確認できます。

関連する問題