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

PTrade `order_market` 函数指南:如何选择最优的 `market_type`?

ptrade | 发布时间: 2025/12/18
以下内容由 EasyQuant 生成。

问题描述

使用市价单交易时,'对手方最优价格'和'本方最优价格'这些选项具体有什么不同,应该在什么情况下使用?

解决方案

在PTrade量化交易平台中,使用 order_market 函数进行市价委托时,market_type 参数决定了具体的市价单类型。

“对手方最优价格” (market_type=0)“本方最优价格” (market_type=2) 是两种截然不同的报价策略,主要区别在于成交的紧迫性成交价格的优劣

以下是详细的对比分析、使用场景建议及代码示例。

1. 核心区别对比

特性 对手方最优价格 (Type 0) 本方最优价格 (Type 2)
报价逻辑 吃单 (Taker) 挂单 (Maker)
买入时价格 以当前的 卖一价 (Ask 1) 申报 以当前的 买一价 (Bid 1) 申报
卖出时价格 以当前的 买一价 (Bid 1) 申报 以当前的 卖一价 (Ask 1) 申报
成交速度 极快。通常能立即成交(只要对手盘有量)。 较慢。需要等待对手盘主动来“吃”你的单子。
成交概率 高。 低。如果行情向不利方向快速移动,可能无法成交。
交易成本 较高。需要支付买卖价差(Spread)。 较低。可以赚取或节省买卖价差。
未成交部分 通常转为该价格的限价单。 转为该价格的限价单,在队列中排队。

2. 详细原理解析

对手方最优价格 (Opponent Best Price)

  • 原理:你想买入时,直接用市场上当前愿意卖出的最低价格(卖一)去买;你想卖出时,直接用市场上当前愿意买入的最高价格(买一)去卖。
  • 结果:这是一种主动成交的行为。你的订单会跨越买卖价差,直接与对手盘撮合。
  • 注意:如果你的下单量大于对手盘第一档的挂单量,剩余部分通常会以该成交价转为限价单挂在盘口上(具体规则视交易所而定)。

本方最优价格 (Own Best Price)

  • 原理:你想买入时,加入到当前的买方队伍中,挂在买一价上;你想卖出时,加入到当前的卖方队伍中,挂在卖一价上。
  • 结果:这是一种被动等待的行为。你的订单不会立即成交,而是排在当前最优价的队列末尾,等待其他人以对手价来成交你的订单。
  • 注意:如果市场趋势正在迅速远离你的价格(例如你想买,但价格一直在涨),你的“本方最优”单子可能永远无法成交,从而导致踏空。

3. 使用场景建议

何时使用“对手方最优价格” (Type 0)?

  1. 急需成交:当策略发出强烈的买入或卖出信号,且时间敏感度高(如追涨杀跌、突破策略)。
  2. 止损平仓:必须立即离场以控制风险时。
  3. 流动性充足:在盘口挂单量充足的大盘股中,支付一点价差以换取确定性是值得的。
  4. 打板策略:在涨停板打开瞬间抢入,或者在跌停板打开瞬间出逃。

何时使用“本方最优价格” (Type 2)?

  1. 降低滑点成本:高频交易或对交易成本极度敏感的策略,希望通过挂单来节省买卖价差(Spread)。
  2. 流动性提供:做市商策略(Market Making),通过双向挂单赚取价差。
  3. 震荡行情:在价格波动不大,且不急于立即成交,愿意用时间换取更好价格的场景。
  4. 大额拆单:为了避免大单直接吃掉流动性导致价格剧烈波动,选择挂在买一/卖一位置慢慢成交。

4. PTrade 代码实现示例

以下代码展示了如何在 handle_data 或交易函数中调用这两种市价单。

def initialize(context):
    # 设置股票池,以恒生电子为例
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 获取当前持仓
    position = get_position(g.security)
    
    # ---------------------------------------------------
    # 场景 A: 紧急买入,使用【对手方最优价格】(market_type=0)
    # ---------------------------------------------------
    # 假设策略判断当前是极佳买点,必须立即成交
    # market_type=0: 也就是以卖一价买入,大概率立即成交
    order_market(g.security, 100, market_type=0)
    log.info("已使用对手方最优价格买入 100 股")

    # ---------------------------------------------------
    # 场景 B: 被动卖出,使用【本方最优价格】(market_type=2)
    # ---------------------------------------------------
    # 假设策略想止盈,但不着急,想卖个好价钱(卖一价),不想直接砸盘(砸给买一)
    # market_type=2: 也就是挂在卖一价上排队
    if position.amount >= 100:
        order_market(g.security, -100, market_type=2)
        log.info("已使用本方最优价格挂单卖出 100 股")

5. 总结

  • 对手方最优 (0) = “我要立刻成交”(付出价差成本,换取速度)。
  • 本方最优 (2) = “我要排队等成交”(节省价差成本,承担不成交风险)。

在实盘交易中,对手方最优价格 (Type 0) 是最常用的市价单类型,因为它最符合“市价单”的直觉定义(即时成交)。除非你的策略专门针对微观结构或做市逻辑,否则建议谨慎使用本方最优价格,以免因无法成交而错过行情。


Q&A

Q: 如果使用“对手方最优价格”买入,但卖一量的挂单很少,不够我买怎么办?
A: 这种情况下,撮合系统会先吃掉卖一的所有挂单。剩余未成交的部分,通常会转为限价单,价格锁定在刚才的卖一价上,等待新的卖单出现。它不会自动向上去吃卖二、卖三的价格(除非使用“五档即时成交剩余撤销”等其他类型)。

Q: PTrade回测中支持这两种市价单的区别吗?
A: 在分钟级别回测中,由于缺乏Tick级别的盘口数据,回测引擎通常会简化处理(例如都按当前分钟的收盘价或开盘价成交)。这两种类型的显著差异主要体现在实盘交易Tick级别回测中。

Q: 科创板和创业板支持这些市价单类型吗?
A: 支持。根据PTrade文档,上证科创板支持 market_type 0, 1, 2, 4;深证股票(含创业板)支持 0, 2, 3, 4, 5。因此 0 和 2 是通用的。注意科创板使用市价单时,通常建议(或强制)设置 limit_price 作为保护限价。