从 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]
.
我得到以下保证金:
我的尝试如下:
# ... 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]
.