【问题标题】:Minimizing objective function returns the same initial inputs as output最小化目标函数返回与输出相同的初始输入
【发布时间】:2021-11-12 05:32:19
【问题描述】:

我目前正在将 R (https://rdrr.io/rforge/ifrogs/src/R/dtd.R) 到默认函数的距离复制到 python 中。已知变量为mcapdebtvolr,未知变量为VsVV的初始值设置为mcap+debt sV设置为(mcap * vol) / debt

link 提供了有关我们试图最小化的目标函数的更多详细信息。

我在optimize_obj_function 步骤(最后)时遇到了一些问题。任何有助于识别我所犯错误的帮助将不胜感激!输入定义如下的最小化函数的结果如下:

optimize_obj_function 返回相同的初始值集

fun: array(0.)
hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64>
jac: array([0., 0.])
message: b'ERROR: NO FEASIBLE SOLUTION'
nfev: 0
nit: 0
status: 2
success: False
x: array([1.5e+04, 8.0e-01])

代码如下:

import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize 

mcap=10000
debt=5000
vol=0.4
r=0.1
V=mcap+debt
sV=(mcap * vol) / debt
T=1

unknown_vars = [V,sV]
known_vars = [mcap,debt,vol,T]

#Solving reverse Black-Scholes for market value of asset and asset volatility  
def d1(V, debt, sV, T):
    num = (np.log(V/debt)) + ((0.5*sV**2)*T)
    #num = (np.log(V/debt)) + ((r_f + 0.5*sV**2)*T)
    den = sV * np.sqrt(T)    
    return num/den

def d2(V, debt, sV, T):
    d2 = d1(V, debt, sV, T) - sV*np.sqrt(T)
    return d2

unknown_vars = [V,sV]
known_vars = [mcap,debt,vol,T]
    
def objective_function(unknown_vars,known_vars):
    mcap, debt, vol, T = known_vars
    V,sV = unknown_vars
    rho=1
    e1 = -mcap + V*norm.cdf(d1(V,debt*rho,sV,T)) - rho*debt*norm.cdf(d2(V,rho*debt,sV,T))
    e2 = -vol*mcap + sV*V*norm.cdf(d1(V,debt*rho,sV,T))
    obj_fun = (e1*e1) + (e2*e2)
    return obj_fun

''' Description of input variables of objective function:
x[0] = V = starting value of market value of equity    
x[1] = sV = starting value of asset volatility of equity    
x[2] = mcap = market cap of equity (CRSP vars = abs(PRC) x SHROUT)
x[3] = debt*rho = book value of debt * rho
x[4] = vol = volatility of asset returns
x[5] = T = time to maturity (1 year)
'''

#Solve for asset value and asset volatility - estimated from the market value 
#and volatility of equity, and the book value of liabilities. Minimize the error term

bnds = ((known_vars[0], 0), (np.inf,np.inf))
optimize_obj_function = minimize(fun=objective_function, 
                                 x0=unknown_vars,
                                 args=(known_vars),
                                 method='L-BFGS-B', 
                                 bounds=bnds)

optimize_obj_function.x # array([1.5e+04, 8.0e-01]) -> same as inputs

【问题讨论】:

  • 您能否提供导入语句以便我们运行您的代码?例如。对于normminimize
  • @Bill scipy 导入已添加
  • 你的代码还是有问题。我认为您可能在objective_function 定义上遗漏了一个右括号。
  • 很确定我的错误是在最小化步骤中,我只是不确定我定义错误的部分
  • 我收到ValueError: LBFGSB - one of the lower bounds is greater than an upper bound. 请确保您的代码重现了您希望我们解决的问题。

标签: python r optimization scipy


【解决方案1】:

在您的最小化语句中,您没有传递目标函数。相反,您传递的是以下浮点值:

print(objective_function(unknown_vars,known_vars))
# 29679735.772182897

要将目标函数传递给 scipy.minimize,请执行以下操作:

optimize_obj_function = minimize(fun=objective_function, 
                                 x0=unknown_vars,
                                 args=(known_vars),
                                 method='L-BFGS-B', 
                                 bounds=bnds)

请注意,您的目标函数必须具有最小化期望的参数。

另外,你的界限组织不正确。您的代码可能还有其他问题,(此时我放弃了)。

正如您在下面指出的,边界应该是

bnds = ((known_vars[0], np.inf), (0, np.inf))

建议阅读scipy.optimize.minimize 上的文档,并在尝试自己的问题之前先尝试其中的一些示例。

【讨论】:

  • 你推荐的optimize_obj_function正是我做的?
  • 看起来你编辑了代码,所以是的,现在是正确的。现在修复边界(请参阅有关如何组织它们的文档)。之后我发现它收敛到这个解决方案:x: array([1.49999905e+04, 2.66669643e-01])。这是否符合您的预期?
  • 是的,这正是我所追求的!
  • 哇,我的错误很容易解决。感谢您的帮助并指出有关错误指定边界的问题。假设是这样 -> bnds = ((known_vars[0], np.inf), (0,np.inf))。如果你想更新你的答案,我可以接受 :) 你很有帮助 :)
  • 奇怪的是,为什么你没有得到回溯ValueError: LBFGSB - one of the lower bounds is greater than an upper bound.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多