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',这表示获取的是前复权价格。
- 前复权的机制:前复权是以当前最新日期(或您查询的基准日)为基准,保持现有价格不变,将历史价格向下折算。其目的是为了消除分红、送股等除权除息事件导致的K线断层,保证价格曲线的连续性。
- 分红的影响:000333(美的集团)在 2023-12-29 之后(例如 2024 年)发生了分红派息。当您在今天查询 2023 年底的前复权价格时,系统会扣除掉 2024 年分红的金额,因此您获取到的前复权价格会低于当时真实的交易价格。
- 平台差异:如果您在东方财富或新浪上查看的是不复权(真实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获取的前复权价格是基于回测当前逻辑日期的,这有效避免了未来函数。而在研究环境中,前复权通常是基于今天的。