{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Portfolio Optimization\n", "\n", "This notebook can be run online without installing any packages. Just click the logo:\n", "\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/mcdeoliveira/pyoptimum-examples/master?filepath=examples%2Fportfolio.ipynb)\n", "\n", "to run it on [binder](https://mybinder.org).\n", "\n", "See this [case study](http://vicbee.net/portfolio.html) for more details." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import needed libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import math\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialize optimize.vicbee.net client" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "username = 'demo@optimize.vicbee.net'\n", "password = 'optimize'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pyoptimum # for easy access to the optimmize.vicbee.net api\n", "client = pyoptimum.Client(username=username, password=password)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Classic Markowitz Portfolio Optimization\n", "\n", "In the classic Markowitz optimal portfolio optimization (Markowitz, 1952), one seeks to determine \n", "* $x$: a vector of porfolio positions,\n", "\n", "that minimize the total portfolio variance given:\n", "* $r$: the vector of expected returns,\n", "* $Q$: the covariance matrix of the returns,\n", "* $\\mu$: the desired portfolio return.\n", "\n", "The problem can be formulated mathematically as the Quadratic Program (QP):\n", "$$\n", "\\begin{aligned}\n", " \\min_{x} \\quad & x^T Q x \\\\\n", " \\text{s.t.} \\quad & r^T x = \\mu \\quad \\sum_i{x_i} = 1 \n", "\\end{aligned}\n", "$$\n", "\n", "In this notebook we will show how one can setup and solve such portfolio optimization problems using the [Optimize API](https://optmize.vicbee.net/api/ui).\n", "\n", "Since we are using Python, we will take advantage of [numpy](https://numpy.org/) and [pandas](https://pandas.pydata.org/) to manipulate the data in this notebook. We will also use [matplotlib](https://matplotlib.org/) to plot the data. The use of such libraries or even Python is not a requirement for using the API, which can be accessed using AJAX calls. \n", "\n", "Data for the problem considered in this demo is taken from Elton and Gruber, 1995.\n", "\n", "### References:\n", "\n", "1. Harry M. Markowitz, “Portfolio Selection”. Journal of Finance, 7(1): 77 - 91, 1952.\n", "2. Edwin J. Elton and Martin J. Gruber, Modern Portfolio Theory and Investment Analysis. Fifth Edition, John Wiley and Sons, 1995.\n", "\n", "## Setup data using pandas\n", "\n", "Consider the following set of assets with associated expected return and return stadard deviation given as percentages assembled as a pandas DataFrame:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)
0S & P14.018.5
1Bonds6.55.0
2Canadian11.016.0
3Japan14.023.0
4Emerging Markets16.030.0
5Pacific18.026.0
6Europe12.020.0
7Small Stocks17.024.0
\n", "
" ], "text/plain": [ " Label Return (%) STD (%)\n", "0 S & P 14.0 18.5\n", "1 Bonds 6.5 5.0\n", "2 Canadian 11.0 16.0\n", "3 Japan 14.0 23.0\n", "4 Emerging Markets 16.0 30.0\n", "5 Pacific 18.0 26.0\n", "6 Europe 12.0 20.0\n", "7 Small Stocks 17.0 24.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = [\n", " ['S & P',14.0,18.5],\n", " ['Bonds',6.5,5.0],\n", " ['Canadian',11.0,16.0],\n", " ['Japan',14.0,23.0],\n", " ['Emerging Markets',16.0,30.0],\n", " ['Pacific',18.0,26.0],\n", " ['Europe',12.0,20.0],\n", " ['Small Stocks',17.0,24.0] \n", "]\n", "assets = pd.DataFrame(data, columns=['Label', 'Return (%)', 'STD (%)'])\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The assets are associated with the following correlation coefficients:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
S & PBondsCanadianJapanEmerging MarketsPacificEuropeSmall Stocks
S & P1.000.450.700.200.640.300.610.79
Bonds0.451.000.27-0.010.410.010.130.28
Canadian0.700.271.000.140.510.290.480.59
Japan0.20-0.010.141.000.250.730.560.13
Emerging Markets0.640.410.510.251.000.280.610.75
Pacific0.300.010.290.730.281.000.540.16
Europe0.610.130.480.560.610.541.000.44
Small Stocks0.790.280.590.130.750.160.441.00
\n", "
" ], "text/plain": [ " S & P Bonds Canadian Japan Emerging Markets Pacific \\\n", "S & P 1.00 0.45 0.70 0.20 0.64 0.30 \n", "Bonds 0.45 1.00 0.27 -0.01 0.41 0.01 \n", "Canadian 0.70 0.27 1.00 0.14 0.51 0.29 \n", "Japan 0.20 -0.01 0.14 1.00 0.25 0.73 \n", "Emerging Markets 0.64 0.41 0.51 0.25 1.00 0.28 \n", "Pacific 0.30 0.01 0.29 0.73 0.28 1.00 \n", "Europe 0.61 0.13 0.48 0.56 0.61 0.54 \n", "Small Stocks 0.79 0.28 0.59 0.13 0.75 0.16 \n", "\n", " Europe Small Stocks \n", "S & P 0.61 0.79 \n", "Bonds 0.13 0.28 \n", "Canadian 0.48 0.59 \n", "Japan 0.56 0.13 \n", "Emerging Markets 0.61 0.75 \n", "Pacific 0.54 0.16 \n", "Europe 1.00 0.44 \n", "Small Stocks 0.44 1.00 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = len(assets)\n", "data = np.array([\n", " [1,.45,.7,.2,.64,.3,.61,.79],\n", " [.45,1,.27,-.01,.41,.01,.13,.28],\n", " [.7,.27,1,.14,.51,.29,.48,.59],\n", " [.2,-.01,.14,1,.25,.73,.56,.13],\n", " [.64,.41,.51,.25,1,.28,.61,.75],\n", " [.3,.01,.29,.73,.28,1,.54,.16],\n", " [.61,.13,.48,.56,.61,.54,1,.44],\n", " [.79,.28,.59,.13,.75,.16,.44,1]\n", "])\n", "cov = pd.DataFrame(data=data, columns=assets.Label.values, index=assets.Label.values)\n", "cov" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solve problem using the Optmize API\n", "\n", "Before solving the problem we need to assemble the required data, that is the vector of expected returns $r$, which can be taken directly from the data:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# vector of expected returns\n", "r = assets['Return (%)'].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the covariance matrix $Q$, which can be calculated from the given data as follows:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# covariance matrix\n", "sigmas = np.diag(assets['STD (%)'].values)\n", "Q = sigmas @ cov.values @ sigmas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the context of the classic Markowitz portfolio optimization we should also specify a desired expected return" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# expected return\n", "mu = 14" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and then select a portfolio corresponding to this return with the smallest possible variance.\n", "\n", "The actual calculation of the optimal portfolio will be done on the cloud.\n", "\n", "\n", "## Submit problem to the api\n", "\n", "We assemble all the data in an object and make an api call to get the optimal portfolio:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once an optimal solution is calculated we append it to the dataframe." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 12.930% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)
0S & P14.018.55.3
1Bonds6.55.037.0
2Canadian11.016.0-3.6
3Japan14.023.06.9
4Emerging Markets16.030.0-12.0
5Pacific18.026.033.7
6Europe12.020.0-11.5
7Small Stocks17.024.044.2
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%)\n", "0 S & P 14.0 18.5 5.3\n", "1 Bonds 6.5 5.0 37.0\n", "2 Canadian 11.0 16.0 -3.6\n", "3 Japan 14.0 23.0 6.9\n", "4 Emerging Markets 16.0 30.0 -12.0\n", "5 Pacific 18.0 26.0 33.7\n", "6 Europe 12.0 20.0 -11.5\n", "7 Small Stocks 17.0 24.0 44.2" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Optimal (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " pd.options.display.float_format = '{:,.1f}'.format\n", " assets['Optimal (%)'] = 100*np.array(sol['x'])\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, the solution vector adds to one, each number being interpreted as the fraction of the available budget that should be invested in order to realize the optimal portfolio. We use numpy to convert that to a percentage before displaying the solution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solution without short sales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The minimum variance portfolio that meets a required level of expected return is often one in which the positions can be negative. Negative positions are realized as *short sales*.\n", "\n", "For example, in the problem solved above" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "27.1%\n" ] } ], "source": [ "x = assets['Optimal (%)'];\n", "print('{:.1f}%'.format(-x[x < 0].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "of the portfolio is comprised of short sales.\n", "\n", "One can add constraints to the optimization problem in order to prevent short sales.\n", "\n", "This can be done by adding the following option:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# options\n", "options = {\n", " 'short': False\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and calling the API once again" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The new solution" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.365% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)
0S & P14.018.55.30.0
1Bonds6.55.037.030.9
2Canadian11.016.0-3.60.0
3Japan14.023.06.92.7
4Emerging Markets16.030.0-12.00.0
5Pacific18.026.033.732.1
6Europe12.020.0-11.50.0
7Small Stocks17.024.044.234.4
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%)\n", "0 S & P 14.0 18.5 5.3 0.0\n", "1 Bonds 6.5 5.0 37.0 30.9\n", "2 Canadian 11.0 16.0 -3.6 0.0\n", "3 Japan 14.0 23.0 6.9 2.7\n", "4 Emerging Markets 16.0 30.0 -12.0 0.0\n", "5 Pacific 18.0 26.0 33.7 32.1\n", "6 Europe 12.0 20.0 -11.5 0.0\n", "7 Small Stocks 17.0 24.0 44.2 34.4" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['No Shorts (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " assets['No Shorts (%)'] = 100*np.array(sol['x'])\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "is one without short sales:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0%\n" ] } ], "source": [ "x = assets['No Shorts (%)']\n", "print('{:.1f}%'.format(-x[x < 0].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "in which each every position is an asset purchase:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100.0%\n" ] } ], "source": [ "print('{:.1f}%'.format(x.sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the new portofolio is *riskier* than the optimal one with short sales." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accounting for cashflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now suppose that one has an initial portfolio that they would like to rebalance, or buy or sell more assets.\n", "\n", "In this case, one starts with an initial positions, for example:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)
0S & P14.018.55.30.020
1Bonds6.55.037.030.930
2Canadian11.016.0-3.60.00
3Japan14.023.06.92.720
4Emerging Markets16.030.0-12.00.00
5Pacific18.026.033.732.110
6Europe12.020.0-11.50.00
7Small Stocks17.024.044.234.420
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) \n", "0 20 \n", "1 30 \n", "2 0 \n", "3 20 \n", "4 0 \n", "5 10 \n", "6 0 \n", "7 20 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assets['Initial (%)'] = [20, 30, 0, 20, 0, 10, 0, 20]\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An optimal portfolio will not change depending on whether one holds assets or not, so the answers obtained so far should not be affected by the existing holdings.\n", "\n", "However, imagine that one has cash to invest and would like to know what is the best solution for investing the additional money without selling any of their assets.\n", "\n", "One can take that scenario into account by adding an initial portfolio:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# initial portfolio\n", "x0 = assets['Initial (%)'].values/100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and the desired *cashflow*, say equivalent to 40% of the existing portfolio," ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# cashflow\n", "cashflow = 40/100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "along with the other data:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'sell': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'x0': x0.tolist(),\n", " 'cashflow': cashflow,\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The optimal solution now is in the form of additional *buys* that need to be realized within the specified cashflow to achieve the desired return:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.586% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)
0S & P14.018.55.30.020-0.014.3
1Bonds6.55.037.030.9304.022.6
2Canadian11.016.0-3.60.00-0.0-0.0
3Japan14.023.06.92.720-0.014.3
4Emerging Markets16.030.0-12.00.00-0.0-0.0
5Pacific18.026.033.732.11054.322.7
6Europe12.020.0-11.50.00-0.0-0.0
7Small Stocks17.024.044.234.42041.726.2
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) \n", "0 20 -0.0 14.3 \n", "1 30 4.0 22.6 \n", "2 0 -0.0 -0.0 \n", "3 20 -0.0 14.3 \n", "4 0 -0.0 -0.0 \n", "5 10 54.3 22.7 \n", "6 0 -0.0 -0.0 \n", "7 20 41.7 26.2 " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Buys (%)'] = np.nan\n", " assets['After Cashflow (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Buys (%)'] = 100*(x - x0)/cashflow\n", " assets['After Cashflow (%)'] = 100*x/x.sum()\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Infeasible portfolio problems\n", "\n", "As one add more constraints, it is often the case that certain problems become unsolvable.\n", "\n", "For example, in the above cashflow problem, a solution does not exist if one lowers the ammount available for investment. For example, lowering the available cashflow to 10% or even 20% as in:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# initial portfolio\n", "x0 = assets['Initial (%)'].values/100\n", "\n", "# cashflow\n", "cashflow = 20/100\n", "\n", "# expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'sell': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'x0': x0.tolist(),\n", " 'cashflow': cashflow,\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "results in an *infeasible* problem:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is infeasible\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)
0S & P14.018.55.30.020nannan
1Bonds6.55.037.030.930nannan
2Canadian11.016.0-3.60.00nannan
3Japan14.023.06.92.720nannan
4Emerging Markets16.030.0-12.00.00nannan
5Pacific18.026.033.732.110nannan
6Europe12.020.0-11.50.00nannan
7Small Stocks17.024.044.234.420nannan
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) \n", "0 20 nan nan \n", "1 30 nan nan \n", "2 0 nan nan \n", "3 20 nan nan \n", "4 0 nan nan \n", "5 10 nan nan \n", "6 0 nan nan \n", "7 20 nan nan " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Buys (%)'] = np.nan\n", " assets['After Cashflow (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Buys (%)'] = 100*(x - x0)/cashflow\n", " assets['After Cashflow (%)'] = 100*x/x.sum()\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course the reason why the problem has no solution is because the return of the initial portfolio:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12.8%\n" ] } ], "source": [ "print('{:.1f}%'.format(r @ x0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " is much lower than the return asked of the optimization, which was of 14%.\n", " \n", " In this particular case, one should expect to obtain solutions with smaller cashflows if one asks for more modest returns.\n", " \n", " For example, a modest improvement in return from 12.75% to 13% is available with a 10% or 20% cashflow:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# initial portfolio\n", "x0 = assets['Initial (%)'].values/100\n", "\n", "# cashflow\n", "cashflow = 20/100\n", "\n", "# lower return\n", "mu = 13\n", "\n", "# options\n", "options = {\n", " 'sell': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'x0': x0.tolist(),\n", " 'cashflow': cashflow,\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The obtained optimal portfolio:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 13.000%, std = 12.153% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)
0S & P14.018.55.30.0200.016.7
1Bonds6.55.037.030.93030.930.2
2Canadian11.016.0-3.60.00-0.0-0.0
3Japan14.023.06.92.7200.016.7
4Emerging Markets16.030.0-12.00.00-0.0-0.0
5Pacific18.026.033.732.11050.016.7
6Europe12.020.0-11.50.00-0.0-0.0
7Small Stocks17.024.044.234.42019.119.8
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) \n", "0 20 0.0 16.7 \n", "1 30 30.9 30.2 \n", "2 0 -0.0 -0.0 \n", "3 20 0.0 16.7 \n", "4 0 -0.0 -0.0 \n", "5 10 50.0 16.7 \n", "6 0 -0.0 -0.0 \n", "7 20 19.1 19.8 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Buys (%)'] = np.nan\n", " assets['After Cashflow (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Buys (%)'] = 100*(x - x0)/cashflow\n", " assets['After Cashflow (%)'] = 100*x/x.sum()\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "is a step toward improving the returns with the available cashflow.\n", "\n", "We will revisit this problem later in this notebook after showing how to calculate efficient frontiers.\n", "\n", "## General allocation constraints\n", "\n", "It is also possible to specify arbitrary constraints on sets of assets.\n", "\n", "For example, consider the that one desires an optimal portfolio with no cashflow, no shorts, but at least 50% of their assets on the combined S & P and Bond markets. Such a problem can be formulated after defining a set and corresponding constraint:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "constraint1 = {'label': 's&p_bonds', 'set': [0, 1], 'bounds': [.5, np.inf]}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note how sets are defined using numeric indices (starting from 0), and the constraint bounds estalish the lower and upper bound on the sum of the assets in the set.\n", "\n", "The resulting constrained problem can be solved as before:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'short': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'constraints': [constraint1],\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The obtained optimal portfolio:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.710% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)S&P + Bonds >= 50 (%)
0S & P14.018.55.30.0200.016.725.9
1Bonds6.55.037.030.93030.930.224.1
2Canadian11.016.0-3.60.00-0.0-0.0-0.0
3Japan14.023.06.92.7200.016.7-0.0
4Emerging Markets16.030.0-12.00.00-0.0-0.0-0.0
5Pacific18.026.033.732.11050.016.730.8
6Europe12.020.0-11.50.00-0.0-0.0-0.0
7Small Stocks17.024.044.234.42019.119.819.2
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) S&P + Bonds >= 50 (%) \n", "0 20 0.0 16.7 25.9 \n", "1 30 30.9 30.2 24.1 \n", "2 0 -0.0 -0.0 -0.0 \n", "3 20 0.0 16.7 -0.0 \n", "4 0 -0.0 -0.0 -0.0 \n", "5 10 50.0 16.7 30.8 \n", "6 0 -0.0 -0.0 -0.0 \n", "7 20 19.1 19.8 19.2 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['S&P + Bonds >= 50 (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['S&P + Bonds >= 50 (%)'] = 100*x\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "satisfies the constraint that" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50.0%\n" ] } ], "source": [ "print('{:.1f}%'.format(assets['S&P + Bonds >= 50 (%)'][0:2].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "is not less than 50%.\n", "\n", "One might find it easier to formulate constraints based on the assets' labels. This is possible if a property label is added to the problem formulation:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'short': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'labels': assets['Label'].tolist(),\n", " 'constraints': [{'label': 's&p_bonds', 'set': ['S & P', 'Bonds'], 'bounds': [.5, np.inf]}],\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that no data is stored in the servers, and that labels can be easily anonymized if desired.\n", "\n", "The above formulation produces the same optimal portfolio:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.710% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)S&P + Bonds >= 50 (%)
0S & P14.018.55.30.0200.016.725.9
1Bonds6.55.037.030.93030.930.224.1
2Canadian11.016.0-3.60.00-0.0-0.0-0.0
3Japan14.023.06.92.7200.016.7-0.0
4Emerging Markets16.030.0-12.00.00-0.0-0.0-0.0
5Pacific18.026.033.732.11050.016.730.8
6Europe12.020.0-11.50.00-0.0-0.0-0.0
7Small Stocks17.024.044.234.42019.119.819.2
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) S&P + Bonds >= 50 (%) \n", "0 20 0.0 16.7 25.9 \n", "1 30 30.9 30.2 24.1 \n", "2 0 -0.0 -0.0 -0.0 \n", "3 20 0.0 16.7 -0.0 \n", "4 0 -0.0 -0.0 -0.0 \n", "5 10 50.0 16.7 30.8 \n", "6 0 -0.0 -0.0 -0.0 \n", "7 20 19.1 19.8 19.2 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['S&P + Bonds >= 50 (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['S&P + Bonds >= 50 (%)'] = 100*x\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "satisfying the constraint" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50.0%\n" ] } ], "source": [ "print('{:.1f}%'.format(assets['S&P + Bonds >= 50 (%)'][0:2].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Leverage constraints\n", "\n", "Another type of constraint that can be easily imposed is leverage constraints.\n", "\n", "We have already determined the optimal portfolio with and without short sales. The optimal portfolio has leverage at aroud 27%:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-27.1%\n" ] } ], "source": [ "print('{:.1f}%'.format(assets['Optimal (%)'][assets['Optimal (%)'] <= 0].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while the optimal portfolio without short sales has, of course, 0% leverage.\n", "\n", "How about an optimal intermediate portfolio with, say, 10% leverage? It can be determined by adding a *leverage constraint*:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "constraint = {'label': '10% leverage', 'function': 'leverage', 'set': ':', 'bounds': .1}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the use of the function `leverage` and the set `:`, which is a shortcut representing all assets. The associated optimal porfolio is calculated below." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'short': True \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'labels': assets['Label'].tolist(),\n", " 'constraints': [constraint],\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.063% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)S&P + Bonds >= 50 (%)Leverage <= 10 (%)
0S & P14.018.55.30.0200.016.725.90.0
1Bonds6.55.037.030.93030.930.224.132.2
2Canadian11.016.0-3.60.00-0.0-0.0-0.00.0
3Japan14.023.06.92.7200.016.7-0.03.6
4Emerging Markets16.030.0-12.00.00-0.0-0.0-0.0-8.5
5Pacific18.026.033.732.11050.016.730.832.8
6Europe12.020.0-11.50.00-0.0-0.0-0.0-1.5
7Small Stocks17.024.044.234.42019.119.819.241.4
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) S&P + Bonds >= 50 (%) \\\n", "0 20 0.0 16.7 25.9 \n", "1 30 30.9 30.2 24.1 \n", "2 0 -0.0 -0.0 -0.0 \n", "3 20 0.0 16.7 -0.0 \n", "4 0 -0.0 -0.0 -0.0 \n", "5 10 50.0 16.7 30.8 \n", "6 0 -0.0 -0.0 -0.0 \n", "7 20 19.1 19.8 19.2 \n", "\n", " Leverage <= 10 (%) \n", "0 0.0 \n", "1 32.2 \n", "2 0.0 \n", "3 3.6 \n", "4 -8.5 \n", "5 32.8 \n", "6 -1.5 \n", "7 41.4 " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Leverage <= 10 (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Leverage <= 10 (%)'] = 100*x\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which satisfies the desireded leverage requirements:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-10.0%\n" ] } ], "source": [ "print('{:.1f}%'.format(assets['Leverage <= 10 (%)'][assets['Leverage <= 10 (%)'] <= 0].sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Group leverage constraints\n", "\n", "Leverage constraints can also be imposed in groups of assets.\n", "\n", "The next example calculates an optimal portolio with at most 10% leverage in the Pacific and Europe regions. " ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# constraint\n", "constraint = {'label': '10% group leverage', 'function': 'leverage', 'set': ['Pacific', 'Europe'], 'bounds': .1}\n", "\n", "# Expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'short': True \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'labels': assets['Label'].tolist(),\n", " 'constraints': [constraint],\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 12.970% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)S&P + Bonds >= 50 (%)Leverage <= 10 (%)Group Leverage (%)
0S & P14.018.55.30.0200.016.725.90.00.8
1Bonds6.55.037.030.93030.930.224.132.236.4
2Canadian11.016.0-3.60.00-0.0-0.0-0.00.0-5.2
3Japan14.023.06.92.7200.016.7-0.03.63.7
4Emerging Markets16.030.0-12.00.00-0.0-0.0-0.0-8.5-14.5
5Pacific18.026.033.732.11050.016.730.832.834.3
6Europe12.020.0-11.50.00-0.0-0.0-0.0-1.5-3.1
7Small Stocks17.024.044.234.42019.119.819.241.447.5
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) S&P + Bonds >= 50 (%) \\\n", "0 20 0.0 16.7 25.9 \n", "1 30 30.9 30.2 24.1 \n", "2 0 -0.0 -0.0 -0.0 \n", "3 20 0.0 16.7 -0.0 \n", "4 0 -0.0 -0.0 -0.0 \n", "5 10 50.0 16.7 30.8 \n", "6 0 -0.0 -0.0 -0.0 \n", "7 20 19.1 19.8 19.2 \n", "\n", " Leverage <= 10 (%) Group Leverage (%) \n", "0 0.0 0.8 \n", "1 32.2 36.4 \n", "2 0.0 -5.2 \n", "3 3.6 3.7 \n", "4 -8.5 -14.5 \n", "5 32.8 34.3 \n", "6 -1.5 -3.1 \n", "7 41.4 47.5 " ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Group Levegare (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Group Leverage (%)'] = 100*x\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that leverage is calculated within the group's positions. In this case the group leverage is:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-10.0%\n" ] } ], "source": [ "group = assets['Group Leverage (%)'][5:7]\n", "print('{:.1f}%'.format(100*group[group <= 0].sum()/group.sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as desired.\n", "\n", "## Sales constraints\n", "\n", "Similarly to leverage constraints, it is possible to enforce constraints on the total amount of sales in a portfolio.\n", "Such problems are relevant in the context of cashflow problem in the presence of nonzero initial positions. With zero initial positions such sales constraints are equivalent to the leverage constraints introduced above.\n", "\n", "For example, let us revisit the above cashflow problem for which we already know that a return of 14% is not possible with an injection of 20% of capital without selling assets. Next, we attempt to solve this same problem but this time imposing no short sales and a maximum of 25% in sales: " ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# constraint\n", "constraint = {'label': '10% sales constraint', 'function': 'sales', 'set': ':', 'bounds': .25}\n", "\n", "# initial portfolio\n", "x0 = assets['Initial (%)'].values/100\n", "\n", "# cashflow\n", "cashflow = 20/100\n", "\n", "# expected return\n", "mu = 14\n", "\n", "# options\n", "options = {\n", " 'sell': True,\n", " 'short': False\n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'x0': x0.tolist(),\n", " 'cashflow': cashflow,\n", " 'constraints': [constraint],\n", " 'options': options\n", "}\n", "sol = client.call('portfolio', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The optimal solution is:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> Problem is feasible\n", " * mu = 14.000%, std = 13.662% (optimal)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LabelReturn (%)STD (%)Optimal (%)No Shorts (%)Initial (%)Buys (%)After Cashflow (%)S&P + Bonds >= 50 (%)Leverage <= 10 (%)Group Leverage (%)Trades (%)After Trades (%)
0S & P14.018.55.30.0200.016.725.90.00.80.016.7
1Bonds6.55.037.030.93030.930.224.132.236.4-22.921.2
2Canadian11.016.0-3.60.00-0.0-0.0-0.00.0-5.2-0.0-0.0
3Japan14.023.06.92.7200.016.7-0.03.63.7-2.116.3
4Emerging Markets16.030.0-12.00.00-0.0-0.0-0.0-8.5-14.50.00.0
5Pacific18.026.033.732.11050.016.730.832.834.378.521.4
6Europe12.020.0-11.50.00-0.0-0.0-0.0-1.5-3.1-0.0-0.0
7Small Stocks17.024.044.234.42019.119.819.241.447.546.524.4
\n", "
" ], "text/plain": [ " Label Return (%) STD (%) Optimal (%) No Shorts (%) \\\n", "0 S & P 14.0 18.5 5.3 0.0 \n", "1 Bonds 6.5 5.0 37.0 30.9 \n", "2 Canadian 11.0 16.0 -3.6 0.0 \n", "3 Japan 14.0 23.0 6.9 2.7 \n", "4 Emerging Markets 16.0 30.0 -12.0 0.0 \n", "5 Pacific 18.0 26.0 33.7 32.1 \n", "6 Europe 12.0 20.0 -11.5 0.0 \n", "7 Small Stocks 17.0 24.0 44.2 34.4 \n", "\n", " Initial (%) Buys (%) After Cashflow (%) S&P + Bonds >= 50 (%) \\\n", "0 20 0.0 16.7 25.9 \n", "1 30 30.9 30.2 24.1 \n", "2 0 -0.0 -0.0 -0.0 \n", "3 20 0.0 16.7 -0.0 \n", "4 0 -0.0 -0.0 -0.0 \n", "5 10 50.0 16.7 30.8 \n", "6 0 -0.0 -0.0 -0.0 \n", "7 20 19.1 19.8 19.2 \n", "\n", " Leverage <= 10 (%) Group Leverage (%) Trades (%) After Trades (%) \n", "0 0.0 0.8 0.0 16.7 \n", "1 32.2 36.4 -22.9 21.2 \n", "2 0.0 -5.2 -0.0 -0.0 \n", "3 3.6 3.7 -2.1 16.3 \n", "4 -8.5 -14.5 0.0 0.0 \n", "5 32.8 34.3 78.5 21.4 \n", "6 -1.5 -3.1 -0.0 -0.0 \n", "7 41.4 47.5 46.5 24.4 " ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if sol['status']=='infeasible':\n", " print('> Problem is infeasible')\n", " assets['Trades (%)'] = np.nan\n", " assets['After Trades (%)'] = np.nan\n", "else:\n", " print('> Problem is feasible')\n", " print(' * mu = {:.3f}%, std = {:.3f}% ({})'.format(mu, math.sqrt(sol['obj']), sol['status']))\n", " x = np.array(sol['x'])\n", " assets['Trades (%)'] = 100*(x - x0)/cashflow\n", " assets['After Trades (%)'] = 100*x/x.sum()\n", "assets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which satisfies both the no short sale constraints as well as the 25% cap on sales:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-25.0%\n" ] } ], "source": [ "trades = assets['Trades (%)']\n", "print('{:.1f}%'.format(100*trades[trades <= 0].sum()/trades.sum()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The efficient frontier\n", "\n", "The efficient frontier is the set of minimal variance portfolios obtained after varying the expected returns. A graphical representation of the frontier can be ploter in terms of the expected return versus risk (variance) for a given asset data. The Optimize API has a method for obtaining efficient frontiers by successively calculting optimal portfolios for varying levels of return. By default, the smallest return is the one attained by the minimum variance portfolio, and the largest return is that of the largest individual asset.\n", "\n", "Calling the frontier api method is very simlar to performing a single portfolio optimization. The following call:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# vector of expected returns\n", "r = assets['Return (%)'].values\n", "\n", "# covariance matrix\n", "sigmas = np.diag(assets['STD (%)'].values)\n", "Q = sigmas @ cov.values @ sigmas\n", "\n", "# options\n", "options = {\n", " 'number_of_points': 20\n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'options': options\n", "}\n", "sol = client.call('frontier', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "will produce 20 points on the efficient frontier of the classic Markowitz portfolio optimization propblem, that is one without any additional constraints on the portfolio or the positions:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1. mu = 6.413%, std = 3.913% (optimal)\n", " 2. mu = 7.023%, std = 4.036% (optimal)\n", " 3. mu = 7.633%, std = 4.386% (optimal)\n", " 4. mu = 8.243%, std = 4.913% (optimal)\n", " 5. mu = 8.853%, std = 5.569% (optimal)\n", " 6. mu = 9.463%, std = 6.312% (optimal)\n", " 7. mu = 10.072%, std = 7.116% (optimal)\n", " 8. mu = 10.682%, std = 7.962% (optimal)\n", " 9. mu = 11.292%, std = 8.838% (optimal)\n", " 10. mu = 11.902%, std = 9.736% (optimal)\n", " 11. mu = 12.512%, std = 10.651% (optimal)\n", " 12. mu = 13.121%, std = 11.578% (optimal)\n", " 13. mu = 13.731%, std = 12.515% (optimal)\n", " 14. mu = 14.341%, std = 13.459% (optimal)\n", " 15. mu = 14.951%, std = 14.410% (optimal)\n", " 16. mu = 15.561%, std = 15.366% (optimal)\n", " 17. mu = 16.171%, std = 16.326% (optimal)\n", " 18. mu = 16.780%, std = 17.289% (optimal)\n", " 19. mu = 17.390%, std = 18.256% (optimal)\n", " 20. mu = 18.000%, std = 19.224% (optimal)\n" ] } ], "source": [ "frontier = sol['frontier']\n", "m = len(frontier)\n", "mu0 = np.zeros((m,))\n", "var0 = np.zeros((m,))\n", "pos0 = np.zeros((m, n))\n", "for i, e in enumerate(frontier):\n", " point = e['sol']\n", " mu0[i] = e['mu']\n", " var0[i] = point['obj']\n", " pos0[i, :] = point['x']\n", " if point['obj'] is not None:\n", " print(' {}. mu = {:.3f}%, std = {:.3f}% ({})'.format(i+1, mu0[i], math.sqrt(var0[i]), point['status']))\n", " else:\n", " print(' {}. mu = {:.3f}%, std = --- ({})'.format(i+1, mu0[i], point['status']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These points can be combine to produce a plot of the frontier:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rmax = np.max(r)\n", "rmin = np.min((np.min(r), np.min(mu0)))\n", "dr = rmax - rmin\n", "colors = np.array(plt.rcParams['axes.prop_cycle'].by_key()['color'])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XlcVFX/wPHPEVRcMBfUTEuIcgVE\nwaVUJM0Vl9xKLdPcKrdyqcynHm21stLSzAfNR3tyS80l09xywwUFNUVzSXHfUFNBQVm+vz+A+YmK\njsAwwHzfr9e8nDlz7z3fw+B8uefce44REZRSSjmufPYOQCmllH1pIlBKKQeniUAppRycJgKllHJw\nmgiUUsrBaSJQSikHp4lA5XjGmI+NMReMMWdTXrc3xpwwxsQYY2oaY/YaYwKtOE6MMeZxmwecXFd9\nY8yhlDqfy4b6Hkupy8nWdam8x+h9BMrejDFHgbJA4i3F00VkoDHmUeAgUFFEzqdsfxgYKiKLsz3Y\n5PqnAydF5L17bLMGWCIi39gohqNAHxFZbYvjK8fibO8AlErRJp0vtYrAxdQkcEvZ3uwJK8PSjdEY\nY0j+Iywpe0O6O2OMs4gk2DsOZT/aNaRyLGPMs8Aq4JGUbo/ZxpgYwAn4M+XMAGPM0ZRtMcY4GWNG\nGmMOG2OijTHhKWcVGGPEGPNEyvOCxpgvjTHHjTHnjDGTjTGFUt4LNMacNMYMM8acN8acMca8kvJe\nP+BF4O2UmH69S9yHgceBX1O2KWiMWWeM+cQYswm4DjxujHnEGLPEGHPJGPO3MabvLccYbYz52Rjz\nY0o79hpj/FPe+x/w2C3Hf9sY457SPueUbR4yxvyQEvuplO41p5T3ehpjNhljxhljLgGjs/aTU7mN\nJgKVY6WcIbQETotIURHpKiJFU96uISKed9ltKNAVaAUUA3qR/MV7u8+BSoAv8ARQHvj3Le8/DDyU\nUt4b+M4YU0JEgoGZwBcpMbW5S9yewHGSz3KKisiNlLe6A/0AV+AYMBs4CTwCdAI+NcY0ueVQbYE5\nQHFgCTAx5fjdbzv+F3dp3wwgIaVtNYFmQJ9b3q8LHAHKAJ/cZX/lQDQRqJxikTHm8i2Pvvff5a76\nAO+JyAFJ9qeIXLx1g5Sumb7AEBG5JCLRwKdAl1s2iwc+FJF4EVkGxACVMxhTqukisjelG+ZhoAHw\njojEicguYCrJySJViIgsE5FE4H9ADWsqMcaUJTmBviki11K61cbd1r7TIjJBRBJEJDaT7VK5nI4R\nqJziuSwa+HwUOHyfbUoDhYHw5JwAgCG5yynVxdv6za8DRcmcE7c8fwRITUKpjgH+t7w+e1v9Llb2\n51cE8gNnbmlfvtvqP3H7TspxaSJQec0JwBOIuMc2F4BYoLqInMpAHRm91O7W/U4DJY0xrrckg8cA\na+O5VwwngBuA2z2Shl4uqCy0a0jlNVOBj4wxT5pkPsaYUrdukHK1zhRgnDGmDIAxprwxprmVdZwj\neTA4w0TkBLAZGGOMcTHG+JA8FjEzszGIyBlgJfCVMaaYMSafMcbTGNMoMzGrvEsTgcopUq+ASX0s\nzOBxvgZ+JvmL8CrwA1DoLtu9A/wNbDXGXAVWY/0YwA9AtZSxjEUZjBOSB7XdST47WAiMEpFVVu47\nBngvJYbhd3n/ZaAAsA/4B5gPlMtErCoP0xvKlFLKwekZgVJKOThNBEop5eA0ESillIPTRKCUUg4u\nV9xH4ObmJu7u7tlW37Vr1yhSpEi21WcvjtJOcJy2ajvznsy0NTw8/IKIlL7fdrkiEbi7uxMWFpZt\n9a1bt47AwMBsq89eHKWd4Dht1XbmPZlpqzHmmDXbadeQUko5OE0ESinl4DQRKKWUg9NEoJRSDk4T\ngVJKOThNBEop5eA0ESillIPTRKCUUg5OE4FSSjk4TQRKKeXgNBEopZSD00SglFIOThOBUko5OJsl\nAmPMNGPMeWNMxC1lvsaYrcaYXcaYMGNMHVvVr5RybNsWz+d4xO40ZccjdrNt8Xw7RZRz2fKMYDrQ\n4rayL4APRMQX+HfKa6WUynIPe1Zi6fjPLMngeMRulo7/jIc9K9k5spzHZusRiMgGY4z77cVAsZTn\nDwGnbVW/UnnJunXrqFKlCg8//LC9Q8k1HvPyofWbI1g6/jNqNGvFnyuX0frNETzm5WPv0HIcIyK2\nO3hyIlgqIl4pr6sCKwBD8tnI0yJy14UTjDH9gH4AZcuW9ZszZ47N4rxdTEwMRYsWzbb67MVR2gm5\nu62//vor48ePp1mzZrzzzjv33DY3t/NBPEg7T28L4Uz4Vsr51eOROg1sHFnWy8xn+swzz4SLiP99\nNxQRmz0AdyDiltffAh1Tnj8PrLbmOH5+fpKd1q5dm6312YujtFMkd7Y1ISFBhgwZIoC0bNlSrly5\nct99cmM7M8Ladh7b86d817urhMz9n3zXu6sc2/OnbQOzgcx8pkCYWPEdm91XDfUAfkl5Pg/QwWKl\n7iI6Opp27doxbtw4Bg8ezJIlSyhWrNj9d1QWqWMCrd8cQf3nX7J0E90+gKyy//LR00CjlOeNgUPZ\nXL9SOd7x48epX78+v//+O5MmTeKbb77B2TlXLC+eo5w9fDDNmEDqmMHZwwftHFnOY7PfLmPMbCAQ\ncDPGnARGAX2Bb4wxzkAcKWMASqlkoaGhtGvXjtjYWJYtW0azZs3sHVKuVaddpzvKHvPy0cHiu7Dl\nVUNd03nLz1Z1KpWbzZ07lx49elC+fHn++OMPqlWrZu+QlIPQO4uVsjMR4cMPP6RLly7Url2b0NBQ\nTQIqW2nHo1J2FBcXR69evZg9ezYvv/wywcHBFCxY0N5hKQejZwRK2cm5c+do3Lgxs2fPZsyYMUyf\nPl2TgLILPSNQyg4iIiJo3bo158+fZ/78+XTs2NHeISkHpmcESmWz5cuX8/TTT3Pz5k02bNigSUDZ\nnSYCpbLRhAkTaN26NZ6enmzbtg1///vf/a+UrWkiUCobJCQkMHDgQAYPHkzr1q3ZuHEjFSpUsHdY\nSgGaCJSyuStXrtC6dWu+++473nrrLX755ReHmBjOGiEhIURGRqYpi4yMJCQkxE4ROSZNBErZUGRk\nJE8//TRr1qxhypQpfPHFFzg5Odk7rByjfPnyzJs3z5IMIiMjmTdvHuXLl7dzZI5FrxpSykY2b97M\nc889R3x8PCtWrKBx48b2DinH8fDwoHPnzsybNw9/f3/CwsLo3LkzHh4e9g7NoegZgVI2MGvWLBo3\nbsxDDz1EaGioJoF78PDwwN/fnw0bNuDv769JwA40ESiVhUSEUaNG8eKLL1KvXj22bt1KpUq6NOK9\nREZGEhYWRkBAAGFhYXeMGSjb064hpbJIbGwsr7zyCnPnzuWVV15h8uTJFChQwN5h5WipYwKp3UEe\nHh5pXqvsoWcESmWB1Okifv75Zz7//HN++OEHTQJWOHXqVJov/dQxg1OnTtk5MseiZwRKZdLt00V0\n6NDB3iHlGg0a3LmGcOqZgco+ekagVCb8/vvvlukiNm7cqElA5UqaCJTKoO+++46goCDLdBF+frrm\nksqdNBEo9YASEhIYPHgwAwcOJCgoSKeLULmeJgKlHsDVq1dp27YtEyZMYOjQoSxcuFCni1C5ng4W\nK2Wl48eP07p1a/bt28fkyZN59dVX7R2SUllCE4FSVti2bRtt27YlLi6O5cuX07RpU3uHpFSW0a4h\npe5j3rx5NGrUiMKFC7NlyxZNAirP0USgVDpEhE8//ZTnn38ePz8/QkNDqVq1qr3DUirL2SwRGGOm\nGWPOG2MibisfZIw5YIzZa4z5wlb1K5UZN2/e5JVXXuFf//oXL774IqtXr6Z06dL2Dks5iB0rjnHy\nwD9pyk4e+IcdK47ZpD5bnhFMB1rcWmCMeQZoB/iISHXgSxvWr1SGXLx4kWbNmjFjxgw++OAD/ve/\n/+Hi4mLvsJQDKeNejBVTIizJ4OSBf1gxJYIy7sVsUp/NBotFZIMxxv224teBz0TkRso2521Vv1IZ\ncejQIYKCgjh27BgzZ86kW7du9g5JOaAKlUvQvK8XK6ZE4FoxicNLI2je14sKlUvYpD4jIjY5MEBK\nIlgqIl4pr3cBi0k+U4gDhovI9nT27Qf0AyhbtqzfnDlzbBbn7WJiYhzi2nBHaSdY19Zdu3YxatQo\njDF89NFHeHt7Z1N0WcdRPlNHaef5PUlE7YXS1aGM94N34DzzzDPhIuJ/v+2y+/JRZ6AEUA+oDfxs\njHlc7pKNRCQYCAbw9/eXwMDAbAty3bp1ZGd99uIo7YT7t3XGjBm8/fbbeHp68ttvv/H4449nX3BZ\nyFE+U0do58kD/3B4aQSlq8cTfSw/Tzez3RlBdl81dBL4RZJtA5IAt2yOQSmLpKQk3nvvPXr27ElA\nQABbtmzJtUlA5R2pYwLN+3pRxjufpZvo9gHkrJLdiWAR0BjAGFMJKABcyOYYlAKSF5Lp2rUrn3zy\nCX369GH58uUUL17c3mEpxfmjV9OMCaSOGZw/etUm9dmsa8gYMxsIBNyMMSeBUcA0YFrKJaU3gR53\n6xZSytbOnTtHu3bt2LZtG2PHjmXYsGEYY+wdllIA1Gpe8Y6yCpVL2KxryJZXDXVN562XbFWnUtbY\nu3cvQUFBnD9/ngULFtC+fXt7h6SUXemdxcqhrFq1yrKQzIYNGzQJKIUmAuVAgoODadmyJe7u7oSG\nhuLvf9+r6pRyCDr7qMrzkpKS+P777/n5559p2bIlc+fOxdXV1d5hKZVj6BmBytOuXbtGx44d+fnn\nnxkwYABLlizRJKDUbfSMQOVZZ86coU2bNuzYsYOBAwcyYcIEe4ekVI6kiUDlSbt376Z169ZcunSJ\nxYsX61mAUvegXUMqz1m+fDkNGjQgMTGRjRs30qZNG3uHpFSOpolA5SmTJk2idevWeHp6sm3bNmrW\nrGnvkJTK8TQRqDwhMTGRIUOGMGDAAFq1asXGjRspX768vcNSKlfQRKByvZiYGNq3b8/48eN54403\nWLRokUNMUaxUVtHBYpWrnT59mjZt2rBr1y4mTJjAwIED7R2SUrmOJgKVa+3evZugoCD++ecflixZ\nQlBQkL1DUipX0q4hlSv9/vvv1K9fn6SkJEJCQjQJKJUJmghUrjN58mRat27NE088QWhoKL6+vvYO\nSalcTROByjWSkpIYPnw4r7/+Oi1atGDDhg1UqFDB3mEplevpGIHKFa5fv85LL73EwoULGTBgAOPH\nj8fZWX99lcoK+j9J5Xhnz56lbdu2hIWFMX78eAYPHqyriSmVhTQRqBxt7969tGrVigsXLrBw4ULa\ntWtn75CUynN0jEDlWKtXr06zmpgmAaVsQxOBypF++OEHWrZsScWKFQkNDcXPz8/eISmVZ2kiUDlK\nUlIS//rXv+jTpw+NGzcmJCSExx57zN5hKZWn6RiByjHi4uJ45ZVXmDNnDn369GHSpEnkz5/f3mEp\nlefZ7IzAGDPNGHPeGBNxl/eGG2PEGONmq/pV7nLx4kWaNm3KnDlzGDNmDMHBwXk+CUxef5jNhy+k\nKdt8+AKT1x+2U0SZd3HqVK5tDU1Tdm1rKBenTrVTRMoatuwamg60uL3QGPMo0BQ4bsO6VS7y999/\n89RTT7F9+3bmzJnDiBEjHOLyUJ8KDzFw1k5LMth8+AIDZ+3Ep8JDdo4s41y8vDk1ZIglGVzbGsqp\nIUNw8fK2c2TqXmzWNSQiG4wx7nd5axzwNrDYVnWr3GPz5s20a9cOEWHNmjXUr1/f3iFlm6c93ZjY\nrSYDZ+3kpbqP8VPocSZ2q8nTnrn3RLlIvbqUHzeOU0OGUKJrF/6ZPYfy48ZRpF5de4em7sGIiO0O\nnpwIloqIV8rrtkATEXnDGHMU8BeRC+ns2w/oB1C2bFm/OXPm2CzO28XExDjEfPb2bue6dev49NNP\nKVOmDJ999plNp4uwd1vv5ZdDN1lyOJ62nvnp8GSBTB0rp7SzyJJfKbpsGTGtWnGtbdYvFZpT2pkd\nMtPWZ555JlxE/O+7oYjY7AG4AxEpzwsDocBDKa+PAm7WHMfPz0+y09q1a7O1PnuxVzuTkpLk888/\nF0Dq168vUVFRNq8zp36mm/6OkpofrpSvVuyXmh+ulE1/Z+5nkRPaGbNlqxyo95Sc/+YbOVDvKYnZ\nsjXL68gJ7cwumWkrECZWfMdm5+WjnoAH8GfK2UAFYIcx5uFsjEHZWUJCAq+99hrvvPMOXbp0YfXq\n1bi55d6ukMxIHROY2K0mQ5tVtnQT3T6AnJukjgmUHzeO0oMHW7qJbh9AVjlLtiUCEdkjImVExF1E\n3IGTQC0ROZtdMSj7io6Opk2bNgQHB/Puu+8yc+ZMXFxc7B2W3ew+eSXNmEDqmMHuk1fsHFnGxUXs\nSTMmkDpmEBexx86RqXux2WCxMWY2EAi4GWNOAqNE5Adb1adytlOnThEUFERERATBwcH07dvX3iHZ\n3WuNPO8oe9rTLVcPFpfq0+eOsiL16upgcQ5nVSIwxpQB6gOPALFABMl9T0np7SMiXe91zJSzAuUA\n9uzZQ6tWrbh8+TK//fYbzZs3t3dISqlb3DMRGGOeAUYAJYGdwHnABXgO8DTGzAe+EpGrtg5U5U6r\nV6+mY8eOFC1alI0bN+pqYkrlQPc7I2gF9BWRO27+MsY4A61JvjlsgQ1iU7nc9OnT6du3L1WqVGHZ\nsmU8+uij9g5JKXUX9xwsFpG37pYEUt5LEJFFIqJJQKUhIowePZpXXnmFwMBAQkJCNAkolYM90GCx\nMaYe8ClQEPhSRBbaJCqVa928eZN+/foxY8YMevToQXBwMAUKZO4mKWU9YwyRkZHExcXZOxSbeuih\nh/jrr7/sHUa2sKatLi4uVKhQIcPzc91vjODh2y7vHAq0BQywGdBEoCyuXLlCx44dWbNmDaNHj+bf\n//63Q8wZlJMUKVIEV1dX3N3d8/TPPjo6GldXV3uHkS3u11YR4eLFi5w8eRIPD48M1XG/M4LJxphw\nYKyIxAGXgW5AEqADxMrixIkTtGrViv379zN9+nR69Ohh75AckpOTE6VKlcrTSUClZYyhVKlSREVF\nZfgY9xsjeA7YBSw1xnQH3iQ5CRQm+cohpdi5cyd169bl+PHjLF++XJOAnWkScDyZ/czve2exiPwK\nNAeKA78AB0TkWxHJePpRecaKFSsICAjAycmJkJAQnn32WXuHpJR6QPdMBMaYtsaYEOAPkm8i6wK0\nN8bMNsbceVukcijTpk0jKCiIxx9/nK1bt+LtrXPO5ya2Whjnk08+oXr16vj4+ODr60to6N3nGRo9\nejRVqlTBy8uLhQvTH27s2bMnHh4e+Pr6UqtWLbZs2ZKp+NSd7ndG8DHJZwMdgc9F5LKIDAX+DXxi\n6+BUziQifPDBB/Tu3ZvGjRuzceNGypcvb++w1AOyxcI4W7ZsYenSpezYsYPdu3ezevXqu146fOLE\nCWbOnMmePXvYtWsXtWvXvudxx44dy65du/jss8949dVXMxyfurv7DRZfIfksoBDJdxUDICKHUsqV\ng4mPj+e1115j2rRp9OjRgylTpuT5JSXzKlssjHPmzBnc3NwoWLAgQLozyzo7O3P16lViYmIoUaKE\n1WtRBAQE8Pfff2c4PnV39zsjaE/ywHACyVcLKQeWOnvotGnTeP/99/nvf/+rSSCXe9rTjZfqPsa3\nf/zNS3Ufy/SEd82aNePEiRNUqlSJ/v37s379+rtuV7BgQcqWLUuHDh24ceOG1cf/9ddftQvSBu6X\nCOJEZIKITE5vPiFjjGMsE+Tgzpw5Q6NGjVi9ejVTpkzhww8/1KtT8oDNhy/wU+hxBjd+gp9Cj2d6\nLYSiRYsSHh5OcHAwpUuX5oUXXmD69Ol3bNe7d2/GjRtH48aN6datG0lJSXzxxRd89913dz3uW2+9\nha+vL8HBwfzwg05inNXu1zW02Bizi+T1hcNF5BqAMeZx4BngeWAKMN+mUSq7+uuvv2jZsiUXLlxg\nyZIltGrVyt4hqSxw68I4T3u6Uc+zVJrXGeXk5ERgYCCBgYF4e3szY8YMevbsmWab1atXM3/+fJo0\nacKgQYPo378/Bw4c4Mcff7zrMceOHUunTp0sr6OjozMcn7rT/e4jaAKsAV4F9hpjrhhjLgI/AQ8D\nPUREk0AetnHjRurXr09cXBzr16/XJJCH2GJhnAMHDnDo0CHL6127dlGxYsU7tvPx8eGnn34C4Isv\nvmD16tUULFhQ56Syk/vONSQiy4Bl2RCLymHmzZtH9+7dcXd3Z/ny5Rm+fV3lTLZYGCcmJoZBgwZx\n+fJlnJ2deeKJJwgODr5jux9//JFXX32Vr776ChcXF4YPH86CBQv4+uuvGTp0aIbrVxljsxXKVO42\nbtw4hg4dSv369Vm8eDGlSpWyd0gqF/Dz82Pz5s333c7T05PVq1enKXvttdfuuu3dxhhU1srOxetV\nLpCUlMSwYcMYOnQoHTt2ZNWqVZoElMrj9IxAWdy4cYOePXsyZ84cBg0axLhx43BycrJ3WEopG7M6\nERhjnICyt+6T3qI1Kve5cuUK7du3Z+3atXz++ee89dZbenmoUg7C2sXrBwGjgHMkzz4KIICPjeJS\n2ej06dO0bNmSffv28eOPP9K9e3d7h6SUykbWnhG8AVQWkYu2DEZlv/3799OiRQsuXrzIb7/9RrNm\nzewdklIqm1k7WHyC5HmHrGaMmWaMOW+MibilbKwxZr8xZrcxZqExpviDHFNlrYiICOrXr09sbCzr\n16/XJJBLRa8/Qdzhy2nKkuISSIy+aaeIVG5jbSI4AqwzxrxrjBma+rjPPtOBFreVrQK8RMQHOAi8\n+0DRqiyzZMkShg0bRsmSJdmyZQu1atWyd0gqg/JXcOXSrL8sySApLoGES3GY/Pf57x0yHiI3pC2L\n3JBcnglOTk74+vpSo0YNatWqZdXlpNZYt24drVu3zpJjqbSsTQTHSf4SLwC43vJIl4hsAC7dVrZS\nRBJSXm4FrJtyUGWp4OBg2rdvz+OPP87mzZt5/PHH7R2SygQXz+KU7FaVS7P+Il88JFyKw7mkC/lc\n7tPzW74WzOv5/8kgckPy6/KZ+6OgUKFC7Nq1iz///JMxY8bw7rv6915Od98xgpSrhYqKyFtZXHcv\nYO496u0H9AMoW7Ys69aty+Lq0xcTE5Ot9WUXEWH69On8+OOP1K1bl+HDh7N37157h5Ut8upnequS\nDxvyJbiQkF+4ER8L8ffZwa0mTkGTcPm5B/E1upP/z/8R1/p7Et1qQibn8kmdC+jcuXO4uroSHR2N\niPD++++zatUqjDG89dZbdOzYkY0bNzJmzBhKlSrFvn378PX1ZerUqRhjWLVqFSNGjKBUqVLUqFGD\nhIQEoqOj2bBhgyXBGGNYvnx5nl3MPjEx0aq5leLi4jL+Oy4i930Aa6zZ7i77uQMRdyn/F7AQMNYc\nx8/PT7LT2rVrs7W+7BAfHy99+vQRQHr16iXx8fF5sp3pyettjf37Hzn14WbZFbpDbpyKlsTYeOt3\nXvOxyKhiyf9mgXz58kmNGjWkcuXKUqxYMQkLCxMRkfnz58uzzz4rCQkJcvbsWXn00Ufl9OnTsnbt\nWilWrJicOHFCEhMTpV69erJx40aJjY2VChUqyMGDByUpKUk6d+4sQUFBIiLSokULCQkJERGR6Oho\niY9/gPbmMlevXrVqu3379t1RBoSJFd+x1nYN7TLGLDHGdDfGdEh9ZCTxGGN6AK2BF1MCVTYWGxtL\n586dmTp1Ku+99x5Tp07F2VnvJcwr4g5f5tKsvyjZrSpJ+cG5pAsJl+JIiku4/86RGyDsBwh4O/nf\n28cMMiC1a2j//v38/vvvvPzyy4gIISEhdO3aFScnJ8qWLUujRo3Yvn07AHXq1KFChQrky5cPX19f\njh49yv79+/Hw8ODJJ5/EGMNLL71kqaNevXoMHTqUb7/91jKvkco4axNBSeAi0Bhok/J44FEbY0wL\n4B2grYhcf9D91YO7fPkyzZs3Z/HixUyYMIGPPvpIbxTLY+JPRlOyW1VcPJMvwsvn4oxzSRckPune\nO6aOCXSeDo3/lfzvrWMGWeCpp57iwoULREVFca+/+1JXNIPkweaEhOQklt7v6tChQ5k6dSqxsbHU\nq1eP/fv3Z1nMjsiqRCAir9zl0ete+xhjZgNbgMrGmJPGmN7ARJIHmVcZY3YZYyZnugUqXadPnyYg\nIICtW7cye/ZsBg4caO+QlA24NnrUkgRS5XNxxsm1wL13PLUj+cvfIyD5tUdA8utTO7Istv3795OY\nmEipUqUICAhg7ty5JCYmEhUVxYYNG6hTp066+1apUoXIyEgOHz4MwOzZsy3vHTlyBG9vb9555x38\n/f01EWSStXcW/5fkO4nTuFcyEJGudynWpYWyycGDB2nevDlRUVH89ttvNG3a1N4hqZymwZt3lnkE\n/H9iyKDY2Fh8fX2B5DHIGTNm4OTkRPv27dmyZQs1atTAGMMXX3zBww8/nO6XuIuLC8HBwQQFBeHm\n5kaDBg2IiEi+LWnSpEls2rQJJycnqlWrRsuWLTMVs6OztmNt6S3PXUhey/h01oejskJ4eDgtW7ZE\nRFi3bh3+/v72Dkk5kMTExLuWG2MYO3YsY8eOTVOeuppZqokTJ1qet2jR4q6J4ssvv8yzVwnZg1WJ\nQEQW3Po6pdtndTqbKztavXo17du3p1SpUqxcuZJKlSrZOySlVA6X0fUIngQey8pAVObNnTuXVq1a\n4eHhwebNmzUJKKWsYu0YQTRpxwjOknz1j8ohJk6cyODBg2nQoAFLliyheHGdxkkpZR1ru4a0My6H\nEhFGjRrFRx99RLt27Zg9ezaFChWyd1hKqVzEqq4hY8waa8pU9kpKSmLAgAF89NFH9OrVi/nz52sS\nUEo9sHueERhjXIDCgJsxpgSQendHMeARG8em7iE+Pp6ePXsya9Ys3n77bT777DO9UUwplSH3OyN4\nFQgHqgA7Up6HA4uB72wbmkpPbGws7du3Z9asWYwZM4bPP/9ck0AmTYuYxrYz29KUbTuzjWkR0+wU\nke3Zqs1nz56lS5cueHp6Uq1aNVq1asXBgwczdcx7KVq0KJB8A2WnTp1sVk9eds9EICLfiIgHMFxE\nPG551BCRiffaV9nG1atXadGMcTZAAAAgAElEQVSiBcuWLeP7779nxIgR9g4pT/Aq5cXw9cMtX4zb\nzmxj+PrheJXysnNktmOLNosI7du3JzAwkMOHD7Nv3z4+/fRTzp07l1Vhp+uRRx5h/vz5Nq8nT7Jm\nZjqgCPAeEJzy+kmgtTX7ZsVDZx9Ndv78ealVq5Y4OzvL7NmzM328nNpOW7CmraGnQ6Xh7IYyYccE\naTi7oYSeDrV9YFlsx44dD7R9Vrd5zZo10rBhwzvKo6OjpXHjxlKzZk3x8vKSRYsWiYhIZGSkVKlS\nRfr06SPVqlWTpk2byvXr10VEJDg4WPz9/cXHx0c6dOgg165dExGRI0eOSO3atcXf31/ee+89KVKk\niOVY1atXtzxv0KCB1KxZU2rWrCmbNm0SkeTfg0aNGknHjh2lcuXK0q1bN0lKSspUm20tJ80+Og24\nCTyd8vok8HGWZiR1TydOnCAgIIB9+/axePFiunTpYu+Q8pw65erwfOXn+c/u//B85eepUy79eXDy\niqxuc0REBH5+fneUu7i4sHDhQnbs2MHatWsZNmyYZRK6Q4cOMWDAAPbu3Uvx4sVZsCD5/tUOHTqw\nfft2/vzzT6pWrcoPPyTPUPPGG2/Qu3dvtm/fzsMPP3zXOMqUKcOqVavYsWMHc+fOZfDgwZb3du7c\nyfjx49m3bx9Hjhxh06ZNmWpzXmBtIvAUkS9IWepCRGL5/4FjZWOHDh2iQYMGnD59mpUrV9KqVSt7\nh5QnbTuzjZ8P/MyrPq/y84Gf7+g/z4uyq80iwsiRI/Hx8eHZZ5/l1KlTlu4iDw8Py9xEfn5+HD16\nFEhOKg0bNsTb25uZM2daFlHatGkTnTt3BqB79+53rS8+Pp6+ffvi7e1N586d2bdvn+W9u0157eis\nnWvopjGmECk3lRljPIEbNotKWfz55580a9YMEWHt2rW6trCNpPaPf9noS+qUq0Odh+ukeZ0X2aLN\n1atXv2s//cyZM4mKiiI8PJz8+fPj7u5OXFwccOcU1LGxsQD07NmTRYsWUaNGDaZPn55m9a37XRwx\nbtw4ypYty59//klSUhIuLi6W99Kb8tqRWXtGMAr4HXjUGDMTWAO8bbOoFJD8l0+jRo0oWLAgGzdu\n1CRgQxEXI9J8AdYpV4cvG31JxMUIO0dmO7Zoc+PGjblx4wZTpkyxlG3fvp1jx45RpkwZ8ufPz9q1\nazl27Nh9jxUdHU25cuWIj49n5syZlvL69etbks2t5be6cuUK5cqVI1++fPzvf/9LdyI8ley+icAk\np979QAegJzAb8BeRdTaNzMGtWrWKpk2bUrZsWUJCQqhcubK9Q8rTenn1uuOv4Drl6tDL657LbuRq\ntmizMYaFCxeyatUqPD09qV69OqNHj6ZVq1aEhYXh7+/PzJkzqVKlyn2P9dFHH1G3bl2aNm2aZvtv\nvvmGKVOmULt2ba5cuXLXffv378+MGTOoV68eBw8epEiRIhluk0OwZkQZCLdmO1s9HO2qoV9//VUK\nFCggNWrUkHPnztmsHnu3Mzs5Slsf9Kqh3MraK2nygpx01dBWY0xt26UjlWrBggW0b9+eGjVq8Mcf\nf1CmTBl7h6SUyuOsHSx+BnjVGHMMuEbyFUMiIj42i8wBzZo1i5dffpm6deuybNkyHnroIXuHpJRy\nANYmAl0HzsamTZtGnz59CAwMZMmSJZbb5pVSytasnYb6/kP8KsMmTZrEgAEDaN68OQsXLtQZRJVS\n2SqjK5SpLPL1118zYMAA2rZty+LFizUJKKWynSYCO/rkk08YNmwYnTt3Zv78+WludFFKqexis0Rg\njJlmjDlvjIm4paykMWaVMeZQyr8lbFV/TiYivP/++7z33nt0796dWbNmkT9/fnuHpRzMxalTubY1\nNE3Zta2hXJw6NVPH1fGt3MeWZwTTgRa3lY0A1ojIkyTfnexwcyiLCG+//TYff/wxffr0Yfr06Tg7\nWztmr1TWcfHy5tSQIZZkcG1rKKeGDMHFy9vOkansZrNEICIbgEu3FbcDZqQ8nwE8Z6v6cyIRYdiw\nYXz55ZcMHDiQ//znP+TLp71zyj6K1KtL+XHjODVkCFHffsupIUMoP24cRerVzfSxY2JiaNKkCbVq\n1cLb25vFixcDcPToUapUqUKPHj3w8fGhU6dOXL9+HYAPP/yQ2rVr4+XlRb9+/SyzkwYGBvLOO+9Q\np04dKlWqxMaNGzMdn0oru7+FyorIGYCUfx3mbikR4Z133mHcuHEMGjSIb7/9VpOAsrsi9epSomsX\nLkz6nhJdu2RJEoB7Tzt94MAB+vXrx+7duylWrBiTJk0CYODAgWzfvp2IiAhiY2NZunSp5XgJCQls\n27aN8ePH88EHH2RJjOr/5dg+CWNMP6AfQNmyZdPMPGhrMTExWVqfiDB16lRmzZpF27Ztad++PevX\nr8+y42dUVrczJ3OUthYrVozo6Girt48LC+PSrNm49u7NpVmzwdsbF3//TMdx9epVRowYwebNm8mX\nLx+nTp3i8OHDxMXFUaFCBXx8fIiOjqZDhw5MnjyZV199lWXLljF+/HhiY2P5559/eOKJJwgMDCQx\nMZEWLVoQHR1N5cqVOXLkCImJiQ/UztzM2rbGxcVl+Hc8uxPBOWNMORE5Y4wpB5xPb0MRCQaCAfz9\n/SUwMDCbQoR169aRlfWNGjWKWbNm0a9fP77//vsccyaQ1e3MyRylrTt37sTV1dWqba9tDeWfkf+i\nwvjxFKlXl2sNG2ZZ99CSJUu4cuUKO3futEw77ezsTNGiRcmXL58lxsKFC5M/f37y58/PsGHDCAsL\n49FHH2X06NGICK6urjg5OVGiRAlcXV25ceMGSUlJODk5Wd3O3C46Otqqtrq4uFCzZs0M1ZHd30hL\ngB4pz3sAi7O5/mz30Ucf8eGHH9KrV68clQSUiovYk+ZLP3XMIC5iT6aPfeXKlXSnnT5+/DhbtmwB\nYPbs2TRo0MCyNoGbmxsxMTG69nA2s9kZgTFmNhAIuBljTpK8psFnwM/GmN7AcaCzrerPCcaMGcO/\n//1vXn75ZaZMmaJJQOUopfr0uaOsSL26mTobSEhIoGDBgrz44ou0adMGf39/fH1900wjXbVqVWbM\nmMGrr77Kk08+yeuvv07hwoUtK4q5u7tTu7bOcZmdbJYIRKRrOm81sVWdOcnYsWMZOXIk3bp1Y9q0\naZoElEPYu3cvnp6euLm5Wf7qv9XRo0fJly8fkydPvuO9jz/+mI8/vnMp9Fv7vd3c3Dh69KjDjA9k\nF/12soFx48bx9ttv88ILLzBjxgycnJzsHZJSNjd58mS6du161y9zlbPl2KuGcqsJEyYwdOhQOnXq\nxE8//aQ3iymH8dprr/Haa6/dcxt3d3ciIvLu8p+5lZ4RZKHg4GAGDx5M+/btmTVrliYBpVSuoIkg\niyxYsIDXXnuNVq1aMWfOHJ07SCmVa2giyAJr166lW7duPPXUU8ybN48CBQrYOySllLKaJoJM2rlz\nJ+3atePJJ5/k119/pXDhwvYOSSmlHogmgkw4fPgwLVu2pHjx4vz++++ULFnS3iEpZbUdK45x8sA/\nacpOHviHHSsytyChk5MTvr6+lsdnn32WqeM9qMmTJ/Pjjz9mybECAwN57LHHLPMkATz33HMZmmr7\nQfa5fPmyZQ6m7KCjmRl07tw5mjVrRkJCAuvWraNChQr2DkmpB1LGvRgrpkTQvK8XFSqX4OSBfyyv\nM6NQoULs2rUri6K8k4iQlJSU7vv3u3LpQRUvXpxNmzbRoEEDLl++zJkzZx5ofxFJk0iskZoI+vfv\n/0D7ZZSeEWTA1atXadmyJWfPnuW3335Lc9ekUrlFhcolaN7XixVTIghdciRNUrAFd3d3Ro4cyVNP\nPYW/vz87duygefPmeHp6prnBbOzYsdSuXRsfHx9GjRoFJN+IVrVqVfr370+tWrU4efIkP/zwA5Uq\nVSIwMJC+ffsycOBAAEaPHs2XX34JpD+F9fXr13n++efx8fHhhRdeoG7duoSFhd017i5dujBnzhwA\nfvnlFzp06GB5717Tbd8a74kTJyz7XLhwgaeeeorffvst3faOGDGCw4cP4+vry3vvvceZM2cICAjA\n19cXLy+vrJ+KOzVb5eSHn5+fZKe1a9em+15sbKw888wz4uzsLMuXL8++oGzgXu3MaxylrTt27Hjg\nfbYuPiwTX10jWxcfzpIY8uXLJzVq1LA85syZIyIiFStWlEmTJomIyJtvvine3t5y9epVOX/+vJQu\nXVpERFasWCF9+/aVpKQkSUxMlKCgIFm/fr1ERkaKMUa2bNkiIiIHDhyQihUrysWLF+XmzZvSoEED\nGTBggIiIjBo1SsaOHSsiIo0aNZKhQ4eKiMhvv/0mTZo0ERGRsWPHSr9+/UREZM+ePeLk5CTbt2+/\noy2NGjWSrVu3ire3tyQkJEjTpk0lMjJSihQpIiIi8fHxcuXKFRERiYqKEk9PT0lKSrojXhGRIkWK\nyNmzZ6VOnTqycuXK+7a3evXqIiJy9epV+fLLL+Xjjz8WEZGEhAS5evXqHbHu27fvjjIgTKz4jtWu\noQeQmJjISy+9xNq1a/npp59o0eL2BdiUyl1OHviHiA2n8G/lTsSGU5SvXCLTZwT36hpq27YtAN7e\n3sTExODq6oqrqysuLi5cvnyZlStXsnLlSsssmjExMRw6dIjHHnuMihUrUq9ePQDCw8Np1KiRZVyu\nc+fOHDx48K51pv4F7+fnx9GjRwEICQnhjTfeAMDLywsfH5902+Pk5ESDBg2YO3cusbGxuLu7W94T\nEUaOHMmGDRss022fO3cOIE28APHx8TRp0oTvvvuORo0aAdyzvbeqXbs2vXr1Ij4+nueeew5fX990\n480I7RqykogwcOBAFixYwNdff82LL75o75CUypRbxwTqtn3c0k10+wByVipYsCAA+fLlszxPfZ2Q\nkICI8O6777Jr1y527drF33//Te/evQEoUqSIZXt5gD731HqcnJxISEh44P0huXto0KBBPP/882nK\nZ86cSVRUFOHh4ezatYuyZctaZlK9NV4AZ2dn/Pz8WLFiRZp2pNfeWwUEBLBhwwbKly9P9+7ds2ww\nPJUmAit9/fXXTJ48mXfeeYchQ4bYOxylMu380atpxgRSxwzOH71qt5iaN2/OtGnTiImJAeDUqVOc\nP3/nsiV+fn6sX7+ef/75h4SEBBYsWPBA9TRo0ICff/4ZgH379rFnz72n3m7YsCHvvvsuXbumnUvz\nXtNt384Yw7Rp09i/f7/lSqr02uvq6ppmYr1jx45RpkwZ+vbtS+/evdmxY8cDtfd+tGvICqtXr+bt\nt9+mU6dOjBkzxt7hKJUlajWveEdZhSzoGoqNjU3TddGiRQurLyFt1qwZf/31F0899RSQfMnlTz/9\ndMfEjY888ggjR46kbt26PPLII1SrVo2HHnrI6hj79+9vWTe5Zs2a+Pj43HN/YwzDhw+/o/xe023f\njZOTE3PmzKFNmzYUK1aM/v3737W9np6e1K9fHy8vL8tg9NixY8mfPz9FixbN8jMCuw8EW/Ow52Dx\nkSNHpGTJkuLl5SXR0dHZGoetOcoAqojjtDUjg8W50dWrVy3/H+Pj46V169byyy+/WL1/QkKCxMbG\niojI33//LRUrVpQbN27YJNbMutvA8N3oYLGNXLt2jeeee46kpCQWLVqUoZtIlFK2MXr0aFavXk1c\nXBzNmjXjueees3rf69ev88wzzxAfH4+I8P333zv01DCaCNIhIvTu3Zs9e/awbNkyPD097R2SUuoW\nqfcKZISrq2u69w04Ik0E6fjyyy+ZO3cuY8aM0ctElVJ5ml41dBfbt29nxIgRdO7cmXfeecfe4Sil\nlE1pIrjN4cOH+eijj6hevTr//e9/McbYOySllLIpTQS3uHbtGu3btwdg0aJFd9wQopRSeZEmghQi\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot frontier\n", "xlim = ((rmin-0.1*dr), (rmax+0.1*dr))\n", "\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(np.sqrt(Q[i,i]), r[i], 'x', color=colors[np.mod(i, len(colors))])\n", "plt.plot(np.sqrt(var0), mu0, 'k')\n", "plt.xlabel('std (%)')\n", "plt.ylabel('return (%)')\n", "plt.title('Efficient frontier')\n", "plt.ylim(xlim)\n", "plt.legend(assets['Label'].values)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The frontier without short sales\n", "\n", "The Optimize API let's one add any constraint to the calculation of the points in the frontier.\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# vector of expected returns\n", "r = assets['Return (%)'].values\n", "\n", "# covariance matrix\n", "sigmas = np.diag(assets['STD (%)'].values)\n", "Q = sigmas @ cov.values @ sigmas\n", "\n", "# options\n", "options = {\n", " 'number_of_points': 20,\n", " 'short': False\n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'options': options\n", "}\n", "sol = client.call('frontier', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "will produce 20 points on the efficient frontier obtained for portfolios for which short sales are not permitted: " ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1. mu = 6.889%, std = 4.874% (optimal)\n", " 2. mu = 7.474%, std = 5.025% (optimal)\n", " 3. mu = 8.059%, std = 5.382% (optimal)\n", " 4. mu = 8.644%, std = 5.886% (optimal)\n", " 5. mu = 9.228%, std = 6.502% (optimal)\n", " 6. mu = 9.813%, std = 7.204% (optimal)\n", " 7. mu = 10.398%, std = 7.969% (optimal)\n", " 8. mu = 10.983%, std = 8.779% (optimal)\n", " 9. mu = 11.568%, std = 9.625% (optimal)\n", " 10. mu = 12.152%, std = 10.497% (optimal)\n", " 11. mu = 12.737%, std = 11.389% (optimal)\n", " 12. mu = 13.322%, std = 12.297% (optimal)\n", " 13. mu = 13.907%, std = 13.217% (optimal)\n", " 14. mu = 14.491%, std = 14.148% (optimal)\n", " 15. mu = 15.076%, std = 15.087% (optimal)\n", " 16. mu = 15.661%, std = 16.032% (optimal)\n", " 17. mu = 16.246%, std = 16.984% (optimal)\n", " 18. mu = 16.830%, std = 17.940% (optimal)\n", " 19. mu = 17.415%, std = 18.900% (optimal)\n", " 20. mu = 18.000%, std = 26.000% (optimal)\n" ] } ], "source": [ "frontier = sol['frontier']\n", "m = len(frontier)\n", "mu1 = np.zeros((m,))\n", "var1 = np.zeros((m,))\n", "pos1 = np.zeros((m, n))\n", "for i, e in enumerate(frontier):\n", " point = e['sol']\n", " mu1[i] = e['mu']\n", " var1[i] = point['obj']\n", " pos1[i, :] = point['x']\n", " if point['obj'] is not None:\n", " print(' {}. mu = {:.3f}%, std = {:.3f}% ({})'.format(i+1, mu1[i], math.sqrt(var1[i]), point['status']))\n", " else:\n", " print(' {}. mu = {:.3f}%, std = --- ({})'.format(i+1, mu1[i], point['status']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again these points can be combined to produce a plot of the frontier:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rmax = np.max(r)\n", "rmin = np.min((np.min(r), np.min(mu0)))\n", "dr = rmax - rmin\n", "colors = np.array(plt.rcParams['axes.prop_cycle'].by_key()['color'])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n+3+yqFKAJvY/jwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot frontier\n", "ylim = ((rmin-0.1*dr), (rmax+0.1*dr))\n", "\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(np.sqrt(Q[i,i]), r[i], 'x', color=colors[np.mod(i, len(colors))])\n", "plt.plot(np.sqrt(var0), mu0, 'k--')\n", "plt.plot(np.sqrt(var1), mu1, 'k')\n", "plt.xlabel('std (%)')\n", "plt.ylabel('return (%)')\n", "plt.title('Efficient frontier')\n", "plt.ylim(ylim)\n", "plt.legend(assets['Label'].values)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have combined in this plot also the standard frontier with short sales (dashed) for comparison." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The frontier with general constraints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All options available for calculation of optimal portfolios also apply to the frontier.\n", "\n", "For example, the requirement of no short sales plus at least 50% on S & P and Bonds can be applied to the frontier as follows:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# options\n", "options = {\n", " 'number_of_points': 20,\n", " 'short': False \n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'mu': mu,\n", " 'labels': assets['Label'].tolist(),\n", " 'constraints': [{'label': 's&p_bonds', 'set': ['S & P', 'Bonds'], 'bounds': [.5, np.inf]}],\n", " 'options': options\n", "}\n", "sol = client.call('frontier', data)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1. mu = 6.889%, std = 4.874% (optimal)\n", " 2. mu = 7.474%, std = 5.025% (optimal)\n", " 3. mu = 8.059%, std = 5.382% (optimal)\n", " 4. mu = 8.644%, std = 5.886% (optimal)\n", " 5. mu = 9.228%, std = 6.502% (optimal)\n", " 6. mu = 9.813%, std = 7.204% (optimal)\n", " 7. mu = 10.398%, std = 7.969% (optimal)\n", " 8. mu = 10.983%, std = 8.779% (optimal)\n", " 9. mu = 11.568%, std = 9.625% (optimal)\n", " 10. mu = 12.152%, std = 10.519% (optimal)\n", " 11. mu = 12.737%, std = 11.487% (optimal)\n", " 12. mu = 13.322%, std = 12.497% (optimal)\n", " 13. mu = 13.907%, std = 13.541% (optimal)\n", " 14. mu = 14.491%, std = 14.611% (optimal)\n", " 15. mu = 15.076%, std = 15.702% (optimal)\n", " 16. mu = 15.661%, std = 16.811% (optimal)\n", " 17. mu = 16.246%, std = --- (infeasible)\n" ] } ], "source": [ "frontier = sol['frontier']\n", "m = len(frontier)\n", "mu2 = np.zeros((m,))\n", "var2 = np.zeros((m,))\n", "pos2 = np.zeros((m, n))\n", "for i, e in enumerate(frontier):\n", " point = e['sol']\n", " mu2[i] = e['mu']\n", " var2[i] = point['obj']\n", " pos2[i, :] = point['x']\n", " if point['obj'] is not None:\n", " print(' {}. mu = {:.3f}%, std = {:.3f}% ({})'.format(i+1, mu2[i], math.sqrt(var2[i]), point['status']))\n", " else:\n", " print(' {}. mu = {:.3f}%, std = --- ({})'.format(i+1, mu2[i], point['status']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note how the additional constraints lead to infeasible portfolios for higher levels of return.\n", "\n", "This frontier's graphical representation can be calculated as in:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rmax = np.max(r)\n", "rmin = np.min((np.min(r), np.min(mu0)))\n", "dr = rmax - rmin\n", "colors = np.array(plt.rcParams['axes.prop_cycle'].by_key()['color'])" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nNwDOnj3L6dMvn3q7Tp06DB8+nM6dE8+l+bLptp+llGL+/PmcO3fO+CTVi+pra2ubaGK9K1euULhw\nYfr06UOvXr04fvz4a9X3VXTTUDJs376dzz//nPbt2yd6Euiff/7B09OTAgUKsHTpUj2bqJahVGtS\n6rltJVKhaSgiIiJR00XTpk2T/Qhp48aN+eeff6hVqxZgeOTy119/fe7/VrFixfjyyy+pWbMmxYoV\no3LlyuTNmzfZMfbr18+4brKrqytOTk4vPV8pxdChQ5/b/rLptpNiaWnJ8uXLadmyJXny5KFfv35J\n1tfBwYHatWvj6Oho7IyeNGkSVlZW5M6dO9XvCMzeEZyclzk7i//9918pUKCAVKlSRcLCwozbo6Ki\npHbt2qKUkl9//TVN40stWaUDVSTr1PVNOoszokePHhn/P0ZFRUmLFi1k9erVyT4/OjpaIiIiRETk\n0qVLUqpUKXny5IlJYk2ptFihTN8RvIKI4OjoyLx58xINCBk3bhz79+9n3rx5dO3a1YwRalrWNGbM\nGLZv305kZCSNGzemTZs2yT73v//+o379+kRFRSEizJ49m+zZs5sw2vRNJ4IXkLjOpDJlyvDXX38l\n2rdq1SrGjx9P586d6dmzpznC07QsL36swJuwtbV94biBrEh3Fr/A5MmTee+994xPAMSLiYlhyJAh\niAhjx441U3SapmmpRyeCJBw9epRhw4ahlEr0iBsYppAIDg5m7ty5lCtXzkwRapqmpR6dCJ4RGBjI\nuHHjqFKlCvPnz080TcS+ffv46quvaNGiBf/73//MGKWmaVrq0YkggcePH9O2bVsA1qxZk6hzWETo\n0KEDkZGRTJkyRc8jpGlapqETQQIXL17k1q1bjBw5EgcHh0T7Fi9ezK1bt/j4448pX768mSLUtNRz\nZN0qggP+TrQtOOBvjqxblaLrxk9D7ejoSMeOHZ8biZ8c69evN449uHPnDjVr1sTV1ZW9e/fSvHlz\nQkNDUxSjlphOBAm4uLjw77//UqNGjUTbr169yqBBg6hduzbTp083U3SalrrecijPn9O+NSaD4IC/\n+XPat7zlkLIvOvFzDQUEBJA9e/ZEM4smV6tWrRg2bBgAO3bsMC7+VKdOHTZu3Ei+fPlSFKOWmFkS\ngVJqkFLqjFIqQCm1TCllbY444t2/f5/p06cTHR393PwggHEe8jlz5mBhoXOnljmUdHSixcBh/Dnt\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot frontier\n", "ylim = ((rmin-0.1*dr), (rmax+0.1*dr))\n", "\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(np.sqrt(Q[i,i]), r[i], 'x', color=colors[np.mod(i, len(colors))])\n", "plt.plot(np.sqrt(var0), mu0, 'k--')\n", "plt.plot(np.sqrt(var1), mu1, 'k:')\n", "plt.plot(np.sqrt(var2), mu2, 'k')\n", "plt.xlabel('std (%)')\n", "plt.ylabel('return (%)')\n", "plt.title('Efficient frontier')\n", "plt.ylim(ylim)\n", "plt.legend(assets['Label'].values)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A strongly constrained frontier\n", "\n", "Consider now the cashflow problem we discussed above in which one would like to invest additional funds to improve their returns without selling any assets. The corresponding frontier can be obtained as follows:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# initial portfolio\n", "x0 = assets['Initial (%)'].values/100\n", "\n", "# cashflow\n", "cashflow = 20/100\n", "\n", "# options\n", "options = {\n", " 'number_of_points': 20,\n", " 'sell': False\n", "}\n", "\n", "# prepare data for submitting request to api\n", "data = {\n", " 'Q': Q.tolist(),\n", " 'r': r.tolist(),\n", " 'x0': x0.tolist(),\n", " 'cashflow': cashflow,\n", " 'options': options\n", "}\n", "sol = client.call('frontier', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in this case many returns lead to infeasible portfolios, and the efficient frontier covers a much smaller range of returns:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 1. mu = 11.708%, std = 10.331% (optimal)\n", " 2. mu = 12.039%, std = 10.761% (optimal)\n", " 3. mu = 12.371%, std = 11.226% (optimal)\n", " 4. mu = 12.702%, std = 11.711% (optimal)\n", " 5. mu = 13.033%, std = 12.202% (optimal)\n", " 6. mu = 13.364%, std = 12.699% (optimal)\n", " 7. mu = 13.695%, std = --- (infeasible)\n" ] } ], "source": [ "frontier = sol['frontier']\n", "m = len(frontier)\n", "mu3 = np.zeros((m,))\n", "var3 = np.zeros((m,))\n", "pos3 = np.zeros((m, n))\n", "for i, e in enumerate(frontier):\n", " point = e['sol']\n", " mu3[i] = e['mu']\n", " var3[i] = point['obj']\n", " pos3[i, :] = point['x']\n", " if point['obj'] is not None:\n", " print(' {}. mu = {:.3f}%, std = {:.3f}% ({})'.format(i+1, mu3[i], math.sqrt(var3[i]), point['status']))\n", " else:\n", " print(' {}. mu = {:.3f}%, std = --- ({})'.format(i+1, mu3[i], point['status']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as visualized in the following plot:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rmax = np.max(r)\n", "rmin = np.min((np.min(r), np.min(mu0)))\n", "dr = rmax - rmin\n", "colors = np.array(plt.rcParams['axes.prop_cycle'].by_key()['color'])" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nY4xxuP8HFicC7YudIXMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot frontier\n", "ylim = ((rmin-0.1*dr), (rmax+0.1*dr))\n", "\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(np.sqrt(Q[i,i]), r[i], 'x', color=colors[np.mod(i, len(colors))])\n", "plt.plot(np.sqrt(var0), mu0, 'k--')\n", "plt.plot(np.sqrt(var1), mu1, 'k:')\n", "plt.plot(np.sqrt(var2), mu2, 'k-.')\n", "plt.plot(np.sqrt(var3), mu3, 'k')\n", "plt.xlabel('std (%)')\n", "plt.ylabel('return (%)')\n", "plt.title('Efficient frontier')\n", "plt.ylim(ylim)\n", "plt.legend(assets['Label'].values)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Zooming in:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot frontier\n", "ylim = (11.5, 13.5)\n", "xlim = (9, 13)\n", "\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(np.sqrt(Q[i,i]), r[i], 'x', color=colors[np.mod(i, len(colors))])\n", "plt.plot(np.sqrt(var0), mu0, 'k--')\n", "plt.plot(np.sqrt(var1), mu1, 'k:')\n", "plt.plot(np.sqrt(var2), mu2, 'k-.')\n", "plt.plot(np.sqrt(var3), mu3, 'k')\n", "plt.xlabel('std (%)')\n", "plt.ylabel('return (%)')\n", "plt.title('Efficient frontier')\n", "plt.ylim(ylim)\n", "plt.xlim(xlim)\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "helps to visualize the three frontiers.\n", "\n", "Another interesting visualizion is that of the resulting trades. The following plot shows the frontier, the corresponding positions as a percentage of the total holdings and the corresponding trades as a percentage of the cashflow." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nZ8vMzMysbbVNQw4gIu4B7ml1PszMzMyqoJ26Vs3MzMxsCNrmPXKNkLQN6OwXyTVmH+CFVmeiDTku\nfTkm5RyXco5LOcelL8ek3MyIGD+SO2yrrtUGPDnSL9brBJKWOy59OS59OSblHJdyjks5x6Uvx6Sc\npOUjvU93rZqZmZlVlBtyZmZmZhVV9YbcolZnoE05LuUcl74ck3KOSznHpZzj0pdjUm7E41Lphx3M\nzMzMulnVr8iZmZmZdS035MzMzMwqqm0acpKul7RV0ppC2kckPS5pp6R+H2OW9IykxyStLD7aK2mS\npCWS1uW/E0f7OEZao3GRNDPHo/Z5SdL8vOwKSX8rLJvXrOMZCf3E5FuSnpC0WtKdkvbqZ9uTJT0p\nab2kBYX0gyQ9nMvKz/J4v5XSaFwkTZO0VNLaXK4+V1hW6bICwy4v3Va31FNeOrZugX7j8o0ck5WS\n7pc0pZ9tz89lYp2k8wvp78zlaL2k70pSM45lpDQaE0mzJD2U65XVkj5aWHaDpL8WysqsZh3PSBlm\nWdlROPbFhfShn4sioi0+wHHAHGBNIe1wYCbwO+DIAbZ9BtinJP2bwII8vQC4stXH2cy4FNbfFXge\neEeevwL4YquPbYRjciLQk6evLPu/znHYABwMjAFWAUfkZT8HzsnT1wKfavVxNjEuk4E5eXo88FQh\nLpUuK8OJS17WbXVLXXEprN9RdcsAcZlQmP4scG3JdpOAp/PfiXl6Yl72Z+AYQMC9wCmtPs4mxWQG\nMD1PTwE2A3vl+RuAs1t9bK2IS172cj/pQz4Xtc0VuYj4A/Bir7S1ETGckRvOAG7M0zcCZw5jXy0x\nQnF5H7AhIp4d0cy1SD8xuT8itufZZcD+JZseBayPiKcj4n/AT4Ez8q/jE4Bf5PU6qawMGpeI2BwR\nK/L0NmAtMHWUs9s0wygvA+nUumWocemougX6jctLhdk9gbKnBE8ClkTEixHxT2AJcLKkyaST+0OR\nzs43UbHy0mhMIuKpiFiXpzcBW4F9RzGrTTWMslKq0XNR2zTkhimA+yU9KumThfT9ImIzpJMV8LaW\n5K71zgFu65V2Sb78e30Vu4UGcRHpV29vU4HnCvMbc9rewL8KJ7BaeqfpLy6vk3QgMBt4uJDcyWUF\nBo5LN9ctg5YXuqhukbRQ0nPAecDlJav0V79MzdO90yuvjpgU1z2K1BOyoZC8MJeV70gaO4pZbao6\n47K7pOWSlkmqNdYaOhd1SkNubkTMAU4BPiPpuFZnqF3k/vXTgdsLyT8ADgFmkS51X92CrI0KSZcC\n24FbyhaXpMUA6R1jkLjU1hkH3AHML/yq7NiyAnXFpSvrljrLS1fVLRFxaURMI8XkkpJVuq5+qSMm\nAOSrkjcDF0bEzpz8FeAw4F2k7ugvj3J2m6bOuBwQaQizjwHXSDqEBstKRzTk8iVbImIrcCepCw1g\nSy5AtYK0tTU5bKlTgBURsaWWEBFbImJH/kJdxxvxqrR8c/GpwHm5C6O3jcC0wvz+wCbSwM57Serp\nld4R6ogLknYjNeJuiYhf1tI7taxAfXHpxrqlnrhkXVO39HIr8OGS9P7ql428uYu6o+qXrL+YIGkC\ncDdwWUQsq6XnWzoiIl4Ffkx3lZVi3fI06X732TR4Lqp8Q07SnpLG16ZJN+vWniBZDNSeHDofuKv5\nOWy5c+nV9VE7AWVn8Ua8KkvSyaRfdKdHxH/6We0RYHp+KmgMqVtocT5ZLQXOzut1TFmpJy75vowf\nAWsj4tu9lnVcWYG649J1dUud36OarqhbACRNL8yeDjxRstp9wImSJuYu5ROB+3LX+zZJR+fv2ifo\ngPJST0xyPXsncFNE3N5rWe2HkEj3gXVNWcllZGye3geYC/yl4XPRYE9DNOtDqhA2A6+RfsFcTKoI\nNgKvAltIXwpIT7/ck6cPJj19uAp4HLi0sM+9gd8C6/LfSa0+zmbFJc/vAfwDeGuvfd4MPAasJp2Q\nJrf6OEcgJutJ96eszJ9r+4nJPNJTmRt6lZWDSU+WrSd1FY1t9XE2Ky7Ae0iX71cX1pvXCWVlmHHp\nxrql3u9RR9YtA8TlDlJDYzXwK2BqXvdI4IeFbS/KMVxP6kaksN6aXO98nzyqUlU+jcYE+HjeZmXh\nMysveyCXlTXAT4BxrT7OJsbl3fnYV+W/Fxf2OeRzkYfoMjMzM6uoynetmpmZmXUrN+TMzMzMKsoN\nOTMzM7OKckPOzMzMrKLckDMzMzOrKDfkzKwjSZovaY9R3L8kPSBpgqR9Jf1R0prCcDtIukvSlML8\nVZJOGK08mVn3cUPOzCopN6QGqsPmk953NpR99gy+1uvmAasiDWd2LmmA62OAL+V9nUYa+aD4Zvbv\nAQuGkiczs4EMpdIyM2spSQeSBnJfSmo0nSlpJvB1YCzphasXkl7MOgVYKumFiDhe0ssRMS7v52zg\n1Ii4QNINwIukIXJWSNoGHEB6MecBwDUR8d2S7JwHLMrTrwFvyXnYmRuE84HTihtExLOS9pb09oh4\nfiRiYmbdzVfkzKxqZpKG/JkNvAJcBrw/0uD2y4HP54bXJuD4iDi+jn3OyPv4Qp4/DDiJNP7j1/JY\ntL3NBR7N07fm9X8DXAF8OuexbJirFXlbM7Nh8xU5M6uaZ+ONwbePBo4A/pSGbGQM8FAD+7w9InYU\n5u+ONJj3q5K2AvuRhuApmhQR2wAi4t/AByGNo0gar/RDkq4DJgJXR0QtX1tJVwvNzIbNDTkzq5pX\nCtMClkTEuXVsVxyPcPcB9glpHOOaHZTXldsl7RIRO3ulXw4sJN039yjpat1dQO3K4O7Af+vIr5nZ\noNy1amZVtgyYK+lQAEl7SJqRl20DxhfW3SLp8PyAxFkj8G8/SbqP7nWSpgNTIuL3pActdpIakMWG\n4wzSoNpmZsPmhpyZVVZE/B24ALhN0mpSw+6wvHgRcK+kpXl+AfBr4AFg8wj883cD7+2VtpB0zx7A\nbTlvy4CrAPK9doeS7uUzMxs2RcTga5mZ2ZtImkx6oOEDQ9jmLGBORHx19HJmZt3EV+TMzBoQEZuB\n6yRNGMJmPcDVo5QlM+tCviJnZmZmVlG+ImdmZmZWUW7ImZmZmVWUG3JmZmZmFeWGnJmZmVlFuSFn\nZmZmVlH/B6dlp/4s0IapAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mu = mu3\n", "var = var3\n", "pos = pos3\n", "trades = (pos - x0) / cashflow\n", "\n", "# plot frontier\n", "plt.figure(figsize=(10, 10))\n", "\n", "ax = plt.subplot(3, 1, 1)\n", "for i, label in enumerate(assets['Label'].values): \n", " plt.plot(r[i], np.sqrt(Q[i,i]), 'x', color=colors[np.mod(i, len(colors))])\n", "ax.plot(mu0, np.sqrt(var0), 'k--')\n", "ax.plot(mu1, np.sqrt(var1), 'k:')\n", "ax.plot(mu2, np.sqrt(var2), 'k-.')\n", "ax.plot(mu, np.sqrt(var), 'k')\n", "ax.set_ylabel('std (%)')\n", "ax.set_title('Efficient frontier')\n", "ax.set_xlim(ylim)\n", "ax.set_ylim(xlim)\n", "ax.grid()\n", "\n", "ax = plt.subplot(3, 1, 2)\n", "ax.plot(mu, 100*pos)\n", "ax.set_ylabel('positions')\n", "ax.set_title('Positions')\n", "ax.set_xlim(ylim)\n", "ax.legend(assets['Label'].values)\n", "ax.grid()\n", "\n", "ax = plt.subplot(3, 1, 3)\n", "ax.plot(mu, 100*trades)\n", "ax.set_xlabel('return (%)')\n", "ax.set_ylabel('trades')\n", "ax.set_title('Buy/Sell')\n", "ax.set_xlim(ylim)\n", "ax.grid()\n", "\n", "plt.subplots_adjust(hspace=.4)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Note that the frontier in this case is represented with the coordinates reversed, that is risk versus return, as opposed to the standard return versus risk." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 1 }