🚀 AI 一键生成 joinquant 策略代码

JoinQuant 获取历史数据时如何保留停牌股票的数据?

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

问题描述

使用 attribute_history 获取数据时,不想跳过停牌的日期,应该怎么设置?

解决方案

在使用 JoinQuant 的 attribute_history 函数获取数据时,如果希望包含停牌日期的通过设置参数 skip_paused=False 来实现。

设置方法

在调用 attribute_history 时,显式指定 skip_paused=False

# 获取过去5天的数据,包含停牌日期
data = attribute_history(
    security='000001.XSHE', 
    count=5, 
    unit='1d', 
    fields=['open', 'close', 'volume'], 
    skip_paused=False  # 关键设置:设置为 False 即不跳过停牌
)

数据填充规则

当设置 skip_paused=False 时,对于停牌的日期,系统会按照以下规则填充数据:

  1. 价格字段 (open, close, high, low, pre_close): 使用停牌前最后一个交易日的收盘价进行填充。
  2. 成交量/额 (volume, money): 填充为 0
  3. 停牌标识 (paused): 如果获取 paused 字段,该日期的值为 1 (或 True)。

示例代码

以下是一个完整的策略代码片段,展示了如何获取包含停牌日的数据并打印验证:

# -*- coding: utf-8 -*-
def initialize(context):
    # 选择一只历史上曾长期停牌的股票作为示例,例如 万科A (000002.XSHE) 在2015年底至2016年中曾停牌
    g.security = '000002.XSHE'
    run_daily(print_history_data, 'every_bar')

def print_history_data(context):
    # 获取过去5天的数据,不跳过停牌
    # 注意:为了演示效果,这里假设回测时间段包含了停牌期
    h = attribute_history(
        g.security, 
        count=5, 
        unit='1d', 
        fields=['close', 'volume', 'paused'], 
        skip_paused=False
    )
    
    # 打印数据查看
    # 如果遇到停牌日,你会看到 volume 为 0,close 为前一日收盘价,paused 为 1
    log.info("\n" + str(h))

Q&A

Q: attribute_history 函数默认会跳过停牌日期吗?
A: 是的,attribute_historyskip_paused 参数默认值为 True,即默认会自动跳过停牌日期,只返回实际交易日的数据。

Q: 如果我不跳过停牌,停牌那天的开盘价和收盘价是一样的吗?
A: 是的。当 skip_paused=False 时,停牌期间的 openclosehighlow 都会被填充为停牌前最后一个交易日的收盘价,因此这四个价格在停牌日是相等的。

Q: 获取分钟数据时 skip_paused=False 有效吗?
A: 有效。无论是天频率 (1d) 还是分钟频率 (1m),设置 skip_paused=False 都会用前一个有效数据填充停牌的时间段,保持时间轴的连续性。