Skip to content

可转债定价模型 ​

💰 可转债 = 债券 + 期权 —— 理解这一定价原理,你就知道为什么可转债是"下有保底、上不封顶"。

🎯 可转债的本质 ​

📐 资产组成 ​

可转债价值 = 纯债价值 + 期权价值
            ────────   ────────
            "债底"      "股性"
组成部分含义特性
纯债价值(债底)作为债券的还本付息价值保底,下限
期权价值(股性)转股期权的价值跟随正股
回售价值回售条款触发时的价格兜底保护
赎回价值赎回条款触发时的价格发行人保护

📊 价值范围 ​

回售价值 ≤ 纯债价值 ≤ 可转债价格 ≤ 赎回价值
                 ↑
              (理论最低)   (理论最高)

🔧 定价方法 ​

1. 现金流贴现(DCF) ​

公式 ​

纯债价值 = ∑ CF_t / (1 + r)^t + 票面 / (1 + r)^n

其中:

  • CF_t = 第 t 期现金流(利息)
  • r = 贴现率(同期限国债收益率 + 信用利差)
  • n = 剩余期限

实战代码 ​

python
def bond_value(face, coupon_rate, yield_rate, years):
    """纯债价值计算"""
    pv = 0
    for t in range(1, years + 1):
        coupon = face * coupon_rate  # 年利息
        if t < years:
            pv += coupon / (1 + yield_rate) ** t
        else:
            # 最后一期:利息 + 本金
            pv += (coupon + face) / (1 + yield_rate) ** t
    return pv

# 示例:100 元面值,0.5% 票息,3% 贴现率,5 年
bv = bond_value(100, 0.005, 0.03, 5)
print(f"纯债价值: {bv:.2f} 元")

2. Black-Scholes 期权定价 ​

公式 ​

C = S × N(d1) - K × e^(-rT) × N(d2)

d1 = [ln(S/K) + (r + σ²/2)T] / (σ × √T)
d2 = d1 - σ × √T

其中:

  • S = 正股现价
  • K = 转股价
  • T = 剩余期限(年)
  • r = 无风险利率
  • σ = 正股波动率
  • N() = 累积正态分布

实战代码 ​

python
import numpy as np
from scipy.stats import norm

def bs_call(S, K, T, r, sigma):
    """BS 模型计算认购期权价值"""
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    C = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
    return C

# 示例:腾讯股价 350,转股价 380,1 年期,无风险利率 3%,波动率 30%
call = bs_call(350, 380, 1, 0.03, 0.30)
print(f"认购期权价值: {call:.2f} 元")

3. 可转债完整定价 ​

可转债价值 = 纯债价值 + 认购期权价值
           + 赎回条款调整
           - 回售条款调整
           + 转股价格下调期权价值

完整 Python 实现 ​

python
import numpy as np
from scipy.stats import norm

class ConvertibleBondPricer:
    """可转债定价器"""
    
    def __init__(self, face, coupon_rate, conversion_ratio,
                 call_price, put_price, years_to_maturity,
                 risk_free_rate, credit_spread, stock_price,
                 conversion_price, stock_volatility):
        self.face = face                    # 票面价值
        self.coupon_rate = coupon_rate      # 票息率
        self.conversion_ratio = conversion_ratio  # 转股比例
        self.call_price = call_price        # 赎回价
        self.put_price = put_price          # 回售价
        self.years = years_to_maturity      # 剩余期限
        self.r = risk_free_rate + credit_spread  # 贴现率
        self.S = stock_price                # 正股价
        self.K = conversion_price           # 转股价
        self.sigma = stock_volatility       # 正股波动率
    
    def bond_value(self):
        """纯债价值"""
        pv = 0
        for t in range(1, self.years + 1):
            cf = self.face * self.coupon_rate
            if t < self.years:
                pv += cf / (1 + self.r) ** t
            else:
                pv += (cf + self.face) / (1 + self.r) ** t
        return pv
    
    def bs_call(self):
        """BS 期权价值"""
        if self.years <= 0:
            return max(self.S - self.K, 0) * self.conversion_ratio
        d1 = (np.log(self.S / self.K) + (self.r + 0.5 * self.sigma**2) * self.years) / (self.sigma * np.sqrt(self.years))
        d2 = d1 - self.sigma * np.sqrt(self.years)
        return (self.S * norm.cdf(d1) - self.K * np.exp(-self.r * self.years) * norm.cdf(d2)) * self.conversion_ratio
    
    def total_value(self):
        """可转债总价值"""
        bond = self.bond_value()
        call = self.bs_call()
        # 简化:暂不考虑赎回/回售/下修条款
        return bond + call

