一套50只微盘股策略:逻辑、优点与回测风险

最近研究了一套来自聚宽公开文章的微盘股策略。代码的核心思路并不复杂:先寻找基本面仍在增长的小市值股票,再用五个偏小、偏低、偏弱的指标排序,每周持有最多50只。
从用户提供的回测截图看,测试区间为2018年1月1日至2026年6月1日,初始资金100万元,基准为中证500。主要结果如下:
- 策略累计收益:2162.74%;
- 年化收益:46.61%;
- 基准累计收益:32.37%;
- 超额收益:1609.41%;
- 最大回撤:45.98%;
- 超额收益最大回撤:44.07%;
- 夏普比率:1.517;
- 索提诺比率:1.799;
- 胜率:65.2%;
- 盈亏比:2.826;
- 最大回撤区间:2024年1月2日至2024年2月7日。
累计收益2162.74%的含义是:期末资产约为初始资金的22.63倍,也就是100万元在该次回测中约变成2262.74万元,不能再把结果夸大。
这条曲线足够吸引人,但真正值得研究的不是“2162%”这个终点,而是三个问题:收益到底由什么驱动?扩容到50只解决了什么?45.98%的回撤又暴露了什么?

本文根据用户提供的代码和回测截图进行静态审计,没有重新运行回测。截图只能证明该参数组合在该次回测中的显示结果,不能替代逐笔成交、年度收益、换手率和样本外检验。
一、先把策略翻译成人话
策略每天更新持仓状态,每周第一个交易日9:30调仓,14:00检查昨日涨停股是否开板。完整流程如下:
第一步:建立可选股票池
策略取得前一交易日全部A股,然后排除:
- 科创板和北交所股票;
- 上市不足375天的次新股;
- ST、退市标记等股票。
这里没有排除创业板,因此30开头的股票仍可能进入组合。
第二步:加入基本面门槛
代码要求:
- 市净率大于0;
inc_return大于0;- 营业收入同比增长大于0;
- 净利润同比增长大于0。
之后按总市值从小到大排序,只保留最小的100只。换句话说,它不是在全部股票中直接做五因子排名,而是先把研究范围压缩到基本面指标为正的极小市值100只股票。
第三步:用五个变量进行二次排序
五个变量及权重为:
| 变量 | 权重 | 排名偏好 |
|---|---|---|
| 总市值 | 1.0 | 越小越好 |
| 流通市值 | 1.0 | 越小越好 |
| 当前股价 | 1.6 | 越低越好 |
| 最近约5个交易日成交量 | 0.8 | 越低越好 |
| 60日价格比值 | 2.0 | 越低越好 |
代码使用下面这种形式计算每个因子的得分:
weight * log(该因子最小值 / 当前股票因子值)由于当前值通常不小于最小值,这个对数得分通常小于或等于0。最终按得分从高到低排序,也就是选择最接近各项最小值的股票。
特别值得注意的是,60日因子的权重最高,而且偏好60日价格比值更低的股票。因此它并不是追涨策略,而是带有明显的小市值、低价、低成交活跃度和中期弱势反转倾向。
第四步:持有最多50只
策略在调仓时卖出不再入选的股票,再用剩余现金买入新股票,目标持股上限为50只。新开仓时会按照待补仓位数量分配现金,所以初始状态近似等权。
但它不是严格的每日或每周等权再平衡:已经持有且仍在名单内的股票不会被重新调整到2%权重,组合权重会随着涨跌逐渐漂移。
第五步:给昨日涨停股一次延迟退出机会
如果某只持仓昨天收盘涨停,即使本周已经不在目标名单中,9:30也不会立即卖出。到14:00再检查:
- 仍然涨停:继续持有;
- 涨停已经打开:尝试卖出。
这相当于给强势股增加了一个“涨停延续”规则,使策略在整体偏反转的基础上,又保留了一小段涨停动量。
二、这套策略为什么可能获得高收益?
1. 最主要的是极小市值暴露
股票先按总市值排序,只留下最小的100只;综合得分又继续偏好更小的总市值和流通市值。因此策略长期收益的第一来源,大概率是极端小市值风格,而不是五个彼此独立的Alpha。
总市值和流通市值相关性很高,同时使用二者,相当于进一步强化了规模暴露。回测使用中证500作为基准,而组合实际风格远小于中证500,所谓“超额收益”中会包含相当一部分小盘风格收益。
2. 基本面门槛剔除了部分最差公司
策略不是无条件购买最小市值股票。它要求营收和净利润同比增长为正,并加入PB和inc_return条件。这些规则能过滤掉部分持续亏损、经营恶化或指标异常的公司。
它的逻辑可以理解成:
不在所有垃圾股里找最小,而是在基本面仍有改善迹象的公司里找最小。
这种“规模+基本面过滤”比纯市值排序更有解释力。不过,几个同比指标只代表变化方向,不代表绝对盈利质量、现金流和财务真实性。
3. 低价、低活跃和60日弱势带来反转特征
低股价本身并不创造价值,但在A股微盘样本中,它可能与投资者偏好、流动性、历史跌幅和困境反转共同作用。低成交量和弱60日表现则进一步把组合推向近期不受欢迎的股票。
当市场重新给这类股票定价时,反弹可能非常剧烈;但在风险偏好继续下降时,这些特征也可能共同放大亏损。
4. 50只持仓降低单票风险
微盘公司容易出现业绩暴雷、停牌、监管处罚和连续跌停。由10只扩展到50只,可以显著降低单只股票对组合的破坏力,也降低偶然选中一只大牛股对结果的依赖。
但分散只能降低个股特有风险,不能消除共同的微盘风格风险。2024年初大量微盘股票同时下跌时,50只可能一起跌,最大回撤仍然达到45.98%。
5. 涨停股延迟卖出保留了右尾收益
微盘策略的少数大收益往往来自连续涨停或短期快速上涨。策略不会在昨日涨停后第二天早盘机械卖出,而是等到下午观察是否开板,有利于保留部分强势股的收益尾部。
相应代价是,一旦开板后快速回落,14:00才处理可能失去更好的卖点;遇到跌停或流动性消失,也不保证能够卖出。
三、它做得比较好的地方
股票池和基本面数据使用前一交易日
基本面查询明确指定date=yesterday,同时开启avoid_future_data,比直接使用默认最新财务数据更规范。新股、ST和板块过滤也比较清楚。
交易成本考虑了印花税变化
代码按2023年8月28日前后切换卖出印花税,并使用用户声明的免5佣金。这比整段历史使用同一个税率更接近真实情况。
扩容改善单票容量
50只持仓把资金分散到更多标的。相同资金规模下,每只股票的下单金额更小,理论上比10只集中持仓更容易成交,也更能承受单票异常。
规则清晰,可解释性强
整个策略没有复杂机器学习模型。每一次入选都能还原为基本面门槛、规模排序和五个变量的组合得分,便于做因子拆解和压力测试。
四、回测中最需要警惕的问题
1. 最大问题是滑点被设为零
代码明确使用:
set_slippage(PriceRelatedSlippage(0.000))对持有50只极小市值、低成交量股票的策略来说,零滑点是非常强的理想化假设。真实成本不只是佣金和印花税,还包括:
- 买卖价差;
- 下单后的价格冲击;
- 开盘集合竞价的成交偏差;
- 涨跌停无法成交;
- 多只股票同时调仓时的排队问题。
而且策略主动偏好低成交量股票,恰好也是滑点更容易恶化的股票。回测若没有加入成交量占比限制和冲击成本,高收益可能被明显高估。
2. “成交量”使用股数,横截面可比性不足
代码累计约1200根一分钟K线的volume,也就是成交股数,而不是成交金额或换手率。不同股票的股价和流通股本差异很大:同样成交100万股,3元股票和30元股票的资金容量完全不同。
如果这个因子的目标是衡量流动性,更合理的候选包括成交额、换手率、过去若干日成交额中位数,以及计划下单金额占日均成交额的比例。
3. 低价因子可能重复放大流动性与困境暴露
股价是公司拆股、送转和股本结构共同决定的名义数字。低价不等于低估值。权重1.6使其成为第二重要因子,可能让组合额外暴露于经营困境、投资者偏好和流动性风险。
需要做的不是立刻删除低价因子,而是分别回测:去除低价、降低权重、改成估值或价格分位后,收益和回撤如何变化。
4. 60日“动能”实际是反转
变量名称叫m_days_return,但排序偏好数值更小的股票。权重2.0又是所有因子中最高,因此策略明显偏好过去60日表现较弱者。
这可能捕捉超跌反转,也可能不断买入仍在下跌的股票。代码没有趋势失效、个股止损或市场环境过滤,所以当弱势继续延伸时,组合只能等下周调仓。
5. 50只并非始终严格等权,也可能超过50只
已有持仓只要继续入选,就不会被调回标准权重。此外,昨日涨停但已经落选的股票会被暂时保留;目标名单仍可以包含50只,因此组合在某些时点理论上可能超过50只,或者因为保留仓位而无法补齐新名单。
所以“50只”更准确的说法是目标持仓数量,而不是任何时刻都严格保持50只、每只2%。
6. 9:30调用一分钟数据需要核对可得性和成交价
策略在9:30计算当前一分钟价格,又立刻调仓。研究时需要确认聚宽在该时间点返回的是哪一根分钟线、该价格是否能作为当次订单的可成交参考,以及实盘中计算全部候选因子需要多长时间。
即便没有未来函数,信号可得也不等于按同一个价格成交。
7. 一次长回测不等于样本外有效
2018年至2026年的累计结果覆盖了不同市场阶段,这是优点;但权重[1.0, 1.0, 1.6, 0.8, 2.0]是否根据这段历史调整过,截图无法回答。
如果研究者试过大量权重和过滤条件,最后只保留最好的一组,就会产生参数选择偏差。可靠验证至少需要滚动样本外、分年度表现、不同起始日期和权重扰动测试。
8. 最大回撤比年化收益更接近实盘感受
45.98%的最大回撤意味着净值从阶段高点接近腰斩。100万元在最差路径中可能从高点回落到约54万元;想从54万元恢复到100万元,需要随后上涨约85%。
这不是“忍一忍就过去”的小波动,而是足以让多数实盘使用者中途停掉策略的压力。高年化收益与大回撤在这里不是矛盾,而是同一种高风险暴露的两面。
五、回测指标应该怎样正确解读?
2162.74%的累计收益
它说明复利结果很强,但终点数值对回测区间、成交假设和少数强势年份高度敏感。必须同时看年度收益和水下曲线,不能只看终值。
46.61%的年化收益
长期维持这一收益非常困难。对微盘策略尤其要问:资金扩大十倍以后还能否以相同价格成交?如果容量上升导致滑点增加,年化收益会比回测更快下降。
1.517的夏普比率
从回测指标看,单位波动对应的收益不错。但夏普默认波动能够充分代表风险,而微盘策略真正危险的部分往往是跳空、跌停和无法卖出,这些风险不能被普通日收益标准差完整描述。
65.2%的胜率和2.826的盈亏比
两项同时较高看起来很优秀,但截图中的统计口径需要进一步确认:按天、按交易还是按持仓计算?如果不清楚口径,就不能直接拿来推算未来交易成功率。
0.895的Beta
Beta接近1并不表示组合风险接近中证500。线性Beta主要刻画共同涨跌关系,无法反映微盘拥挤、流动性枯竭和跌停退出风险。
六、我会怎样验证这套策略?
如果准备继续研究,我不会先调权重,而会按以下顺序做实验。
第一组:拆解收益来源
分别运行:
- 只保留总市值排序;
- 总市值+基本面门槛;
- 依次加入流通市值、低价、低成交量和60日反转;
- 比较每一步增加的收益、回撤和换手。
这样才能知道五个变量究竟提供了独立信息,还是重复强化微盘暴露。
第二组:测试真实成交
- 设置多档滑点;
- 限制单笔交易占过去成交额的比例;
- 模拟涨跌停无法成交;
- 将调仓价格延后至9:35或更晚;
- 比较100万、500万和1000万资金规模。
如果资金一放大,收益迅速消失,说明策略的核心瓶颈是容量。
第三组:测试稳定性
- 10只、20只、30只、50只和100只持仓;
- 周一、周二及不同调仓时间;
- 60日反转改成40、80和120日;
- 五个权重上下扰动20%;
- 逐年和滚动三年回测。
真正稳定的策略不会因为一个参数稍微变化就从高收益变成失效。
第四组:更换合理基准
除了中证500,还应该对比中证2000、小市值等权组合,以及“最小100只股票简单等权”基线。如果策略跑赢中证500,却没有跑赢简单微盘基线,那么主要贡献仍然是规模Beta。
七、这套策略适合谁,不适合谁?
它适合用来研究:
- 微盘规模效应;
- 基本面过滤与反转因子的组合;
- 分散持仓对单票风险的改善;
- 微盘策略的容量与成交问题。
它不适合被理解成:
- 收益已经可以直接复现;
- 50只持仓就不会发生大回撤;
- 有佣金和印花税就等于交易成本完整;
- 历史2162%可以线性外推到未来。
结语
这套策略的优点很鲜明:规则简单、基本面有门槛、持仓足够分散、长期回测结果突出。它比只买10只微盘股更能降低单票风险,也更适合作为微盘多因子研究的起点。
它的缺点同样集中:收益高度依赖极小市值风格,低价、低成交量和60日弱势可能叠加流动性与困境风险;零滑点又恰好忽略了微盘策略最昂贵的成本。45.98%的最大回撤提醒我们,扩容解决的是单票集中度,不是微盘风格的系统性风险。
因此,这条漂亮曲线最有价值的地方不是证明“微盘50只一定有效”,而是提出一组可以继续验证的问题:
扣除真实冲击成本以后还剩多少收益?五个变量中谁真正提供增量?资金规模扩大后还能不能成交?离开最有利的历史参数以后,结果是否仍然稳定?
回答完这些问题,才有资格从“好看的回测”走向“可以评估的策略”。
原始代码来源:聚宽公开文章页面。本文仅用于代码与量化研究,不构成投资建议。回测结果不代表未来表现,微盘股可能出现大幅波动、连续跌停和无法成交。