2、可转债定价模型:纯债价值、转股价值、期权价值、BS模型与二叉树模型
聊到可转债定价,很多新手第一反应就是「这东西到底值多少钱?」。
说实话,可转债的定价确实比普通股票或债券要复杂一些。它本质上是个「混血儿」——既有债性,又有股性,还带个期权属性。我做了这么多年量化,每次遇到新产品上市,第一件事就是把它的定价模型跑一遍。
2.1 纯债价值:最底线的保护
纯债价值,说白了就是「如果这只可转债永远不转股,它作为一张债券值多少钱」。
计算方式其实很简单:把未来所有的利息和本金,用合适的折现率折回来。
# 纯债价值计算示例
def bond_value(coupon_rate, years, face_value, discount_rate):
"""
coupon_rate: 票面利率(比如0.02表示2%)
years: 剩余年限
face_value: 面值(通常是100)
discount_rate: 折现率(参考同评级信用债收益率)
"""
total = 0
for t in range(1, years + 1):
# 每年利息折现
coupon = face_value * coupon_rate
total += coupon / (1 + discount_rate) ** t
# 最后一年本金折现
total += face_value / (1 + discount_rate) ** years
return total
# 举个例子:票面利率1.5%,剩余5年,折现率4%
print(bond_value(0.015, 5, 100, 0.04))
# 输出大概在89元左右
嗯,这里要注意:折现率怎么选?我个人习惯用同评级、同期限的信用债收益率。如果可转债评级是AA,那就找AA级企业债的收益率曲线。
核心要点:纯债价值就是可转债的「安全垫」。市场再差,它也不会跌到纯债价值以下太多——因为套利者会买入并持有到期。
2.2 转股价值:跟股票走的部分
转股价值就直白了:如果现在就把可转债换成股票,这些股票值多少钱。
公式很简单:
转股价值 = (100 / 转股价) × 当前正股价格
举个例子:某可转债转股价10元,正股现价12元,那转股价值就是 (100/10)×12 = 120元。
我在项目中遇到过这样的情况:有些新手只看转股价值,觉得120元比面值100元高,就冲进去买。结果呢?正股一跌,转股价值跟着跳水,亏得挺惨。所以啊,转股价值只是「当前时点」的估值,不能代表未来。
小技巧:转股溢价率 = (可转债价格 - 转股价值) / 转股价值 × 100%。溢价率越低,可转债的「股性」越强。我个人一般把溢价率低于10%的称为「偏股型」,高于30%的称为「偏债型」。
2.3 期权价值:可转债的「隐藏技能」
可转债最迷人的地方,就是它附带的期权。
你想想看,持有可转债相当于:
- 持有一张债券(保底)
- 外加一个看涨期权(股价涨了能转股获利)
- 还可能带个回售权(股价跌太多,你可以把债券卖回给公司)
所以可转债的理论价格应该是:
可转债理论价 = 纯债价值 + 期权价值
这个期权价值怎么算?这就轮到BS模型和二叉树模型登场了。
2.4 BS模型:快速但粗糙
BS模型(Black-Scholes模型)是期权定价的经典方法。用在可转债上,就是把转股权看作一个欧式看涨期权。
from scipy.stats import norm
import math
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
# 示例:正股12元,转股价10元,剩余2年,无风险利率3%,波动率25%
option_value = bs_call_price(12, 10, 2, 0.03, 0.25)
print(f"期权价值: {option_value:.2f}")
注意:BS模型有个硬伤——它假设期权只能在到期日行权。但可转债的转股权是「随时可以转」的,属于美式期权。另外,BS模型也没考虑可转债的赎回条款和回售条款。所以它只能给个粗略参考。
我曾经用BS模型给一只可转债定价,算出来理论价130元,结果市场价才115元。我差点以为自己发现了套利机会。后来仔细一分析——哦,原来这只债有强赎条款,正股涨到转股价的130%公司就可以强制赎回。BS模型没考虑这个,所以高估了。
2.5 二叉树模型:更精确,也更麻烦
二叉树模型(Binomial Tree)就灵活多了。它可以处理美式期权,也能加入赎回、回售等条款。
基本思路是这样的:
- 把时间分成N个小步
- 每一步,股价要么上涨u倍,要么下跌d倍
- 从最后一步倒推回来,每一步都判断「转股划算还是持有划算」
def binomial_tree(S, K, T, r, sigma, N, coupon_rate=0, call_price=None, put_price=None):
"""
二叉树定价可转债(简化版)
S: 正股价格
K: 转股价
T: 剩余期限
r: 无风险利率
sigma: 波动率
N: 步数
"""
dt = T / N
u = math.exp(sigma * math.sqrt(dt))
d = 1 / u
p = (math.exp(r * dt) - d) / (u - d)
# 构建股价树
stock_tree = [[S]]
for i in range(1, N+1):
level = []
for j in range(i+1):
price = S * (u ** (i-j)) * (d ** j)
level.append(price)
stock_tree.append(level)
# 从最后一层倒推
bond_tree = [[0] * (i+1) for i in range(N+1)]
# 最后一层:转股价值 vs 纯债价值
for j in range(N+1):
conversion = (100 / K) * stock_tree[N][j]
bond_floor = 100 # 简化:到期按面值
bond_tree[N][j] = max(conversion, bond_floor)
# 倒推
for i in range(N-1, -1, -1):
for j in range(i+1):
hold = math.exp(-r*dt) * (p * bond_tree[i+1][j] + (1-p) * bond_tree[i+1][j+1])
conversion = (100 / K) * stock_tree[i][j]
bond_tree[i][j] = max(hold, conversion)
# 如果有赎回条款,这里要加判断
return bond_tree[0][0]
# 示例
price = binomial_tree(12, 10, 2, 0.03, 0.25, 100)
print(f"二叉树定价: {price:.2f}")
经验之谈:二叉树模型虽然计算量大,但胜在灵活。我一般用BS模型做快速筛选,用二叉树模型做精细定价。步数N取50-100就够用了,再大边际效益递减。
2.6 三种价值的联动关系
搞清楚了这三个价值,我们来看它们怎么一起作用。
我画了张图,帮你理清思路:
从这张图你能看到:
- 纯债价值是下限,市场再差也跌不到哪去
- 转股价值是动态的,跟着正股走
- 期权价值是溢价部分,体现了「上涨潜力」
实际交易中,可转债价格往往在「纯债价值」和「转股价值+期权价值」之间波动。当市场情绪高涨时,期权价值会被高估;当市场恐慌时,期权价值可能被低估——这时候就是套利机会。
避坑指南:我曾经用BS模型给一只剩余期限不到半年的可转债定价,算出来期权价值几乎为零。但市场价还比纯债价值高不少。后来发现——原来这只债有回售条款,持有人可以按面值+利息回售给公司。BS模型没考虑这个,所以低估了。记住:模型只是工具,条款才是关键。
好了,关于可转债定价模型的核心内容就这些。记住三个价值、两个模型,再加上对条款的敏感度,你就能在定价上超过90%的散户了。
公众号:蓝海资料掘金营,微信deep3321