質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1206閲覧

pythonのコードで日経平均を予測しようとしてますが、配列のところでわからないことがあります。

Yusuke_nomecchi

総合スコア17

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/03/31 13:47

編集2020/03/31 14:59

【背景】
この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の勉強不足なのは重々承知ですが、ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/03/31 13:52

リンクは「リンクの挿入」で記入してください。
meg_

2020/03/31 13:56

今日の予測値を含めて再度訓練すればどうでしょうか?(精度についてはどうか分かりませんが)
guest

回答1

0

自己解決

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/historical/nikkei_stock_average_daily_jp.csv 12 13data_file = 'nikkei_stock_average_daily_jp.csv' 14 15## 当日の株価を予測するために必要な過去の日数 16lookback = 30 17 18## エポック数 19epochs = 5000 20 21## 学習データ数 22learning_num = -750 23 24## データファイルを読み込む 25## データ日付を index に設定 26## 最終行はデータではないため、スキップ 27df = pd.read_csv(data_file, index_col=0, encoding='cp932', 28 skipfooter=1, engine='python') 29 30## 終値 31closing_price = df['終値'].values 32 33## 欠損値の確認 34print('欠損値の個数') 35print(df.isnull().sum(), '\n') 36 37## 基本統計量の確認(終値) 38print('終値の基本統計量') 39print(df['終値'].describe(), '\n') 40""" 41## 終値を時系列にプロット 42plt.title('日経平均株価(終値)の推移', fontname="MS Gothic") 43plt.plot(range(len(closing_price)), closing_price) 44plt.show() 45 46plt.title('日経平均株価(終値)の推移 過去300日分のみ', fontname="MS Gothic") 47plt.plot(range(len(closing_price[-300:])), closing_price[-300:]) 48plt.show() 49 50plt.title('日経平均株価(終値)の推移 過去30日分のみ', fontname="MS Gothic") 51plt.plot(df.index[-30:], closing_price[-30:]) 52plt.xticks(rotation=70) 53plt.show() 54""" 55## 訓練・検証・テスト用データを作成 56## 過去30日分の株価より当日の株価とする←ここが怪しい 57def data_split(data, start, end, lookback): 58 length = abs(start-end) 59 60 X = np.zeros((length, lookback)) 61 y = np.zeros((length, 1)) 62 for i in range(length): 63 j = start - lookback + i 64 k = j + lookback 65 66 X[i] = data[j:k] ##学習データ 67 y[i] = data[k] ##正データ 68 69 return X, y 70 71##次の日の株価予想としてZ[3日前~本日]を用意、それをモデルにぶち込むので、ますはZ[]を作る 72def data_split2(data, start, end, lookback): 73 length = abs(start-end) 74 75 X = np.zeros((length, lookback)) 76 y = np.zeros((length, 1)) 77 for i in range(length): 78 j = start - lookback + i + 1 79 k = j + lookback 80 81 X[i] = data[j:k] if k < 0 else data[j:] ##学習データ 82 83 return X, y 84 85 86## 訓練・検証・テスト用データ・未来データ 87(X_train, y_train) = data_split(closing_price, learning_num, lookback * -2, lookback) 88(X_valid, y_valid) = data_split(closing_price, lookback * -2, lookback * -1, lookback) 89(X_test, y_test) = data_split(closing_price, lookback * -1, 0, lookback) ##ここのデータセットにラスト4つの値をいれたい 90(X_today_predict, y_sample) = data_split2(closing_price, lookback * -1, 0, lookback) 91 92## 訓練 93model = Sequential() 94model.add(Dense(64, activation='relu', input_shape=(X_train.shape[-1],))) 95model.add(Dense(32, activation='relu')) 96model.add(Dense(1)) 97 98model.compile(optimizer=RMSprop(), loss='mae', metrics=['accuracy']) 99 100result = model.fit(X_train, y_train, 101 verbose=0, ## 詳細表示モード 102 epochs=epochs, 103 batch_size=64, 104 shuffle=True, 105 validation_data=(X_valid, y_valid)) 106 107## 訓練の損失値をプロット 108epochs = range(len(result.history['loss'])) 109plt.title('損失値(Loss)', fontname="MS Gothic") 110plt.plot(epochs, result.history['loss'], 'bo', alpha=0.6, marker='.', label='Training_loss', linewidth=1) 111plt.plot(epochs, result.history['val_loss'], 'r', alpha=0.6, label='Verification_loss', linewidth=1) 112plt.xlabel('Epoch') 113plt.ylabel('Loss') 114plt.legend() 115plt.grid(True) 116plt.ylim(0, 2000) 117plt.show() 118 119## 予測値 120df_predict = pd.DataFrame(model.predict(X_test), columns=['予測値']) ##テストデータをモデルにぶち込む 121df_predict2 = pd.DataFrame(model.predict(X_today_predict), columns=['予測値']) ##明日の日経平均用 122 123## 予測結果をプロット,df_predict['予測値'].values←これが予測値 124pre_date = df.index[-len(y_test):].values ##実際のデータ 125plt.title('実際の終値と予測値', fontname="MS Gothic") ##表題 126plt.plot(pre_date, y_test, 'b', alpha=0.6, marker='.', label='Real', linewidth=1) ##実際のデータプロット 127plt.plot(pre_date, df_predict['予測値'].values, 'r', alpha=0.6, marker='.', label='Predicted', linewidth=1) ##予測データプロット 128plt.xticks(rotation=70) 129plt.legend() 130plt.grid(True) 131plt.show() 132 133##print('今日の日経平均は:',y_test[lookback - 1]) 134print('明日の日経平均予測は:', df_predict2.values[len(df_predict2) - 1]) 135 136## RMSEの計算 137print('二乗平均平方根誤差(RMSE) : %.3f' % 138 np.sqrt(mean_squared_error(y_test, df_predict['予測値'].values))) 139

**##次の日の株価予想としてZ[3日前~本日]を用意、それをモデルにぶち込むので、ますはZ[]を作る
def data_split2(data, start, end, lookback):
length = abs(start-end)

X = np.zeros((length, lookback)) y = np.zeros((length, 1)) for i in range(length): j = start - lookback + i + 1 k = j + lookback X[i] = data[j:k] if k < 0 else data[j:] ##学習データ return X, y

**
(X_today_predict, y_sample) = data_split2(closing_price, lookback * -1, 0, lookback)

↑の関数と(X_today_predict, y_sample)という変数群を追記して、30日前から本日までのテストデータを作ることが出来まして、
結果、明日の日経平均予想を出力することが出来ました。
しかし、y_sampleをどう処理していいかわからん分かったため、空のデータが入っている意味のないものになっております。
というわけで、非常に汚いコードですが、目的は何とか達成しました。
きれいなコードを書くために、もっとpythonとNNについて勉強します。

投稿2020/04/05 15:12

Yusuke_nomecchi

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問