ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
lab_111.ipynb
(54641B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Lack of Robustness of the Markowitz procedure and the GMV portfolio\n",
8 "\n",
9 "Although the promise of the Markowitz procedure is exciting, in tends to fall apart in practice. The problem is that we rarely know Expected Returns and Expected Covariance in advance. Our estimates almost certainly contain some estimation error, and we'll see that the procedure is highly sensitive to these errors, which tend to get exaggerated in the portfolio.\n",
10 "\n",
11 "To see this, let's start by loading up our data as usual."
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 1,
17 "metadata": {},
18 "outputs": [],
19 "source": [
20 "%load_ext autoreload\n",
21 "%autoreload 2\n",
22 "%matplotlib inline\n",
23 "import edhec_risk_kit_111 as erk\n",
24 "\n",
25 "ind = erk.get_ind_returns()\n",
26 "er = erk.annualize_rets(ind[\"1996\":\"2000\"], 12)\n",
27 "cov = ind[\"1996\":\"2000\"].cov()"
28 ]
29 },
30 {
31 "cell_type": "markdown",
32 "metadata": {},
33 "source": [
34 "Let's look at a simple 2-asset portfolio and find the optimal weights if we had known what the returns would be."
35 ]
36 },
37 {
38 "cell_type": "code",
39 "execution_count": 2,
40 "metadata": {},
41 "outputs": [
42 {
43 "data": {
44 "text/plain": [
45 "array([0.75040363, 0.24959637])"
46 ]
47 },
48 "execution_count": 2,
49 "metadata": {},
50 "output_type": "execute_result"
51 }
52 ],
53 "source": [
54 "l = [\"Food\", \"Steel\"]\n",
55 "import numpy as np\n",
56 "erk.msr(0.1, np.array(er[l]), cov.loc[l,l])"
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "Let's look at the returns of the two assets that dictated those weights"
64 ]
65 },
66 {
67 "cell_type": "code",
68 "execution_count": 3,
69 "metadata": {},
70 "outputs": [
71 {
72 "data": {
73 "text/plain": [
74 "Food 0.116799\n",
75 "Steel 0.115809\n",
76 "dtype: float64"
77 ]
78 },
79 "execution_count": 3,
80 "metadata": {},
81 "output_type": "execute_result"
82 }
83 ],
84 "source": [
85 "er[l]"
86 ]
87 },
88 {
89 "cell_type": "markdown",
90 "metadata": {},
91 "source": [
92 "Now assume that we had a really good estimator, and we were off by only a fraction of a percent in our estimate, and we had estimated a return of 11 and 12 percent respectively for Food and Steel"
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": 4,
98 "metadata": {},
99 "outputs": [
100 {
101 "data": {
102 "text/plain": [
103 "array([0.57930354, 0.42069646])"
104 ]
105 },
106 "execution_count": 4,
107 "metadata": {},
108 "output_type": "execute_result"
109 }
110 ],
111 "source": [
112 "erk.msr(0.1, np.array([.11, .12]), cov.loc[l,l])"
113 ]
114 },
115 {
116 "cell_type": "markdown",
117 "metadata": {},
118 "source": [
119 "We see that even a small change in the estimate causes a major change in the weights. What if we were off by around 1% to 2% percent in each estimate and estimated 10% and 13% instead of the return of 11.6% and 11.5%?"
120 ]
121 },
122 {
123 "cell_type": "code",
124 "execution_count": 5,
125 "metadata": {},
126 "outputs": [
127 {
128 "data": {
129 "text/plain": [
130 "array([0., 1.])"
131 ]
132 },
133 "execution_count": 5,
134 "metadata": {},
135 "output_type": "execute_result"
136 }
137 ],
138 "source": [
139 "erk.msr(0.1, np.array([.10, .13]), cov.loc[l,l])"
140 ]
141 },
142 {
143 "cell_type": "markdown",
144 "metadata": {},
145 "source": [
146 "And if we had made the _same_ estimation error, but the error went the other way (13% and 10%)?"
147 ]
148 },
149 {
150 "cell_type": "code",
151 "execution_count": 6,
152 "metadata": {},
153 "outputs": [
154 {
155 "data": {
156 "text/plain": [
157 "array([1., 0.])"
158 ]
159 },
160 "execution_count": 6,
161 "metadata": {},
162 "output_type": "execute_result"
163 }
164 ],
165 "source": [
166 "erk.msr(0.1, np.array([.13, .10]), cov.loc[l,l])"
167 ]
168 },
169 {
170 "cell_type": "markdown",
171 "metadata": {},
172 "source": [
173 "# Avoiding estimating returns\n",
174 "\n",
175 "Let's look at the efficient frontier one more time, and plot the efficient frontier again.\n"
176 ]
177 },
178 {
179 "cell_type": "code",
180 "execution_count": 7,
181 "metadata": {},
182 "outputs": [
183 {
184 "data": {
185 "image/png": "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\n",
186 "text/plain": [
187 "<Figure size 432x288 with 1 Axes>"
188 ]
189 },
190 "metadata": {
191 "needs_background": "light"
192 },
193 "output_type": "display_data"
194 }
195 ],
196 "source": [
197 "erk.plot_ef(20, er, cov, show_cml=True, riskfree_rate=0.1)"
198 ]
199 },
200 {
201 "cell_type": "markdown",
202 "metadata": {},
203 "source": [
204 "One way to avoid this estimation game is to skip the entire process and just rely on _naive_ diversification, which means hold all stocks with equal weight. We can add the EW portfolio to the plot by enhancing the `plot_ef` function as follows:\n",
205 "\n",
206 "```python\n",
207 " if show_ew:\n",
208 " n = er.shape[0]\n",
209 " w_ew = np.repeat(1/n, n)\n",
210 " r_ew = portfolio_return(w_ew, er)\n",
211 " vol_ew = portfolio_vol(w_ew, cov)\n",
212 " # add EW\n",
213 " ax.plot([vol_ew], [r_ew], color='goldenrod', marker='o', markersize=10)\n",
214 "```\n"
215 ]
216 },
217 {
218 "cell_type": "code",
219 "execution_count": 9,
220 "metadata": {},
221 "outputs": [
222 {
223 "data": {
224 "image/png": "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\n",
225 "text/plain": [
226 "<Figure size 432x288 with 1 Axes>"
227 ]
228 },
229 "metadata": {
230 "needs_background": "light"
231 },
232 "output_type": "display_data"
233 }
234 ],
235 "source": [
236 "erk.plot_ef(20, er, cov, show_cml=True, riskfree_rate=0.1, show_ew=True)"
237 ]
238 },
239 {
240 "cell_type": "markdown",
241 "metadata": {},
242 "source": [
243 "Researchers have shown that the EW portfolio is a remarkably good portfolio to hold. In fact, there is overwhelming siupport for the idea that it is a far better portfolio to hold than a cap-weighted equivalent. We'll examine this in later sections, but as you can see, the EW portfolio is far inside the efficient frontier, but it requires no estimation whatsoever.\n",
244 "\n",
245 "However, there is another point on the efficient frontier that is very interesting. This is the _nose_ of the hull, which is the portfolio of lowest volatility across all possible portfolios. This is called the Minimum Volatility or the Global Minimum Volatility or GMV portfolio.\n",
246 "\n",
247 "But how do we find the weights of the GMV portfolio?\n",
248 "\n",
249 "The interesting thing about it is that if you assume that all returns are the same, the optimizer cannot improve the sharpe ratio through raising returns, and so it must do so my lowering volatility. This means that if we just skip any returns estimation and assume all returns have the return, we'd get the weights of the GMV portfolio!\n",
250 "\n",
251 "```python\n",
252 "def gmv(cov):\n",
253 " \"\"\"\n",
254 " Returns the weights of the Global Minimum Volatility portfolio\n",
255 " given a covariance matrix\n",
256 " \"\"\"\n",
257 " n = cov.shape[0]\n",
258 " return msr(0, np.repeat(1, n), cov)\n",
259 "```\n",
260 "\n",
261 "and we can add that to the plot as follows:\n",
262 "\n",
263 "```python\n",
264 " if show_gmv:\n",
265 " w_gmv = gmv(cov)\n",
266 " r_gmv = portfolio_return(w_gmv, er)\n",
267 " vol_gmv = portfolio_vol(w_gmv, cov)\n",
268 " # add EW\n",
269 " ax.plot([vol_gmv], [r_gmv], color='midnightblue', marker='o', markersize=10)\n",
270 "```\n"
271 ]
272 },
273 {
274 "cell_type": "code",
275 "execution_count": 16,
276 "metadata": {},
277 "outputs": [
278 {
279 "data": {
280 "text/plain": [
281 "<matplotlib.axes._subplots.AxesSubplot at 0x1a1769cbe0>"
282 ]
283 },
284 "execution_count": 16,
285 "metadata": {},
286 "output_type": "execute_result"
287 },
288 {
289 "data": {
290 "image/png": "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\n",
291 "text/plain": [
292 "<Figure size 432x288 with 1 Axes>"
293 ]
294 },
295 "metadata": {
296 "needs_background": "light"
297 },
298 "output_type": "display_data"
299 }
300 ],
301 "source": [
302 "erk.plot_ef(20, er, cov, show_cml=True, riskfree_rate=0.1, show_ew=True, show_gmv=True)"
303 ]
304 },
305 {
306 "cell_type": "code",
307 "execution_count": null,
308 "metadata": {},
309 "outputs": [],
310 "source": []
311 }
312 ],
313 "metadata": {
314 "kernelspec": {
315 "display_name": "Python 3",
316 "language": "python",
317 "name": "python3"
318 },
319 "language_info": {
320 "codemirror_mode": {
321 "name": "ipython",
322 "version": 3
323 },
324 "file_extension": ".py",
325 "mimetype": "text/x-python",
326 "name": "python",
327 "nbconvert_exporter": "python",
328 "pygments_lexer": "ipython3",
329 "version": "3.8.8"
330 }
331 },
332 "nbformat": 4,
333 "nbformat_minor": 2
334 }