3、Level2行情:十档行情与逐笔成交数据的解析

做量化交易的朋友都知道,行情数据就是我们的眼睛。但很多人用的都是Level1行情,也就是我们常说的「快照行情」。说实话,那个东西太粗糙了。你看到的只是某一瞬间的盘口,中间发生了什么,你完全不知道。

Level2行情就不一样了。它给你的是「十档行情」和「逐笔成交」两个核心数据。我个人习惯把Level2比作手术刀——它能切开市场表面,看到里面的血流和脉动。今天我们就来好好聊聊这两块内容。

十档行情:不只是多看了几档

很多人以为十档行情就是比五档多看了五档。嗯,这个理解太表面了。

十档行情的核心价值在于:你能看到订单簿的深度和厚度。五档行情只能看到最表面的5个价位,而十档行情能让你看到更远的挂单情况。这在判断支撑位和阻力位时特别有用。

关键点:十档行情不仅仅是数量上的增加,更是质量上的飞跃。它能帮你识别「虚假挂单」和「真实意图」。

举个例子。我在项目中遇到过一只股票,五档买盘看起来很强,全是几百手的买单。但打开十档一看,从第6档到第10档全是几千手的卖单压着。这就是典型的「表面繁荣,暗藏杀机」。如果你只看五档,很容易被误导。

逐笔成交:市场的「心电图」

逐笔成交数据,说白了就是每一笔真实成交的记录。它告诉你:什么时间、什么价格、成交了多少股、是主动买还是主动卖。

这个数据有多重要?我跟你讲,逐笔成交是判断资金流向的最直接证据。为什么?因为它是「成交」的,不是「挂单」的。挂单可以撤,成交是实打实的。

字段 含义 我的用法
成交时间 精确到毫秒 判断交易节奏
成交价格 实际成交价 识别价格突变
成交量 股数 判断大单小单
买卖方向 主动买/主动卖 判断资金意图

你想想看,如果一只股票突然出现连续的大单主动买入,但价格却没怎么涨。这说明什么?说明有人在「吃货」,但又不想把价格拉得太高。这种信号,只有逐笔成交能告诉你。

如何用Python解析Level2数据

好了,理论说完了,我们来点实际的。下面是我自己写的一个解析Level2数据的代码片段。注意,不同交易所的数据格式略有不同,但核心逻辑是一样的。

import pandas as pd
import numpy as np

# 解析十档行情
def parse_level2_orderbook(data):
    """
    解析Level2十档行情数据
    data: 原始数据,假设是dict格式
    """
    bids = []  # 买单
    asks = []  # 卖单
    
    # 遍历十档
    for i in range(1, 11):
        bid_price = data.get(f'bid_price_{i}')
        bid_volume = data.get(f'bid_volume_{i}')
        ask_price = data.get(f'ask_price_{i}')
        ask_volume = data.get(f'ask_volume_{i}')
        
        if bid_price and bid_volume:
            bids.append([bid_price, bid_volume])
        if ask_price and ask_volume:
            asks.append([ask_price, ask_volume])
    
    return pd.DataFrame(bids, columns=['price', 'volume']), \
           pd.DataFrame(asks, columns=['price', 'volume'])

# 解析逐笔成交
def parse_tick_trade(tick_data):
    """
    解析逐笔成交数据
    """
    trades = []
    for tick in tick_data:
        trade = {
            'time': tick['timestamp'],
            'price': tick['price'],
            'volume': tick['volume'],
            'direction': tick['direction']  # 'B' 主动买, 'S' 主动卖
        }
        trades.append(trade)
    
    df = pd.DataFrame(trades)
    # 计算累计买卖量差
    df['net_volume'] = np.where(df['direction'] == 'B', 
                                df['volume'], 
                                -df['volume'])
    df['cum_net'] = df['net_volume'].cumsum()
    
    return df

我的小技巧:解析逐笔成交时,我习惯把「主动买」记为正数,「主动卖」记为负数。这样累计求和就能得到「净买入量」。这个指标比单纯的成交量更有参考价值。

实战:从逐笔成交中捕捉「大单信号」

