
我做量化这些年最常被同行问的一句话是涨停板上天天有那么多炸板的票到底能不能做成策略答案是能而且有个专门的名字叫“烂板策略”。这套东西在游资圈里不算秘密但真正把它量化成代码、跑成系统的人并不多。今天这篇就把我从数据准备、信号识别、打分筛选到实盘注意点的整套思路拆开讲代码也给你摆出来照着改就能用。先说清楚烂板策略的定位它是短线高频交易里非常典型的事件驱动型策略核心盯的是“个股涨停后开板炸板、再回封”的整个过程。烂板意味着分歧——有人拼命卖有人拼命接这种票次日往往还有情绪修复的溢价尤其是在市场氛围不差的阶段溢价更明显。对于做量化的朋友来说它的好处是规则清晰、信号密度高、回测逻辑好落地不用像挖掘基本面那样拍脑袋。这篇文章适合三类人一是刚接触量化交易、想找一个容易上手的短线策略模板的人二是已经在做打板或半路板、想把自己的盘感转成代码逻辑的选手三是想搞清楚行情API怎么选、分钟线数据怎么用的人。下面的内容我会按“策略原理、数据源、识别模型、代码实现、问题排查、仓位纪律”六块来写尽量不绕弯子。1. 烂板策略的底层逻辑为什么“炸板”反而是机会1.1 从打板到烂板先搞懂几个关键术语A股语境里的“打板”指的是在个股涨停那一刻或临涨停时买入赌它当天封死、次日继续涨。这个玩法有很多分支有做“首板”的有做“回封板”的——也就是股票触及涨停后打开、随后重新涨停。这里面的“打开”在盘口上就叫“炸板”或者“开板”。炸板之后还能重新封回去的就形成了所谓的“烂板”。我说的烂板不是那种跌跌不休的弱势票而是“涨停了—被砸开—又封上”的票。一次开板还算好的有些票会反复开合几次像拉链一样盘口分歧非常剧烈。为什么这种状态值得关注因为开板说明有获利盘、套牢盘在集中兑现而回封则说明有更强的资金愿意在这个位置接货。分歧之后如果还能重新封住等到次日多头共识延续就容易高开甚至继续冲板。做量化的朋友会关心一件事这种“分歧转一致”的形态有没有统计规律根据我和身边同行的复盘观察在一段赚钱效应正常的行情里烂板次日的平均溢价高开幅度盘中冲高是显著高于随机打板的。原因很简单好板比如一字板、秒板你根本买不进去能被你买到的涨停票本身就是有分歧的而有分歧还能回封的票资金意愿已经用真金白银证明过一次了。1.2 为什么烂板比“好板”更适合量化程序很多刚起步的朋友会问我为什么不做一字板策略一字板确实溢价高但它有两个致命缺点一是你买不到涨停封单几十万手排在后面等轮到你早就收盘了二是它的信号极其稀少根本没多少回测样本策略容易过拟合。烂板则不一样。它的筛选条件非常明确当日曾涨停、涨停后打开、打开后回封。这三个状态在分钟线或者分时快照数据里都是可以精确量化的不像“题材强度”“市场情绪”这类模糊变量很难写成机器规则。信号密度也够一个正常交易日全市场符合基本条件的票至少有几十只足够你在里面继续做打分筛选。另外烂板策略天然适合量化还有一个原因——它的持仓周期非常短通常就是次日开盘到盘中冲高这一段。短周期意味着我们不需要预测太远的未来只需要评估“情绪修复的惯性”这种惯性用当日盘口数据开板次数、回封时间、量能变化去拟合误差相对可控。说白了这就是把游资的盘感拆解成可计算的因子然后让程序按纪律去执行。2. 前置准备数据源选型与开发环境搭建2.1 行情API怎么选这题我能给出一个明确的答案“量化交易用的数据API最好的是什么”这个问题我在不同群里被问过不下二十遍。说实话没有绝对最好的关键看你做多高频、预算多少、以及你的服务器在哪。但针对烂板策略这种“日线级别筛选分钟线回放”的短线玩法我给出下面的对比表你们直接按自己的情况选就行。数据源免费/付费分钟线质量增量更新涨停状态实盘接口适合场景tushare pro付费积分优需定时拉取可计算无离线回测、自建系统akshare免费良每次现取可计算无学习、原型验证baostock免费中需全量拉取可计算无历史数据研究聚宽/JQData会员/付费优实时推送内置字段有模拟在线研究、回测ptrade券商提供优实时推送内置字段有实盘券商端自动化交易我的经验是如果是为了研究策略、验证逻辑先别急着买付费API用akshare或者tushare的免费额度把框架跑通等策略有正收益、准备接实盘了再升级到聚宽或者ptrade这类自带实盘通道的方案。记住一个原则——先用便宜的数据把逻辑跑对再用贵的数据去抠执行细节。另外要提醒一点涨停相关的判断最好自己算不要直接信任别人数据源里的“涨停”标记字段。因为有的源把科创板20%也算“涨停”有的源把ST的5%也标成涨停还有的新股上市首日不设涨跌幅这些不统一会导致你的选股池出问题。最稳妥的办法是拿前收盘价自己算涨停价规则一步步写在你的代码里。2.2 搭建本地Python扫描环境五分钟跑通基础流程我本地的策略研究环境非常简单Python 3.10核心依赖只有pandas、numpy、requests、akshare。做分钟线级回测的时候用pandas处理数据完全够用等单日信号量超过几百只股票、或者你要把历史回测区间拉到三五年以上再考虑上polars或者数据库。先跑通一个最基础的流程用akshare拉全市场股票列表和实时快照筛选出曾涨停且当前封住的票。这段代码我贴出来逻辑很清楚大家可以先在你自己的环境里跑一下import akshare as ak import pandas as pd # 拉取A股实时行情快照含最新价、涨跌幅、换手率等 df ak.stock_zh_a_spot_em() # 过滤掉ST、北交所和科创板可自行调整 df df[~df[名称].str.contains(ST)] df df[~df[代码].str.startswith((8, 4, 68))] # 按涨停价逻辑筛选 df[涨停价] (df[昨收] * 1.1).round(2) df[曾涨停] df[最高] df[涨停价] df[当前封住] df[最新价] df[涨停价] # 符合条件的票曾涨停且当前涨停 result df[df[曾涨停] df[当前封住]] print(result[[代码, 名称, 最新价, 涨停价, 换手率]])这段代码解决的是“全市场扫描”的问题。跑完之后你会发现符合“当天涨停且还封着”的票其实不少接下来要做的就是从里面挑出“烂板”——也就是有过开板动作的。这一步靠日线快照看不出需要分钟线或者分时明细数据。3. 核心细节烂板识别与打分模型怎么落地3.1 炸板检测分钟线数据才是真正的依据要判断一只票当天有没有炸板、炸了几次、什么时候回封的最基础的数据粒度是分钟线。我自己常用的是1分钟或5分钟K线两种各有优缺点1分钟线精确但数据量巨大做全市场扫描时慢5分钟线速度快但会把几分钟内的快速开合合并掉导致漏掉“秒板秒开”的情况。实操中我的建议是候选池用日线快照缩小精确判断再用1分钟线复核这样速度和精度都能兼顾。判断逻辑并不复杂把全天分钟线按时间排序找到第一次触及涨停的时间点T0然后看后面的分钟K线是否跌破涨停价如果跌破了就记一次“炸板”之后再出现价格回到涨停价以上记一次“回封”。全天重复几次就累计出“开板次数”和“封板段数”。这里有个细节容易出错涨停价不是随便用收盘价算的。沪深主板是非ST股10%、ST股5%创业板和科创板20%北交所30%。而且涨停价要按“四舍五入到分”的方式计算。举个例子昨收是12.34元主板股的涨停价就是(12.34 * 1.1)算出来是13.574四舍五入取两位就是13.57元。别小看这一分钱很多扫描程序就是因为这里取整方式不对导致差一分钱没识别出涨停。3.2 回封形态过滤不是所有烂板都值得做识别出烂板只是第一步真正决定策略质量的是“哪些烂板能碰、哪些不能碰”。我做了两年多烂板回测总结了几个非常重要的过滤条件任何一个不满足都可以直接放弃第一个看首次炸板的时间。如果一只票早盘秒板结果开盘十几分钟就被砸开这通常说明筹码锁定度很差里面的资金根本不认可这个涨停价。真正值得关注的是那种在上午封住、临近午盘或者下午才被砸开的票因为这种票至少说明多头在早盘掌握了主动权。我的经验数据里首板时间在10:00之前、首次炸板时间在10:30之后的样本次日溢价明显更好。第二个看回封效率也就是炸板后花了多久重新封住。回封时间越短说明回封资金越坚决。比如同样炸板一只票5分钟就回封了另一只票磨蹭了40分钟才回封后者的确定性就差很多。我自己设定的阈值是30分钟内必须完成有效回封超过这个时间直接踢出候选池。第三个看炸板深度也就是炸板时最低价跌到涨停价下方多少。有些票只是打开了一分钱最低价就碰了一下涨停价下方这属于“假开板”里面的资金根本没想走有些票直接砸下去三五个点跌幅又深又急这是真出货。实操中我喜欢把“炸板后最低价”作为评分项跌得越浅分越高。3.3 给烂板打分把盘口强弱变成数字把上述规则转换成量化模型我建议做一个评分卡用几个因子给每只烂板票打一个0到100的综合分。这个打分没有统一标准但以下是我经过反复回测后固定下来的模板大家可以直接抄再根据你所在市场的风格微调因子名称计算方式计分逻辑开板次数全天达到涨停后又跌破的次数越少越好0次满分5次以上直接排除首次开板时间当日第一次跌破涨停的时间10:30之后加分过早开板减分回封耗时最后一次开板到最终回封的时间10分钟以内满分30分钟以上减分炸板深度开板期最低价 / 涨停价 - 1跌幅小于1%加分大于3%扣分回封量比回封时段的成交量 / 全天均量放量回封加分缩量回封减分流通市值当日流通市值亿元30亿到200亿区间加分太大太小减分涨幅位置当日首次涨停时距离60日新高的位置近期新高附近加分低位首板一般也算加分打分的作用是把一堆并列的烂板票排出先后顺序。记住量化策略追求的不是找到“一定涨”的票而是找到“赔率更优”的一组票。你按分数从高到低选前3到5只长期下来整体的胜率和盈亏比要比你每次只看一两个技术形态稳定得多。4. Python完整实现从信号生成到回测验证4.1 核心代码烂板识别与打分全流程下面这段是我抽出来的一段核心代码对接的是tushare的分钟线接口使用前请先确认你有对应权限。整体流程是输入股票代码和日期拉当天1分钟线计算涨停价识别“涨停—炸板—回封”区间最后输出打分结果。逻辑我做了精简但核心步骤一个不少。import pandas as pd import numpy as np def calc_limit_price(pre_close, board_typemain): 计算涨停价主板10%创业板/科创板20%ST 5% 注意这里为了简化只区分主次板与创业/科创板 if board_type main: ratio 1.10 elif board_type gem: ratio 1.20 elif board_type st: ratio 1.05 else: ratio 1.10 return round(pre_close * ratio, 2) def identify_rotten_board(df, limit_price): df: 1分钟K线需要包含时间、开盘、最高、最低、收盘、成交量 返回是否烂板、开板次数、首次开板时间、最终回封时间、炸板深度、回封耗时 df df.sort_values(time).reset_index(dropTrue) hit_limit df[high] limit_price if not hit_limit.any(): return None # 状态机0未涨停1封住2炸板 status 0 open_count 0 first_open_time None last_open_time None last_reject_time None max_drop 0 for _, row in df.iterrows(): if status 0: if row[high] limit_price: status 1 elif status 1: if row[low] limit_price: # 封住状态下最低价低于涨停价 炸板 status 2 open_count 1 last_open_time row[time] if first_open_time is None: first_open_time row[time] # 计算炸板深度盘中最低价相对涨停价的回撤 drop_ratio (limit_price - row[low]) / limit_price max_drop max(max_drop, drop_ratio) elif status 2: # 炸板状态下重新触及涨停 回封 if row[high] limit_price: status 1 last_reject_time row[time] if status 1 and open_count 0: return { is_rotten: True, open_count: open_count, first_open_time: first_open_time, last_open_time: last_open_time, last_reject_time: last_reject_time, max_drop: max_drop } return {is_rotten: False, open_count: open_count}这套状态机逻辑看起来不复杂但我当时写的时候踩过一个坑如果某根分钟线既是“从封住状态跌到涨停价以下”又同时是“从炸板状态重新收回涨停价以上”比如一根大阳线直接从涨停价下方拉到涨停价上方程序会漏掉回封判断。所以我在循环里用了两个if去判定状态流转而不是用else if这样即使同一根K线内发生多次状态变化也能不漏判。4.2 回测框架别只看胜率盈亏比才是核心做出信号识别后下一步就是回测。烂板策略的持仓周期很短所以回测框架的核心是“次日开盘买入日内卖出”中间还要考虑涨跌停打不进去、滑点、手续费这些摩擦成本。我的回测模板大致是这样T日收盘后扫描出候选池并按打分排序T1日开盘按固定仓位买入评分最高的N只票卖出规则可以是“涨幅达到3%止盈、跌破-2%止损、尾盘14:50清仓”三选一也可以同时执行。回测指标重点看三样总胜率、平均盈亏比、最大回撤。胜率可以不高比如45%但盈亏比如果能做到2比1以上长期就是赚钱的。我在回测中常用的卖出规则如下def exit_signal(entry_price, high, low, close): # 止盈线 3%止损线 -2% if high entry_price * 1.03: return take_profit if low entry_price * 0.98: return stop_loss if close -1: return force_liquidate return hold注意回测里最容易被忽略的一点烂板策略遇到“次日直接低开”时可能根本没有机会按开盘价卖出因为竞价阶段就跌破了止损线。所以回测模型里要加入“开盘价相对昨收的跳空幅度”作为额外的成交判断。我在实际回测里发现加入跳空处理之前策略收益曲线非常漂亮加入之后收益直接砍掉三分之一——但这才是真实可执行的曲线大家一定要有这个心理预期。4.3 高频执行端把信号接进ptrade或自研通道信号算好了回测也过了接下来就是把策略跑起来的阶段。如果你是券商客户很多都提供ptrade这个量化终端它的好处是Python环境、数据接口、实盘下单一条龙省去自己搭系统的麻烦。在ptrade里你只需要把我的识别函数包成一个候选函数再用它的定时任务在每天14:50跑一次选股生成次日买入列表送进自动交易模块即可。如果你走自研路线那就需要解决一个核心问题数据从哪实时推送。这时候可以上聚宽或QMT的实时接口把当天分钟线的增量数据订阅下来自己维护一个内存DataFrame然后在收盘后触发信号计算。执行端用券商提供的Python交易API或者直接通过Ptrade的算法接口下单。自研的灵活性高但注意别把回测和实盘的数据对齐搞混了尤其是“信号当时能不能拿到”这个时序问题。5. 常见问题与排查实录这些坑我都替你踩过5.1 高频踩坑速查表说实话烂板策略逻辑并不算深但把它从想法变成能稳定跑的系统中间会踩不少坑。我整理了一份高频问题速查表都是我和几个同行实际遇到过的按出现频率排序问题现象根本原因解决方案选股结果里出现很多“假涨停”涨停价计算方式错误或除权未处理统一用昨收计算涨停价回测前做复权处理回测胜率很高实盘明显亏回测中用了当日盘中信息做次日选股选股信号全部使用T日收盘后数据T1才可交易打板票次日一字跌停止损不了流动性枯竭无法按止损价成交引入一字板熔断机制回测中强制按次日收盘价成交分钟线数据里30%的票缺失免费API限流或者股票停牌加延时重试停牌股直接跳过信号太多持仓分散打分模型区分度不够增加过滤条件比如炸板深度超过3%的一律剔除回测资金曲线在大盘下跌时急剧回撤没有叠加市场环境过滤增加大盘环境判断指数跌幅超过阈值时空仓5.2 做数据对齐时最容易犯的错很多刚做量化的朋友会犯一个非常隐蔽的错误用当天全天的分钟线数据去回放“当天某个时刻”的信号。举例来说你在T日14:50想判断这只票当时是否封住如果你用整天的分钟数据去算哪怕你在14:50那一刻已经知道它全天封住了也会把14:50之后可能的炸板信息提前用到信号里。这在程序上叫“前视偏差”或“未来函数”是回测和实盘收益差别的最大来源之一。我当时的解决办法是在每分钟数据上做“滚动指标”计算只使用当前时刻之前的数据来更新封板状态。这种滚动计算的性能压力挺大但为了真实可信必须这么做。你宁可在回测里少赚一点也不能让回测曲线失真。另外除权除息日也是重灾区前收盘价会变化如果你没有做前复权一天的数据可能整个错位。我建议在数据拉取时统一做前复权并且每次选股都先用最新交易日的数据做校验。5.3 关于市场风格的残酷现实最后说一个很多人不愿意面对的事实烂板策略的收益和市场风格高度相关。在赚钱效应好的时候比如题材活跃、连板高度在提升的阶段烂板策略的胜率会非常高但在市场整体缩量、连板失败率飙升的阶段这个策略会连续止损收益曲线像瀑布一样往下掉。应对方法有两个。一是叠加“市场情绪过滤器”——比如用全市场当日涨停家数、炸板率、连板晋级率这几个指标做一个温度计温度低于某个阈值就自动降仓位甚至空仓。二是在烂板内部做风格细分比如只做“回封后不炸”的强烂板或者只做热门板块内烂板。把策略细化成不同档位根据环境切换远比一套参数吃到老安全。6. 止损、仓位与心态活下去比赚得多更重要6.1 止损不是一个点位而是一条纪律链短线高频策略的止损问题本质上不是“亏几个点走人”的事而是“触发什么状态必须走人”的纪律。我的止损规则包含三层第一层是价格止损买入后跌破成本2%无条件卖出第二层是时间止损尾盘14:50前没有达到预期涨幅无论盈亏一律清仓这是为了防止把短线做成被动长线第三层是事件止损如果买入后发现当日实际盘面与选股信号严重不符比如个股出现重大利空或者板块整体跳水不等到止损线也要先走。为什么要这么严因为烂板策略赚的是情绪修复的钱情绪一旦消失逻辑就没了。你持有它越久不确定性越大。很多散户做短线之所以亏钱不是选股错误而是持仓时间无限拉长硬生生把短线做成了“价值投资”这在量化框架里是不可接受的。6.2 仓位管理单票不超过总资金的20%关于仓位我个人的经验是单票仓位最好不要超过总资金的20%。假设你有100万一只票最多买20万选5只就是满仓。这么做的原因是烂板策略的单笔胜率通常在45%到55%之间并不算高但盈亏比倾斜。万一遇到黑天鹅哪怕单票止损2%总仓位也才损失0.4%完全在可承受范围内。仓位分配还有个细节不要等权分配而要按打分结果做权重倾斜。打分最高的票给最大权重比如30%的比例后面的票依次递减。这样如果打分模型有效你的收益会显著跑赢简单的等权组合。但注意权重倾斜不要过猛不然一只票的波动就会被放大到影响整个账户的程度。6.3 个人复盘后的心里话最后分享一点我自己做烂板策略的体会。这个策略做了三年多中间经历过连续盈利的兴奋期也经历过一个月回撤15%的煎熬期。最大的感悟是量化交易的核心不是预测而是应对。烂板策略的成功不在于你判断对了几次分歧转一致而在于你对每一笔交易都做了风险预案并且不折不扣执行。把“也许会错”当成前提去设计系统你就能在错的时候少亏在对的时候拿得住。这就是这套策略真正能长期做下去的原因。