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

PTrade 平台如何处理可转债正股除权除息对转股价的影响?(附 Python 源码)

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

问题描述



Title: PTrade 可转债实战:精准处理转股期与除权除息价格调整

Question: 在可转债策略中如何处理正股除权除息对转股价的影响?

解决方案

1. 背景与原理

在可转债量化交易中,转股价值是评估可转债套利空间和债性/股性的核心指标。其计算公式为:
$$\text{转股价值} = \frac{100}{\text{当前转股价}} \times \text{正股当前价格}$$

当正股发生除权除息(如送股、配股、分红)时,正股价格会瞬间下跌。为了保证可转债持有人的利益,上市公司会依据交易所规则向下修正(调整)转股价。如果量化策略未能及时获取最新的转股价,就会导致计算出的转股价值和溢价率出现严重偏差,从而引发错误的交易决策。

在 PTrade 平台中,我们可以通过结合 get_cb_info()(获取可转债最新转股价)和 get_stock_exrights()(获取正股除权除息因子)来精准捕捉和处理这一调整。


2. PTrade 核心 API 介绍

  • get_cb_info():获取可转债基础信息,返回包含 bond_code(可转债代码)、stock_code(正股代码)、convert_price(当前最新转股价)、convert_value(转股价值)等字段的 DataFrame。
  • get_stock_exrights(stock_code, date):获取指定股票在特定日期的除权除息详细信息,包括分红、送股、配股比例及复权因子。

3. 实战策略源码

以下是一个完整的 PTrade 策略示例。该策略在每日盘前(before_trading_start)获取可转债的最新转股价,并在盘中动态监控正股价格,精准计算转股价值,当溢价率低于设定阈值时执行转股或买入套利。

# -*- coding: utf-8 -*-
import pandas as pd
import datetime

def initialize(context):
    # 设置初始资金与操作标的(以恒生电子及相关转债为例,实际需替换为当前存续的可转债)
    g.bond_code = '110033.SS'  # 示例可转债代码
    g.stock_code = '600570.SS' # 对应正股代码
    set_universe([g.bond_code, g.stock_code])
    
    g.convert_price = 0.0
    g.is_convert_period = False

def before_trading_start(context, data):
    # 1. 每日盘前获取可转债最新基础信息与转股价
    try:
        cb_df = get_cb_info()
        if not cb_df.empty:
            # 筛选目标转债
            target_bond = cb_df[cb_df['bond_code'] == g.bond_code]
            if not target_bond.empty:
                # 获取最新调整后的转股价
                g.convert_price = float(target_bond['convert_price'].values[0])
                convert_date_str = target_bond['convert_date'].values[0]
                
                # 判断是否进入转股期
                today_str = context.blotter.current_dt.strftime('%Y-%m-%d')
                g.is_convert_period = today_str >= convert_date_str
                
                log.info(f"今日转债 {g.bond_code} 最新转股价: {g.convert_price}, 是否在转股期: {g.is_convert_period}")
    except Exception as e:
        log.error(f"盘前获取可转债信息失败: {e}")

def handle_data(context, data):
    if g.convert_price <= 0:
        return
        
    # 2. 获取盘中正股与转债的最新价格
    stock_price = data[g.stock_code]['close']
    bond_price = data[g.bond_code]['close']
    
    # 3. 动态计算转股价值与转股溢价率
    # 转股价值 = (100 / 转股价) * 正股价格
    convert_value = (100.0 / g.convert_price) * stock_price
    # 转股溢价率 = (转债价格 - 转股价值) / 转股价值
    premium_rate = (bond_price - convert_value) / convert_value
    
    log.info(f"正股价格: {stock_price:.2f} | 转债价格: {bond_price:.2f} | 实时转股价值: {convert_value:.2f} | 溢价率: {premium_rate*100:.2f}%")
    
    # 4. 交易逻辑:若进入转股期且出现折价(溢价率为负),执行债转股套利
    if g.is_convert_period and premium_rate < -0.01:
        bond_position = get_position(g.bond_code)
        if bond_position.enable_amount >= 10:  # 债转股委托需为10张(1000元面值)的整数倍
            log.info(f"发现折价套利机会,执行债转股申报,数量: {bond_position.enable_amount}")
            # 调用 PTrade 债转股专用函数
            debt_to_stock_order(g.bond_code, bond_position.enable_amount)

4. 关键注意事项

  1. 除权除息日的行情跳空:在正股除权除息日当天,正股开盘价会按照除权公式大幅低开。上市公司通常会在该日同时启用调整后的新转股价。PTrade 的 get_cb_info() 接口数据由柜台和数据服务端实时维护,能确保在交易日盘前获取到当天生效的最新转股价。
  2. 转股申报单位:调用 debt_to_stock_order(security, amount) 进行债转股时,amount 传入的数值为负数(代表卖出/转出债券),且必须是 10张(即面值 1000 元) 的整数倍。
  3. 权限确认get_cb_info() 依赖券商端的可转债基础数据权限。在实盘运行前,请务必与券商确认已开通此 API 的访问权限,避免因返回空 DataFrame 导致策略异常。