我们来设计一些针对A股市场的、相对稳健的可转债量化策略,并用Python举例说明。
可转债的核心特性与策略基础
可转债(Convertible Bond, CB)兼具债性和股性:
- 债性:持有到期可获得本金和利息,提供了一定的下行保护(理论最低价是纯债价值,极端情况除外)。关键指标:纯债价值、到期收益率(YTM)。
- 股性:在特定条件下可以转换为对应公司的股票,提供了上行潜力。关键指标:转股价值、转股溢价率。
稳健的策略通常利用其“下有保底(债性),上不封顶(股性)”的特点,寻找风险收益比较好的投资机会。
几种比较稳健的可转债量化策略模式
以下是一些常见的、相对稳健的策略思路:
1. 双低策略 (Low Price, Low Premium Strategy)
- 逻辑:寻找价格低且转股溢价率低的可转债。
- 低价格意味着距离纯债价值(理论底)较近,下跌空间相对有限。
- 低转股溢价率意味着转债价格与其内在的股票价值(转股价值)偏离较小,股性较强,更容易跟随正股上涨。
- 目标:在控制下行风险的同时,捕捉正股上涨带来的收益。这是目前市场上最流行和广泛认可的策略之一。
- 关键指标:
- 可转债价格 (Price)
- 转股溢价率 (Conversion Premium = (转债价格 - 转股价值) / 转股价值 * 100%)
- 筛选条件 (示例):
- 剔除价格过高(如 > 130元)或过低(如 < 100元,视市场情况调整)的转债。
- 剔除转股溢价率过高(如 > 30%)的转债。
- 计算“双低值” = 转债价格 + 转股溢价率。
- 选择“双低值”最低的一批转债(如前10或前20只)。
- (可选)加入其他过滤条件:剩余期限 > 1年、到期收益率 > 0、市值/成交额(流动性)要求、信用评级等。
- Python 示例 (核心逻辑):
import pandas as pd
# 假设 df 是包含可转债数据的 DataFrame
# 需要列: 'bond_code', 'bond_name', 'price', 'conv_value', 'conv_premium', 'ytm', 'maturity_years', 'rating'
def select_double_low_bonds(df, top_n=20, min_price=100, max_price=130, max_premium=30, min_ytm=0, min_maturity=1):
"""
筛选双低可转债策略的核心逻辑
"""
# 1. 基础过滤
df_filtered = df[
(df['price'] >= min_price) &
(df['price'] <= max_price) &
(df['conv_premium'] <= max_premium) &
(df['ytm'] >= min_ytm) &
(df['maturity_years'] >= min_maturity)
# 可以添加评级、流动性等过滤条件
# (df['rating'].isin(['AA', 'AA+', 'AAA'])) &
# (df['volume'] > some_threshold)
].copy() # 使用 .copy() 避免 SettingWithCopyWarning
# 2. 计算双低值
# 注意:这里的溢价率单位是 %,直接相加时需要注意量纲,常见做法是直接用数值相加
# 例如 Price = 110, Premium = 15 (%), 双低值 = 110 + 15 = 125
df_filtered['double_low_value'] = df_filtered['price'] + df_filtered['conv_premium']
# 3. 排序并选择 Top N
selected_bonds = df_filtered.sort_values(by='double_low_value').head(top_n)
return selected_bonds[['bond_code', 'bond_name', 'price', 'conv_premium', 'double_low_value', 'ytm']]
# --- 模拟数据 ---
data = {
'bond_code': ['128001', '113502', '123018', '110059', '127012'],
'bond_name': ['转债A', '转债B', '转债C', '转债D', '转债E'],
'price': [115.5, 108.2, 125.0, 135.0, 112.0],
'conv_value': [105.0, 100.1, 110.5, 120.0, 95.0],
'ytm': [0.5, 1.2, -0.1, 0.8, 1.5],
'maturity_years': [3.5, 2.1, 4.0, 1.5, 5.0],
'rating': ['AA', 'AA+', 'AAA', 'AA-', 'AA']
}
df_sample = pd.DataFrame(data)
# 计算转股溢价率 (假设 conv_value > 0)
df_sample['conv_premium'] = (df_sample['price'] - df_sample['conv_value']) / df_sample['conv_value'] * 100
# 处理 conv_value <= 0 的情况 (例如设为极大值或NaN)
df_sample.loc[df_sample['conv_value'] <= 0, 'conv_premium'] = float('inf')
# --- 执行策略 ---
selected = select_double_low_bonds(df_sample, top_n=3, max_price=130) # 调整 max_price 看看效果
print("双低策略选债结果:")
print(selected)
2. 低溢价率/折价策略 (Low Premium / Discount Strategy)
- 逻辑:专注于寻找转股溢价率非常低,甚至是负溢价(折价,即转债价格低于转股价值)的可转债。
- 目标:
- 折价转债理论上存在套利空间(买入转债,转股后卖出股票),但实际操作有T+1限制、冲击成本、融券难等问题。
- 更现实的目标是,低溢价/折价意味着转债价格紧密跟随正股,如果看好正股未来表现,买入这类转债能更有效地分享正股上涨收益,且相比直接买股票有债底保护。
- 关键指标:转股溢价率。
- 筛选条件 (示例):
- 选择转股溢价率最低的一批转债(如 < 5% 或 < 0%)。
- (可选)结合正股的基本面或技术面分析(如选择正股处于上升趋势的低溢价转债)。
- (可选)过滤掉临近到期、强赎或回售期的转债,因为这些事件会影响价格。
- (可选)流动性、评级等过滤。
- Python 示例 (核心逻辑):
import pandas as pd
# 假设 df 是包含可转债数据的 DataFrame (同上)
def select_low_premium_bonds(df, top_n=10, max_premium=5, min_maturity=0.5):
"""
筛选低溢价率可转债策略的核心逻辑
"""
# 1. 基础过滤 (可以根据需要添加更多过滤)
df_filtered = df[
(df['conv_premium'] <= max_premium) &
(df['maturity_years'] >= min_maturity) &
(df['conv_value'] > 0) # 确保转股价值有效
# 过滤临近特殊条款触发的转债 (需要额外数据)
# (df['near_call_trigger'] == False) &
# (df['near_put_trigger'] == False)
].copy()
# 2. 排序并选择 Top N
selected_bonds = df_filtered.sort_values(by='conv_premium').head(top_n)
return selected_bonds[['bond_code', 'bond_name', 'price', 'conv_premium', 'conv_value', 'ytm']]
# --- 使用上面的 df_sample 模拟数据 ---
selected_low_prem = select_low_premium_bonds(df_sample, top_n=3, max_premium=15) # 放宽 premium 条件看效果
print("\n低溢价策略选债结果:")
print(selected_low_prem)
3. 高YTM/债底策略 (High YTM / Bond Floor Strategy)
- 逻辑:将可转债视为一种特殊的债券,寻找到期收益率(YTM)较高或价格接近纯债价值的品种。
- 目标:获取相对稳定的票息和到期收益,主要依赖其债性,适合风险偏好较低的投资者。当市场整体下跌或正股表现不佳时,这类转债的抗跌性相对较强。
- 关键指标:
- 到期收益率 (YTM)
- 纯债价值 (Pure Bond Value) - 计算较复杂,通常需要贴现未来现金流。有时用“纯债溢价率 = (转债价格 - 纯债价值) / 纯债价值 * 100%”来衡量。
- 或者简化为:选择价格较低(如100元附近)且YTM为正的转债。
- 筛选条件 (示例):
- 选择YTM最高的一批转债。
- 要求价格不能过高(如 < 115元)。
- 剔除信用评级过低的转债(如 AA- 以下),以防范信用风险。
- (可选)剩余期限不能太短(如 > 1年),以获得足够的时间价值或等待转机。
- (可选)关注回售条款,如果价格低于回售价且满足回售条件,可能带来额外的安全垫或博弈机会(但回售套利空间通常不大且有不确定性)。
- Python 示例 (核心逻辑 - 基于YTM):
import pandas as pd
# 假设 df 是包含可转债数据的 DataFrame (同上)
def select_high_ytm_bonds(df, top_n=10, max_price=115, min_ytm=1.0, min_maturity=1, min_rating='AA-'):
"""
筛选高YTM可转债策略的核心逻辑
"""
# 评级排序字典 (示例)
rating_map = {'AAA': 5, 'AA+': 4, 'AA': 3, 'AA-': 2, 'A+': 1} # 数字越大越好
# 1. 基础过滤
df_filtered = df[
(df['price'] <= max_price) &
(df['ytm'] >= min_ytm) &
(df['maturity_years'] >= min_maturity) &
# 评级过滤 (假设评级是字符串)
(df['rating'].map(rating_map) >= rating_map.get(min_rating, -1)) # .get 提供默认值处理不在map中的评级
].copy()
# 2. 排序并选择 Top N (按 YTM 降序)
selected_bonds = df_filtered.sort_values(by='ytm', ascending=False).head(top_n)
return selected_bonds[['bond_code', 'bond_name', 'price', 'ytm', 'rating', 'maturity_years']]
# --- 使用上面的 df_sample 模拟数据 ---
selected_high_ytm = select_high_ytm_bonds(df_sample, top_n=3, min_ytm=0.5, min_rating='AA') # 调整 ytm 和评级条件
print("\n高YTM策略选债结果:")
print(selected_high_ytm)
数据需求
要实现这些策略,你需要获取以下数据:
- 实时/日频行情数据:
- 转债代码、名称
- 转债价格 (最新价)
- 成交量/成交额 (用于流动性过滤)
- 基本信息 & 计算指标:
- 正股代码、名称
- 正股价
- 转股价
- 转股价值 (需要实时计算:
100 / 转股价 * 正股价
) - 转股溢价率 (需要实时计算)
- 剩余期限
- 到期收益率 (YTM) - 这个计算相对复杂,通常由数据服务商提供或自行实现债券定价模型计算。
- 纯债价值 - 同YTM,计算复杂,依赖于基准利率曲线和信用利差。
- 信用评级
- 回售触发价、强赎触发价 (用于风险提示或特殊策略)
- 发行规模/剩余规模 (用于流动性参考)
数据来源
- 付费数据接口:Wind、同花顺iFinD、东方财富Choice、恒生聚源等(数据全面、准确,适合专业机构或个人)。
- 免费/半免费数据接口:Tushare (有积分限制)、JoinQuant聚宽、米筐RQData等 (提供基础数据,可能需要自己计算部分指标)。
- 财经网站爬虫:如东方财富网、集思录等(需要注意合规性和网站反爬机制,数据清洗工作量大)。
Python实现注意事项
- 数据获取与清洗:使用
requests
,pandas
,akshare
,tushare
等库获取数据,并进行必要的清洗(处理缺失值、异常值、统一格式)。 - 指标计算:确保转股价值、转股溢价率等核心指标计算正确。YTM和纯债价值若自行计算,需掌握债券定价知识。
- 策略回测:使用
backtrader
,zipline
,vnpy
等框架进行历史回测,评估策略的夏普比率、最大回撤、年化收益等指标。这是验证策略有效性的关键步骤。 - 交易执行:可以通过券商提供的API(如华泰、中泰XTP、东方财富LTS等)进行程序化交易,或手动执行。
- 风控管理:
- 分散投资:不要把所有资金投入单个或少数几个转债。持有一定数量(如10-20只)的组合。
- 动态调仓:定期(如每周、每两周或每月)根据策略重新筛选持仓,卖出不符合条件的,买入新符合条件的。
- 止损/止盈:虽然转债有债底保护,但极端情况下也会大跌。可以考虑设置基于组合整体回撤或单个转债价格/溢价率变化的止损/止盈规则(但要小心过于频繁触发)。
- 关注公告:留意转债的强赎、回售、下修转股价等公告,这些可能对策略产生重大影响。
总结
- 双低策略是目前A股市场应用最广、相对稳健且简单有效的可转债策略之一。
- 低溢价/折价策略更侧重于捕捉股性机会,需要对正股有一定判断。
- 高YTM/债底策略更侧重于债性防御,适合低风险偏好者。
选择哪种策略或组合使用,取决于你的风险偏好、市场判断和可投入的研究精力。无论哪种策略,持续的数据维护、严格的回测验证和合理的风险控制都是成功的关键。
免责声明:以上策略仅为示例和思路分享,不构成任何投资建议。金融市场存在风险,投资需谨慎。在实际应用前,请务必进行充分的研究和回测。