标的:shibor7d
实证研究模型:E-Garch模型
E-Garch介绍:
一、背景与动机
在金融市场中,负面消息(如股价下跌)通常比正面消息(如股价上涨)更容易引发更大的波动。这种现象被称为杠杆效应(leverage effect)。标准GARCH模型假设正负冲击对波动率的影响是对称的,无法捕捉这种非对称性。E-GARCH模型通过引入对数形式的条件方差方程,自然地允许正负冲击产生不同的影响,且保证条件方差始终为正(无需参数约束)。
Q:为何不直接使用标准差或者方差来衡量波动性呢?
1. 静态 vs. 动态:无法捕捉“波动聚集性”
标准差的缺陷: 标准差是一个静态指标。如果你用“走廊实施前”的数据算一个标准差,用“走廊实施后”的数据算一个标准差,你只能得到两个孤立的数值。这忽略了时间序列内部的动态变化。
现实市场的特征: 金融市场(包括利率)有一个显著特征叫波动聚集(Volatility Clustering)。也就是说,高波动的时期往往会集中在一起(比如市场恐慌时),低波动的时期也往往会集中在一起。
E-GARCH的优势: E-GARCH模型是动态的。它能捕捉到“今天的波动率受昨天波动率影响”的这种持续性。它能告诉你,在实施利率走廊后,这种“波动聚集”的强度是否减弱了,而不仅仅是平均波动水平是否变了。
2. 忽略“尖峰厚尾”与极端风险
标准差的缺陷: 标准差基于正态分布假设。但在现实中,利率或资产收益率往往呈现“尖峰厚尾”特征——即极端大幅波动(暴涨暴跌)发生的概率远高于正态分布的预测。
E-GARCH的优势: E-GARCH模型专门就是为了处理这种厚尾特征而设计的。它能更准确地估计极端风险(VaR)。在评估货币政策工具时,我们不仅关心日常波动,更关心它能否防止极端的流动性危机或利率飙升。
3. 缺乏对“杠杆效应”或“非对称效应”的捕捉
标准差的缺陷: 标准差对上涨和下跌的反应是对称的。但在金融现实中,负面冲击(如利率突然飙升)往往比正面冲击(利率突然暴跌)带来更大的后续波动。
E-GARCH的优势: 这是E-GARCH(指数GARCH)相对于普通GARCH最大的改进。它能捕捉这种非对称效应。
例如:当市场出现负面冲击导致利率剧烈波动时,E-GARCH模型中的参数会显著变化,反映出市场恐慌情绪的持续。而简单的标准差无法区分这种方向性的影响。
4. 无法分离“长期趋势”与“短期冲击”
标准差的缺陷: 如果你分段计算标准差,可能会误判。比如,实施利率走廊后,刚好遇到全球经济大环境变好,利率波动自然变小。这时你用标准差对比,可能会错误地将功劳归于利率走廊,而忽略了外部宏观因素。
E-GARCH的优势: E-GARCH模型将波动率分解为:长期均衡波动率 + 短期冲击。
这意味着,即使外部环境嘈杂,E-GARCH也能帮你识别出:利率走廊的实施是否从根本上降低了市场的长期不确定性(即结构性的改变),而不仅仅是巧合地赶上了平静期。
二、E-GARCH模型的基本形式
2.1 数学表达

ω:常数项;
α:衡量冲击大小(绝对值)对波动率的影响;
γ:衡量冲击方向(符号)的非对称效应;
若 γ<0,说明负冲击(坏消息)比正冲击(好消息)导致更大的波动(即存在杠. 杆效应);
β:衡量波动率的持续性(类似GARCH项)。
2.2 E-Garch的形象化
在E-Garch(1,1)情况下
今天的对数波动率 = 长期平均水平 + 昨天冲击有多大(绝对值) + 昨天是涨还是跌(符号) + 昨天波动本身的惯性
三、E-Garch模型的代码实现(python)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from arch import arch_model
# ==========================================
# 1. 【数据读取】
# ==========================================
file_path = '/Volumes/download/Shibor历史数据.csv'
# 读取CSV文件
df = pd.read_csv(file_path, sep=',', header=0)
# 将 'date' 列转换为日期格式,并设为索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
print("原始数据前5行:")
print(df.head())
# ==========================================
# 2. 【数据预处理】关键步骤:计算收益率/差分
# ==========================================
# 注意:SHIBOR 是利率水平,直接对水平值建模波动率没有意义。
# 我们需要研究的是利率的“变化量” (即一阶差分)。
# 计算一阶差分 (即今天的利率 - 昨天的利率)
# dropna() 会自动删除第一个缺失值
returns = df['value'].diff().dropna()
y = returns
print(f"\n处理后的收益率数据 (前5行),共 {len(y)} 个数据点:")
print(y.head())
# ==========================================
# 3. 【构建并拟合 EGARCH 模型】
# ==========================================
# 定义模型
# mean='Zero': 假设均值为0 (利率变化通常难以预测,均值接近0)
# vol='EGARCH': 指定波动率模型为 EGARCH
# p=1, q=1: 表示 EGARCH(1,1) 模型
# dist='t': 假设残差服从t分布 (金融数据通常有厚尾特征,比正态分布更准确)
model = arch_model(y,
mean='Zero',
vol='EGARCH',
p=1,
q=1,
dist='t')
# 拟合模型 (disp='off' 用于关闭优化过程的冗余输出)
fitted_model = model.fit(disp='off')
# ==========================================
# 4. 【输出结果】
# ==========================================
print("\n" + "="*50)
print("EGARCH 模型拟合结果摘要:")
print("="*50)
print(fitted_model.summary())
# ==========================================
# 5. 【可视化】
# ==========================================
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# 绘制收益率
axes[0].plot(y)
axes[0].set_title('SHIBOR Rate Changes (First Difference)')
axes[0].grid(True)
# 绘制 EGARCH 模型拟合的波动率
axes[1].plot(fitted_model.conditional_volatility)
axes[1].set_title('Conditional Volatility (Fitted by EGARCH)')
axes[1].grid(True)
plt.tight_layout()
plt.show()
结果:

描述性统计
Zero Mean - EGARCH Model Results
====================================================================================
Dep. Variable: value R-squared: 0.000
Mean Model: Zero Mean Adj. R-squared: 0.000
Vol Model: EGARCH Log-Likelihood: 3134.06
Distribution: Standardized Student's t AIC: -6260.12
Method: Maximum Likelihood BIC: -6236.45
No. Observations: 2744
Date: Sun, Dec 28 2025 Df Residuals: 2744
Time: 17:07:41 Df Model: 0
Volatility Model
========================================================================
coef std err t P>|t| 95.0% Conf. Int.
------------------------------------------------------------------------
omega 0.9347 1.349 0.693 0.489 [ -1.710, 3.579]
alpha[1] 1.6598 1.663 0.998 0.318 [ -1.599, 4.919]
beta[1] 0.9830 5.340e-03 184.080 0.000 [ 0.973, 0.993]
Distribution
========================================================================
coef std err t P>|t| 95.0% Conf. Int.
------------------------------------------------------------------------
nu 2.0500 0.103 19.832 1.589e-87 [ 1.847, 2.253]
========================================================================
Covariance estimator: robust