第二.06 GARCH波动率择时策略

📘 本章重点

  • 理解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的减仓信号救了我好几次。如果你只有一个策略可以用,我建议是趋势跟踪;如果你可以有两个策略,第二个一定是波动率择时。

💡 思考题

  1. 历史波动率(HV)和GARCH预测波动率有什么区别?为什么GARCH预测波动率在风险管理中更有价值?用帆船航海的比喻来说明。
  2. GARCH(1,1)模型中的α和β分别代表什么含义?如果α+β=0.98,这意味着什么?长期方差是多少(用ω表示)?
  3. 假设你有一个趋势跟踪策略,年化收益20%,最大回撤30%。如果加入GARCH波动率择时后,年化收益降到18%,但最大回撤降到15%,你会选择使用吗?为什么?
  4. GARCH模型在2020年新冠疫情冲击中反应滞后——前2-3天预测波动率仍在2.5%以下,而实际波动率已飙升至4%以上。你认为这是模型本身的缺陷,还是数据输入的问题?如果让你改进,你会怎么做?
  5. (展望题) 随着人工智能和深度学习技术的发展,你认为传统的GARCH模型会被LSTM等深度学习模型完全取代吗?请从“可解释性”“计算效率”“小样本表现”三个角度给出你的判断。

八、引用/参考出处

网上内容

学术论文与图书(元信息)

  • 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模型)
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容