3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
双低可转债策略(即“低价格 + 低溢价率”)是一种兼具安全边际与进攻弹性的低风险量化交易策略。在 ptrade 量化交易平台中,通过 get_cb_info() API 可以方便地实时获取全市场可转债的转股溢价率等关键基础数据,结合行情快照或历史数据即可快速构建双低轮动模型。
双低指标通常定义为:
$$\text{双低值} = \text{可转债现价} + \text{转股溢价率} \times 100$$
例如:某可转债价格为 105 元,转股溢价率为 12%,则其双低值为 $105 + 12 = 117$。双低值越低,说明该债券防御性越强(价格低)且正股跟随弹性越好(溢价率低)。
get_cb_info():获取可转债基础信息,返回包含 bond_code、premium_rate(溢价率)、convert_value(转股价值)等字段的 DataFrame。get_snapshot(security):获取可转债的最新市场价格(last_px)。order_target(security, amount) / order(security, amount):进行买卖下单,可转债委托单位为“张”(按10张整倍数调整)。以下策略展示了如何在每个交易日盘前/定时筛选双低值最低的前 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
limit_price)时务必注意四舍五入保留精度。