3、再平衡触发机制:时间触发、偏离度触发、波动率触发、事件驱动触发
再平衡触发机制,说白了就是「什么时候动手」的问题。
我见过不少团队,策略做得漂漂亮亮,结果栽在触发逻辑上。要么调得太勤,手续费吃光收益;要么反应太慢,组合早就偏到姥姥家了。
今天我把四种主流触发机制掰开揉碎讲清楚。每种都有适用场景,也有坑。
3.1 时间触发:最省心,但不够聪明
时间触发是最朴素的做法。固定周期,到点就调。比如每月1号、每季度末。
优点很明显:
- 逻辑简单,代码好写
- 可预测,方便做资金规划
- 交易成本可控
缺点也致命:
- 市场剧烈波动时,你可能错过最佳调仓时机
- 市场平稳时,又可能白交手续费
我的经验: 我个人习惯用月度触发作为「保底机制」。不管其他触发条件有没有激活,至少每个月检查一次。这样不会出现「忘了调仓」的尴尬。
代码实现很简单:
# 时间触发示例:每月第一个交易日
import pandas as pd
from datetime import datetime
def time_trigger(current_date, last_rebalance_date, frequency='monthly'):
if frequency == 'monthly':
# 检查是否跨月
if current_date.month != last_rebalance_date.month:
return True
elif frequency == 'quarterly':
# 检查是否跨季度
if current_date.quarter != last_rebalance_date.quarter:
return True
return False
3.2 偏离度触发:精准打击,但容易过度敏感
偏离度触发,就是盯着实际权重和目标权重的差距。差距超过阈值,就动手。
举个例子:你设定茅台占组合10%。结果茅台涨疯了,现在占15%。偏离度就是5%。
阈值怎么设? 我一般用两种方式:
- 绝对偏离度:比如超过5%就调
- 相对偏离度:比如超过目标权重的20%就调
| 资产 | 目标权重 | 当前权重 | 绝对偏离 | 相对偏离 | 触发? |
|---|---|---|---|---|---|
| 股票A | 40% | 48% | +8% | +20% | ✅ |
| 债券B | 40% | 35% | -5% | -12.5% | ❌ |
| 黄金C | 20% | 17% | -3% | -15% | ❌ |
避坑指南: 我曾经在实盘里把阈值设得太小(比如1%),结果市场稍微一波动就触发调仓。一个月调了8次,手续费吃掉0.6%的收益。后来我改成「双阈值」——小阈值只预警,大阈值才动手。
代码实现:
def deviation_trigger(current_weights, target_weights, threshold=0.05):
"""
偏离度触发检查
threshold: 绝对偏离阈值,默认5%
"""
for asset in target_weights.keys():
deviation = abs(current_weights[asset] - target_weights[asset])
if deviation > threshold:
return True, asset, deviation
return False, None, 0
3.3 波动率触发:动态调整,适合高波动市场
波动率触发,核心思路是:市场越动荡,越要勤调仓。
你想想看,波动率大的时候,资产权重变化也快。这时候用固定周期,很容易错过最佳窗口。
具体做法:
- 计算滚动波动率(比如20日滚动)
- 波动率超过某个阈值,就触发再平衡
- 波动率越高,触发频率越高
核心逻辑: 波动率触发本质上是「自适应频率」。市场安静时少动,市场疯狂时多动。
我记得在2020年3月美股熔断期间,用波动率触发的组合明显跑赢了固定周期组合。因为那段时间波动率飙升,系统自动提高了调仓频率,及时锁定了部分收益。
代码示例:
import numpy as np
def volatility_trigger(returns_series, window=20, threshold=0.3):
"""
波动率触发
returns_series: 日收益率序列
threshold: 年化波动率阈值,默认30%
"""
# 计算滚动年化波动率
rolling_vol = returns_series.rolling(window).std() * np.sqrt(252)
current_vol = rolling_vol.iloc[-1]
if current_vol > threshold:
return True, current_vol
return False, current_vol
3.4 事件驱动触发:应对黑天鹅
事件驱动触发,就是「出了大事,赶紧看看」。比如:
- 成分股被调出指数
- 公司发生并购、分红、拆股
- 行业政策突变
- 宏观经济数据超预期
这类触发机制没法用固定公式。它更像一个「监控清单」。
我的做法: 我会维护一个事件库,每天跑一遍。比如「某股票被ST了,自动触发调仓」。这些规则写死在代码里,不用人工判断。
事件驱动的难点在于:怎么定义「事件」?
我建议从三个维度入手:
- 价格维度:单日涨跌幅超过10%、连续跌停等
- 基本面维度:财报发布、评级调整、管理层变动
- 宏观维度:利率决议、CPI数据、地缘政治
代码框架:
def event_driver_trigger(event_list, portfolio_assets):
"""
事件驱动触发
event_list: 当日发生的事件列表
portfolio_assets: 组合持仓列表
"""
triggered_assets = []
for event in event_list:
# 检查事件是否影响持仓
if event['asset'] in portfolio_assets:
# 根据事件类型判断是否需要调仓
if event['type'] in ['delisting', 'merger', 'st']:
triggered_assets.append(event['asset'])
return len(triggered_assets) > 0, triggered_assets
3.5 四种机制怎么选?
说实话,没有银弹。我自己的经验是:组合使用。
下面这张图是我常用的触发逻辑框架:
我的推荐组合:
- 核心:月度时间触发 + 5%绝对偏离度触发
- 增强:波动率超过30%时,改为周度检查
- 兜底:事件驱动作为独立线程,实时监控
一句话总结: 时间触发保底,偏离度触发精准,波动率触发自适应,事件驱动触发防黑天鹅。四者结合,才是成熟的再平衡体系。
嗯,触发机制就讲到这里。下一节我们聊聊「再平衡的执行策略」——怎么调、调多少、用什么工具,这些细节往往决定了最终收益的差距。