时间序列分析:ARCH、GARCH、TGARCH与DCC-GARCH波动率模型(含代码)

本文聚焦于金融时间序列建模中的波动性模型,涵盖了ARCH、GARCH、TGARCH、DCC-GARCH模型的构建。
本文关注TGARCH模型和DCC-GARCH的应用,通过在沪深300和中证500指数上应用TGARCH和DCC-GARCH模型,揭示这两个指数之间的条件异方差及动态相关性的变化规律。
全部代码可关注gzh’finance褪黑素’回复关键词【24012301】获取

一、ARCH、GARCH、TGARCH、DCC-GARCH模型设定

1.1 ARCH

ARCH(自回归条件异方差)模型是用于描述时间序列数据中异方差(波动率变化)的一种模型。ARCH模型的基本方程如下:

σ t 2 = α 0 + ∑ i = 1 p α i ⋅ ε t − i 2 \sigma_t^2 = \alpha_0 + \sum_{i=1}^{p} \alpha_i \cdot \varepsilon_{t-i}^2 σt2=α0+i=1pαiεti2

符号解释
σ t 2 \sigma_t^2 σt2时间点 (t) 处的条件方差(波动率的平方)
α 0 \alpha_0 α0模型中的常数
α i \alpha_i αi模型中的系数,表示过去 (i) 期的残差项的影响
ε t − i \varepsilon_{t-i} εti时间点 (t-i) 处的残差项

ARCH模型的核心思想是,当前时间点的方差是过去残差项的平方的加权和,其中权重由系数 alpha_i 决定。

1.2 GARCH模型

GARCH(广义自回归条件异方差)模型:
σ t 2 = ω + ∑ i = 1 p α i ⋅ ε t − i 2 + ∑ j = 1 q β j ⋅ σ t − j 2 \sigma_t^2 = \omega + \sum_{i=1}^{p} \alpha_i \cdot \varepsilon_{t-i}^2 + \sum_{j=1}^{q} \beta_j \cdot \sigma_{t-j}^2 σt2=ω+i=1pαiεti2+j=1qβjσtj2
GARCH(1,1)的模型如下:
σ t 2 = ω + α 1 ⋅ ε t − 1 2 + β 1 ⋅ σ t − 1 2 \sigma_t^2 = \omega + \alpha_1\cdot \varepsilon_{t-1}^2 + \beta_1\cdot \sigma_{t-1}^2 σt2=ω+α1εt12+β1σt12

符号解释
σ t 2 \sigma_t^2 σt2时间点 (t) 处的条件方差(波动率的平方)
ω \omega ω模型中的常数项
α i \alpha_i αi模型中的系数,表示过去 (i) 期的残差项的影响
β j \beta_j βj模型中的系数,表示过去 (j) 期的条件方差的影响
ε t − i \varepsilon_{t-i} εti时间点 (t-i) 处的残差项

约束条件为alpha+beta<1。这是为了保证GARCH过程是平稳的。

GARCH模型的缺点
GARCH模型假设波动率的变化是线性的,这可能无法捕捉一些非线性的波动性模式,特别是在极端事件发生时。
GARCH模型通常假设波动率的变化对正面和负面的残差是对称的,但实际上市场波动率往往在负面和正面的消息中表现出不同的响应。
GARCH模型的参数估计可能受到样本大小的影响,特别是在相对较小的数据集上,参数的估计可能不够稳定。
GARCH模型通常假设残差是高斯分布,但在实际金融时间序列中,残差可能显示出尖峰、厚尾等非高斯特征,这可能影响模型的性能。

1.3 TGARCH模型

TGARCH 模型(Threshold GARCH)是一个条件异方差模型,其中引入了阈值变量,使得模型能够适应不同市场条件下的异方差性。
TGARCH 模型的基本思想是,在不同的市场条件下,资产的风险可能发生显著的变化。这个模型考虑到了市场条件的变化,并允许风险在不同的条件下表现出不同的波动性。

TGARCH 模型的一般形式如下:

σ t 2 = ω + α ( r t − 1 − γ ) 2 + β σ t − 1 2   \sigma_t^2 = \omega + \alpha (r_{t-1} - \gamma)^2 + \beta \sigma_{t-1}^2 \ σt2=ω+α(rt1γ)2+βσt12 