# ====== 实战示例 ======
pricer = ConvertibleBondPricer(
    face=100,                # 100 元面值
    coupon_rate=0.005,        # 0.5% 票息
    conversion_ratio=1,       # 1 张转 1 股
    call_price=103,           # 赎回价 103 元
    put_price=101,           # 回售价 101 元
    years_to_maturity=5,      # 5 年期
    risk_free_rate=0.025,     # 2.5% 无风险
    credit_spread=0.02,      # 2% 信用利差
    stock_price=12,           # 正股 12 元
    conversion_price=10,      # 转股价 10 元
    stock_volatility=0.30     # 30% 波动率
)

print(f"纯债价值: {pricer.bond_value():.2f} 元")
print(f"期权价值: {pricer.bs_call():.2f} 元")
print(f"可转债总价值: {pricer.total_value():.2f} 元")

📊 二叉树定价 ​

📐 原理 ​

把可转债有效期分成 N 期,每期股价按上涨/下跌两个方向变动,递归计算每个节点的期权价值。

🔧 Python 实现 ​

python
import numpy as np

def binomial_cb_pricer(S, K, T, r, sigma, n_steps, face, coupon_rate):
    """二叉树可转债定价"""
    dt = T / n_steps
    u = np.exp(sigma * np.sqrt(dt))   # 上涨因子
    d = 1 / u                        # 下跌因子
    p = (np.exp(r * dt) - d) / (u - d)  # 上涨概率
    
    # 构造股价树
    stock_tree = np.zeros((n_steps + 1, n_steps + 1))
    for i in range(n_steps + 1):
        for j in range(i + 1):
            stock_tree[j, i] = S * (u ** (i - j)) * (d ** j)
    
    # 叶子节点:可转债价值 = max(转股价值, 纯债价值)
    cb_tree = np.zeros((n_steps + 1, n_steps + 1))
    for j in range(n_steps + 1):
        conversion_value = stock_tree[j, n_steps] * (face / K)  # 转股价值
        bond_value = face * (1 + coupon_rate)                  # 纯债价值
        cb_tree[j, n_steps] = max(conversion_value, bond_value)
    
    # 倒推
    for i in range(n_steps - 1, -1, -1):
        for j in range(i + 1):
            # 持有价值(贴现)
            hold = np.exp(-r * dt) * (p * cb_tree[j, i + 1] + (1 - p) * cb_tree[j + 1, i + 1])
            # 转股价值
            convert = stock_tree[j, i] * (face / K)
            # 取大
            cb_tree[j, i] = max(hold, convert)
    
    return cb_tree[0, 0]

# 示例
price = binomial_cb_pricer(
    S=12, K=10, T=5, r=0.025, sigma=0.30,
    n_steps=100, face=100, coupon_rate=0.005
)
print(f"二叉树定价: {price:.2f} 元")

📈 敏感性分析(Greeks) ​

📊 主要 Greeks ​

Greek含义影响
Delta (Δ)转债价格对正股价格的敏感度1 元正股变化对转债的影响
Gamma (Γ)Delta 变化速度凸性
Vega (ν)波动率敏感度波动率变化对转债影响
Theta (θ)时间衰减时间价值损耗
Rho (ρ)利率敏感度利率变化对转债影响

🔧 数值计算 ​

python
def greeks(S, K, T, r, sigma):
    """计算 BS Greeks"""
    d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    
    delta = norm.cdf(d1)
    gamma = norm.pdf(d1) / (S * sigma * np.sqrt(T))
    vega = S * norm.pdf(d1) * np.sqrt(T) / 100
    theta = (-S * norm.pdf(d1) * sigma / (2 * np.sqrt(T)) - r * K * np.exp(-r * T) * norm.cdf(d2)) / 365
    rho = K * T * np.exp(-r * T) * norm.cdf(d2) / 100
    
    return {
        'delta': delta,
        'gamma': gamma,
        'vega': vega,
        'theta': theta,
        'rho': rho
    }

# 示例
g = greeks(12, 10, 5, 0.025, 0.30)
print(g)
# {'delta': 0.78, 'gamma': 0.18, 'vega': 0.71, 'theta': -0.05, 'rho': 0.65}

📊 实战应用 ​

情景影响操作
正股涨 1 元Delta × 1 = 0.78 元转债涨约 0.78 元
波动率涨 1%Vega × 1 = 0.71 元转债涨约 0.71 元
时间过 1 天Theta = -0.05 元转债跌约 0.05 元
利率涨 1%Rho × 1 = 0.65 元转债涨约 0.65 元

