ホンダ株価予測(LSTM + 特徴量強化)
✅ 今回の目標
- 株価 + 出来高 + 移動平均(MA7, MA14) をLSTMに入力
- 参照日数90日モデルで未来10日間を予測
- 結果をプロット・解釈
✅ 特徴量強化版コード(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) |
予測精度 |
不安定 |
長期的傾向に強く安定しやすい |
解釈可能性 |
低い |
高い(移動平均がトレンド補助) |
✅ 次のステップも可能です!
- 「ボリンジャーバンド」や「MACD」などテクニカル指標も追加
- 株価+日経平均・為替など外部要因も統合したマルチ入力モデル
- テストデータでMSE/RMSE評価 → 精度比較表の作成
ホンダ未来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日モデル(長期)")