🚀 AI 一键生成 ptrade 策略代码

PTrade 交易避坑:获取涨跌停价格 (high_limit/low_limit) 的正确姿势

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

问题描述

怎么获取最准确的当日涨跌停价格?

解决方案

在PTrade中,获取当日涨跌停价格的方法取决于您当前的运行环境(回测还是实盘交易)。

为了获取“最准确”的数据:

  1. 实盘交易:推荐使用 get_snapshot,直接获取交易所推送的实时快照数据,包含精准的 up_px (涨停价) 和 down_px (跌停价)。
  2. 回测模式:由于不支持快照函数,需使用 get_history 获取日线级别的 high_limit (涨停价) 和 low_limit (跌停价)。

以下是详细的代码实现方案,包含了一个兼容两种模式的通用函数。

核心代码实现

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

def handle_data(context, data):
    # 调用获取涨跌停价格的函数
    up_limit, down_limit = get_current_limit_price(g.security)
    
    if up_limit and down_limit:
        log.info("股票: %s, 今日涨停价: %s, 今日跌停价: %s" % (g.security, up_limit, down_limit))
    else:
        log.info("未能获取到 %s 的涨跌停价格" % g.security)

def get_current_limit_price(security):
    """
    兼容回测和实盘的获取涨跌停价格函数
    返回: (涨停价, 跌停价)
    """
    # 1. 实盘交易模式 (最准确,实时快照)
    if is_trade():
        # 获取实时快照
        snapshot = get_snapshot(security)
        if snapshot and security in snapshot:
            info = snapshot[security]
            # up_px: 涨停价, down_px: 跌停价
            return info.get('up_px'), info.get('down_px')
            
    # 2. 回测模式 (使用历史日线数据)
    else:
        # 注意:涨跌停价格通常只存在于日线('1d')数据中
        # 获取当天的日线数据,包含 high_limit 和 low_limit
        hist = get_history(1, '1d', ['high_limit', 'low_limit'], security, fq=None, include=True)
        
        if hist is not None and len(hist) > 0:
            # 获取最后一行数据(即当天)
            limit_up = hist['high_limit'][-1]
            limit_down = hist['low_limit'][-1]
            return limit_up, limit_down
            
    return None, None

详细说明

1. 实盘交易 (get_snapshot)

在实盘中,get_snapshot(security) 返回的是交易所的实时行情快照。这是最准确的数据源,因为它直接反映了柜台/交易所当前的状态。

  • 字段
    • up_px: 涨停价格 (float)
    • down_px: 跌停价格 (float)
  • 注意:在盘前阶段(如9:15之前),快照数据可能尚未更新或为0,建议在开盘后或集合竞价阶段使用。

2. 回测模式 (get_history)

回测不支持 get_snapshot,必须通过历史行情接口获取。

  • 函数get_history(count, frequency='1d', field=['high_limit', 'low_limit'], ...)
  • 关键点
    • 频率:必须使用 '1d' (日线)。分钟级别的历史数据通常不包含涨跌停字段。
    • 字段
      • high_limit: 涨停价
      • low_limit: 跌停价
    • include参数:建议设置 include=True 以包含当前回测日的数据。

常见问题 Q&A

Q: 为什么在回测中不能用 get_snapshot
A: get_snapshot 是设计用于获取实时行情的接口,回测环境是基于历史数据的模拟,系统底层不支持在回测中调用此接口。

Q: 创业板和科创板的涨跌幅限制会自动处理吗?
A: 是的。无论是 get_snapshot 还是 get_history,返回的都是交易所计算好的具体价格数值(如20%涨跌幅后的价格),您不需要自己去乘以1.1或1.2,直接使用返回的价格即可,这样能避免精度计算误差。

Q: get_price 可以用来获取涨跌停价吗?
A: 可以。get_priceget_history 类似,在日线频率下也支持 high_limitlow_limit 字段。但在策略编写中,get_history 通常用于获取截止到当前时刻的数据,使用起来更符合策略逻辑。