问题描述
用attribute_history获取到的开盘、收盘价有的股票为何与通达信等软件的不一样?
解决方案
在使用 JoinQuant (聚宽) 平台的 attribute_history 或 history 等 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')上,开盘价和收盘价的定义是全市场统一的。
总结建议
如果您在核对数据:
- 请确保两边对比的都是不复权数据(JoinQuant 中设置
fq=None)。 - 如果对比的是前复权数据,请理解由于复权基准日不同导致的价格绝对值差异是正常的,只要涨跌幅一致即可。
- 实盘和回测策略中,务必在
initialize中加入set_option('use_real_price', True)。