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

ptrade 平台如何实现上证与深证盘后固定价格交易?(附 Python 源码与定时器配置)

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

问题描述

ptrade 盘后固定价交易:上交所与深交所盘后委托精细化控制指南
上证和深证盘后固定价格交易在 ptrade 中该如何实现?如何利用 after_trading_order 和相应的定时器进行盘后报单?

解决方案

ptrade 盘后固定价交易精细化控制指南

在 A 股市场中,盘后固定价格交易(科创板、创业板及部分符合条件的股票)是量化交易中规避盘中价格剧烈波动、锁定收盘价成交的重要手段。在 ptrade 平台中,我们可以通过专门的盘后交易接口与定时器实现精细化控制。


一、 核心 API 接口解析

1. 盘后固定价委托:after_trading_order

  • 使用场景:仅支持 PTrade 客户端可用、仅在股票交易模块可用。
  • 接口定义after_trading_order(security, amount, entrust_price)
  • 参数说明
    • security (str):股票代码(如 '300001.SZ')。
    • amount (int):交易数量。正数表示买入,负数表示卖出
    • entrust_price (float):买卖限价(通常为当日收盘价)。
  • 注意事项:盘后固定价委托申报时间通常为 9:30 ~ 11:3013:00 ~ 15:30。实际在 15:00 ~ 15:30 期间进行撮合成交。

2. 盘后固定价撤单:after_trading_cancel_order

  • 接口定义after_trading_cancel_order(order_param)
  • 参数说明
    • order_param (str/Order):Order 对象或者 order_id

二、 盘后固定价交易策略实现逻辑

由于盘后固定价交易的撮合发生在 15:00 ~ 15:30,我们通常需要:

  1. 15:00 盘后(例如 15:05 或 15:15)获取标的股票的当日收盘价(最新价)。
  2. 使用 run_daily 定时器在指定时间触发盘后委托函数。
  3. 调用 after_trading_order 接口进行报单。

三、 完整 Python 策略源码示例

以下源码展示了如何使用 run_daily 定时器在 15:05 自动获取收盘价,并对目标股票进行盘后固定价买入委托,同时在 15:20 对未成交的委托进行撤单保护。

# -*- coding: utf-8 -*-
import time

def initialize(context):
    # 1. 设置目标操作股票(例如创业板股票 300001)
    g.security = '300001.SZ'
    set_universe(g.security)
    
    # 2. 注册定时任务:15:05 执行盘后固定价下单
    run_daily(context, post_market_order_func, time='15:05')
    
    # 3. 注册定时任务:15:20 执行未成交撤单保护
    run_daily(context, post_market_cancel_func, time='15:20')
    
    # 存储盘后委托的订单ID
    g.post_order_id = None

def post_market_order_func(context):
    log.info("触发 15:05 盘后固定价委托流程...")
    
    # 获取最新行情快照以取得收盘价
    snapshot = get_snapshot(g.security)
    if snapshot and g.security in snapshot:
        last_px = snapshot[g.security].get('last_px', 0)
        trade_status = snapshot[g.security].get('trade_status', '')
        
        # 确保获取到有效的收盘价格
        if last_px > 0:
            log.info("股票 %s 今日收盘价为: %s,准备进行盘后固定价买入" % (g.security, last_px))
            # 盘后固定价买入 200 股
            order_id = after_trading_order(g.security, 200, float(last_px))
            if order_id:
                g.post_order_id = order_id
                log.info("盘后固定价委托成功,订单ID: %s" % order_id)
            else:
                log.error("盘后固定价委托失败")
        else:
            log.error("未能获取到有效收盘价")
    else:
        log.error("获取行情快照失败")

def post_market_cancel_func(context):
    log.info("触发 15:20 盘后撤单检查...")
    if g.post_order_id:
        # 执行盘后固定价撤单
        after_trading_cancel_order(g.post_order_id)
        log.info("已对盘后订单 %s 发起撤单申请" % g.post_order_id)
        g.post_order_id = None

def handle_data(context, data):
    # 盘后固定价逻辑由定时器 run_daily 驱动,此处保持 pass
    pass

四、 交易注意事项与精细化控制要点

  1. 价格精度处理
    • 股票价格精度为小数点后两位,科创板/创业板申报价格必须严格符合规范,传入 after_trading_order 的价格建议使用 float(round(price, 2)) 进行格式化。
  2. 账户权限确认
    • 盘后固定价格交易接口(after_trading_order)仅在实盘/仿真交易环境且券商柜台支持的情况下有效,回测环境不支持此接口的撮合模拟。
  3. 定时器时间选择
    • 15:00 之后,交易所开始接受盘后固定价格交易申报。建议将定时器设在 15:01 ~ 15:29 之间,以确保收盘价已完全定格且有充足的撮合时间。