GARCH(1,1)を使用して2つのシリーズの分散(標準偏差)を予測するためにARCHパッケージをテストしています。
これは私のコードの最初の部分です
import pandas as pd
import numpy as np
from arch import arch_model
returns = pd.read_csv('ret_full.csv', index_col=0)
returns.index = pd.to_datetime(returns.index)
イボベスパ リターンズ
最初のシリーズは、Ibovespa インデックスの最初の先物契約であり、Garch 予測に非常に近い年率ボラティリティが観測されています。
私が見つけた最初の問題は、サンプルを 100 で再スケーリングする必要があることです。これを行うには、戻り値の系列を 100 で乗算するかrescale=True
、arch_model
関数でパラメーターを設定します。
なぜこれを行う必要があるのですか?
# Ibov
ret_ibov = returns['IBOV_1st']
model_ibov = arch_model(ret_ibov, vol='Garch', p=1, o=0, q=1, dist='Normal', rescale=True)
res_ibov = model_ibov.fit()
モデルを適合させた後、分散を予測し (問題を説明するための 5 つのステップのみ)、標準偏差を取得して年換算します。Obs: リターン シリーズを再スケーリングする必要があったため、予測を 10000 で割った (100**2、再スケーリングのため)
# Forecast
forecast_ibov = res_ibov.forecast(horizon=5)
# Getting Annualized Standard Deviation
# Garch Vol
vol_ibov_for = (forecast_ibov.variance.iloc[-1]/10000)**0.5 * np.sqrt(252) * 100
# Observed Vol
vol_ibov = ret_ibov.std() * np.sqrt(252) * 100
そして、それが予測出力です
vol_ibov_for
h.1 24.563208
h.2 24.543245
h.3 24.523969
h.4 24.505357
h.5 24.487385
Observed Volに本当に近いのはどれですか23.76
期待していた結果です。
IRFMリターンズ
揮発性の低いシリーズでまったく同じプロセスを実行すると、本当に奇妙な結果が得られました。
# IRFM
ret_irfm = returns['IRFM1M']
model_irfm = arch_model(ret_irfm, vol='Garch', p=1, o=0, q=1, dist='Normal', rescale=True)
res_irfm = model_irfm.fit()
# Forecast
forecasts_irfm = res_irfm.forecast(horizon=5)
# Getting Annualized Standard Deviation
# Garch Vol
vol_irfm_for = (forecasts_irfm.variance.iloc[-1]/10000)**0.5 * np.sqrt(252) * 100
# Observed Vol
vol_irfm = ret_irfm.std() * np.sqrt(252) * 100
予測出力:
vol_irfm_for
h.1 47.879679
h.2 49.322351
h.3 50.519282
h.4 51.517356
h.5 52.352894
そして、これは観察されたボラティリティとは大きく異なります5.39
なぜこうなった?たぶんリスケーリングのせい?予測の前に別の調整を行う必要がありますか?
ありがとう