使用sdeint实现SABR波动率模型出现SDEValueError报错如何解决
SABR模型sdeint实现报错修复方案
错误原因
报错触发的核心原因是sdeint库的itoint接口要求扩散函数G必须返回形状为**(状态变量维度, 布朗运动维度)**的二维数组,你的原有代码中G返回的是长度为2的一维数组,不符合接口参数规范。
你的SABR模型包含两个独立的布朗运动dWt、dZt,状态变量维度为2,因此G需要返回(2, 2)形状的对角扩散矩阵:
- 第一行第一列对应第一个方程的
dWt扩散系数:x[1] * x[0] ** b - 第二行第二列对应第二个方程的
dZt扩散系数:a * x[1] - 非对角元素为0,代表两个布朗运动相互独立
修复后完整代码
import numpy as np import sdeint a = 1 b = 0.5 tspan = np.linspace(0.0, 10.0, 10001) x0 = np.array([3.0, 3.0]) # 漂移项,两个方程漂移系数都是0 def f(x, t): return np.zeros_like(x) # 扩散项,返回2行2列的扩散矩阵 def G(x, t): return np.array([ [x[1] * x[0] ** b, 0], [0, a * x[1]] ]) result = sdeint.itoint(f, G, x0, tspan)
结果说明
运行后result为形状(10001, 2)的数组,第一列是标的资产价格x1的模拟序列,第二列是波动率x2的模拟序列。
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

