2. 可转债定价模型:BS模型与二叉树模型在可转债定价中的应用与局限

可转债定价,说白了就是个「混血儿」的估值问题。它既有债性,又有股性,还带着转股、赎回、回售这些乱七八糟的条款。我做了这么多年交易,见过太多人拿普通债券或者股票的定价逻辑硬套,结果亏得底裤都不剩。

今天咱们就聊聊两个最经典的定价模型——BS模型和二叉树模型。嗯,这两个模型各有各的脾气,也各有各的坑。

2.1 BS模型:简单粗暴,但别太当真

BS模型,全称Black-Scholes模型,本来是给欧式期权定价用的。可转债里内嵌了一个转股权,本质上就是个看涨期权。所以很多人想,那直接用BS模型算不就完了?

我刚开始做可转债的时候也这么干过。拿BS模型一算,觉得某个转债被低估了,兴冲冲买进去,结果被市场狠狠教育了一顿。为什么?因为BS模型的假设太理想化了。

BS模型的核心假设:

  • 市场无摩擦(无交易成本、无税收)
  • 股票价格服从几何布朗运动
  • 无风险利率恒定
  • 波动率恒定
  • 可以连续交易
  • 没有分红

你看看,这些假设在真实市场里哪个能成立?尤其是「波动率恒定」这条,简直就是扯淡。我见过不少转债,正股波动率在半个月内从30%飙到80%,BS模型算出来的价格能差出一大截。

不过话说回来,BS模型也不是一无是处。它的优势在于计算简单,参数少,适合快速估算。比如你盯盘的时候,想大致判断一个转债的转股权价值,用BS模型算个参考值还是可以的。

BS模型定价公式长这样:

# BS模型计算转债转股权价值
import numpy as np
from scipy.stats import norm

def bs_call_price(S, K, T, r, sigma):
    """
    S: 正股当前价格
    K: 转股价
    T: 剩余期限(年)
    r: 无风险利率
    sigma: 波动率
    """
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    
    call_price = S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
    return call_price

# 举个例子
S = 100.0    # 正股价格
K = 80.0     # 转股价
T = 2.0      # 剩余2年
r = 0.03     # 无风险利率3%
sigma = 0.25 # 波动率25%

call_value = bs_call_price(S, K, T, r, sigma)
print(f"转股权价值(BS模型): {call_value:.2f}")

我个人习惯:用BS模型做初筛,快速过滤掉明显高估或低估的转债。但千万别拿它做最终决策依据,尤其是那些条款复杂的转债。

2.2 二叉树模型:更灵活,也更费劲

二叉树模型,也叫二项式模型,是BS模型的一个升级版。它把时间离散化,在每个时间节点上假设股价只有两种可能——涨或跌。然后从后往前倒推,算出转债的合理价格。

为什么说它更灵活?因为二叉树模型可以处理很多BS模型搞不定的情况,比如:

  • 路径依赖条款:比如回售条款,触发条件是连续多少个交易日低于某个价格。二叉树模型可以在每个节点判断是否触发。
  • 提前转股:转债持有人可以在任意时刻选择转股,二叉树模型可以模拟这种美式期权的特性。
  • 赎回条款:发行人可以强制赎回,二叉树模型也能把这种「发行人权利」加进去。

我记得有一次做一只银行转债的定价,那个转债的回售条款特别复杂——连续30个交易日低于转股价的70%才能触发。BS模型根本没法处理这种条件,我只好上了二叉树模型。虽然算起来慢了点,但结果靠谱多了。

二叉树模型的定价逻辑:

# 二叉树模型定价可转债(简化版)
import numpy as np

