今天在浏览量化文章,发现动量策略基本都是一样的底层算法,其他复杂策略比如五福,七星等策略都是在这个算法基础加入其他条件演变而来,万变不离其宗,常见的动量大概就几种,斜率,涨跌幅,均线相对位置,本质就是比较某一个因子值的大小排序,在交易分析,我整理了几个常见的很慢详细介绍

这个是计算的公式,仔细看看原理
def calculate_momentum_score(self, df):
"""
计算动量分数
使用加权线性回归计算对数收益率的斜率,并结合R²加权
"""
if len(df) < self.mom_daily:
return 0
df_sub = df.tail(self.mom_daily).copy()
if len(df_sub) < 10:
return 0
y = np.log(df_sub['close'].values)
n = len(y)
weights = np.linspace(1, 2, n)
x = np.arange(n)
slope, intercept = np.polyfit(x, y, 1, w=weights)
annualized_returns = math.pow(math.exp(slope), 250) - 1
residuals = y - (slope * x + intercept)
weighted_residuals = weights * residuals**2
y_mean = np.mean(y)
r_squared = 1 - (np.sum(weighted_residuals) / np.sum(weights * (y - y_mean)**2))
score = annualized_returns * r_squared
return score

加权,靠近最近的数据权重大


用 R² 乘以年化收益率,可以惩罚那些虽然斜率大但波动剧烈的"假趋势"。


该函数把"过去 N 天对数价格"拟合成一条加权直线:斜率给出年化收益率(赚多少),R² 给出趋势可信度(有多稳),二者相乘得到兼顾收益与稳健性的动量分数。

下面就是利用这个因子进行回测看看结果,第一步选择我们需要回测的标的,一般是相关性低的标的,一般建立是全球大类,让组合策略的风格均衡

第二步是否开启大盘选择交易,比如指数的现在价格大于N日均线开启交易,否则不交易,一般不开启

第三步选择动量的模型,比如第一个斜率动量算法,设置动量的周期,交易的参数等,自定义

开启动量区间的选择,比如动量大于N小于M买入,不符合就卖出,换其他符合的标的,全部标的不风格就清仓

设置开仓的条件一般不开启,

持股做T止盈止损模块的设置

点击回测看看效果怎么样,全部的参数,模块都是自定义的,整理需要特别注意就是,标的的选择,etf有很多一样的标的,有的上市时间早,有的晚,一般选择上市时间长的标的回测,比如创业板etf就有很多个,选择上市时间长的标的回测

这个波动还是很大的,收益和收益有关系,条件严格,收益一般会下降


回撤分析分析,最大回撤发送在今年的7月份,应该是和半导体有关系

加入题材策略的收益,波动会上来,稳健的话一般采用宽基就可以回撤交易记录

收益统计分析

综合来看,动量策略是有超额的,但需要注意动量策略的波动比较大,标的选择需要低相关性,不让容易追涨杀跌,
分数为正 → 处于上升趋势,数值越大,涨得越快越稳。分数为负 → 处于下降趋势,绝对值越大,跌得越快越稳。分数接近零 → 没有明确趋势,处于震荡或横盘。
- 横截面选股(最核心的用法)
所谓横截面,就是在同一个时间点,把全市场所有股票都用这个函数打分,然后排序。买分数最高的那一批 → 买"跑得最快、趋势最稳"的强势股。卖(或做空)分数最低的那一批 → 卖"跌得最狠"的弱势股。
这是最经典、最成熟的动量用法。它的逻辑是"强者恒强"——过去一段时间趋势最强的股票,未来一段时间往往继续强。R² 加权的好处在于,它会把那些虽然涨幅大、但走势剧烈震荡的"妖股"自动降分,从而避免追高被套。
- 动量轮动
轮动指的是在多个标的之间来回切换,永远持有当下动量最强的那几个。常见的轮动对象包括:行业轮动:在几十个行业指数里选最强的行业。大小盘轮动:在沪深300和中证500之间切换。股债轮动:在股票和债券之间切换。跨境/资产轮动:在 A 股、美股、黄金、商品之间切换。做法是每隔一段时间(比如每月)重新给所有候选标的打分,只留正分且分数最高的几个,等权持有。这个用法非常稳健,因为它天然会回避掉下跌的资产。
这个动量算法最核心的运用就是两件事:横截面上选强者(买分数最高的品种),时序上做择时(用分数大小调仓位、转负就离场)。围绕这两点,它能扩展到选股、轮动、多因子、趋势跟踪、风控等多个方向,配合多周期组合和止损,就能构成一套完整、可落地的趋势策略
不懂的问我就可以加我备注入群可以加入量化研究群

加我备注开户,有专业的量化支持服务,快速响应

核心的计算代码
def calculate_momentum_score(self, df):
"""
计算动量分数
使用加权线性回归计算对数收益率的斜率,并结合R²加权
"""
if len(df) < self.mom_daily:
return 0
df_sub = df.tail(self.mom_daily).copy()
if len(df_sub) < 10:
return 0
y = np.log(df_sub['close'].values)
n = len(y)
weights = np.linspace(1, 2, n)
x = np.arange(n)
slope, intercept = np.polyfit(x, y, 1, w=weights)
annualized_returns = math.pow(math.exp(slope), 250) - 1
residuals = y - (slope * x + intercept)
weighted_residuals = weights * residuals**2
y_mean = np.mean(y)
r_squared = 1 - (np.sum(weighted_residuals) / np.sum(weights * (y - y_mean)**2))
score = annualized_returns * r_squared
return score