我曾经用这个逻辑抓到过一只股票的异动。当时逐笔成交数据显示,连续5分钟内出现了3笔超过1000手的主动买单,但价格只涨了0.5%。这明显是机构在「隐蔽建仓」。

怎么用代码实现这个检测?看下面:

def detect_large_orders(tick_df, volume_threshold=1000, time_window=5):
    """
    检测大单信号
    volume_threshold: 大单阈值(股数)
    time_window: 时间窗口(分钟)
    """
    # 筛选大单
    large_orders = tick_df[tick_df['volume'] >= volume_threshold]
    
    # 按时间窗口分组统计
    large_orders['time_group'] = large_orders['time'].dt.floor(f'{time_window}min')
    stats = large_orders.groupby('time_group').agg(
        count=('volume', 'count'),
        total_volume=('volume', 'sum'),
        avg_price=('price', 'mean')
    ).reset_index()
    
    # 标记异常信号
    stats['signal'] = np.where(
        (stats['count'] >= 3) & (stats['total_volume'] > 5000),
        '异常大单密集',
        '正常'
    )
    
    return stats[stats['signal'] == '异常大单密集']

避坑指南:我曾经犯过一个错误——只看大单数量,没看价格变化。结果发现有些「大单」其实是拆单交易,对价格没影响。后来我加了一个条件:大单出现时,价格必须有0.3%以上的波动。这样过滤掉了很多假信号。

十档行情与逐笔成交的联动分析

单独看十档行情或逐笔成交,都有局限性。真正厉害的是把两者结合起来看。

我举个例子。假设十档行情显示买一价位有5000手挂单,但逐笔成交显示最近10笔都是主动卖单。这说明什么?说明有人在买一位置「托单」,但实际在出货。这种「挂单掩护出货」的手法,在A股市场很常见。

怎么用代码实现联动分析?核心思路是:对比挂单变化和成交方向

def orderbook_tick_analysis(orderbook_df, tick_df):
    """
    十档行情与逐笔成交联动分析
    """
    # 计算最近1分钟的买卖压力
    recent_ticks = tick_df[tick_df['time'] >= pd.Timestamp.now() - pd.Timedelta(minutes=1)]
    
    buy_pressure = recent_ticks[recent_ticks['direction'] == 'B']['volume'].sum()
    sell_pressure = recent_ticks[recent_ticks['direction'] == 'S']['volume'].sum()
    
    # 获取当前买一挂单量
    bid1_volume = orderbook_df['bids'].iloc[0]['volume']
    
    # 判断是否异常
    if bid1_volume > 3000 and sell_pressure > buy_pressure * 2:
        return '⚠️ 疑似托单出货'
    elif bid1_volume < 500 and buy_pressure > sell_pressure * 2:
        return '⚠️ 疑似拉升前吸筹'
    else:
        return '正常'

核心逻辑:挂单是「静态的意图」,成交是「动态的行动」。两者背离时,往往意味着市场在说谎。

数据频率与存储策略

Level2数据量很大。逐笔成交数据,一只股票一天可能产生几万条记录。十档行情每3秒更新一次,一天也有几千条。如果你同时监控几百只股票,数据量是惊人的。

我个人建议的存储策略:

  • 逐笔成交:只保留最近7天的原始数据,更早的压缩成分钟级统计
  • 十档行情:保留最近30天的原始数据,用于回测
  • 衍生指标:比如买卖压力比、大单频率等,永久保存

为什么会这样?因为原始数据太占空间了。但衍生指标是提炼过的信息,体积小、价值高。

小结

Level2行情是量化交易的「核武器」。十档行情让你看到市场的「骨架」,逐笔成交让你看到市场的「血液」。两者结合,你就能判断市场的真实意图。

记住一句话:挂单可以骗人,成交不会。 这是我在多年实战中总结出来的铁律。

最后提醒:不同券商的Level2数据格式可能不同。接入前一定要先看接口文档,或者先用模拟数据测试。我曾经因为数据格式解析错误,导致策略跑了一个月才发现问题...嗯,那滋味不好受。

Level2行情解析知识体系 Level2行情 十档行情 订单簿深度 虚假挂单识别 逐笔成交 资金流向判断 大单信号检测 联动分析:挂单 vs 成交 托单出货识别 拉升前吸筹识别

专注资料整理