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

ptrade 平台 get_history 接口如何通过 fill 参数处理停牌与分钟数据缺失?

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

问题描述

ptrade get_history 停牌处理:精通 fill 参数应对历史数据缺失
在 ptrade 里调用 get_history 时,如何通过 fill 参数处理停牌期间或某时刻缺失的分钟 K 线数据?

解决方案

在 ptrade 量化交易平台中,调用 get_history 接口获取历史行情时,处理停牌或某时刻缺失的数据(尤其是分钟 K 线数据)是保证策略稳定运行的关键。以下是关于 get_history 接口中 fill 参数的详细用法及停牌处理机制:

一、get_history 接口中的 fill 参数详解

get_history 接口中,fill 参数主要用于控制分钟级别数据缺失时的填充行为(注:该参数仅在**交易(实盘/模拟盘)**环境有效):

  • fill='nan'(默认值)
    • 当行情服务获取不到某一时刻的分钟数据时,系统会使用 NaN(Not a Number)进行填充。
    • 适用场景:适合需要严格判断数据真实性、避免因使用历史旧数据导致指标计算失真的策略。
  • fill='pre'
    • 当行情服务获取不到某一时刻的分钟数据时,系统会自动用上一分钟的数据进行填充该时刻的数据。
    • 适用场景:适合对数据连续性要求高、需要防止因 NaN 导致技术指标(如 MACD、RSI)计算中断或报错的策略。

二、停牌场景的默认处理机制

无论是日线还是分钟线,ptrade 对停牌股票有以下默认处理规则:

  1. 时间轴对齐:系统不会跳过停牌的日期/分钟,时间轴依然严格按照二级市场的交易日日历对齐。
  2. 数据填充:停牌期间,K 线的价格数据(开盘价、收盘价、最高价、最低价)会使用停牌前最后一笔有效成交的数据进行填充。
  3. 成交量与成交额:停牌期间的成交量(volume)和成交额(money)会强制填充为 0
  4. 过滤停牌股:在日 K 线场景下,策略可以通过判断 volume == 0 或调用 get_stock_status 接口来过滤停牌标的。

三、Python 策略示例:处理分钟数据缺失与过滤停牌

以下是一个完整的 ptrade 策略示例。该策略在分钟级别运行,展示了如何安全地获取历史分钟数据,并利用成交量为 0 的逻辑过滤停牌股票,避免废单委托。

def initialize(context):
    # 设置操作的股票池(例如:恒生电子)
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    sid = g.security
    
    # 1. 获取最近 10 条分钟 K 线数据,设置 fill='pre' 确保数据连续无 NaN
    # 注意:在实盘/模拟盘中,fill='pre' 会用前一分钟数据填充缺失值
    df = get_history(
        count=10, 
        frequency='1m', 
        field=['close', 'volume'], 
        security_list=sid, 
        fq='pre', 
        include=False, 
        fill='pre'
    )
    
    if df is None or df.empty:
        log.warning(f"未能获取到 {sid} 的历史数据")
        return
        
    # 2. 提取最新的收盘价和成交量
    # 在多股或单股返回的 DataFrame 中提取数据(兼容 python3.11 结构)
    if 'code' in df.columns:
        sub_df = df.query('code in [@sid]')
    else:
        sub_df = df
        
    last_volume = sub_df['volume'].iloc[-1]
    last_close = sub_df['close'].iloc[-1]
    
    # 3. 停牌过滤逻辑:如果最新一分钟的成交量为 0,大概率处于停牌或未开盘状态
    if last_volume == 0:
        log.info(f"{sid} 当前成交量为 0,可能处于停牌状态,暂不进行交易。")
        return
        
    # 4. 正常交易逻辑(示例:简单买入)
    cash = context.portfolio.cash
    if cash > last_close * 100:
        order(sid, 100)
        log.info(f"正常交易:买入 {sid} 100股,价格:{last_close}")

四、注意事项

  1. 多线程冲突get_historyget_price 接口不支持多线程同时调用。请避免在 run_dailyrun_interval 定时任务中与 handle_data 同时调用这两个接口,否则可能导致获取数据为空。
  2. 回测与交易差异fill 参数的填充行为主要在交易环境中生效。在回测环境中,系统会严格按照历史静态数据库进行撮合。