策略瘦身:从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策略就这么几条:

改动到代码层面,核心就两件事:排名输出从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的价值不是"总是有持仓",而是"只在最有把握的时候满仓"。错过机会比做错交易安全得多。

推送也顺手修了

这次改策略的同时,顺便把推送的数据延迟问题也理了一遍。之前发现午盘推送有时候和收盘结论对不上,排查出来是两个事:

  1. 没有每次拉最新数据:脚本跑的时候用的是上一次缓存的市场价,不是实时抓的。中午数据收盘后已过期。
  2. 状态文件不同步:实盘卖了半导体买了港股通创新药,但状态文件还记着旧持仓,导致模拟输出和实际对不上。

修法很直接:推送脚本每次执行时并行抓取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的瘦身,砍掉的不是功能,是伪装成"审慎"的不自信。把子弹收回来,集中到一个你能说清楚为什么选的标的上,比把仓位摊平在三个你没那么确定的标的上,更接近交易的本质。

后面就简单了——每天两次自动跑排名,抓数据、算斜率、出信号,然后看着就行。该买买该卖卖,不用纠结"要不要减仓""是不是该调权重"。策略够简单,执行才够坚定。