符号解释
σ t 2   \sigma_t^2\ σt2 在时间 (t) 的条件异方差。
ω   \omega\ ω 常数。
α   \alpha\ α 条件异方差对过去收益率变动的反应系数。
r t − 1 r_{t-1} rt1过去的收益率。
γ   \gamma\ γ 阈值变量。
β   \beta\ β 过去条件异方差的权重。

1.4 DCC-GARCH模型

DCC-GARCH 模型是动态条件相关性-广义条件异方差模型的一种,用于建模多个资产之间的动态条件相关性,考虑到它们之间的波动性随时间的变化。
它的基本思想是,资产之间的相关性在不同时间点可能发生变化,而且这种变化是动态的。该模型结合了GARCH模型和动态条件相关性DCC模型的特点。

r t = μ t + ϵ t ϵ t = H t 1 / 2 z t H t = D t R t D t R t = ( 1 − λ ) Q + λ ϵ t − 1 ϵ t − 1 T Q = d i a g ( q 1 , q 2 , … , q n ) D t = d i a g ( h 1 t 1 / 2 , h 2 t 1 / 2 , … , h n t 1 / 2 ) \begin{align*} r_t &= \mu_t + \epsilon_t \\ \epsilon_t &= H_t^{1/2} z_t \\ H_t &= D_t R_t D_t \\ R_t &= (1 - \lambda) Q + \lambda \epsilon_{t-1} \epsilon_{t-1}^T \\ Q &= diag(q_1, q_2, \ldots, q_n) \\ D_t &= diag(h_{1t}^{1/2}, h_{2t}^{1/2}, \ldots, h_{nt}^{1/2}) \end{align*} rtϵtHtRtQDt=μt+ϵt=Ht1/2zt=DtRtDt=(1λ)Q+λϵt1ϵt1T=diag(q1,q2,,qn)=diag(h1t1/2,h2t1/2,,hnt1/2)

符号解释
r t   r_t\ rt 资产收益率向量。
μ t   \mu_t\ μt 均值向量。
ϵ t   \epsilon_t\ ϵt 残差向量,(\epsilon_t = H_t^{1/2} z_t),其中 (z_t) 是独立同分布的白噪声序列。
H t   H_t\ Ht 条件协方差矩阵。
D t   D_t\ Dt 对角矩阵,包含每个资产的条件标准差。
R t   R_t\ Rt 条件相关性矩阵。
Q   Q\ Q 对角矩阵,包含每个资产的长期方差。
λ   \lambda\ λ 控制条件相关性动态变化的参数。

DCC-GARCH 模型能够捕捉资产之间动态的、时间变化的相关性,广泛应用于投资组合管理、风险管理方面。

二、实证分析

2.1 模型设定

本文对沪深300和中证500的日收益率实施了TGARCH模型与DCC-GARCH模型。
首先对每个收益率分别拟合GARCH模型,然后对两个时间序列之间的相互关系拟合DCCGARCH模型。此外,使用了TGARCH来更好地捕捉股票波动的不对称性。

