金融建模的核心问题往往归结为求解微分方程。从Black-Scholes模型到资产价格模拟,从利率建模到期权定价,微分方程都扮演着关键角色。本文将用通俗易懂的方式介绍微分方程的数值解法及变换方法,并通过Python代码展示这些方法在金融中的实际应用。

1. 常微分方程的数值解法

1.1 初值问题简介

常微分方程(ODE)描述变量及其导数间的关系。初值问题是在给定起点条件下求解这类方程:

$$ \frac{dy}{dt} = f(t, y), \quad y(t_0) = y_0 $$

想象你在预测资产价格走势:你知道当前价格,也知道价格变化的规律,需要推算未来价格。这就是一个初值问题。

1.2 欧拉方法:最简单的数值解法

欧拉方法就像沿着切线一小步一小步地前进:

$$ y_{n+1} = y_n + h \cdot f(t_n, y_n) $$

其中hhh是步长,越小越精确但计算量越大。

def euler_method(f, t0, y0, t_end, n_steps):
    """使用欧拉方法求解常微分方程"""
    h = (t_end - t0) / n_steps  # 计算步长
    t_values = np.linspace(t0, t_end, n_steps + 1)

    # 确保y0是数组形式
    y0 = np.atleast_1d(y0)
    y_dim = len(y0)

    # 初始化结果数组
    y_values = np.zeros((n_steps + 1, y_dim))
    y_values[0] = y0

    # 欧拉方法迭代
    for i in range(n_steps):
        y_values[i+1] = y_values[i] + h * f(t_values[i], y_values[i])

    return t_values, y_values

以指数增长模型为例(如复利增长的资产):

# 指数增长模型 dy/dt = r*y
def exponential_growth(t, y, r=0.1):
    return r * y

# 参数设置
r = 0.1      # 增长率 (10%)
t0 = 0       # 初始时间
y0 = [100]   # 初始值(如:$100)
t_end = 10   # 10年后

# 不同步数的欧拉方法求解
steps_list = [10, 20, 50, 100]

欧拉方法的局限

1.3 龙格-库塔方法:更高精度的解法

四阶龙格-库塔方法(RK4)是最常用的高精度方法,它不只看当前点的斜率,而是评估多个中间点:

def runge_kutta4(f, t0, y0, t_end, n_steps):
    """使用四阶龙格-库塔方法求解微分方程"""
    h = (t_end - t0) / n_steps
    t_values = np.linspace(t0, t_end, n_steps + 1)

    y0 = np.atleast_1d(y0)
    y_dim = len(y0)
    y_values = np.zeros((n_steps + 1, y_dim))
    y_values[0] = y0

    for i in range(n_steps):
        t = t_values[i]
        y = y_values[i]

        # 四个评估点
        k1 = f(t, y)
        k2 = f(t + 0.5*h, y + 0.5*h*k1)
        k3 = f(t + 0.5*h, y + 0.5*h*k2)
        k4 = f(t + h, y + h*k3)

        # 加权平均这些斜率
        y_values[i+1] = y + (h/6) * (k1 + 2*k2 + 2*k3 + k4)

    return t_values, y_values