在金融建模和量化分析中,我们经常需要处理离散的市场数据点,并构建连续函数关系。例如,从有限的市场报价构建完整收益率曲线,或为复杂衍生品开发近似定价公式。本文作为Python数值分析系列第二篇,将介绍函数逼近和数值展开的核心技术,并通过Python实现展示其在金融中的应用。
给定一组数据点 $(x_i, y_i)$,插值的目标是找到一个函数 $f(x)$,使得 $f(x_i) = y_i$。这个函数能用于估计未知点的函数值。
金融应用场景:
拉格朗日插值法构造一个通过所有数据点的多项式。其核心公式为:
$$ L(x) = \sum_{i=0}^{n} y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j} $$
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
def lagrange_interpolation(x_data, y_data, x):
"""使用拉格朗日插值法计算给定x处的函数值"""
n = len(x_data)
y = 0
for i in range(n):
# 计算拉格朗日基函数
basis = 1
for j in range(n):
if i != j:
basis *= (x - x_data[j]) / (x_data[i] - x_data[j])
# 累加
y += y_data[i] * basis
return y
# 示例:短期国债收益率插值
maturities = np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10]) # 期限(年)
yields = np.array([4.5, 4.6, 4.7, 4.9, 5.0, 5.1, 5.15, 5.2]) # 收益率(%)
# 创建插值函数
x_dense = np.linspace(0.25, 10, 100)
y_lagrange = np.array([lagrange_interpolation(maturities, yields, xi) for xi in x_dense])
优缺点:
样条插值通过分段多项式代替单一高阶多项式来避免龙格现象。三次样条在每个区间使用三次多项式,并确保在连接点处一阶和二阶导数连续。
def natural_cubic_spline(x_data, y_data, x):
"""使用自然三次样条插值计算给定x处的函数值"""
# 使用SciPy的样条插值
spline = interpolate.CubicSpline(x_data, y_data, bc_type='natural')
return spline(x)
# 计算三次样条插值结果
y_spline = natural_cubic_spline(maturities, yields, x_dense)
为什么金融分析师偏爱样条插值: