🚀 AI 一键生成 joinquant 策略代码

为什么 JoinQuant 中 attribute_history 获取的股票价格与通达信等软件不一致?

joinquant | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

价格问题

用attribute_history获取到的开盘、收盘价有的股票为何与通达信等软件的不一样?

解决方案

在使用 JoinQuant (聚宽) 平台的 attribute_historyhistory 等 API 获取股票历史价格时,发现与通达信、同花顺等炒股软件上的价格不一致,通常是由以下几个核心原因导致的:

1. 默认的复权方式不同(最常见原因)

  • JoinQuant 默认前复权attribute_history 函数的 fq 参数默认值为 'pre',即前复权。这意味着历史价格会根据股票的分红、送转等情况进行折算,以保证价格曲线的连续性。
  • 炒股软件默认可能是不复权:通达信等软件在默认打开时,K线图往往显示的是不复权(真实交易)价格。如果该股票历史上发生过除权除息,两边的价格自然会产生巨大差异。
  • 解决方法:如果您希望获取和炒股软件上一样的不复权真实价格,可以在调用时将 fq 参数设置为 None
    # 获取不复权的真实价格
    df = attribute_history('000001.XSHE', 5, '1d', ['open', 'close'], fq=None)
    

2. 前复权的“基准日”差异

即使您在通达信中也开启了“前复权”,价格依然可能存在微小差异,这通常是因为复权基准日不同:

  • 前复权的计算逻辑:前复权是以某一天(通常是今天)的价格为基准,利用历史的复权因子往回倒推历史价格。
  • JoinQuant 的基准日
    • 在回测/模拟中,如果您开启了动态复权(真实价格)模式 set_option('use_real_price', True),那么您在回测到历史某一天(例如2018-01-01)时,获取到的前复权价格是基于2018-01-01这一天作为基准日计算出来的前复权价格。
    • 而通达信等软件的前复权,通常是基于当前的最新交易日作为基准日计算的。
    • 由于基准日不同,历史上的前复权价格数值就会不同,但它们反映的收益率(涨跌幅)是完全一致的

3. 是否开启了“动态复权(真实价格)模式”

在 JoinQuant 编写策略时,强烈建议在 initialize 函数中开启真实价格模式:

def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
  • 开启后:回测引擎会使用真实的未复权价格进行撮合交易,避免了“未来函数”(因为基于今天的前复权价格包含了未来的分红信息)。同时,API 获取到的历史数据是基于回测当前日期的前复权价格,符合当时的真实视角。
  • 未开启(默认):回测引擎会以回测创建日为基准,全程使用固定的一套前复权价格进行撮合。这会导致下单价格与历史真实价格不符,且不同时间创建的回测结果可能因复权因子更新而产生差异。

4. 集合竞价与数据对齐

  • JoinQuant 的分钟 K 线是后对齐的。例如 09:31 的一分钟 K 线,包含了 09:25 集合竞价产生的数据。这与部分软件的 K 线切分规则可能存在细微差异,但在日线级别('1d')上,开盘价和收盘价的定义是全市场统一的。

总结建议

如果您在核对数据:

  1. 请确保两边对比的都是不复权数据(JoinQuant 中设置 fq=None)。
  2. 如果对比的是前复权数据,请理解由于复权基准日不同导致的价格绝对值差异是正常的,只要涨跌幅一致即可。
  3. 实盘和回测策略中,务必在 initialize 中加入 set_option('use_real_price', True)