🚀 AI 一键生成 joinquant 策略代码

JoinQuant 获取历史数据时如何自动跳过停牌股票?

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

问题描述

在使用 history 获取数据时如何跳过停牌的日期?

解决方案

在使用 JoinQuant API 的 history 函数获取数据时,可以通过设置参数 skip_paused=True 来跳过停牌日期。

默认情况下,history 函数的 skip_paused 参数默认为 False,这意味着如果遇到停牌日期,系统会使用停牌前一天的收盘价数据进行填充(即数据看起来是连续的,价格不变)。将其设置为 True 后,返回的数据将只包含实际交易日的数据。

代码示例

# -*- coding: utf-8 -*-
def handle_data(context, data):
    # 获取股票列表,例如平安银行
    security_list = ['000001.XSHE']
    
    # 使用 history 获取过去 5 个实际交易日的数据
    # 设置 skip_paused=True 以跳过停牌日期
    # df=True 表示返回 DataFrame 格式
    hist_data = history(count=5, 
                        unit='1d', 
                        field='close', 
                        security_list=security_list, 
                        df=True, 
                        skip_paused=True)
    
    log.info(hist_data)

注意事项

  1. 索引对齐问题
    skip_paused=True 且同时获取多只股票的数据时,返回的 DataFrame 行索引(Index)可能不再是统一的日期对象。因为不同股票的停牌时间不同,导致它们在相同的 count 数量下对应的历史日期不一致。在这种情况下,数据无法在时间轴上严格对齐。

  2. 数据填充逻辑

    • skip_paused=False(默认):停牌时使用停牌前的数据填充,volumemoney 为 0。
    • skip_paused=True:直接剔除停牌日的数据行,只保留有成交的日期。
  3. 适用范围
    该参数适用于 historyattribute_history 函数。


Q&A

Q: 如果我同时查询多只股票并设置 skip_paused=True,返回的数据格式是什么样的?
A: 如果查询多只股票且设置跳过停牌,由于各股票停牌时间不同,返回的 DataFrame 可能会出现索引无法对齐的情况,或者某些股票的数据长度看起来不一致(如果非 DataFrame 格式)。通常建议在需要严格时间对齐的策略中(如多因子选股),谨慎使用 skip_paused=True 获取多只股票数据,或者在获取后自行处理对齐逻辑。

Q: attribute_history 函数也可以使用这个参数吗?
A: 是的,attribute_history 函数同样支持 skip_paused 参数,且默认值通常为 True(注意:history 默认为 False,而 attribute_history 在文档中说明默认跳过停牌,具体视 API 版本而定,建议显式指定以确保符合预期)。

Q: get_price 函数如何跳过停牌?
A: get_price 函数同样拥有 skip_paused 参数。当 skip_paused=True 时,如果获取多只标的,需要将 panel 参数设置为 False(因为 Panel 结构要求索引对齐,而跳过停牌会导致索引不一致)。