当前位置:首页 > 缠论那些事

为什么RPS选股系统越复杂,实盘越像在踩地雷?

Hello,

我是葱头,

一个写了26年代码的程序员。

现在在用缠论和RPS做主观交易。

今天我们来聊聊RPS选股系统像十年代码库:为什么不敢动、不敢删、不敢重写,最后只能看着它慢慢腐烂

---

小字注:因调研工具暂时不可用,基于真实经验撰写

---

2019年那个夏天,我花了整整三个月,把RPS选股系统从Excel搬到了Python,又从Python重构到C++,最后跑在一台放在书房角落的旧服务器上。那台服务器风扇声音大得像拖拉机,半夜跑回测时吵醒过两次老婆,后来我就把它搬到了阳台角落,塞进一个废纸箱里隔音。

那时候我觉得这是我的"核心资产"。每天收盘后跑一遍,出来几十只票,再叠加缠论买点过滤,最后剩下三五只,感觉像掌握了什么真理。那种掌控感,说实话挺上瘾的,那就是刚学会写递归时,看着屏幕上跑出斐波那契数列,觉得自己通晓了宇宙真理。

代码跑了四年。中间改过无数次参数:周期从20日改到50日,再改到120日;阈值从80改到85,又改到90;加过换手率过滤,加过量比过滤,加过北向资金过滤,甚至加过财报增速过滤。每次加完参数,我都要跑一遍全市场回测,看着夏普比率从1.2涨到1.5,最大回撤从18%降到12%,那种成就感比写出一个零Bug的模块还强。

可一上实盘,要么选不出票,要么选出的票买完就跌。最离谱的一次是2021年年底,系统连续三天选出同一只半导体股,理由是RPS95+、板块龙头、北向连续加仓。我重仓买入,结果那周半导体板块指数跌了14%,我单票亏了账户的8%。事后一看,北向资金那是在出货,RPS滞后了整整五个交易日才反应过来。

---

这感觉太熟悉了。像极了我手里那个维护了十年的老系统,核心模块没人敢动,因为没文档、没测试、原作者早走了。每次加需求只能在外面包一层,包到最后成了"大泥球",改一行代码能引发三个模块联动崩溃。我见过最夸张的一次,改了一个配置文件的默认值,居然把支付模块的幂等性校验给搞挂了,订单重复扣款三百万,那晚我和运维组通宵对账,眼睛都不敢眨。

RPS系统也是这样。最初的逻辑很简单:算涨幅排百分位,取前20%。后来觉得"太简单了",加了板块RPS,加了多周期共振,加了基本面过滤,加了宏观风格判断。每一层加上去,回测都更好看,实盘却更难执行。就像给旧系统加缓存层、加消息队列、加熔断器,架构图画得越来越漂亮,线上故障却越来越诡异。

到2023年下半年,我的RPS代码库已经有两万行。其中真正跑得动的核心逻辑,可能不到两百行。其余全是"为了解决上一个补丁带来的问题"而加的补丁。有个"宏观流动性判断模块",单独就占了三千行,最后证明它在震荡市里准确率不到四成,不如抛硬币。

最讽刺的是,我也知道这套系统该重写了。可一想到要重新验证、重新回测、重新实盘试错,我就不敢动。就像那十年代码库,明知架构烂透了,却只能在上面打补丁,看着技术债利息越滚越大。每次想动手重构,脑子里就蹦出那个声音:"万一改坏了怎么办?万一原来的策略其实是对的,只是我运气不好呢?"

---

讲真,这不是技术问题,是心理问题。

程序员不敢重构旧系统,怕的是"改坏了谁负责";交易员不敢重构选股系统,怕的是"改坏了钱谁赔"。本质上都是不想为不确定性买单。

但不买单的代价更大。旧代码库不重构,迟早要在某个黑天鹅夜里彻底瘫痪;RPS系统不重构,迟早要在某次风格切换里把账户腰斩。这不是危言耸听,是我用真金白银买来的教训。

