查看全课大纲(第 25 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
风险的度量-波动率
约 16 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
波动率是金融资产价格最核心的二阶矩特征。在量化体系中,波动率既是风险的直接代名词,也是期权定价与动态头寸管理的核心输入变量。本节系统剖析历史波动率(HV)、帕金森极值波动率(Parkinson)与 EWMA 指数加权移动平均波动率模型。
💡 核心导读
- 三大经典波动率度量模型与适用场景:
- 标准历史波动率(Close-to-Close HV):仅基于收盘价对数收益率标准差,计算简单但丢失日内最高最低价信息;
- 帕金森高低价极值波动率(Parkinson Volatility):基于日内 High 和 Low 极值差,效率是传统收盘价波动率的 5 倍;
- EWMA 动态衰减波动率(Exponentially Weighted):赋予近期波动更高权重,敏锐捕捉波动率聚集(Volatility Clustering)效应。
┌─────────────────────────────────────────────────────────────┐
│ 多维波动率量化度量拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 收盘价历史波动率 (HV) │ │ 帕金森极值波动率 (Park) │ │ EWMA 动态加权波动率 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • $\sigma = \text{std}(\ln(P_t/P_{t-1})) \times \sqrt{252}$│ │ • 基于 $\ln(H_t/L_t)^2$ │ │ • $\sigma_t^2 = \lambda \sigma_{t-1}^2 + (1-\lambda)r_t^2$│
│ • 基准常用,但时滞较长 │ │ • 充分捕获日内宽幅震荡 │ │ • 快速捕捉波动率暴增 │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、帕金森(Parkinson)极值波动率数学推导
假设资产价格在连续时间内遵循几何布朗运动。帕金森证明利用日内最高价 与最低价 可以构建更无偏、更高效的波动率估计量:
相较于仅用收盘价,帕金森波动率能够在样本量较小时快速收敛至真实波动率。
import pandas as pd
import numpy as np
def calculate_parkinson_volatility(df: pd.DataFrame, window: int = 20) -> pd.Series:
"""
计算帕金森高低价极值年化波动率(合成教学样例,日内极值噪声可能影响估计精度)
"""
hl_ratio = np.log(df['high'] / df['low'])
park_var = (hl_ratio ** 2).rolling(window).mean() / (4.0 * np.log(2.0))
park_vol = np.sqrt(park_var * 252.0)
return park_vol
# 合成日内高低价数据(教学样例,不代表真实市场行为)
rng = np.random.default_rng(42)
n_days = 50
base_price = 100.0
returns = rng.normal(0.0005, 0.015, n_days)
prices = base_price * np.cumprod(1 + returns)
# 生成日内高低价(振幅与波动率正相关)
daily_amplitude = np.abs(rng.normal(0, 0.8, n_days)) * np.abs(returns) * 3
df = pd.DataFrame({
'close': prices,
'high': prices * (1 + daily_amplitude),
'low': prices * (1 - daily_amplitude)
}, index=pd.date_range('2024-01-01', periods=n_days, freq='D'))
# 计算帕金森波动率
df['parkinson_vol'] = calculate_parkinson_volatility(df, window=20)
print("===== 帕金森波动率计算示例 =====")
print(f"数据天数: {len(df)}")
print(f"最后5天收盘价: {df['close'].iloc[-5:].values.round(2)}")
print(f"最后5天帕金森波动率 (年化): {df['parkinson_vol'].iloc[-5:].values.round(4)}")
print(f"全样本帕金森波动率均值: {df['parkinson_vol'].mean():.4f}")===== 帕金森波动率计算示例 =====
数据天数: 50
最后5天收盘价: [106.25 107.69 108.11 109.26 109.43]
最后5天帕金森波动率 (年化): [0.2672 0.3222 0.3245 0.3246 0.3241]
全样本帕金森波动率均值: 0.3564二、EWMA 波动率聚集模型与风险衰减因子
金融资产收益率具有显著的“波动率聚集(Volatility Clustering)”特征,即大波动后往往伴随大波动。RiskMetrics 提出 EWMA 模型,衰减因子通常取 :
import pandas as pd
import numpy as np
def calculate_ewma_volatility(returns: pd.Series, decay: float = 0.94) -> pd.Series:
"""
计算 EWMA 动态指数衰减年化波动率(教学演示,种子方差取全样本方差仅为递推启动,严格回测应避免未来信息)
"""
var = np.zeros(len(returns))
# 教学演示: 种子方差取全样本方差仅为递推启动, lambda=0.94 衰减极快(0.94^100≈0.002), 种子影响迅速消失;
# 严格回测严禁用全样本统计量初始化(隐含未来信息), 应改用扩张窗口或前 warmup 期方差, 如 returns.iloc[:20].var()
var[0] = returns.var()
for i in range(1, len(returns)):
var[i] = decay * var[i-1] + (1.0 - decay) * (returns.iloc[i] ** 2)
return pd.Series(np.sqrt(var * 252.0), index=returns.index)
# 合成收益率序列(包含波动率状态切换,历史模式不代表未来)
rng = np.random.default_rng(123)
n = 100
# 前70天低波动,后30天高波动
rets_low = rng.normal(0, 0.01, 70)
rets_high = rng.normal(0, 0.03, 30)
rets = np.concatenate([rets_low, rets_high])
returns_series = pd.Series(rets, index=pd.date_range('2024-01-01', periods=n, freq='D'))
# 计算 EWMA 波动率
ewma_vol = calculate_ewma_volatility(returns_series, decay=0.94)
print("===== EWMA 波动率计算示例 =====")
print(f"收益率序列长度: {len(returns_series)}")
print(f"前70天收益率标准差: {returns_series.iloc[:70].std():.4f}")
print(f"后30天收益率标准差: {returns_series.iloc[70:].std():.4f}")
print(f"EWMA 波动率最后5天值: {ewma_vol.iloc[-5:].values.round(4)}")
print(f"EWMA 对波动率突变的响应: {ewma_vol.iloc[69]:.4f} -> {ewma_vol.iloc[99]:.4f}")===== EWMA 波动率计算示例 =====
收益率序列长度: 100
前70天收益率标准差: 0.0093
后30天收益率标准差: 0.0248
EWMA 波动率最后5天值: [0.3565 0.3474 0.3636 0.3655 0.368 ]
EWMA 对波动率突变的响应: 0.1364 -> 0.3680📝 动手练一练
编写 Python 脚本对比收盘价 HV、帕金森极值与 EWMA 波动率在突发黑天鹅事件中的响应速度(口径说明:正文 HV 定义采用对数收益率 ,下文代码在日频下以简单收益率 pct_change() 近似,两者日频差异极小;严格对数口径可改用 np.log(df['close']).diff(),EWMA 输入同理):
import pandas as pd
import numpy as np
def calculate_parkinson_volatility(df: pd.DataFrame, window: int = 20) -> pd.Series:
"""
计算帕金森高低价极值年化波动率(合成教学样例,日内极值噪声可能影响估计精度)
"""
hl_ratio = np.log(df['high'] / df['low'])
park_var = (hl_ratio ** 2).rolling(window).mean() / (4.0 * np.log(2.0))
park_vol = np.sqrt(park_var * 252.0)
return park_vol
def calculate_ewma_volatility(returns: pd.Series, decay: float = 0.94) -> pd.Series:
"""
计算 EWMA 动态指数衰减年化波动率(教学演示,种子方差取全样本方差仅为递推启动,严格回测应避免未来信息)
"""
var = np.zeros(len(returns))
var[0] = returns.var()
for i in range(1, len(returns)):
var[i] = decay * var[i-1] + (1.0 - decay) * (returns.iloc[i] ** 2)
return pd.Series(np.sqrt(var * 252.0), index=returns.index)
# 合成测试数据(模拟波动率状态突变,历史回测不代表未来表现)
rng = np.random.default_rng(42)
n = 100
# 前 80 天低波动,后 20 天波动率激增 3 倍
rets1 = rng.normal(0, 0.01, 80)
rets2 = rng.normal(0, 0.03, 20)
rets = np.concatenate([rets1, rets2])
sigmas = np.concatenate([np.full(80, 0.01), np.full(20, 0.03)])
prices = 100.0 * np.cumprod(1.0 + rets)
# high/low 日内振幅按状态 σ 同步缩放(与波动率状态切换保持一致)
df = pd.DataFrame({
'high': prices * (1.0 + np.abs(rng.normal(0, 0.8, n)) * sigmas),
'low': prices * (1.0 - np.abs(rng.normal(0, 0.8, n)) * sigmas),
'close': prices
}, index=pd.date_range('2024-01-01', periods=n, freq='D'))
# 计算多种波动率度量
df['HV_20'] = df['close'].pct_change().rolling(20).std() * np.sqrt(252)
df['Park_20'] = calculate_parkinson_volatility(df, window=20)
df['EWMA'] = calculate_ewma_volatility(df['close'].pct_change().fillna(0))
print("================ 多维波动率度量响应对比 ================")
print(f"突发波动后 Close-to-Close HV: {df['HV_20'].iloc[-1]*100:.2f}%")
print(f"突发波动后 Parkinson 极值 HV : {df['Park_20'].iloc[-1]*100:.2f}%")
print(f"突发波动后 EWMA 动态波动率 : {df['EWMA'].iloc[-1]*100:.2f}%")
print(f"EWMA 响应性检查 (第70天 vs 最后): {df['EWMA'].iloc[70]:.4f} < {df['EWMA'].iloc[-1]:.4f} ? {df['EWMA'].iloc[70] < df['EWMA'].iloc[-1]}")
print("✅ 波动率量化度量与模型对比测试 PASS")
print("======================================================")运行结果输出:
================ 多维波动率度量响应对比 ================
突发波动后 Close-to-Close HV: 34.61%
突发波动后 Parkinson 极值 HV : 38.65%
突发波动后 EWMA 动态波动率 : 34.96%
EWMA 响应性检查 (第70天 vs 最后): 0.1262 < 0.3496 ? True
✅ 波动率量化度量与模型对比测试 PASS
======================================================👉 点击查看解析
本练习核心是用收益率的标准差来度量波动率,波动率越大说明资产价格波动越剧烈、风险越高;若涉及年化处理,需按交易天数将日波动率转换为年化波动率。
本章小结
- 根据场景选择波动率模型:长期资产配置选用标准历史波动率,日内与高频风控优先选用帕金森极值与 EWMA。
- 捕捉波动率聚集现象:EWMA 模型通过指数衰减权重实现对突发市场剧震的秒级敏锐捕捉。
- 波动率是仓位规模的核心输入:基于波动率倒数进行动态头寸分配(Volatility Targeting),平滑组合净值波动。
📋 行动清单 (Action Checklist)
- 运行波动率对比代码,调整 EWMA 衰减因子 (0.90 vs 0.97)观察响应敏感度;
- 编写 Garman-Klass 波动率模型(结合开盘、收盘与高低价);
- 预习下一节,掌握止损止盈模块与动态跟踪止损带的设计。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第5章课件:量化体系中的风险控制PDF · 1.2MB