最常见的一种用法,就是看 5 日均线和 10 日均线:5 日均线上穿 10 日均线,认为短期走势转强;5 日均线跌破 10 日均线,认为短期趋势转弱。这套规则简单、透明、容易执行,但真正放到市场里,很快就会遇到问题。行情一旦进入震荡区间,5 日线和 10 日线会频繁金叉、死叉,刚买进去价格又跌回来,刚卖出去价格又涨上去。几轮下来,利润没有多少,手续费、滑点和心态成本倒是先交了一遍。所以这次我不只讨论“5/10 双均线有没有用”,而是把它放到一个更完整的验证框架里,比较四组策略:5/10 双均线、5/10 双均线 + 强化学习、参数搜索双均线、滚动验证双均线。这样既能看传统规则本身的效果,也能看 AI 过滤、参数优化和滚动验证是否真的带来改善。| 策略名称 | 核心逻辑 | 主要作用 | 适合观察的问题 |
|---|
| 5/10 双均线 | 5 日均线上穿 10 日均线持仓,否则空仓 | 基础均线策略 | 固定短周期规则是否有效 |
| 5/10 双均线 + 强化学习 | 双均线先给信号,再由模型判断是否放行 | 信号过滤 | AI 是否能减少低质量交易 |
| 参数搜索双均线 | 在训练集搜索更优快慢均线组合,再到测试集验证 | 参数优化 | 5/10 是否过于死板 |
| 滚动验证双均线 | 每个窗口重新选参数,再用后续窗口测试 | 稳定性检验 | 策略是否只拟合某段行情 |
这里要说明一点:强化学习不是替代双均线,也不是让 AI 自己乱买乱卖。当 5/10 双均线发出看多信号后,模型再结合市场状态判断:这次信号更像趋势启动,还是更像震荡假突破。def ma_cross_signal(close, fast=5, slow=10): fast_ma = close.rolling(fast).mean() slow_ma = close.rolling(slow).mean() return (fast_ma > slow_ma).astype(float).fillna(0.0)
这里的 1 代表持仓,0 代表空仓。为了避免未来函数,回测不会用今天收盘后产生的信号,假设今天已经成交,而是统一延后一根 K 线执行。也就是说,今天收盘后看到信号,下一根 K 线才允许交易。很多看起来很漂亮的回测,问题就出在这里:它们默认你能在信号出现的同一根 K 线上成交,相当于提前知道了未来结果。这样的曲线再好看,也没有实盘意义。强化学习版本不是凭空预测涨跌,而是把常见市场状态转化成特征。它会观察均线距离、均线斜率、价格相对均线的位置、近期波动率、短期涨跌幅和成交量变化。
features["ma_diff"] = (fast_ma - slow_ma) / slow_mafeatures["fast_slope"] = fast_ma.diff(3) / closefeatures["price_pos"] = (close - slow_ma) / slow_mafeatures["volatility_10"] = close.pct_change().rolling(10).std()features["ret_5"] = close.pct_change(5)features["volume_z"] = (volume - volume.rolling(20).mean()) / volume.rolling(20).std()
ma_diff 看均线距离,fast_slope 看短线趋势是否加速,price_pos 看价格是否偏离均线太远,volatility_10 看近期波动是否过大,ret_5 看短期动量,volume_z 看成交量是否异常。当 5/10 双均线发出持仓信号时,判断这次信号是否值得执行。如果它认为当前环境更像震荡假突破,就不放行;如果更像趋势延续,就允许持仓。如果只比较 5/10 双均线和强化学习,结论还不够完整。因为 5/10 本身只是经验参数,并不一定适合所有股票和行情。
参数搜索会在训练集里遍历不同快慢均线组合,比如快线从 3 到 30,慢线从 10 到 100,选出训练集表现较好的组合,再放到测试集验证。它要回答的问题是:如果固定 5/10 表现一般,到底是均线思想不行,还是参数太死板?它会让时间向前滚动,每个窗口重新训练、重新选参数,再用后续窗口测试。这样可以观察策略是否只在某一段行情有效,还是在不同阶段都有相对稳定的表现。| 验证方式 | 做法 | 优点 | 风险 |
|---|
| 固定 5/10 | 全程使用 5 日和 10 日均线 | 简单透明 | 参数僵化 |
| 参数搜索 | 训练集找参数,测试集验证 | 能发现更适合样本的参数 | 可能过拟合 |
| 滚动验证 | 多窗口训练和测试 | 更接近真实研究流程 | 计算更慢 |
| 强化学习过滤 | 固定 5/10 信号,再由模型过滤 | 尝试减少误交易 | 解释性较弱 |
平均总收益、夏普分布、最大回撤分布、盈利股票占比、第一名次数、收益-回撤定位图、综合评分热力图。它们分别回答收益、风险、稳定性、泛化能力和综合表现的问题。本文内容仅用于 Python 编程、量化研究和数据分析学习,不构成任何投资建议。任何交易策略都可能在未来失效,强化学习模型也可能出现过拟合、样本外失效、市场环境变化后表现下降等问题。参数搜索和滚动验证可以降低一部分过拟合风险,但不能消除风险。股票市场有风险,投资需谨慎。实盘交易前,请务必结合更长周期数据、多市场环境验证、模拟盘测试和自身风险承受能力进行综合判断。