金融建模的核心问题往往归结为求解微分方程。从Black-Scholes模型到资产价格模拟,从利率建模到期权定价,微分方程都扮演着关键角色。本文将用通俗易懂的方式介绍微分方程的数值解法及变换方法,并通过Python代码展示这些方法在金融中的实际应用。
常微分方程(ODE)描述变量及其导数间的关系。初值问题是在给定起点条件下求解这类方程:
$$ \frac{dy}{dt} = f(t, y), \quad y(t_0) = y_0 $$
想象你在预测资产价格走势:你知道当前价格,也知道价格变化的规律,需要推算未来价格。这就是一个初值问题。
欧拉方法就像沿着切线一小步一小步地前进:
$$ 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]
欧拉方法的局限:
四阶龙格-库塔方法(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