🚀 AI 一键生成 joinquant 策略代码

为什么 JoinQuant 中 get_ticks 和 get_price 获取的开高低收数据不一致?

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

问题描述

求助:get_ticks与get_price结果不一致

get_ticks()查询出数据为 tick级的数据,按道理所其开盘价、最高价、收盘价、最低价,这四个关键数据应该与股票当天的数据一致才对。
但是却发现部分股票存在不一样的情况,拿中国平安(“688012.XSHG”),2025年5月30日数据,为例:

ticks = get_ticks('601318.XSHG', start_dt=‘2025-05-30’,end_dt=‘2025-06-01’, fields=['time','open', 'current', 'high', 'low', 'volume', 'money'], skip=False,df=True)
最后一行数据显示:

time open current high low
20250530150002.00 53.37 53.28 53.69 52.85
说明:中国平安收盘时,价格为53.28,开盘为53.37,最高53.69,最低为52.85

而通过get_price()查询 2025年5月30日的

stocks=get_price('601318.XSHG',start_date=‘2025-05-30’,end_date=‘2025-06-01’,fields=['open','close','high','low'])
stocks
显示结果为:

time open close high low
2025-05-30 51.87 51.78 52.18 51.37
get_price()查询的结果与我在wind上一致,
Img
但是get_ticks()的数据存在较大差距,各位大哥,可知道什么原因呢?是不是这是tick级数据的通病呢?

解决方案

你好!你遇到的 get_ticksget_price 数据不一致的问题,根本原因在于数据的“复权”处理机制不同,这并不是 tick 级数据的通病,而是量化数据获取时的常见现象。

核心原因解析

  1. get_price 默认返回“前复权”数据
    在 JoinQuant 的 API 中,get_price 函数有一个参数 fq(复权选项)。它的默认值是 'pre',即前复权。如果该股票在你查询的日期之后发生了分红派息(除权除息),系统会根据复权因子对历史价格进行向下调整,以保证价格曲线的连续性。你提到 get_price 的数据与 Wind 一致,是因为 Wind 默认展示的通常也是前复权价格。

  2. get_ticks 始终返回“真实(不复权)”数据
    Tick 数据记录的是交易所当时真实的撮合快照,它反映的是当时盘面上真实的交易价格,没有任何复权处理。因此,get_ticks 返回的价格(如 53.28)是当天真实的收盘价,而 get_price 返回的价格(如 51.78)是经过分红除权调整后的前复权价格。

验证与解决方法

如果你希望 get_price 查询出的数据与 get_ticks 完全一致,只需要在调用 get_price 时,将复权参数 fq 设置为 None(即不复权,返回真实价格)即可。

修改后的代码如下:

# 将 fq 设置为 None,获取不复权的真实历史价格
stocks = get_price('601318.XSHG', start_date='2025-05-30', end_date='2025-06-01', fields=['open','close','high','low'], fq=None)
print(stocks)

执行上述代码后,你会发现 stocks 返回的 openclosehighlow 将与 get_ticks 最后一条记录的 opencurrenthighlow 完全吻合(即 53.37, 53.28, 53.69, 52.85)。

量化回测中的建议

  • 计算技术指标:通常建议使用前复权数据(get_price 默认设置),这样可以避免因为除权除息导致的价格跳空,从而引起均线、MACD 等技术指标的失真。
  • 模拟真实交易/盘口分析:如果你在做高频的 Tick 级别回测或盘口撮合分析,必须使用真实价格(不复权数据)。在 JoinQuant 回测引擎中,建议在 initialize 函数中开启真实价格模式:set_option('use_real_price', True),这样引擎会使用真实价格进行撮合,同时根据复权因子自动处理账户的现金分红和送股。