构建连续K线,我们这样处理盘前盘后数据的Session分层

用户头像sh_****559rtx
2026-07-07 发布

一、量化需求:干净、连续的K线序列是策略的基石 在量化研究里,我们深知一个看似微不足道的数据瑕疵,可能在回测中引发蝴蝶效应。特别是美股多时段交易结构下,如果直接使用未做session区分的原始K线,盘前跳价和盘后稀疏成交会让趋势策略产生大量假突破信号。因子计算、波动率估计乃至头寸管理全都受影响。我们搭建自己的量化数据管线时,首要明确的需求就是:必须产出逻辑自洽、无虚假断层的连续K线。

二、传统投顾级数据服务的痛点:Session混淆引发的回测陷阱 我们接触过不少从投顾平台导出的现成数据,发现很多vendor提供的盘中K线里,已经悄无声息地混入了盘前/盘后成交量。这在回测中会造成“异常放量日”,导致成交量因子失效、冲击成本模型失准。更隐蔽的是,盘前一个大幅高开如果被计作上一根K线的跳空,就容易在统计套利中被误识别为极端事件。这些痛点都指向同一个根源:底层数据没有做session隔断。

三、数据支撑方案:Tick级Session打标与分区聚合管道 我们选择从tick层开始接管处理,保证每一笔成交的session属性都精确可控。步骤如下:

  1. 毫秒级tick接入:通过AllTick API的实时数据流,订阅个股逐笔成交,保证时间戳精度。
  2. Session标签注入:在本地构建一个微批处理模块,按美东时间规则将每笔tick划分为PreMarketRegularAfterHours,并滤除离群价格。
  3. 分区K线生成:对同一时间粒度,不同session的tick独立聚合成OHLC,输出时保持相同的时间序列索引。强约束——不跨session合并成交量,使每根K线真实反映所在时段的流动性特征。
# 基于WebSocket接入tick,用于量化管线
import websocket
import json

url = "wss://stream.alltick.co/v1/stock/realtime"

def on_message(ws, message):
    data = json.loads(message)
    # 在此加入session标记和聚合逻辑
    print(data)

def on_open(ws):
    sub_msg = {
        "action": "subscribe",
        "channel": "transaction_quote",
        "symbols": ["AAPL"]
    }
    ws.send(json.dumps(sub_msg))

ws = websocket.WebSocketApp(
    url,
    on_message=on_message,
    on_open=on_open
)
ws.run_forever()

这样产出的K线序列,在图表上平滑连续,但每个时间段的市场状态都一目了然,策略因子也因此更稳健。

四、服务升级:把数据管线演进为可扩展的量化服务 我们将这套session分层K线生成器封装为独立的RESTful服务,供回测引擎和实盘信号模块共同调用。后续无论是接入新股、切换频率(分钟到小时),还是增加盘前盘后的独立K线输出,都只需调整参数而无需改动策略代码。这次从“能用数据”到“用对数据”的升级,让我们的量化研发效率上了台阶。f1f78daf8924696bdddd876039c29f0b.jpg

评论