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

如何在 ptrade 策略中调用 get_trend_data 获取 9:15-9:25 集合竞价期间的成交量与价格异动?

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

问题描述

ptrade 集合竞价异动狙击:利用 get_trend_data 预判早盘资金流向
如何在 ptrade 策略中调用 get_trend_data 获取 9:15-9:25 集合竞价期间的成交量与价格异动?

解决方案

1. 集合竞价数据获取接口:get_trend_data 详解

ptrade 平台中,get_trend_data 接口专门用于获取集中竞价期间(9:15 - 9:25)的代码数据。通过分析集合竞价期间的成交量(business_amount)成交额(business_balance)最新价格(hq_px),可以有效识别主力资金的早盘试盘与抢筹异动。

接口定义:

get_trend_data(date=None, stocks=None, market=None)
  • date:查询日期,格式为 'YYYYmmdd'(如 '20230308')。不传时默认返回当日数据。
  • stocks:股票代码,支持单只股票(str)或股票列表(list[str])。
  • market:市场代码,如 "XSHG""XSHE"。注意:stocksmarket 不能同时入参。

返回数据结构:

返回一个 dict 字典,Key 为股票代码,Value 包含以下字段:

  • time_stamp:时间戳 (int)
  • hq_px:价格 (float)
  • wavg_px:加权价格 (float)
  • business_amount:总成交量 (int)
  • business_balance:总成交额 (int)
  • amount:持仓量 (int)

2. 策略设计思路:早盘资金流向与异动狙击

  1. 盘前准备:在 before_trading_start 阶段筛选出目标监控股票池(如昨日热门股或特定板块)。
  2. 竞价数据提取:在 9:25 - 9:30 之间(例如 9:26),通过 run_daily 定时触发任务,调用 get_trend_data 获取竞价截止时的最终撮合数据。
  3. 异动判定
    • 量能异动:集合竞价成交量占昨日总成交量比例显著放大(如 > 2%)。
    • 价格异动:竞价高开幅度在 2% ~ 5% 之间,且未触及涨停,预示有主动性买盘抢筹。
  4. 执行委托:若满足异动条件,在 9:30 开盘瞬间以限价单或市价单快速跟进。

3. ptrade 策略源码实现

以下是一个完整的 ptrade 集合竞价异动狙击策略示例:

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

def initialize(context):
    # 设置监控的股票池(以恒生电子等为例)
    g.security_list = ['600570.SS', '000001.SZ']
    set_universe(g.security_list)
    
    # 每天 9:26 分运行集合竞价异动分析函数(此时 9:25 竞价已结束,数据已定格)
    run_daily(context, aggregate_auction_analysis, time='09:26')

def before_trading_start(context, data):
    # 每日初始化信号标识
    g.target_stocks = []

def aggregate_auction_analysis(context):
    today_str = context.blotter.current_dt.strftime('%Y%m%d')
    log.info("开始分析 %s 集合竞价异动数据..." % today_str)
    
    # 1. 获取集合竞价数据
    try:
        trend_data = get_trend_data(date=today_str, stocks=g.security_list)
    except Exception as e:
        log.error("获取集合竞价数据失败: %s" % e)
        return

    if not trend_data:
        log.warning("今日无集合竞价数据")
        return

    for stock in g.security_list:
        if stock not in trend_data:
            continue
            
        stock_trend = trend_data[stock]
        if not stock_trend:
            continue
            
        # 获取竞价截止时的最新价格与成交量
        auction_price = stock_trend.get('hq_px')
        auction_volume = stock_trend.get('business_amount')
        auction_balance = stock_trend.get('business_balance')
        
        # 2. 获取昨日收盘价及昨日成交量用于对比
        hist = get_history(1, '1d', ['close', 'volume', 'preclose'], security_list=stock, include=False)
        if hist is None or hist.empty:
            continue
            
        # 兼容 python3.11 与 python3.5 的 get_history 返回格式
        if 'code' in hist.columns:
            last_close = hist.query('code == @stock')['close'].values[0]
            last_volume = hist.query('code == @stock')['volume'].values[0]
        else:
            last_close = hist['close'].values[0]
            last_volume = hist['volume'].values[0]

        # 3. 计算异动指标
        # 价格涨幅
        price_change_rate = (auction_price - last_close) / last_close * 100
        # 竞价成交量占昨日总成交量的比例
        volume_ratio = (auction_volume / last_volume) * 100 if last_volume > 0 else 0

        log.info("股票: %s, 竞价价格: %.2f (涨幅: %.2f%%), 竞价成交量: %d (占比昨日: %.2f%%)" % 
                 (stock, auction_price, price_change_rate, auction_volume, volume_ratio))

        # 4. 异动筛选条件:高开 1.5% ~ 5% 之间,且竞价成交量占比昨日超过 1%
        if 1.5 <= price_change_rate <= 5.0 and volume_ratio >= 1.0:
            log.info(">>> 发现异动狙击目标: %s" % stock)
            g.target_stocks.append(stock)

def handle_data(context, data):
    # 9:30 开盘后,对筛选出的异动目标进行买入委托
    current_time = context.blotter.current_dt.strftime('%H:%M')
    
    if current_time == '09:30' and g.target_stocks:
        for stock in g.target_stocks:
            # 检查持仓,避免重复买入
            if get_position(stock).amount == 0:
                cash = context.portfolio.cash
                # 均分资金买入异动股
                invest_value = cash / len(g.target_stocks)
                if invest_value > 5000:  # 最小起买资金限制
                    order_value(stock, invest_value)
                    log.info("早盘狙击买入: %s, 金额: %.2f" % (stock, invest_value))
        # 清空今日目标,防止重复触发
        g.target_stocks = []

4. 注意事项与避坑指南

  1. 执行时间选择:集合竞价在 9:25 结束并定格。因此,建议将 run_daily 的触发时间设在 9:269:29 之间。如果在 9:25 之前调用,获取的数据可能不完整。
  2. 停牌处理:若股票停牌,get_trend_data 可能返回空值或不包含该股票。策略中需做好 try...except 异常保护与 None 值过滤。
  3. 价格笼子限制:若开盘瞬间使用限价单(order)抢筹,需注意科创板、创业板的价格笼子限制(2% 价格限制),可考虑使用市价保护限价单(order_market)以提高撮合效率。