在金融建模和量化分析中,我们经常需要处理离散的市场数据点,并构建连续函数关系。例如,从有限的市场报价构建完整收益率曲线,或为复杂衍生品开发近似定价公式。本文作为Python数值分析系列第二篇,将介绍函数逼近和数值展开的核心技术,并通过Python实现展示其在金融中的应用。

1. 插值方法基础

1.1 什么是插值问题?

给定一组数据点 $(x_i, y_i)$,插值的目标是找到一个函数 $f(x)$,使得 $f(x_i) = y_i$。这个函数能用于估计未知点的函数值。

金融应用场景

1.2 拉格朗日插值法:最基础的多项式插值

拉格朗日插值法构造一个通过所有数据点的多项式。其核心公式为:

$$ 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])

优缺点

1.3 样条插值:平滑曲线的最佳选择

样条插值通过分段多项式代替单一高阶多项式来避免龙格现象。三次样条在每个区间使用三次多项式,并确保在连接点处一阶和二阶导数连续。

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)

为什么金融分析师偏爱样条插值