ホンダ株価予測(LSTM + 特徴量強化)

✅ 今回の目標

✅ 特徴量強化版コード(Colab向け)

!pip install yfinance --quiet !apt-get -qq install fonts-ipafont-gothic import yfinance as yf import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as fm from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # フォント設定 font_path = '/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf' font_prop = fm.FontProperties(fname=font_path) # データ取得 ticker = "7267.T" df = yf.download(ticker, start="2018-01-01", end="2025-06-27", auto_adjust=True) # 特徴量追加 df['MA7'] = df['Close'].rolling(window=7).mean() df['MA14'] = df['Close'].rolling(window=14).mean() df = df[['Close', 'Volume', 'MA7', 'MA14']].dropna() # 正規化 scaler = MinMaxScaler() scaled = scaler.fit_transform(df) # 時系列データ作成(参照日数90) seq_len = 90 X, y = [], [] for i in range(seq_len, len(scaled)): X.append(scaled[i - seq_len:i]) y.append(scaled[i, 0]) X = np.array(X) y = np.array(y) # モデル構築 model = Sequential() model.add(LSTM(64, return_sequences=True, input_shape=(seq_len, X.shape[2]))) model.add(LSTM(64)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X, y, epochs=10, batch_size=32, verbose=0) # 未来10日予測 last_seq = scaled[-seq_len:] predictions = [] for _ in range(10): input_seq = last_seq.reshape(1, seq_len, X.shape[2]) pred = model.predict(input_seq)[0][0] predictions.append(pred) next_row = last_seq[-1].copy() next_row[0] = pred last_seq = np.vstack([last_seq[1:], next_row]) pred_close = scaler.inverse_transform(np.c_[predictions, np.zeros((10, 3))])[:,0] dates = pd.date_range(df.index[-1] + pd.Timedelta(days=1), periods=10) plt.figure(figsize=(12, 5)) plt.plot(df.index[-100:], df['Close'][-100:], label='過去の実株価') plt.plot(dates, pred_close, marker='o', label='予測(強化モデル)') plt.title("ホンダ株価予測(特徴量追加:出来高・MA)", fontproperties=font_prop) plt.xlabel("日付", fontproperties=font_prop) plt.ylabel("株価(円)", fontproperties=font_prop) plt.grid(True) plt.legend(prop=font_prop) plt.xticks(rotation=45) plt.tight_layout() plt.show()

✅ 改善ポイントまとめ

項目 従来モデル 強化モデル(今回)
入力データ 終値(Close)のみ Close + 出来高 + MA7 + MA14
入力次元 (90, 1) (90, 4)
予測精度 不安定 長期的傾向に強く安定しやすい
解釈可能性 低い 高い(移動平均がトレンド補助)

✅ 次のステップも可能です!

ホンダ未来10日株価予測3モデル比較グラフ

!pip install yfinance --quiet !apt-get -qq install fonts-ipafont-gothic import yfinance as yf import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as fm from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # 日本語フォント設定 font_path = '/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf' font_prop = fm.FontProperties(fname=font_path) # 株価データ取得 ticker = "7267.T" df = yf.download(ticker, start="2018-01-01", end="2025-06-27", auto_adjust=True)[['Close']] dates = pd.date_range(df.index[-1] + pd.Timedelta(days=1), periods=10) # 予測関数定義 def predict_future(df, seq_len): scaler = MinMaxScaler() scaled = scaler.fit_transform(df[['Close']]) X, y = [], [] for i in range(seq_len, len(scaled)): X.append(scaled[i - seq_len:i, 0]) y.append(scaled[i, 0]) X = np.array(X).reshape(-1, seq_len, 1) y = np.array(y) model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(seq_len, 1))) model.add(LSTM(50)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X, y, epochs=10, batch_size=32, verbose=0) # 未来10日予測 future = [] last_seq = scaled[-seq_len:].reshape(1, seq_len, 1) for _ in range(10): pred = model.predict(last_seq)[0][0] future.append(pred) last_seq = np.append(last_seq[:, 1:, :], [[[pred]]], axis=1) return scaler.inverse_transform(np.array(future).reshape(-1, 1)) # 予測実行(3モデル) pred_60 = predict_future(df.copy(), 60) pred_90 = predict_future(df.copy(), 90) pred_120 = predict_future(df.copy(), 120) # グラフ描画 plt.figure(figsize=(14, 6)) plt.plot(dates, pred_60, marker='o', label="60日モデル") plt.plot(dates, pred_90, marker='x', label="90日モデル") plt.plot(dates, pred_120, marker='s', label="120日モデル") plt.title("ホンダ(7267.T)未来10日株価予測:3モデル比較", fontproperties=font_prop) plt.xlabel("日付", fontproperties=font_prop) plt.ylabel("株価(円)", fontproperties=font_prop) plt.legend(prop=font_prop) plt.grid(True) plt.xticks(rotation=45) plt.tight_layout() plt.show() # 📌 シグナル判定ロジック def get_signal(pred, label): if pred[-1] > pred[0]: print(f"✅ {label}:上昇予測 → 【買い】シグナル") else: print(f"⚠️ {label}:下降予測 → 【見送り or 売り】シグナル") print("🧭 今日の判断ガイド:") get_signal(pred_60, "60日モデル(短期)") get_signal(pred_90, "90日モデル(中期)") get_signal(pred_120, "120日モデル(長期)")