forked from EmilienDupont/markowitz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmarkowitz.py
executable file
·54 lines (36 loc) · 1.19 KB
/
markowitz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python
from gurobipy import *
def optimize(r, Sigma, maxRisk):
print "in markowitz!"
m = Model()
n = len(r) # number of stocks
# Add variables (one for each stock)
x = {};
for i in range(n):
x[i] = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name = 'x' + str(i))
m.update()
# Add constraints
m.addConstr(quicksum(x[i] for i in range(n)) == 1)
variance = 0
for i in range(n):
for j in range(n):
variance += x[i]*Sigma[i][j]*x[j]
# Set objective
m.setObjective(quicksum(r[i]*x[i] for i in range(n)), GRB.MAXIMIZE)
m.addConstr(variance <= maxRisk*maxRisk)
m.update()
m.optimize()
solution = {'Stocks': [], 'Return': []}
stocks = []
# Check if model is infeasible or unbounded (or numerical trouble)
if (m.status == 3 or m.status == 4 or m.status == 12):
sol = 0
stocks = [0] * n # Send list of zeros if infeasible
else:
sol = m.ObjVal
for v in m.getVars():
stocks.append(v.x)
solution['Return'] = sol
solution['Stocks'] = stocks
print solution
return solution