1

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=Truearch_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

なぜこうなった?たぶんリスケーリングのせい?予測の前に別の調整を行う必要がありますか?

ありがとう

4

1 に答える 1