问题描述
问题描述:
通过get_market_data_ex与get_local_data 获取到的数据不一致,
其中get_market_data_ex获取到的数据是错误的,get_local_data的是正确的,
如果将start_time时间改成改短,使用近期的,比如20240101,2者获取到的数据又是一样的
这个是一个bug!!!!!
code:
from xtquant import xtdata
code = '511010.SH'
start_time = '20181101'
xtdata.download_history_data(code,period='1m',start_time=start_time)
# 使用get_market_data_ex进行数据获取
bars = xtdata.get_market_data_ex(stock_list=[code], period='1m', count=-1,start_time=start_time)
print(bars[code])
# 使用get_local_data进行数据获取
bars = xtdata.get_local_data(stock_list=[code], period='1m', count=-1,start_time=start_time)
print(bars[code])
from xtquant import xtdata
code = '511010.SH'
start_time = '20181101'
xtdata.download_history_data(code,period='1m',start_time=start_time)
# 使用get_market_data_ex进行数据获取
bars = xtdata.get_market_data_ex(stock_list=[code], period='1m', count=-1,start_time=start_time)
print(bars[code])
# 使用get_local_data进行数据获取
bars = xtdata.get_local_data(stock_list=[code], period='1m', count=-1,start_time=start_time)
print(bars[code])
解决方案
这不是一个 Bug,而是由于两个函数在处理**复权方式(dividend_type)**时的默认行为不同,结合特定交易品种(如高分红的国债ETF)在长周期下的复权累积效应所导致的现象。
问题原因深度解析
-
复权参数的默认值差异:
get_market_data_ex:在 QMT/xtquant 中,该函数通常用于获取处理后的行情数据,其复权参数dividend_type默认可能为'front'(前复权)或'follow'(跟随主图设置)。get_local_data:该函数主要用于直接读取本地落地的原始切片数据,其复权参数divid_type默认为'none'(不复权)。
-
交易品种的特殊性(高分红):
- 您代码中使用的标的
511010.SH(国债ETF)是一个分红非常频繁的品种。 - 长周期(如2018年至今):如果使用前复权(
front),历史价格需要扣除这6年间所有的分红。由于分红次数多、累计金额大,会导致2018年的前复权价格被大幅度向下调整,看起来非常“异常”(甚至在某些极端情况下可能出现负数),这与不复权的原始价格差异巨大。 - 短周期(如2024年至今):由于时间跨度短,期间发生的分红次数少,前复权对价格的调整幅度极小,因此复权数据和不复权数据看起来几乎一样。
- 您代码中使用的标的
解决方案
为了让 get_market_data_ex 获取到与 get_local_data 一致的原始(不复权)数据,您只需要在调用 get_market_data_ex 时,显式指定 dividend_type='none' 即可。
修改后的正确代码示例
from xtquant import xtdata
code = '511010.SH'
start_time = '20181101'
# 确保本地有数据
xtdata.download_history_data(code, period='1m', start_time=start_time)
# 使用 get_market_data_ex 进行数据获取,显式指定不复权:dividend_type='none'
bars_ex = xtdata.get_market_data_ex(
stock_list=[code],
period='1m',
count=-1,
start_time=start_time,
dividend_type='none' # 关键修改点
)
print("get_market_data_ex (不复权) 数据:")
print(bars_ex[code].head() if not bars_ex[code].empty else "无数据")
# 使用 get_local_data 进行数据获取 (默认 divid_type='none')
bars_local = xtdata.get_local_data(
stock_list=[code],
period='1m',
count=-1,
start_time=start_time
)
print("\nget_local_data 数据:")
print(bars_local[code].head() if not bars_local[code].empty else "无数据")
总结建议
在量化策略开发中,尤其是处理 ETF、高股息股票等品种的长周期历史数据时,务必明确指定复权方式。通常在计算收益率、构建技术指标时推荐使用前复权('front')或等比前复权('front_ratio'),而在进行撮合撮合或查看真实历史成交价时使用不复权('none')。