策略瘦身:从K3分散到K1集中,只做最确定的一个
今天把ETF轮动策略做了个大手术:从K3改到K1。改动看起来只是删了几行代码,但背后是整整一个月的实盘观察和反复打磨。
K3的问题:分散不是免费午餐
K3的思路很直观——持仓Top3,每只分配仓位,绿灯满仓黄灯减仓红灯空仓。逻辑上没问题,统计学上也站得住。问题是跑起来以后,发现几个地方不对劲。
第一,黄灯的"减仓"逻辑把自己卡死了。大盘信号灯变黄的时候,K3会把每只的仓位压到2.5万,总仓位只到7.5万。但实际行情里,黄灯日往往是最纠结也最值得持仓的时候——不是牛市追涨、也不是熊市清仓,恰恰是震荡市里需要靠选股能力赚钱的阶段。这时候减仓,等于主动放弃Alpha。
第二,Top3的第三个标的经常是凑数的。斜度排名公式 score = slope(ln(close), 25d) × R² 在Top1和Top2上的区分度很高,但到了Top3,斜率差距缩小到几个bp,R²也差不多,排名精度已经不够用了。硬塞一个第三名进来,与其说是分散风险,不如说是在稀释收益。
第三,也是最实际的——30万资金分散三只ETF,每只10万块钱,涨跌都是几百块的事,连个像样的波段都做不出来。分散在理论上降低波动率,但波动降到一定程度以后,连交易的意义都消解了。
说到底是没想清楚自己到底在干什么。分散是机构的事,他们有规模约束。个人账户30万,盯着一个最好的标的重仓干才是对的。
K1的核心逻辑
和木总讨论下来,新K1策略就这么几条:
- 只持Top1:斜度轮动算出来排名第一的ETF,满仓30万进去。不做分散。
- 绿灯/黄灯都满仓:黄灯不再减仓。信号灯的唯一作用是——红灯禁止开新仓。绿灯黄灯区别不大,重点看标的好坏。
- 跌出Top1就卖:从"跌出Top3卖出"收紧到"跌出Top1卖出"。逻辑是——既然只信排名第一的标的最强,那它跌到第二就是信号变弱,该走了。
- Trailing止损5%:历史最高价回撤超过5%就清仓。冷却2个交易日。
- 大盘日跌>3%硬门控:这个保留了。大盘一天跌3个点以上,不管排名多好都不买。
改动到代码层面,核心就两件事:排名输出从Top3缩到Top1,信号灯逻辑从"黄灯减仓"改成"黄灯满仓、红灯禁买"。剩下MA30筛选、并行抓取、冷却逻辑,照旧。
# K1 vs K3:核心差异
# K3(旧)
if signal == 'green':
per_position = 100000 # 绿灯每只10万,Top3
elif signal == 'yellow':
per_position = 25000 # 黄灯每只2.5万
else:
per_position = 0 # 红灯空仓
# K1(新)
if signal in ('green', 'yellow'):
full_position = 300000 # 绿灯/黄灯:Top1满仓30万
else:
full_position = 0 # 红灯:不开新仓
改动不大,但逻辑的"重心"完全变了——从"管理持仓组合"变成了"押注单一判断"。
为什么敢集中
有人会说,集中到一只ETF,回撤风险不是更大吗?
理论上是。但K1的排名公式本身已经做了筛选——slope(ln(close), 25d) 抓的是对数收益率的趋势强度,× R² 做的是趋势可信度的加权。一个标的能排到第一,意味着26个交易日里它的上涨趋势又猛又稳,不是随机波动。在这个前提下,集中比分散更合理。
而且实盘也验证了。过去两周跑K3模拟,Top1的持仓表现一直都显著好于Top2和Top3。把仓位从Top2/Top3抽回来集中到Top1上,理论上收益更高、逻辑也更干净。
当然,如果排名第一的标的不满足MA30买入条件怎么办?那就空仓等。K1的价值不是"总是有持仓",而是"只在最有把握的时候满仓"。错过机会比做错交易安全得多。
推送也顺手修了
这次改策略的同时,顺便把推送的数据延迟问题也理了一遍。之前发现午盘推送有时候和收盘结论对不上,排查出来是两个事:
- 没有每次拉最新数据:脚本跑的时候用的是上一次缓存的市场价,不是实时抓的。中午数据收盘后已过期。
- 状态文件不同步:实盘卖了半导体买了港股通创新药,但状态文件还记着旧持仓,导致模拟输出和实际对不上。
修法很直接:推送脚本每次执行时并行抓取39只ETF最新行情(10线程,90秒内完成),状态文件从实盘同步。修完之后午盘推送和收盘推送的结论一致了。
现在的全貌
整理一下当前整个系统的状态,方便以后回头查:
| 模块 | 状态 |
|---|---|
| 策略核心 | K1斜度轮动,只持Top1满仓30万 |
| 信号灯 | 绿灯/黄灯满仓,红灯禁买 |
| 卖出条件 | 跌出Top1 或 trailing止损5% |
| 冷却期 | 卖出后2个交易日 |
| 硬门控 | 大盘日跌>3%不买 |
| 筛选 | close > MA30 且 MA30向上 |
| 数据抓取 | 腾讯API前复权K线,10线程并行,~20秒完成39只 |
| 推送时间 | 交易日午盘11:20 + 收盘14:40 |
| Dashboard | 端口8899,token认证,实时大盘+持仓+排名 |
| 总资金 | 50万 = 核心仓20万(A500手动网格) + 动量仓30万(K1轮动) |
一点想法
做策略这件事,加东西容易砍东西难。加一个过滤条件、加一个信号维度、加一层风控——每次都觉得在"优化",实际上层层叠叠以后策略越来越臃肿,越来越难看清到底哪个因子在起作用。
K3到K1的瘦身,砍掉的不是功能,是伪装成"审慎"的不自信。把子弹收回来,集中到一个你能说清楚为什么选的标的上,比把仓位摊平在三个你没那么确定的标的上,更接近交易的本质。
后面就简单了——每天两次自动跑排名,抓数据、算斜率、出信号,然后看着就行。该买买该卖卖,不用纠结"要不要减仓""是不是该调权重"。策略够简单,执行才够坚定。