[[434750]] Python 中国語コミュニティ (ID: python-china) LSTM ニューラルネットワーク長短期記憶 (LSTM) ニューラル ネットワークは、時系列に関連する重要なイベントの処理と予測に特に適したリカレント ニューラル ネットワーク (RNN) の一種です。文脈推論の例として次の文を取り上げます。 「私はフランスで育ったので、流暢なフランス語を話します。」 なぜなら、同じ文の冒頭に「フランス」という国名が出て、最後に「話す」という動作が出てくるからです。したがって、LSTM は、長期記憶と短期記憶の 2 つの重要な信号、「フランス」と「話す」から、「フランス語」というより可能性の高い結果を推測できます。 ローソク足チャートもこれに似ています。株価は時間の流れと重要なシグナルの出現に反応します。 - 価格が安定し、出来高が減少する統合レンジにおいて、出来高の突破とともに突然大きな赤いKが現れ、株価が上昇する可能性があることを示しています。
- ギャップの後にアイランド反転が発生し、株価が下落する可能性があることを示します。
- 数日連続で上昇した後、突然長い上ヒゲと下ヒゲを伴うクロスラインが現れ、株価が反転する可能性があることを示唆します。
LSTM が行う必要があるのは、一定期間内に K バーに重要なシグナル (ボリュームのある赤い K など) があるかどうかを調べ、将来の株価の傾向を予測することを学習することです。 LSTM株価予測の例このデータは、2013年初頭から2017年末までの鴻海(2317)の日々の始値、終値、最高値、最低値、取引量に基づいています。 まず、データを書き込んで pandas DataFrame に保存し、N/A が含まれる可能性のある行を削除します。 データの書き込み: - pandasをpdとしてインポートする
- foxconndf = pd .read_csv('./foxconn_2013-2017.csv', index_col = 0 )
- foxconndf.dropna( how = 'any' 、 inplace = True )
元のデータが均一な範囲を持たずに大きすぎたり小さすぎたりして、トレーニング中に LSTM が収束するのが困難になるのを防ぐために、最小-最大-ゼロ-1 の正規化法を使用してデータを修正します。 - sklearn インポート前処理から
- def normalize(df):
- newdf = df.copy()
- min_max_scaler =前処理.MinMaxScaler ()
- newdf['open'] = min_max_scaler.fit_transform(df.open.values.reshape(-1,1))
- newdf['low'] = min_max_scaler.fit_transform(df.low.values.reshape(-1,1))
- newdf['high'] = min_max_scaler.fit_transform(df.high.values.reshape(-1,1))
- newdf['volume'] = min_max_scaler.fit_transform(df.volume.values.reshape(-1,1))
- newdf['close'] = min_max_scaler.fit_transform(df.close.values.reshape(-1,1))
- 戻り値 newdf
- foxconndf_norm =正規化(foxconndf)
次に、データはトレーニング セットとテスト セットに分割され、各データの時間枠が定義されます。 - numpyをnpとしてインポートする
- データヘルパーの定義(df, 時間枠):
- # データディメンション: 始値、終値、最高値、最低値、取引量、5 次元
- number_features =長さ(df.列)
- # データフレームをNumPy配列に変換する
- データ値= df .as_matrix()
- 結果= []
- # 観察したいtime_frameが20日間の場合、検証の回答としてさらに1日を追加する必要があります
- for index in range( len(datavalue) - (time_frame+1) ): # 0番目のデータ値から最後のtime_frame+1まで実行します
- result.append(datavalue[index: index + (time_frame+1) ]) # time_frame+1のKバー値をインスタンスとして1つずつ取り出す
- 結果= np .array(結果)
- number_train = round (0.9 * result.shape[0]) # 結果の最初の90%のインスタンスをトレーニングデータとして取得します
- x_train = result [:int(number_train), :-1] # トレーニングデータでは、各time_frameの最後のデータを除くすべてのデータのみを特徴として取得します
- y_train = result [:int(number_train), -1][:,-1] # トレーニングデータでは、各time_frameの最後のデータの最後の値(終値)を答えとして取得します
- # テストデータ
- x_test =結果[int(number_train):, :-1]
- y_test =結果[int(number_train):, -1][:,-1]
- # データをより良く見せる
- x_train = np .reshape(x_train, (x_train.shape[0], x_train.shape[1], 特徴数))
- x_test = np .reshape(x_test, (x_test.shape[0], x_test.shape[1], 特徴数))
- [x_train, y_train, x_test, y_test] を返す
- # 20日間隔で株価を予測
- X_train、y_train、X_test、 y_test = data_helper (foxconndf_norm、20)
LSTM モデルとして Keras フレームワークを使用します。まず、前面に 256 個のニューロンを持つ 2 つの LSTM レイヤーを追加し、データのオーバーフィッティングを防ぐために Dropout レイヤーを追加します。最後に、ニューロン数の異なる 2 つの完全接続層を追加して、予測株価である 1 次元出力を取得します。 - keras.modelsからSequentialをインポートする
- keras.layers.core から Dense、Dropout、Activation をインポートします
- keras.layers.recurrent から LSTM をインポートします
- kerasをインポートする
- def build_model(入力長さ、入力寸法):
- d = 0.3
- モデル=シーケンシャル()
- model.add(LSTM(256, input_shape = (input_length, input_dim), return_sequences = True ))
- モデルを追加します(ドロップアウト(d))
- model.add(LSTM(256, input_shape = (input_length, input_dim), return_sequences = False ))
- モデルを追加します(ドロップアウト(d))
- model.add(Dense(16, kernel_initializer = "uniform" 、 activation = 'relu' ))
- model.add(Dense(1, kernel_initializer = "uniform" , activation = 'linear' ))
- model.compile(損失= 'mse' 、オプティマイザー= 'adam' 、メトリック= ['精度'])
- リターンモデル
- # 20日間、5次元
- モデル= build_model (20, 5)
LSTMモデルを構築した後、以前に編集したトレーニングデータセットを使用してモデルのトレーニングを開始します。LSTMモデルのトレーニング - # バッチには128個のインスタンスがあり、合計50回の反復が実行されます
- model.fit( X_train、 y_train、 batch_size = 128 、 epochs = 50 、 validation_split = 0.1 、 verbose = 1 )
一定期間のトレーニングを経ると、LSTM モデルを取得できます。次に、このモデルを使用してテスト データを予測し、予測値 (pred) と実際の株価 (y_test) を元の株価の範囲に戻します。 LSTMモデルは株価を予測し、価値を回復します - def denormalize(df, norm_value):
- 元の値= df ['close'].values.reshape(-1,1)
- ノルム値ノルム値= ノルム値.reshape(-1,1)
- min_max_scaler =前処理.MinMaxScaler ()
- min_max_scaler.fit_transform(元の値)
- denorm_value = min_max_scaler.inverse_transform (norm_value)
- denorm_value を返す
- # トレーニング済みのLSTMモデルを使用してテストデータセットを予測する
- 予測=モデル.予測(X_test)
- # 予測値と実際の株価を元の間隔値に戻す
- denorm_pred =非正規化(foxconndf,pred)
- denorm_ytest =非正規化(foxconndf,y_test)
LSTM株価予測結果 復元された値を実際の株価に対してプロットして、それがどのように機能するかを見てみましょう。 LSTM株価予測結果 - matplotlib.pyplot を plt としてインポートします。
- %matplotlib インライン
- plt.plot(denorm_pred、色= '赤' 、ラベル= '予測' )
- plt.plot(denorm_ytest、色= '青' 、ラベル= '答え' )
- plt.legend( loc = 'best' )
- plt.show()
下の図に示すように、青い線が実際の株価、赤い線が予測株価です。予想株価と実際の株価は全体的には似た傾向を示していますが、詳しく見ると、予想株価は実際の株価より数日遅れていることがわかります。 それでは、いくつかの設定を調整してみましょう。 - 時間枠の長さの調整
- Keras モデルにおける完全結合層の活性化と最適化の調整
- Keras モデルは、さまざまなニューラル ネットワーク (タイプ、順序、数) を使用して、batch_size 調整、epochs 調整などを組み合わせます。
上記のパラメータを少し調整すると、実際の株価に近い予測結果が得られます。 |