🚀 AI 一键生成 ptrade 策略代码

ptrade回测中除权除息前后股票价格为何没有变化?

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

问题描述

在代码中添加了除权除息后,股票价格没有变化!

002668.SZ代码除权除息前后最新价不变,2018.7.5的最新价是20.1,2018.7.6除权后最新价仍为20.1。

解决方案

问题原因解析

在 ptrade 量化平台中,如果您发现某只股票在除权除息日(如 002668.SZ 在 2018年7月6日)前后的价格没有发生预期的跳空变化,这通常是因为您在获取历史行情时,使用了复权数据

在调用 get_historyget_price 接口时,有一个关键参数 fq(复权选项)。如果 fq 被设置为 'pre'(前复权)或 'post'(后复权),系统会自动根据除权除息因子对历史价格进行平滑处理,消除因分红、送股等导致的价格缺口。因此,您看到的价格是经过数学调整后的价格,而非当时真实的交易价格。

解决方法

如果您希望看到股票在除权除息日真实的、未经过调整的价格(即包含跳空缺口的价格),您需要在获取行情数据时,将复权参数 fq 设置为 None(不复权)。

示例代码:获取不复权的真实价格

def initialize(context):
    g.security = '002668.SZ'
    set_universe(g.security)

def handle_data(context, data):
    # 获取不复权的历史数据,fq=None
    # 这样在除权除息日,您就能看到真实的价格跳空
    history_data = get_history(5, '1d', 'close', security_list=g.security, fq=None)
    log.info("不复权收盘价:\n%s" % history_data)

进阶:如何获取除权除息的具体信息?

如果您需要在策略中精确知道某只股票在何时发生了除权除息,以及具体的分红、送股比例,ptrade 提供了专门的 API:get_stock_exrights

示例代码:查询除权除息信息

def initialize(context):
    g.security = '002668.SZ'
    set_universe(g.security)

def handle_data(context, data):
    # 获取该股票历史上所有的除权除息信息
    exrights_info = get_stock_exrights(g.security)
    if exrights_info is not None:
        log.info("除权除息信息:\n%s" % exrights_info)

get_stock_exrights 返回的 DataFrame 中包含以下重要字段:

  • bonus_ps: 每股分红
  • allotted_ps: 每股送股
  • rationed_ps: 每股配股
  • exer_forward_a / exer_forward_b: 前复权除权因子

总结

  • 价格不变:是因为使用了前复权(fq='pre')或后复权(fq='post')。
  • 看真实价格:在 get_historyget_price 中设置 fq=None
  • 查分红送股:使用 get_stock_exrights 接口。