先交代一下背景。三个月前我搭了一套用机器学习做股票方向预测的小系统回测结果出来那一刻我差点以为自己要财富自由了AI评估的历史胜率冲到90%以上。冷静下来之后我又花了两周时间把这个90%拆了个底朝天越拆越觉得自己当初太天真。这篇就聊聊这个AI认为胜率90%的投资策略到底是怎么设计出来的、问题出在哪、以及最后我改成了什么样子。内容偏实战适合对量化交易和机器学习结合感兴趣又不想被各种稳赚不赔话术忽悠的朋友。先说结论AI认为胜率高和策略真正能赚钱中间隔着一整条马里亚纳海沟。这个90%不是骗局但它是被一堆隐蔽的假设和统计口径喂出来的。我会从策略的设计源头开始复盘把每一步的坑都摊开讲。1. 我为什么觉得AI选股这件事有戏1.1 传统技术分析的痛点入市一段时间的人大概都有这种感觉均线金叉、MACD背离、KDJ超卖这些指标单独拎出来都有道理组合起来却经常打架。更麻烦的是同样一个信号在不同市场环境里表现完全不一样——牛市里突破买入怎么买怎么对震荡市里突破就是接盘的同义词。我一直想要一个能自动适应市场变化的系统而不是靠人去猜当前该用哪套规则。机器学习的思路天然契合这个需求让模型自己从历史数据里学规律而不是我告诉它规律是什么。这是我做这个项目的第一个动机。1.2 把炒股翻译成机器学习问题要让AI介入第一步是把预测股价这个模糊目标翻译成模型能吃的格式。我当时的做法是预测对象未来第T天我最初用的是下一天的收益方向是涨还是跌转成二分类问题。输入特征过去20个交易日的开高低收量价数据加上一组技术指标。模型选型结构化表格数据优先试了梯度提升树LightGBM系和随机森林后来也对比过LSTM效果并没有质的提升反而更难调。训练方式滚动训练用过去两年的数据训练预测未来三个月的样本然后再向前滚动。为了直观我列一下我最初用的特征清单特征类别具体特征用途量价基础收盘价、成交量、成交额最原始的市场行为记录均线体系MA5/10/20/60价格相对均线的偏离度刻画趋势状态摆动指标RSI、KDJ、BIAS乖离率捕捉超买超卖波动特征历史波动率、ATR、振幅刻画风险水平量能变化近5日量比、量能乖离判断资金活跃度这套设计在思路上并没有太大问题真正出问题的地方在后面——我怎么处理数据、怎么定义胜率、怎么评估结果。2. 90%胜率究竟是怎么算出来的2.1 数据泄漏最隐蔽的作弊我踩的第一个大坑是数据预处理阶段的全区间归一化泄漏。听起来有点拗口我用大白话解释一下。机器学习模型普遍对输入特征的量纲敏感所以训练前要归一化比如把价格缩放到0到1之间。正常做法是只用训练集的数据统计出最大值、最小值然后用这个统计量去缩放训练集和测试集。我当时图省事直接对整段历史数据一次性算好均值方差然后再切训练集和测试集。这就相当于考试前把答案夹在了参考书里。测试集的信息通过归一化参数混进了训练过程。模型在测试集上表现当然好因为它见过未来数据的统计形态。这个坑极其隐蔽回测程序不会报错准确率还特别高但一到实盘就原形毕露——因为实盘数据是实时流进来的你不可能提前知道未来的极大极小值。2.2 标签构造里面的前视偏差第二个问题出在标签上。我最初的标签是第二天收盘价相对于当天收盘价是涨是跌这本身没问题。但我在拼接特征时把当天收盘后的所有数据包括全天成交量、收盘价都算进了特征然后用于预测第二天全天的涨跌。问题在哪第二天还没走完它的信息当然不能用。更隐蔽的是我回测成交价直接用了第二天收盘价成交——这在逻辑上等于你预知了第二天的结果再决定买不买。真实世界里信号是当天收盘后产生的最快只能以第二天开盘价成交中间隔着一个晚上的不确定性跳空、利空消息、隔夜外盘波动。把收盘价信号收盘价成交混在一起就是典型的前视偏差。2.3 90%里有多少水分统计口径的小把戏拆完数据问题我再看那个90%到底怎么来的。结果又发现一个尴尬的事实我计算胜率时分母只统计了模型发出明确看涨信号并实际开仓的交易而模型没信号或者信号置信度低于阈值的日子全部被丢进了无操作分类不计入胜率分母。这意味着什么打个比方一个学生在100道选择题里只挑了最有把握的20道做全对了然后宣称正确率100%——他不提剩下那80道题他根本没敢做。我的模型也一样它只在极少数趋势非常明确的样本上开仓这些样本训练集里本来就容易学胜率高是理所当然的。它掩盖了两个致命问题大部分时间模型根本不知道该干什么以及一旦开仓失败单笔亏损可能吞掉很多次小盈利。2.4 过拟合把噪音当成规律最后还有过拟合。我的特征里塞了20多个技术指标模型在训练集上几乎可以背下每段K线的特定组合。训练集精度一度高到98%验证集也有90%左右但再往后的独立时间段一测立刻掉到55%——跟抛硬币差不多。过拟合的本质是模型把历史数据里的偶然噪音当成了必然规律。特征越多、训练时间越长、模型越复杂噪音被记住得就越牢。我在复盘时用一个简单方式自查把训练数据的时间顺序随机打乱再跑一遍同样的流程如果模型精度依然很高说明它学到的不是时间序列里的因果关系而是某种跟顺序无关的假模式——这不是好信号。3. 回测漂亮模拟盘翻车落差从哪来3.1 模拟盘第一周的实况记录带着那个虚高的回测结果我上了模拟盘。前三天风平浪静小幅盈利我心里还挺美。第四天开始不对劲市场稍微一震荡模型的开仓信号变得极其频繁跟之前回测里精准狙击的风格判若两人。到第二周结束时模拟账户把前几天的利润全部回吐还倒亏了几个点。这个落差几乎可以精确拆解。回测时我用的成交价是理想化的没有计入真实交易中的冲击成本和滑点。实际成交时买一卖一的价差、挂单深度不足导致的滑移每一笔都在侵蚀收益。单看胜率模型还是能有70%以上但盈亏比崩了——因为每一笔亏损都比回测模拟中更大。3.2 市场风格切换模型没见过的新场景另一个很现实的问题是市场环境变了。我的训练数据主要覆盖了一段相对平稳的行情模型学到的是低波动环境下动量延续这类规律。模拟盘期间市场波动率突然放大日内反复涨跌这种模式在训练集里占比极低模型彻底蒙圈。机器学习模型本质上是个模式匹配器它只会对见过的模式给出可靠判断。历史数据里没有的极端情形它处理不了。这也是为什么任何量化策略都必须强调样本外测试——用模型从未见过的时间段做验证而不是只在同一个历史区间上反复调参自我感动。3.3 我把几个主要失败模式整理成了表格失败模式回测里的表现模拟盘里的真实结果核心原因数据泄漏型胜率90%几乎不回撤快速失效方向频繁判断错误归一化、标签构造混入未来信息过拟合型训练集98%验证集90%独立时段掉到55%信号混乱特征太多、模型记住了噪音成本忽略型胜率好看、净值稳步上升实际扣掉滑点和手续费后利润归零没建成本模型环境突变型在单一风格行情里表现好风格切换时连续止损训练分布覆盖不全看这个表就明白了回测是戴着滤镜看历史模拟盘是素颜面对未来。滤镜越厚落差越大。4. 胜率之外量化策略真正要盯的指标4.1 一个反直觉的算术题90%胜率为什么照样亏钱先说个简单的数学例子。假设你的策略做10笔交易9笔盈利每笔赚1%1笔亏损亏掉20%结果是什么总收益 9 × 1% - 1 × 20% -11%胜率90%照样亏钱。这个例子极端但很直观地说明了一个道理胜率只是表象真正决定账户净值的是期望值期望收益。期望值的公式很简单期望收益 胜率 × 平均单笔盈利 - (1 - 胜率) × 平均单笔亏损如果平均盈利贡献只有1%而平均亏损要吃掉5%那就算胜率90%长期也是亏的。反过来很多趋势跟踪策略胜率只有40%上下但靠截断亏损、让利润奔跑依然能稳定盈利。我最初只盯着胜率这个单指标是典型的认知偏差。4.2 我重构评估体系后真正盯住的指标吃了一次亏之后我做了一套新的评估清单逐项检查策略成色指标含义我当时为什么必须盯它期望收益每笔交易平均贡献的净收益看策略长期是否正期望盈亏比平均盈利 / 平均亏损判断赚钱交易能否覆盖亏损交易最大回撤净值从高点回落的最大幅度心理承受和风控的核心约束夏普比率单位风险的超额回报衡量收益的质量而非数量盈利交易占比真正赚钱的开仓比例结合盈亏比一起看避免被单一胜率误导交易频率单位时间开仓次数频率太低样本少频率太高成本吃掉利润这里面最容易被新手忽略的是最大回撤。一个策略哪怕年化50%如果过程中要经历40%的回撤绝大多数人根本拿不住——要么中途割肉要么加杠杆爆仓。回撤不仅是数学问题更是行为学问题。4.3 为什么要做交易成本敏感性分析我后来还做了一件之前没做过的事成本敏感性分析。把交易成本手续费滑点分别设为0、万二、万五、千一四档跑同一个策略看净值曲线变化。结果让人冒冷汗成本为0年化收益28%近90%胜率成本万二年化收益掉到15%成本万五年化只剩6%成本千一策略直接亏损这说明我的策略本质上赚的是微薄的方向性收益对成本极度敏感。实盘里滑点往往比想象中更大一进一出利润全被磨平。没有做过成本敏感性分析的策略都是纸面富贵。5. 重构策略后的心得与可复用的改进思路5.1 用前向验证Walk-Forward代替一次性回测我最核心的改动是把一次性回测换成了前向验证。做法是把历史数据切成很多段每段用前面的数据训练、紧跟着的下一段做验证然后逐步向前滚动。这更贴近真实交易的节奏你在每个时间点只能用到当时已经发生的数据。具体流程我简化成三步用过去500个交易日的特征训练模型在之后的60个交易日做样本外预测并模拟交易每60天重新训练一次滚动覆盖全部历史数据。这样得到的收益曲线每一段都是当时真实可做到的而不是事后诸葛。我改完之后那个虚高的90%立刻现出原形——样本外胜率在55%到65%之间徘徊但也正因为这个数字真实了后续的优化才真正有意义。5.2 给特征减肥少即是多我把最初20多个特征砍到只剩下几个核心项收益率、波动率、成交量变化率、价格相对中长期均线的偏离度。砍掉那些高度相关的指标比如RSI和KDJ本来就是近亲都源于价格位置模型过拟合程度明显下降。这里有个朴素的经验特征越多越容易拟合噪音特征越少模型被迫去学真正有用的结构。我当时用一个简单办法验证特征有效性——逐个特征做置换重要性排序把置换后模型精度掉得最多的特征留下其他删掉。删完以后验证集表现反而更稳了。5.3 把成本模型嵌进验证流程现在我的所有回测都强制计入成本。不是简单加一个固定手续费而是更细一点按流动性水平和成交量分层估计滑点成交额小的标的滑点系数拉高。这样回测曲线不会再有理想国的感觉。嵌入成本之后的策略才是真正可讨论的策略这一步和指标一样重要。在成本完全吞掉策略收益之前根本谈不上讨论策略优劣。5.4 组合层面模拟单票开仓改为分散持仓另一个重要改动是从单票重仓改成组合分散。单票预测的难度和不确定性都太高一次黑天鹅就能让账户重伤但如果你同时持有十几只标的并且每只的仓位上限控制在5%以内即使某只标的预测方向错了对整体净值的影响也可控。组合层面的模拟不只是把单票结果简单相加还要考虑标的相关性。我当时选了不同行业的标的避免扎堆在某一个板块。这个改动直接降低了净值曲线的波动最大回撤从原来的20%以上压到了10%以内——虽然收益也被摊薄了一些但拿得住才是关键。5.5 我最后留下的一条铁律整个项目跑下来我给自己立了一条规矩任何策略首先在样本外拿到稳定的正期望其次在计入真实成本后依然不亏最后再谈胜率高低。顺序不能反。90%的胜率可以当作一个有趣的结果来展示但如果它经不起样本外验证、经不起成本检验、经不起风格切换的考验那它就是一个数字幻觉。这只是我个人在这个模拟项目里的一次完整试错记录不构成投资建议也谈不上什么高深理论。我更想传达的是AI工具确实能帮人做大量数据分析和模式挖掘但它不会改变市场的基本规律——不确定性永远存在所谓的高胜率往往只是某种统计口径下的产物。认清这一点比找到一个完美策略重要得多。如果你也在做类似的尝试我的建议是多花时间在验证机制上而不是模型调参上。数据怎么切、标签怎么定义、成交假设是否符合实际、成本有没有计入——这四个问题想清楚了哪怕模型简单一点出来的结论也踏实得多。