Python 中的 CVar 优化

问题描述 投票:0回答:1

我是 python 的新手。我正在尝试编写有关投资组合优化的代码。更具体地说,我想应用以下内容,使用 scipy.optimize

CvAR definition

def minimize_cvar(sim_corr_rets, er, target_return, alpha=0.01):
    """
    Returns the optimal weights (n x 1) that achieve the target return
    and minimize cvar, based on a set of simulated correlated returns (n x S)
    and an array of expected returns (er)=(n x 1)
    """
    n = er.shape[0] # number of assets
    S = sim_corr_rets.shape[1] # number of simulations
    
    init_guess = np.repeat(1/n, n)
    
    bounds = ((0.0, 1.0),) * n # an n-tuple of 2-tuples!
    
    def cvar(var, var_dev, S, alpha):
        return var+np.sum(var_dev)/(S*(1-alpha))   

    constraints_1 = {'type': 'eq','fun': lambda weights: np.sum(weights) - 1},
    constraints_2 = {'type': 'eq','args': (er,),'fun': lambda weights, er: target_return - weights.T @ er}
      
    cons_3 = []
    for i in range(S): cons_3.append({'type':'ineq','args': (sim_corr_rets,), 'fun': lambda weights, var, var_dev, i = i: var_dev.iloc[i] - weights.T @ sim_corr_rets.iloc[:,i] + var})    
    constraints_3 = tuple(cons_3)
    
    cons_4 = []
    for i in range(S): cons_4.append({'type':'ineq','fun': lambda var_dev, i = i: var_dev.iloc[i]})    
    constraints_4 = tuple(cons_4)
  
    results = minimize(cvar, 
                       init_guess,
                       method='SLSQP',
                       options={'disp': False},
                       constraints=(constraints_1, constraints_2, constraints_3, constraints_4),
                       bounds=bounds)
    return results.x

当我运行这段代码时,出现以下错误(很可能与约束有关):

AttributeError                            Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_5816\2309333620.py in <module>
      3 get_ipython().run_line_magic('matplotlib', 'inline')
      4 import optimizer as opt
----> 5 opt.minimize_cvar(sim_corr_rets, ERA, target_return=0.03, alpha=0.01)

~\optimizer.py in minimize_cvar(sim_corr_rets, er, target_return, alpha)
    201     constraints_4 = tuple(cons_4)
    202 
--> 203     results = minimize(cvar, 
    204                        init_guess,
    205                        method='SLSQP',

C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    655             fd_needed = (not callable(jac))
    656             for con in constraints:
--> 657                 if not callable(con.get('jac', None)):
    658                     fd_needed = True
    659 

AttributeError: 'tuple' object has no attribute 'get'

谁能帮我解决这个问题,以获得最小化投资组合 CVaR 的权重?此外,我不确定 var_dev 是否是变量。

谢谢。

python optimization portfolio
1个回答
0
投票

CVaR 优化在实践中通常通过线性规划来解决,参见https://doi.org/10.21314/JOR.2000.038.

所以好的第一步是使用 scipy 的 linprog:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html

而不是用'SLSQP'最小化。

Python 中也已经有很好的 CVaR 优化实现。如果你浏览 GitHub,你应该可以从中汲取灵感

© www.soinside.com 2019 - 2024. All rights reserved.