从 Vasicek 模型中查找参数

Find parameters from the Vasicek model

我得到以下保证金: 并且需要使 Vasicek 模型适合此数据。

我的尝试如下:

# ...  imports
years = np.array([1, 2, 3, 4, 7, 10])
pric = np.array([0, .93, .85, .78, .65, .55, .42])


X = sympy.symbols("a b sigma")
a, b, s = X
rt1_rt = np.diff(pric)
ab_rt = np.array([a*(b-r) for r in pric[1:] ])
term = rt1_rt - ab_rt

def normpdf(x, mean, sd):
    var = sd**2
    denom = (2*sym.pi*var)**.5
    num = sym.E**(-(x-mean)**2/(2*var))
    return num/denom

pdfs = np.array([sym.log(normpdf(x, 0, s)) for x in term])
func = 0
for el in pdfs:
    func += el
func = func.factor()
lmd = sym.lambdify(X, func)
def target_fun(params):
    return lmd(*params)
result = scipy.optimize.least_squares(target_fun, [10, 10, 10])

我不认为它输出正确的解决方案。

您的代码几乎是正确的。 你想最大化你的功能,因此你需要在你的功能中的 lmd 前面放置减号。

def target_fun(params):
        return -lmd(*params)

此外,初始值通常设置为小于 1。选择 10 不是最佳选择,因为算法可能会收敛到鞍点。 考虑 [0.01, 0.01, 0.01].