
1. 分时数据到底能拿来做什么很多人第一次接触A股分时交易数据脑子里冒出来的第一个念头就是这不就是分时图那根线吗。如果你也这么想那基本等于把一座金矿当成了路边的小石子。分时数据远不止画一条曲线那么简单它记录的是每一分钟甚至更细粒度的成交价、成交量、成交额、买卖盘口变化是一整天交易行为的完整切片。把这些切片拼起来你能看到主力资金的进出节奏、散户情绪的起伏、关键价位的攻防过程这些信息在日K线里是被压缩掉的只有在分时层面才能还原出真实的博弈现场。我自己做量化策略和盘口行为分析有几年了最开始也是从看分时图起步后来慢慢转向用程序批量拉取、清洗、建模。踩过的坑不算少从数据源选型到复权处理从集合竞价的特殊规则到停牌期间的数据空洞每一个细节都能让你辛辛苦苦跑出来的回测结果变成一堆废纸。所以这篇文章我打算把A股分时交易数据这件事从头到尾讲透包括它是什么、怎么获取、怎么清洗、怎么用、有哪些坑必须绕开。不管你是刚入门想做个简单复盘工具的新手还是已经在写策略但总觉得数据不对劲的老手应该都能从里面找到对自己有用的东西。核心关键词就几个分时数据、成交明细、盘口分析、数据清洗、量化回测。这几个词贯穿全文你读完之后至少能做到一件事拿到一份分时数据知道它干不干净、能不能用、该怎么用。2. 分时数据的结构拆解与核心字段2.1 一条分时记录里到底有什么先把这个东西拆开看。A股分时交易数据最基础的形态是逐笔成交和分时快照两种。逐笔成交记录的是每一笔撮合成交的明细包含成交时间精确到秒或毫秒、成交价格、成交手数、买卖方向主动买还是主动卖。分时快照则是按固定时间间隔通常是3秒或1分钟对盘口状态做一次截取包含最新价、均价、成交量、成交额、买卖五档或十档的挂单情况。这两种数据用途完全不同。逐笔成交适合做资金流向分析、大单追踪、主力行为识别分时快照适合做盘中监控、均线计算、量价关系研究。很多人一开始分不清拿快照数据去算主动买卖比结果怎么算都不对因为快照里根本没有逐笔的方向信息。举个实际例子。某只股票在10:03:15这一秒成交了500手价格是12.35元。如果这是逐笔数据你还能知道这笔是主动买入还是主动卖出是拆成10笔50手还是一次性500手。但如果是1分钟快照你只能看到10:03这一分钟总共成交了2000手价格从12.30涨到12.38中间发生了什么完全被抹平了。所以选哪种数据取决于你要回答什么问题。2.2 关键字段的专业含义与常见误读下面这张表是我整理的核心字段对照很多新手就是在这几个字段上栽跟头字段名称常见误读正确理解成交量直接当成股数单位是手1手100股计算时要乘100成交额和成交量线性对应是实际成交金额均价成交额/成交量×100均价当日均价是累计成交额除以累计成交量不是简单平均买卖方向主动买就是看涨只代表这笔成交由买方主动发起不代表后续方向复权价和实时价一样前复权/后复权会改变历史价格分时数据一般用不复权特别说一下均价这个字段。分时图里那条黄线就是均价线它的计算方式是当前累计成交额除以当前累计成交股数。注意是累计不是每分钟单独算。很多人写代码的时候每分钟算一次均价然后连起来画出来的线和行情软件对不上就是因为搞错了累计逻辑。还有买卖方向的判定。交易所本身不直接提供这个字段常见的做法是比较成交价和前一秒的买一卖一中间价成交价高于中间价算主动买低于算主动卖等于的话看前一秒的走势。不同数据源用的算法不一样所以你会发现两个平台给的主动买入量对不上这不是数据错了是判定规则不同。做策略的时候一定要固定用同一个数据源不要混用。2.3 时间粒度选择1分钟、3秒还是逐笔时间粒度直接决定你的存储成本、计算复杂度和策略类型。我按实际使用场景给个建议1分钟粒度适合做日内趋势策略、均线突破、量价背离。数据量适中一天240条左右存储和计算压力小。缺点是看不到盘中的瞬时波动大单拆单行为完全被平滑掉。3秒快照适合做盘口监控、高频信号触发、买卖压力分析。一天约4800条数据量是1分钟的20倍但能捕捉到更细的挂单变化。逐笔成交适合做资金流分析、主力追踪、订单簿重建。数据量最大活跃股一天几十万笔很正常对存储和计算要求高但信息最完整。我个人的经验是如果你刚开始做先从1分钟粒度入手把数据管道跑通再逐步往更细的粒度扩展。一上来就搞逐笔很容易在数据清洗阶段就卡死。3. 数据获取的几条路和选型逻辑3.1 公开数据接口的可用性与限制获取A股分时数据绕不开几个主流渠道。第一个是行情软件自带的导出功能比如很多看盘软件支持把分时数据导出成CSV。这条路适合小批量、手工复盘但你要做批量分析或者回测手工导出根本不现实一天导几十只股票就能把你累趴下。第二个是开源数据接口。市面上有一些公开的Python库可以拉取分时数据底层调用的多是公开行情接口。这类接口的优点是免费、上手快缺点是稳定性看运气高峰期经常超时而且历史分时数据通常只保留最近几天到几个月想拉一年前的分时基本没戏。第三个是商业数据服务。付费的数据服务商提供更完整的历史分时、更稳定的接口、更规范的字段定义。成本从几千到几万一年不等适合认真做策略或者做产品的人。选型的时候重点看三件事历史数据回溯多久、接口调用频率限制、字段定义是否清晰。提示不管用哪个渠道拿到数据的第一件事是做交叉验证。用同一只股票同一天的数据和你行情软件上看到的收盘价、成交量对一遍对不上就说明数据有问题后面所有分析都是白做。3.2 自建数据管道的架构思路如果你打算长期做这件事我建议自建一条数据管道而不是每次现拉现用。基本架构分四层采集层负责从数据源拉取原始数据做好失败重试和限流控制。清洗层处理停牌、集合竞价、异常值、字段缺失等问题。存储层按股票代码和日期分区存储推荐Parquet格式压缩率高、读取快。服务层对外提供查询接口支持按股票、按日期、按时间范围检索。这套架构听起来复杂但实际搭起来一两天就能跑通。关键是采集层要做好幂等同一只股票同一天的数据重复拉取不会产生重复记录。我见过太多人在这上面翻车跑了一个月发现数据库里全是重复数据清理起来比重跑还麻烦。3.3 存储格式与分区策略的实际取舍存储这块我踩过最大的坑就是一开始用CSV存分时数据。一只股票一天1分钟数据240条一年250个交易日就是6万条全市场5000只股票就是3亿条。CSV存下来几十个G查询的时候全表扫描一个简单查询要等好几分钟。后来换成Parquet按日期分区同样的数据量压缩到几个G查询速度提升了几十倍。分区策略我建议按日期/股票代码两级分区因为大部分查询都是某天某只股票或者某只股票某段时间这个分区方式能最大化利用分区裁剪。存储方案3亿条数据占用单日单股查询耗时适用场景CSV约40-60GB秒级到分钟级小批量临时分析SQLite约20-30GB百毫秒级单机小规模Parquet分区约3-8GB十毫秒级批量回测、长期存储时序数据库约5-10GB毫秒级实时监控、高频查询这个表里的数字是我自己实测的粗略值具体会因数据粒度和股票活跃度有差异但量级关系是靠谱的。4. 数据清洗中最容易翻车的几个环节4.1 集合竞价的特殊处理A股每个交易日的9:15到9:25是集合竞价时段这段时间的成交规则和连续竞价完全不同。9:15到9:20可以撤单9:20到9:25不能撤单9:25产生开盘价。很多数据源会把这段时间的数据混在正常分时里如果你不处理算出来的开盘前成交量会莫名其妙多出一大截。我的做法是把集合竞价数据单独标记出来在策略里要么排除要么单独建模。开盘价本身是集合竞价的结果这个要保留但集合竞价期间的逐笔委托和撤单数据除非你做专门的打板策略否则建议直接过滤掉。还有一个细节9:25到9:30这段时间交易所不接受连续竞价申报但很多数据源会填充一些占位数据。如果你看到9:26、9:27有成交记录那基本可以确定是数据源的问题要清洗掉。4.2 停牌、涨跌停与异常值识别停牌期间数据源的处理方式五花八门。有的直接不返回记录有的返回价格不变但成交量为零的记录有的甚至返回上一交易日的残留数据。你不处理的话算出来的日均成交量会被停牌日拉低均线也会出现莫名其妙的平直线。涨跌停的处理更微妙。涨停板上的成交主动买入和主动卖出的判定会失真因为买一挂单巨大成交价等于买一价按中间价规则算出来全是主动买。但实际上涨停板上的成交很多是卖方在出货。所以做资金流分析的时候涨跌停日的主动买卖数据要特别小心最好单独标注。异常值识别我一般用三个规则价格超出当日涨跌停范围的直接丢弃成交量超过该股历史99分位数的标记为可疑时间戳不在交易时段内的直接过滤。这三条规则能干掉绝大部分脏数据。4.3 复权处理对分时数据的影响这是个容易被忽略但影响巨大的问题。日K线做回测通常要用前复权价格但分时数据如果也做前复权会出现一个尴尬的情况除权日当天的分时价格会被调整导致和当天实际成交价对不上。比如某只股票10送10除权后价格腰斩前复权会把除权前的分时价格也砍半但你当天看到的实际成交价并不是那个数。我的建议是分时数据保持不复权在策略层面需要复权的时候再单独处理。具体做法是维护一张复权因子表回测时用不复权分时数据配合复权因子计算收益率这样既保留了分时数据的真实性又能正确处理除权除息。注意如果你用前复权分时数据去算盘中均价算出来的结果和行情软件显示的均价会对不上因为行情软件的均价是用实际成交价算的。这个坑我见过至少三个人踩过排查半天以为是数据源问题其实是复权搞的鬼。5. 从分时数据到策略信号的实操路径5.1 量价关系的基础计算拿到干净的分时数据之后第一步通常是算一些基础指标。最核心的是分时均价和量比。分时均价前面说过了累计成交额除以累计成交股数。这个指标的意义在于价格在均价上方运行说明当天买方占优下方运行说明卖方占优。很多日内策略就是用价格和均价的关系来做进出场判断。量比的计算稍微复杂一点当前每分钟平均成交量除以过去5个交易日同一时段的平均成交量。这个指标能告诉你今天的交易活跃度是正常还是异常。量比大于2通常意味着有资金在关注大于5就是明显异动。# 分时均价与量比计算示例 import pandas as pd def calc_vwap_and_vol_ratio(df, hist_df): # 分时均价累计成交额 / 累计成交量 df[cum_amount] df[amount].cumsum() df[cum_volume] df[volume].cumsum() df[vwap] df[cum_amount] / (df[cum_volume] * 100) # 量比当前分钟均量 / 过去5日同时段均量 df[minute] pd.to_datetime(df[time]).dt.strftime(%H:%M) hist_avg hist_df.groupby(minute)[volume].mean() df[vol_ratio] df[volume] / df[minute].map(hist_avg) return df这段代码看起来简单但有几个细节要注意。cum_volume乘100是因为成交量单位是手要转成股才能和成交额对应。量比计算里历史数据的时段要对齐不能拿今天的9:30去比历史某天的14:00。5.2 大单追踪与资金流向判断逐笔数据最大的价值就是能识别大单。什么叫大单没有绝对标准我一般用两个维度单笔成交金额超过50万或者单笔成交量超过该股当日平均单笔成交量的5倍。满足任一条件就标记为大单。大单的方向比大小更重要。一笔100万的主动买入和一笔100万的主动卖出含义完全相反。把大单按方向分类累计就能得到当天的资金流向。如果主动买入大单持续大于主动卖出大单说明有资金在吸筹反过来就是出货。但这里有个陷阱拆单。主力资金不会傻到一次性挂1000手通常会拆成几十笔小单慢慢成交。所以单纯看单笔大小会漏掉很多真实的大资金行为。我的做法是结合时间窗口比如统计30秒内同一价位的累计成交量超过阈值就算作一笔合成大单。这个方法能捕捉到大部分拆单行为但也会引入一些噪音需要根据具体股票的流动性调整阈值。5.3 盘口失衡与短期价格预测盘口失衡是另一个高频策略常用的信号。简单说就是买一到买五的挂单总量和卖一到卖五的挂单总量之比。如果买盘远大于卖盘说明买方力量强短期价格有上行压力反之亦然。但这个指标有个致命缺陷挂单可以撤。你看到买一挂了5000手可能下一秒就撤了这是典型的虚假挂单。所以单纯看盘口挂单量容易被骗。更靠谱的做法是结合撤单率和成交率如果某个价位的挂单大量撤单但成交很少基本可以判定是虚假挂单如果挂单被持续吃掉那就是真实买盘。我实测下来盘口失衡指标在流动性好的大盘股上效果一般因为参与者太多单个主力的挂单影响被稀释。反而是在中小盘股上盘口失衡的预测能力更强但相应的操纵风险也更高。用这个信号一定要配合风控不能单靠它做决策。6. 常见问题排查与避坑经验6.1 数据对不上的排查思路数据对不上是最常见的问题我整理了一个排查顺序按这个顺序走基本能定位到原因排查步骤检查内容常见原因1对比收盘价和成交量数据源本身有误2检查复权设置前复权导致价格偏移3检查时间戳时区UTC和北京时间混淆4检查集合竞价是否混入开盘前数据污染5检查停牌日处理停牌日数据残留6检查单位换算手和股混淆这个顺序是从最可能到最不可能排的。实际排查中复权问题和单位换算问题占了八成以上。我印象最深的一次是帮人看一个策略回测收益率高得离谱查了半天发现他把成交量单位当成股了实际买入量只有他以为的百分之一滑点影响被严重低估。6.2 回测中的分时数据陷阱用分时数据做回测有几个陷阱必须提前知道。第一个是未来函数。分时数据是按时间顺序产生的但如果你在计算指标的时候用了未来数据回测结果就会虚高。比如你用当天最高价来判断是否触发买入但最高价是收盘后才知道的盘中你根本不知道。正确的做法是用当前时刻之前的数据计算信号用下一时刻的价格成交。第二个是滑点低估。分时数据里的成交价是实际成交价但你的策略单子不一定能在这个价格成交。特别是流动性差的股票你的买单可能要把卖一到卖五全部吃掉才能成交实际成本比盘口价高不少。回测的时候至少要加千分之一到千分之三的滑点具体看股票流动性。第三个是成交量约束。你的策略信号说买入10000手但那只股票那一分钟总共才成交500手你的单子根本成交不了。回测时必须加成交量约束比如单笔委托不超过该分钟成交量的10%。6.3 实盘与回测的偏差来源回测跑得再好实盘一上就亏这是量化交易的经典难题。分时策略的偏差来源主要有三个延迟从信号产生到订单到达交易所中间有网络延迟、系统处理延迟。高频策略里几十毫秒的延迟就能让信号失效。冲击成本你的订单本身会影响市场价格。回测里假设你的订单不影响价格实盘里大单会把价格推上去。数据质量实盘拿到的实时数据和回测用的历史数据可能有细微差异比如买卖方向的判定规则不同。我的经验是回测收益率至少要打七折再拿去实盘而且要先小资金跑一段时间对比实盘成交和回测成交的差异确认偏差在可接受范围内再放大资金。提示分时策略的容量通常比日线策略小很多。日线策略可能能容纳几千万资金分时策略可能几百万就到头了。资金量大的话分时信号只能作为辅助不能作为主策略。7. 一些个人实操体会做分时数据这件事技术门槛其实不高难的是细节。数据源选型、清洗规则、复权处理、回测约束每一个环节都有坑而且这些坑往往不会立刻暴露等你跑了几个月才发现数据有问题前面的工作全白费。我现在养成的习惯是每接入一个新数据源先拿三只不同流动性的股票大盘股、中盘股、小盘股各一只做一周的数据验证对比行情软件、对比不同数据源、对比日线汇总数据三个维度都对上了才正式使用。这个验证流程花不了多少时间但能省掉后面无数的麻烦。另外就是不要迷信复杂策略。分时数据能做的事情很多但真正稳定赚钱的信号往往很简单比如均价突破、量比异动、大单持续流入这些基础信号配合严格的风控效果比堆一堆花哨指标要好。我见过太多人把分时数据搞成几百个因子的机器学习模型回测漂亮得不行实盘一塌糊涂最后发现是过拟合。最后分享一个小技巧分时数据的时间戳一定要统一时区而且要在数据管道的最前端就处理好。我吃过这个亏不同数据源有的用UTC有的用北京时间混在一起之后时间轴全乱了排查了两天才找到原因。现在我的做法是入库前统一转成北京时间并且加一个字段记录原始时区方便追溯。这个习惯看起来多余但真出问题的时候能救命。