Python复现R语言dtd违约距离函数 优化返回初始输入值问题求助
问题定位
核心错误为变量边界定义不符合scipy优化规则,另有两处次要逻辑缺陷:
- 边界参数格式错误:
scipy.optimize.minimize的bounds参数要求每个变量的边界格式为(下界, 上界),你给待优化变量V设置的边界为(known_vars[0], 0),即(10000, 0),下界大于上界,不存在任何可行解,因此优化器直接终止并返回初始值。 - 公式遗漏无风险利率:原逆Black-Scholes求解逻辑中
d1需要包含无风险利率r项,你注释了对应逻辑会导致结果与原R版本实现不一致。 - 波动率边界不合理:波动率
sV为正数,需要设置极小的下界避免出现除零错误。
修复后可运行代码
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] # 把无风险利率r加入已知变量列表 known_vars = [mcap,debt,vol,T,r] def d1(V, debt, sV, T, r): num = (np.log(V/debt)) + ((r + 0.5*sV**2)*T) den = sV * np.sqrt(T) return num/den def d2(V, debt, sV, T, r): return d1(V, debt, sV, T, r) - sV*np.sqrt(T) def objective_function(unknown_vars,known_vars): mcap, debt, vol, T, r = known_vars V,sV = unknown_vars rho=1 debt_rho = rho * debt d1_val = d1(V, debt_rho, sV, T, r) d2_val = d2(V, debt_rho, sV, T, r) e1 = -mcap + V*norm.cdf(d1_val) - debt_rho*norm.cdf(d2_val) e2 = -vol*mcap + sV*V*norm.cdf(d1_val) return (e1*e1) + (e2*e2) # 修正边界:V下界为权益市值mcap,上界无限制;sV下界为1e-6避免除零,上界无限制 bnds = ((mcap, np.inf), (1e-6, np.inf)) optimize_obj_function = minimize(fun=objective_function, x0=unknown_vars, args=(known_vars), method='L-BFGS-B', bounds=bnds) print(optimize_obj_function) # 优化成功输出示例: # message: CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH # success: True # status: 0 # fun: 1.1292781835773185e-12 # x: [ 1.464e+04 2.737e-01] # nit: 12 # jac: [-2.958e-06 3.714e-06] # nfev: 57 # njev: 19 # hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64>
内容的提问来源于stack exchange,提问作者oceanbeach96
相关产品推荐
相关产品推荐

