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

JoinQuant get_price 函数复权参数(fq)详解:不复权、前复权与后复权区别与用法

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

问题描述

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

Title: joinquant 数据教程:get_price 中不复权、前复权与后复权的区别与用法

Question: joinquant 的 get_price 函数中 fq 参数设置为 'pre'、'post' 和 None 有什么区别?

解决方案

JoinQuant get_price 函数复权参数(fq)详解

在 JoinQuant(聚宽)量化交易平台中,get_price 是最常用的获取历史行情数据的 API 之一。其中,fq(復权/Adjustment)参数用于控制价格与成交量的复权处理方式。


1. fq 参数的三种取值及区别

get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None)

fq 参数支持以下三种选项:

fq 参数值 复权类型 含义与计算逻辑 适用场景
'pre' 前复权(默认值) 以**当前(或获取数据截止日/当前逻辑时间)**的价格为基准,保持最新价格不变,向历史修正除权除息导致的价格缺口。 计算技术指标(MA、MACD、RSI等)、策略选股信号生成。
'post' 后复权 股票上市首日的价格为基准,保持历史初始价格不变,向未来修正除权除息后的价格。 长期收益率计算、连续价格序列分析。
None 不复权 返回交易所公布的真实历史成交价格与真实成交量,不做任何复权因子修正。 实际下单交易算手数、计算真实持仓成本与市值。

2. 深入理解:复权对价格与成交量的影响

  1. 价格字段影响:选择 'pre''post' 时,openclosehighlowavg 等价格字段均会被复权因子修正,保持价格序列的连续性,消除分红送股导致的价格断层。
  2. 成交量字段(volume)影响:在复权模式下,为了保证 价格 * 成交量 逻辑接近真实成交金额,volume 也会根据复权因子进行相应的复权缩放。

3. 回测中的动态复权模式与 set_option('use_real_price', True)

在 JoinQuant 中,强烈建议在 initialize 中开启动态复权(真实价格)模式:

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

开启真实价格模式后的行为:

  • 下单撮合:系统会使用当天真实的未复权价格进行撮合与计算可买手数。
  • 数据 API 行为:当调用 get_price(..., fq='pre')history 时,返回的是**基于当前逻辑时间(context.current_dt)**的前复权价格。这能有效避免跨越未来除权日而引入未来函数。
  • 注意事项:由于前复权因子随时间动态变化,切勿跨日期缓存 get_price 返回的行情 DataFrame。每天应重新调用 API 获取。

4. 示例代码

# 1. 获取前复权数据(用于计算 5 日均线)
df_pre = get_price('000001.XSHE', count=5, frequency='daily', fields=['close'], fq='pre')
ma5 = df_pre['close'].mean()

# 2. 获取不复权数据(用于获取昨日真实收盘价)
df_real = get_price('000001.XSHE', count=1, frequency='daily', fields=['close'], fq=None)
real_close = df_real['close'][-1]

总结建议

  • 技术指标与选股:使用默认的 fq='pre',确保均线和指标不因除权产生虚假信号。
  • 下单交易与手数计算:使用 fq=None 获取真实价格,或开启 set_option('use_real_price', True) 后由引擎自动处理。