一、波动率基础:到底什么是波动率?

做量化交易这些年,我见过太多人一上来就扎进各种复杂模型里。结果呢?连最基础的波动率都没搞明白。今天咱们就把这个地基打牢。

波动率,说白了就是资产价格上下跳动的剧烈程度。你想想看,一只股票一天涨5%,另一只一天只动0.5%,前者的波动率肯定更高。但问题来了——我们怎么量化这个「剧烈程度」?

核心定义:波动率是资产收益率的标准差,衡量价格的不确定性。它不是价格变动的方向,而是变动的幅度。

1.1 历史波动率(Historical Volatility)

历史波动率是最直观的一种。拿过去的数据算标准差,就这么简单。我个人习惯用20个交易日作为窗口期,因为一个月大概有20个交易日,比较符合交易节奏。

计算公式长这样:

import numpy as np

def historical_volatility(prices, window=20):
    # 计算对数收益率
    log_returns = np.log(prices[1:] / prices[:-1])
    # 滚动标准差,再年化
    hv = np.std(log_returns[-window:]) * np.sqrt(252)
    return hv

我在项目中遇到过一个问题:用30天窗口还是60天窗口?结果差很多。短窗口反应快但噪音大,长窗口平滑但滞后。嗯,这里要注意——没有绝对正确的窗口,关键看你的交易周期。

我的经验:日内交易用5-10天窗口,中线持仓用20-30天,长线用60天以上。别死板,灵活调整。

1.2 隐含波动率(Implied Volatility)

隐含波动率就有点意思了。它不是算出来的,而是从期权价格里反推出来的。市场认为未来会波动成什么样,它就长什么样。

为什么叫「隐含」?因为期权价格里已经包含了市场对未来的预期。你用Black-Scholes模型,把期权价格、行权价、到期时间、无风险利率都输进去,唯一解不出来的那个变量,就是隐含波动率。

from scipy.optimize import brentq
import numpy as np

def implied_volatility(option_price, S, K, T, r, option_type='call'):
    # 用二分法反推隐含波动率
    def bs_price(sigma):
        d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
        d2 = d1 - sigma*np.sqrt(T)
        if option_type == 'call':
            return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
        else:
            return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
    
    return brentq(lambda x: bs_price(x) - option_price, 0.001, 5.0)

我曾经犯过一个错:直接用平值期权的隐含波动率代表整个市场。后来发现,不同行权价的隐含波动率差很多,这就是所谓的「波动率微笑」。你想想看,市场对极端行情的定价往往更高,所以深度虚值期权的隐含波动率通常更高。

避坑指南:隐含波动率不是预测值,而是市场情绪的反映。它可能错得离谱,但市场永远是对的。别跟隐含波动率对着干,除非你有充分的理由。

1.3 已实现波动率(Realized Volatility)

已实现波动率,也叫实际波动率。它跟历史波动率有点像,但更精细。历史波动率通常用日收盘价算,而已实现波动率可以用高频数据——比如5分钟、1分钟甚至逐笔数据。

为什么用高频数据?因为日内信息量更大。你想想看,一天之内价格可能上蹿下跳好几次,但收盘价只告诉你起点和终点。已实现波动率能捕捉到中间的波动细节。

def realized_volatility(prices, freq=5):
    # prices: 高频价格序列,freq: 采样频率(分钟)
    log_returns = np.log(prices[1:] / prices[:-1])
    rv = np.sqrt(np.sum(log_returns**2)) * np.sqrt(252 * 390 / freq)
    return rv

我记得有一次做股指期货的波动率预测,用日数据算出来的结果跟用5分钟数据算的差了将近一倍。后来发现,日内的跳空和反转都被日数据平滑掉了。所以,如果你做高频交易,千万别用日数据算波动率。

1.4 三种波动率的区别与联系

这三种波动率,说白了就是看过去、看现在、看未来。我画了一张图帮你理清关系:

三种波动率的关系与对比 历史波动率 Historical Volatility 基于历史价格数据 计算收益率标准差 反映过去波动水平 滞后性明显 隐含波动率 Implied Volatility 从期权价格反推 反映市场预期 包含情绪与恐慌 可能偏离实际 已实现波动率 Realized Volatility 基于高频数据 捕捉日内波动细节 更接近真实波动 数据要求高 过去 现在 未来 历史波动率 → 已实现波动率 → 隐含波动率(预测未来)

这张图你看懂了吗?历史波动率看过去,已实现波动率看现在(用高频数据逼近真实),隐含波动率看未来(市场预期)。三者之间没有谁对谁错,只是视角不同。

对比维度 历史波动率 隐含波动率 已实现波动率
数据来源 历史价格 期权价格 高频价格
时间指向 过去 未来(预期) 现在(实时)
计算方式 标准差 BS模型反推 高频求和
优点 简单直观 前瞻性强 精度高
缺点 滞后 依赖模型假设 数据要求高
典型应用 风险度量 期权定价 高频交易

1.5 实际应用中的选择

说了这么多,到底用哪个?我个人的经验是:

  • 做期权策略:重点关注隐含波动率。它告诉你市场情绪,也告诉你期权是贵还是便宜。
  • 做风控:用历史波动率。简单、稳定、不容易被操纵。
  • 做高频或日内:用已实现波动率。它能捕捉到日内的波动细节。
  • 做波动率预测模型:三种都要用。历史波动率做输入特征,已实现波动率做验证标签,隐含波动率做市场情绪指标。

一个小技巧:我经常把三种波动率画在同一张图上。当隐含波动率远高于历史波动率时,说明市场恐慌了;当隐含波动率低于已实现波动率时,说明期权被低估了。这些都是交易信号。

嗯,波动率的基础就讲到这里。记住一句话:波动率不是风险本身,而是风险的价格。理解了这一点,后面的模型和策略才能用得顺手。


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