风险提示:本内容为量化技术及平台操作的纯知识分享,不构成任何投资建议,不推荐任何具体证券或交易时机。部分内容可能理解包含错误,请自行核实。市场有风险,投资需谨慎文章全部内容设计到的标的,只做策略思路的分析,不做投资参考,
今天完成了回测系统的开发,api接口的开发,方便我直接调用量化接口,就行策略的开发分析,做策略参数的组合分析,看那个参数比较合适,我自己计算了大量的因子,差不多1000个因子,可以给机器学习,做因子的组合优化,我也参考金融工程马科维茨思路做了一个简单的优化算法,利用利用全部的因子组合无数的策略,这个用人工处理不太可能,用电脑处理组合很快,我今天完成了全部数据的api编写,后面可以写skills,mcp直接给api调用分析系统,自动挖掘,越来越智能分析,可以远程执行回测

读取因子数据,行情数据,财务数据等

模型实现的回测算法有下面这么多,我还在添加量化分析工具

今天利用回测框架,看怎么样实现第一个动量策略,手动操作的太麻烦,我一般是用量化api直接操作速度快

点击动量模型进入回测

第一步添加标的,支持全市场的,动量的核心在于标的的相关性要低,太高的相关性容易动量出了进入同样一样的标的,容易套,选择全球大类资产,相关性低的标的建立投资组合
动量计算思路
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


可以利用相关性分析系统,分析一下标的相关性


相关性明细数据

协方差分析,总体的相关性比较低

策略的大概思路是安动量排序,选择合适的动量值,amir动量排名的前N个标的,实现动量的思路,本质是一个动量加趋势跟踪的策略,自定义自己的参数回测

设置我们认为合理的参数,回测就可以,也可以利用api接口偏离回测自己的思路

全球大类的组合思路结果,回测稍微有一点大,这个是动量本身无法避免的,可以提高买入组合降低单一标的的仓位

回测分析

交易记录

持股数据

详细统计

不懂的问我就可以,加我备注入群可以加入专业的量化研究群

[#量化策略]() [#动量策略]() [#金融科技]() [#量化回测]() [#ai]() [#数据分析]() [#量化交易]()
动量代码计算参考
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