SciPy optimization with grouped bounds

后端 未结 2 356
予麋鹿
予麋鹿 2020-12-13 11:45

I am trying to perform a portfolio optimization that returns the weights which maximize my utility function. I can do this portion just fine including the constraint that we

2条回答
  •  无人及你
    2020-12-13 12:17

    After much time this seems to be the only solution that fits...

    def solve_weights(Rt, b_ = None):
    
        W = np.ones(len(Rt.columns)) / len(Rt.columns)
        if  b_ is None:
            b_ = [(0.01, 1.0) for i in Rt.columns]
            c_ = ({'type':'eq', 'fun': lambda W: sum(W) - 1})
        else:
            covar = Rt.cov()
            c_ = ({'type':'eq', 'fun': lambda W: sum(W) - 1},
                  {'type':'eq', 'fun': lambda W: sqrt(np.dot(W, np.dot(covar, W)) * 252) - risk_tgt})
    
        optimized = opt.minimize(fitness, W, args = [Rt], method='SLSQP', constraints=c_, bounds=b_)  
    
        if not optimized.success: 
            raise ValueError(optimized.message)
    
       return optimized.x  # Return optimized weights
    
    class_cont = Rt.ix[0].copy()
    class_cont.ix[:] = np.around(np.hstack(Rt.groupby(axis=1, level=0).apply(solve_weights).values),3)
    scalars = class_cont.groupby(level=0).sum()
    scalars.ix[:] = np.around(solve_weights((class_cont * port_rets).groupby(level=0, axis=1).sum(), list(model['tactical'].values)),3)
    
    class_cont.groupby(level=0).transform(lambda x: x * scalars[x.name])
    

提交回复
热议问题