9.2 根求解
量化金融中大量问题归结为求解方程——从隐含波动率到内部收益率(IRR),再到债券到期收益率。根求解算法是每个量化分析师的必备工具。
二分法(Bisection Method)
算法
对于连续函数 ,若 ,则 内必有根:
- 计算中点
- 若 ,则根在 ,否则在
- 重复直到区间长度小于容差
- 收敛速度:线性,每次迭代区间减半
- 优点:保证收敛(只要初始区间有根)
- 缺点:收敛较慢
牛顿法(Newton's Method)
算法
对于方程 ,牛顿迭代公式:
- 收敛速度:二次收敛——每次迭代有效位数大致翻倍(当初始值足够好时)
- 优点:收敛极快
- 缺点:需要导函数;初始值不当可能发散
手算实例:用牛顿法求
等价于求解 ,。
迭代公式:
从 开始:
| 迭代 | 步长 | ||||
|---|---|---|---|---|---|
| 0 | 1.500000 | 1.416667 | |||
| 1 | 1.416667 | 1.414216 | |||
| 2 | 1.414216 | 1.414214 | |||
| 3 | 1.414214 | — | 1.414214 |
收敛速度:从 1.5 到 1.416667(误差 ),再到 1.414214(误差 )——仅 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-12Quant Link:隐含波动率与 IRR 计算
隐含波动率(Implied Volatility)
牛顿法用于计算隐含波动率(IV)——求解 ,其中 是 Black-Scholes 的期权理论价格。 的导数(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)是使净现值为零的折现率:
牛顿法在此同样适用,导数为:
实际考虑:IRR 可能存在多解或无解的情况。实践中常先用二分法粗搜,再用牛顿法精化,结合改期的牛顿法(Modified Newton's Method)提高稳健性。 \n> 下一步:继续学习 9.3 数值积分