[QMT量化交易小白入门]-二十五、DeepSeek生成的年化收益率54%的动量因子评分算法(含代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。
QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

相关阅读

小白也能做量化:零门槛QMT、Ptrade免费送
量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包
年化收益达到了70%,增加了动态仓位权重调整后的全球核心资产轮动策略(含python代码解析)


上一篇文章中我们复刻了策略:量化交易python代码解析:年化收益47%的全球核心资产轮动策略

我们仍然用之前的方法,让DeepSeek帮助我们优化评分算法,他的思考逻辑如下:
在这里插入图片描述

回测的结果年化收益率达到了54%:

在这里插入图片描述
主要从以下几个方面进行了优化:
主要优化点说明:

  1. 数据质量增强
  • 增加数据长度校验(允许最多20%数据缺失)
  • 使用实际时间戳而非简单递增序号
  • 采用固定回溯窗口(避免幸存者偏差)
  1. 模型改进
  • 改用scipy的稳健线性回归
  • 使用sklearn的r2_score函数(更准确的计算)
  • 加入动量因子(21日收益率)
  1. 风险调整
  • 引入波动率调整后的夏普比率
  • 动态权重分配(收益质量与动量结合

接下来我们就具体看下优化后的评分算法。

一、函数概述:优化后的ETF评分函数

def calculate_etf_scores(etf_pool, mkdict, lookback_window=63):
    """
    优化后的ETF评分函数
    :param etf_pool: ETF列表
    :param mkdict: 包含各ETF历史数据的字典
    :param lookback_window: 观察窗口(默认63个交易日,约3个月)
    :return: 排序后的ETF评分DataFrame
    """

这个函数是整个策略的核心,它接收三个参数:etf_pool是待评估的ETF列表;mkdict是一个包含了各ETF历史数据的字典,通过它可以获取每个ETF的历史价格等信息;lookback_window是观察窗口,默认设置为63个交易日,大约相当于3个月的时间。函数的返回值是一个经过排序的ETF评分DataFrame,通过这个评分,可以确定哪些ETF更具投资价值。

二、数据准备与质量检查

score_list = []
valid_etfs = []

for etf in etf_pool:
    try:
        #df = mkdict[etf].tail(63)  # 使用固定时间窗口
        df = mkdict[etf]
        # 数据质量检查
        if len(df) < lookback_window * 0.8:  # 允许20%数据缺失
            continue

初始化两个空列表score_listvalid_etfs,分别用于存储ETF的评分和有效的ETF名称。然后,通过循环遍历etf_pool中的每个ETF。在循环内部,注释掉的代码df = mkdict[etf].tail(63)原本是使用固定时间窗口来获取数据,但这里直接使用了df = mkdict[etf]获取整个历史数据,这可能是为了更全面地分析ETF的表现。接着进行数据质量检查,如果某个ETF的数据长度小于观察窗口的80%,即允许最多20%的数据缺失,那么就跳过该ETF,继续处理下一个。这一步确保了只对数据质量较好的ETF进行分析,避免了因数据不完整而导致的错误结果。

三、数据处理:实际时间序列与线性回归分析

# 使用实际时间序列(处理非交易日问题)
x = pd.to_numeric(df.index).values.reshape(-1, 1)
y = np.log(df['close'].values)

# 稳健线性回归(处理异常值)
slope, intercept, r_value, _, _ = stats.linregress(x.flatten(), y)

为了处理非交易日的问题,将ETF的时间索引转换为数值型,并重塑为二维数组x,同时将ETF的收盘价取对数后赋值给y。这样处理的好处是,通过对数变换可以使数据更加稳定,减少极端值的影响。接下来,使用stats.linregress函数进行稳健线性回归分析。这个函数可以有效地处理异常值,得到回归直线的斜率slope、截距intercept以及相关系数r_value等参数。这些参数将为后续的分析和计算提供重要依据。

四、年化收益率计算优化

# 年化收益率计算优化
daily_growth = np.exp(slope) - 1
annualized_returns = (1 + daily_growth) ** 252 - 1  # 使用实际交易日数

根据线性回归得到的斜率slope,首先计算出每日增长率daily_growth,其计算公式为np.exp(slope) - 1。然后,使用实际交易日数(252天)来计算年化收益率annualized_returns,公式为(1 + daily_growth) ** 252 - 1。这种计算方法考虑了实际的交易天数,相比简单地按照日历天数计算更加准确和合理,能够更真实地反映ETF的年化收益情况。

五、改进的R²计算

# 改进的R²计算
y_pred = slope * x.flatten() + intercept
r_squared = r2_score(y, y_pred)

通过线性回归得到的斜率slope和截距intercept,可以计算出预测值y_pred。然后,使用r2_score函数计算决定系数r_squared,它衡量了模型对数据的拟合程度。与传统的R²计算方法相比,这里的改进之处在于它是在线性回归的基础上进行的,能够更准确地反映ETF价格与时间之间的线性关系,从而为评估ETF的表现提供了更可靠的依据。

六、动态权重调整(波动率调整)

# 动态权重调整(波动率调整)
volatility = np.std(np.diff(y)) * np.sqrt(252)
risk_adjusted_return = annualized_returns / (volatility + 1e-6)  # 防止除零

波动率是衡量资产风险的重要指标之一。在这里,通过计算ETF收盘价对数收益率的差分的标准差,并乘以一年的实际交易日数的平方根,得到年化波动率volatility。然后,用年化收益率annualized_returns除以波动率加上一个极小的值(1e-6,用于防止除零错误),得到风险调整后的收益率risk_adjusted_return。这种动态权重调整的方法考虑了ETF的风险因素,使得不同风险水平的ETF能够在一个相对公平的基础上进行比较。

七、综合评分(加入动量因子)

# 综合评分(加入动量因子)
momentum = df['close'].pct_change(21).iloc[-1]  # 1个月动量
score = (risk_adjusted_return * r_squared) + (0.3 * momentum)

除了考虑风险调整后的收益率和决定系数外,还加入了动量因子。动量因子反映了ETF价格变化的趋势,通常认为具有正动量的ETF在未来一段时间内表现可能会更好。这里,计算了ETF在过去1个月内的收盘价的百分比变化作为动量因子momentum。将风险调整后的收益率与决定系数的乘积加上动量因子的0.3倍作为综合评分score。这种综合评分方法综合考虑了多个因素,能够更全面地评估ETF的投资价值。

八、创建评分DataFrame与标准化处理

# 创建评分DataFrame
df_score = pd.DataFrame(index=valid_etfs, data={'score': score_list})

# 分数标准化
df_score['score'] = (df_score['score'] - df_score['score'].mean()) / df_score['score'].std()
df_score = df_score.sort_values(by='score', ascending=False)

将所有有效的ETF及其对应的评分组合成一个DataFrame df_score。为了使评分具有可比性,对分数进行了标准化处理,即减去分数的均值再除以分数的标准差。这样处理后,得分越高的ETF表示其综合表现越好。按照分数从高到低对DataFrame进行排序,得到最终的ETF评分结果。

九、个人观点

整体年化收益率比原本提升了15%,DeepSeek用来做算法优化能力还是很强的,不涉及平台相关的行情和交易函数,写出来的代码出错明显少了很多,给出的优化建议也是从专业量化出发。要注意的是,他给出的代码没有第三方库的引入来源,需要自行甄别。目前策略回测还是比较大的,后面还需要加上仓位动态管理。

### QMT量化交易平台的优势 QMT智能量化交易系统具备显著的技术优势,能够满足现代金融市场对于速度和精度的要求。该平台不仅实现了高效的订单处理能力,还通过高度自动的流程减少了人为干预的可能性,从而提高了交易效率[^1]。 #### 高效性 QMT系统的架构设计旨在优数据传输路径并减少延迟时间,在毫秒级别内完成复杂的计算任务,确保指令快速下达市场。这种低延迟能力使得用户能够在瞬息万变的行情中抓住最佳买卖时机。 #### 精准度 为了提高决策准确性,QMT集成了先进的算法模型用于分析历史价格走势以及预测未来趋势变。这些模型基于大量真实交易记录训练而成,可以有效识别潜在的投资机会,并提供科学合理的建议给到使用者。 #### 自动程度高 整个交易过程几乎完全由计算机程序控制,从选股、建模直到下单执行都无需人工参与。这不仅降低了操作风险,也节省了大量的时间和精力成本,让投资者可以把更多注意力放在策略研究上而不是日常繁琐的操作当中。 --- ### QMT量化交易平台的特点 除了上述提到的核心竞争力外,QMT还有以下几个值得注意的地方: - **丰富的API接口**:支持多种编程语言接入,方便开发者根据自己需求定制专属功能模块; - **强大的回溯测试环境**:允许用户在一个模拟环境中反复验证自己的投资逻辑是否可行,直至满意为止再投入实际资金运作; - **严格的安全保障措施**:采用多重加密技术和权限管理机制来保护客户资产安全和个人信息安全; --- ### 主要功能介绍 针对不同层次用户的多样需求,QMT提供了广泛而深入的服务选项: - **策略编写与调试**:内置可视编辑器可以帮助初学者轻松构建简单有效的交易规则;而对于高级玩家,则开放源码级访问权限以便于实现复杂多样的个性设定。 ```python def simple_moving_average_strategy(data, short_window=40, long_window=100): signals = pd.DataFrame(index=data.index) signals['signal'] = 0.0 # 计算短期移动平均线 (SMA) 和长期 SMA signals['short_mavg'] = data['Close'].rolling(window=short_window, min_periods=1).mean() signals['long_mavg'] = data['Close'].rolling(window=long_window, min_periods=1).mean() # 创建买入/卖出信号 signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0) # 生成交易订单 signals['positions'] = signals['signal'].diff() return signals ``` - **实时监控与预警通知**:一旦市场价格触及预设条件即刻触发警报提醒,使投资人不会错过任何重要事件的发生时刻。 - **跨市场联动分析**:利用大数据挖掘技术关联多个交易所之间的关系模式,寻找套利空间或避险途径[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python自动化工具

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值