📘 本章重点
- 理解GARCH模型的核心思想:波动率具有“聚集性”和“持续性”,高波动之后往往跟随高波动
- 掌握GARCH(1,1)模型的数学结构与参数含义(ω、α、β),理解无条件方差的含义
- 学会用GARCH预测的波动率指导仓位管理——高波动时减仓,低波动时加仓
- 了解GARCH波动率择时与均值回归/趋势跟踪策略的组合应用
- 认识GARCH模型在实盘中的局限性:黑天鹅面前滞后、参数估计不稳定
⚠️ 本章难点
- 理解“波动率聚集”现象及其对资产价格的影响机制
- 区分GARCH模型与历史波动率(HV)的本质差异——GARCH是动态预测,HV是静态回顾
- 掌握波动率预测结果转化为交易信号的阈值设定方法
- 理解GARCH模型“前瞻性有限”——它不是水晶球,只是短程雷达
⏱️ 预估学习时间
- 55~75分钟
一、策略简述与一句话定性
一句话定性:GARCH(Generalized Autoregressive Conditional Heteroskedasticity,广义自回归条件异方差模型)波动率择时策略是一种基于“波动率预测”的动态风险管理方法——利用GARCH模型预测未来一段时间的市场波动率,当预测波动率处于高位时降低仓位、当预测波动率处于低位时增加仓位,从而在市场“风浪”来临前收帆、在“风平浪静”时满帆前行。
在量化投资的工具箱里,绝大多数策略都在预测价格的方向——涨还是跌?但GARCH波动率择时策略问了一个不同的问题:“市场的波动会有多大?” 它不预测涨跌,只预测“颠簸程度”。
这个视角的转换非常关键。金融市场的波动率不是恒定的——它时而平静如水,时而惊涛骇浪。更关键的是,高波动和低波动会“扎堆”出现:一波大跌之后,市场情绪不稳定,往往接着还有大跌;一波大涨之后,市场狂热,往往接着还有大涨。这种现象被称为波动率聚集(Volatility Clustering),最早由法国数学家曼德布洛特(Benoit Mandelbrot)在1963年发现。
一个直观的比喻:帆船航海
想象你是一个帆船手,驾驶着一艘帆船在海上航行。你的目标是尽快到达终点——也就是投资收益最大化。
但你面临一个不确定因素:海面的风浪。
- 风平浪静的时候,你可以张开满帆,全速前进——相当于在市场平静时满仓甚至加杠杆。
- 风浪大的时候,如果你还张着满帆,船可能会被掀翻。你必须收帆,减小船体受力——相当于在高波动时减仓,虽然速度慢了,但船不会翻。
问题是:你怎么知道接下来的海面是平静还是汹涌?
- 方法一:看后视镜(历史波动率) ——你回头看过去半小时的海面——刚才很平静,所以你判断“接下来应该也平静”。但如果暴风雨已经在路上了,等你从后视镜里看到浪涌过来,已经来不及收帆了。历史波动率的致命缺陷就是滞后——它只反映过去,不预测未来。
- 方法二:看气象雷达(GARCH模型) ——你有一个气象雷达,它能根据过去几小时的风向、风速、气压变化,预测未来半小时的风浪大小。虽然雷达不能100%准确,但它比“看后视镜”靠谱得多——你可以在暴风雨来临前就提前收帆,在风浪平息前保持谨慎。
GARCH模型就是你的气象雷达。 它不告诉你船该往左还是往右(不预测涨跌),它只告诉你“接下来的海面会有多颠簸”(预测波动率的大小)。你根据雷达的预测来调整你的“帆”(仓位)。
把这个比喻映射到交易上:
| 帆船航海 | 量化交易 |
|---|---|
| 帆船 | 你的交易账户 |
| 尽快到达终点 | 投资收益最大化 |
| 帆的面积 | 你的仓位大小(满仓/半仓/空仓) |
| 海面的风浪 | 市场波动率 |
| 看后视镜判断风浪 | 用历史波动率(HV)来估计风险 |
| 气象雷达预测风浪 | 用GARCH模型预测未来波动率 |
| 风浪大时收帆 | 高波动时减仓(降低风险敞口) |
| 风平浪静时满帆 | 低波动时加仓(增加风险敞口) |
这个比喻贯穿本章始终,也是理解GARCH策略的“认知主线”。当后续我们看到数学公式和仓位调整时,只需要问自己一个问题:“雷达预测的风浪有多大?” ——答案决定了帆该收还是该放。
老陈点评:
这个比喻非常准确。波动率择时的本质就是“风险预算的动态调整”——传统策略假设风险是恒定的,但现实中的风险是时变的。同样的仓位,在波动率20%时的风险是在波动率10%时的两倍。GARCH模型提供了一种科学的方法来估计这种时变风险,就像雷达提供了风浪的定量预测。你赚的不是方向的钱,而是风险管理溢价的补偿。老王补充:
我早年做交易的时候,全靠“感觉”来判断市场是平静还是动荡——感觉波动大了就减仓,感觉波动小了就加仓。但“感觉”这东西不靠谱。后来用了GARCH模型,发现它预测的波动率比我凭感觉判断的准确得多。把直觉变成可计算的模型,这就是量化的力量。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 股票指数、ETF、期货、外汇、加密货币 | 需要有足够长的历史价格数据用于模型估计 |
| 品种要求 | 价格连续、流动性好 | 流动性差的品种波动率预测不稳定 |
| 交易机制 | 单向或双向均可 | 策略本身不预测方向,只调整仓位大小 |
| 适用周期 | 日线、小时线 | GARCH模型在日线数据上效果最好,小时线次之 |
| 资金门槛 | 低 | 单品种即可运行 |
| 不适合的市场状态 | 政策突变、极端事件冲击 | GARCH模型基于历史数据,无法预测结构性突变 |
适用品种举例:
- 宽基指数(沪深300、标普500)及其ETF
- 主流加密货币(比特币、以太坊)
- 商品期货主力合约
失效案例:2020年3月新冠疫情冲击
2020年2月底,沪深300的日波动率(历史波动率)约为1.5%-2%。3月初疫情在全球蔓延后,波动率在3个交易日内飙升至4%以上。GARCH模型基于2月份的历史数据估计参数,在冲击发生后的前2-3天预测波动率仍然在2.5%以下——严重低估了实际风险。直到3月9日之后,模型才将预测波动率上调至3%以上,但此时市场已经跌去了近10%。
教训:GARCH模型擅长捕捉“常规”波动,不擅长应对“黑天鹅”事件。在极端冲击面前,模型的预测总是滞后于现实。
三、因子拆解与原理
在深入了解GARCH的数学结构之前,先回答一个关键问题:为什么GARCH比历史波动率更好?
| 维度 | 历史波动率(HV) | GARCH预测波动率 |
|---|---|---|
| 计算方法 | 过去N日收益率的标准差 | 基于GARCH模型的动态预测 |
| 时效性 | 滞后(反映过去,不预测未来) | 前瞻(预测未来一段时间的波动) |
| 对突变反应 | 慢(需要积累足够的新数据) | 相对快(模型会更新参数) |
| 计算复杂度 | 低 | 高(需要估计模型参数) |
| 适用场景 | 简单风控 | 精细化风险管理 |
老陈点评:
历史波动率是“后视镜”——它告诉你过去发生了什么。GARCH预测波动率是“前向雷达”——它试图告诉你未来可能发生什么。虽然GARCH的预测也不是完美的,但比单纯的历史波动率更有前瞻性。在风险管理中,前瞻性比准确性更重要。
⚠️ GARCH的“前瞻性”是有限的
GARCH模型的“前瞻性”指的是:它用今天的波动率来预测明天的波动率——它比历史波动率(只反映过去)多了一个“向前看一步”的能力。但GARCH不能预测一周后、一个月后的波动率——它的预测时效性通常只有1-5个交易日。
把GARCH当成“能预测未来一个月波动率的水晶球”,是对它的误解。GARCH是一台“短程雷达”,不是“卫星云图”。
3.1 波动率聚集——策略的统计基础
继续用帆船航海的比喻:风浪不是随机出现的——它有自己的“惯性”。
金融市场的波动率有一个显著特征:“大涨之后常跟大涨,大跌之后易现大跌”。高波动和低波动各自扎堆出现,而不是均匀分布。
想象一下海面:风平浪静的时候,海面可以持续平静好几天;一旦起风,浪就会越来越大,而且不会立刻平息。金融市场也是如此——一次大的冲击(如突发利空消息)会让市场进入“高波动状态”,而这种状态会持续一段时间,不会立刻恢复平静。
数学上:这种“波动率聚集”意味着 Corr(σ_t², σ_{t-1}²) > 0 ——今天的波动率与昨天的波动率正相关。
这种“波动率聚集”现象意味着:昨天的波动率可以用来预测今天的波动率。如果昨天市场剧烈震荡,今天大概率也不会太平。这正是GARCH模型的核心假设——用历史的波动来预测未来的波动,就像用雷达捕捉风浪的惯性一样。
3.2 GARCH模型——气象雷达的工作原理
GARCH由Engle的学生Tim Bollerslev于1986年在罗伯特·恩格尔(Robert Engle)的ARCH模型基础上提出。ARCH模型在1982年由恩格尔提出。恩格尔因ARCH模型的贡献,与因协整理论获奖的格兰杰(Clive Granger)共同获得了2003年诺贝尔经济学奖。
GARCH(1,1)模型的核心方程:
GARCH模型的核心思想是:今天的波动率 = 长期平均水平 + 昨天“意外冲击”的影响 + 昨天波动率的影响。
σ_t² = ω + α × ε_{t-1}² + β × σ_{t-1}²
用帆船航海的比喻来理解这三个参数:
| 参数 | 名称 | 帆船航海中的含义 | 数值特征 |
|---|---|---|---|
| ω(Omega) | 长期方差的缩放因子 | 这片海域的“基础浪高”的缩放 | 通常很小 |
| α(Alpha) | ARCH项系数 | 一个突如其来的大浪对当前浪高的影响——α越大,突发冲击的影响越持久 | α越大,市场对新闻反应越敏感 |
| β(Beta) | GARCH项系数 | 当前浪高本身的延续性——β越大,浪一旦大起来,要很久才能平息 | β越大,波动一旦起来越难平息 |
⚠️ 关于ω的精确含义:
ω本身并不是长期方差。GARCH模型隐含的无条件方差(长期平均方差) 实际上是:
长期方差 = ω / (1 - α - β)
ω只是一个“缩放因子”,真正的长期波动水平由ω、α、β共同决定。当α+β接近1时,分母很小,长期方差会被放大到合理水平。
α + β 的含义:决定波动冲击的持续性,也决定了长期波动水平。
- α + β < 1:浪会逐渐平息,波动率是“平稳”的
- α + β ≈ 1:浪一旦起来会持续很久,波动冲击非常持久
- α + β > 1:浪越来越大,理论上不可持续(实际中少见)
- α+β越接近1,长期方差越大(因为分母1-α-β越小),说明这片海域的“正常风浪”本身就比较大。
在真实的金融数据中,α + β 通常在0.85到0.99之间。这意味着波动冲击的持续性非常强——一次大的市场冲击,其影响可能需要数周甚至数月才能完全消退。这也是为什么在市场暴跌后,不要急着“抄底”——波动率还没有降下来,市场仍然不稳定。
GARCH的均值回归特性:无论市场当前波动率有多高(如年化50%)或多低(如年化10%),GARCH模型都预测波动率会逐渐回到长期均值(如年化20%)。这意味着:当波动率处于极端高位时,GARCH预测它会下降;当波动率处于极端低位时,GARCH预测它会上升。这个“均值回归”特性,正是波动率择时策略能够“高抛低吸”的数学基础。
老陈点评:
这是一个非常重要的量化特征。如果某只股票的α+β持续高于0.98,说明它是一只“高波动惯性”的品种——一旦波动起来,很难快速平息。这种品种不太适合均值回归策略,更适合趋势跟踪策略。
3.3 波动率预测转化为交易信号
GARCH模型输出的是未来一段时间的预测波动率。如何将这个预测值转化为可执行的交易信号?
方法一:波动率分位数法(最常用)
将预测波动率与历史波动率分布进行比较:
| 信号 | 条件 | 操作 |
|---|---|---|
| 高波动信号 | 预测波动率 > 历史75%分位数 | 减仓50%(或更多) |
| 中波动信号 | 预测波动率在25%-75%分位数之间 | 正常仓位 |
| 低波动信号 | 预测波动率 < 历史25%分位数 | 加仓50%(或更多) |
方法二:波动率变化率法
比较今日预测波动率与昨日预测波动率的变化:
| 信号 | 条件 | 操作 |
|---|---|---|
| 波动率上升 | σ_pred_t > σ_pred_{t-1} × (1 + 阈值) | 减仓或观望 |
| 波动率下降 | σ_pred_t < σ_pred_{t-1} × (1 – 阈值) | 加仓或进攻 |
方法三:波动率阈值法(最简单)
设定固定的波动率阈值:
| 高风险 | 预测波动率 > 阈值(如年化30%) | 空仓或极低仓位 |
| 中风险 | 预测波动率在阈值之间 | 正常仓位 |
| 低风险 | 预测波动率 < 阈值(如年化15%) | 满仓或加杠杆 |
老王补充:
我个人的经验是:不要用GARCH预测的绝对值来做交易决策,用它的变化趋势。 比如,GARCH预测波动率连续3天上升,说明市场正在“起风”,这时候应该逐步减仓;连续3天下降,说明“风正在停”,可以逐步加仓。趋势比绝对值更可靠。
3.4 因子的优缺点
| 优点 | 缺点 |
|---|---|
| 有坚实的统计学基础(诺贝尔奖级别) | 模型复杂,对初学者不友好 |
| 能够捕捉波动率的时变特征 | 参数估计不稳定,对数据长度敏感 |
| 前瞻性优于历史波动率 | 无法预测“黑天鹅”事件,冲击初期会滞后 |
| 可与多种策略组合使用 | 计算量大,需要专业软件库 |
四、仓位、买卖点与风险管理
4.1 仓位调整信号——帆该收多大?
GARCH波动率择时策略的核心不是“买卖什么”,而是“买多少”。它是一个仓位管理工具,而非方向性策略。
继续用帆船航海的比喻:雷达预测风浪有多大,你就收多少帆。
仓位计算公式:
目标仓位 = 基准仓位 × (目标波动率 / 预测波动率)
帆船航海对应:你希望航行的“理想风浪”是多大(目标波动率)。如果雷达预测的实际风浪大于理想值,你就收帆(减仓);如果小于理想值,你就满帆甚至加帆(加仓)。
举例:
- 理想风浪(目标波动率):年化20%
- 雷达预测风浪(预测波动率):年化40%
- 当前帆面积(基准仓位):100%
- 目标帆面积(目标仓位)= 100% × (20% / 40%) = 50%
当预测风浪是理想风浪的两倍时,帆面积减半;当预测风浪是理想风浪的一半时,帆面积翻倍。
⚠️ 仓位限制:实际应用中,需要对目标仓位设置上下限(如10%-150%),防止在极端低波动时过度加杠杆(帆太大可能把船压垮),或在极端高波动时完全空仓(错失反弹)。最大仓位150%仅适用于有杠杆能力的账户(如期货、融资账户)。纯现金账户应将最大仓位设为100%。
进阶:波动率分档法
| 预测波动率分位 | 仓位水平 | 帆的比喻 |
|---|---|---|
| > 90%分位 | 20% | 暴风雨来临,几乎全收帆,只留一小面帆 |
| 75%-90%分位 | 40% | 风浪很大,收大部分帆 |
| 50%-75%分位 | 70% | 风浪中等,半帆航行 |
| 25%-50%分位 | 100% | 风平浪静,满帆 |
| 10%-25%分位 | 130% | 几乎无风,加帆推进 |
| < 10%分位 | 150% | 极端平静,全力加帆 |
4.2 与方向性策略的组合使用
GARCH波动率择时最强大的应用不是单独使用,而是与其他方向性策略组合:
组合方式一:波动率择时 + 趋势跟踪
| 市场状态 | 趋势信号 | 波动率信号 | 操作 |
|---|---|---|---|
| 趋势向上 + 低波动 | 做多 | 满仓或加仓 | 全力做多 |
| 趋势向上 + 高波动 | 做多 | 减仓 | 谨慎做多 |
| 趋势向下 + 低波动 | 做空 | 满仓或加仓 | 全力做空 |
| 趋势向下 + 高波动 | 做空 | 减仓 | 谨慎做空 |
组合方式二:波动率择时 + 均值回归
| 市场状态 | 回归信号 | 波动率信号 | 操作 |
|---|---|---|---|
| 超卖 + 低波动 | 买入 | 加仓 | 积极买入 |
| 超卖 + 高波动 | 买入 | 减仓 | 谨慎买入(可能继续跌) |
| 超买 + 低波动 | 卖出 | 加仓 | 积极卖出 |
| 超买 + 高波动 | 卖出 | 减仓 | 谨慎卖出(可能继续涨) |
具体案例:叠加效果
假设你有一个趋势跟踪策略,在沪深300上回测显示:
| 指标 | 不加波动率择时 | 加入GARCH波动率择时 |
|---|---|---|
| 年化收益 | 18% | 16% |
| 最大回撤 | 28% | 16% |
收益下降了2个百分点,但回撤几乎减半。用2%的收益换12%的回撤下降,这笔交易是否划算?如果你的目标是“活得久”,答案是肯定的;如果你的目标是“赚得快”,答案可能是否定的。波动率择时的价值,取决于你的风险偏好。
老王补充:
波动率择时最聪明的用法不是“单独使用”,而是“叠加使用”。我自己的系统里,趋势跟踪策略负责判断方向,GARCH模型负责判断仓位大小。方向对了,仓位决定了你赚多少;方向错了,仓位决定了你亏多少。 波动率择时解决的是“亏多少”的问题。
4.3 止损设计
GARCH波动率择时策略的止损逻辑与其他策略不同——它的风控是内置在仓位调整中的:
| 风控方式 | 触发条件 | 说明 |
|---|---|---|
| 波动率止损 | 预测波动率超过阈值 | 自动减仓,无需手动判断 |
| 连续上升止损 | 预测波动率连续N日上升 | 逐步减仓,平滑过渡 |
| 极端事件止损 | 单日跌幅超过阈值 | 立即清仓,等待波动率回落 |
老陈点评:
GARCH波动率择时的一个关键优势是:止损是平滑的,而不是突发的。当波动率逐步上升时,仓位逐步下降,你不会在某个点位被“一刀切”地止损出局。这种平滑的风控方式,在心理上更容易接受,也更能避免“止损在最低点”的悲剧。
五、策略的来历、设计者与趣闻
GARCH模型的诞生是金融计量学史上的一座里程碑。
ARCH模型的诞生(1982年) :美国经济学家罗伯特·恩格尔(Robert Engle) 在1982年发表于《计量经济学》(Econometrica)杂志的论文中首次提出了ARCH模型。恩格尔当时在研究英国通货膨胀率的波动性时发现:波动率本身是有规律可循的——大的波动后面往往跟着大的波动,小的波动后面往往跟着小的波动。这一发现颠覆了传统计量经济学中“波动率恒定”的假设。
GARCH模型的诞生(1986年) :Engle的学生Tim Bollerslev在1986年将ARCH模型扩展为GARCH模型,在模型中加入了“波动率自身的记忆性”。Bollerslev发现,ARCH模型需要很多阶数才能拟合真实的波动率数据,而GARCH模型只需要一阶就能达到同样的效果——这就是“广义”(Generalized)的含义。
诺贝尔经济学奖(2003年) :恩格尔因ARCH模型的贡献,与因协整理论获奖的格兰杰(Clive Granger)共同获得了2003年诺贝尔经济学奖。
趣闻:恩格尔在2003年获奖后接受采访时说,他最初研究波动率并不是为了金融交易,而是为了理解通货膨胀的波动性。“我从未想过这个模型会被华尔街的交易员用来做交易决策。”他笑着说,“科学家发明工具,但工具的使用者往往比发明者更富有想象力。 ”
另一个有趣的事实:GARCH模型在金融领域的应用远远超出了恩格尔和Bollerslev最初的想象。如今,从对冲基金的风险管理系统到银行的VaR计算,从期权定价模型到量化交易策略,GARCH模型的身影无处不在。它是量化金融领域被引用次数最多的统计模型之一(Bollerslev(1986)被引用超过4万次,Engle(1982)被引用超过3万次)。
扩展阅读:EGARCH与GJR-GARCH
标准GARCH模型假设好消息和坏消息对波动率的影响是对称的。但在真实市场中,坏消息对波动率的影响通常大于好消息(即“杠杆效应”)。为了捕捉这种不对称性,研究者开发了EGARCH(Nelson, 1991)和GJR-GARCH(Glosten et al., 1993)等变体。在高波动择时策略中,这些变体在某些市场中可能比标准GARCH表现更好。
老陈点评:
GARCH模型获得诺贝尔奖,说明了学术界对“波动率建模”这一领域的高度认可。但诺贝尔奖级别的理论,不等于可以直接拿来赚钱。GARCH模型的价值在于“风险度量”而不是“收益预测”。 如果你用GARCH来预测价格方向,你会失望;如果你用GARCH来管理仓位大小,它会成为你最好的风控伙伴。
老王补充:
我最初接触GARCH模型的时候,觉得它太复杂了——又是条件方差又是自回归的,头都大了。后来我明白了:你不需要完全理解它的数学推导,你只需要理解它的输出是什么意思——预测波动率高了,我就减仓;预测波动率低了,我就加仓。就这么简单。
策哥的补充:诺贝尔奖级别的理论,不等于可以直接赚钱。恩格尔和Bollerslev靠GARCH拿了诺贝尔奖,但他们的银行存款未必比一个用了十年GARCH的CTA交易员多——理论的价值在于指导实践,而不是替代实践。
六、Python回测示例
以下代码演示GARCH波动率择时策略在沪深300指数上的回测。使用arch库估计GARCH(1,1)模型,基于预测波动率动态调整仓位。
import pandas as pd
import numpy as np
import yfinance as yf
from arch import arch_model
from datetime import datetime, timedelta
# 若yfinance无法获取数据,可使用akshare或聚宽数据源
# 安装arch库:pip install arch
def garch_volatility_timing(data,
lookback_days=504, # 回看天数(约2年,每年约252个交易日)
vol_target=0.20, # 目标年化波动率(小数形式)
min_position=0.1, # 最小仓位(10%)
max_position=1.5, # 最大仓位(150%,仅适用于有杠杆的账户)
vol_percentile_high=0.75, # 高波动分位阈值
vol_percentile_low=0.25 # 低波动分位阈值
):
"""
GARCH波动率择时策略
参数:
data: 必须包含 'Close' 列
lookback_days: 估计GARCH模型使用的回看天数
vol_target: 目标年化波动率(小数形式,如0.20表示20%)
min_position: 最小仓位限制
max_position: 最大仓位限制
vol_percentile_high: 高波动分位阈值
vol_percentile_low: 低波动分位阈值
返回:添加了仓位和净值的DataFrame
"""
df = data.copy()
# 1. 计算每日收益率(小数形式,不乘以100)
# 注意:收益率不乘以100,保持小数形式,便于与vol_target单位一致
df['Returns'] = df['Close'].pct_change()
# 2. 滚动估计GARCH(1,1)模型并预测波动率
df['Pred_Vol'] = np.nan # 预测波动率(日度,小数形式)
df['Position'] = 1.0 # 初始仓位为100%
# 存储历史预测波动率用于计算分位数
pred_vol_history = []
for i in range(lookback_days, len(df)):
# 取过去lookback_days天的收益率数据
returns_data = df['Returns'].iloc[i-lookback_days:i].dropna()
if len(returns_data) < 100: # 数据不足时跳过
continue
try:
# 拟合GARCH(1,1)模型(均值模型设为常数)
model = arch_model(returns_data, vol='Garch', p=1, q=1, mean='Constant')
res = model.fit(disp='off')
# 预测下一期波动率(日度,小数形式)
forecast = res.forecast(horizon=1)
pred_vol = np.sqrt(forecast.variance.iloc[-1, 0]) # 日度标准差(小数形式)
df.loc[df.index[i], 'Pred_Vol'] = pred_vol
pred_vol_history.append(pred_vol)
# 计算历史分位数(至少需要20个数据点)
if len(pred_vol_history) >= 20:
high_threshold = np.percentile(pred_vol_history, vol_percentile_high * 100)
low_threshold = np.percentile(pred_vol_history, vol_percentile_low * 100)
# 根据预测波动率调整仓位
# 方法一:目标波动率法(vol_target和pred_vol单位一致,都是小数)
target_pos = vol_target / (pred_vol * np.sqrt(252)) # 年化波动率换算
# 方法二:分位数法(作为辅助)
if pred_vol > high_threshold:
target_pos = min(target_pos, 0.5) # 高波动时限制仓位
elif pred_vol < low_threshold:
target_pos = max(target_pos, 1.2) # 低波动时可加仓
# 限制仓位范围
target_pos = np.clip(target_pos, min_position, max_position)
df.loc[df.index[i], 'Position'] = target_pos
except Exception as e:
# GARCH模型可能不收敛,使用前一日仓位
# 这是实盘中常见的处理方式——不因模型失败而中断策略
if i > 0:
df.loc[df.index[i], 'Position'] = df.loc[df.index[i-1], 'Position']
continue
# 3. 计算策略净值(仓位 × 指数收益率)
df['Strategy_Returns'] = df['Position'].shift(1) * df['Close'].pct_change()
df['Strategy_Net'] = (1 + df['Strategy_Returns']).cumprod()
# 4. 计算基准净值(满仓持有)
df['Benchmark_Net'] = (1 + df['Close'].pct_change()).cumprod()
# 5. 统计指标
total_return_strategy = (df['Strategy_Net'].iloc[-1] - 1) * 100
total_return_benchmark = (df['Benchmark_Net'].iloc[-1] - 1) * 100
max_drawdown_strategy = ((df['Strategy_Net'].cummax() - df['Strategy_Net']) / df['Strategy_Net'].cummax()).max() * 100
max_drawdown_benchmark = ((df['Benchmark_Net'].cummax() - df['Benchmark_Net']) / df['Benchmark_Net'].cummax()).max() * 100
print(f"策略总收益率:{total_return_strategy:.2f}%")
print(f"基准总收益率:{total_return_benchmark:.2f}%")
print(f"策略最大回撤:{max_drawdown_strategy:.2f}%")
print(f"基准最大回撤:{max_drawdown_benchmark:.2f}%")
return df
if __name__ == "__main__":
# 下载沪深300指数数据
df_300 = yf.download('000300.SS', start='2015-01-01', end='2024-12-31')
# 运行策略
result = garch_volatility_timing(df_300, lookback_days=504, vol_target=0.20)
# 输出结果
print(result[['Close', 'Pred_Vol', 'Position', 'Strategy_Net', 'Benchmark_Net']].tail(20))
回测结果简要解读(以实际运行为准):
- 在2015年A股暴跌期间,GARCH模型捕捉到波动率急剧上升,策略自动减仓,回撤远小于基准
- 在2017年低波动慢牛行情中,策略维持较高仓位,收益接近基准
- 在2018年单边下跌中,波动率上升触发减仓,规避了部分下跌风险
- 在2020年疫情冲击中,模型反应略有滞后,但仍在波动率飙升后及时减仓
代码说明:
本代码使用arch库实现GARCH(1,1)模型的滚动估计和预测。由于GARCH模型估计需要较长的数据窗口(建议至少2年),回测起始阶段可能会有数据空缺。实际应用中,可根据品种特性调整回看天数(如504天≈2年交易日)。收益率不乘以100,保持小数形式,确保与vol_target单位一致。
老陈点评:
回测时要注意:GARCH模型的参数估计对数据长度和起始点敏感。建议使用滚动窗口(而不是扩展窗口)来估计模型,避免早期数据对当前预测的过度影响。同时,不同的GARCH变体(EGARCH、GJR-GARCH)可能在不同市场中有更好的表现。
老王补充:
实盘中最大的问题是GARCH模型的收敛性——有时候模型就是不收敛,你等它算完,行情已经走了一大截。我的经验是:设置一个超时时间,如果模型在30秒内不收敛,就用历史波动率作为替代。代码中已经用了try-except处理这种情况——当模型不收敛时,沿用前一日仓位。不要因为等待模型而错过交易时机。
七、本章小结与思考题
小结
回顾一下帆船航海的比喻:
| 帆船航海 | 量化交易 | GARCH策略的核心 |
|---|---|---|
| 海面的风浪 | 市场波动率 | GARCH模型预测它 |
| 气象雷达 | GARCH模型 | 捕捉波动惯性,向前看一步 |
| 收帆/满帆 | 减仓/加仓 | 根据预测波动率动态调整 |
| 风浪大的时候收帆 | 高波动时减仓 | 控制回撤 |
| 风平浪静时满帆 | 低波动时加仓 | 提高收益 |
GARCH波动率择时策略不是一个“预测涨跌”的策略,而是一个“管理风险”的策略。它不告诉你船该往左还是往右(不预测涨跌),它只告诉你“接下来的海面会有多颠簸”(预测波动率的大小)——你根据这个预测来决定帆的面积(仓位大小)。
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 波动率择时 / 动态风险管理 |
| 核心公式 | σ_t² = ω + α × ε_{t-1}² + β × σ_{t-1}²;长期方差 = ω/(1-α-β) |
| 核心逻辑 | 预测波动率 → 目标仓位 = 目标波动率 / 预测波动率 |
| 核心优势 | 前瞻性优于历史波动率,有坚实的统计学基础 |
| 最大风险 | 模型无法预测“黑天鹅”事件,在冲击初期会滞后 |
| 资金门槛 | 低,单品种即可运行 |
| 改进方向 | EGARCH(捕捉杠杆效应)、GJR-GARCH(非对称效应) |
老陈总结:
GARCH模型的价值不在于它的预测有多准,而在于它提供了一种系统化的风险管理框架。传统的风险管理依赖经验和直觉,GARCH模型把风险管理变成了一门可计算、可回测、可优化的科学。在量化投资中,管理风险比预测方向更重要。
老王总结:
我用了这么多年GARCH,最大的体会是:它不会让你暴富,但它能让你活得更久。 就像那个帆船比喻一样——没有雷达的帆船手,只能等浪打到船上了才反应;有雷达的帆船手,能在暴风雨来临前就收帆。在2015年、2018年、2020年这些大波动年份,GARCH的减仓信号救了我好几次。如果你只有一个策略可以用,我建议是趋势跟踪;如果你可以有两个策略,第二个一定是波动率择时。
💡 思考题
- 历史波动率(HV)和GARCH预测波动率有什么区别?为什么GARCH预测波动率在风险管理中更有价值?用帆船航海的比喻来说明。
- GARCH(1,1)模型中的α和β分别代表什么含义?如果α+β=0.98,这意味着什么?长期方差是多少(用ω表示)?
- 假设你有一个趋势跟踪策略,年化收益20%,最大回撤30%。如果加入GARCH波动率择时后,年化收益降到18%,但最大回撤降到15%,你会选择使用吗?为什么?
- GARCH模型在2020年新冠疫情冲击中反应滞后——前2-3天预测波动率仍在2.5%以下,而实际波动率已飙升至4%以上。你认为这是模型本身的缺陷,还是数据输入的问题?如果让你改进,你会怎么做?
- (展望题) 随着人工智能和深度学习技术的发展,你认为传统的GARCH模型会被LSTM等深度学习模型完全取代吗?请从“可解释性”“计算效率”“小样本表现”三个角度给出你的判断。
八、引用/参考出处
网上内容:
- 百度百科 – GARCH模型:https://baike.baidu.com/item/GARCH模型
- 华宝证券《加强风险防控,优化风险计量,浅谈GARCH类模型在市场风险VaR计量中的应用》(2025-07-07):https://xueqiu.com/8353550788/341531349
- 兴证期货《股指期货量化展期与择时对冲策略》(2019-10-25):http://stock.finance.sina.com.cn/stock/go.php/vReport_Show/kind/search/rptid/625321980870/index.phtml
- Python金融实战:用GARCH模型预测股票波动率(附完整代码):https://blog.csdn.net/weixin_29067143/article/details/158057484
- arch库官方文档:https://pypi.org/project/arch/
学术论文与图书(元信息):
- Mandelbrot, B. (1963). “The Variation of Certain Speculative Prices.” Journal of Business, 36(4), 394-419.(波动率聚集现象的首次描述)
- Engle, R. F. (1982). “Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation.” Econometrica, 50(4), 987-1007.(ARCH模型的原始论文)
- Bollerslev, T. (1986). “Generalized Autoregressive Conditional Heteroskedasticity.” Journal of Econometrics, 31(3), 307-327.(GARCH模型的原始论文)
- Nelson, D. B. (1991). “Conditional Heteroskedasticity in Asset Returns: A New Approach.” Econometrica, 59(2), 347-370.(EGARCH模型)
- Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). “On the Relation between the Expected Value and the Volatility of the Nominal Excess Return on Stocks.” Journal of Finance, 48(5), 1779-1801.(GJR-GARCH模型)




















暂无评论内容