🚀 AI 一键生成 ptrade 策略代码

ptrade 获取历史行情复权参数 fq 失效怎么办?前复权(pre)与动态前复权(dypre)有何区别?

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

问题描述

利用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 失效的常见原因

  1. 标的类型不支持复权
    • 指数(如 000300.SS):指数本身不存在分红派息、送转股等除权除息行为,因此无论 fq 参数设置为什么,获取到的价格都是一样的。
    • 期货、期权等:这些衍生品通常也不适用股票的复权逻辑。
    • 复权参数仅对股票(A股等)和部分基金(如 ETF、LOF)有效
  2. 近期无除权除息事件
    • 如果你查询的股票在所查询的时间段内,以及查询时间点之后,都没有发生过除权除息事件,那么复权价格和不复权价格是一致的。
  3. 数据源延迟或缺失
    • 极少数情况下,券商或平台的数据源可能未及时更新最新的除权除息数据,导致复权计算未生效。
  4. 参数传递错误
    • 请确保参数是以字符串形式传递,例如 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' 方便与行情软件对照。