【AI実装シリーズ2 ARIMAモデル】株価を分析してみたい

AI検証

前回の続き

 前回はARモデルで株価を分析しました。しかし精度が悪く、株価分析には適していなさそう。
といのことで、今回はARIMAモデルで試してみます。
早速ローカルLLM(Qwen3.6:27B)にお願いしました

実装

 チャットの続きで、ARIMAモデルを作ってもらうように指示(というか、指示の候補が出てきてくれて、選択するだけでしたwローカルLLMのアプリ側も進化していますねー)

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg      # 先ほどの AR モデル用
from statsmodels.tsa.arima.model import ARIMA    # 追加:ARIMA モデル用

# --- 1. データの取得 (過去 5 年分) ---
start_date = "2019-01-01" 
df = yf.download("6758.T", start=start_date, end=None) 
series = df['Close']

# --- 2. データを「学習用」と「テスト用」に分割 (直近 2 年間を表示) ---
test_days = 480 # 約 2 年間
train_data = series[:-test_days] 
test_data = series[-test_days:]

# --- 3. モデル A (lags=5) と B (lags=20) の学習・予測 (復習) ---
model_a = AutoReg(train_data, lags=5) 
fitted_model_a = model_a.fit()
forecast_a = fitted_model_a.predict(start=len(train_data), end=len(series)-1)

model_b = AutoReg(train_data, lags=20) 
fitted_model_b = model_b.fit()
forecast_b = fitted_model_b.predict(start=len(train_data), end=len(series)-1)

# --- 4. モデル C (ARIMA) の学習・予測 ---
# order=(p, d, q) です。
# p=20: AR モデルと同様に過去 20 日間のパターンを見る
# d=1: "Integrated" 差分を取ることでトレンド(上がり下げ)を調整する
# q=0: Moving Average は今回は使わないとします
model_c = ARIMA(train_data, order=(20, 1, 0)) 
fitted_model_c = model_c.fit()
forecast_c = fitted_model_c.predict(start=len(train_data), end=len(series)-1)

# --- 5. RMSE の計算 (NumPy を使用) ---
rmse_a = np.sqrt(np.mean((test_data.values - forecast_a.values) ** 2))
rmse_b = np.sqrt(np.mean((test_data.values - forecast_b.values) ** 2))
rmse_c = np.sqrt(np.mean((test_data.values - forecast_c.values) ** 2))

print(f"【検証結果: RMSE (平均誤差額)】")
print(f"モデル A (AR, lags=5):    {rmse_a:.2f} 円")
print(f"モデル B (AR, lags=20):   {rmse_b:.2f} 円")
print(f"モデル C (ARIMA, d=1):    {rmse_c:.2f} 円  <-- これが一番低い?")
print()

# --- 6. グラフ描画 ---
plt.figure(figsize=(12, 6)) 
plt.plot(test_data.index, test_data.values, label='Actual Price', color='black', linewidth=2)
plt.plot(test_data.index, forecast_a.values, label='AR (Lags=5)', color='blue', linestyle='--')
plt.plot(test_data.index, forecast_b.values, label='AR (Lags=20)', color='green', linestyle=':')

# ARIMA は赤い実線(少し細め)にして強調します
plt.plot(test_data.index, forecast_c.values, label='ARIMA (20,1,0)', color='red', linestyle='-', alpha=0.8)

plt.title('Comparison: AR vs ARIMA (Handling Trends)')
plt.xlabel('Date')
plt.ylabel('Stock Price (JPY)')
plt.legend()
plt.grid(True, alpha=0.5)
plt.tight_layout()
plt.show()

動作結果

【検証結果: RMSE (平均誤差額)】
モデル A (AR, lags=5):    1133.90 円
モデル B (AR, lags=20):   1080.00 円
モデル C (ARIMA, d=1):    1029.97 円  <-- これが一番低い?

※値が小さいほど、実際の株価に近いことを意味します。

ソース解説

  • 追加された4.でARIMAモデル構築
  • それ以外は前回の記事で解説しています

📚 さらに理解を深めたい方には、時系列分析の書籍がお薦めです!

結果解説

ARモデルが1つ前の予測結果を次の予測に使うためどんどん差が出てしまうのですが、
ARIMAモデルはその差を考慮してくれるモデルなので、精度はよくなるとのこと。

LLMの解説👇

ARIMA の秘密武器「Integrated (d=1)」

  • 「なぜ AR モデルでは追いつかなかったのに、ARIMA では追いきれたのか?」という問いに対し、この**変化量(差分)**を見ているから。

赤い線の動き:

  • 株価が「急騰」している時など、青や緑の線は少し遅れてついていくか下を走りますが、ARIMA(赤線)はそれらのズレを修正して、実際の値(黒線)に非常に近づいているはずです。


ARモデルよりはよくなりましたが、画像見る限り全然近づいてないですw
本来の目的に対しては、まだまだダメです

まとめ

  • ARIMAモデルはARモデルよりも精度はよくなる
  • ただし、実際の株価との差分は大きいまま
  • 次回はARIMAモデル生成時のパラメータを調整してみます

関連記事

【AI実装シリーズ1 ARモデル】株価を分析してみたい

📒 noteで自己回帰分析のまとめを公開しています

note ご指定のページが見つかりません

コメント

タイトルとURLをコピーしました