# Portfolio selection param info symbolic, := "File name: markL2_minrisk.txt; Author: R.J. Vanderbei"; display info; reset; set Assets; # asset categories set Dates; # dates param T := card(Dates); param mu; param R {Dates,Assets}; param mean {j in Assets} := ( sum{t in Dates} R[t,j] )/T; param Rdev {t in Dates, j in Assets} := R[t,j] - mean[j]; param variance {j in Assets} := ( sum{t in Dates} Rdev[t,j]^2 )/T; var x{Assets} >= 0; minimize risk: sum{t in Dates} (sum{j in Assets} Rdev[t,j]*x[j])^2 / T; s.t. reward_bound: sum{j in Assets} mean[j]*x[j] >= mu; s.t. tot_mass: sum{j in Assets} x[j] = 1; data; set Assets := mdy xlb xli xlu spy qqq xle xlk xlv xlf xlp xly; set Dates := include 'dates.txt'; param R: mdy xlb xli xlu spy qqq xle xlk xlv xlf xlp xly := include 'returns.txt' ; printf {j in Assets}: "%10.7f %10.5f \n", mean[j]^(12), sum{t in Dates} (Rdev[t,j])^2/T > "assets"; set assets_min_var ordered := {j in Assets: variance[j] == min {jj in Assets} variance[jj]}; param maxmean := max {j in Assets} mean[j]; param minmean := mean[first(assets_min_var)]; display mean, variance; display minmean, maxmean; printf {j in Assets}: " %5s ", j > "portfolio_minrisk"; printf " | reward risk \n" > "portfolio_minrisk"; for {k in 0..20} { display k; let mu := (k/20)*minmean + (1-k/20)*maxmean; solve; printf {j in Assets}: "%7.4f ", x[j] > "portfolio_minrisk"; printf " | %7.4f %7.4f \n", (sum{j in Assets} mean[j]*x[j])^(12), sum{t in Dates} (sum{j in Assets} Rdev[t,j]*x[j])^2 / T > "portfolio_minrisk"; }