🎯 实战案例 ​

案例 1:低价转债 ​

转债:100 元面值,0.5% 票息,5 年期
正股:12 元,转股价 10 元,波动率 30%
市场利率:2.5%,信用利差:2%

定价:
  纯债价值 ≈ 91.5 元(贴现 + 利息)
  期权价值 ≈ 4.2 元(转股期权的价值)
  总价值 ≈ 95.7 元
  市场价格 = 95 元(折价 0.7%)

判断:合理偏低,可以买入

案例 2:高价转债 ​

转债:130 元,0.5% 票息,2 年期
正股:15 元,转股价 12 元,波动率 35%

定价:
  纯债价值 ≈ 98.5 元
  期权价值 ≈ 35.4 元(深度价内)
  总价值 ≈ 133.9 元
  市场价格 = 135 元

判断:略高,溢价较多,等回调

案例 3:负溢价转债(套利) ​

转债 A 股:100 元 → 转股价值 110 元
转债价格:105 元
折价:5 元

策略:买入转债 → 申请转股 → 次日卖出股票
收益:(110 - 105) / 105 = 4.76% (T+1 套利)

📊 实战工具 ​

集思录(jisilu.cn) ​

  • 可转债实时数据
  • 转股价值、溢价率
  • 强赎、回售提示

东方财富 ​

  • 集思录同步数据
  • K 线 + 估值
  • 公告速递

Python 库 ​

bash
# 推荐库
pip install numpy scipy pandas
pip install akshare          # 可转债数据
pip install backtrader       # 回测
pip install QuantLib         # 高级定价

QuantLib(专业级) ​

python
# QuantLib 是金融工程标准库
import QuantLib as ql

# 设置估值日期
today = ql.Date(1, 1, 2026)
ql.Settings.instance().evaluationDate = today

# 构造可转债
spot_price = 12.0
strike_price = 10.0
volatility = 0.30
risk_free_rate = 0.025
dividend_rate = 0.0

# 欧式期权
payoff = ql.PlainVanillaPayoff(ql.Option.Call, strike_price)
exercise = ql.EuropeanExercise(ql.Date(1, 1, 2031))
option = ql.VanillaOption(payoff, exercise)

# Heston 模型
spot_handle = ql.QuoteHandle(ql.SimpleQuote(spot_price))
flat_ts = ql.YieldTermStructureHandle(ql.FlatForward(today, risk_free_rate, ql.Actual365Fixed()))
dividend_ts = ql.YieldTermStructureHandle(ql.FlatForward(today, dividend_rate, ql.Actual365Fixed()))
flat_vol_ts = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(today, ql.TARGET(), volatility, ql.Actual365Fixed()))

bsm_process = ql.BlackScholesMertonProcess(spot_handle, dividend_ts, flat_ts, flat_vol_ts)
option.setPricingEngine(ql.AnalyticEuropeanEngine(bsm_process))
print(f"期权价值: {option.NPV():.2f}")

⚠️ 注意事项 ​

1. 模型局限 ​

  • BS 模型假设对数正态分布 —— 实际股市有"肥尾"
  • 波动率是常数 —— 实际波动率随时间变化(用 GARCH 更准)
  • 无套利假设 —— 实际有交易成本和税

2. 实战陷阱 ​

  • 转股价值 ≠ 实际价值:转股有稀释效应
  • 赎回条款触发:130% 强赎会限制涨幅
  • 下修条款:发行人不一定会下修
  • 信用风险:发行人违约(极少但存在)

3. 常见误区 ​

误区真相
"转债有债底保底"信用债违约可能亏本
"转债下有保底上不封顶"强赎后会回落到转股价值
"折价转债必套利"折价会因正股下跌而消失
"价格高于纯债就是溢价"还需考虑期权价值

📊 实战建议 ​

投资策略 ​

  1. 纯债价值附近买入(95-100 元):安全垫厚
  2. 转股溢价率 < 30%:跟涨能力强
  3. 正股有题材:上涨空间大
  4. AA 以上评级:信用风险可控
  5. 剩余期限 2-4 年:期权价值较高

风险控制 ​

  • 单只仓位 < 10%
  • 行业分散(不重仓单一行业)
  • 评级要求 AA 以上
  • 避开财务异常转债

📖 相关阅读 ​

来源 ​

💡 数据截至 2026-08;具体规则以交易所/监管机构最新公告为准。

本知识库内容仅供学习参考,不构成任何投资建议。
本站总访问量 ... 次 · 访客数 ... 人