我2024年4月亲历过一次。那时候红利板块调整,我的RPS系统还在疯狂信号"买电力、买煤炭、买高速公路",理由是RPS90+、板块RPS第一、基本面也好。结果买进去不到两周,电力股单日跌7%,煤炭跌5%,账户回撤12%。那天收盘我坐在椅子上盯着绿油油的盘面,脑子一片空白,连卖单都不敢下,因为系统说"趋势未破",RPS还在85以上。

事后复盘,系统里有十几个过滤条件,没有一个能在那天预警"风格要变了"。因为这些条件都是针对"趋势延续"设计的,根本没考虑"趋势反转"的场景。就像旧代码库里全是处理正常流程的逻辑,异常分支要么没写,要么写了也从没跑通过测试。等真出异常了,系统只会抛个NullPointerException,然后全链路熔断。

---

那次教训后,我没重写系统。我做了更蠢的事,又加了三个过滤条件:宏观流动性指标、板块轮动周期判断、北向资金净流入变化率。当时我觉得:"这次不一样了,我加的是'风格切换预警',这下总能躲过去了吧?"

回测又漂亮了。实盘呢?后面三个月,系统选出的票越来越少,信号越来越晚,等信号确认完买进去,往往已经是短期顶部。最讽刺的是,那三个月市场其实一直在涨,我却因为"等确认"错过了整整一波主升浪。账户曲线平躺了三个月,看着指数涨、板块涨、别人的票涨,只有我的仓位空着。

这就是技术债的复利效应:每加一层补丁,系统就多一分"惯性",对新环境的适应就慢一拍。在市场这种非平稳环境里,慢一拍就是死。就像给旧系统加了层层防御,结果请求进来要经过七八层拦截器,延迟从10ms涨到500ms,用户早跑光了,系统还在认真地做参数校验。

程序员圈有句黑话:"如果它能跑,就别动它。"可在交易里,"能跑"不是标准,"能在未知环境里活下来"才是。旧系统能跑是因为环境没变;市场环境天天在变,昨天能跑的逻辑,今天可能就是最大的坑。这道理我懂,可真到自己钱包上,还是会贪那一点"回测完美"的虚荣。

---

今年上半年,我终于下定决心重写。不是推倒重来,而是做减法。那天周末,我把两万行代码打印出来,铺满了客厅地板,拿着红笔一行行划掉。划着划着手抖得厉害,不是因为代码多,是因为每划掉一行,都像在割自己的肉。

把两万行砍到五百行。只保留最核心的三个模块:RPS排序、缠论结构确认、仓位分配。其余所有"过滤条件""宏观判断""风格识别"全删了。那个"宏观流动性判断模块"三千行,删得最痛快,当初写它时查了几十篇论文,调了两个月参数,现在三分钟扔进垃圾桶。

删得我手抖。这些条件我调了三年,每个背后都有几十版回测报告,扔进垃圾桶的那一刻,感觉把自己的心血喂了狗。那天晚上我失眠了,脑子里全是"万一删错怎么办""万一那个过滤条件其实有用怎么办"。第二天起来跑回测,发现夏普比率反而涨了0.1,最大回撤降了2%,选股数量少了40%,但胜率从48%涨到了56%。

但删完后发现,系统反而跑得更稳了。选股数量少了,但胜率高了;信号慢了,但踩坑少了。最关键的是,我终于又能看懂自己的代码了,出问题时能在十分钟内定位,而不是像以前那样翻两天日志也查不出是哪个过滤条件搞的鬼。现在系统出信号,我能清楚地知道:是RPS排在前面、还是缠论结构给了买点、还是仓位控制拦住了。以前这三者耦合在一起,出了问题只能怪"系统不稳定"。

---

这让我想起《重构》里那句话:"重构的目的是让代码更容易被修改,而不是让它跑得更快。"当年读这本书时觉得是在说软件工程,现在才懂,它说的是所有在不确定性里求生存的系统。

