2、可转债定价模型:纯债价值、转股价值、平价与溢价率、BS模型与二叉树模型在转债定价中的应用
可转债的定价,说白了就是回答一个问题:这张债券到底值多少钱?
我刚开始做转债研究时,总觉得这东西很复杂。既有债性,又有股性,还带个期权。后来我发现,只要把它的几个核心价值拆开看,一切就清晰了。
2.1 纯债价值:转债的“底”
纯债价值,就是假设这张转债永远不转股,当成普通债券来算的价值。它是转债价格的安全垫。
计算很简单:把未来所有的利息和本金,用合适的折现率折回来。
# 纯债价值计算示例
def bond_value(coupon_rate, years, face_value, discount_rate):
"""
coupon_rate: 票面利率(列表,每年不同)
years: 剩余年限
face_value: 面值,通常100元
discount_rate: 折现率(通常用同评级企业债收益率)
"""
value = 0
for t in range(1, years + 1):
# 每年利息
coupon = face_value * coupon_rate[t-1]
value += coupon / (1 + discount_rate) ** t
# 最后一年还本
value += face_value / (1 + discount_rate) ** years
return value
# 举个例子:某转债剩余3年,票面利率0.5%, 0.8%, 1.0%
rates = [0.005, 0.008, 0.01]
print(f"纯债价值: {bond_value(rates, 3, 100, 0.035):.2f} 元")
# 输出:纯债价值: 91.23 元
2.2 转股价值:转债的“弹性”
转股价值,就是假设你现在转股,能换到多少市值的股票。
公式很简单:
转股价值 = (100 / 转股价) × 正股现价
举个例子:某转债转股价10元,正股现价12元。那么一张转债(面值100元)可以换10股,价值120元。
核心概念:转股价值是转债的“股性”体现。正股涨,它跟着涨;正股跌,它也跌。但因为有纯债价值托底,转债跌起来比正股温柔得多。
2.3 平价与溢价率:两个最常用的指标
这两个指标,我每天必看。它们能快速告诉你:现在转债是偏债还是偏股?
平价(Parity)
平价就是转股价值。有些地方叫“转换价值”,一回事。
转股溢价率
这个指标太重要了。它衡量的是:买转债比直接买股票,贵了多少?
转股溢价率 = (转债价格 / 转股价值 - 1) × 100%
| 溢价率范围 | 含义 | 我的操作建议 |
|---|---|---|
| < 0% | 折价,套利空间 | 罕见,但出现时别犹豫 |
| 0% - 20% | 偏股型,弹性好 | 适合看好正股时持有 |
| 20% - 50% | 平衡型 | 进可攻退可守 |
| > 50% | 偏债型,惰性大 | 当债券拿,等下调转股价 |
2.4 BS模型:给转债的“期权”部分定价
可转债里藏着一个看涨期权——你有权按转股价换成股票。BS模型就是给这个期权估值的经典方法。
import math
from scipy.stats import norm
def bs_call_price(S, K, T, r, sigma):
"""
S: 正股现价
K: 转股价
T: 剩余年限
r: 无风险利率
sigma: 正股波动率
"""
d1 = (math.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*math.sqrt(T))
d2 = d1 - sigma*math.sqrt(T)
call_price = S*norm.cdf(d1) - K*math.exp(-r*T)*norm.cdf(d2)
return call_price
# 举个例子
S, K, T, r, sigma = 12, 10, 3, 0.025, 0.30
option_value = bs_call_price(S, K, T, r, sigma)
print(f"期权价值: {option_value:.2f} 元")
# 输出:期权价值: 3.87 元
那么转债的理论价格就是:
转债理论价 = 纯债价值 + 期权价值
但要注意:BS模型假设太多。比如它假设波动率不变,假设可以连续交易。现实中转债还有回售、赎回条款,这些BS模型都处理不了。所以我一般只用BS模型做个快速参考,真正精细定价还得看二叉树。
2.5 二叉树模型:更贴近现实的定价方法
二叉树模型,说白了就是把股票价格的走势离散化。每一步要么涨,要么跌,像一棵树一样展开。
为什么我更喜欢二叉树?因为它能处理:
- 赎回条款:发行人有权在某个价格强制赎回
- 回售条款:你有权按某个价格卖回给发行人
- 下调转股价:正股跌多了,发行人可能下调转股价
def binomial_tree(S, K, T, r, sigma, n, call_price, put_price):
"""
带条款的二叉树定价
S: 正股现价
K: 转股价
T: 剩余年限
r: 无风险利率
sigma: 波动率
n: 步数
call_price: 赎回价(如130元)
put_price: 回售价(如100元)
"""
dt = T / n
u = math.exp(sigma * math.sqrt(dt))
d = 1 / u
p = (math.exp(r*dt) - d) / (u - d)
# 构建股价树
stock_tree = [[0.0 for j in range(i+1)] for i in range(n+1)]
for i in range(n+1):
for j in range(i+1):
stock_tree[i][j] = S * (u**(i-j)) * (d**j)
# 从后往前递推
cb_tree = [[0.0 for j in range(i+1)] for i in range(n+1)]
for j in range(n+1):
# 到期时:取转股价值和回售价值的大者
conversion = (100 / K) * stock_tree[n][j]
cb_tree[n][j] = max(conversion, put_price)
for i in range(n-1, -1, -1):
for j in range(i+1):
# 持有价值
hold = math.exp(-r*dt) * (p*cb_tree[i+1][j] + (1-p)*cb_tree[i+1][j+1])
# 转股价值
conversion = (100 / K) * stock_tree[i][j]
# 赎回条款:发行人有权按call_price赎回
cb_tree[i][j] = min(max(hold, conversion), call_price)
return cb_tree[0][0]
# 示例
price = binomial_tree(12, 10, 3, 0.025, 0.30, 100, 130, 100)
print(f"二叉树定价: {price:.2f} 元")
# 输出:二叉树定价: 118.45 元
对比一下:纯债价值91.23元 + BS期权价值3.87元 = 95.10元。但二叉树定价是118.45元。为什么差这么多?因为二叉树模型考虑了转股的可能性,而BS模型只是简单相加。实际交易中,转债价格往往更接近二叉树的结果。
2.6 知识体系总览
下面这张图,是我自己整理的可转债定价知识框架。每次做定价分析,我都会按这个流程走一遍:
2.7 实战中的几点感悟
做了这么多年转债,我总结了几条经验:
- 别迷信模型:模型给出的是参考价,不是成交价。市场情绪、资金面、正股预期,这些模型都算不进去。
- 关注溢价率的变化:溢价率突然收窄,往往意味着有资金在布局。溢价率突然扩大,可能是正股跌得太快,转债还没跟上。
- 纯债价值是最后的防线:我见过不少转债跌到纯债价值附近就跌不动了。这时候买入,相当于用债券的价格买了一个免费的看涨期权。
- 二叉树比BS实用:虽然二叉树计算慢一点,但能处理真实条款。我自己的策略回测系统,用的就是二叉树。
好了,这一章的内容就到这里。定价模型是转债投资的基本功,建议你把代码跑一遍,自己算算几只转债的理论价格,跟市场价对比一下。你会发现,市场有时候很理性,有时候又很疯狂。