一项策略的年化波动率目标为 10%。回测报告显示为 10.2%。看起来足够接近,直到你发现:仓位计算表用的是昨天的波动率估计,模拟器在杠杆变化时没有计入费用,而一次隔夜跳跌造成的损失,超过了目标原本试图描述的范围。
来看一个简单的 BTC 永续合约策略:它持有方向性信号,根据 10% 的年化波动率预算确定仓位,并每天更新一次仓位。这条规则很常见,因为容易解释,也容易编码。下面我们拆开看一天的仓位是怎么来的。
信号:只有方向,没有风险单位
周一收盘时,信号显示做多。这回答了策略想朝哪个方向交易,却没有说明应持有多少 BTC。波动率目标则补上了缺失的尺度。
假设账户权益为 $100,000,策略估计 BTC 的日波动率为 2%。用 10% 除以 252 个交易日的平方根,10% 的年化目标大约对应 0.63% 的日波动率。因此,原始杠杆约为 0.63% / 2%,即权益的 0.315 倍:BTC 敞口为 $31,500。
这个简洁的计算已经包含一项假设:BTC 波动率的表现足够接近稳定分布,因此近期的日波动可以用来指导明天的敞口。波动率估计描述的是近期价格变动,并不能为下一次变动设定上限。
估计方法:究竟是哪一个 2%?
使用 20 日收盘到收盘的标准差,并乘以 365 的平方根进行年化,因为永续合约每天都在交易。日波动率为 2% 时,年化约为 38.2%。如果用 252 天,结果则约为 31.7%。仅仅日历口径不同,就会造成显著的仓位差异。
20 日窗口反应迅速,但一段平静的两周可能会让估计值收缩,恰好赶在波动率扩大之前。90 日窗口更稳定,反应也更慢。指数加权波动率介于两者之间,但也有自己的半衰期,以及对初始值的依赖。没有放之四海而皆准的最佳选择;回测应明确说明采用哪种估计方法,并在比较结果时固定其设置。
| 估计方法 | 变化之处 | 需要留意的问题 |
|---|---|---|
| 20 日滚动标准差 | 快速响应近期变动 | 平静期过后,敞口会迅速上升 |
| 90 日滚动标准差 | 仓位调整更慢、更平滑 | 进入新的波动率状态后,敞口仍可能维持在高位 |
| EWMA,10 日半衰期 | 近期收益的权重更高 | 结果取决于衰减和预热期的设定 |
时间戳:何时才能获知?
如果周一收盘价被纳入估计,策略只能等周一收盘结束后才能使用该估计值。之后,策略可以提交订单,在更晚的执行时点成交,例如在模拟器中按周二第一个可用价格成交。如果按周一收盘价成交,仓位就会根据尚未完成的收益作出调整。
这也意味着,每日调仓并不能在盘中持续保护账户。即使信号或波动率在 10:00 UTC 发生变化,周一建立的仓位也会一直持有到周二,期间可能遭遇跳跃行情。这是策略的设计选择;模拟账户也应遵循相同的时程。
订单:敞口变化有成本
周二,估计值从 2% 升至 3%。目标敞口从 $31,500 降至 $21,000。卖出 $10,500 的永续合约并非没有成本。若 taker 费率为 5 个基点,手续费就是 $5.25。如果策略主动跨越买卖价差,并产生 3 个基点的冲击成本,还会增加约 $3.15。资金费率则另行计算:现金流取决于资金费率时间戳时持有的仓位,以及实际适用的费率。
策略在每次波动加剧后减仓、每次行情平静后恢复仓位时,小额成本也会累积。应报告仓位规则本身产生的换手率,以及这些交易产生的手续费、价差和冲击成本。没有交易摩擦的波动率目标,可能悄然变成一项高换手策略。
结果:目标不是尾部风险承诺
假设波动率估计为日波动率 2%,策略持有 $31,500 名义价值的仓位,对应 $100,000 的权益。随后 BTC 在下一次计划调仓前下跌 12%。粗略估算,盯市损失为 $3,780,即权益的 3.78%,尚未计入手续费和资金费率。10% 的年化目标并没有阻止这笔损失;它只是把对常规波动的估计转化为仓位规模。
如果规则没有杠杆上限,风险会更加突出。经历一段长期平静期后,估计波动率可能变得极小,公式由此要求的仓位可能超过账户的保证金或市场的承载能力。应在仓位规则中设置上限,并将其纳入回测。然后记录上限触发的频率;如果上限经常触发,就说明实际敞口很少由宣称的目标来决定。
审计:重放规则,而不只是查看曲线
每次调仓时,都记录收益窗口、波动率估计、年化因子、目标、杠杆上限、目标名义仓位、实际成交名义仓位、换手率、手续费、冲击成本和资金费率。当目标波动率与实际波动率出现偏差时,这些字段能帮助你判断是估计方法滞后、交易成本侵蚀了收益,还是敞口限制改变了策略表现。
最后,在模拟交易中运行相同的仓位代码,并采用相同的调仓时点。将目标敞口与实际仓位进行比较,并记录未成交或延迟成交的订单。只有当从估计到实际持仓的每一步都能解释清楚时,风险目标才真正有用;仪表盘上的百分比只是第一步。
← 全部文章

