3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在可转债量化交易中,转股价值是评估可转债套利空间和债性/股性的核心指标。其计算公式为:
$$\text{转股价值} = \frac{100}{\text{当前转股价}} \times \text{正股当前价格}$$
当正股发生除权除息(如送股、配股、分红)时,正股价格会瞬间下跌。为了保证可转债持有人的利益,上市公司会依据交易所规则向下修正(调整)转股价。如果量化策略未能及时获取最新的转股价,就会导致计算出的转股价值和溢价率出现严重偏差,从而引发错误的交易决策。
在 PTrade 平台中,我们可以通过结合 get_cb_info()(获取可转债最新转股价)和 get_stock_exrights()(获取正股除权除息因子)来精准捕捉和处理这一调整。
get_cb_info():获取可转债基础信息,返回包含 bond_code(可转债代码)、stock_code(正股代码)、convert_price(当前最新转股价)、convert_value(转股价值)等字段的 DataFrame。get_stock_exrights(stock_code, date):获取指定股票在特定日期的除权除息详细信息,包括分红、送股、配股比例及复权因子。以下是一个完整的 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)
get_cb_info() 接口数据由柜台和数据服务端实时维护,能确保在交易日盘前获取到当天生效的最新转股价。debt_to_stock_order(security, amount) 进行债转股时,amount 传入的数值为负数(代表卖出/转出债券),且必须是 10张(即面值 1000 元) 的整数倍。get_cb_info() 依赖券商端的可转债基础数据权限。在实盘运行前,请务必与券商确认已开通此 API 的访问权限,避免因返回空 DataFrame 导致策略异常。