🚀 AI 一键生成 ptrade 策略代码
立即体验

PTrade 中 get_history 的 fq 参数有 pre, dypre, post, 如何正确选择复权模式?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade 行情复权详解:前复权、动态前复权与后复权的区别与选择

Question: PTrade 中 get_history 的 fq 参数有 pre, dypre, post, 如何正确选择复权模式?

解决方案

PTrade 行情复权详解:pre、dypre、post 参数的区别与应用选择

在 PTrade 量化平台中,调用历史行情接口(如 get_historyget_price)时,fq(复权)参数用于处理股票因送股、转增、分红等除权除息事件导致的价格不连续问题。正确选择复权模式对于真实还原历史走势、避免回测未来函数至关重要。


一、PTrade 复权参数汇总

PTrade 的 fq 参数支持以下 4 种模式:

fq 参数值 复权模式名称 价格基准 适用场景 说明
None 不复权 当前实际历史成交价 实盘委托、计算真实交易成本 真实还原历史撮合价格,但在除权除息日价格会出现缺口
'pre' 前复权 当前最新除权日/今天为基准 因子计算、技术指标分析(如 MA、MACD) 保持当前价格不变,将历史价格向下修正,适合大多数日线及分钟线技术指标计算
'dypre' 动态前复权 以**查询时间点(回测当时)**为基准 量化策略回测 严格避免未来函数。仅根据查询时刻前已发生的除权信息调整历史价格
'post' 后复权 股票上市首日为基准 长期业绩评估、复利收益率计算 保持上市首日价格不变,将后续价格向上修正,真实反映股票自上市以来的累计涨幅

二、核心区别与逻辑解析

1. 前复权 (fq='pre') 与 动态前复权 (fq='dypre') 的关键区别

  • 前复权 (pre):每次计算都以“今天(最新日)”为基准调整历史所有价格。如果在回测中间节点调用 fq='pre',可能会引入历史时刻未知的“未来分红/送股”除权因子(即未来的信息影响了过去的价格),产生轻微的未来函数风险。
  • 动态前复权 (dypre):以回测当时的那个交易日作为复权基准,仅使用当时已经发生的除权数据进行动态前复权,能够彻底消除因使用未来除权因子导致的回测偏差。

2. 静态不复权 (fq=None) 的场景

  • 当需要计算实际买入股票的真实资金、下单委托限价(limit_price)或计算交易印花税/佣金时,必须使用不复权数据。

三、如何选择合适的复权模式(实战指南)

  1. 量化策略回测阶段(强烈推荐 fq='dypre'fq='pre'
    • 需要计算均线(MA)、RSI、MACD 等技术指标时,必须使用复权数据,防止除权缺口引发错误的买卖信号。
    • 对严格无未来函数有极高要求时,推荐使用 fq='dypre';一般常规回测使用 fq='pre' 即可。
  2. 历史收益率与业绩分析(推荐 fq='post'
    • 计算股票长期复利增长率或对比多只股票的真实走势时,选择后复权可以直观展现累计投资收益。
  3. 策略实盘下单与委托(必须使用 fq=None 或挂单前转化)
    • 报单给券商柜台时,委托价格必须为市场的真实价格(不复权价)。在获取最新参考价或设置 limit_price 时,请确保使用未复权行情。

四、代码示例

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 计算均线指标:使用动态前复权(dypre)或前复权(pre)数据
    df_pre = get_history(10, '1d', 'close', security_list=g.security, fq='dypre', include=False)
    ma5 = df_pre['close'][-5:].mean()
    
    # 2. 取得上一个时间点真实收盘价(不复权),用于资金与下单量计算
    df_real = get_history(1, '1d', 'close', security_list=g.security, fq=None, include=False)
    current_real_price = df_real['close'][-1]
    
    # 策略逻辑:均线突破买入
    cash = context.portfolio.cash
    if current_real_price > ma5 and get_position(g.security).amount == 0:
        # 下单委托时建议使用限价,价格以不复权的实时价格为参考
        order_value(g.security, cash, limit_price=current_real_price)
        log.info("前复权MA5: %s, 当前真实价格: %s, 买入" % (ma5, current_real_price))