跳转到内容

波动率目标化

把每个资产的仓位按目标波动率与估计波动率之比缩放:

wt=sign(st)⋅σtargetσ^t⋅wbase,w_t = \mathrm{sign}(s_t) \cdot \frac{\sigma_{\text{target}}}{\hat\sigma_t} \cdot w_{\text{base}},

sts_t 为信号方向,σ^t\hat\sigma_t 为波动率估计(EWMA 或短窗口,见GARCH 族)。波动大的资产仓位小、波动小的仓位大——每个头寸承担近似相同的风险。这是趋势策略提高夏普、降低尾部风险最重要的单一技术:实证上能把夏普提升 0.2–0.4,并显著削平回撤。

  1. 估计窗口:全样本波动率响应太慢;短窗口(20–60 日)EWMA 响应快但抖动大。趋势场景的默认是 30–60 日 EWMA 或 GARCH 预测;
  2. 杠杆上限:低波动期(如 2017 年的平静市场)σ^t\hat\sigma_t 很小,σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t 会给出荒谬的大仓位——必须设置杠杆上限(如 2–3 倍名义);
  3. 再平衡频率:仓位缩放本身产生换手与成本,日度缩放要对比成本;通常每日计算、但缩放阈值(如偏离 20% 才调仓)可显著省成本。
vol-target.py
import numpy as np
import pandas as pd
def vol_target_position(signal: pd.Series, returns: pd.Series,
target: float = 0.10, lev_cap: float = 2.0,
window: int = 60) -> pd.Series:
"""信号 → 波动率目标化仓位。target: 年化目标波动率"""
vol = returns.ewm(span=window, min_periods=window).std().shift(1) * np.sqrt(252)
lev = (target / vol).clip(upper=lev_cap) # 杠杆上限是硬要求
return (signal * lev).fillna(0)
  • 不只趋势:波动率目标化同样适用于截面动量(截面动量的"动量崩溃"正靠它缓解)与任何基于收益的策略;
  • 局限:它假设波动率自相关——对跳空无效;熔断、闪崩日的仓位来不及调整,见危机 alpha 与分散;
  • 波动率目标化本身会轻微改变策略收益的自相关(正自相关策略被缩放后夏普改善更明显),评估时要意识别把"缩放红利"误认为信号改进。
  • 波动率估计用短窗口 EWMA 或 GARCH 预测,不用全样本;
  • 杠杆上限写进配置,回测与实盘一致;
  • 评估"加波动率目标化前后"的差异,确认改进不是来自运气。
  • 短窗口(20–60 日)EWMA 波动率响应更快
  • 必须设置杠杆上限,否则低波动期仓位会过大
  • 波动率目标化同样适用于截面动量与任何收益类策略