Skip to content

9.2 根求解

量化金融中大量问题归结为求解方程——从隐含波动率到内部收益率(IRR),再到债券到期收益率。根求解算法是每个量化分析师的必备工具。


二分法(Bisection Method)

算法

对于连续函数 f(x)f(x),若 f(a)f(b)<0f(a) \cdot f(b) < 0,则 (a,b)(a,b) 内必有根:

  1. 计算中点 c=(a+b)/2c = (a + b) / 2
  2. f(a)f(c)<0f(a) \cdot f(c) < 0,则根在 (a,c)(a,c),否则在 (c,b)(c,b)
  3. 重复直到区间长度小于容差
  • 收敛速度:线性,每次迭代区间减半
  • 优点:保证收敛(只要初始区间有根)
  • 缺点:收敛较慢

牛顿法(Newton's Method)

算法

对于方程 f(x)=0f(x) = 0,牛顿迭代公式:

xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

  • 收敛速度:二次收敛——每次迭代有效位数大致翻倍(当初始值足够好时)
  • 优点:收敛极快
  • 缺点:需要导函数;初始值不当可能发散

手算实例:用牛顿法求 2\sqrt{2}

等价于求解 f(x)=x22=0f(x) = x^2 - 2 = 0f(x)=2xf'(x) = 2x

迭代公式:

xn+1=xnxn222xn=xn+2/xn2x_{n+1} = x_n - \frac{x_n^2 - 2}{2x_n} = \frac{x_n + 2/x_n}{2}

x0=1.5x_0 = 1.5 开始:

迭代 nnxnx_nf(xn)=xn22f(x_n) = x_n^2 - 2f(xn)=2xnf'(x_n) = 2x_n步长 f/f-f/f'xn+1x_{n+1}
01.5000002.252=0.25002.25 - 2 = 0.25003.03.00.2500/3.0=0.08333-0.2500/3.0 = -0.083331.416667
11.4166672.0069442=0.0069442.006944 - 2 = 0.0069442.83332.83330.006944/2.8333=0.00245-0.006944/2.8333 = -0.002451.414216
21.4142162.0000062=0.0000062.000006 - 2 = 0.0000062.82842.82840.000006/2.82840.000002-0.000006/2.8284 \approx -0.0000021.414214
31.4142140\approx 0001.414214

收敛速度:从 1.5 到 1.416667(误差 2×1032 \times 10^{-3}),再到 1.414214(误差 <106< 10^{-6})——仅 3 次迭代就达到 6 位有效数字。


Python 示例

python
import numpy as np

def sqrt_newton(x0=1.5, iters=4):
    x = x0
    print(f"n=0: x = {x:.10f}")
    for i in range(iters):
        x = (x + 2.0 / x) / 2.0
        print(f"n={i+1}: x = {x:.10f}, 误差 = {abs(x - np.sqrt(2)):.2e}")
    return x

sqrt_newton()
# --- 输出 ---
# n=0: x = 1.5000000000
# n=1: x = 1.4166666667, 误差 = 2.45e-03
# n=2: x = 1.4142156863, 误差 = 2.12e-06
# n=3: x = 1.4142135624, 误差 = 1.59e-12

隐含波动率(Implied Volatility)

牛顿法用于计算隐含波动率(IV)——求解 CBS(σ)Cmarket=0C_{\text{BS}}(\sigma) - C_{\text{market}} = 0,其中 CBSC_{\text{BS}} 是 Black-Scholes 的期权理论价格。σ\sigma 的导数(vega)有解析公式,使得牛顿法高效精确。

python
from scipy.stats import norm

def bs_vega(S, K, r, sigma, T):
    """Black-Scholes vega (∂C/∂σ)"""
    d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    return S * norm.pdf(d1) * np.sqrt(T)

def implied_vol(S, K, r, T, market_price, sigma_guess=0.3, tol=1e-8):
    """用牛顿法求解隐含波动率"""
    sigma = sigma_guess
    for i in range(100):
        price = bs_call_price(S, K, r, sigma, T)
        diff = price - market_price
        if abs(diff) < tol:
            return sigma
        vega = bs_vega(S, K, r, sigma, T)
        sigma = sigma - diff / vega
    raise ValueError("未收敛")

IRR 计算

内部收益率(IRR)是使净现值为零的折现率:

NPV(r)=t=0TCFt(1+r)t=0\text{NPV}(r) = \sum_{t=0}^{T} \frac{CF_t}{(1+r)^t} = 0

牛顿法在此同样适用,导数为:

NPV(r)=t=0TtCFt(1+r)t+1\text{NPV}'(r) = -\sum_{t=0}^{T} \frac{t \cdot CF_t}{(1+r)^{t+1}}

实际考虑:IRR 可能存在多解或无解的情况。实践中常先用二分法粗搜,再用牛顿法精化,结合改期的牛顿法(Modified Newton's Method)提高稳健性。 \n> 下一步:继续学习 9.3 数值积分

Built with VitePress