🚀 AI 一键生成 ptrade 策略代码

PTrade 可转债高级策略:如何通过 debt_to_stock_order API 实现自动债转股?

ptrade | 发布时间: 2025/11/28
以下内容由 EasyQuant 生成。

问题描述

如何编写一个策略,将持有的可转债转换成股票?

解决方案

在PTrade中,将持有的可转债转换成股票(债转股),主要使用的是交易函数 debt_to_stock_order

以下是关于该函数的详细说明及完整的策略代码示例。

核心函数说明

debt_to_stock_order(security, amount)

  • security: 可转债代码(字符串,如 '110077.SS')。
  • amount: 委托数量(整数)。注意:此处必须填负数,表示将转债“转出”并换成股票。例如,转股10张,应填 -10
  • 适用范围: 仅在交易模式(实盘或模拟盘)可用,回测模式下通常用于模拟逻辑。

策略代码示例

以下是一个完整的策略示例。该策略的逻辑是:

  1. 在初始化中设置要操作的可转债代码。
  2. 在盘中运行时,检查账户是否持有该可转债。
  3. 如果持有,则调用 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)

注意事项

  1. 数量符号debt_to_stock_orderamount 参数必须是负数
  2. 转股期:请确保该可转债处于转股期内。未进入转股期的转债无法转换,委托会失败。
  3. 最小单位:通常转股的最小单位是1张(面值100元),但部分券商或柜台可能要求10张起转,具体请参考PTrade连接的柜台规则。
  4. 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: 常见原因包括:

  1. 转债未进入转股期。
  2. 委托数量不是负数。
  3. 账户内没有足额的转债持仓。
  4. 非交易时间申报(部分券商要求交易时间段内申报)。