【发布时间】:2021-11-12 05:32:19
【问题描述】:
我目前正在将 R (https://rdrr.io/rforge/ifrogs/src/R/dtd.R) 到默认函数的距离复制到 python 中。已知变量为mcap、debt、vol 和r,未知变量为V 和sV。 V的初始值设置为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
【问题讨论】:
-
您能否提供导入语句以便我们运行您的代码?例如。对于
norm和minimize -
@Bill scipy 导入已添加
-
你的代码还是有问题。我认为您可能在objective_function 定义上遗漏了一个右括号。
-
很确定我的错误是在最小化步骤中,我只是不确定我定义错误的部分
-
我收到
ValueError: LBFGSB - one of the lower bounds is greater than an upper bound.请确保您的代码重现了您希望我们解决的问题。
标签: python r optimization scipy