|
|
|
|
@ -104,23 +104,38 @@ class MVO(object): |
|
|
|
|
n = ret.shape[1] |
|
|
|
|
init=np.ones(n)/n |
|
|
|
|
if role=="max_sharpe": |
|
|
|
|
if n==1: |
|
|
|
|
cov=np.array(np.cov(ret.T)) |
|
|
|
|
else: |
|
|
|
|
cov=np.cov(ret.T) |
|
|
|
|
loss = lambda w: -cls.sharpe_ratio(w, ret) |
|
|
|
|
grad = lambda w: -cls.sharpe_grad(w, ret, cov) |
|
|
|
|
elif role=="max_sortino": |
|
|
|
|
if n==1: |
|
|
|
|
cov = np.cov(np.maximum(ret, 0).T) |
|
|
|
|
else: |
|
|
|
|
cov = np.array(np.cov(np.maximum(ret, 0).T)) |
|
|
|
|
loss = lambda w: -cls.sortino_ratio(w, ret) |
|
|
|
|
grad = lambda w: -cls.sortino_grad(w, ret, cov) |
|
|
|
|
elif role=="min_volatility": |
|
|
|
|
if n==1: |
|
|
|
|
cov=np.array(np.cov(ret.T)) |
|
|
|
|
else: |
|
|
|
|
cov=np.cov(ret.T) |
|
|
|
|
loss = lambda w: cls.volatility(w, ret) |
|
|
|
|
grad = lambda w: cls.volatility_grad(w, ret, cov) |
|
|
|
|
elif role=="quadratic_utility": |
|
|
|
|
if n==1: |
|
|
|
|
cov=np.array(np.cov(ret.T)) |
|
|
|
|
else: |
|
|
|
|
cov=np.cov(ret.T) |
|
|
|
|
loss = lambda w: -cls.quadratic_utility(w, ret, gamma) |
|
|
|
|
grad = lambda w: -cls.quadratic_utility_grad(w, ret, cov, gamma) |
|
|
|
|
else: |
|
|
|
|
return init |
|
|
|
|
if n==1: |
|
|
|
|
bnds = [[0,1]] |
|
|
|
|
else: |
|
|
|
|
bnds = [[0, 0.6] for i in range(n)] |
|
|
|
|
opts = {'maxiter': 1000, 'disp': False} |
|
|
|
|
cons = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1}) |
|
|
|
|
|