首页 > 解决方案 > 使用优化的最小化求解复合期权模型参数中的参数的错误

问题描述

我想使用 scipy 优化的最小化来解决嵌入在 Multivariate_Normal 函数中的参数:

复合期权方程:

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

我的未知数是v,它是h1中的一个参数,而h1是mvn中的一个参数。当我设置我的已知并使用方程来求解我的方程时:

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

似乎错误与mvn函数有关,但我不知道如何解决。有人可以帮我解决这个错误吗?我会很感激的!

标签: pythonscipy-optimizescipy-optimize-minimize

解决方案


推荐阅读