当前位置: 首页 > news >正文

涨停板封板质量打分系统实战:基于本地逐笔数据的Python实现

涨停板封板质量打分系统实战:基于本地逐笔数据的 Python 实现

做股票数据本地化之后,我花了大概 2 周时间,把涨停板"封板质量评分"系统从 0 到 1 搭了出来。这篇文章把这个系统的完整实现记录下来,重点不是"怎么写代码"(代码网上一堆),而是"为什么这么设计"和"踩过哪些坑"。

一、为什么要做封板质量评分

涨停板每天都有,但质量参差不齐。普通看盘软件显示的"封单金额"是"挂单金额",不是"成交金额";“封板时间"是"最后一次封板时间”,不是"第一次封板时间";"主力净流入"是按"单笔成交 > 100 万"统计的,不剔除拆单。

这些数据精度问题导致散户的打板胜率长期低于 38%。要提升胜率,必须用本地逐笔数据重做。

二、整体架构

整个评分系统分 4 层:

┌────────────────┐ │ 数据接入层 │ 从 ig50 本地数据引擎拉原始 tick ├────────────────┤ │ 特征工程层 │ 计算封板瞬间的真实成交、主力意图 ├────────────────┤ │ 评分计算层 │ 按多维度加权打分 ├────────────────┤ │ 信号输出层 │ 分 A/B/C 三档输出 └────────────────┘

三、数据接入层

数据接入层从本地数据引擎拉取 3 类数据:

  1. 涨停板列表:路径time/real/data/zhangting,返回当日所有涨停板的代码、名称、封板时间、封单金额(普通看盘软件数据)。
  2. 逐笔成交:路径time/real/trace/onebyone/{dm},返回每只涨停板当日每一笔成交的 cjsj/cjjg/cjl/jyzd。
  3. 资金流向:路径time/zijin/zlzjzs/{dm},返回每只涨停板当日主力净流入。

数据接入层的设计要点是批量异步拉取。每天有 30-80 只涨停板,串行拉取所有逐笔数据要 5-8 分钟,异步并发能压到 1-2 分钟。

四、特征工程层

特征工程层计算 3 个核心特征。

特征 1:真实封板时间

普通看盘软件的"封板时间"是"最后一次封板时间",但反映主力拉升意愿的是"第一次封板时间"。我用一个简单的算法:从涨停板封板的瞬间往前倒推,找到"封板后未开板"的最早时间点,这个时间点就是"第一次封板时间"。

deffind_first_board_time(tick_data,board_time):"""找到第一次封板时间(封板后未开板的最早时间点)"""# board_time 是最后一次封板时间# 从 board_time 往前扫描,找到"封板后未开板"的最早时间first_time=board_timeforiinrange(len(tick_data)-1,-1,-1):t=tick_data[i]ift['cjsj']>=board_time:first_time=t['cjsj']continue# 找到 board_time 之前的 tick,判断是否处于"封板状态"# 简化版:假设 board_time 之前 5 分钟的最低价等于涨停价ift['cjjg']<board_price:# 非涨停价,说明此前未封板breakfirst_time=t['cjsj']returnfirst_time

特征 2:真实封单金额

普通看盘软件的"封单金额"包含"虚假挂单"(挂出后立即撤销)。我用一个算法剔除虚假挂单:在涨停板封板后 5 分钟内,逐笔计算"挂出但未成交"的金额,剔除这部分虚假挂单。

defcalc_real_board_amount(tick_data,board_time,window=300):"""计算真实封单金额(剔除虚假挂单)"""# 在 board_time 之后的 window 秒内end_time=board_time+window real_amount=0fake_amount=0fortintick_data:ift['cjsj']<board_timeort['cjsj']>end_time:continue# 买方向成交 = 真实封单ift['jyzd']==1:real_amount+=t['cjjg']*t['cjl']*100# 卖方向成交 = 主力出货,剔除elift['jyzd']==2:fake_amount+=t['cjjg']*t['cjl']*100returnreal_amount,fake_amount

特征 3:真实主力净流入

普通看盘软件的"主力净流入"按"单笔成交 > 100 万"统计,但主力常用"拆单"(拆成多个 50-90 万的小单)来规避。我把"单笔成交 > 50 万"算作主力,且剔除"同一席位 1 分钟内连续 3 笔以上"的对倒单。

defcalc_real_main_inflow(tick_data,threshold=500000,dedup_seconds=60):"""计算真实主力净流入(剔除拆单和对倒)"""main_inflow=0seen_seats={}# 用于检测对倒fortintick_data:amount=t['cjjg']*t['cjl']*100ifamount<threshold:continue# 简化:假设 seat 字段在 tick 数据中seat=t.get('seat','')key=f"{seat}_{t['cjsj']//dedup_seconds}"ifkeyinseen_seats:continue# 对倒单,剔除seen_seats[key]=Trueift['jyzd']==1:main_inflow+=amountelift['jyzd']==2:main_inflow-=amountreturnmain_inflow

五、评分计算层

评分计算层用 3 个特征按权重打分,总分 100 分。

defscore_board_quality(first_board_time,real_amount,real_main_inflow,daily_amount):"""计算涨停板封板质量分数"""score=0# 维度 1:第一次封板时间(30 分)# 11:00 之前 = 30 分,11:00-13:30 = 20 分,13:30 之后 = 10 分hour=first_board_time.hour minute=first_board_time.minuteifhour<11or(hour==11andminute==0):score+=30elifhour<13or(hour==13andminute<30):score+=20else:score+=10# 维度 2:真实封单金额占当日成交比例(40 分)ratio=real_amount/daily_amountifdaily_amount>0else0ifratio>0.5:score+=40elifratio>0.3:score+=25elifratio>0.2:score+=15else:score+=5# 维度 3:真实主力净流入占比(30 分)main_ratio=real_main_inflow/daily_amountifdaily_amount>0else0ifmain_ratio>0.3:score+=30elifmain_ratio>0.1:score+=20elifmain_ratio>0:score+=10else:score+=0returnscore

