🚀 AI 一键生成 joinquant 策略代码

为什么 JoinQuant 的 get_price 获取的历史收盘价与行情软件不一致?

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

问题描述

get_price不准么?

price_choose = get_price(target_list, end_date=today, frequency='1d', fields=['close'], count=2, panel=False,fq='pre'
).pivot(index='time', columns='code', values='close')
print(f"price_choose is {price_choose}")

000333.XSHE 000858.XSHE ... 600938.XSHG 600941.XSHG
time ...
2023-12-28 54.05 140.10 ... 20.66 97.59
2023-12-29 54.63 140.31 ... 20.97 99.48

看000333,这个2023-12-28/29的收盘价是不对的,看了东财、新浪都不对;

可能是我哪里有写错么

解决方案

您好!您的代码本身没有写错,导致价格与您在东方财富、新浪等平台上看到的不一致的原因,在于复权方式(fq 参数)的设置以及分红派息的影响。

为什么价格会“不准”?

在您的代码中,设置了 fq='pre',这表示获取的是前复权价格。

  1. 前复权的机制:前复权是以当前最新日期(或您查询的基准日)为基准,保持现有价格不变,将历史价格向下折算。其目的是为了消除分红、送股等除权除息事件导致的K线断层,保证价格曲线的连续性。
  2. 分红的影响:000333(美的集团)在 2023-12-29 之后(例如 2024 年)发生了分红派息。当您在今天查询 2023 年底的前复权价格时,系统会扣除掉 2024 年分红的金额,因此您获取到的前复权价格会低于当时真实的交易价格。
  3. 平台差异:如果您在东方财富或新浪上查看的是不复权(真实K线)价格,或者它们的前复权基准日与您查询的基准日不同,就会出现价格对不上的情况。

如何获取当时的真实交易价格?

如果您希望获取 2023-12-28 和 2023-12-29 当天真实的收盘价(即不复权价格),只需要将 fq 参数设置为 None 即可。

修改后的代码:

price_choose = get_price(
    target_list, 
    end_date=today, 
    frequency='1d', 
    fields=['close'], 
    count=2, 
    panel=False,
    fq=None  # 将 'pre' 改为 None,获取不复权的真实价格
).pivot(index='time', columns='code', values='close')

print(f"price_choose is {price_choose}")

总结与建议

  • fq='pre'(前复权):适合用于计算收益率、计算技术指标(如均线、MACD),因为它保证了价格的连续性,避免了除权除息带来的指标失真。
  • fq=None(不复权):适合用于查看历史真实成交价格、计算真实的成交金额或进行撮合逻辑的核对。
  • 注意:在回测中,如果您开启了真实价格模式(set_option('use_real_price', True)),get_price 获取的前复权价格是基于回测当前逻辑日期的,这有效避免了未来函数。而在研究环境中,前复权通常是基于今天的。