利用ptrade提供的函数,读取历史收盘价时,复权参数全然不管用。
get_history - 获取历史行情
get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan')
fq:数据复权选项,支持包括,pre-前复权,post-后复权,dypre-动态前复权,None-不复权
pre-前复权,dypre-动态前复权 这两个不知道有什么区别
问题描述
解决方案
在 ptrade 量化平台中使用 get_history 函数获取历史行情时,如果遇到复权参数 fq 不起作用的情况,通常有以下几个原因。同时,理解 pre(前复权)和 dypre(动态前复权)的区别对于编写严谨的回测策略至关重要。
一、 复权参数 fq 失效的常见原因
- 标的类型不支持复权:
- 指数(如 000300.SS):指数本身不存在分红派息、送转股等除权除息行为,因此无论
fq参数设置为什么,获取到的价格都是一样的。 - 期货、期权等:这些衍生品通常也不适用股票的复权逻辑。
- 复权参数仅对股票(A股等)和部分基金(如 ETF、LOF)有效。
- 指数(如 000300.SS):指数本身不存在分红派息、送转股等除权除息行为,因此无论
- 近期无除权除息事件:
- 如果你查询的股票在所查询的时间段内,以及查询时间点之后,都没有发生过除权除息事件,那么复权价格和不复权价格是一致的。
- 数据源延迟或缺失:
- 极少数情况下,券商或平台的数据源可能未及时更新最新的除权除息数据,导致复权计算未生效。
- 参数传递错误:
- 请确保参数是以字符串形式传递,例如
fq='pre',而不是变量名。
- 请确保参数是以字符串形式传递,例如
二、 pre (前复权) 与 dypre (动态前复权) 的区别
在量化回测中,复权方式的选择直接影响策略的收益计算和是否引入“未来函数”。
1. pre (前复权 - 静态前复权)
- 定义:以当前最新交易日(即你运行策略的今天)的价格为基准,向历史倒推,按比例调整历史价格。
- 特点:
- 当前价格不变,历史价格被“压低”。
- 存在未来函数风险(在回测中):如果在回测中使用
pre,假设回测时间是 2020 年,但系统使用的是 2023 年的最新除权数据来调整 2020 年的价格。这意味着你在 2020 年“提前”知道了未来的分红送转信息,会导致回测结果失真(通常会夸大收益)。
- 适用场景:主要用于实盘交易或研究模块中查看历史走势图,因为实盘中我们总是站在“现在”看历史。
2. dypre (动态前复权)
- 定义:以回测过程中的当前时间点(
context.blotter.current_dt)的价格为基准,向历史倒推进行前复权。 - 特点:
- 随着回测时间的推进,复权的基准点在不断变化(动态移动)。
- 避免了未来函数:在回测到某一天时,系统只会使用该天及该天之前的除权除息数据来计算复权价格,绝对不会用到该天之后的数据。
- 适用场景:强烈建议在回测环境中使用
dypre。这样可以保证策略在回测时看到的价格曲线,与当时真实站在那个时间点看到的前复权曲线完全一致,从而保证回测的严谨性。
三、 代码示例与验证
你可以通过以下代码在研究模块或回测中验证复权的效果(选择一只近期有过大比例分红或送转的股票,例如某只高送转股票):
def initialize(context):
g.security = '600570.SS' # 恒生电子
set_universe(g.security)
def handle_data(context, data):
# 获取不复权数据
hist_none = get_history(5, '1d', 'close', security_list=g.security, fq=None)
# 获取前复权数据
hist_pre = get_history(5, '1d', 'close', security_list=g.security, fq='pre')
# 获取动态前复权数据
hist_dypre = get_history(5, '1d', 'close', security_list=g.security, fq='dypre')
log.info("不复权收盘价: \n%s", hist_none)
log.info("前复权收盘价: \n%s", hist_pre)
log.info("动态前复权收盘价: \n%s", hist_dypre)
总结:
- 如果发现复权无效,先检查标的是否是指数,或者近期是否有除权除息。
- 回测请务必使用
fq='dypre'或fq='post'(后复权),以防止未来函数。 - 实盘/研究可以使用
fq='pre'方便与行情软件对照。