Python 3.x 使用scipy.optimize时,以及;SLSQP“;方法,最终结果保留在初始值上

Python 3.x 使用scipy.optimize时,以及;SLSQP“;方法,最终结果保留在初始值上,python-3.x,financial,Python 3.x,Financial,这是一个资产配置的金融工程问题。有四种资产类别:股票、固定收益、CTA策略和相对价值策略。给出了它们的回归矩阵和协方差矩阵。因此,预计固定收益资产的权重将增加,股票的权重将减少,而不是初始权重 协方差矩阵(4*4矩阵)如下所示(以下代码中的C): 因为0,1,2,3分别是“股票idx”、“CTA idx”、“相对价值idx”、“债券idx” 我正试图使用“风险平价”方法找到它们的最佳权重,这最终解决了方程: !![风险平价目标方程] 我使用了python中的scipy.optimize和“SLS

这是一个资产配置的金融工程问题。有四种资产类别:股票、固定收益、CTA策略和相对价值策略。给出了它们的回归矩阵和协方差矩阵。因此,预计固定收益资产的权重将增加,股票的权重将减少,而不是初始权重

协方差矩阵(4*4矩阵)如下所示(以下代码中的C):

因为0,1,2,3分别是“股票idx”、“CTA idx”、“相对价值idx”、“债券idx”

我正试图使用“风险平价”方法找到它们的最佳权重,这最终解决了方程:

!![风险平价目标方程]

我使用了python中的scipy.optimize和“SLSQP”方法,这是唯一可以在求解过程中应用边界和约束的方法。然而,无论初始猜测是如何选择的,该机制都不起作用,总是返回初始猜测。代码如下:

def计算投资组合风险值(W,C):
#计算投资组合风险的函数
sigma_p=np.sqrt(np.dot(np.dot(W.T,C),W))
返回sigma\u p
def计算风险贡献(W,C):
MRC=np.点(C,W)#边际风险
RC=np.乘(W,MRC)#总风险
返回RC
def solve_weight(C,N):#C是协方差矩阵,前面以sigma_p表示
def风险预算目标(W、C、N):
W=np.矩阵(W).T
sig_p=计算投资组合风险值(W,C)#投资组合西格玛
总风险=计算风险贡献(W,C)
风险目标=sig\U p/N
#误差平方和
J=总和(np.平方(总风险/信号-风险目标))
打印(“SSE”,J[0,0])
返回J[0,0]
def总重量约束(x):
返回np.和(x)-1.0
def long_only_约束(x):
返回
w0=[0.1,0.2,0.3,0.4]
w0=np.矩阵(w0).T
打印('w0',w0,w0.形状)
对于范围(N)内的i,b_uz=[(0,1.)]
c=({'type':'eq','fun':lambda W:np.sum(W)-1.})
优化=scipy.optimize.minimize(风险\预算\目标,w0,(C,N),方法='SLSQP',约束=C,界限=b)
如果未优化。成功:引发BaseException(优化。消息)
w_rb=np.asmatrix(优化的.x)
返回w_rb

这似乎是一个数字精度问题,因为计算的成本函数的值非常小。解决这个问题有两种方法。或者将代价函数乘以某个标量,使其返回更大的值。 例如
J=sum(np.square(total_RC/sig_p-risk_target))*100
或将收敛公差设置为较小的值。默认值为1e-6

optimized = minimize(risk_budget_objective, w0, (C,N), method='SLSQP', constraints=c_, bounds=b_  , options ={'ftol':1e-8})
代码在进行更改后按预期工作。以下是输出

matrix([[0.04780104, 0.12432431, 0.19918203, 0.62869262]]) 

预期的结果是为固定收益资产分配更多的权重,而为股票分配更少的权重,而不是初始权重。你能提供可验证的代码吗。你的“C”和“N”矩阵是什么?此外,约束定义c_u的代码不完整。很抱歉,约束如下,粘贴错误:c_u=({'type':'eq','fun':lambda W:np.sum(W)-1.}),c是协方差矩阵,它是前一上下文中的“sigma_p”,N是资产类别的编号,这里的N=4
matrix([[0.04780104, 0.12432431, 0.19918203, 0.62869262]])