04.12.2
Holt法
SimpleExpSmoothing(α=0.1) と Holt(α=0.1, β=0.2) の 33 か月予測を 1 枚に重ねます。SES の水平線に対して Holt の予測は傾いた直線になりますが、12 か月周期の季節の山谷はどちらも表せないことが図で確認できます。単純指数平滑法 で水準 \(\ell_t\) を \(\alpha\) で更新する仕組みを先に押さえておくと、Holt 法が「同じ更新を傾き \(b_t\) にも行うだけ」だと分かります。
直感 #
天然ガス消費量は 10 年で冬の山が 2900 から 3600 BCF へ上がっており、SES のように「最後の水準を横に伸ばす」と、予測は年を追うごとに実測を下回ります。Holt 法はこの上昇を「毎月およそ +5 BCF」という傾きとして別に覚えておき、予測を 1 か月進めるごとに傾きの分だけ足し上げます。傾きの更新式は \(b_t = \beta(\ell_t - \ell_{t-1}) + (1 - \beta) b_{t-1}\) で、水準の変化量を \(\beta\) の重みで取り込む点は SES の更新と同じ形です。\(\beta = 0.2\) なら直近 1 か月の変化を 2 割だけ信じるので、季節の山谷で水準が月に 500 動いても傾きが急には振れません。
1. ライブラリ #
| |
何が起きているか(ステップで見る) #
コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。
見るポイント:水準 → 傾き → 季節 と要素を足すほど、未来への伸ばし方が豊かになる。
サンプルデータ #
Natural Gas Consumption (NATURALGAS) の月次データを使います。数値の単位は BCF(10 億立方フィート)で、2013 年 1 月から 2022 年 9 月までの 117 か月分を辞書で埋め込み、月初の等間隔 index を持つ DataFrame に整えます。
| |
| Natural Gas Consumption(BCF) | |
|---|---|
| 2013-01-01 | 2878.8 |
| 2013-02-01 | 2567.2 |
| 2013-03-01 | 2521.1 |
| 2013-04-01 | 1967.5 |
| 2013-05-01 | 1752.5 |
全期間を描くと、1 月の山が 2900 → 3600 BCF と 10 年で上がる右肩上がりのトレンドと、12 か月周期の季節の波が重なって見えます。Holt 法が狙うのはこのうち前者のトレンドです。
| |

データの分割 #
データの末尾(2020 年 1 月以降の 33 か月)を予測性能の検証に使い、2013〜2019 年の 84 か月で学習します。2020 年以降を丸ごと検証に回すのは、未来の値を学習に混ぜないためです。
| |

モデルの学習と予測 #
同じ学習データに SES と Holt 法を当て、どちらも 33 か月先を予測します。SES は \(\alpha = 0.1\) のみ、Holt は \(\alpha = 0.1\) と \(\beta = 0.2\) を固定し、差がトレンド成分だけから生まれるようにします。
| |
| |

実行結果の読み方 #
SES の予測(水平線)は 2400 BCF 前後に留まり、Holt の予測は学習最終月の水準から傾き \(b_T\) の分だけ毎月上がる直線になります。学習期間の最後の月は 2019 年 12 月(3170.7)で季節の山に向かう途中なので、\(\alpha = 0.1\) で平滑化した水準はそれより低く、傾きは 10 年の上昇トレンド(月 +4 前後)に近い値になります。検証データの 33 か月と比べると、Holt の直線は冬の山(3300〜3600)と夏の谷(2100〜2300)の真ん中あたりを通り、SES より年々の水準の上昇には追随しますが、山谷そのものは表せません。holt.params を表示すると smoothing_level と smoothing_trend のほか、推定された初期水準 initial_level と初期傾き initial_trend が確認できます。
使いどころと落とし穴 #
Holt 法が向くのは、売上や利用者数のように一定の割合で増減し続け、季節の山谷が小さい系列です。天然ガス消費量のように水準の 40% にあたる 12 か月周期の波があるデータでは、トレンドを捉えても誤差の大半は季節が占めるので、次の Holt-Winters 法 で季節成分 \(\gamma\) を足す必要があります。もう一つの落とし穴は傾きを 33 か月も直線で伸ばすことで、学習最終月の傾きがたまたま急だと予測が現実から離れていきます。長期の予測では Holt(data_train, damped_trend=True) で減衰トレンドにし、遠い未来ほど傾きを弱めるのが安全です。\(\beta\) を手で決めるときは 0.1〜0.3 から始め、fit() の最尤推定値と比べて極端に違わないかを確かめます。
- 単純指数平滑法 (SES) — 指数的な重みで滑らかに予測する基本形
- Holt-Wintersの手法 — トレンドと季節性を同時に平滑化し 12 か月周期も再現する拡張
- ホルト・ウィンター法 — 状態空間モデルとしてのHolt-Winters