查看全课大纲(第 29 / 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.预案准备和实盘心理建设
探讨波动率与风险的关系
约 19 分钟
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
波动率是风险,但波动率并不完全等同于风险。在量化投资中,向上的剧烈波动带来的是收益而非亏损。如何准确区分“坏波动(下行风险)”与“好波动(上行 Alpha)”,并在波动率周期切换中实施风险预算,是高阶量化交易的核心课题。
💡 核心导读
- 波动率与真实风险的三大认知跃迁:
- 波动率对称性假设的破灭:传统金融理论假设收益率服从正态分布,实际市场收益常呈现厚尾性(Fat Tails)与不对称性(方向因市况而异,须实测);
- 好波动 vs 坏波动(Upside vs Downside Volatility):将总方差分解为上行半方差与下行半方差,仅对下行风险进行资本保护;
- 波动率状态切换与风险预算(Volatility Regimes):低波动阶段杠杆加满,高波动阶段主动降杠杆以平滑风险暴露。
┌─────────────────────────────────────────────────────────────┐
│ 波动率分解与风险预算模型拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┴─────────────────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ 上行好波动 (Upside Vol) │ │下行坏波动 (Downside Vol)│
├─────────────────────────┤ ├─────────────────────────┤
│ • 收益率 > 0 的正向扩散 │ │ • 收益率 < 0 的负向亏损 │
│ • 带来净值爆发性增长 │ │ • 引发爆仓与回撤黑天鹅 │
│ ✅ 鼓励暴露,让利润奔跑 │ │ ❌ 严格限制,施加硬熔断 │
└─────────────────────────┘ └─────────────────────────┘一、半方差(Semi-Variance)与偏度分解数学模型
总方差 可以精确分解为上行半方差 与下行半方差 :
在追求正偏度(Positive Skewness)的趋势策略中,,传统标准差会严重高估其风险。
import pandas as pd
import numpy as np
def decompose_volatility_components(returns: pd.Series) -> dict:
"""
分解上行好波动与下行坏波动(合成样例,历史波动率分解不代表未来风险结构)
"""
mu = returns.mean()
upside_diff = np.maximum(0, returns - mu)
downside_diff = np.minimum(0, returns - mu)
# 半方差用 1/T 总体口径(.mean()); 总波动统一取 ddof=0, 使 σ² = σ²_+ + σ²_- 分解恒等式严格成立
vol_up = np.sqrt((upside_diff ** 2).mean()) * np.sqrt(252.0)
vol_down = np.sqrt((downside_diff ** 2).mean()) * np.sqrt(252.0)
vol_total = returns.std(ddof=0) * np.sqrt(252.0)
return {
'Total_Vol': float(vol_total),
'Upside_Vol': float(vol_up),
'Downside_Vol': float(vol_down),
'Asymmetry_Ratio': float(vol_up / (vol_down + 1e-8))
}
# 合成数据:模拟200个交易日收益率,包含正负收益(历史数据不代表未来)
rng = np.random.default_rng(42)
rets = pd.Series(rng.normal(0.0005, 0.015, 200))
rets.iloc[50:100] = rets.iloc[50:100] * 1.5 # 中间一段波动放大
rets.iloc[150:] = rets.iloc[150:] * 0.7 # 末尾一段波动减小
result = decompose_volatility_components(rets)
print("===== 波动率成分分解(年化) =====")
print(f"总波动率 : {result['Total_Vol']*100:.2f}%")
print(f"上行波动 (好) : {result['Upside_Vol']*100:.2f}%")
print(f"下行波动 (坏) : {result['Downside_Vol']*100:.2f}%")
print(f"不对称比率 : {result['Asymmetry_Ratio']:.3f}")
print(f"下行波动占比 : {result['Downside_Vol']/(result['Total_Vol']+1e-8)*100:.1f}%")===== 波动率成分分解(年化) =====
总波动率 : 21.89%
上行波动 (好) : 15.32%
下行波动 (坏) : 15.63%
不对称比率 : 0.980
下行波动占比 : 71.4%二、基于波动率目标(Volatility Targeting)的风险平价控制
波动率目标机制根据当前市场实时预估波动率 动态调整投资杠杆,使组合的风险暴露始终稳定在目标年化波动率 (如 ):
其中上限 即代码中的 max_leverage:通用风险预算与期货/保证金框架允许杠杆,可取 1.5;A 股现货无杠杆,调用时应传 max_leverage=1.0,保证仓位永不超过 100%。下限 防止低波动期仓位过小而失去配置意义。
import pandas as pd
import numpy as np
def apply_volatility_targeting(df: pd.DataFrame, target_vol: float = 0.12, max_leverage: float = 1.5) -> pd.Series:
"""
动态波动率目标仓位调配算法(历史波动率预测未来存在偏差,杠杆交易有强制平仓风险)
"""
# 20日滚动历史年化波动率
realized_vol = df['close'].pct_change().rolling(20).std() * np.sqrt(252.0)
weights = target_vol / (realized_vol + 1e-8)
# 下限 0.1 防止低波期仓位过小; 上限 max_leverage: 期货/保证金场景可 >1(默认 1.5),
# A股现货无杠杆, 调用时应传 max_leverage=1.0(仓位永不超过 100%)
weights = weights.clip(lower=0.1, upper=max_leverage)
return weights
# 合成价格序列:包含平稳期、高波动期、低波动期(合成数据,不构成投资建议)
rng = np.random.default_rng(2024)
days = 250
# 三段不同波动率 regime
rets1 = rng.normal(0.0003, 0.01, 80)
rets2 = rng.normal(-0.0005, 0.025, 100)
rets3 = rng.normal(0.0008, 0.008, 70)
rets = np.concatenate([rets1, rets2, rets3])
prices = 100.0 * np.cumprod(1.0 + rets)
df = pd.DataFrame({'close': prices})
weights = apply_volatility_targeting(df, target_vol=0.15, max_leverage=2.0)
print("===== 波动率目标仓位动态调整 =====")
print(f"价格序列长度 : {len(df)} 天")
print(f"目标年化波动率 : {0.15*100:.1f}%")
print(f"最大允许杠杆 : {2.0}x")
print(f"初始仓位 (第21天) : {weights.iloc[20]*100:.1f}%")
print(f"高波期仓位 (第150天): {weights.iloc[149]*100:.1f}%")
print(f"低波期仓位 (最后一天): {weights.iloc[-1]*100:.1f}%")
print(f"仓位调整次数 (权重变化>5%): {(weights.diff().abs() > 0.05).sum()}")===== 波动率目标仓位动态调整 =====
价格序列长度 : 250 天
目标年化波动率 : 15.0%
最大允许杠杆 : 2.0x
初始仓位 (第21天) : 88.6%
高波期仓位 (第150天): 32.3%
低波期仓位 (最后一天): 124.7%
仓位调整次数 (权重变化>5%): 39📝 动手练一练
编写 Python 仿真测试,对比固定仓位与基于波动率目标调仓策略在剧烈震荡市中的最大回撤差异:
import pandas as pd
import numpy as np
def decompose_volatility_components(returns: pd.Series) -> dict:
"""
分解上行好波动与下行坏波动(合成样例,历史波动率分解不代表未来风险结构)
"""
mu = returns.mean()
upside_diff = np.maximum(0, returns - mu)
downside_diff = np.minimum(0, returns - mu)
vol_up = np.sqrt((upside_diff ** 2).mean()) * np.sqrt(252.0)
vol_down = np.sqrt((downside_diff ** 2).mean()) * np.sqrt(252.0)
vol_total = returns.std(ddof=0) * np.sqrt(252.0)
return {
'Total_Vol': float(vol_total),
'Upside_Vol': float(vol_up),
'Downside_Vol': float(vol_down),
'Asymmetry_Ratio': float(vol_up / (vol_down + 1e-8))
}
def apply_volatility_targeting(df: pd.DataFrame, target_vol: float = 0.12, max_leverage: float = 1.5) -> pd.Series:
"""
动态波动率目标仓位调配算法(历史波动率预测未来存在偏差,杠杆交易有强制平仓风险)
"""
realized_vol = df['close'].pct_change().rolling(20).std() * np.sqrt(252.0)
weights = target_vol / (realized_vol + 1e-8)
weights = weights.clip(lower=0.1, upper=max_leverage)
return weights
# 模拟 200 天由平稳转向高波动的行情(合成教学数据,参数过拟合风险)
rng = np.random.default_rng(42)
rets = np.concatenate([rng.normal(0.0005, 0.01, 100), rng.normal(-0.001, 0.03, 100)])
prices = 100.0 * np.cumprod(1.0 + rets)
df = pd.DataFrame({'close': prices})
decomp = decompose_volatility_components(pd.Series(rets))
weights = apply_volatility_targeting(df, target_vol=0.15, max_leverage=1.0)
print("================ 波动率与风险关系深度解析 ================")
print(f"总年化波动率 : {decomp['Total_Vol']*100:.2f}%")
print(f"上行好波动 (Up): {decomp['Upside_Vol']*100:.2f}%")
print(f"下行坏波动 (Dn): {decomp['Downside_Vol']*100:.2f}%")
print(f"波动不对称比率 : {decomp['Asymmetry_Ratio']:.2f}")
print(f"高波阶段仓位降至: {weights.iloc[-1]*100:.2f}% (对比平稳期 {weights.iloc[50]*100:.2f}%)")
# 验证性断言:高波动阶段仓位应低于平稳阶段(基于合成数据的确定性设计)
assert weights.iloc[-1] < weights.iloc[50], "波动率目标仓位未能在高波阶段主动降低!"
print("✅ 波动率分解与动态风险预算验证 PASS")
print("========================================================")运行结果输出:
================ 波动率与风险关系深度解析 ================
总年化波动率 : 33.96%
上行好波动 (Up): 25.09%
下行坏波动 (Dn): 22.89%
波动不对称比率 : 1.10
高波阶段仓位降至: 31.60% (对比平稳期 100.00%)
✅ 波动率分解与动态风险预算验证 PASS
========================================================⚠️ 数据方向教学点:本样本的不对称比率为 1.10(> 1),即上行波动大于下行波动——但期末价格仅为期初的 0.84 倍(整体亏损)。这恰恰打破了一个常见误判:「上行波动占比高 ≠ 趋势向上」。本样本前半段平稳、后半段高波动且带负漂移,少数大涨日的波动贡献虽超过回撤日,价格路径仍被持续压低。不对称比率必须实测,且半方差分解不能替代价格路径分析。 它的价值正在于如实揭示波动来自哪里,为「该不该怕波动」提供依据。
👉 点击查看解析
本练习通过对比不同资产或组合的波动率指标,直观展示波动率与风险之间的正向关系,并强调高波动并不完全等同于高风险,还需结合收益分布与下行风险综合判断。
本章小结
- 客观区分好波动与坏波动:上行波动是利润增长的来源,下行波动才是必须设防的真实风险。
- 实施波动率目标平价管理:在市场波动放大时主动降杠杆,在波动收缩时适度提升仓位,平滑净值曲线。
- 打破对称性正态分布假设:针对金融资产收益的厚尾与不对称特征(不对称方向因市况而异,须实测),以半方差和 CVaR 作为核心风控边界。
📋 行动清单 (Action Checklist)
- 运行波动率分解测试代码,分析手头策略的历史收益是不对称正偏还是负偏;
- 尝试实现波动率目标(Vol Targeting)自动调节函数并嵌入回测系统;
- 全面总结第五章风险控制思想,准备进入第六章资金管理模型。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第5章课件:量化体系中的风险控制PDF · 1.2MB