FRM系列的第三个模式是来自1级Book4中市场风险一章估计波动率的模型。由于金融数据波动率不是恒定不变的,会出现聚集效应。因此在预测波动率时,需要用更加复杂的统计模型进行建模。GARCH模型的优势在于能够很好描述这种波动率集聚现象。
以GARCH(1,1)为例,表达式如下:
σ n 2 = γ V L + σ r n − 1 2 + β σ n − 1 2 \sigma_n^{2} =\gamma V_L+\sigma r_{n-1}^{2}+\beta \sigma_{n-1}^{2} σn2=γVL+σrn−12+βσn−12
其中 γ + α + β = 1 \gamma+\alpha+\beta=1 γ+α+β=1
由上面表达式可以看出,前一期方差较大时,导致后一期方差会受到前一期影响,随之变大。
# predict volatility in GARCH
from arch import arch_model
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa import stattools
# import data
path = r'C:\Users\...\000300.csv'
data = pd.read_csv(path, header=0, parse_dates=['date'], index_col=['date'])
data['ret'] = (data['price'] - data['price'].shift(1))/ data['price'].shift(1) * 100
# # draw plot
plt.plot(data['ret'], color='r')
plt.xlabel('date')
plt.ylabel('ret')
plt.show()
原始数据是沪深300每日的收盘价,按照月频率计算波动率(这里直接计算方差)并作图。
# monthly variance
monthly_variance = data['ret'].resample('m').var()
plt.plot(monthly_variance, color='r')
plt.show()
计算LB统计量,判断是否可以建模。
LjungBox = stattools.q_stat(stattools.acf(monthly_variance), len(monthly_variance))
print("LB value is {}" .format(LjungBox[1][-1]))
输出值为:
LB value is 2.112640315850175e-06
说明序列不是白噪声,可以建模。
这里直接用GARCH(1,1)建模,并且预测后一期的波动率值。
# GRACH model
garch = arch_model(monthly_variance, mean='Constant', lags=0, vol='GARCH', p=1, o=0, q=1, dist='normal')
garchmodel = garch.fit()
var_fore = garchmodel.forecast(horizon=1).variance.iloc[-1]
print(garchmodel.summary())
garchmodel.plot()
print("The next forecast variance is{} ".format(var_fore.values))