FRM模型三:GARCH预测波动率

FRM系列的第三个模型:GARCH

FRM系列的第三个模式是来自1级Book4中市场风险一章估计波动率的模型。由于金融数据波动率不是恒定不变的,会出现聚集效应。因此在预测波动率时,需要用更加复杂的统计模型进行建模。GARCH模型的优势在于能够很好描述这种波动率集聚现象。

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+σrn12+βσn12
其中 γ + α + β = 1 \gamma+\alpha+\beta=1 γ+α+β=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()

收益率做出的图如下:可以看出还是有比较明显的聚集效应。
FRM模型三:GARCH预测波动率_第1张图片

步骤2:计算波动率

原始数据是沪深300每日的收盘价,按照月频率计算波动率(这里直接计算方差)并作图。

# monthly variance
monthly_variance = data['ret'].resample('m').var()
plt.plot(monthly_variance, color='r')
plt.show()

波动率图如下:
FRM模型三:GARCH预测波动率_第2张图片

步骤3:检验是否可以建模

计算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

说明序列不是白噪声,可以建模。

步骤4:建立GARCH模型

这里直接用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))

你可能感兴趣的:(python,for,frm,python,金融)