Commit b4804c14 authored by Dr.李's avatar Dr.李

added mean variance optimizer

parent b03929b9
...@@ -228,6 +228,9 @@ def factor_analysis(factors: pd.DataFrame, ...@@ -228,6 +228,9 @@ def factor_analysis(factors: pd.DataFrame,
elif method == 'ls' or method == 'long_short': elif method == 'ls' or method == 'long_short':
weights = build_portfolio(er, weights = build_portfolio(er,
builder=method) builder=method)
elif method == 'mv' or method == 'mean_variance':
weights = build_portfolio(er,
builder=method)
if detail_analysis: if detail_analysis:
analysis = data_pack.settle(weights, d1returns) analysis = data_pack.settle(weights, d1returns)
......
...@@ -8,10 +8,7 @@ Created on 2017-6-27 ...@@ -8,10 +8,7 @@ Created on 2017-6-27
import numpy as np import numpy as np
from typing import Union from typing import Union
from typing import Tuple from typing import Tuple
from cvxopt import matrix from alphamind.cython.optimizers import QPOptimizer
from cvxopt import solvers
solvers.options['show_progress'] = False
def mean_variance_builder(er: np.ndarray, def mean_variance_builder(er: np.ndarray,
...@@ -25,39 +22,27 @@ def mean_variance_builder(er: np.ndarray, ...@@ -25,39 +22,27 @@ def mean_variance_builder(er: np.ndarray,
lbound = lbound - bm lbound = lbound - bm
ubound = ubound - bm ubound = ubound - bm
transposed_risk_exposure = risk_exposure.T
risk_target = risk_target - transposed_risk_exposure @ bm
# set up problem for net position
n = len(er)
P = lam * matrix(cov)
q = -matrix(er)
G1 = np.zeros((2*n, n))
h1 = np.zeros(2*n)
for i in range(n):
G1[i, i] = 1.
h1[i] = ubound[i]
G1[i+n, i] = -1.
h1[i+n] = -lbound[i]
m = len(transposed_risk_exposure)
G2 = np.concatenate([transposed_risk_exposure, -transposed_risk_exposure]) bm_risk = risk_exposure.T @ bm
h2 = np.zeros(2*m)
for i in range(m): clbound = risk_target[0] - bm_risk
h2[i] = risk_target[1][i] cubound = risk_target[1] - bm_risk
h2[i+m] = -risk_target[0][i]
G = matrix(np.concatenate([G1, G2])) optimizer = QPOptimizer(er,
h = matrix(np.concatenate([h1, h2])) cov,
lbound,
ubound,
risk_exposure.T,
clbound,
cubound,
lam)
sol = solvers.qp(P, q, G, h) if optimizer.status() == 0:
status = 'optimal'
else:
status = optimizer.status()
return sol['status'], sol['dual objective'], np.array(sol['x']).flatten() + bm return status, optimizer.feval(), optimizer.x_value() + bm
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment