16 import matplotlib.pyplot
as plt
18 raise Exception(
"This example requires the matplotlib module")
22 $title Standard Markowitz Portfolio Selection Model
25 upper(s,s), lower(s,s) parts of covar matrix;
28 parameter mean(s) mean of daily return
29 covar(s,s) covariance matrix of returns (upper);
31 $if not set data $abort 'no include file name for data file provided'
33 $load s covar upper lower mean
35 variables z objective variable
42 equations obj objective
44 varcon variance constraint
45 retcon return constraint;
49 obj.. z =e= lambda*ret - (1-lambda)*var;
50 budget.. sum(s, x(s)) =e= 1.0;
51 varcon.. var =e= sum(upper(s,t), x(s)*covar(s,t)*x(t)) +
52 sum(lower(s,t), x(s)*covar(t,s)*x(t));
53 retcon.. ret =e= sum(s, mean(s)*x(s));
55 model markowitz /all/; '''
57 if __name__ ==
"__main__":
59 ws = GamsWorkspace(system_directory = sys.argv[1])
64 opt = ws.add_options()
65 opt.all_model_types =
"conopt"
66 opt.defines[
"data"] =
"\"" + os.path.join(os.path.dirname(os.path.realpath(__file__)),
"..\\Data\\markowitz.gdx") +
"\""
68 cp = ws.add_checkpoint()
70 mi = cp.add_modelinstance()
71 l = mi.sync_db.add_parameter(
"lambda", 0,
"")
72 mi.instantiate(
"markowitz use nlp max z", GamsModifier(l))
78 l.add_record().value = 0
80 min_ret = mi.sync_db[
"ret"].first_record().level
81 data_points.append( (min_ret, mi.sync_db[
"var"].first_record().level) )
82 l.first_record().value = 1
84 max_ret = mi.sync_db[
"ret"].first_record().level
85 data_points.append( (max_ret, mi.sync_db[
"var"].first_record().level) )
91 intervals = [((0.0, min_ret), (1.0, max_ret))]
99 min_l, min_ret = i[0][0], i[0][1]
100 max_l, max_ret = i[1][0], i[1][1]
102 l_val = (min_l+max_l)/2
103 l.first_record().value = l_val
107 cur_ret = mi.sync_db[
"ret"].first_record().level
108 data_points.append( (cur_ret, mi.sync_db[
"var"].first_record().level) )
110 if cur_ret - min_ret > gap:
111 intervals.append(((min_l, min_ret), (l_val, cur_ret)))
112 if fabs(cur_ret - max_ret) > gap:
113 intervals.append(((l_val, cur_ret), (max_l, max_ret)))
116 data_points.sort(key=
lambda tup: tup[0])
117 ret = map(
lambda x: x[0], data_points)
118 var = map(
lambda x: x[1], data_points)
119 plt.plot(ret, var, marker=
".", markersize=10)
121 plt.ylabel(
'variance')