为什么RPS选股全靠谱,实盘却全是垃圾?
Hello,
我是葱头,
一个写了26年代码的程序员。
现在在用缠论和RPS做主观交易。
今天我们来聊聊RPS数据预处理管道
---小字注:因调研工具暂时不可用,基于真实经验撰写
---2023年下半年,我刚把RPS选股脚本从Python迁到Go,想着编译型语言跑得快,回测也方便。
那个周末我兴冲冲跑了一遍全市场,筛出二十几只RPS80+的票,周一开盘我挨个下单。
结果前五笔,三笔开盘即跌停,一笔开盘炸板,只有一笔勉强红盘收了,还是靠大盘拉升硬托起来的。
复盘时我盯着终端发呆:代码逻辑没问题,RPS算法是标准公式,周期也对,为什么实盘全是垃圾?
那晚我把原始数据拉下来,逐行对账,才发现那就是我的"全市场"里,混着三十多只停牌股、十几只ST股、还有几只刚摘帽没几天的壳资源股。
这些票在停牌前涨得凶,RPS自然高,但停牌期间价格不变,复权价格也就不变,一复盘RPS还在那高挂着。
我买的那三只跌停票,全是停牌半年后复牌首日,主力早出货完了,散户接盘。
讲真,那一刻我懂了:RPS公式再标准,数据管道要是脏的,跑出来的全是毒药。
---做了二十六年代码,我最清楚ETL(抽取、转换、加载)管道的坑在哪儿。
生产环境里,上游给你脏数据是常态,不是异常。
日志里混着乱码、字段类型偷偷变、主键重复、时间戳时区不对、空值用-999代替、甚至同一张表不同分区字段名都不一样,这些我全踩过。
RPS选股的数据管道,本质上就是个金融版ETL:从行情源抽取 → 复权、剔除、对齐转换 → 加载进因子库 → 算RPS → 产出信号。
可大多数人写选股脚本,只盯着最后那步RPS公式,前面三步全用现成库一行代码带过,根本不看中间经手了啥。
这就好比你在生产环境跑SQL,从不看执行计划,只看结果集行数,觉得跑出来了就是对的。
---先说复权这关。
前复权、后复权、不复权,三种价格序列算出来的RPS能差出二十个点以上。
我早年用通达信自带数据,默认前复权,觉得方便。后来自己维护数据,才发现前复权有一个致命缺陷:历史价格会随着未来的分红送配不断变动。
今天你算的RPS是基于昨天的复权价,明天公司派息了,历史价格全往下平移,昨天的RPS数值瞬间失效。
回测时你用的是"未来已知"的复权价,实盘却只能用"当下已知"的复权价,这中间的缝隙,就是回测实盘差异的大头之一。
我现在的做法:存后复权价,实盘算RPS时用后复权,回测也用后复权,把"未来信息"彻底切断。
代价是历史低价看着不直观(茅台后复权价早几百块了),但起码信号是诚实的。
---再剔除停牌、ST、退市风险、次新股这四类"脏票"。
停牌股最毒:价格冻结,换手率为零,RPS却能因为涨停板堆积而虚高。复牌那天往往是单边下跌的开始。
我现在的剔除逻辑:连续三天零成交直接标记停牌,剔除;ST、*ST、退市整理期,风险警示板块代码前缀匹配,全剔除;上市不足六十天的次新股,锁定期解禁前流通盘极小,筹码结构极不稳定,也剔除。
这一步光是逻辑就得写两百行,还得配套单元测试:造一堆边界数据(刚好三天零成交、刚好六十天上市、ST摘帽首日)跑通才敢上线。
搞过生产环境数据清洗的都知道:没有测试覆盖的剔除逻辑,就是定时炸弹。
---最隐蔽的是对齐。
不同数据源的交易日历不一样:有的包含临时休市日(如哀悼日),有的不包;有的把除权日算作交易日,有的不算;港股通标的在港股休市A股开市的日子,价格怎么对齐?
我吃过亏:某年清明前后,数据源少给了两个交易日,我的滑动窗口RPS直接用了错误的窗口长度,信号全错。
现在我自己维护一份标准交易日历,以交易所官方公告为准,所有数据源入库前先按日历对齐,缺失的补NaN,多余的砍掉,绝不信任任何第三方的日历字段。
这一步像极了数据仓库里的"维度表规范化":脏维度表一上线,全库报表全挂。
---还有一关常被忽略:成交量的单位统一。
有的源给手数(百股),有的给股数,有的给金额(元),有的给万元。
换手率=成交量/流通股本,分子分母单位不对齐,算出来的换手率差一万倍,RPS排序全乱。
我见过某开源量化框架,直接把通达信导出的"手数"当"股数"写进因子库,跑了半年没人发现,因为RPS只看排名,全市场同比例放大,排名反而不变,掩盖了Bug。
直到有人把数据接到实盘券商接口,下单数量按股数算,才炸出单笔买入金额超限风控,追查半天才找到这根葱。
所以我现在的管道里,每个字段都有单位元数据:volume_unit="shares"、amount_unit="yuan"、price_unit="yuan",入库时强制校验,不对齐直接报错落盘人工介入。
---说到这里,你可能觉得我在搞工程过度设计:不就是选个股吗,搞得像造航天飞机。
但我要说:RPS只是个排序指标,它不产生Alpha,它只放大数据里已有的信噪比。
数据管道每漏掉一个脏票,信噪比就降一分;每留下一个结构性偏差(如复权方式不一致),噪声里就多混入一份伪信号。
你在信号端精心调参、跑周期共振、配缠论买点,全是在处理"已知噪声下的最优解";但如果噪声本身是错的、是脏的、是结构性失真的,你的最优解就是垃圾中的王者。
这就像你在生产环境给一个有Bug的SQL加索引、分区、并行度拉满,跑得飞快,结果集却全是错的,快有什么用?
---2024年春节后那波红利行情,我管道里剔除逻辑漏了一个边界:某电力股刚摘帽ST,流通盘突然放大十倍,但总股本没变,换手率瞬间跌穿地板,RPS却因为前期涨幅大还挂在高位。
我那天盯着盘口,RPS85,换手率0.3%,买入信号触发,手指悬在确认键上没按下去。
那种感觉就像Code Review时看到一行代码:逻辑没错,测试也过,但你直觉觉得"这儿有坑",那是二十六年写代码练出来的肌肉记忆,比任何指标都管用。
那天那只票下午跳水砸出天地板,跌幅超12%。
事后复盘,我把"摘帽后六十天内强制剔除"加进了管道规则,并写了专门的回归测试用例。
这笔"没亏的钱",比我那年靠运气赚的几十万都值,它验证了我的数据管道闭环:信号异常 → 人工拦截 → 规则固化 → 自动化拦截。
---现在我的RPS数据管道,跑一次全市场大概三分钟:抽取原始行情 → 复权校验 → 停牌/ST/次新/摘帽剔除 → 日历对齐 → 单位统一 → 因子计算 → 信号输出 → 写入审计日志。
每一步都有指标埋点:剔除率、异常值计数、复权偏移量、日历缺失天数,全落盘可查。
周末复盘时,我不看收益曲线,先看管道审计报告:这周剔除了几只停牌股?有没有新上市漏网之鱼?复权因子有没有异常跳变?
这才是把RPS当生产环境服务在运维,而不是写个脚本跑跑回测发朋友圈。
指标参数我半年才调一次,但管道规则我几乎每周都在补丁:新类型的脏数据、新上市规则变化、数据源字段偷偷改名,这些才是实盘生死线。
---回到开头那周惨烈的周一。
那五笔亏损加起来不到账户的1%,按风控规则根本不算事。
但那次教训让我把RPS选股从"写脚本跑信号"重构成了"运维数据管道产出信号"。
现在回头看,RPS选股的核心竞争力,从来不是公式参数多精妙,而是数据管道多干净。
那些在知乎上争论"RPS周期用20还是120"、"阈值用80还是85"的,大概率连自己的数据源有没有停牌股都不知道。
就像争论数据库索引用B+树还是Hash,却从不看执行计划、不清洗脏数据、不监控慢查询,最后跑出来的执行计划全是全表扫描,怪索引不好用?
数据管道不干净,RPS再高也是毒药。这大概是我写了二十六年代码,给做交易的最大体会:地基没打牢,楼盖多高都得塌。
---你的RPS选股脚本,上次清洗停牌股是什么时候?评论区见。
声明:本文不构成任何投资建议。市场有风险,交易需谨慎。
感谢你读到最后,记得帮我点个"赞"+"推荐",并"分享"给更多人吧!
@copyright by linjc
一个20+年的“懒人程序员”,学习缠论10多年,把复杂的交易逻辑自动化,看盘复盘省心又高效。
武夷山自有茶厂,需要高性价比的优质岩茶,欢迎联系我。


