Python 使用优化时出错';s最小化求解复合期权模型中的参数';s参数
我想使用scipy优化的最小化来解决多元函数_正规函数中嵌入的一个参数: 复合期权方程:Python 使用优化时出错';s最小化求解复合期权模型中的参数';s参数,python,scipy-optimize,scipy-optimize-minimize,Python,Scipy Optimize,Scipy Optimize Minimize,我想使用scipy优化的最小化来解决多元函数_正规函数中嵌入的一个参数: 复合期权方程: import numpy as np from scipy.optimize import fsolve, minimize, root from scipy.stats import multivariate_normal as mvn from scipy.stats import norm import math def compute_CO(s, d, m, k, d_, Rti, Rtd, Si
import numpy as np
from scipy.optimize import fsolve, minimize, root
from scipy.stats import multivariate_normal as mvn
from scipy.stats import norm
import math
def compute_CO(s, d, m, k, d_, Rti, Rtd, SigmaTi, SigmaTd, DeltaTi, DeltaTd):
h1 = (np.log((s + d)/(k + d_))+(Rti - 0.5*SigmaTi**2) * DeltaTi) / (SigmaTi*np.sqrt(DeltaTi))
h2 = (np.log((s+d)/m)+(Rti-0.5*SigmaTd**2)*DeltaTd) / (SigmaTd*np.sqrt(DeltaTd))
m1 = np.array([[(h1 + SigmaTi)], [(h2 + SigmaTd)]])
m2 = np.array([[h1], [h2]])
rho = np.sqrt(DeltaTi/DeltaTd)
covariance = np.array([[1, rho],[rho,1]])
n2 = mvn(cov = covariance)
call = (s+d)*n2.cdf(np.array([h1+SigmaTi, h2+SigmaTd])) - m*np.exp(-Rtd*DeltaTd)*n2.cdf(np.array([h1,h2])) - k*np.exp(-Rti*DeltaTi)*norm.cdf(h1)
return call
sigmaV = 0.245
t = 10.48 - 0.2
m = 7.16
r = 0.0163
k = 130
ti = 0.2
td = 10.48
sigmaE = 0.258
ri = 0.1603 / 100
c0 = 6.85
def test_2(v, m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0):
return compute_CO(v, m, k, v_star, r, ri, sigmaV, sigmaE, td, ti) - c0
minimize(test_2, 200, args = (m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0))
我的未知是v,它是h1中的一个参数,h1是mvn中的一个参数。当我设置我的已知值并使用方程求解我的方程时:
import numpy as np
from scipy.optimize import fsolve, minimize, root
from scipy.stats import multivariate_normal as mvn
from scipy.stats import norm
import math
def compute_CO(s, d, m, k, d_, Rti, Rtd, SigmaTi, SigmaTd, DeltaTi, DeltaTd):
h1 = (np.log((s + d)/(k + d_))+(Rti - 0.5*SigmaTi**2) * DeltaTi) / (SigmaTi*np.sqrt(DeltaTi))
h2 = (np.log((s+d)/m)+(Rti-0.5*SigmaTd**2)*DeltaTd) / (SigmaTd*np.sqrt(DeltaTd))
m1 = np.array([[(h1 + SigmaTi)], [(h2 + SigmaTd)]])
m2 = np.array([[h1], [h2]])
rho = np.sqrt(DeltaTi/DeltaTd)
covariance = np.array([[1, rho],[rho,1]])
n2 = mvn(cov = covariance)
call = (s+d)*n2.cdf(np.array([h1+SigmaTi, h2+SigmaTd])) - m*np.exp(-Rtd*DeltaTd)*n2.cdf(np.array([h1,h2])) - k*np.exp(-Rti*DeltaTi)*norm.cdf(h1)
return call
sigmaV = 0.245
t = 10.48 - 0.2
m = 7.16
r = 0.0163
k = 130
ti = 0.2
td = 10.48
sigmaE = 0.258
ri = 0.1603 / 100
c0 = 6.85
def test_2(v, m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0):
return compute_CO(v, m, k, v_star, r, ri, sigmaV, sigmaE, td, ti) - c0
minimize(test_2, 200, args = (m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0))
但是当我运行最小化时,我得到了这种类型的错误报告:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-16-3e20f74b2dc3> in <module>()
1 args_2 = (m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0)
2
----> 3 root(test_2, 200, args = (m, k, v_star, r, ri, sigmaV, sigmaE, td, ti, c0))
8 frames
<__array_function__ internals> in apply_along_axis(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/scipy/stats/_multivariate.py in <lambda>(x_slice)
551 # mvnun expects 1-d arguments, so process points sequentially
552 func1d = lambda x_slice: mvn.mvnun(lower, x_slice, mean, cov,
--> 553 maxpts, abseps, releps)[0]
554 out = np.apply_along_axis(func1d, -1, x)
555 return _squeeze_output(out)
ValueError: unexpected array size: new_size=2, got array with arr_size=1
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1 args_2=(m,k,v_星,r,ri,sigmaV,sigmaE,td,ti,c0)
2.
---->3根(测试2,200,args=(m,k,v_星,r,ri,sigmaV,sigmaE,td,ti,c0))
8帧
沿_轴应用_(*args,**kwargs)
/usr/local/lib/python3.7/dist-packages/scipy/stats//u multivariable.py in(x_切片)
551#mvnun需要一维参数,因此按顺序处理点
552 func1d=λx_切片:mvn.mvnun(下,x_切片,平均值,cov,
-->553最大值、绝对值、释放值[0]
554 out=np。沿_轴应用_(func1d,-1,x)
555返回压缩输出(输出)
ValueError:意外的数组大小:new_size=2,获取的数组的arr_size=1
这个错误似乎与mvn函数有关,但我不知道如何解决它。有人能帮我解决这个问题吗?我会非常感激的