特徴量と予測対象の選択
選択された機能:
- 始値
- 最高取引価格
- 最低価格
- ひっくり返す
選択した予測ターゲット:
- 終値
株価に影響を与える要因が多すぎるため、Kラインデータだけで将来の株価変動を予測することは基本的に不可能ですが、一定の関係性があるのはその日のデータのみであるため、特徴とターゲットの両方にその日のデータが選択されます。
データのダウンロード
データ処理速度を高速化するために、mariadbデータベース内のデータを事前にクエリし、フェザー形式のデータとして保存し、データのロードを高速化します。キーコードは次のとおりです。
def main_code_to_feather(): # カーソル、フィールド情報、合計行を取得 cur = conn.cursor() label = [fld[0] for fld in get_fieldinfo(cur)] # すべてのフィールド情報を取得 code = get_all_stock_code(cur) # すべての code_inedxを取得 コード内のコードの場合= 0 : print("Processing:", code_inedx, "/", len(codes)) code_inedx += 1 data = fetch_by_code(cur, code, None, None).fetchall() # データを取得します対応する株式 df = pd.DataFrame(data=data, columns=labels) # pd テーブルにデータを入れます df.drop(columns=["id"], inplace=True) # データベースには id フィールドがありませんつまり、 os.makedirs("data_by_code",exist_ok=True)to_feather(save_path) if __name__ == "__main__": save_path = os.path.join("data_by_code", code+") を削除します。フェザー") # ストックデータをフェザー形式のデータとして保存 df.to_feather(save_path) main_code_to_feather()
処理後、さまざまな株式のデータはさまざまなファイルに保存され、列名はデータベース内のフィールド名を維持します。データ分析のデータソースとして、銘柄コードsh600010のこの銘柄を選択しました。
ファイルからデータをロードするコードは次のとおりです。
df = pd.read_feather("data_by_code/sh600010.feather")
情報処理
株式データから始値、最高取引価格、最低取引価格、取引高を特徴として取り、終値を予測対象として取り、最後に日付を図面の横軸データとして取ります。キーコードは次のとおりです。
x_tmp = [] y_tmp = [] date_tmp = [] for row in range(df.shape[0]): today = df.loc[row] # その日の情報 x_tmp.append(tuple([ today["popen" ] / 1e1, today["phigh"] / 1e1, today["plow"] / 1e1, today["vol"] / 1e4, # 損失のオーバーフローを防ぐ ])) # 終値 y_tmp.append(today["pclose" ] / 1e1) # 損失オーバーフローを防ぐための y/10 # date date_tmp.append(today["deal_date"]) x = tf.constant(x_tmp, dtype=tf.float32) y = tf.constant(y_tmp, dtype=tf) .float32)
ここで、主要な指標は固定数で除算され、損失のオーバーフローによるモデルの最適化の失敗を防ぐことができます。
トレーニング セットとテスト セットを分割し、データの最後の 5% をテスト セットとして取得します。コードは以下のように表示されます。
data_size = len(x_data) test_size = int(data_size * 0.05) x_train = x_data[:data_size - test_size] y_train = y_data[:data_size - test_size] x_test = x_data[data_size - test_size:] y_test = y_data[data_size - test_size:] date_test = date_data[データサイズ - テストサイズ:]
モデルを選択してトレーニングする
私は線形モデルを選択し、トレーニングにその線形モデルを使用しました。トレーニング中のコード記述を簡素化するために tensorflow の keras ライブラリを使用しました。
model = keras.Sequential( [ layers.Dense(1, name="layer1"), # 出力サイズは 1、つまり線形回帰モデル ] ) model.compile( optimizer = optimizers.SGD(learning_rate=0.01) 、 損失 = 損失 .MeanSquaredError()、 ) 履歴 = model.fit(x_train、y_train、batch_size=256、epochs=128、validation_split=0.2)
モデルを使用して予測を行う
トレーニングされたモデルを使用してテスト データセットに対して予測を行います。
y_predict = model.predict(x_test) y_pred = [] for i in range(len(y_test)): y_pred.append(y_predict[i][0])
真の値と予測値をプロットする
matplotlib を使用して、横軸として日付、縦軸として終値 ÷ 10を使用してグラフを描画します。
plt.figure(figsize=(16, 8)) plt.plot(date_test, y_test, label="real") plt.plot(date_test, y_pred, label="predict")
予測結果の分析
予測結果に従って描画された関数イメージを図に示します。
画像からわかるように、予測値と実際の値の間には大きなギャップがあります。これは、株価に影響を与える要因が数多くあり、選択されたパラメーターを正確に予測することができないためです。
しかし同時に、予測結果が実際の値の傾向と類似していることもわかり、線形回帰モデルが終値と選択した特徴の関係をある程度説明できることを示しています。
完全なコードのダウンロード アドレス:
機械学習に基づく Python ベースの株価予測、株価予測ソース コード + データセット、機械学習の大仕事