只存储存在的部分
在网格上给期权定价,是用一串线性方程组代替微分方程。每个网格节点只与相邻两个节点相连,所以方程组的矩阵是三对角的:三条对角线上有数,其余全是零。稠密的 n×n 数组要存 n² 个数,几乎全是零;稀疏格式只存有意义的 3n-2 个。scipy.sparse.diags([lower, diag, upper], [-1, 0, 1], format='csc') 由对角线构造这样的矩阵(下对角线和上对角线都有 n-1 个元素,因此下对角线要截去开头一个,使之从第二行开始,上对角线截去末尾一个,使之在最后一列前结束)。CSC 是稀疏求解器需要的格式。
隐式格式通过在每一步解 A V^new=V^old+边界 来把期权价值沿时间倒推。矩阵 A 在各步之间不变,所以用 scipy.sparse.linalg.splu(A) 只分解一次,每一步只是 lu.solve(rhs),对三对角矩阵来说成本极低。S=0 处的边界条件(看跌期权价值为 Ke^(-rτ))进入第一个方程,所以第一个右端项要用 lower[0] * K * exp(-r * m * dt) 修正。在一年期利率 4.47%、σ=25% 时,平值看跌期权的闭式价格是 7.6987;该格式在 200×200 网格上给出 7.6958,在 400×400 上给出 7.6965,相差约 0.003。2000 个节点的网格以稀疏形式只存 5,995 个数,稠密形式则需要近 400 万个。
- 存对角线,不存零:
sparse.diags只存 3n - 2 个数而不是 n 的平方。 - 分解一次,求解多次:
splu预先付出成本,之后每个时间步只是一次廉价的solve。 - 边界条件放在右端项:网格边缘的已知值被移到方程另一边。
实验:评分内容
- 三条对角线20 分
- 稀疏矩阵15 分
- 用一次分解定价30 分
- 稀疏对稠密10 分
- 定价误差5 分
- 基于真实利率的研究20 分