返回交易笔记
TR Day 78

可转债套利基础 — 双低策略

可转债 = 债+期权的复合结构、双低策略源头、为什么散户能在这个市场跑赢

2026-07-26
Phase 3: 实盘+规模化+迁移
ConvertibleBondDoubleLowAShare集思录LowPriceLowPremiumJisilu

日期: 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 长周期回测数据(中国市场)

集思录、宁稳网、各券商研究所的回测数据基本一致,区别只在细节:

时段双低年化SharpeMaxDD沪深 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:
  - 一批小盘转债退市
  - 信用利差扩大,「下有保底」假设被怀疑
  - 双低再次跌出散户视野

给个人量化的教训(这一段比策略本身重要):

  1. 任何公开传播的策略都有半衰期。集思录论坛火了之后 18-24 个月 alpha 衰减 70-90%,这是经验规律。
  2. 机构进来 = 信号。一旦看到主流公募有 ¥500 亿规模在这个策略上,alpha 大概率被吃干净了。
  3. 监管是 Black Swan,不是 Grey Swan。强赎规则一改、退市规则一改,整个策略前提就消失了。
  4. 「下有保底」是个假设,不是公理。当信用违约真的发生,¥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+12010+免费✓✓ 备份
东方财富✓ 实时报价实时2015+免费✓ 实时报价补充
Wind / iFind✓✓✓ 顶配实时付费 ¥3-5 万/年✗ 不必要
Tushare Pro✓ 基础全T+12010+积分制(多数免费)

我们的方案:集思录 + 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 字 今日完成度:理论 ✓ / 策略实现 ✓ / 历史复盘 ✓ / 实操(待执行)/ 笔记 ✓