14import matplotlib.pyplot
as plt
15from gams
import GamsModifier, GamsWorkspace
16from pathlib
import Path
22 upper(s,s) 'parts of covar matrix'
23 lower(s,s) 'parts of covar matrix';
28 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
37 z 'objective variable'
47 varcon 'variance constraint'
48 retcon 'return constraint';
52obj.. z =e= lambda*ret - (1-lambda)*var;
54budget.. sum(s, x(s)) =e= 1.0;
56varcon.. var =e= sum(upper(s,t), x(s)*covar(s,t)*x(t)) +
57 sum(lower(s,t), x(s)*covar(t,s)*x(t));
59retcon.. ret =e= sum(s, mean(s)*x(s));
61Model markowitz / all /;
64if __name__ ==
"__main__":
65 sys_dir = sys.argv[1]
if len(sys.argv) > 1
else None
66 work_dir = sys.argv[2]
if len(sys.argv) > 2
else "."
67 ws = GamsWorkspace(system_directory=sys_dir, working_directory=work_dir)
69 job = ws.add_job_from_string(GAMS_MODEL)
70 opt = ws.add_options()
71 opt.all_model_types =
"conopt"
74 Path(ws.system_directory,
"apifiles",
"Data",
"markowitz.gdx"),
75 Path(ws.working_directory,
"markowitz.gdx"),
78 markowitz_path = Path(ws.working_directory,
"markowitz.gdx").resolve()
79 opt.defines[
"data"] = f
'"{markowitz_path}"'
81 cp = ws.add_checkpoint()
83 mi = cp.add_modelinstance()
84 l = mi.sync_db.add_parameter(
"lambda", 0,
"")
85 mi.instantiate(
"markowitz use nlp max z", GamsModifier(l))
91 l.add_record().value = 0
93 min_ret = mi.sync_db[
"ret"].first_record().level
94 data_points.append((min_ret, mi.sync_db[
"var"].first_record().level))
95 l.first_record().value = 1
97 max_ret = mi.sync_db[
"ret"].first_record().level
98 data_points.append((max_ret, mi.sync_db[
"var"].first_record().level))
105 intervals = [((0.0, min_ret), (1.0, max_ret))]
113 min_l, min_ret = i[0][0], i[0][1]
114 max_l, max_ret = i[1][0], i[1][1]
116 l_val = (min_l + max_l) / 2
117 l.first_record().value = l_val
123 cur_ret = mi.sync_db[
"ret"].first_record().level
124 data_points.append((cur_ret, mi.sync_db[
"var"].first_record().level))
127 if fabs(cur_ret - min_ret) > gap:
128 intervals.append(((min_l, min_ret), (l_val, cur_ret)))
129 if fabs(cur_ret - max_ret) > gap:
130 intervals.append(((l_val, cur_ret), (max_l, max_ret)))
133 data_points.sort(key=
lambda tup: tup[0])
134 ret = [x[0]
for x
in data_points]
135 var = [x[1]
for x
in data_points]
136 plt.plot(ret, var, marker=
".", markersize=10)
138 plt.ylabel(
"variance")
139 plt.savefig(Path(ws.working_directory,
"figure"))