模型的结构如下:
[ r s p , t r j p m , t ] ∼ N ( 0 , H t ) H t = [ σ s p , t 0 0 σ j p m , t ] [ 1 ρ t ρ t 1 ] [ σ s p , t 0 0 σ j p m , t ] = [ σ s p , t 0 0 σ j p m , t ] R t [ σ s p , t 0 0 σ j p m , t ] R t = [ 1 q 11 , t 0 0 1 q 22 , t ] [ q 11 , t q 12 , t q 12 , t q 22 , t ] [ 1 q 11 , t 0 0 1 q 22 , t ] = [ 1 q 11 , t 0 0 1 q 22 , t ] Q t [ 1 q 11 , t 0 0 1 q 22 , t ] σ s p , t 2 = ω s p + α s p ⋅ r s p , t − 1 2 + γ s p ⋅ r s p , t − 1 2 ⋅ I s p , t − 1 − + β s p ⋅ σ s p , t − 1 2 σ j p m , t 2 = ω j p m + α j p m ⋅ r j p m , t − 1 2 + γ j p m ⋅ r j p m , t − 1 2 ⋅ I j p m , t − 1 − + β j p m ⋅ σ j p m , t − 1 2 Q t = ( 1 − a − b ) ⋅ Q ˉ + a ⋅ ϵ t − 1 ϵ t − 1 ′ + b ⋅ Q t − 1 Q ˉ = 1 T ∑ t = 1 T ϵ t ϵ t ′ , ϵ t = [ r s p , t / σ s p , t r j p m , t / σ j p m , t ] \begin{align} &\left[\begin{array}{c} r_{sp,t} \\ r_{jpm,t} \end{array}\right] \sim N(0,H_t) \\ &H_t = \left[\begin{array}{cc} \sigma_{sp,t} & 0 \\ 0 & \sigma_{jpm,t} \end{array}\right] \left[\begin{array}{cc} 1 & \rho_t \\ \rho_t & 1 \end{array}\right] \left[\begin{array}{cc} \sigma_{sp,t} & 0 \\ 0 & \sigma_{jpm,t} \end{array}\right] = \left[\begin{array}{cc} \sigma_{sp,t} & 0 \\ 0 & \sigma_{jpm,t} \end{array}\right] R_t \left[\begin{array}{cc} \sigma_{sp,t} & 0 \\ 0 & \sigma_{jpm,t} \end{array}\right]\\ &R_t = \left[\begin{array}{cc} \frac{1}{\sqrt{q_{11,t}}} & 0 \\ 0 & \frac{1}{\sqrt{q_{22,t}}} \end{array}\right] \left[\begin{array}{cc} q_{11,t} & q_{12,t} \\ q_{12,t} & q_{22,t} \end{array}\right] \left[\begin{array}{cc} \frac{1}{\sqrt{q_{11,t}}} & 0 \\ 0 & \frac{1}{\sqrt{q_{22,t}}} \end{array}\right] = \left[\begin{array}{cc} \frac{1}{\sqrt{q_{11,t}}} & 0 \\ 0 & \frac{1}{\sqrt{q_{22,t}}} \end{array}\right] Q_t \left[\begin{array}{cc} \frac{1}{\sqrt{q_{11,t}}} & 0 \\ 0 & \frac{1}{\sqrt{q_{22,t}}} \end{array}\right]\\ &\sigma_{sp,t}^2 = \omega_{sp} + \alpha_{sp}\cdot r_{sp,t-1}^2 + \gamma_{sp}\cdot r_{sp,t-1}^2 \cdot I_{sp,t-1}^{-} + \beta_{sp} \cdot \sigma_{sp,t-1}^2\\ &\sigma_{jpm,t}^2 = \omega_{jpm} + \alpha_{jpm}\cdot r_{jpm,t-1}^2 + \gamma_{jpm}\cdot r_{jpm,t-1}^2 \cdot I_{jpm,t-1}^{-} + \beta_{jpm} \cdot \sigma_{jpm,t-1}^2\\ &Q_t = (1-a-b)\cdot\bar{Q} + a\cdot\epsilon_{t-1}\epsilon_{t-1}' + b\cdot Q_{t-1}\\ &\bar{Q} = \dfrac{1}{T}\sum_{t=1}^{T}\epsilon_{t}\epsilon_{t}', \quad \epsilon_{t} = \left[\begin{array}{c} r_{sp,t}/\sigma_{sp,t} \\ r_{jpm,t}/\sigma_{jpm,t} \end{array}\right] \end{align} [rsp,trjpm,t]N(0,Ht)Ht=[σsp,t00σjpm,t][1ρtρt1][σsp,t00σjpm,t]=[σsp,t00σjpm,t]Rt[σsp,t00σjpm,t]Rt=[q11,t 100q22,t 1][q11,tq12,tq12,tq22,t][q11,t 100q22,t 1]=[q11,t 100q22,t 1]Qt[q11,t 100q22,t 1]σsp,t2=ωsp+αsprsp,t12+γsprsp,t12Isp,t1+βspσsp,t12σjpm,t2=ωjpm+αjpmrjpm,t12+γjpmrjpm,t12Ijpm,t1+βjpmσjpm,t12Qt=(1ab)Qˉ+aϵt1ϵt1+bQt1Qˉ=T1t=1Tϵtϵt,ϵt=[rsp,t/σsp,trjpm,t/σjpm,t]

