可转债定价模型
💰 可转债 = 债券 + 期权 —— 理解这一定价原理,你就知道为什么可转债是"下有保底、上不封顶"。
🎯 可转债的本质
📐 资产组成
可转债价值 = 纯债价值 + 期权价值
──────── ────────
"债底" "股性"| 组成部分 | 含义 | 特性 |
|---|---|---|
| 纯债价值(债底) | 作为债券的还本付息价值 | 保底,下限 |
| 期权价值(股性) | 转股期权的价值 | 跟随正股 |
| 回售价值 | 回售条款触发时的价格 | 兜底保护 |
| 赎回价值 | 赎回条款触发时的价格 | 发行人保护 |
📊 价值范围
回售价值 ≤ 纯债价值 ≤ 可转债价格 ≤ 赎回价值
↑
(理论最低) (理论最高)🔧 定价方法
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. 常见误区
| 误区 | 真相 |
|---|---|
| "转债有债底保底" | 信用债违约可能亏本 |
| "转债下有保底上不封顶" | 强赎后会回落到转股价值 |
| "折价转债必套利" | 折价会因正股下跌而消失 |
| "价格高于纯债就是溢价" | 还需考虑期权价值 |
📊 实战建议
投资策略
- 纯债价值附近买入(95-100 元):安全垫厚
- 转股溢价率 < 30%:跟涨能力强
- 正股有题材:上涨空间大
- AA 以上评级:信用风险可控
- 剩余期限 2-4 年:期权价值较高
风险控制
- 单只仓位 < 10%
- 行业分散(不重仓单一行业)
- 评级要求 AA 以上
- 避开财务异常转债
📖 相关阅读
来源
- 证监会公开公告
- 上交所交易规则
- 深交所 / 北交所规则
- 中国证券业协会(SAC)、中国证券投资基金业协会(AMAC)公开资料
- 国家金融监督管理总局、人社部、财政部、税务总局公开资料
💡 数据截至 2026-08;具体规则以交易所/监管机构最新公告为准。