RPS系统也是同理。一个好的选股系统,不是回测最漂亮的那个,而是最容易在实盘里被修正的那个。市场变了,你能不能在半小时内改好规则、验证完、上线?这才是核心竞争力。就像生产环境的热修复能力,不是看你平时跑得多快,是看出事时能不能在五分钟内止血、十分钟内定位、半小时内上线修复版。

现在的系统只有三个参数:RPS周期、缠论级别、最大单票仓位。出问题了,改这三个参数里的任意一个,半小时搞定。以前改个"宏观流动性过滤阈值",要跑三天回测、观察两周实盘、还要祈祷别踩坑。那种"祈祷"的日子,我不想再过第二次。

---

当然,做减法也有代价。系统变"笨"了,它不再试图预判风格切换、不再试图识别宏观拐点、不再试图过滤掉所有"假信号"。它只做一件事:在趋势确立后,给你一个相对安全的入场结构。会漏掉一些机会,会吃一些回调,会在震荡市里频繁止损。这些我都接受了,因为这是"简单且有效"的代价。

笨一点没关系。就像那个十年代码库,重构后功能少了、接口简陋了、连个像样的UI都没有,但它能跑、好改、不崩。这才是生产环境该有的样子。以前那个"功能完备"的旧系统,功能列表长得像超市购物清单,可一上线就各种诡异Bug,运维组见我就绕道走。

交易也是一样。别指望选股系统能帮你躲过所有坑、抓住所有涨、规避所有跌。它能做的,只是在你不确定的时候,给你一个可执行、可验证、可修正的框架。剩下的,执行、止损、加仓、心态,全靠你自己。这听起来像废话,但我花了六年才真正听进去。

---

最近在清理那个旧服务器,翻出了2019年的第一版RPS代码。才两百行,连注释都没有,变量名全是a、b、c、i、j。跑了一遍,居然还能出信号,而且比现在这套复杂系统的实盘表现还要稳。那一刻我盯着屏幕看了很久,连那个吵闹的风扇声都听不见了。

那一刻我突然明白:不是系统不够复杂,是我不敢面对简单。复杂给我安全感,让我觉得"我都考虑这么周全了,肯定不会错"。可市场不吃这一套,它只认"简单且有效"。就像写代码,新手爱写设计模式、爱用最新框架、爱造轮子,高手写的代码平平无奇、甚至有点"土",但跑十年不出Bug。

现在每次想加新过滤条件时,我会强迫自己问三遍:"这条规则能在半小时内被验证、被推翻、被修改吗?" 答不上来,就不加。这个问题成了我的"架构评审会",一人开会,三遍提问,不通过不上线。

这大概就是我这几年最贵的学费:把RPS系统当成了"追求完美的工程项目",忘了它本质上是"在不确定性里求生存的工具"。工程追求完备,工具追求好用。搞混了,代价就是账户里实实在在的亏损。每一笔亏损我都记得清清楚楚,不是数字,是那天晚上盯着屏幕不敢睡觉的滋味,是给老婆说"这次真不一样了"然后又被打脸的愧疚,是看着账户曲线锯齿状下行时那种无力感。

写到这里,我想起以前维护旧系统时,老大跟我说过一句话:"儿子,写代码最高境界不是写多牛逼的架构,是写出个让接手的人不想骂娘的系统。"现在我把这句话改成:"做交易最高境界不是找多完美的系统,是找个让自己能睡着觉的系统。"评论区见。

---

声明:本文不构成任何投资建议。市场有风险,交易需谨慎。

---

感谢你读到最后,记得帮我点个"赞"+"推荐",并"分享"给更多人吧!

@copyright by linjc

一个20+年的“懒人程序员”,学习缠论10多年,把复杂的交易逻辑自动化,看盘复盘省心又高效。
武夷山自有茶厂,需要高性价比的优质岩茶,欢迎联系我。

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。