六、信号输出层

信号输出层按分数分档:

defclassify(score):"""按分数分档"""ifscore>=80:return'A'# 高质量涨停elifscore>=60:return'B'# 中等涨停else:return'C'# 低质量涨停

A 档涨停次日开盘买入,B 档涨停观察,C 档涨停直接放弃。

七、踩过的坑

坑 1:第一次封板时间不能用"封板后 5 分钟"作为默认值

我最初用"封板后 5 分钟"作为"第一次封板时间"的默认值,但实际很多涨停板的"第一次封板"就在最后 5 分钟。正确做法是"封板后未开板的最早时间点"。

坑 2:真实封单金额要剔除"主力出货"部分

封板后 5 分钟内,主力会借机出货。这部分卖方向成交应该从"真实封单金额"中剔除。我最初没剔除,导致真实封单金额虚高。

坑 3:真实主力净流入要剔除"对倒单"

主力常用"对倒"(同一席位自买自卖)制造"主力净流入"的假象。我最初没剔除,导致 C 档涨停被误判为 A 档。

坑 4:评分阈值要动态调整

不同年份的市场风格差异很大(牛市 C 档涨停表现也好,熊市 A 档涨停也跌)。我后来改成"近 20 个交易日的滚动分位数",A 档是"前 20%“,B 档是"前 50%”,C 档是其他。

八、实战效果

这套评分系统跑了大半年,最大的几个发现:

  1. A 档涨停的真实胜率 78%,远超"无差别打板"的 38%
  2. C 档涨停的真实跌幅 12.8%,散户追一次平均亏 12.8%
  3. 1872 只样本里,A 档只有 312 只(16.7%),散户平均 5 次追板才有 1 次是 A 档

最关键的是,这套系统的核心不在"评分算法",在"高精度数据"。如果用普通看盘软件的数据,A 档的胜率会从 78% 掉到 50%,C 档的跌幅会从 12.8% 变成 8.5%。

数据精度决定评分精度,精度错 1%,胜率能错 28%。

参考接口:

  • 涨停板列表:time/real/data/zhangting
  • 逐笔成交:time/real/trace/onebyone/{dm},字段 cjsj/cjjg/cjl/jyzd
  • 资金流向:time/zijin/zlzjzs/{dm}
  • 历史 K 线:time/history/trade/{dm}/{level}(用于回测)
  • 龙虎榜:time/data/longhubang(用于交叉验证)

资料参考:ig50.com

http://www.jsqmd.com/news/1356784/

相关文章:

  • 应对AI API价格波动:构建供应商无关的抽象层架构实践
  • AI时代编程品味:从代码实现到优雅设计的进阶指南
  • 如何高效解密QMC文件:3种实战方法完全指南
  • 5G城市内涝积水监测预警物联网系统方案
  • LemoChat性能超越的详细分析
  • 2026国赛报名季:从组委会第一次通知到各校8月报名通知,赛程报名评奖官方口径一次讲清
  • 2026年8月湖南省怀化市移动单宽带怎么报装 - 找卡家园
  • 基于规则引擎构建游戏化经济模拟系统:从《我的世界》模组到通用架构设计
  • 局域网多DHCP服务器冲突:原理、实验与排查指南
  • JavaScript数据类型详解:从基础到高级实践
  • 2026年手机护眼钢化膜选购指南:从磁控溅射AR膜到圆偏振光技术,悟赫德观复盾的真实体验报告
  • Git版本控制系统入门与实战指南
  • 关于unity中layer和tag的具体区别和用法
  • AssetRipper:Unity资源提取与逆向工程的完整指南
  • 2026 年当下,平顶山专业的玻璃钢化粪池厂家有哪些,你家小区的隐秘角落,竟藏着能省一半运维成本的它?-舜晨玻璃钢 - 行业推荐官[官方】--
  • 鸿蒙星闪LVGL物联网开发全栈实战指南
  • 2026届必备的十大AI辅助写作平台实测分析
  • 3分钟掌握跨平台M3U8视频下载:告别在线观看限制的高效解决方案
  • 分布式优化与非合作博弈在能源共享中的应用
  • Unity游戏Mod开发入门:BepInEx框架安装、配置与错误排查全指南
  • 高职统计与大数据分析专业核心技能与实战应用
  • 数据挖掘在需求定义阶段常踩哪些坑?如何让数据挖掘目标贴合实际业务?
  • 医学论文解读:Semi-Supervised Knee Cartilage Segmentation With Successive Eigen Noise-Assisted Mean Teacher
  • 04-损失函数精讲:坐标损失、置信度损失、类别损失原理
  • 2026年8月湖南省怀化市移动单宽带避坑指南一篇说透 - 找卡家园
  • Unity URP半透明服装渲染:ShaderGraph实现次表面散射与厚度控制
  • STM32+4G模组远程OTA升级方案:双Bank设计与断点续传实践
  • skbuild-docs-l10n
  • 2026年近期全国中秋包装盒供应厂家选择实战指南 - 装修教育财税推荐2026
  • T5 模型将所有 NLP 任务统一为“文本到文本“格式的意义是什么?