可转债套利基础 — 双低策略
可转债 = 债+期权的复合结构、双低策略源头、为什么散户能在这个市场跑赢
日期: 2026-07-26 方向: Phase 3 / 可转债 阶段: Phase 3: 实盘+规模化+迁移 标签: #ConvertibleBond #DoubleLow #AShare #集思录 #LowPrice #LowPremium #Jisilu
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | 可转债 = 债+期权的复合结构、双低策略源头、为什么散户能在这个市场跑赢 |
| 复盘 | 历史回测(2018-2024 双低年化 15-20%),2021 双低破灭,2024-2026 小盘复兴 |
| 实操 | 集思录数据拉取 + 双低筛选 + 月度 rebalance + 强赎风控完整 Python 模板 |
| 产出 | TR-DAY78 笔记 + convertible_bond_screen.py + <$5k 路径决策 |
一、可转债到底是什么:债 + 期权的复合体
可转债(Convertible Bond,简称「转债」)是个人量化里结构最有意思的资产之一。表面是债,里面藏着一张永远在的看涨期权。
1.1 结构拆解
可转债 = 普通公司债 + 内嵌看涨期权(转股权)
= 「下有保底」(债券属性,到期还本付息)
+ 「上有弹性」(正股涨可以转股,吃 upside)
具体看一个标准发行条款:
| 条款 | 数值(典型) | 含义 |
|---|---|---|
| 票面价值 | ¥100 | 每张面值 |
| 期限 | 6 年 | 到期还本付息 |
| 票面利率 | 第 1 年 0.2% → 第 6 年 2.0% | 阶梯递增,初始非常低 |
| 转股价 | 由初始正股价确定 | 决定转股时拿多少股 |
| 强赎条款 | 正股连续 15/30 个交易日 ≥ 130% 转股价 | 触发后公司可按 ¥100 强制赎回 |
| 回售条款 | 正股连续 30 个交易日 ≤ 70% 转股价 | 持有者可按 ¥100 卖回公司 |
| 下修条款 | 由 2/3 股东大会通过 | 可以下调转股价 |
| 到期赎回价 | 通常 ¥105-115 | 含累计利息 |
四大条款(强赎 / 回售 / 下修 / 到期赎回)就是这个产品的所有戏剧性来源。
1.2 价值组成与「价格 vs 溢价率」
对个人量化最关键的两个数:
转债价格 P — 二级市场报价
转股价值 CV (Conversion Value) = 100 / 转股价 × 正股价
转股溢价率 = (P − CV) / CV × 100%
举个例子:
- 转债 A 价格 ¥102,正股股价 ¥10,转股价 ¥8 → CV = 100/8 × 10 = ¥125
- 溢价率 = (102 − 125)/125 = −18.4%(折价!理论上可以套利)
- 转债 B 价格 ¥115,正股股价 ¥12,转股价 ¥15 → CV = 100/15 × 12 = ¥80
- 溢价率 = (115 − 80)/80 = 43.75%(高溢价,纯期权时间价值)
双低策略的精髓就是同时盯住「转债价格」和「溢价率」两个维度。
二、双低策略:个人量化的「价值投资典范」
2.1 策略定义(最朴素的版本)
入选条件:
1) 转债价格 P < 110 元(票面 100)
2) 转股溢价率 < 20%
3) 剩余存续期 > 6 个月(避免到期挤兑)
4) 评级 ≥ AA-(避免信用风险尾部,可选)
构建:
- 按 「P + 溢价率×100」 升序排列,取 top 20
- 等权持有
- 月度(或双月度)rebalance
风控:
- 触发强赎预警(正股 ≥ 130% 转股价 ≥ 10/15 天)→ 5 个交易日内卖出
- 信用评级下调 → 立即剔除
- 单券权重 ≤ 8%(多 24 只时自动满足)
「P + 溢价率×100」就是经典的双低分数,越低越好。如 P=105 + 溢价率 10% → 双低分 = 115。
2.2 为什么这个粗糙的规则能赚钱
把这个问题拆成结构性 alpha 来源:
| Alpha 来源 | 解释 |
|---|---|
| 下有保底 | P 接近 100 时,最坏情况是持有到期拿回本金+票息,年化亏损非常有限 |
| 上有弹性 | 溢价率低 = 期权 ITM/接近 ITM = 正股每涨 1% 转债约涨 0.8-1% |
| 结构性卖盘 | 一级市场打新中签率 < 0.05%,散户中签后大多 ¥110 上方就抛 → 制造 ¥105-110 的供给堆积 |
| 机构容量限制 | 单只转债日均成交 < ¥5,000 万的大量品种,公募 / 险资进不来 |
| 强赎事件套利 | 公司不想触发强赎或刻意触发,存在博弈空间 |
核心认知:双低策略本质是「用债的保底,换期权的免费 lottery ticket」。如果你能买到一个 ¥105 的转债(保底相当于 95% 本金),而它对应正股的看涨期权还没死透(溢价率 < 20%),那这就是个risk-defined long volatility 仓位。
2.3 用 PM 视角看:这就是「保险 + 期权」组合
如果你在保险公司做过产品,会立刻识别这个结构:
传统保险 = 保费 → 风险池 → 保障(赔付有上限)
转债 = 折价债 → 利息 + 期权 → 不对称收益
双低组合 ≈ 持有一组「便宜的延后看涨期权」
本金保护率 ~95%,期权部分零成本(甚至负成本)
10 年金融 PM 看这个产品的第一反应应该是:为什么国内一级市场能让这种结构以低于内在价值的价格存在? 答案就是上面那张表:结构性卖盘 + 机构容量限制 + 散户偏好 high-flyer。
三、历史业绩与残酷的「双低破灭」事件
3.1 长周期回测数据(中国市场)
集思录、宁稳网、各券商研究所的回测数据基本一致,区别只在细节:
| 时段 | 双低年化 | Sharpe | MaxDD | 沪深 300 对比 | 备注 |
|---|---|---|---|---|---|
| 2018-2020 | ~26% | ~2.0 | ~8% | 沪深 300 同期 ~10% | 黄金时期,几乎闭眼买 |
| 2021 上半 | ~18% | ~1.6 | ~6% | 沪深 300 −7% | 顶峰,规模激增 |
| 2021 下半-2022 | ~3% | ~0.3 | ~22% | 沪深 300 −22% | 双低破灭 |
| 2023 | ~−5% | 负 | ~25% | 沪深 300 −11% | 信用风险爆雷 |
| 2024 | ~12% | ~1.2 | ~10% | 沪深 300 +14% | 小盘双低复兴 |
| 2025-2026H1 | ~15% | ~1.4 | ~9% | 沪深 300 ~+8% | 持续修复 |
长周期合并(2018-2026 H1):年化 ~13-15%,Sharpe ~1.2,MaxDD ~25%。
但平均数掩盖了一个关键事实:这条曲线不是一条平滑上升的线,是「先暴涨 → 突然死掉 → 局部复活」。
3.2 2021 双低破灭:经典「策略 crowding + 监管打击」案例
时间线复盘:
2018-2020:
- 双低策略小众,主要在集思录论坛传播
- 年化 25-30%,Sharpe 2+,几乎没有回撤
- 规模 < ¥50 亿(机构基本不碰)
2021 H1:
- 公募发了第一批「转债增强」基金,规模膨胀到 ¥500 亿+
- 私募也跟进,「转债 + 网格 + T0」成网红策略
- 双低分整体被打到历史低位 → alpha 被吃光
2021 Q3:
- 监管出手:交易所收紧强赎条款执行(之前公司经常「不强赎」让转债继续涨)
- 「不强赎承诺」窗口期从 12 个月缩到 3 个月
- 高溢价转债集体崩盘
2021 Q4 - 2022:
- 信用事件:「搜特转债」「蓝盾转债」等违约或退市
- 双低策略一些券变成「双低 + 信用爆雷」
- 公募从 ¥500 亿一路赎回到 ¥150 亿
- 策略 Sharpe 跌到 0.3,MaxDD ~25%
2023:
- 一批小盘转债退市
- 信用利差扩大,「下有保底」假设被怀疑
- 双低再次跌出散户视野
给个人量化的教训(这一段比策略本身重要):
- 任何公开传播的策略都有半衰期。集思录论坛火了之后 18-24 个月 alpha 衰减 70-90%,这是经验规律。
- 机构进来 = 信号。一旦看到主流公募有 ¥500 亿规模在这个策略上,alpha 大概率被吃干净了。
- 监管是 Black Swan,不是 Grey Swan。强赎规则一改、退市规则一改,整个策略前提就消失了。
- 「下有保底」是个假设,不是公理。当信用违约真的发生,¥85 的「双低券」可以一夜归零。
3.3 2024-2026 双低复兴的细节
不是双低又「死灰复燃」,而是 universe 大幅缩窄后部分小盘转债重新出现 alpha:
2021 顶峰:双低 universe ~150 只
2023 谷底:双低 universe < 30 只(很多被退市/强赎/价格冲破)
2024-2026:双低 universe 维持在 ~50-80 只
特征变化:
- 规模门槛:以前 top 20 等权大约可承载 ¥5-10 亿规模,现在 < ¥1 亿
- AA 以下转债被剔除:信用风险溢价不收(被坑过的散户都学聪明了)
- 盈利转债优先:正股扣非净利 > 0 的优先
- 远离三年内强赎线:转股价距离现价 > 30%
对个人量化(<$5k 即 ¥35k 规模),这条 niche 完全够吃。这是「规模劣势 = alpha 来源」的典型案例。
四、数据源:集思录 vs AKShare vs Wind
4.1 数据源对比
| 数据源 | 数据全面性 | 实时性 | 历史深度 | 成本 | 个人量化适用 |
|---|---|---|---|---|---|
| 集思录 (jisilu.cn) | ✓✓ 双低分预算好 / 强赎倒计时全 | 准实时 | 2010+ | 免费(爬虫可控) | ✓✓✓ 首选 |
| AKShare | ✓ 基础字段全 | T+1 | 2010+ | 免费 | ✓✓ 备份 |
| 东方财富 | ✓ 实时报价 | 实时 | 2015+ | 免费 | ✓ 实时报价补充 |
| Wind / iFind | ✓✓✓ 顶配 | 实时 | 全 | 付费 ¥3-5 万/年 | ✗ 不必要 |
| Tushare Pro | ✓ 基础全 | T+1 | 2010+ | 积分制(多数免费) | ✓ |
我们的方案:集思录 + AKShare 双数据源。集思录用于双低分排序,AKShare 用作字段校验和历史回测。
4.2 集思录的核心字段(爬下来必有的)
| 字段 | 含义 |
|---|---|
bond_id | 转债代码(如 113008) |
bond_nm | 转债名称 |
stock_cd | 正股代码 |
price | 当前转债价格 |
convert_price | 转股价 |
stock_price | 正股价 |
convert_value | 转股价值 |
premium_rt | 转股溢价率(%) |
dblow | 双低分(集思录已算好) |
force_redeem | 强赎触发标志 / 倒计时 |
year_left | 剩余年限 |
rating_cd | 信用评级 |
volume | 日成交额 |
五、完整策略实现:convertible_bond_screen.py
下面是一个可直接跑的最小版本。生产用还要加更多风控(强赎倒计时、停牌、新券保护期)。
# convertible_bond_screen.py
"""
双低可转债筛选器
数据源:集思录公开 JSON
逻辑:取价格 < 110 且溢价率 < 20%,按双低分排序 top N,等权持有,月度 rebalance
"""
import requests
import pandas as pd
from datetime import datetime
from typing import List, Optional
JISILU_URL = "https://www.jisilu.cn/data/cbnew/cb_list_new/"
HEADERS = {
"User-Agent": "Mozilla/5.0",
# 个人非商业研究用,遵守集思录 robots,加充足 sleep
}
def fetch_jisilu_data() -> pd.DataFrame:
"""拉取集思录全部转债数据。"""
resp = requests.get(JISILU_URL, headers=HEADERS, timeout=15)
resp.raise_for_status()
payload = resp.json()
rows = payload.get("rows", [])
records = [r["cell"] for r in rows]
df = pd.DataFrame(records)
# 类型转换
numeric_cols = ["price", "convert_price", "sprice", "convert_value",
"premium_rt", "dblow", "year_left", "volume",
"curr_iss_amt"]
for c in numeric_cols:
if c in df.columns:
df[c] = pd.to_numeric(df[c], errors="coerce")
return df
def screen_double_low(
df: pd.DataFrame,
price_max: float = 110.0,
premium_max: float = 20.0,
year_left_min: float = 0.5,
rating_min: str = "AA-",
issue_amt_min: float = 1.0, # 亿元
exclude_force_redeem: bool = True,
top_n: int = 20,
) -> pd.DataFrame:
"""按双低标准筛选并取 top N。"""
valid_ratings = {"AAA", "AA+", "AA", "AA-"}
if rating_min == "AA":
valid_ratings = {"AAA", "AA+", "AA"}
elif rating_min == "AA+":
valid_ratings = {"AAA", "AA+"}
f = df.copy()
f = f[f["price"] < price_max]
f = f[f["premium_rt"] < premium_max]
f = f[f["year_left"] > year_left_min]
if "rating_cd" in f.columns:
f = f[f["rating_cd"].isin(valid_ratings)]
if "curr_iss_amt" in f.columns:
f = f[f["curr_iss_amt"] >= issue_amt_min]
if exclude_force_redeem and "force_redeem" in f.columns:
# 进入强赎倒计时的剔除(即将被赎回,下行风险大)
f = f[~f["force_redeem"].astype(str).str.contains("强赎", na=False)]
# 计算双低分(若集思录已给则用,否则自算)
if "dblow" in f.columns and f["dblow"].notna().any():
f["score"] = f["dblow"]
else:
f["score"] = f["price"] + f["premium_rt"]
f = f.sort_values("score", ascending=True).head(top_n).reset_index(drop=True)
return f
def build_portfolio(
candidates: pd.DataFrame,
capital_rmb: float,
min_face: int = 1000, # 1 张 = ¥1000 起
) -> pd.DataFrame:
"""等权构建组合。考虑「1 张起买」约束。"""
if candidates.empty:
return pd.DataFrame()
n = len(candidates)
target_per = capital_rmb / n
rows = []
for _, r in candidates.iterrows():
# 1 张 = 10 张面值 = ¥1000 票面 × 当前价/100
price_per_unit = r["price"] * 10 # 1 张 (10 张面值) 报价
# 实际买卖以「张」为单位,每张 10 张面值 × 当前价 × 0.01 = 价格 × 10 / 100 = ?
# 集思录 price 已是「每 100 票面价」报价,所以 1 张实际花费 = price * 10
n_unit = max(1, int(target_per // price_per_unit))
cost = n_unit * price_per_unit
rows.append({
"bond_id": r["bond_id"],
"bond_nm": r["bond_nm"],
"price": r["price"],
"premium_rt": r["premium_rt"],
"score": r["score"],
"year_left": r["year_left"],
"n_unit": n_unit,
"cost_rmb": cost,
"weight": cost / capital_rmb,
})
return pd.DataFrame(rows)
def force_redeem_warning(df: pd.DataFrame, stock_price_threshold: float = 1.30) -> pd.DataFrame:
"""强赎风险预警:正股价 / 转股价 ≥ 1.30 视为接近强赎线。"""
if df.empty:
return df
out = df.copy()
out["redeem_ratio"] = out["sprice"] / out["convert_price"]
out["redeem_risk"] = out["redeem_ratio"] >= stock_price_threshold
return out[out["redeem_risk"]]
def main(capital_rmb: float = 35000) -> None:
print(f"[{datetime.now():%Y-%m-%d %H:%M}] Fetching Jisilu data...")
df = fetch_jisilu_data()
print(f" Total CBs: {len(df)}")
candidates = screen_double_low(df, top_n=20)
print(f" Double-low candidates: {len(candidates)}")
print(candidates[["bond_id", "bond_nm", "price", "premium_rt",
"score", "year_left"]].to_string(index=False))
portfolio = build_portfolio(candidates, capital_rmb=capital_rmb)
print("\n Suggested portfolio:")
print(portfolio.to_string(index=False))
print(f"\n Total cost: ¥{portfolio['cost_rmb'].sum():,.0f}")
print(f" Cash remaining: ¥{capital_rmb - portfolio['cost_rmb'].sum():,.0f}")
warnings = force_redeem_warning(candidates)
if not warnings.empty:
print("\n [!] Force redeem warning:")
print(warnings[["bond_id", "bond_nm", "sprice",
"convert_price", "redeem_ratio"]].to_string(index=False))
if __name__ == "__main__":
main()
5.1 月度 rebalance 的小细节
- 不要每天调:日间波动小,频繁换券吃掉手续费(券商佣金 ~0.05%,最低 ¥1/张)和买卖价差
- 触发式调仓:发现某券进入强赎倒计时 → 立刻减仓,不等月底
- 缓冲区:双低分排名进 top 30 之外才剔出,避免「踩边界反复换券」
- 新券保护期:上市 < 30 天的新券默认不入选(流动性和定价混乱)
5.2 强赎风控的具体做法
# 强赎触发条件(典型):正股连续 15/30 交易日 ≥ 130% 转股价
# 一旦触发,公司公告后 ~30 天内必须按 ¥100 + 累计利息赎回
# 所以你必须在公告后 5 个交易日内卖出(流动性还在 + 价格还未跌到 ¥100)
if 'force_redeem_days' in cb and cb['force_redeem_days'] >= 10:
# 触发线 90% 已经走到,准备退出
action = 'SELL'
elif cb['stock_price'] / cb['convert_price'] >= 1.30:
# 已经在触发区间,但不一定会真的强赎
action = 'MONITOR'
else:
action = 'HOLD'
六、<$5k 的可行性分析
6.1 资金路径
$5,000 ≈ ¥35,000(按 1 USD ≈ 7 RMB)
1 张转债面值 = ¥1,000,市价约 ¥1,000-1,150(双低券价格 < 110)
1 张实际买入 ≈ ¥1,050 平均
¥35,000 / ¥1,050 ≈ 33 张
top 20 等权 → 每只 ~1.5 张
可行:是
分散度:每只 1-2 张,已经够双低策略需要的分散
6.2 账户问题
关键限制:A 股可转债只能国内券商账户交易,IBKR、富途国际、老虎国际都不支持(富途/老虎港版可买港股转债,但 universe 极小且没双低 alpha)。
| 通道 | 可行性 | 备注 |
|---|---|---|
| 国内券商账户 + ¥35k 入金 | ✓ 最直接 | 中信、华泰、中泰均可,新户开通 5 分钟 |
| 富途中国 / 老虎中国 | ✗ | 都不做 A 股转债 |
| QFII / RQFII | ✗ | 个人不开放 |
| 香港中介穿透 | ✗ | 合规问题 |
所以这个策略路径是「中国大陆居民独占机会」——既是 alpha 来源(机构容量限制),也是劣势(不能跨境扩展)。
6.3 与美股策略的资金配置
| 资产 | 比例(建议) | 理由 |
|---|---|---|
| IBKR Paper / 实盘小仓位(美股+期权) | 50% | 主路径,可扩展性强 |
| 国内券商 / 双低转债 | 30% | 独立 alpha,与美股低相关 |
| 现金 / 货币基金缓冲 | 20% | 应急 + 等待机会 |
两条腿走路:美股+期权追求技能可迁移性(90 天后可以扩到 $50k),双低转债追求当下确定性 alpha(容量小但 Sharpe 高)。
七、几个容易被新手忽略的坑
7.1 「下有保底」是有前提的
- 公司不违约:信用评级 AA- 以下要慎重
- 公司不退市:正股 ST 后的转债流动性可能消失
- 监管不修改规则:2024 年退市新规导致一批小盘转债剧烈波动
7.2 双低分相同的两张转债,差别可能很大
- 一张是「价格 105 + 溢价率 5%」(贴近转股价,对正股敏感)
- 一张是「价格 95 + 溢价率 15%」(深度 OTM,纯债性 + 弱期权)
后者在熊市更抗跌,前者在牛市弹性大。两类要混着配,不要只挑分最低的。
7.3 流动性陷阱
- 单只日成交 < ¥500 万的转债,¥35k 资金虽然进得去,但要分批
- 不要用市价单(A 股转债日内涨跌幅 20%,市价单的滑点可以非常大)
- 用限价单 + 中间价(midpoint),耐心等成交
7.4 集思录数据更新延迟
- 集思录的双低分通常 T+1 更新
- 实盘下单前应该用券商行情确认当前价格
- 不要直接照集思录的 dblow 排名下单(可能已过时 1 天)
八、PM 视角:双低策略给我的三个迁移性教训
8.1 「保险 + 期权」是普适的不对称结构
任何能拆解成「下方有底 + 上方有弹性」的资产都值得研究:
- 可转债:债底 + 转股期权
- 高股息股票 + 期权对冲:股息底 + 期权 hedge
- 锚定稳定币的 LP:本金 + 部分手续费 yield
- 一些 RWA 产品:本金 + 利率敞口
PM 在金融产品设计里见过太多这种结构,反过来用在量化上完全成立。
8.2 容量限制 = 结构性 alpha 来源
很多策略不是「不存在 alpha」,而是「机构进不来」。例子:
- A 股双低转债(¥1 亿规模就饱和)
- 小盘新股套利(容量 < ¥500 万)
- 美股低流动性期权 Wheel(容量 < $1M)
个人量化的优势就是规模小。不要试图模仿对冲基金的策略,要找对冲基金「看不上 / 进不去」的策略。
8.3 公开传播 ≠ 死亡,但快速 crowding 必然发生
集思录论坛 2018 年开始传播双低,2020-2021 达到顶峰,2022 崩盘。Half-life ~24 个月。
迁移到其他公开策略:
- 美股 Wheel:传播 2-3 年,2024 年后规模化已经把 alpha 打掉一半
- Volatility Targeting ETF:传播 5 年,alpha 接近零
- 0DTE 期权卖方:传播 2 年,2024 年开始普及
结论:任何在 Reddit / Twitter / 集思录上能直接搜到完整方法的策略,都要预设 18-24 个月内 alpha 衰减 70%。Edge 来自三类——更深的领域知识、更好的执行、更小的容量——这三类都是不能简单复制粘贴的。
九、明日预告
Day 79: A 股回测的特殊坑 — 涨跌停 / T+1 / 停复牌 / 退市 / 分红除权
明天会用今天的双低策略做完整回测,但重点不是策略本身,而是 A 股回测特有的陷阱:
- 涨跌停板:信号触发但买不到怎么办(survivorship bias 的反面)
- T+1:今天买的不能今天卖,回测如果忽略会高估 10%+
- 停牌:长期停牌的转债价格如何处理(停牌前 vs 复牌后)
- 退市:搜特、蓝盾这种最后归零,回测里必须有「退市处理」逻辑
- 分红除权:转债不分红但正股分红会导致转股价调整(除权日的不连续)
- 强赎计算:触发后是按 ¥100 还是按现价结算
这些坑任何一个忽略都会让回测年化高估 5-10%。
实际执行记录
启动一项填一项,时间戳 + 卡点。
- [hh:mm] 集思录数据拉取测试 — ...
- [hh:mm] 双低筛选输出 top 20 — ...
- [hh:mm] 模拟组合构建(¥35k)— ...
- [hh:mm] 强赎风险预警跑通 — ...
- [hh:mm] 决策:是否开国内券商账户 + 投入比例 — ...
- 卡点 / 学到的:
总字数:约 6,400 字 今日完成度:理论 ✓ / 策略实现 ✓ / 历史复盘 ✓ / 实操(待执行)/ 笔记 ✓