本文聚焦于金融时间序列建模中的波动性模型,涵盖了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=1∑pαi⋅εt−i2
符号 | 解释 |
---|---|
σ t 2 \sigma_t^2 σt2 | 时间点 (t) 处的条件方差(波动率的平方) |
α 0 \alpha_0 α0 | 模型中的常数 |
α i \alpha_i αi | 模型中的系数,表示过去 (i) 期的残差项的影响 |
ε t − i \varepsilon_{t-i} εt−i | 时间点 (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=1∑pαi⋅εt−i2+j=1∑qβj⋅σt−j2
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⋅εt−12+β1⋅σt−12
符号 | 解释 |
---|---|
σ t 2 \sigma_t^2 σt2 | 时间点 (t) 处的条件方差(波动率的平方) |
ω \omega ω | 模型中的常数项 |
α i \alpha_i αi | 模型中的系数,表示过去 (i) 期的残差项的影响 |
β j \beta_j βj | 模型中的系数,表示过去 (j) 期的条件方差的影响 |
ε t − i \varepsilon_{t-i} εt−i | 时间点 (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=ω+α(rt−1−γ)2+βσt−12
符号 | 解释 |
---|---|
σ t 2 \sigma_t^2\ σt2 | 在时间 (t) 的条件异方差。 |
ω \omega\ ω | 常数。 |
α \alpha\ α | 条件异方差对过去收益率变动的反应系数。 |
r t − 1 r_{t-1} rt−1 | 过去的收益率。 |
γ \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+λϵt−1ϵt−1T=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,t100q22,t1][q11,tq12,tq12,tq22,t][q11,t100q22,t1]=[q11,t100q22,t1]Qt[q11,t100q22,t1]σsp,t2=ωsp+αsp⋅rsp,t−12+γsp⋅rsp,t−12⋅Isp,t−1−+βsp⋅σsp,t−12σjpm,t2=ωjpm+αjpm⋅rjpm,t−12+γjpm⋅rjpm,t−12⋅Ijpm,t−1−+βjpm⋅σjpm,t−12Qt=(1−a−b)⋅Qˉ+a⋅ϵt−1ϵt−1′+b⋅Qt−1Qˉ=T1t=1∑Tϵ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.1rt−12+0.1I{rt−1<0}rt−12+0.85σt−12
描述了在给定时刻t条件异方差 σ t 2 \sigma_t^2 σt2的计算方式,其中包括过去的收益率 r t − 1 r_{t-1} rt−1 及其平方,以及过去的条件异方差 σ t − 1 2 \sigma_{t-1}^2 σt−12。
检验残差白噪声:
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=[1aa1−b]
其中 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.783383961−0.21630562]
这个方程式描述了 DCC-GARCH 模型中条件相关性矩阵 R t R_t Rt的结构.
第一个元素 0.78338396较大,表示两个资产之间有较强的正相关性。而第二个元素
0.21630562 较小,表示两个资产之间的条件相关性较弱。