4、波动率管理:波动率的定义与计算

波动率这东西,说白了就是市场情绪的体温计。我做了这么多年量化,见过太多人盯着收益率看,却忽略了波动率这个隐形杀手。你想想看,一个策略年化30%,但最大回撤40%,你敢重仓吗?反正我不敢。

今天我们就来聊聊波动率管理。这是风险控制的核心,也是仓位管理的基石。

4.1 波动率的定义

波动率衡量的是资产价格变动的剧烈程度。数学上,它通常用收益率的标准差来表示。

公式很简单:

σ = √( (1/(n-1)) * Σ(rt - r̄)² )

其中 rt 是每日收益率,r̄ 是平均收益率,n 是样本数。

嗯,这里要注意:我们通常用对数收益率,而不是简单收益率。为什么?因为对数收益率在时间上可加,而且更符合正态分布假设。我在项目中遇到过有人用简单收益率算波动率,结果回测时参数全偏了,后来排查了半天才发现是这个坑。

4.2 历史波动率

历史波动率,就是基于过去的数据算出来的波动率。它反映的是「已经发生」的事情。

计算步骤:

  1. 取过去N天的收盘价
  2. 计算每日对数收益率
  3. 计算这些收益率的标准差
  4. 年化处理(乘以√252)

代码实现:

import numpy as np
import pandas as pd

def historical_volatility(prices, window=20):
    log_returns = np.log(prices / prices.shift(1))
    hv = log_returns.rolling(window=window).std() * np.sqrt(252)
    return hv

我个人习惯用20个交易日(约一个月)作为窗口期。太短了噪音大,太长了反应迟钝。当然,如果你做高频交易,可能用5天甚至1天。这个没有标准答案,看你的策略周期。

小技巧: 我建议你同时计算多个窗口期的波动率(比如10天、20天、60天),然后取加权平均。这样既保留了短期敏感性,又有长期稳定性。

4.3 隐含波动率

隐含波动率就更有意思了。它不是算出来的,而是从期权价格里反推出来的。说白了,就是市场「预期」的未来波动率。

为什么叫「隐含」?因为它隐含在期权价格里。你用Black-Scholes公式,把期权价格、行权价、到期时间、无风险利率都代入,反解出波动率,这就是隐含波动率。

隐含波动率和历史波动率的区别:

类型 数据来源 反映内容 特点
历史波动率 历史价格 过去已发生 滞后、客观
隐含波动率 期权价格 未来预期 前瞻、含情绪

我曾经在2018年2月那波美股暴跌中,亲眼看到隐含波动率在一天内飙升了3倍。当时VIX指数从15直接冲到50。如果你只看历史波动率,根本反应不过来。这就是隐含波动率的价值——它包含了市场的恐慌情绪。

避坑指南: 隐含波动率虽然前瞻性强,但它也包含了市场情绪和噪音。我见过有人完全依赖隐含波动率做仓位调整,结果在市场恐慌时过度减仓,错失了反弹。记住,隐含波动率是「预期」,不是「事实」。

4.4 波动率聚类现象

你有没有发现一个现象:市场平静的时候,波动率一直很低;一旦出现大波动,后面往往跟着更大的波动。这就是波动率聚类。

为什么会这样?

原因其实不难理解。市场参与者的行为有惯性。当市场出现剧烈波动时,投资者会变得谨慎,交易行为趋于一致,导致波动持续。反之,当市场平静时,大家放松警惕,波动率就维持在低位。

这个现象对量化交易意味着什么?

  • 波动率不是随机的,它有自相关性
  • 高波动率时期往往伴随着更大的风险
  • 简单的正态分布假设会低估极端风险

我记得有一次做CTA策略回测,发现策略在低波动率时期表现很好,但一到高波动率时期就连续亏损。后来我加入了波动率聚类检测,在高波动率时期降低仓位,才把夏普比率从0.8提升到了1.5。

核心要点: 波动率聚类意味着「风险是会传染的」。一个大的波动事件往往会引发连锁反应。所以,不要以为今天波动率低,明天就一定安全。

4.5 基于波动率的仓位调整(Volatility Targeting)

好了,前面讲了这么多理论,现在来点实战的。Volatility Targeting,说白了就是「让仓位跟着波动率走」。

核心思想:保持投资组合的风险敞口恒定,而不是仓位恒定。

公式:

目标仓位 = 目标波动率 / 当前波动率

举个例子:

  • 你设定的目标波动率是20%
  • 当前市场波动率是10%
  • 那么你的仓位应该是 20%/10% = 2倍杠杆
  • 如果波动率上升到40%,仓位降到 20%/40% = 0.5倍

代码实现:

def volatility_targeting(prices, target_vol=0.20, window=20):
    hv = historical_volatility(prices, window)
    weight = target_vol / hv
    weight = np.clip(weight, 0, 2)  # 限制杠杆范围
    return weight

我个人习惯把杠杆限制在0到2倍之间。为什么?因为超过2倍杠杆,一旦遇到极端行情,爆仓风险太大。低于0?那就是做空了,这个要看你的策略是否允许。

实战建议: 不要直接用当日波动率调整仓位。我建议用过去5天的平均波动率,这样可以避免单日异常值导致的频繁调仓。另外,调仓频率不要太快,每天一次就够了。

Volatility Targeting的好处很明显:

  • 风险可控:无论市场怎么变,你的风险敞口基本恒定
  • 收益平滑:避免了在低波动率时期仓位过轻,高波动率时期仓位过重
  • 心理舒适:你不会在市场暴跌时满仓扛单,也不会在牛市时踏空

当然,它也有缺点。比如在波动率突然飙升时,你可能需要大幅减仓,这会错过反弹。但话说回来,活着比什么都重要,对吧?

一句话总结: 波动率管理不是让你预测市场,而是让你适应市场。Volatility Targeting就是让策略的「油门」随着路况自动调整——路况好就开快点,路况差就慢下来。

好了,这一章的内容就到这里。波动率管理是量化风控的核心,建议你在自己的策略里至少实现一个波动率调整模块。哪怕只是简单的Volatility Targeting,也能让你的策略稳健不少。


公众号:蓝海资料掘金营,微信deep3321