用Python实时解析L2行情:从逐笔数据到主力意图的完整链路 IG50免费开源股票数据API接口
用 Python 实时解析 L2 行情:从逐笔数据到主力意图的完整链路
做股票数据本地化之后,我花了大概 3 个月时间,把整套 L2 实时监控 + 主力意图识别的链路从 0 到 1 搭了出来。这篇文章把这个链路完整记录下来,重点不是"怎么写代码"(代码网上一堆),而是"为什么这么设计"和"踩过哪些坑"。
一、整体架构
整个系统分 4 层:数据接入层、清洗聚合层、特征计算层、信号输出层。
数据接入层负责从本地数据引擎拉取原始 tick 和 L2 指标。我用的是 ig50 本地数据引擎,覆盖了 A 股 5000 多只票的 200 多个数据集。这里用到的接口主要有 3 个:
- 逐笔成交:
time/real/trace/onebyone/{dm},返回每只票当日的每一笔成交。返回的是 JSON 数组,每个元素的字段包括 cjsj(成交时间,格式 HHMMSSssssss)、cjjg(成交价格,浮点)、cjl(成交量,整数,单位手)、jyzd(交易方向,0 中性/1 买入/2 卖出)。 - 十档盘口:
time/real/trace/level10/{dm},返回买一到买十、卖一到卖十的挂单价格和量。同样是 JSON。 - L2 指标:
time/real/trace/l2sign/{dm},返回大单比率、小单比率、撤单比率、委托净额、DDX、DDY、DDZ 等十几个指标。返回的是单个 JSON 对象。
数据接入层的设计要点是异步批量拉取。一只票一天有几万笔 tick,5000 只票一天有几亿笔,串行拉肯定不现实。我用了 Python 的 asyncio + aiohttp,自己实现了一个简单的连接池,把每只票的拉取任务并发起来,本地数据引擎内网响应大概是 1-3 毫秒一个请求,20 并发的话 5000 只票全部拉完大概 5-8 分钟。
二、清洗聚合层
拿到的原始 tick 是"逐笔成交记录",不是"K 线"。所以第二层要做的是"把 tick 聚合成 1 分钟 K 线 + 5 分钟 K 线 + 30 分钟 K 线",同时做几件事:
- 过滤中性单:jyzd=0 的成交是"开盘集合竞价"或"不区分方向的成交",过滤掉。
- 区分大小单:单笔成交金额 = cjjg * cjl * 100,超过 100 万算大单,10 万到 100 万算中单,10 万以下算小单。
- 计算主动性买卖:主动买入 = jyzd=2 的成交金额合计,主动卖出 = jyzd=1 的成交金额合计。注意 jyzd 的定义在不同数据源里不一样,我用的是 ig50 的定义(1=买入,2=卖出,0=中性)。
- 聚合到分钟级:每分钟计算一次,得到 OHLCV + 主动买入金额 + 主动卖出金额 + 大单买入金额 + 大单卖出金额 + 小单买入金额 + 小单卖出金额。
聚合的代码很简单,用 pandas 的 resample 就行。重点是要注意"集合竞价"的处理——9:25-9:30 的集合竞价成交应该合并到 9:30 那根 K 线里,而不是单独成一根。
三、特征计算层
第三层是"主力意图识别"的核心。我基于分钟级 K 线计算了几个特征,这几个特征对短期主力意图的识别效果最好。
特征 1:主力净流入比率
公式:主力净流入 = 大单买入金额 - 大单卖出金额,主力净流入比率 = 主力净流入 / 当日总成交金额。
这个比率超过 5% 算"强势吸筹",超过 10% 算"强烈吸筹"。负向同理。
特征 2:撤单比率
撤单比率需要从 L2 指标接口(time/real/trace/l2sign/{dm})直接拿,这个值 ig50 已经算好了。撤单比率超过 60% 算"假挂单嫌疑",超过 80% 算"高度疑似诱多/诱空"。
特征 3:价格弹性
公式:价格弹性 = 当根 K 线振幅 / 当根 K 线成交量,单位是"每万元成交对应的振幅"。这个值越大,说明"少量成交就能拉动价格",是主力高度控盘的标志。
特征 4:买卖盘不平衡
从十档盘口(time/real/trace/level10/{dm})计算买一到买十的总挂单量和卖一到卖十的总挂单量,不平衡 = (买总 - 卖总) / (买总 + 卖总)。这个值超过 +30% 算"买盘主导",低于 -30% 算"卖盘主导"。
特征 5:连续性指标
主力意图很少是"一次性"的,需要看连续性。具体是计算过去 5 分钟、10 分钟、30 分钟的"主力净流入"累计值。如果累计值持续放大,说明主力意图明确;如果累计值波动很大,说明多空博弈激烈。
四、信号输出层
第四层是把上面这些特征组合成"主力意图信号"。我设了 3 类信号:
信号 A:吸筹信号
触发条件:主力净流入比率 > 5% 连续 10 分钟,且价格弹性 < 0.5,且卖盘不平衡 < -10%。
含义:主力在低位持续买入,且不是用少量资金拉价(说明控盘度高),且卖盘压力大但被主力吸收。
信号 B:出货信号
触发条件:主力净流入比率 < -5% 连续 10 分钟,且撤单比率 > 60%,且买盘挂单虚高(挂单未成交占比 > 70%)。
含义:主力在高位持续卖出,且挂单是"诱多"的假单。
信号 C:洗盘信号
触发条件:股价下跌 3-5 个点,但主力净流入比率 > 0(下跌中主力在吸筹),且小单卖出占比 > 40%(散户割肉)。
含义:主力借下跌洗盘,吸筹散户割肉筹码。
五、踩过的坑
这套系统跑了大概 3 个月,我踩过几个坑,记下来给后来人参考:
坑 1:L2 指标不要只看瞬时值
L2 指标(撤单比率、DDX 等)的瞬时值波动很大,可能 1 分钟内从 30% 跳到 70% 再跳回 40%。一定要用滑动窗口(我用的是 5 分钟滑动平均)做平滑。
坑 2:十档盘口的"挂单"不是真实买盘
十档盘口的挂单随时会被撤掉,瞬时挂单和真实买盘是两回事。我后来用"近 5 分钟平均挂单"代替"瞬时挂单",信号稳定性大幅提升。
坑 3:tick 数据要做时间戳对齐
不同数据源给的 tick 时间戳格式可能不一样(有的精确到毫秒,有的精确到微秒),做跨数据源对比时一定要做时间戳对齐。我用 pandas 的 pd.to_datetime 统一转成 datetime64[ns]。
坑 4:特征阈值不能写死
我最初把"主力净流入比率 > 5%“写成了硬阈值,结果在不同市况下(牛市/熊市/震荡市)效果差异很大。后来改成"近 20 个交易日的滚动分位数”,超过 80% 分位数才算"强势吸筹"。
六、性能优化
整套系统在本地跑,单只票从拉数据到出信号大概 200-300 毫秒。5000 只票全市场批量跑大概 30 秒。瓶颈在 L2 指标接口的并发能力,把并发数从 20 调到 50 之后快了 3 倍,但 CPU 占用也上去了。
如果要做实时监控,建议用"增量拉取"——每分钟只拉最新 1 分钟的 tick 和 L2 指标,而不是重新拉全量数据。增量拉取的单次响应时间可以压到 50 毫秒以内。
七、最后说几句
这套系统上线之后,最大的变化不是"赚了多少",是"心里踏实了"。以前看盘软件上的 K 线只能告诉你"发生了什么",这套系统能告诉你"为什么发生"和"接下来可能发生什么"。
主力意图识别这件事,没有银弹,特征和阈值都要根据你自己的回测结果调。但只要你能拿到逐笔成交、十档盘口、L2 指标这 3 类数据,剩下的就是工程实现的问题。
参考接口:
- 逐笔成交:
time/real/trace/onebyone/{dm},字段 cjsj/cjjg/cjl/jyzd - 十档盘口:
time/real/trace/level10/{dm} - L2 指标:
time/real/trace/l2sign/{dm},字段 ddx/ddy/ddz/撤单比率 - 实时行情:
time/real/{dm} - 历史 K 线:
time/history/trade/{dm}/{level}
更多推荐



所有评论(0)