动量因子(Momentum Factor)描述资产价格延续过去趋势的倾向。
其源于动量效应(Momentum Effect)
过去表现好的资产,未来一段时间内倾向于继续表现好;
过去表现差的资产,倾向于继续表现差。
这里探索动量因子逻辑以及其计算方法。
1 基本定义
经典动量因子构建方法由Jegadeesh和Titman(1993)提出。
按过去6-12个月的总回报率对股票排序,
买入赢家组合、卖出输家组合,持有3-12个月可获得超额收益。
该因子通常被称为UMD(Up Minus Down)。
动量因子利用了时间序列的自相关性,资产价格未来的涨跌与其过去的涨跌存在统计关联。
2 收益来源
动量因子能够产生持续超额收益,根源在于风险溢价补偿与行为偏差导致的错误定价共同作用。
2.1 风险溢价补偿
资产价格受到某些持续因素,如基本面趋势、行业景气度等长期作用,推动其持续上涨或下跌。
动量策略本质上是在捕捉这些持续性因素的暴露,并为此承担相应的风险以获取补偿。
研究表明一年期动量的收益部分来源于风险补偿,且该风险主要是业绩基本面风险。
2.2 行为偏差
行为金融学为动量效应提供了更丰富的解释。
1)保守性偏差
投资者面对新信息时更新信念过慢,导致价格对新信息的反应不足。
价格逐步消化信息的过程形成了动量。
2)证实偏差
投资者倾向于寻找支持自己已有判断的信息,强化了既有趋势。
3)处置效应
投资者倾向于卖出赢家、持有输家,这种行为在一定程度上抑制了动量效应的持续时间。
4)异质信念
投资者之间对信息的解读存在分歧,异质信念的加剧会延长动量效应的持续时间。
另外,分析师评级调整滞后以及资金流对趋势的强化,赢家吸引资金流入进一步推高价格,也是重要的结构性因素。短期动量如一个月的收益主要来自行为偏差造成的错误定价,而非风险补偿。
3 关键因素
动量因子的表现并非一成不变,其效果强弱受多种因素调节。
3.1 投资者结构
当价格变动主要由机构投资者主导时,动量特征更明显;
而当价格变动主要由散户投资者主导时,反转效应更强烈。
这是因为机构投资者相对理性,交易行为更多基于基本面信息的逐步释放;
而散户交易中噪声成分更高,容易导致过度反应后的价格反转。
3.2 股票特征
动量特征更明显的股票池特征:高机构覆盖、大市值、低波动、高价值的股票。
反转效应更显著的股票池特征:低覆盖、小市值、高波动、低流动性、低价值的股票。
3.3 市场状态
动量类因子倾向于释放更多动量特征的环境特征如下
1)市场处于下跌、低波动时期
2)风格处于大盘占优、成长占优时期
动量类因子倾向于释放更多反转特征的环境:
1)市场处于上涨、高波动时期
2)风格处于小盘占优、价值占优时期
散户较多A股市场,震荡市下动量因子ICIR可达+0.45(正向),而牛市中则为-0.36(反向)。
随着A股机构化程度持续提升,动量特征会越来越明显,反转效果将逐步削弱。
4 动量计算
动量逻辑判断特定时刻交易投资者占比更偏向机构还是个人,并将该判断以权重序列形式表达。
动量因子开发的核心在于设计合理的权重序列,即对不同时期的历史收益赋予不同的权重。
因此,动量因子的构建可以抽象为历史收益率序列向量与权重序列向量的内积,
比如,对各类行情持续时间的统计计算。
4.1 1个月收益率
过去 20个交易日涨幅越大,预期继续涨,即动量效应。
通常用ret_1m表示1个月收益率
ret = price(t) / price(t-20) - 1
短期动量效应较弱甚至为负,则说明是反转效应主导。
示例代码如下
shift(1) 避免未来函数,用 t 日因子预测 t+1→t+20 收益
def factor_return_1m(prices: pd.DataFrame, **kwargs) -> pd.DataFrame:
"""1-month (20 trading day) past return --- momentum factor."""
return prices.pct_change(20, fill_method=None).shift(1)
4.2 3个月收益率
3个月收益率,计算的是中期动量,目的是过滤短期噪音。
通常用ret_3m表示3 个月收益率
ret = price(t) / price(t-60) - 1
ret_3m反映的是典型持仓周期,即20天调仓。
示例代码如下
def factor_return_3m(prices: pd.DataFrame, **kwargs) -> pd.DataFrame:
"""3-month (60 trading day) past return."""
return prices.pct_change(60, fill_method=None).shift(1)
4.3 6个月收益率
6 个月收益率表示的是半年度动量。
通常用ret_6m表示6 个月收益率。
ret = price(t) / price(t-120) - 1
计算代码示例如下
def factor_return_6m(prices: pd.DataFrame, **kwargs) -> pd.DataFrame:
"""6-month (120 trading day) past return."""
return prices.pct_change(120, fill_method=None).shift(1)
4.4 12个月收益率
表示年度动量,即美股经典的12-1 momentum。
通常用ret_12m表示12个月收益率。
ret = price(t) / price(t-250) - 1
示例代码如下
def factor_return_12m(prices: pd.DataFrame, **kwargs) -> pd.DataFrame:
"""12-month (250 trading day) past return."""
return prices.pct_change(250, fill_method=None).shift(1)
4.5 长期反转因子
长期反转因子的目的是排除最近 1 个月的短期反转噪音,捕捉中长期反转信号。
通常用ret_1m_skip_1m 表示长期反转因子,即跳过近 1 月。
ret = ret_12m - ret_1m
= [price(t) / price(t-252) - 1] - [price(t) / price(t-21) - 1]
那为什么跳过 1 月。
比如A 股短期(1个月)反转强烈,中长期(>6个月)可能回归动量,跳过近期可分离两种效应。
示例代码如下
def factor_return_1m_skip_1m(prices: pd.DataFrame, **kwargs) -> pd.DataFrame:
"""
Reversal factor: return from t-252 to t-21 (skip last month).
Captures long-term reversal / momentum without short-term noise.
"""
ret_12m = prices.pct_change(252, fill_method=None).shift(1)
ret_1m = prices.pct_change(21, fill_method=None).shift(1)
return ret_12m - ret_1m
5 动量风险
动量因子虽然长期有效,但具有明显的尾部风险:
1)趋势反转风险
在市场转折点,如政策冲击、市场修正后,动量策略可能遭遇剧烈回撤。
2)动量崩溃
在快速反弹的市场环境中,如2020年3-6月的疫情复苏期,动量策略表现尤为糟糕。
3)与价值因子的负相关
动量和价值因子历史上呈负相关,当价值股强势反弹时,动量策略往往承压。
动量因子通常不单独使用,而是与价值、质量、低波动等因子组合,降低单一因子的回撤风险。
reference
股指期货三因子预测模型
https://htfc.com/wz_upload/png_upload/20180928/1538115038893c5ef9a.pdf#1#1
量化多因子系列(6):关于动量 你所希望了解的那些事
https://stock.finance.sina.com.cn/stock/view/paper.php?reportid=707819075972