Why:时序动量和截面动量有什么本质不同?
想象一个场景:大盘暴跌5%,你的股票池里A跌了2%,B跌了8%。
截面动量会说:买入A,因为它比B强——这是相对排名的逻辑。
时序动量会说:全部清仓,因为两个都在跌——这是绝对趋势方向的逻辑。
2020年3月,新冠疫情冲击全球市场,标普500在23个交易日内暴跌34%。如果你用的是截面动量,你会继续持有"跌得最少"的股票组合,它们一样在亏钱。但如果你用时序动量,信号很明确:趋势向下,离场或做空。
时序动量关注的是资产自身的趋势方向,不需要和别人比。这个区别看似微小,实则是两套完全不同的决策框架——在趋势明确的市场里,时序动量远比截面动量直观有效。
What:时序动量的核心机制
与截面动量的根本差异
维度 | 截面动量 | 时序动量 |
信号来源 | 横截面相对排名 | 时间序列绝对趋势 |
逻辑 | "谁比谁强" | "自己在涨还是跌" |
做空 | 需要空头组合对冲 | 自然产生做空信号 |
适用市场 | 股票横截面 | 期货、外汇、商品 |
风险暴露 | 始终有beta暴露 | 可完全市场中性 |
简单说:截面动量是"选秀赛",时序动量是"通行证"。
开平仓规则设计
最经典的时序动量规则:
入场规则:
•过去N个月收益率 > 0 → 做多
•过去N个月收益率 < 0 → 做空(或空仓)
•过去N个月收益率 = 0 → 空仓
平仓规则:
•多头持仓:当过去N个月收益率转负 → 平仓
•空头持仓:当过去N个月收益率转正 → 平仓
更精细的版本会加入波动率过滤:只有当趋势强度(收益率/波动率)超过阈值时才入场,避免在震荡市里反复开平仓被来回打脸。
趋势强度的衡量指标
光看"正还是负"太粗糙了。三个常用趋势强度指标:
1. 创新高比率(High Breakout Ratio)
创新高比率 = 过去N日创新高次数 / N
比率越高,说明上涨趋势不是靠单日暴涨,而是持续突破新高——更健康的趋势。
2. 价格加速度(Price Acceleration)
对价格序列做二阶差分,或者用短期均线与长期均线的差值变化率:
加速度 = (MA_short - MA_long)的变动率
加速度为正,趋势在加速;加速度转负但差值仍为正,趋势在减速——这是趋势衰竭的早期信号。
3. 风险调整动量(Sharpe Momentum)
风险调整动量 = 过去N日收益率 / 过去N日波动率
本质就是滚动夏普比率。5%的收益配10%的波动,远不如5%收益配2%波动——后者趋势更"实"。
时序动量在期货市场的应用优势
时序动量在期货市场比股票市场更适合,原因有三:
1.天然可做空:期货多空对称,时序动量信号直接映射为多空方向,不需要额外的融券安排
2.连续交易:期货没有涨跌停限制(大部分品种),趋势信号不会被打断
3.杠杆可控:期货可以通过保证金比例精确控制暴露度,时序动量+波动率目标仓位是标配组合
AQR资本(Cliff Asness创立)的时序动量策略是业内标杆,他们在期货、外汇、固定收益上同时运行时序动量,利用不同资产的趋势低相关性分散风险。
How:国内用户怎么实操时序动量?
第一步:选择品种和周期
•品种:期货品种最合适(螺纹钢、沪铜、原油、豆粕等),股票也可以但做空受限
•信号周期:建议从月度信号开始(过去20个交易日收益率),过度日频信号噪音太大
•组合构建:多品种同时运行,每个品种独立产生信号
第二步:信号生成
// python
import numpy as np
import pandas as pd
def tsmom_signal(prices, lookback=20):
"""
生成时序动量信号
prices: 收盘价序列
lookback: 回看周期(交易日)
返回: 1=做多, -1=做空, 0=空仓
"""
returns = prices.pct_change(lookback)
vol = prices.pct_change().rolling(lookback).std() * np.sqrt(252)
# 基础信号:涨做多、跌做空
signal = np.sign(returns)
# 波动率过滤:波动率极端时降低仓位
vol_target = 0.15 # 年化目标波动率15%
position = signal * (vol_target / vol) # 波动率缩放
# 限制最大杠杆
position = position.clip(-2, 2)
return position
第三步:仓位管理——波动率目标法
时序动量最关键的实操细节不是信号,而是仓位管理。波动率目标法:
目标仓位 = 信号方向 × (目标波动率 / 过去N日已实现波动率)
逻辑:波动大的时候少做,波动小的时候多做,让每笔交易的风险贡献大致相等。这比固定手数交易稳定得多。
第四步:多品种组合
// python
# 多品种时序动量组合
def portfolio_tsmom(price_dict, lookback=20, vol_target=0.15):
positions = {}
for name, prices in price_dict.items():
positions[name] = tsmom_signal(prices, lookback)
# 等风险权重分配
position_df = pd.DataFrame(positions)
weight = 1.0 / len(position_df.columns) # 等权
portfolio_position = position_df * weight
return portfolio_position
品种选择原则:
•趋势性强的品种优先(原油、黄金、铜等大宗商品)
•品种间相关性低(不要全是黑色系或全是化工)
•流动性足够(日均成交额>10亿)
第五步:回测与参数校准
回测数据仅作教学演示,不代表未来表现
用国内期货主力合约2018-2024年数据回测:
•单品种时序动量月度胜率约40-45%,靠的是盈亏比(平均盈利/平均亏损约2:1)
•多品种组合(10+品种)后,年化波动率可控制在10-15%,夏普比率1.0-1.5
•最大回撤通常发生在趋势反复反转的震荡期(如2022年下半年商品宽幅震荡)
参数敏感性提醒:lookback周期在15-60个交易日范围内策略都有效,不必过度优化。真正影响绩效的是仓位管理和品种分散度,不是信号参数的微调。
时序动量的数学本质:你赌的不是方向,而是趋势的持续性。只要趋势延续的概率>0.5(哪怕只高一点点),配合合理的仓位管理,期望收益就是正的。这不是玄学,是大数定律。