gpt4 book ai didi

python-3.x - 当使用 scipy.optimize 和 "SLSQP"方法时,最终结果保持初始值

转载 作者:行者123 更新时间:2023-12-02 13:07:29 28 4
gpt4 key购买 nike

这是一个 Assets 配置的金融工程问题。有四种 Assets 类别:股票、固定 yield 、CTA策略和相对值(value)策略。给出了它们的返回和协方差矩阵。对于结果,预计会增加固定 yield Assets 的权重,减少股票的权重,而不是初始权重。

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

sigma = [ [0.019828564,0.002498922,0.003100164,0.001272493],[0.002498922,0.005589884,0.000511829,0.000184773],[0.003100164,0.000511829,0.001559972,0.00019131],[0.001272493,0.000184773,0.00019131,0.0001306]]

sigma_p = np.matrix(sigma)

0、1、2、3分别为'stock_idx'、'CTA_idx'、'RelativeValue_idx'、'bond_idx'

我正在尝试使用“风险-平价”方法找到他们的最佳权重,最终求解方程:

![风险平价目标方程] /image/PdR73.png

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

def calculate_portfolio_var(W,C):
# function that calculates portfolio risk
sigma_p = np.sqrt(np.dot(np.dot(W.T,C),W))
return sigma_p

def calculate_risk_contribution(W,C):
MRC = np.dot(C,W)# Marginal Risk
RC = np.multiply(W,MRC)# Total Risk
return RC

def solve_weight(C,N): #C is the covariance matrix, and given as sigma_p before
def risk_budget_objective(W,C,N):
W = np.matrix(W).T
sig_p = calculate_portfolio_var(W,C) # portfolio sigma
total_RC = calculate_risk_contribution(W,C)
risk_target = sig_p / N
# sum of squared error
J = sum(np.square(total_RC / sig_p - risk_target))

print("SSE",J[0,0])
return J[0,0]

def total_weight_constraint(x):
return np.sum(x)-1.0

def long_only_constraint(x):
return
w0 = [0.1, 0.2, 0.3, 0.4]
w0 = np.matrix(w0).T
print('w0',w0,w0.shape)
b_ = [(0., 1.) for i in range(N)]
c_ = ({'type': 'eq', 'fun': lambda W: np.sum(W) - 1.})
optimized = scipy.optimize.minimize(risk_budget_objective, w0, (C,N), method='SLSQP', constraints=c_, bounds=b_)
if not optimized.success: raise BaseException(optimized.message)
w_rb = np.asmatrix(optimized.x)
return 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]]) 

关于python-3.x - 当使用 scipy.optimize 和 "SLSQP"方法时,最终结果保持初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55565921/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com