微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

目标函数中的 Scipy 优化函数?

如何解决目标函数中的 Scipy 优化函数?

我认为这是一个针对 stackoverflow 而不是针对 quant stack exchange 的问题,因为它更多地与编程而非财务相关。在下面的代码中,我想最小化最终的方程。除了当然 X 之外,每个变量都被定义。应该进行最小化才能找到我 X。

price_non_renew = -(pmwh + rp) * svnr
revenue_client = X * svnr
k = X - mn - rp
put = euro_vanilla_black(ul,k,crd/12,r = 0,sigma = 0.20)
revenue_client + put * N + price_non_renew --> 0 #to minimize

euro_vanilla_black 是:

import scipy.stats as si

def euro_vanilla_black(F,K,T,r,sigma,option = 'put'):
    
    d1 = (np.log(F / K) + (+ 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    d2 = (np.log(F / K) + (- 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    
    if option == 'call':
        result = F * si.norm.cdf(d1,0.0,1.0) - K * si.norm.cdf(d2,1.0)
    if option == 'put':
        result = K * si.norm.cdf(-d2,1.0) - F * si.norm.cdf(-d1,1.0)
    
    return np.exp(-r * T) * result

我将目标函数定义为:

def obj_func(X,a,b,c,d,e,f,g,h,n):
   pnr = -(a + b) * c
   rc = X * c
   k = X - d - b
   put = n * euro_vanilla_black(e,f/12,r = g,sigma = h)
   return rc+ put + pnr

import scipy.optimize as sco
sco.minimize(obj_func,20,args=(20.25,0.51,798.81,0.38,20.38,12,0.20,365))

我明白了:

__main__:3: RuntimeWarning: invalid value encountered in log
__main__:4: RuntimeWarning: invalid value encountered in log
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in greater
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in less
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:1827: RuntimeWarning: invalid value encountered in greater_equal
  cond2 = (x >= np.asarray(_b)) & cond0
__main__:3: RuntimeWarning: invalid value encountered in log
__main__:4: RuntimeWarning: invalid value encountered in log
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in greater
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in less
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:1827: RuntimeWarning: invalid value encountered in greater_equal
  cond2 = (x >= np.asarray(_b)) & cond0
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\optimize\linesearch.py:429: RuntimeWarning: invalid value encountered in greater
  if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\optimize\linesearch.py:430: RuntimeWarning: invalid value encountered in greater_equal
  ((phi_a1 >= phi_a0) and (i > 1)):
__main__:3: RuntimeWarning: invalid value encountered in log
__main__:4: RuntimeWarning: invalid value encountered in log
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in greater
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:903: RuntimeWarning: invalid value encountered in less
  return (a < x) & (x < b)
C:\Users\eliot.tabet\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py:1827: RuntimeWarning: invalid value encountered in greater_equal
  cond2 = (x >= np.asarray(_b)) & cond0
Out[153]: 
      fun: array([nan])
 hess_inv: array([[0.03700799]])
      jac: array([nan])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 342
      nit: 2
     njev: 114
   status: 2
  success: False
        x: array([-11155.49767143])

谁能帮帮我吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。