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

joinquant 复权机制避坑:use_real_price 模式下的价格与持仓数量自动调整机制解析

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

问题描述

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

Title: joinquant 复权机制避坑:use_real_price 模式下的价格与持仓数量自动调整

Question: 开启动态复权后,joinquant 是如何自动处理分红送股对持仓和价格影响的?

解决方案

joinquant 复权机制避坑:use_real_price 模式下的价格与持仓数量自动调整机制解析

在 JoinQuant(聚宽)量化交易平台中,股票复权模式的选择直接决定了回测结果的真实性与严谨性。默认的传统前复权模式容易引入未来函数,而开启动态复权模式(真实价格模式)则是避免此类问题的最佳实践。


一、如何开启动态复权模式?

在策略的 initialize(context) 函数中调用以下设置即可开启动态复权(真实价格)模式:

def initialize(context):
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)

二、开启动态复权后,系统如何自动处理分红送股?

当通过 set_option('use_real_price', True) 启用真实价格模式后,系统在遇到股票拆分、合并或分红送股等除权除息(Corporate Actions)事件时,遵循以下自动调整逻辑:

1. 真实撮合与持仓数量自动调整

  • 下单与持仓使用真实价格:回测运行到历史某一交易日,策略看到的实时价格、持仓价格及下单撮合价格均为当天的真实不复权价格
  • 持仓数量根据复权因子自动调整:跨越除权除息日时,如果持仓中有股票发生送股、拆合等影响复权因子的情形,系统会在新交易日开盘前根据复权因子自动调整账户中的持仓股票数量
  • 小数处理与现金微调:若调整后的持仓股票数量出现小数,系统会向下取整至整数。为保证账户总资产(context.portfolio.total_value)不受取整影响,零碎股份对应的资金会略微调整并补入可用现金(context.portfolio.available_cash)。
  • 分红现金到账:若发生现金分红,派发的分红现金扣税后(回测中按 20% 统一预扣)会自动充入账户可用现金中。

2. 数据 API 接口的动态前复权(防未来函数)

  • 当你在不同日期调用数据获取 API(如 historyattribute_historyget_price 等)时,系统返回的数据是基于当前运行日期进行前复权处理的价格
  • 示例:回测运行到 2015-01-01 时,API 返回的是穿越到 2015-01-01 当天所看到的前复权价格,绝对不会使用未来(如 2020 年)的复权因子。这种机制彻底消除了传统静态前复权带来的未来函数风险。

三、动态复权模式下的避坑注意事项

  1. 切勿跨日期缓存 API 返回的数据
    由于不同交易日看到的前复权基准不同,同一历史日期在今天调用 API 和明天调用 API 拿到的前复权价格可能不一致。因此,不要将 historyget_price 返回的 DataFrame 存入全局变量 g 供次日使用。

  2. 历史真实价格的换算方法
    如果需要在策略中计算昨天的真实不复权价格,可以通过获取前复权价格和复权因子(factor)进行换算:

    s = '000001.XSHE'
    df = attribute_history(s, 1, '1d', fields=['close', 'factor'])
    # 昨天的真实价格 = 昨天的前复权收盘价 / 昨天的复权因子
    real_close = df['close'][-1] / df['factor'][-1]
    
  3. 下单一手规则限制
    开启真实价格后,实际买入时必须满足 A 股 100 股(一手)的整数倍限制。使用真实价格计算得出的可买股数与使用前复权价格计算的结果不同,这会让回测结果更贴近真实实盘。