聚宽上看到的一套趋势股策略:逻辑、风险与代码问题
最近在聚宽上看到一套趋势股策略。它的代码很长,包含热门概念、六类技术形态、仓位评分、ATR跟踪止损、时间止损和盘中风险监控。乍看之下,几乎覆盖了趋势交易的所有环节。
但量化策略最容易产生一种错觉:模块越多,看起来越专业;日志越详细,好像风险控制越可靠。真正值得检查的不是它写了多少指标,而是每个指标是否改变了交易、订单是否真实成交,以及回测中使用的信息在当时能否获得。
本文只讨论代码呈现出来的规则和问题,不评价原作者,也不把文章标题中的收益数字当成已经验证的事实。
一、这套策略到底在做什么?
它不是传统基本面选股,也不是简单的均线策略。更准确的描述是:
从中证1000的热门题材中,寻找昨日技术形态合格、今天集合竞价高开的股票,最多集中持有3只,通过ATR跟踪止损和10个交易日的持仓上限退出。
选股流程可以概括为:
全市场股票
→ 排除ST、停牌、特定板块和上市时间过短的股票
→ 与中证1000成分股取交集
→ 只保留热门概念中的股票
→ 计算约80日量价指标
→ 匹配技术形态
→ 使用当天开盘涨幅确认
→ 最多买入3只
其中任何一步获取失败,都可能改变候选池。例如中证1000成分获取失败时,代码会退回更大的初始股票池;概念池为空时,则可能跳过概念过滤。因此,同一份代码在不同数据权限和数据环境下,实际交易范围未必相同。
二、热门概念如何形成?
代码使用两类信息构建概念池:
- 昨日涨停股票所属概念;
- 今日集合竞价接近涨停股票所属概念。
它统计概念出现次数,并在竞价数据可用时加入成交量权重,最后选择排名靠前的概念。这个思路试图捕捉资金关注度,而不是预测所有行业的长期价值。
问题在于,“涨停较多”只能作为热度代理,并不等于机构资金持续流入。另外,概念归属数据如果没有按历史日期准确还原,就可能把后来形成的概念标签带回过去。即使打开防未来数据选项,也不能自动消除这类成分回填风险。
三、“六维评估”其实是六类形态
代码名称容易让人误以为每只股票必须通过六个彼此独立的维度。实际逻辑是:股票只要匹配其中一类技术形态,就可能进入候选名单。
| 形态 | 主要特征 |
|---|---|
| 吸筹期地量地价 | 价格靠近均线、RSI偏低、成交量萎缩 |
| 洗盘期缩量回调 | 上升结构未破坏,回调时缩量 |
| 突破型放量启动 | 昨日明显上涨、放量、收盘位置较强 |
| 主升浪回踩低吸 | 均线多头排列,价格靠近短期均线 |
| 极端超跌反弹 | 短期大跌、远离长期均线、量能冻结 |
| 标准多头排列 | 均线向上、量价和MACD偏强 |
每一类形态都有“核心条件”和“辅助条件”。核心条件必须全部通过,再结合辅助条件计算分数。代码中核心部分占75%权重,辅助部分占25%,总分至少达到90分。
“吸筹”“洗盘”“主升浪”只是对K线结构的命名。代码无法知道某个主力是否真的在吸筹,也无法证明一次缩量回调必然是洗盘。理解策略时,应把这些名称还原成价格、均线、成交量和RSI条件。
四、它不是纯粹低吸,而是高开确认
技术形态使用昨日以前的数据,但下单前还会检查当天开盘表现:
- 放量突破型通常要求高开3%至7%;
- 其他主要形态要求高开超过1%;
- 多头排列备用分支要求更高的开盘确认。
这意味着策略并非看到回调就买,而是在昨日形态成立后,等待今天高开确认。优点是减少弱势股票;缺点是买入成本更高,也更容易遇到高开低走。
代码计划在9:25附近选股、9:28提交订单。聚宽回测中的预定调用时间,并不保证实盘能在日志显示的参考价格成交。集合竞价、开盘撮合、涨停和流动性都会扩大回测与实盘之间的差距。
五、ATR跟踪止损是相对清晰的一部分
买入后,策略计算ATR(14),初始止损线大致为:
买入价格 − 1.5 × ATR(14)
持仓上涨后,止损线改为:
持仓期间最高价格 − 1.5 × ATR(14)
止损线只能上移,不能下移。假设10元买入、ATR为0.4元,初始止损约为9.4元;随后价格涨到12元,止损线可提高到11.4元。它既能控制初始风险,也能保护一部分浮盈。
此外,股票持有达到第10个交易日后会尝试强制退出。由此可见,这是一套短期题材波段系统,不是长期趋势跟踪。
ATR规则本身并不能保证止损价成交。A股存在T+1、跌停和跳空,实际损失可能超过理论止损距离。
六、最严重的问题:日志成功不等于订单成交
代码在买入时,先记录买入信息、初始化ATR止损,再提交目标持仓订单;卖出时也会先记录盈亏,再提交清仓订单,并立即删除部分持仓管理状态。
这会产生危险的状态错位:
日志认为已经卖出
→ 实际订单被拒绝或只成交一部分
→ 股票仍然留在账户中
→ ATR和持仓模式却已经被删除
可能导致这种情况的原因包括:跌停、停牌、T+1、资金不足、部分成交和委托失败。
可靠的实盘程序应该至少区分:
生成信号 → 提交委托 → 部分成交 → 全部成交 → 更新持仓状态
只有确认实际清仓后,才能删除止损线、持仓模式和卖出条件。否则日志可能很漂亮,真实账户却出现无人管理的残余持仓。
七、注释中的35%仓位没有真正进入下单公式
代码定义了一个35%的趋势股参数,日志也给人“只使用35%仓位”的印象。但实际买入金额使用的是:
总资产 × 仓位系数 ÷ 最大持股数
当仓位系数为100%、最多持有3只时,每只目标约为总资产的三分之一,合计可能接近满仓,而不是35%。
仓位系数下降时,代码还会同时减少持股数量。例如系数50%时,最多可能只买1只,每只目标约16.7%,最终实际投入并不是简单的50%。
所以必须区分三件事:
- 参数被定义了;
- 日志打印了;
- 参数真正进入下单金额计算。
三者并不天然等价。
八、“盘中紧急降仓”主要停留在变量层面
策略会监控:
- 指数短时间快速下跌;
- 上午指数跌幅较大;
- 多次放量下跌;
- 波动率明显上升。
触发后,代码会把临时仓位比例改成30%或50%。但没有看到紧接着把现有持仓调整到目标比例的完整下单流程。仓位计算主要在早盘进行,盘中变量还可能在每日重置时被清除。
因此日志出现“紧急降仓”时,不代表账户已经实际减仓。正确的验证方法是检查成交记录和持仓市值,而不是搜索日志关键词。
九、动态止盈目标主要用于展示
代码根据持仓天数生成6%、12%、18%等目标,并在日志中打印“止盈目标”。但主要卖出流程并没有用这些目标价触发清仓。
实际影响卖出的主要还是:
- ATR跟踪止损;
- 持有满10个交易日;
- 开盘低开检查;
- 尾盘接近跌停;
- 概念炸板检查。
因此不能根据日志中的目标数字,理解为程序会在达到目标时自动止盈。
十、涨停保护和盘中风控可能脱节
如果股票开盘接近涨停,代码给它设置“涨停”标记,盘中ATR监控会跳过该股票。但代码没有形成非常清晰的开板后解除标记、恢复ATR管理的闭环。
这可能造成:股票早盘涨停,后来打开并快速回落,但ATR监控仍将其排除。对于题材股,这恰恰是最需要管理的风险场景之一。
概念炸板风控也需要谨慎理解:它主要统计持仓股票所属概念的炸板情况。策略最多持有3只,要满足同一概念至少3只持仓同时炸板,条件相当苛刻,并不等于全市场概念炸板监控。
十一、个别指标存在实现问题
成交量脉冲指标使用后一行数据判断放量之后是否缩量。对于历史序列最后一行,后一行不存在,因此该条件通常不能按设想工作。后续又使用“没有放量脉冲”作为辅助条件,可能让这个加分项过于容易通过。
另外,代码将盘中检查由每分钟降低到每5分钟,并声称不改变交易行为。事实上,风控检查延迟最多4分钟就可能改变卖出价格,甚至决定是否触发。任何频率调整都应通过逐笔交易对照验证,而不能仅凭注释认定结果一致。
十二、回测前应该完成哪些审计?
如果要进一步研究这套代码,合理顺序不是立刻追求更高收益,而是先做执行审计:
- 以成交回报而不是委托提交更新买卖记录;
- 卖出失败时保留ATR和持仓管理状态;
- 统一检查T+1、停牌、涨跌停和部分成交;
- 让35%、30%、50%真正进入目标仓位公式;
- 风险比例改变后,明确执行实际减仓;
- 开板后恢复ATR监控;
- 删除未生效的动态止盈,或者补全真实触发逻辑;
- 核查概念成分在历史日期是否真实可得;
- 固定候选股票的次级排序,保证回测可重复;
- 对比优化前后全部成交,确认降频和缓存没有改变交易。
完成这些工作以后,才适合评估选股形态是否真的有超额收益。
结语
这套策略的研究价值在于,它展示了如何把热门概念、技术形态、开盘确认、动态仓位和ATR退出连接成一条完整思路。但它也说明了量化代码中最常见的问题:写出了风险规则,不代表实际执行了风险规则;提交了订单,也不代表订单已经成交。
一套策略能否实盘,不只取决于回测收益,还取决于数据在当时是否可得、仓位公式是否与注释一致、订单状态是否闭环,以及极端行情下是否仍有人管理未成交持仓。
与其首先问“这条曲线能赚多少”,不如先问四个问题:
信号是否真实?
委托是否成交?
持仓状态是否同步?
实盘能否复现?
这四个问题,往往比再增加一个指标更重要。
本文仅用于程序和策略研究,不构成投资建议。文中讨论的源代码来自聚宽公开文章页面,实际效果应以独立复现、完整日志和样本外验证为准。