问题描述
解决方案
在PTrade中,将持有的可转债转换成股票(债转股),主要使用的是交易函数 debt_to_stock_order。
以下是关于该函数的详细说明及完整的策略代码示例。
核心函数说明
debt_to_stock_order(security, amount)
- security: 可转债代码(字符串,如
'110077.SS')。 - amount: 委托数量(整数)。注意:此处必须填负数,表示将转债“转出”并换成股票。例如,转股10张,应填
-10。 - 适用范围: 仅在交易模式(实盘或模拟盘)可用,回测模式下通常用于模拟逻辑。
策略代码示例
以下是一个完整的策略示例。该策略的逻辑是:
- 在初始化中设置要操作的可转债代码。
- 在盘中运行时,检查账户是否持有该可转债。
- 如果持有,则调用
debt_to_stock_order将所有持仓进行转股。
def initialize(context):
"""
初始化函数
"""
# 设定要操作的可转债代码,例如:113050.SS (南银转债)
# 请注意后缀:上海为.SS,深圳为.SZ
g.bond_code = '113050.SS'
# 设置股票池(虽然转股不需要行情驱动,但设置universe是好习惯)
set_universe(g.bond_code)
# 设置一个标志位,防止重复报单(可选)
g.converted = False
def handle_data(context, data):
"""
盘中运行函数,根据频率(分钟或日线)运行
"""
# 如果已经执行过转股,则不再执行
if g.converted:
return
# 获取当前可转债的持仓信息
position = get_position(g.bond_code)
# 检查持仓数量
# position.amount 包含当前总持仓
# position.enable_amount 包含当前可用持仓
current_amount = position.enable_amount
# 如果持有数量大于0,则执行转股
if current_amount > 0:
log.info("检测到持有可转债: %s, 数量: %s, 准备进行转股..." % (g.bond_code, current_amount))
# 调用债转股接口
# 注意:amount必须为负数
order_id = debt_to_stock_order(g.bond_code, -current_amount)
if order_id:
log.info("转股委托已发送,订单ID: %s" % order_id)
g.converted = True
else:
log.error("转股委托发送失败")
else:
log.info("当前未持有可转债 %s,无法转股" % g.bond_code)
进阶:基于溢价率的套利转股策略
如果你希望编写一个更智能的策略,比如当转股溢价率为负(即转股价值高于转债价格,存在套利空间)时才转股,可以使用以下逻辑:
def initialize(context):
# 设置可转债代码
g.bond_code = '113050.SS'
# 对应的正股代码(需要手动查询或通过get_cb_info获取)
g.stock_code = '601009.SS'
set_universe([g.bond_code, g.stock_code])
def handle_data(context, data):
# 1. 获取可转债基础信息(包含转股价)
# 注意:get_cb_info 返回的是所有转债信息的DataFrame,需要筛选
cb_info = get_cb_info()
if cb_info is None or cb_info.empty:
return
# 筛选出当前转债的信息
# 注意:不同版本的pandas语法略有不同,这里使用通用逻辑
target_bond = cb_info[cb_info['bond_code'] == g.bond_code[:6]]
if target_bond.empty:
log.info("未找到转债基础信息")
return
# 获取转股价
convert_price = float(target_bond.iloc[0]['convert_price'])
# 2. 获取当前价格
bond_price = data[g.bond_code]['close']
stock_price = data[g.stock_code]['close']
# 3. 计算转股价值 = (转债面值100 / 转股价) * 正股价格
convert_value = (100.0 / convert_price) * stock_price
# 4. 计算溢价率 = (转债价格 - 转股价值) / 转股价值
premium_rate = (bond_price - convert_value) / convert_value
# 5. 判断逻辑:如果溢价率小于某个阈值(例如 -1%,即负溢价),则进行转股
if premium_rate < -0.01:
position = get_position(g.bond_code)
if position.enable_amount > 0:
log.info("出现负溢价,溢价率: %.2f%%,执行转股" % (premium_rate * 100))
debt_to_stock_order(g.bond_code, -position.enable_amount)
注意事项
- 数量符号:
debt_to_stock_order的amount参数必须是负数。 - 转股期:请确保该可转债处于转股期内。未进入转股期的转债无法转换,委托会失败。
- 最小单位:通常转股的最小单位是1张(面值100元),但部分券商或柜台可能要求10张起转,具体请参考PTrade连接的柜台规则。
- T+0/T+1:
- 可转债买入是T+0交易。
- 转股操作通常是T日申请,T+1日股票到账并可卖出。这意味着你当天转股后,股票不能当天卖出。
Q&A
Q: debt_to_stock_order 函数在回测中有效吗?
A: 该函数主要设计用于交易模块(实盘或仿真)。在纯回测模式下,PTrade的撮合引擎可能不完全支持复杂的债转股清算逻辑(如T+1到账),建议主要在交易环境中使用。如果在回测中需要模拟,可以直接卖出转债并买入对应价值的股票来近似模拟。
Q: 如何查询转股是否成功?
A: 可以通过 get_orders() 查看委托状态,或者在第二天通过 get_position(正股代码) 查看股票持仓是否增加。
Q: 为什么我的转股委托变成了“废单”?
A: 常见原因包括:
- 转债未进入转股期。
- 委托数量不是负数。
- 账户内没有足额的转债持仓。
- 非交易时间申报(部分券商要求交易时间段内申报)。