一、波动率基础:到底什么是波动率?
做量化交易这些年,我见过太多人一上来就扎进各种复杂模型里。结果呢?连最基础的波动率都没搞明白。今天咱们就把这个地基打牢。
波动率,说白了就是资产价格上下跳动的剧烈程度。你想想看,一只股票一天涨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 三种波动率的区别与联系
这三种波动率,说白了就是看过去、看现在、看未来。我画了一张图帮你理清关系:
这张图你看懂了吗?历史波动率看过去,已实现波动率看现在(用高频数据逼近真实),隐含波动率看未来(市场预期)。三者之间没有谁对谁错,只是视角不同。
| 对比维度 | 历史波动率 | 隐含波动率 | 已实现波动率 |
|---|---|---|---|
| 数据来源 | 历史价格 | 期权价格 | 高频价格 |
| 时间指向 | 过去 | 未来(预期) | 现在(实时) |
| 计算方式 | 标准差 | BS模型反推 | 高频求和 |
| 优点 | 简单直观 | 前瞻性强 | 精度高 |
| 缺点 | 滞后 | 依赖模型假设 | 数据要求高 |
| 典型应用 | 风险度量 | 期权定价 | 高频交易 |
1.5 实际应用中的选择
说了这么多,到底用哪个?我个人的经验是:
- 做期权策略:重点关注隐含波动率。它告诉你市场情绪,也告诉你期权是贵还是便宜。
- 做风控:用历史波动率。简单、稳定、不容易被操纵。
- 做高频或日内:用已实现波动率。它能捕捉到日内的波动细节。
- 做波动率预测模型:三种都要用。历史波动率做输入特征,已实现波动率做验证标签,隐含波动率做市场情绪指标。
一个小技巧:我经常把三种波动率画在同一张图上。当隐含波动率远高于历史波动率时,说明市场恐慌了;当隐含波动率低于已实现波动率时,说明期权被低估了。这些都是交易信号。
嗯,波动率的基础就讲到这里。记住一句话:波动率不是风险本身,而是风险的价格。理解了这一点,后面的模型和策略才能用得顺手。
公众号:蓝海资料掘金营,微信deep3321