ω , α , γ , β \omega,\alpha,\gamma,\beta ω,α,γ,β 根据下标的不同分别为沪深300和中证500的TGARCH(1,1,1)模型参数。

α \alpha α, β \beta β都是DCC-GARCH模型的参数。

2.2 实证流程

  • 导入沪深300和中证500指数的数据
  • 数据处理:对数变换
  • 分别拟合TGARCH(1,1,1)模型
  • 白噪声检验Ljung-Box检验
  • 预测未来数据
  • 检验拟合误差
  • 拟合DCC-GARCH模型,生成模型参数

2.3 代码部分

导入沪深300和中证500指数的数据,并对数据进行处理:(沪深300代码为39905,中证500代码为00300)
这里使用的是两个代码2017年1月1日到2022年12月31日的收盘价数据。

import efinance as ef
stock_code = '399905'
df = ef.stock.get_quote_history(stock_code)
stock_code = '000300'
df2 = ef.stock.get_quote_history(stock_code)
# 将日期列转换为日期时间类型
df['日期'] = pd.to_datetime(df['日期'])
# 设置日期列为索引
df.set_index('日期', inplace=True)
# 选择指定日期范围的数据
start_date = '2017-01-01'
end_date = '2022-12-31'
filtered_data = df.loc[start_date:end_date]
df = filtered_data
# 将日期列转换为日期时间类型
df2['日期'] = pd.to_datetime(df2['日期'])
# 设置日期列为索引
df2.set_index('日期', inplace=True)
# 选择指定日期范围的数据
start_date = '2017-01-01'
end_date = '2022-12-31'
filtered_data2 = df2.loc[start_date:end_date]
df2 = filtered_data2
sp = df
jpm = df2
sp_return = np.log(sp['收盘']).diff().dropna() 
jpm_return = np.log(jpm['收盘']).diff().dropna() .
sp_return = sp_return.iloc[::-1]
jpm_return = jpm_return.iloc[::-1] 

以沪深300指数为例拟合TGARCH(1,1,1)模型,GARCH模型为函数包调用:

sp_model = GARCH(1,1)
sp_model.set_loss(garch_loss_gen(1, 1))
sp_model.set_max_itr(1)
sp_model.fit(sp_return)
sp_model.get_theta()

得到的结果为:array([0.005, 0.1 , 0.1 , 0.85 ])
因此, TGARCH(1,1,1) 拟合的参数结果为:
ω s p = 0.005 α s p = 0.1 γ s p = 0.1 β s p = 0.85 \begin{align} \omega_{sp}&= 0.005\\ \alpha_{sp}&= 0.1\\ \gamma_{sp}&= 0.1\\ \beta_{sp}&= 0.85 \end{align} ωspαspγspβsp=0.005=0.1=0.1=0.85

TGARCH(1,1,1) 模型的条件异方差方程通常可以表示为:

σ t 2 = 0.005 + 0.1 r t − 1 2 + 0.1 I { r t − 1 < 0 } r t − 1 2 + 0.85 σ t − 1 2 \sigma_t^2 = 0.005 + 0.1 r_{t-1}^2 + 0.1 I_{\{r_{t-1}<0\}} r_{t-1}^2 + 0.85 \sigma_{t-1}^2 σt2=0.005+0.1rt12+0.1I{rt1<0}rt12+0.85σt12

描述了在给定时刻t条件异方差 σ t 2 \sigma_t^2 σt2的计算方式,其中包括过去的收益率 r t − 1 r_{t-1} rt1 及其平方,以及过去的条件异方差 σ t − 1 2 \sigma_{t-1}^2 σt12

检验残差白噪声:

sp_sigma = sp_model.sigma(sp_return)
sp_epsilon = sp_return / sp_sigma
# Ljung-Box检验
import statsmodels.api as sm
lb_test = sm.stats.acorr_ljungbox(sp_epsilon, lags=20, return_df=True)
print("Ljung-Box统计量和p-value:")
print(lb_test)

预测未来波动率:

