目次
はじめに
私自身は業務において時系列予測を用いることはなく、他の人や委託先が使用しているのをみる程度。
ただ最近ある仕事にて得意先がかつてSARIMAを分析していたと言う話をして盛り上がったことがあり、自身の記憶を思い起こす意味で執筆も込めて挑戦しようと思った次第。
この記事の概要について
・時系列予測を用いてAAPL(アップル)の株価を予想することに挑戦する。株価についてはyfinanceを利用。
予測の精度は高くないことがかなり想定されるため、あくまで自身の研究用の記事となります。
・私自身はpythonの実装についてはかなりの素人のため、生成AIを活用しながら執筆しています
実行環境
GoogleColaborary
プログラムの実装
事前準備
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import japanize_matplotlib
import statsmodels.api as sm
from statsmodels.tsa.seasonal import seasonal_decompose
import yfinance as yf
#アップルの株価をyfinanceを用いて取得する
df = yf.download(
"AAPL",
start="2018-01-01",
end="2025-12-31"
)
yfinanceライブラリは
df.columns
MultiIndex([( 'Close', 'AAPL'),
( 'High', 'AAPL'),
( 'Low', 'AAPL'),
( 'Open', 'AAPL'),
('Volume', 'AAPL')],
names=['Price', 'Ticker'])
のようなMultiIndex型になっていることは注意。
特に意図なく、2018/1/1~2025/12/31の期間を取得
パラメータに関する考察
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
y = df[("Close", "AAPL")]
y.plot()
終値をデイリーで追跡していくと、2018年から2026年にかけて右肩上がりになっていることがわかる。
多少の波はあるものの、年度間で似たような繊維をしているかと言うとかなり疑わしく、SARIMAで予測することは難しそうな予感。
と言うことで自己相関係数と偏自己相関係数を可視化してみる
fig_1 = sm.graphics.tsa.plot_acf(y, lags=400) #自己相関係数
fig_2 = sm.graphics.tsa.plot_pacf(y, lags=50) #偏自己相関係数
自己相関係数(ACF)は地点xと地点x+tにおける確率変数の相関。
青い縦の棒グラフが異なる地点との相関係数(なのでt=0の時は1)、薄い青色については自己相関が0である場合の95%の信頼区間となっている。この内容を見るにt=200ちょっと前ぐらいまでは95%の信頼区間を上回っており、優位な自己相関が認められる。
ACFでは2地点間における確率変数の相関係数を見ており、自己相関プロット(ACF)がラグ qまで残る場合、MAモデルという考え方になる。
偏自己相関係数(PACF)は地点xと地点x+t1,x+t2・・・の各地点と相関係数。
青い棒グラフが地点0との相関係数、「真の偏自己相関が0なら、この範囲に95%の確率で収まる」という基準。
ラグ1・つまり前日の株価には極めて強い影響を受けているが、それ以降の株価にはほとんど影響を受けていないと考えられる。
PACFは特定地点と複数地点での確率変数の相関を見ており、偏自己相関がラグpまでは有意の場合・ARモデルのパラメータとなるという考え方になる。
ACF・PACFの観察を踏まえると、
・直接の影響を受けるのは1日前の株価
・一つ前の株価の影響を受けつつも、そのつながりで190日前くらいまでの株価の影響も間接的に受けていると考えられる。
そのためモデルとしてはAR(1)を主に置きつつ、比較用にAR(2)、MA(1)を作成し予測精度を検証することとする。
複数モデルにおける比較
下記コードにてモデル化
orderの変数の部分をAR(1)、AR(2)、MA(1)で調整
from statsmodels.tsa.arima.model import ARIMA
price = df[("Close", "AAPL")].dropna()
model_ar1 = ARIMA(price, order=(1, 0, 0))
result_ar1 = model_ar1.fit()
print(result_ar1.summary())
モデル間の精度をAIC・BICで比較
print("AR(1) AIC:", result_ar1.aic)
print("AR(2) AIC:", result_ar2.aic)
print("MA(1) AIC:", result_ma1.aic)
print("AR(1) BIC:", result_ar1.bic)
print("AR(2) BIC:", result_ar2.bic)
print("MA(1) BIC:", result_ma1.bic)
実行結果
AR(1) AIC: 9582.989870611003
AR(2) AIC: 9584.148744016475
MA(1) AIC: 19911.408514251692
AR(1) BIC: 9599.807540614163
AR(2) BIC: 9606.572304020687
MA(1) BIC: 19928.22618425485
これを見るに、AR(1)の精度他のモデルよりも高いことが示されている。
先ほどPACFで見たパラメータの内容がうまくハマっていると言える。
またモデルの実行結果は下記の通り
SARIMAX Results
==============================================================================
Dep. Variable: ('Close', 'AAPL') No. Observations: 2010
Model: ARIMA(1, 0, 0) Log Likelihood -4788.495
Date: Tue, 11 Aug 2026 AIC 9582.990
Time: 02:27:50 BIC 9599.808
Sample: 0 HQIC 9589.163
- 2010
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 135.0809 234.430 0.576 0.564 -324.394 594.556
ar.L1 0.9998 0.001 860.458 0.000 0.998 1.002
sigma2 6.8411 0.090 76.379 0.000 6.666 7.017
===================================================================================
Ljung-Box (L1) (Q): 0.66 Jarque-Bera (JB): 7951.79
Prob(Q): 0.42 Prob(JB): 0.00
Heteroskedasticity (H): 6.32 Skew: 0.18
Prob(H) (two-sided): 0.00 Kurtosis: 12.74
===================================================================================
ar.L1 = 0.9998 ということで1日前の株価と現在の株価には非常に強い関係がある結果となった。
総括
アップルの株価を元に自己相関係数・偏自己相関係数を算出し、MA/ARモデルを作成。
モデルから「アップルの株価は1日前の株価と強い影響を受ける」ということを導出。
一方でこのモデル状で言及しているのはar.L1≒1なので、今日と明日の株価はほぼ同じ・ということだけ。予測精度やリターンを考えるには別の視点での取り組みが必要。
大枠の考え方の把握に作成した本記事で同様な記事はたくさんあるので調査してブラッシュ案をまとめたい


