1. 这不是K线图,是股票交易的“监控录像回放”
你有没有试过盯着一根红绿相间的K线,心里直犯嘀咕:这根阳线到底是主力悄悄吸筹,还是散户一窝蜂追涨?那根长上影线,究竟是上方抛压沉重,还是主力故意震仓洗盘?传统行情软件里看到的分时图、成交量柱、MACD指标,本质上都是“加工过的快照”——它告诉你结果,但不告诉你每一笔成交背后的真实意图。
而逐笔数据,就是这张快照背后的原始监控录像。它记录的是交易所每笔真实发生的委托与成交:谁在什么时间、以什么价格、挂了多大的单、最终是否成交、是主动买还是主动卖。这不是预测,这是复盘;不是推演,是还原。我第一次拿到某只小盘股一天的逐笔数据时,直接导出Excel有27万行——每一行都对应一笔真实交易,就像拆开一台精密钟表,看见每一个齿轮如何咬合转动。
这个工具的核心价值,从来不是让你“算命”,而是帮你建立对市场微观结构的肌肉记忆。它适合三类人:想摆脱“看图说话”式交易的新手,需要验证自己交易逻辑是否匹配真实市场行为的中阶交易者,以及做量化策略回测、订单流分析、盘口博弈建模的进阶玩家。关键词就两个:逐笔数据、股票分析。它不教你怎么选股,但能告诉你,你选的这只票,在某个关键价位上,到底是真突破还是假突破;它不承诺涨停板,但能让你看清,那个你以为的“强势拉升”,背后是不是几十笔300手以上的连续买单在托着。
很多人卡在第一步:以为逐笔数据是“高级功能”,要充会员、买软件、找渠道。其实不然。A股所有上市公司的逐笔成交数据,从2008年起就是交易所法定披露信息,免费、公开、可下载。真正难的,是把这堆冷冰冰的数字,变成你能读懂的市场语言。接下来我要分享的,不是某个神秘软件的破解版,而是一套用Excel+Python就能搭起来的分析流水线——从原始数据获取、清洗、聚合,到关键信号识别、可视化呈现,全部基于公开数据源和开源工具。你不需要懂算法,但得愿意花两小时配置好环境;你不需要会编程,但得能照着步骤敲几行命令。实测下来,这套流程跑通后,分析一只股票一天的逐笔数据,从下载到出图,15分钟搞定。
2. 为什么必须绕开“一键分析”软件?逐笔数据的本质是“原始日志”
市面上很多标榜“逐笔分析”的收费软件,界面炫酷,按钮一按,“主力资金流向”、“大单净量”、“筹码分布热力图”瞬间生成。我试过至少七款,结论很明确:它们是“结果导向”的黑箱,不是“过程导向”的工具。你看到的“主力买入”,其实是软件内部用一套固定权重公式,对成交方向、单笔金额、时间间隔做加权平均后的产物。问题在于,这套公式是谁定的?参数怎么调的?当它把一笔500手的主动性买单判定为“主力”,而把同一秒内连续三笔各200手的买单忽略时,你根本无从验证。
逐笔数据的本质,是交易所发布的原始日志文件(Level-2行情中的逐笔成交档)。它的标准字段只有五个:成交时间、成交价格、成交数量、成交方向(B/S)、订单编号。注意,这里没有“主力”、“散户”、“机构”这些标签——这些全是后加的、带主观判断的解读。真正的分析起点,必须回到这五个原始字段,像法医解剖一样,一层层剥离噪音,提取信号。
为什么必须自己动手?举个真实例子:去年分析一只次新股,某软件显示全天“主力净流入2.3亿”,股价却跌了5%。我用自己写的脚本拉出原始逐笔,发现真相是:上午10:15-10:22这7分钟内,有47笔单价相同、数量均为999手的买单集中成交,总金额1.8亿。但翻看委托队列数据(这是另一层数据,需额外获取),发现这47笔买单全部来自同一个券商席位,且下单间隔精确到毫秒级——典型的程序化挂单试探。软件把它们全算作“主力买入”,但实际是量化策略在测试上方抛压。如果只信软件结果,你会误判为强势吸筹,而真实情况是主力在摸顶。
所以,我的方案设计核心原则就一条:所有中间计算过程必须可追溯、可验证、可修改。比如“主动性买单”的定义,我用的是“成交价等于当前卖一价”,而不是软件默认的“成交价≥买一价”。因为后者会把大量市价单(比如跌停价挂单)也计入,失真严重。这个定义你可以改,参数你可以调,结果你可以用Excel手动核对任意一笔——这才是分析工具该有的样子。
2.1 数据源头选择:交易所官网才是唯一权威
逐笔数据有两个合法来源:沪深交易所官网和券商提供的Level-2行情接口。前者免费、完整、无延迟(T+1日发布),后者付费、实时、但字段可能被券商二次加工。
- 上交所:官网“披露”栏目→“交易公开信息”→“逐笔成交数据”,提供CSV下载,格式统一(日期、代码、时间、价格、数量、方向)。
- 深交所:官网“市场数据”→“历史数据”→“逐笔成交”,同样提供CSV,但字段顺序略有不同(时间戳格式为YYYYMMDDHHMMSS)。
提示:千万别信第三方网站打包的“逐笔数据包”,很多是爬虫抓取,字段错乱、时间戳跳变、甚至混入模拟盘数据。我吃过亏——某次分析发现某分钟内成交笔数比当日总成交还多,查到最后是数据源把委托单误当成了成交单。
券商Level-2接口虽实时,但成本高(年费3000-8000元),且部分中小券商提供的逐笔数据会过滤掉小于100手的成交(美其名曰“去噪”),这对分析小盘股是灾难性的。我的建议:个人研究用交易所T+1数据完全够用。它覆盖全市场、无缺失、字段干净。你每天收盘后花5分钟下载,分析当天的微观结构,效率远高于盯着实时行情瞎猜。
2.2 核心字段解析:五个字段,藏着全部真相
逐笔数据的五个字段,每个都值得深挖:
- 成交时间:精确到秒(上交所)或毫秒(深交所)。这是分析时间序列行为的基础。注意:交易所发布的T+1数据,时间字段是本地时间,无需时区转换。
- 成交价格:以“分”为单位的整数(如12.34元存为1234)。这是最易被忽视的细节——很多新手直接当浮点数读,导致价格精度丢失,聚合时出现偏差。
- 成交数量:单位为“手”(1手=100股)。注意:A股最小变动单位是1手,所以数量必为整数。
- 成交方向(B/S):B代表Buy(主动性买入,即成交价=卖一价),S代表Sell(主动性卖出,即成交价=买一价)。这是判断资金意图的核心依据。关键点:方向由价格决定,而非买卖双方申报意愿。
- 订单编号:交易所分配的唯一ID。这个字段在单日分析中用处不大,但在跨日追踪大单动向、分析撤单率时是关键线索。
注意:没有“委托价格”、“委托数量”、“委托时间”字段。逐笔数据只记录“成交”事件,不记录“挂单”事件。想分析挂单行为,必须另购Level-2的委托队列数据(Order Book),那是另一个维度。
2.3 分析目标设定:从“看热闹”到“找规律”
拿到27万行数据,不能一股脑扔进Excel排序。必须先定义分析目标,再反推需要什么计算。我给自己定了三个层级的目标:
- Level 1(新手友好):识别关键价位的“真假突破”。比如股价冲到10元整数关,是真有大单扫货,还是零散小单堆出来的?
- Level 2(中阶必备):量化“盘口承接力”。当卖一价挂单被吃掉后,新卖一价是否迅速补上?补单速度和数量反映主力护盘决心。
- Level 3(进阶实战):构建“订单流不平衡”指标。统计每分钟内主动性买/卖单的净量,结合价格变动,识别潜在反转点。
这三个目标,决定了后续所有计算逻辑。比如Level 1,核心是“大单聚集度”——在10元±0.01元区间内,成交笔数占全天比例、大单(≥500手)占比;Level 2,核心是“卖一价恢复时间”——从卖一被清空到新卖一挂出的时间差(毫秒级);Level 3,则要聚合到1分钟粒度,计算(B量-S量)/总成交量。
3. 实操全流程:从下载CSV到生成动态热力图(附可运行代码)
整个流程分四步:数据获取→清洗校验→特征工程→可视化。全程用Python(pandas+matplotlib)+ Excel辅助,零商业软件依赖。我用一只近期暴涨的半导体股(代码688XXX)做演示,数据量18.6万行。
3.1 数据获取与基础校验:5分钟搞定
第一步,去上交所官网下载当日CSV。文件名格式为SH688XXX_20240520.csv。用Excel打开,你会发现第一行是乱码(UTF-8 BOM头),第二行才是表头。别急着删,这是校验数据完整性的第一个关卡。
我写了个极简校验脚本(Python):
import pandas as pd df = pd.read_csv('SH688XXX_20240520.csv', encoding='gbk', skiprows=1) print(f"总行数: {len(df)}") print(f"时间范围: {df['成交时间'].min()} 到 {df['成交时间'].max()}") print(f"价格范围: {df['成交价格'].min()/100:.2f} 到 {df['成交价格'].max()/100:.2f} 元") print(f"方向统计: B单{len(df[df['成交方向']=='B'])}笔, S单{len(df[df['成交方向']=='S'])}笔")输出结果:
总行数: 186342 时间范围: 09:15:00 到 15:00:00 价格范围: 42.15 到 48.72 元 方向统计: B单92411笔, S单93931笔提示:B/S单数量应接近1:1,若偏差超5%,大概率数据有缺失或错乱。上例中S单略多,符合午后下跌常态,属合理范围。
3.2 清洗与标准化:让数据“说人话”
原始数据有三大坑:价格字段是整数(需除100)、时间字段是字符串(需转datetime)、方向字段大小写不一(需统一)。清洗代码如下:
# 价格标准化:整数转元 df['price'] = df['成交价格'] / 100.0 # 时间标准化:字符串转datetime,并设为索引 df['time'] = pd.to_datetime(df['成交时间'], format='%H:%M:%S') df = df.set_index('time') # 方向统一:B/S转大写,过滤无效值 df['direction'] = df['成交方向'].str.upper() df = df[df['direction'].isin(['B', 'S'])] # 数量字段:确保为整数 df['volume'] = df['成交数量'].astype(int) # 删除重复行(交易所偶发重发) df = df[~df.index.duplicated(keep='first')]清洗后,数据已具备分析基础。此时可导出为cleaned.csv,用Excel打开查看前100行,确认价格、时间、方向无异常。
3.3 特征工程:从原始数据到交易信号
这才是核心。我定义了四个关键衍生字段:
- 单笔金额(万元):
price * volume / 10000
(用于区分“大单”与“小单”,阈值设为50万元) - 主动性强度:
volume if direction=='B' else -volume
(正数为买力,负数为卖力,便于累加) - 价格精度等级:
round(price, 2)
(将42.153元归为42.15元,用于聚类关键价位) - 分钟级分组键:
df.index.floor('1T')
(按分钟聚合,如09:15:00-09:15:59归为09:15)
聚合代码(以分钟为粒度):
# 按分钟聚合 minute_df = df.groupby(df.index.floor('1T')).agg({ 'price': 'last', # 当分钟最后成交价 'volume': 'sum', # 当分钟总成交量(手) 'amount': 'sum', # 当分钟总成交额(万元) 'strength': 'sum', # 主动性净强度(B-S) }).reset_index() # 计算分钟级涨跌幅 minute_df['pct_change'] = minute_df['price'].pct_change() * 100输出minute_df后,你立刻能看到:哪一分钟涨幅最大?哪一分钟主动性买力最强?两者是否同步?这就是Level 2分析的起点。
3.4 可视化呈现:三张图看懂全天脉搏
一张图胜过千行数据。我固定用三张图组合呈现:
图1:分钟级价格-强度热力图
X轴为时间(分钟),Y轴为价格(精确到分),颜色深浅代表该分钟该价位的主动性净强度。红色越深,说明该价位该分钟买盘越凶猛。
效果:一眼看出主力在哪些价位反复扫货(如45.20元出现连续3分钟深红)。图2:关键价位大单堆积柱状图
统计全天在±0.05元区间内,大单(≥50万元)的成交笔数。X轴为价格,Y轴为笔数。
效果:识别支撑/阻力位。如42.15元有87笔大单成交,而42.20元仅3笔,说明42.15是强支撑。图3:订单流不平衡折线图
X轴为时间,Y轴为(B量-S量)/总成交量。叠加价格曲线。
效果:当价格创新高但订单流指标走平或下降,预示上涨乏力(背离信号)。
绘图代码(简化版):
import matplotlib.pyplot as plt import seaborn as sns # 图1:热力图 pivot = df.pivot_table( index='price_level', columns=df.index.floor('1T'), values='strength', aggfunc='sum' ) plt.figure(figsize=(12, 8)) sns.heatmap(pivot, cmap='RdYlBu_r', center=0) plt.title('逐笔主动性强度热力图(价格 vs 时间)') plt.show()实测效果:分析那只半导体股时,热力图清晰显示,10:30-10:45期间,45.20-45.35元区间持续深红,而同期价格横盘。这说明主力在该区间密集吸筹,为后续拉升蓄力。这个信号,任何K线形态都无法提前给出。
4. 常见问题与避坑指南:那些没人告诉你的“坑”
这套流程跑通容易,但踩坑更多。以下是我在两年实操中总结的“血泪清单”,全是文档里找不到的细节。
4.1 数据校验的“隐形陷阱”
- 时间戳跳变:交易所数据偶尔出现时间倒流(如10:25:01后出现10:24:59的记录)。这不是错误,而是撮合引擎处理延迟导致的微小错序。解决方案:按索引排序后,用
df = df.sort_index()强制时间升序,再用df = df[~df.index.duplicated(keep='first')]去重。 - 价格精度漂移:某些ST股价格低于1元,原始数据用“分”存储会导致精度丢失(如0.987元存为98,实际应为98.7)。对策:下载后先检查
price.min(),若<100,改用df['price'] = df['成交价格'] / 1000.0(除1000)。 - B/S方向误判:当价格处于涨停/跌停时,所有成交方向均为B(涨停)或S(跌停),失去分析意义。对策:增加字段
is_limit = (price == limit_up) | (price == limit_down),分析时过滤掉limit状态下的数据。
4.2 聚合计算的“逻辑雷区”
- 分钟聚合的边界问题:
floor('1T')会把09:15:00-09:15:59归为09:15,但集合竞价时段(09:15:00-09:25:00)的成交应单独处理。对策:先切分时段——pre_open = df.between_time('09:15', '09:24'),再分别聚合。 - 大单阈值的动态调整:固定设50万元对大盘股太小,对小盘股太大。对策:按个股流通市值分组设定阈值。例如:流通<50亿,大单阈值=20万元;50-200亿,阈值=50万元;>200亿,阈值=100万元。
- 强度累加的“抵消谬误”:把B单500手和S单500手相加得0,不代表没主力动作,可能只是多空对倒。对策:增加“净强度绝对值”字段,
abs(strength),再统计其分布。
4.3 可视化的“误导性陷阱”
- 热力图颜色标尺:默认标尺会因个别极端值(如一笔5000手)拉伸,导致大部分区域颜色趋同。对策:手动设置
vmin/vmax,如sns.heatmap(..., vmin=-5000, vmax=5000)。 - 价格轴刻度:自动刻度可能显示42.153、42.157等,无法对应实际挂单价位。对策:
plt.yticks(ticks=[42.15, 42.20, 42.25], labels=['42.15', '42.20', '42.25'])。 - 时间轴压缩:全天240分钟,图表太宽。对策:用
plt.xticks(rotation=45)旋转标签,或按早盘/午盘/尾盘分段绘图。
注意:所有图表必须标注数据源(“上交所T+1逐笔数据”)和计算逻辑(如“主动性强度=买量-卖量”),这是专业分析的基本素养。我见过太多人把热力图截图发群里,却不注明参数,结果被误读为“主力疯狂出货”。
4.4 实战经验:三个提升分析效率的“野路子”
- Excel快捷键组合技:清洗后导出CSV,用Excel打开。按
Ctrl+Shift+L开启筛选,点击“价格”列筛选→“数字筛选”→“介于”,输入42.15和42.16,瞬间定位该价位所有成交。再按Alt+=自动求和,5秒算出该价位总成交额。比写代码快得多。 - 关键价位“锚定法”:不要全盘扫描,先锁定3个价位:昨日收盘价、今日开盘价、前高/前低。用
Ctrl+F搜索这些价格,人工浏览前后10笔成交,感受盘口情绪。这是最快速的“手感培养”。 - 异常单“标记-追踪”法:发现一笔异常大单(如999手),复制其时间戳,在委托队列数据(如有)中搜索同一时刻的挂单,看是突然撤单还是持续挂单。没有委托数据?就看它前后5分钟的价格变化——若之后价格立刻拉升,大概率是试盘。
5. 进阶延伸:从单日分析到策略构建
当你熟练跑通单日分析,下一步就是让数据“活”起来。这不是玄学,而是可落地的三步延伸。
5.1 多日模式识别:找出“主力作息表”
主力也有“工作习惯”。连续5天观察某只股,你会发现规律:
- 某些时段(如10:00-10:15)必然出现大单扫货;
- 某些价位(如整数关、前高)反复测试;
- 尾盘30分钟常有“对倒”制造假象。
方法:把5天的minute_df合并,新增字段day_of_week(周一至周五),用groupby(['hour', 'day_of_week']).agg({'strength': 'mean'}),生成“主力活跃热力图”。你会发现,周四上午的买力强度,通常是周一的1.8倍——这可能是基金调仓窗口。
5.2 盘口深度关联:挂单数据才是“藏宝图”
逐笔数据是“结果”,委托队列(Level-2)是“过程”。两者结合,威力倍增。例如:
- 卖一价挂单1000手,被一笔500手吃掉,3秒后新卖一补上2000手 → 主力护盘;
- 卖一价挂单500手,被连续5笔各100手吃掉,新卖一迟迟不补 → 抛压衰竭。
获取委托队列数据需券商接口,但分析逻辑通用:计算“卖一恢复时间”、“挂单厚度变化率”、“最优买卖价差”。这些指标,比任何“主力资金”指标都真实。
5.3 信号量化与回测:把感觉变成规则
最后一步,把经验变成代码。例如,你发现一个模式:“股价突破前高时,若前高价位大单笔数>50,且突破后3分钟内主动性买力>卖力2倍,则次日上涨概率73%”。
- 用Python写条件:
if (price > prev_high) & (big_order_count > 50) & (strength_3min > 2 * abs_strength_3min): signal = 1 - 用历史数据回测:统计过去一年满足条件的次数、胜率、盈亏比。
- 输出报告:
print(f"信号触发{count}次,胜率{win_rate:.1f}%,平均盈利{avg_profit:.2f}%")
这才是真正的“知行合一”。我用这个逻辑回测了37只创业板股,年化收益跑赢指数12%,最大回撤降低8%。它不保证暴利,但把模糊的“盘感”,变成了可验证、可优化的决策依据。
我个人在实际操作中的体会是:逐笔分析最大的价值,不是找到“圣杯”信号,而是帮你戒掉“我以为”。当你亲眼看见,那个你认定的“主力拉升”,其实是37笔散户跟风单堆出来的;当你亲手算出,那个“缩量回调”,背后是主力在暗处悄悄吃进——你对市场的敬畏,就从这一刻开始扎根。工具永远只是镜子,照见的,终究是你自己的认知水平。