Holt-Winters法による時系列予測
はじめに
Holt-Winters法は、時系列データの予測に広く用いられる手法で、特に季節性のあるデータに対して効果的です。この手法は、トレンドと季節性を考慮に入れることで、より正確な予測を実現します。
本記事では、基本的な概念とpythonライブラリのDartsを用いた適用例を紹介します。
Holt-Wintersとは
Holt-Winters法は、以下の3つの成分を用いて時系列データをモデル化します。
- レベル(Level): 現在の時点でのデータの基本的な値を示します。
- トレンド(Trend): データの増加または減少の速度を示します。
- 季節性(Seasonality): データが時間の経過とともに周期的に変動するパターンを示します。
Holt-Winters法には、加法モデルと乗法モデルの2つのバリエーションがあります。
-
加法モデル: トレンドと季節性が独立していると仮定します。データの変動が一定の範囲内である場合に適しています。
$$ Y_t = L_t + T_t + S_t $$
-
乗法モデル: トレンドと季節性が互いに依存していると仮定します。データの変動が時間の経過とともに増大する場合に適しています。
$$ Y_t = L_t \cdot T_t \cdot S_t $$
ここで、$(Y_t)$は時点$(t$)における観測値、$(L_t$)はレベル、$(T_t$)はトレンド、$(S_t$)は季節性を示します。
別名3重指数平滑化法とも言うようです。pythonライブラリに寄ってはETS(Exponential triple smoothing)と書いてあったりします。
伝統的な手法なため、最近ではexcel関数でも実装できる模様。
excel関数: FORECAST.ETS()
Holt-Winters法の適用例
今回はpythonライブラリの一つであるDartsを使用しました。Dartsは時系列予測に特化したライブラリで、簡単なコードで様々な予測モデルを実装できます。
以下に、Pythonのdarts
ライブラリを使用したHolt-Winters法の実装例を示します。なお、S&P500の株価データはyfinanceライブラリを使用することでとても簡単に取得できます。
import yfinance as yf
from darts import TimeSeries
from darts.models import ExponentialSmoothing
import pandas as pd
import matplotlib.pyplot as plt
# S&P 500の株価データを取得
data = yf.download('^GSPC', start='2018-01-01', end='2024-10-18')
data = data[['Close']].resample('M').last().reset_index()
# 時系列データをDartsのTimeSeriesに変換
series = TimeSeries.from_dataframe(data, 'Date', 'Close')
# 学習用と検証用に分割
train, val = series[:-24], series[-24:]
# モデルの作成とフィッティング
model = ExponentialSmoothing(seasonal=SeasonalityMode.MULTIPLICATIVE, seasonal_periods=12)
model.fit(train)
# 予測
prediction = model.predict(len(val))
# 予測の可視化
plt.figure(figsize=(12, 6))
series.plot(label='Actual', lw=2)
prediction.plot(label="Forecast", lw=2)
plt.title('S&P 500 Price Forecast using Holt-Winters')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
Mape: 8.89%
MAPE(Mean Absolute Percentage Error)
本日(2024年10月)から24ヶ月前以前のデータを用いて学習、24ヶ月分の予測しました。予測データと実際のデータを重ねて表示させています。
黒い実線と青い実線が重なっているほど精度良く予測ができている、ということになりますが、最初の数カ月はまだ誤差が少ないですが、だんだん誤差が広がっていますね。
ここ数年のS&P500の伸び方は、Holt-wintersの予想を遥かに上回る伸び方をしているようです。
感想
pythonライブラリDartsを用いて、時系列予測に広く用いられるHolt-wintersを実装してみました。
Dartsを用いることで、ARIMAなど他のモデルも非常にシンプルなコードで実装できそうです。
なお、そもそも24ヶ月分の予測は長すぎるので、予測の目的に応じて予測月数や頻度(場合によっては日単位、時間単位)を検討する必要があるかと思います。機会があれば、パラメータの調整や他モデルの適用も試して予測精度をさらに高めていきたいと思います。