如何向量化GBM类spitzer_recurrence函数的u输入以提升性能?
向量化u输入的期权定价问题解决方案
1. 关于p的初始化问题
完全可以将p初始化为适配向量存储的零矩阵,核心是让p的维度匹配向量化u的输出维度:
- 假设输入的u是形状为
(N,)的numpy数组,I的取值范围是0到I_max,递归步数为num_steps,可按以下方式初始化p:
也可根据代码中递归的实际维度调整(比如原p是p = np.zeros((num_steps, I_max + 1, u.shape[0]))(步数, I值)的二维标量矩阵,现在扩展为三维,第三维对应u的每个元素)。 - 确保
self.ana_a函数接收u数组时,返回维度匹配的数组(比如u是(N,)则返回(N,)),这样p[0,I] = self.ana_a(I, u, t, (T-t)/m) / (I+1)的赋值操作维度完全对齐,不会再出现"numpy数组存入标量矩阵"的错误。
2. 关于测试脚本a1、a2未返回全True数组的问题
大概率是浮点精度或向量化逻辑错位导致,按以下步骤排查:
- 替换直接相等判断:用
np.allclose(a1, expected_value, atol=1e-8)代替a1 == expected_value,数值期权计算中浮点误差是常态,直接相等会误判。 - 对标标量与向量化结果:用单个u值(标量)运行代码,将结果和向量化输入中对应位置的结果对比,确认递推逻辑在向量化后是否一致。
- 检查递归中的维度操作:比如循环内的求和、赋值是否指定了正确的
axis参数,避免因维度坍塌或错位导致结果偏差。
内容的提问来源于stack exchange,提问作者Jord van Eldik
相关产品推荐
相关产品推荐

