【背景】
このURLで公開されたコードを使って、pythonとニューラルネットワークの勉強をしようと思いました。
↓URL
https://qiita.com/shibata0523/items/655b82bbd3e46fc1c128
【自分の環境】
windows10
visual studio 2019 community
python 3
##やりたい事
下から5行目に今日の日経平均予想としてdf_predict.valuesの最後の配列要素を出力しましたが、やりたいことは明日の日経平均の値を出力することです。
(下記のファイルだと4/1の日経平均は何か)
どうすれば次の日の予測値を出力できるでしょうか。
下記のコードがURLに貼ってあったコードに自分でコメントつけてみたり、色々書き足したコードになります。
python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4from keras.models import Sequential 5from keras.layers import Dense 6from keras.optimizers import RMSprop 7from sklearn.metrics import mean_squared_error 8 9## 以下の URL より日経平均株価データ(日別)をダウンロードし、 10## このプログラムと同一階層に保存 11## https://indexes.nikkei.co.jp/nkave/index?type=download 12 13data_file = 'nikkei_stock_average_daily_jp.csv' 14 15## 当日の株価を予測するために必要な過去の日数 16lookback = 30 17 18## エポック数 19epochs = 4500 20 21## データファイルを読み込む 22## データ日付を index に設定 23## 最終行はデータではないため、スキップ 24df = pd.read_csv(data_file, index_col=0, encoding='cp932', 25 skipfooter=1, engine='python') 26 27## 終値 28closing_price = df['終値'].values 29 30## 欠損値の確認 31print('欠損値の個数') 32print(df.isnull().sum(), '\n') 33 34## 基本統計量の確認(終値) 35print('終値の基本統計量') 36print(df['終値'].describe(), '\n') 37""" 38## 終値を時系列にプロット 39plt.title('日経平均株価(終値)の推移', fontname="MS Gothic") 40plt.plot(range(len(closing_price)), closing_price) 41plt.show() 42 43plt.title('日経平均株価(終値)の推移 過去300日分のみ', fontname="MS Gothic") 44plt.plot(range(len(closing_price[-300:])), closing_price[-300:]) 45plt.show() 46 47plt.title('日経平均株価(終値)の推移 過去30日分のみ', fontname="MS Gothic") 48plt.plot(df.index[-30:], closing_price[-30:]) 49plt.xticks(rotation=70) 50plt.show() 51""" 52## 訓練・検証・テスト用データを作成 53## 過去30日分の株価より当日の株価とする←ここが怪しい 54def data_split(data, start, end, lookback): 55 length = abs(start-end) 56 print(length) 57 X = np.zeros((length, lookback)) 58 y = np.zeros((length, 1)) 59 60 for i in range(length): 61 j = start - lookback + i 62 k = j + lookback 63 64 X[i] = data[j:k] ##学習データ 65 y[i] = data[k] ##正データ 66 67 return X, y 68 69## 訓練・検証・テスト用データ 70(X_train, y_train) = data_split(closing_price, -450, -60, lookback) 71(X_valid, y_valid) = data_split(closing_price, -60, -30, lookback) 72(X_test, y_test) = data_split(closing_price, -30, 0, lookback) 73 74## 訓練 75model = Sequential() 76model.add(Dense(32, activation='relu', input_shape=(X_train.shape[-1],))) 77model.add(Dense(16, activation='relu')) 78model.add(Dense(1)) 79 80model.compile(optimizer=RMSprop(), loss='mae', metrics=['accuracy']) 81 82result = model.fit(X_train, y_train, 83 verbose=0, ## 詳細表示モード 84 epochs=epochs, 85 batch_size=64, 86 shuffle=True, 87 validation_data=(X_valid, y_valid)) 88 89## 訓練の損失値をプロット 90epochs = range(len(result.history['loss'])) 91plt.title('損失値(Loss)', fontname="MS Gothic") 92plt.plot(epochs, result.history['loss'], 'bo', alpha=0.6, marker='.', label='Training_loss', linewidth=1) 93plt.plot(epochs, result.history['val_loss'], 'r', alpha=0.6, label='Verification_loss', linewidth=1) 94plt.xlabel('Epoch') 95plt.ylabel('Loss') 96plt.legend() 97plt.grid(True) 98plt.ylim(0, 2000) 99plt.show() 100 101## 予測値 102df_predict = pd.DataFrame(model.predict(X_test), columns=['予測値']) ##テストデータをモデルにぶち込む 103 104## 予測結果をプロット,df_predict['予測値'].values←これが予測値 105pre_date = df.index[-len(y_test):].values ##実際のデータ 106plt.title('実際の終値と予測値', fontname="MS Gothic") ##表題 107plt.plot(pre_date, y_test, 'b', alpha=0.6, marker='.', label='Real', linewidth=1) ##実際のデータプロット 108plt.plot(pre_date, df_predict['予測値'].values, 'r', alpha=0.6, marker='.', label='Predicted', linewidth=1) ##予測データプロット 109plt.xticks(rotation=70) 110plt.legend() 111plt.grid(True) 112plt.show() 113 114print('今日の日経平均は:',y_test[len(y_test)-1]) 115print('今日の日経平均予測は:', df_predict.values[len(y_test)-1]) 116 117## RMSEの計算 118print('二乗平均平方根誤差(RMSE) : %.3f' % 119 np.sqrt(mean_squared_error(y_test, df_predict['予測値'].values))) 120
色々自分で試してみましたが、出来ませんでした。
pythonの勉強不足なのは重々承知ですが、ご回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー