{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Portfolio Optimization - Unconstrained Markowitz Efficient Frontier \n",
"\n",
"In this problem, we will find the unconstrained portfolio allocation where we introduce the weighting parameter $\\lambda(0 \\leq \\lambda \\leq$ 1)and minimize the $\\lambda * risk - (1-\\lambda)* return$. By varying the values of $\\lambda$, we trace out the efficient frontier. \n",
"\n",
"Suppose that we know the mean returns $R \\in \\mathbf{R}^n$ of each asset and the covariance $Q \\in \\mathbf{R}^{n \\times n}$ between the assets. Our objective is to find a portfolio allocation that minimizes the *risk* (which we measure as the variance $w^T Q w$) and maximizes the *return* ($w^T R$) of the portfolio of the simulataneously. We suppose further that our portfolio allocation must comply with some lower and upper bounds on the allocation, $w_\\mbox{lower} \\leq w \\leq w_\\mbox{upper}$ and also $w \\in \\mathbf{R}^n$ $\\sum_i w_i = 1$.\n",
"\n",
"This problem can be written as\n",
"\n",
"\\begin{array}{ll}\n",
" \\mbox{minimize} & \\lambda*w^T Q w - (1-\\lambda)*w^T R \\\\\n",
" \\mbox{subject to} & \\sum_i w_i = 1 \\\\\n",
" & w_\\mbox{lower} \\leq w \\leq w_\\mbox{upper}\n",
"\\end{array}\n",
"\n",
"where $w \\in \\mathbf{R}^n$ is the vector containing weights allocated to each asset in the efficient frontier.\n",
"\n",
"We can solve this problem as follows."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"using Convex, ECOS #We are using ECOS solver. Install using Pkg.add(\"ECOS\")\n",
"\n",
"# generate problem data\n",
"srand(0); #Set the seed\n",
"n = 5; # Assume that we have portfolio of 5 assets.\n",
"R = 5 * randn(n);\n",
"A = randn(n, 5);\n",
"Q = A * A' + diagm(rand(n));\n",
"w_lower = 0;\n",
"w_upper = 1;\n",
"\n",
"\n",
"risk = zeros(2000); # Initialized the risk and the return vectors. \n",
"ret = zeros(2000); # lambda varies in the interval(0,1) in the steps of 1/2000.\n",
"\n",
"w = Variable(length(R));\n",
"\n",
"#Defining constraints\n",
"c1 = sum(w) == 1;\n",
"c2 = w_lower <= w; \n",
"c3 = w <= w_upper;\n",
"for i in 1:2000\n",
" λ = i/2000;\n",
"\n",
" #Defining Objective function\n",
" objective = λ * quadform(w,Q) - (1-λ)* w' *R;\n",
" p = minimize(objective, c1,c2,c3);\n",
" solve!(p, ECOSSolver(verbose = false));\n",
" risk[i] = (w.value' * Q * w.value)[1];\n",
" ret[i] = (w.value'R)[1];\n",
" #println(\"$i \",\"$(λ*risk[i] - (1-λ)*ret[i]) \",\"$p.optval\");\n",
" end\n",
"\n",
"using PyPlot #Install PyPlot if you don't have it installed. Pkg.add(\"PyPlot\")\n",
"plot(risk,ret)\n",
"title(\"Markowitz Efficient Frontier\");\n",
"xlabel(\"Expected Risk-Variance\");\n",
"ylabel(\"Expected Return\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.5.0-dev",
"language": "julia",
"name": "julia-0.5"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.5.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}