带你详细了解miniQMT的xtdata模块 (第七篇)——除权复权数据详解

QUANT 2025-12-25 17:26:23 12 举报

大家好!欢迎回到我们的miniQMT系列学习教程。在前面的文章中,我们已经学会了如何下载和获取K线、财务等数据


但如果我们直接用这些数据构建框架进行回测,很可能会掉进一个巨大的“陷阱”里,导致回测结果严重失真。这个陷阱,就是

今天,我们就来彻底搞懂这个让无数新手头疼的问题,并学会如何在xtdata中正确处理复权数据,让你的回测真正做到“所见即所得”

想象一个场景:你持有的某只股票昨天收盘价还是20元,今天一早打开行情软件,发现开盘价直接变成了10元,暴跌50%!你惊出一身冷汗,但再一看账户总资产,咦?好像没什么变化。这是怎么回事?
恭喜你,你遇到了A股市场常见的“事件”——除权除息。这并不是真实的股价暴跌,而是上市公司给股东分红或送股后,对股价进行的一次技术性调整。如果你直接用这个“跳水”后的价格去计算收益率或判断交易信号,那结果可想而知,必然是差之千里。


核心观点:直接使用未处理的K线价格进行量化回测是完全错误的。为了保证回测的准确性,我们必须使用“”后的数据。

到底什么是除权除息?

我们可以用一个“分蛋糕”的例子来理解。

一家公司的总价值就像一个大蛋糕。股价,就是把这个蛋糕切成很多小块后,每一小块的价格。除权除息,就是公司决定把一部分蛋糕(利润)分给股东


这通常有两种形式
1 除息:直接分现金。比如每股派发现金红利1元。分完后,公司的总价值(蛋糕)变小了,所以每股的价格(每块蛋糕)自然也要相应降低。
2 除权:送股票或转增股本。比如每10股送10股这意味着蛋糕没变,但被切成了更多的小块。总块数翻倍了,那每一小块的价格自然就要减半

无论是哪种形式,股东的总资产在除权除息的瞬间是不会改变的。股价虽然降低了,但你得到了现金或者更多的股票作为补偿

复权三兄弟:前复权、后复权、不复权
为了消除这种价格“缺口”,让我们能够观察到股价真实的、连续的涨跌走势,就有了“复权”这个概念。它主要分为三种:

不复权 

定义:就是我们在行情软件上看到的原始价格,K线图上存在因除权除息造成的“价格缺口”。
缺点:无法真实反映股票的长期收益率,不能直接用于计算指标和回测。

后复权 
定义:以股票上市第一天的价格为基准,将之后的股价进行连续调整。
优点:能直观地看出,如果你从上市第一天持有到现在,算上所有分红送股,总共的收益率是多少。
缺点:历史价格会随着未来的每一次除权而不断变化,不适合用于严谨的回测。

前复权
定义:以当前最新的股价为基准,将之前所有的历史股价进行调整,消除所有价格缺口,使K线变得平滑连续。
优点:量化回测的黄金标准。它能保证在历史的任何一个时间点,我们看到的收益率都是真实的。

为了方便大家理解,我整理了一个表格:



让我们学习这个打印000001.SZ前复权,后复权,不复权的代码示例

from xtquant import xtdata

stock_code = "000001.SZ"

# 下载历史数据(默认不复权)
xtdata.download_history_data(stock_code, "1d", "", "", False)

# 获取前复权数据
qfq_data = xtdata.get_market_data_ex(
    field_list=[],
    stock_list=[stock_code],
    period="1d",
    start_time="",
    end_time="",
    count=-1,
    dividend_type="front",
    fill_data=False
)

# 获取后复权数据
hfq_data = xtdata.get_market_data_ex(
    field_list=[],
    stock_list=[stock_code],
    period="1d",
    start_time="",
    end_time="",
    count=-1,
    dividend_type="back",
    fill_data=False
)

# 获取不复权数据
bfq_data = xtdata.get_market_data_ex(
    field_list=[],
    stock_list=[stock_code],
    period="1d",
    start_time="",
    end_time="",
    count=-1,
    dividend_type="none",
    fill_data=False
)

print("前复权数据:")
print(qfq_data)
print("\n后复权数据:")
print(hfq_data)
print("\n不复权数据:")
print(bfq_data)


示例代码如下:

通过这个案例,我们可以清晰地看到股价调整的来龙去脉,加深对复权原理的理解~~赶紧运行起来吧!


QMT/miniQMT免费申请

QMT免费领取学习案例

QMT落地辅助策略代写服务

需要的朋友欢迎联系 ~~~


尊重知识,尊重市场 1

著作权归文章作者所有。

最新回复 ( 0 )
发新帖
0
DEPRECATED: addslashes(): Passing null to parameter #1 ($string) of type string is deprecated (/data/user/htdocs/xiunophp/xiunophp.min.php:48)