🚀 AI 一键生成 ptrade 策略代码
立即体验

PTrade 高频交易实战:基于 Tick 数据的微观做市策略开发(附 Python 源码)

ptrade | 发布时间: 2026/7/31
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade 高频交易实战:基于 Tick 数据的微观做市策略开发

Question: 如何在 ptrade 中利用 tick_data 和 order_tick 开发一个高频做市策略?

解决方案

PTrade 高频交易实战:基于 Tick 数据的微观做市策略开发

在 PTrade 量化交易平台中,实现 Tick 级别(3秒周期及以上)的高频交易与做市策略,主要依赖于 tick_data 事件回调函数与 order_tick 下单接口。


一、核心接口说明

1. tick_data(context, data)

  • 使用场景:仅在交易模块可用。
  • 运行频率:交易时间内(09:30~14:59)每 3 秒触发一次。
  • 数据结构data[security] 包含 tick(实时行情快照)、order(逐笔委托,需 L2)和 transcation(逐笔成交,需 L2)。

2. order_tick(sid, amount, priceGear='1', limit_price=None)

  • 使用场景:专门用于 tick_data 模块中下达买卖委托。
  • 参数说明
    • sid:标的代码(如 '600570.SS')。
    • amount:交易数量,正数表示买入,负数表示卖出。
    • priceGear:盘口档位,Level-1 支持 1~5(买档)与 -1~-5(卖档);Level-2 支持 1~10-1~-10
    • limit_price:买卖限价。若传入此参数,则优先按指定价格下单。

二、策略思路:微观做市策略

做市策略核心在于通过在买一档与卖一档同时挂单,获取买卖价差(Bid-Ask Spread)。

  1. 获取标的的买一档与卖一档价格。
  2. 若当前盘口存在有效价差,且仓位在安全风险范围内:
    • 按买一档价格挂单买入;
    • 按卖一档价格挂单卖出。
  3. 当仓位到达上限时,停止盲目加仓,转为单向平仓或对冲。

三、完整策略源码

def initialize(context):
    # 设置目标标的
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 仓位控制与标记
    g.max_position = 1000  # 最大持仓限制
    g.trade_unit = 100     # 单笔交易数量

def tick_data(context, data):
    security = g.security
    if security not in data:
        return
        
    tick_info = data[security].get('tick', None)
    if tick_info is None or tick_info.empty:
        return
        
    # 1. 解析盘口买一与卖一档位价格
    # bid_grp / offer_grp 格式: {档位: [价格, 委托量, 委托笔数]}
    bid_grp = eval(tick_info['bid_grp'][0]) if isinstance(tick_info['bid_grp'][0], str) else tick_info['bid_grp'][0]
    offer_grp = eval(tick_info['offer_grp'][0]) if isinstance(tick_info['offer_grp'][0], str) else tick_info['offer_grp'][0]
    
    if 1 not in bid_grp or 1 not in offer_grp:
        return
        
    bid_p1 = bid_grp[1][0]   # 买一价
    offer_p1 = offer_grp[1][0] # 卖一价
    
    # 2. 获取当前持仓
    current_pos = get_position(security).amount
    
    # 3. 双边做市逻辑
    # 条件:买卖一价差大于最小变动单位(存在利差)
    if offer_p1 - bid_p1 >= 0.01:
        # 检查多头仓位上限
        if current_pos < g.max_position:
            # 以买一档挂单买入
            order_tick(security, g.trade_unit, priceGear="1")
            log.info(f"做市挂单买入: {security}, 档位: 买一, 价格: {bid_p1}")
            
        # 检查空头/平仓仓位(有持仓时卖出)
        if current_pos > 0:
            # 以卖一档挂单卖出
            order_tick(security, -g.trade_unit, priceGear="-1")
            log.info(f"做市挂单卖出: {security}, 档位: 卖一, 价格: {offer_p1}")

def handle_data(context, data):
    # tick策略主要逻辑在tick_data中处理
    pass

四、高频交易实战注意事项

  1. 订单撤单管理:挂单后若盘口价格发生变化,应结合 get_open_orders()cancel_order() 及时撤销未成交的挂单,防止追涨杀跌与不必要的深度成交。
  2. 价格精度:对于股票,价格精度通常保留 2 位小数;可转债/ETF 保持 3 位小数。限价下单时务必注意精度转换。
  3. Level-2 行情支持:逐笔委托与逐笔成交数据需要券商开通 Level-2 高级行情权限支持,否则返回 None