n_steps = 10  
predicted_volatility1 = sp_model.sigma(sp_return)
simulated_returns1 = np.random.normal(0, np.sqrt(predicted_volatility1[-1]), size=n_steps)
print("模拟的未来数据:", simulated_returns1)

模型误差:

n_steps = 10  # 可以根据需要调整
trained_theta = sp_model.get_theta()
simulated_returns = np.zeros(n_steps)
for i in range(n_steps):
    current_volatility = sp_model.sigma(simulated_returns[:i+1])[-1]
    simulated_returns[i] = np.random.normal(0, np.sqrt(current_volatility))
actual_returns = sp_return[-n_steps:]
mse = mean_squared_error(actual_returns, simulated_returns)
print("拟合效果的均方误差 (MSE):", mse)
def mean_absolute_error(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))
def root_mean_squared_error(y_true, y_pred):
    return np.sqrt(np.mean((y_true - y_pred)**2))
mae = mean_absolute_error(actual_returns, simulated_returns)
print("拟合效果的均方误差 (MSE):", mae)
rmse = root_mean_squared_error(actual_returns, simulated_returns)
print("拟合效果的均方误差 (MSE):", rmse)

拟合DCC-GARCH模型:

DCC-GARCH 模型的结果通常包括两个参数,分别表示条件相关性矩阵 R t R_t Rt 的两个元素。通常,这两个参数可以表示为 α \alpha α β \beta β,其中 α \alpha α R t R_t Rt 的第一个元素, β \beta β是第二个元素。

dcc_model = DCC()
dcc_model.set_loss(dcc_loss_gen())
dcc_model.get_ab()

结果为array([0.78338396, 0.21630562])

DCC-GARCH 模型的方程式可以表示为:

R t = [ 1 a a 1 − b ] R_t = \begin{bmatrix} 1 & a \\ a & 1-b \end{bmatrix} Rt=[1aa1b]

其中 R t R_t Rt是条件相关性矩阵, α \alpha α β \beta β是模型拟合得到的参数。

根据给定的结果数组 ([0.78338396, 0.21630562]),可以将 α \alpha α β \beta β分别赋值给这两个参数。方程式变为:

R t = [ 1 0.78338396 0.78338396 1 − 0.21630562 ] R_t = \begin{bmatrix} 1 & 0.78338396 \\ 0.78338396 & 1-0.21630562 \end{bmatrix} Rt=[10.783383960.7833839610.21630562]

这个方程式描述了 DCC-GARCH 模型中条件相关性矩阵 R t R_t Rt的结构.

第一个元素 0.78338396较大,表示两个资产之间有较强的正相关性。而第二个元素
0.21630562 较小,表示两个资产之间的条件相关性较弱。

DCC-GARCH是一种基于条件相关性模型的统计方法,主要用于分析和建模时间序列数据中的相关性和波动性。 DCC是动态条件相关性模型的缩写,它假设相关性是随时间变化的,并使用时间依赖的权重来估计相关系数。DCC模型对于统计数据的灵活性很强,特别适用于金融市场中的股票和证券价格。 GARCH是广义自回归条件异方差模型的缩写,它用于建模和预测时间序列数据中的波动性。GARCH模型捕捉到了金融市场中的波动性聚集效应,即价格在相对较长时间段内呈现出高波动和低波动的交替状态。 DCC-GARCH模型结合了相关性和波动性的特点,它能够在估计相关系数时考虑波动性的变化。通过DCC-GARCH模型,我们可以获得条件相关系数矩阵和条件方差矩阵,从而更准确地估计和预测时间序列数据的相关性和波动性。 在Python中,我们可以使用一些库和包来实现DCC-GARCH模型的估计和预测,比如Statsmodels、arch和pyflux等。这些工具提供了方便的函数和方法,帮助我们构建和拟合DCC-GARCH模型,并生成相应的参数估计和预测结果。 总之,DCC-GARCH模型金融数据分析中具有重要的应用价值,它可以帮助我们更好地理解和预测时间序列数据中的相关性和波动性。通过Python中的相关库和包,我们可以方便地实现和应用DCC-GARCH模型,从而提高对金融市场的分析和预测能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值