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

如何在 ptrade 中利用 get_cb_info 筛选并轮动双低可转债?(附 Python 完整源码)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 可转债实战:双低(价格+溢价率)轮动策略开发

Question: 如何在 ptrade 中利用 get_cb_info 筛选并轮动双低可转债?

解决方案

如何在 ptrade 中利用 get_cb_info 筛选并轮动双低可转债?

双低可转债策略(即“低价格 + 低溢价率”)是一种兼具安全边际与进攻弹性的低风险量化交易策略。在 ptrade 量化交易平台中,通过 get_cb_info() API 可以方便地实时获取全市场可转债的转股溢价率等关键基础数据,结合行情快照或历史数据即可快速构建双低轮动模型。


一、双低策略指标计算公式

双低指标通常定义为:
$$\text{双低值} = \text{可转债现价} + \text{转股溢价率} \times 100$$

例如:某可转债价格为 105 元,转股溢价率为 12%,则其双低值为 $105 + 12 = 117$。双低值越低,说明该债券防御性越强(价格低)且正股跟随弹性越好(溢价率低)。


二、核心 API 说明

  1. get_cb_info():获取可转债基础信息,返回包含 bond_codepremium_rate(溢价率)、convert_value(转股价值)等字段的 DataFrame。
  2. get_snapshot(security):获取可转债的最新市场价格(last_px)。
  3. order_target(security, amount) / order(security, amount):进行买卖下单,可转债委托单位为“张”(按10张整倍数调整)。

三、ptrade 双低轮动策略完整源码

以下策略展示了如何在每个交易日盘前/定时筛选双低值最低的前 N 只可转债,并在盘中调仓轮动:

import pandas as pd
import numpy as np

def initialize(context):
    # 设置调仓持债数量
    g.hold_count = 5
    # 定时每日 09:35 执行调仓轮动
    run_daily(context, rebalance, time='09:35')

def get_double_low_bonds(context):
    # 1. 获取可转债基础信息
    df_cb = get_cb_info()
    if df_cb is None or df_cb.empty:
        log.warn('获取可转债基础数据失败')
        return []
    
    bond_list = df_cb['bond_code'].tolist()
    
    # 2. 获取实时行情价格
    snapshots = get_snapshot(bond_list)
    if not snapshots:
        return []
    
    prices = {}
    for code, snap in snapshots.items():
        # 剔除停牌或无价格标的
        if snap and snap.get('last_px', 0) > 0:
            prices[code] = snap['last_px']
            
    df_cb['price'] = df_cb['bond_code'].map(prices)
    # 过滤掉无法获取价格的债券
    df_cb = df_cb.dropna(subset=['price'])
    
    # 3. 过滤高价/高溢价率债券,控制风险(如价格<130,溢价率<50%)
    df_filter = df_cb[(df_cb['price'] < 130) & (df_cb['premium_rate'] < 50)].copy()
    
    # 4. 计算双低得分:现价 + 溢价率 * 100
    df_filter['double_low'] = df_filter['price'] + df_filter['premium_rate'] * 100
    
    # 5. 按双低值升序排序并取前 N 只
    df_sorted = df_filter.sort_values(by='double_low', ascending=True)
    target_bonds = df_sorted.head(g.hold_count)['bond_code'].tolist()
    
    return target_bonds

def rebalance(context):
    # 获取最新筛选出的目标双低可转债
    target_bonds = get_double_low_bonds(context)
    if not target_bonds:
        log.info('今日无符合条件的目标可转债')
        return
    
    log.info('今日目标持仓转债: %s' % target_bonds)
    
    # 1. 卖出不在目标列表中的持仓
    current_positions = context.portfolio.positions
    for symbol, pos in list(current_positions.items()):
        if symbol not in target_bonds and pos.amount > 0:
            order_target(symbol, 0)
            log.info('卖出调出转债: %s' % symbol)
            
    # 2. 均分资金买入目标转债
    cash = context.portfolio.cash
    if len(target_bonds) > 0 and cash > 0:
        value_per_bond = cash / len(target_bonds)
        for symbol in target_bonds:
            # 可转债下单按张计(每张面值约100,买入价值对应张数,并按10张取整)
            snap = get_snapshot(symbol)
            price = snap.get(symbol, {}).get('last_px', 100)
            if price > 0:
                amount = int(value_per_bond / price / 10) * 10
                if amount >= 10:
                    order(symbol, amount)
                    log.info('买入转债 %s, 数量: %d 张' % (symbol, amount))

def handle_data(context, data):
    pass

四、实战注意事项与优化建议

  1. 小数点精度控制:可转债下单价格支持 3 位小数,使用限价单(limit_price)时务必注意四舍五入保留精度。
  2. 黑名单与强赎过滤:强烈建议在筛选逻辑中剔除剩余年限过短(如<0.5年)、已发布强赎公告的标的,避免回撤风险。
  3. 调仓频率控制:可转债支持 T+0 交易,但频繁轮动会增加交易手续费,通常建议设置每周或按固定双低阈值差进行触发式调仓。