def binomial_tree_convertible(S, K, T, r, sigma, n, coupon_rate, face_value):
    """
    简化版二叉树定价,不考虑赎回/回售条款
    S: 正股价格
    K: 转股价
    T: 剩余期限
    r: 无风险利率
    sigma: 波动率
    n: 二叉树步数
    coupon_rate: 票面利率
    face_value: 面值
    """
    dt = T / n
    u = np.exp(sigma * np.sqrt(dt))
    d = 1 / u
    p = (np.exp(r * dt) - d) / (u - d)
    
    # 初始化股价树
    stock_tree = np.zeros((n+1, n+1))
    for i in range(n+1):
        for j in range(i+1):
            stock_tree[j, i] = S * (u**(i-j)) * (d**j)
    
    # 初始化转债价值树(从最后一期倒推)
    cb_tree = np.zeros((n+1, n+1))
    for j in range(n+1):
        # 到期时,转债价值 = max(转股价值, 面值+利息)
        conversion_value = stock_tree[j, n] / K * 100
        cb_tree[j, n] = max(conversion_value, face_value * (1 + coupon_rate))
    
    # 倒推
    for i in range(n-1, -1, -1):
        for j in range(i+1):
            hold_value = np.exp(-r*dt) * (p*cb_tree[j, i+1] + (1-p)*cb_tree[j+1, i+1])
            conversion_value = stock_tree[j, i] / K * 100
            cb_tree[j, i] = max(hold_value, conversion_value)
    
    return cb_tree[0, 0]

# 使用示例
price = binomial_tree_convertible(
    S=100, K=80, T=2.0, r=0.03, 
    sigma=0.25, n=100, 
    coupon_rate=0.02, face_value=100
)
print(f"转债理论价格(二叉树模型): {price:.2f}")

我曾经踩过的坑:二叉树模型的步数n不能设太小。我刚开始用的时候设了20步,结果算出来的价格波动特别大。后来改成100步以上,结果才稳定下来。步数越多越精确,但计算量也越大,自己权衡吧。

2.3 两个模型的对比与局限

咱们来做个对比,看看这两个模型到底差在哪:

对比维度 BS模型 二叉树模型
计算速度 快(秒级) 慢(取决于步数)
处理美式期权 不能 可以
处理路径依赖条款 不能 可以(需扩展)
参数敏感性 对波动率敏感 对步数和波动率都敏感
适用场景 快速估算、简单转债 复杂条款、精确定价

两个模型共同的局限也很明显:

  • 波动率问题:两个模型都需要输入波动率,但波动率本身是未知的。你用历史波动率还是隐含波动率?用哪个时间窗口?这些选择会直接影响定价结果。
  • 利率问题:无风险利率怎么取?国债收益率?还是用Shibor?不同利率算出来的价格能差好几个点。
  • 信用风险:两个模型都假设发行人不违约。但现实中,可转债的发行人信用风险是真实存在的,尤其是那些评级不高的公司。

我的建议:别迷信任何一个模型。模型只是工具,帮你理解转债的价值构成。真正做交易的时候,还得结合市场情绪、供需关系、条款博弈这些「软信息」。我见过太多人拿着模型算出来的价格去套利,结果被市场打脸。

2.4 知识体系框架

下面这张图,是我自己总结的可转债定价模型知识体系。你看一眼,心里就有数了:

可转债定价模型知识体系 BS模型(Black-Scholes) 二叉树模型(Binomial Tree) BS模型特点 • 计算快,适合快速估算 • 假设理想化,忽略条款细节 • 只能处理欧式期权 • 对波动率高度敏感 二叉树模型特点 • 可处理美式期权 • 支持路径依赖条款 • 计算量大,步数影响精度 • 灵活性高,可扩展性强 共同局限 波动率未知 | 利率选择 | 信用风险 | 市场摩擦 实战建议:模型是工具,市场是老师 结合市场情绪、供需关系、条款博弈综合判断

你看,BS模型和二叉树模型各有各的用武之地。BS模型适合快速扫盘,二叉树模型适合精细定价。但不管用哪个,都得记住:模型只是帮你理解价值的工具,真正的交易决策还得靠你对市场的判断。

嗯,今天就聊到这儿。下次咱们聊聊怎么用这些模型做统计套利,那才是真正赚钱的地方。

专注资料整理