ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
lab_128.ipynb
(87365B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Naive Risk Budgeting Strategies between PSP and GHP\n",
8 "\n",
9 "We've already seen how we can compute the returns of a portfolio that mixes a PSP with a GHP. In this session we'll build some tools to put a more methodical structure around that process."
10 ]
11 },
12 {
13 "cell_type": "code",
14 "execution_count": 1,
15 "metadata": {},
16 "outputs": [],
17 "source": [
18 "import numpy as np\n",
19 "import pandas as pd\n",
20 "import edhec_risk_kit_128 as erk\n",
21 "%matplotlib inline\n",
22 "%load_ext autoreload\n",
23 "%autoreload 2"
24 ]
25 },
26 {
27 "cell_type": "markdown",
28 "metadata": {},
29 "source": [
30 "```python\n",
31 "def bt_mix(r1, r2, allocator, **kwargs):\n",
32 " \"\"\"\n",
33 " Runs a back test (simulation) of allocating between a two sets of returns\n",
34 " r1 and r2 are T x N DataFrames or returns where T is the time step index and N is the number of scenarios.\n",
35 " allocator is a function that takes two sets of returns and allocator specific parameters, and produces\n",
36 " an allocation to the first portfolio (the rest of the money is invested in the GHP) as a T x 1 DataFrame\n",
37 " Returns a T x N DataFrame of the resulting N portfolio scenarios\n",
38 " \"\"\"\n",
39 " if not r1.shape == r2.shape:\n",
40 " raise ValueError(\"r1 and r2 should have the same shape\")\n",
41 " weights = allocator(r1, r2, **kwargs)\n",
42 " if not weights.shape == r1.shape:\n",
43 " raise ValueError(\"Allocator returned weights with a different shape than the returns\")\n",
44 " r_mix = weights*r1 + (1-weights)*r2\n",
45 " return r_mix\n",
46 "```"
47 ]
48 },
49 {
50 "cell_type": "markdown",
51 "metadata": {},
52 "source": [
53 "## The Simplest Allocator - Fixed Mix\n",
54 "\n",
55 "The allocator's job is to come up with a time series of weights, so let's create the simplest possible allocator - one that puts a fixed fraction in the first portfolio and the remaining in the second\n"
56 ]
57 },
58 {
59 "cell_type": "markdown",
60 "metadata": {},
61 "source": [
62 "```python\n",
63 "def fixedmix_allocator(r1, r2, w1, **kwargs):\n",
64 " \"\"\"\n",
65 " Produces a time series over T steps of allocations between the PSP and GHP across N scenarios\n",
66 " PSP and GHP are T x N DataFrames that represent the returns of the PSP and GHP such that:\n",
67 " each column is a scenario\n",
68 " each row is the price for a timestep\n",
69 " Returns an T x N DataFrame of PSP Weights\n",
70 " \"\"\"\n",
71 " return pd.DataFrame(data = w1, index=r1.index, columns=r1.columns)\n",
72 "```"
73 ]
74 },
75 {
76 "cell_type": "markdown",
77 "metadata": {},
78 "source": [
79 "We are now ready to rerun the experiment we ran last time ... a bond portfolio of 60% in the 10 year bond and 40% in the 30 year bond to generate a fixed mix bond portfolio."
80 ]
81 },
82 {
83 "cell_type": "code",
84 "execution_count": 3,
85 "metadata": {},
86 "outputs": [
87 {
88 "data": {
89 "text/html": [
90 "<div>\n",
91 "<style scoped>\n",
92 " .dataframe tbody tr th:only-of-type {\n",
93 " vertical-align: middle;\n",
94 " }\n",
95 "\n",
96 " .dataframe tbody tr th {\n",
97 " vertical-align: top;\n",
98 " }\n",
99 "\n",
100 " .dataframe thead th {\n",
101 " text-align: right;\n",
102 " }\n",
103 "</style>\n",
104 "<table border=\"1\" class=\"dataframe\">\n",
105 " <thead>\n",
106 " <tr style=\"text-align: right;\">\n",
107 " <th></th>\n",
108 " <th>Annualized Return</th>\n",
109 " <th>Annualized Vol</th>\n",
110 " <th>Skewness</th>\n",
111 " <th>Kurtosis</th>\n",
112 " <th>Cornish-Fisher VaR (5%)</th>\n",
113 " <th>Historic CVaR (5%)</th>\n",
114 " <th>Sharpe Ratio</th>\n",
115 " <th>Max Drawdown</th>\n",
116 " </tr>\n",
117 " </thead>\n",
118 " <tbody>\n",
119 " <tr>\n",
120 " <th>0</th>\n",
121 " <td>0.035854</td>\n",
122 " <td>0.003663</td>\n",
123 " <td>0.156305</td>\n",
124 " <td>3.772562</td>\n",
125 " <td>-0.001272</td>\n",
126 " <td>-0.000569</td>\n",
127 " <td>1.555316</td>\n",
128 " <td>0.0</td>\n",
129 " </tr>\n",
130 " </tbody>\n",
131 "</table>\n",
132 "</div>"
133 ],
134 "text/plain": [
135 " Annualized Return Annualized Vol Skewness Kurtosis \\\n",
136 "0 0.035854 0.003663 0.156305 3.772562 \n",
137 "\n",
138 " Cornish-Fisher VaR (5%) Historic CVaR (5%) Sharpe Ratio Max Drawdown \n",
139 "0 -0.001272 -0.000569 1.555316 0.0 "
140 ]
141 },
142 "execution_count": 3,
143 "metadata": {},
144 "output_type": "execute_result"
145 }
146 ],
147 "source": [
148 "rates, zc_prices = erk.cir(10, 500, b=0.03, r_0 = 0.03)\n",
149 "price_10 = erk.bond_price(10, 100, .05, 12, rates)\n",
150 "price_30 = erk.bond_price(30, 100, .05, 12, rates)\n",
151 "rets_30 = erk.bond_total_return(price_30, 100, .05, 12)\n",
152 "rets_10 = erk.bond_total_return(price_10, 100, .05, 12)\n",
153 "rets_bonds = erk.bt_mix(rets_10, rets_30, allocator=erk.fixedmix_allocator, w1=.6)\n",
154 "mean_rets_bonds = rets_bonds.mean(axis='columns')\n",
155 "erk.summary_stats(pd.DataFrame(mean_rets_bonds))"
156 ]
157 },
158 {
159 "cell_type": "markdown",
160 "metadata": {},
161 "source": [
162 "Next, we'll use this to create a 70-30 Stock Bond Mix. First, we'll generate stock returns:"
163 ]
164 },
165 {
166 "cell_type": "code",
167 "execution_count": 4,
168 "metadata": {},
169 "outputs": [],
170 "source": [
171 "price_eq = erk.gbm(n_years=10,n_scenarios=500,mu=0.07, sigma=0.15)\n",
172 "rets_eq = price_eq.pct_change().dropna()\n",
173 "rets_zc = zc_prices.pct_change().dropna()"
174 ]
175 },
176 {
177 "cell_type": "markdown",
178 "metadata": {},
179 "source": [
180 "And next, we'll use the mix backtester to build a 70-30 Stock-Bond mix. One way to assess the performance is, as before, to generate a composite and produce summary stats on the composite. We'll also examine a second approach, which is to compute summary stats on each scenario and average the summary stats."
181 ]
182 },
183 {
184 "cell_type": "code",
185 "execution_count": 6,
186 "metadata": {},
187 "outputs": [
188 {
189 "data": {
190 "text/html": [
191 "<div>\n",
192 "<style scoped>\n",
193 " .dataframe tbody tr th:only-of-type {\n",
194 " vertical-align: middle;\n",
195 " }\n",
196 "\n",
197 " .dataframe tbody tr th {\n",
198 " vertical-align: top;\n",
199 " }\n",
200 "\n",
201 " .dataframe thead th {\n",
202 " text-align: right;\n",
203 " }\n",
204 "</style>\n",
205 "<table border=\"1\" class=\"dataframe\">\n",
206 " <thead>\n",
207 " <tr style=\"text-align: right;\">\n",
208 " <th></th>\n",
209 " <th>Annualized Return</th>\n",
210 " <th>Annualized Vol</th>\n",
211 " <th>Skewness</th>\n",
212 " <th>Kurtosis</th>\n",
213 " <th>Cornish-Fisher VaR (5%)</th>\n",
214 " <th>Historic CVaR (5%)</th>\n",
215 " <th>Sharpe Ratio</th>\n",
216 " <th>Max Drawdown</th>\n",
217 " </tr>\n",
218 " </thead>\n",
219 " <tbody>\n",
220 " <tr>\n",
221 " <th>0</th>\n",
222 " <td>0.056436</td>\n",
223 " <td>0.003949</td>\n",
224 " <td>0.060645</td>\n",
225 " <td>4.004417</td>\n",
226 " <td>-0.002762</td>\n",
227 " <td>-0.001989</td>\n",
228 " <td>6.51537</td>\n",
229 " <td>0.0</td>\n",
230 " </tr>\n",
231 " </tbody>\n",
232 "</table>\n",
233 "</div>"
234 ],
235 "text/plain": [
236 " Annualized Return Annualized Vol Skewness Kurtosis \\\n",
237 "0 0.056436 0.003949 0.060645 4.004417 \n",
238 "\n",
239 " Cornish-Fisher VaR (5%) Historic CVaR (5%) Sharpe Ratio Max Drawdown \n",
240 "0 -0.002762 -0.001989 6.51537 0.0 "
241 ]
242 },
243 "execution_count": 6,
244 "metadata": {},
245 "output_type": "execute_result"
246 }
247 ],
248 "source": [
249 "rets_7030b = erk.bt_mix(rets_eq, rets_bonds, allocator=erk.fixedmix_allocator, w1=0.7)\n",
250 "rets_7030b_mean = rets_7030b.mean(axis='columns')\n",
251 "erk.summary_stats(pd.DataFrame(rets_7030b_mean))"
252 ]
253 },
254 {
255 "cell_type": "code",
256 "execution_count": 7,
257 "metadata": {},
258 "outputs": [
259 {
260 "data": {
261 "text/plain": [
262 "Annualized Return 0.050920\n",
263 "Annualized Vol 0.107614\n",
264 "Skewness -0.006626\n",
265 "Kurtosis 2.973340\n",
266 "Cornish-Fisher VaR (5%) 0.046342\n",
267 "Historic CVaR (5%) 0.058854\n",
268 "Sharpe Ratio 0.188383\n",
269 "Max Drawdown -0.213090\n",
270 "dtype: float64"
271 ]
272 },
273 "execution_count": 7,
274 "metadata": {},
275 "output_type": "execute_result"
276 }
277 ],
278 "source": [
279 "# Approach 2: compute stats on each scenario and then average\n",
280 "summaries = erk.summary_stats(rets_7030b)\n",
281 "summaries.mean()"
282 ]
283 },
284 {
285 "cell_type": "markdown",
286 "metadata": {},
287 "source": [
288 "However, both of these summaries are imperfect, since they aggregate across a wide distribution. In different situations one or the other might make sense, but for most individuals, the range of outcomes are what matters because we observe only one of the different possible scenarios.\n",
289 "\n",
290 "Therefore, it make sense to example the range of possible outcomes and look at not just the average but also the less likely but possible outcomes.\n",
291 "\n",
292 "## Distribution of Terminal Values and Measuring Risk Budget Efficiency\n",
293 "\n",
294 "The basic idea is to measure the distribution of terminal values across all scenarios."
295 ]
296 },
297 {
298 "cell_type": "markdown",
299 "metadata": {},
300 "source": [
301 "```python\n",
302 "def terminal_values(rets):\n",
303 " \"\"\"\n",
304 " Computes the terminal values from a set of returns supplied as a T x N DataFrame\n",
305 " Return a Series of length N indexed by the columns of rets\n",
306 " \"\"\"\n",
307 " return (rets+1).prod()\n",
308 "\n",
309 "def terminal_stats(rets, floor = 0.8, cap=np.inf, name=\"Stats\"):\n",
310 " \"\"\"\n",
311 " Produce Summary Statistics on the terminal values per invested dollar\n",
312 " across a range of N scenarios\n",
313 " rets is a T x N DataFrame of returns, where T is the time-step (we assume rets is sorted by time)\n",
314 " Returns a 1 column DataFrame of Summary Stats indexed by the stat name \n",
315 " \"\"\"\n",
316 " terminal_wealth = (rets+1).prod()\n",
317 " breach = terminal_wealth < floor\n",
318 " reach = terminal_wealth >= cap\n",
319 " p_breach = breach.mean() if breach.sum() > 0 else np.nan\n",
320 " p_reach = breach.mean() if reach.sum() > 0 else np.nan\n",
321 " e_short = (floor-terminal_wealth[breach]).mean() if breach.sum() > 0 else np.nan\n",
322 " e_surplus = (cap-terminal_wealth[reach]).mean() if reach.sum() > 0 else np.nan\n",
323 " sum_stats = pd.DataFrame.from_dict({\n",
324 " \"mean\": terminal_wealth.mean(),\n",
325 " \"std\" : terminal_wealth.std(),\n",
326 " \"p_breach\": p_breach,\n",
327 " \"e_short\":e_short,\n",
328 " \"p_reach\": p_reach,\n",
329 " \"e_surplus\": e_surplus\n",
330 " }, orient=\"index\", columns=[name])\n",
331 " return sum_stats\n",
332 "\n",
333 "```"
334 ]
335 },
336 {
337 "cell_type": "code",
338 "execution_count": 8,
339 "metadata": {},
340 "outputs": [
341 {
342 "data": {
343 "text/html": [
344 "<div>\n",
345 "<style scoped>\n",
346 " .dataframe tbody tr th:only-of-type {\n",
347 " vertical-align: middle;\n",
348 " }\n",
349 "\n",
350 " .dataframe tbody tr th {\n",
351 " vertical-align: top;\n",
352 " }\n",
353 "\n",
354 " .dataframe thead th {\n",
355 " text-align: right;\n",
356 " }\n",
357 "</style>\n",
358 "<table border=\"1\" class=\"dataframe\">\n",
359 " <thead>\n",
360 " <tr style=\"text-align: right;\">\n",
361 " <th></th>\n",
362 " <th>FI</th>\n",
363 " <th>Eq</th>\n",
364 " <th>70/30</th>\n",
365 " </tr>\n",
366 " </thead>\n",
367 " <tbody>\n",
368 " <tr>\n",
369 " <th>mean</th>\n",
370 " <td>1.383025</td>\n",
371 " <td>1.873734</td>\n",
372 " <td>1.722892</td>\n",
373 " </tr>\n",
374 " <tr>\n",
375 " <th>std</th>\n",
376 " <td>0.107982</td>\n",
377 " <td>0.898662</td>\n",
378 " <td>0.571827</td>\n",
379 " </tr>\n",
380 " <tr>\n",
381 " <th>p_breach</th>\n",
382 " <td>NaN</td>\n",
383 " <td>0.052000</td>\n",
384 " <td>0.006000</td>\n",
385 " </tr>\n",
386 " <tr>\n",
387 " <th>e_short</th>\n",
388 " <td>NaN</td>\n",
389 " <td>0.110863</td>\n",
390 " <td>0.089708</td>\n",
391 " </tr>\n",
392 " <tr>\n",
393 " <th>p_reach</th>\n",
394 " <td>NaN</td>\n",
395 " <td>NaN</td>\n",
396 " <td>NaN</td>\n",
397 " </tr>\n",
398 " <tr>\n",
399 " <th>e_surplus</th>\n",
400 " <td>NaN</td>\n",
401 " <td>NaN</td>\n",
402 " <td>NaN</td>\n",
403 " </tr>\n",
404 " </tbody>\n",
405 "</table>\n",
406 "</div>"
407 ],
408 "text/plain": [
409 " FI Eq 70/30\n",
410 "mean 1.383025 1.873734 1.722892\n",
411 "std 0.107982 0.898662 0.571827\n",
412 "p_breach NaN 0.052000 0.006000\n",
413 "e_short NaN 0.110863 0.089708\n",
414 "p_reach NaN NaN NaN\n",
415 "e_surplus NaN NaN NaN"
416 ]
417 },
418 "execution_count": 8,
419 "metadata": {},
420 "output_type": "execute_result"
421 }
422 ],
423 "source": [
424 "pd.concat([erk.terminal_stats(rets_bonds, name=\"FI\"), \n",
425 " erk.terminal_stats(rets_eq, name=\"Eq\"),\n",
426 " erk.terminal_stats(rets_7030b, name=\"70/30\")],\n",
427 " axis=1)"
428 ]
429 },
430 {
431 "cell_type": "code",
432 "execution_count": 9,
433 "metadata": {},
434 "outputs": [
435 {
436 "name": "stderr",
437 "output_type": "stream",
438 "text": [
439 "/home/vijay/anaconda3/lib/python3.7/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n",
440 " return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval\n"
441 ]
442 },
443 {
444 "data": {
445 "image/png": "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2/abm4hIMNmxYwfnnntue0/DZ2vXruXFF1/kmWeeadPrzp07t8Gb6QKpvb6rLxr6vTHGbLTWZjT12WatYywSDLZtg6FDT1+vODpaFWMREWncxIkTmThxYntPo0249bsqGIvUs307XHHF6a936qRgLCIiZ5/nnnuuvafgGuoxFqkjPx8OH4Zh9Tc9RxVjERERt1MwFqmj5sa7oUNPf0/BWESk7bXXvVDSMbX290XBWKSObducoyrGIiLtLzIykvz8fIVj8Ym1lvz8/FbthqceY5E6tm2Dzp1PXaqtRnQ01NkFU0REAiwpKYnMzExyc3PbeyrSQURGRrZqNzwFY5E6tm932iga2nAnMhKOH4eqqtNXrBAREf/zeDz079+/vachQUT/eRepoyYYN6Rm18rjx9tuPiIiItJ2FIxFquXmOqtSNLaWfE3LUgO7aIqIiIgLKBiLVNuxwzl+9x0sXnz6+wrGIiIi7qZgLFKtJhgnJjb8fk0rRXFx28xHRERE2paCsUi1HTsgPBy6dm34fVWMRURE3E3BWKTa119Dz56NrzhRUzFWMBYREXEnBWORajt2NN5GAScrxmqlEBERcScFYxGgogIOHICEhMbPUcVYRETE3RSMRYCDB8Fa6Nat8XPUYywiIuJuCsYiwP79zvFMwVirUoiIiLibgrEIvgXjkBCIjlbFWERExK0UjCXoLV4Mr77q/HymYAwQFgaffdbwBiAiIiLSsSkYiwAFBRAT46xjfCYREXDiRNvMSURERNqWgrEIcORI09VicG7AKysL/HxERESk7SkYi+B7MI6IUDAWERFxKwVjEZxg3NhW0HVFRqqVQkRExK0UjCXolZc7VeAuXZo+VxVjERER91IwlqBXs/xabGzT56piLCIi4l4KxhL0aoJxTEzT56piLCIi4l4KxhL0WlIxtjawcxIREZG2p2AsQa9mi2dfgnF4uBOKvd7AzklERETaXpPB2BgTaYz5zBizxRiz3RizsIFzIowxS40xu40x640xKYGYrEggFBU5R1+DMTg37ImIiIi7+FIxPgFcbK0dCaQDVxhjxtc75xagwFo7EPgt8LB/pykSOMXFzlbPERFNn+vxOEcFYxEREfdpMhhbR/U/NuOpftTvsLwaWFL986vAJcYY47dZigTQsWNOtdiX31hVjEVERNzLpx5jY0yoMWYzkAO8a61dX++U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\n",
446 "text/plain": [
447 "<Figure size 864x432 with 1 Axes>"
448 ]
449 },
450 "metadata": {
451 "needs_background": "light"
452 },
453 "output_type": "display_data"
454 }
455 ],
456 "source": [
457 "import seaborn as sns\n",
458 "import matplotlib.pyplot as plt\n",
459 "plt.figure(figsize=(12, 6))\n",
460 "sns.distplot(erk.terminal_values(rets_eq), color=\"red\", label=\"100% Equities\")\n",
461 "sns.distplot(erk.terminal_values(rets_bonds), color=\"blue\", label=\"100% Bonds\")\n",
462 "sns.distplot(erk.terminal_values(rets_7030b), color=\"orange\", label=\"70/30 Equities/Bonds\")\n",
463 "plt.legend();"
464 ]
465 },
466 {
467 "cell_type": "markdown",
468 "metadata": {},
469 "source": [
470 "Note how the higher mean return of the equities portfolio is due in part to the large upside spread in equities.\n",
471 "\n",
472 "## Risk Budgeting through Glide Path Allocation\n",
473 "\n",
474 "A potential improvement over naive fixed mix is to risk budget by making a simplistic assumption that risk = time.\n",
475 "\n",
476 "In other words, if you have more time, increase the risk budget. If you have less time, derisk. This is the thinking behind a Target Date Fund.\n",
477 "\n",
478 "Let's write an allocator that defines the weights as a glidepath sthat starts at a starting weight and then gradually decreases the weights to equities over time to an ending weight. For example, you can start at 80% stocks at the start of the 10 year period and then gradually move to 20% stocks by the end of the 10 year period.\n",
479 "\n",
480 "Let's see how this does:\n",
481 "\n",
482 "```python\n",
483 "def glidepath_allocator(r1, r2, start_glide=1, end_glide=0.0):\n",
484 " \"\"\"\n",
485 " Allocates weights to r1 starting at start_glide and ends at end_glide\n",
486 " by gradually moving from start_glide to end_glide over time\n",
487 " \"\"\"\n",
488 " n_points = r1.shape[0]\n",
489 " n_col = r1.shape[1]\n",
490 " path = pd.Series(data=np.linspace(start_glide, end_glide, num=n_points))\n",
491 " paths = pd.concat([path]*n_col, axis=1)\n",
492 " paths.index = r1.index\n",
493 " paths.columns = r1.columns\n",
494 " return paths\n",
495 "```\n"
496 ]
497 },
498 {
499 "cell_type": "code",
500 "execution_count": 11,
501 "metadata": {},
502 "outputs": [
503 {
504 "data": {
505 "text/html": [
506 "<div>\n",
507 "<style scoped>\n",
508 " .dataframe tbody tr th:only-of-type {\n",
509 " vertical-align: middle;\n",
510 " }\n",
511 "\n",
512 " .dataframe tbody tr th {\n",
513 " vertical-align: top;\n",
514 " }\n",
515 "\n",
516 " .dataframe thead th {\n",
517 " text-align: right;\n",
518 " }\n",
519 "</style>\n",
520 "<table border=\"1\" class=\"dataframe\">\n",
521 " <thead>\n",
522 " <tr style=\"text-align: right;\">\n",
523 " <th></th>\n",
524 " <th>FI</th>\n",
525 " <th>Eq</th>\n",
526 " <th>70/30</th>\n",
527 " <th>Glide 80 to 20</th>\n",
528 " </tr>\n",
529 " </thead>\n",
530 " <tbody>\n",
531 " <tr>\n",
532 " <th>mean</th>\n",
533 " <td>1.383025</td>\n",
534 " <td>1.873734</td>\n",
535 " <td>1.722892</td>\n",
536 " <td>1.633690</td>\n",
537 " </tr>\n",
538 " <tr>\n",
539 " <th>std</th>\n",
540 " <td>0.107982</td>\n",
541 " <td>0.898662</td>\n",
542 " <td>0.571827</td>\n",
543 " <td>0.427764</td>\n",
544 " </tr>\n",
545 " <tr>\n",
546 " <th>p_breach</th>\n",
547 " <td>NaN</td>\n",
548 " <td>0.052000</td>\n",
549 " <td>0.006000</td>\n",
550 " <td>0.002000</td>\n",
551 " </tr>\n",
552 " <tr>\n",
553 " <th>e_short</th>\n",
554 " <td>NaN</td>\n",
555 " <td>0.110863</td>\n",
556 " <td>0.089708</td>\n",
557 " <td>0.035501</td>\n",
558 " </tr>\n",
559 " <tr>\n",
560 " <th>p_reach</th>\n",
561 " <td>NaN</td>\n",
562 " <td>NaN</td>\n",
563 " <td>NaN</td>\n",
564 " <td>NaN</td>\n",
565 " </tr>\n",
566 " <tr>\n",
567 " <th>e_surplus</th>\n",
568 " <td>NaN</td>\n",
569 " <td>NaN</td>\n",
570 " <td>NaN</td>\n",
571 " <td>NaN</td>\n",
572 " </tr>\n",
573 " </tbody>\n",
574 "</table>\n",
575 "</div>"
576 ],
577 "text/plain": [
578 " FI Eq 70/30 Glide 80 to 20\n",
579 "mean 1.383025 1.873734 1.722892 1.633690\n",
580 "std 0.107982 0.898662 0.571827 0.427764\n",
581 "p_breach NaN 0.052000 0.006000 0.002000\n",
582 "e_short NaN 0.110863 0.089708 0.035501\n",
583 "p_reach NaN NaN NaN NaN\n",
584 "e_surplus NaN NaN NaN NaN"
585 ]
586 },
587 "execution_count": 11,
588 "metadata": {},
589 "output_type": "execute_result"
590 }
591 ],
592 "source": [
593 "\n",
594 "rets_g8020 = erk.bt_mix(rets_eq, rets_bonds, allocator=erk.glidepath_allocator, start_glide=.8, end_glide=.2)\n",
595 "pd.concat([erk.terminal_stats(rets_bonds, name=\"FI\"), \n",
596 " erk.terminal_stats(rets_eq, name=\"Eq\"),\n",
597 " erk.terminal_stats(rets_7030b, name=\"70/30\"),\n",
598 " erk.terminal_stats(rets_g8020, name=\"Glide 80 to 20\")],\n",
599 " axis=1)"
600 ]
601 },
602 {
603 "cell_type": "code",
604 "execution_count": 12,
605 "metadata": {},
606 "outputs": [
607 {
608 "data": {
609 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAFpCAYAAACfyu4TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xl4VvWd///n516yr5CFkEDYIUHWIKAyglhU0EKZtgLqFFtHf+24fGvn2xGvttqf7bTYdqYdp/prHW21depSbYVWUUSoS8UqkSBbAoEECAkh+77cy+f3xw1pgAABAifL63FduS7uc5/73K+T0quvfnifc4y1FhERERGRgc7ldAARERERkd5AxVhEREREBBVjERERERFAxVhEREREBFAxFhEREREBVIxFRERERAAVYxERERERQMVYRERERARQMRYRERERAVSMRUREREQA8Dj1xUlJSXbEiBFOfb2IiIiIDBC5ubmV1trks+3nWDEeMWIEW7ZscerrRURERGSAMMYc6M5+GqUQEREREUHFWEREREQEUDEWEREREQEcnDEWEREROROfz0dJSQmtra1OR5E+IiIigoyMDLxe73l9XsVYREREeqWSkhJiY2MZMWIExhin40gvZ62lqqqKkpISRo4ceV7H0CiFiIiI9Eqtra0MHjxYpVi6xRjD4MGDL+hfGLpVjI0xNxhjCowxhcaYVV28P9wYs8kYs9UY86kxZtF5JxIRERE5RqVYzsWF/n05azE2xriBx4GFQDawwhiTfdJu3wZestZOA5YDT1xQKhERERGHFRQUMHXq1I6fuLg4fvaznwFQXV3NggULGDt2LAsWLKCmpqbjcz6fj5ycHFpbW5k5cyZTpkxh4sSJPPzwwx37FBUVMWvWLMaOHcuyZctob28/5fufeeYZkpOTT8iwa9eu8zqXtWvXsnr1agBeffXVE47z0EMPsWHDhvM67vFzBXC73UydOpUpU6Ywffp0Pvjgg/M65sn+8pe/cNNNN/XIsc6mOzPGM4FCa+1+AGPMC8ASoPN/MhaIO/bneKC0J0OKiIiIUPhkzx5vzF1nfHv8+PHk5eUBEAgESE9PZ+nSpQCsXr2aa6+9llWrVrF69WpWr17No48+CsD777/PlVdeSXh4OBs3biQmJgafz8ecOXNYuHAhs2fP5oEHHuD+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8WLeffddhg8fTkFBAb/+9a954oknKC0t5YEHHiA3N5fExESuu+46Xn31VYYNG8bhw4c7Hgvd+ft7mlaMRURERM6gvb2dtWvX8sUvfvGs+5aWljJo0CCiokIPVHK73eTl5VFSUsJHH33Ejh07sNae8jljTJfHW7ZsGXl5eR0/kZGRvPvuu6xYsQK3283QoUOZP3/+hZ3gMQUFBezYsYMFCxYwdepUvv/971NSUgLA5MmTufXWW3nuuec6Cv3J5wrwne98h4kTJ56wqrx+/XrWr1/PtGnTmD59Ovn5+ezduxeAzMxMZs+eDcDHH3/MvHnzSE5OxuPxcOutt/Luu+8yatQo9u/fz7333ssbb7xBXFxcj5xvV1SMRURERM5g3bp1TJ8+ndTU1I5tqampHWMGZWVlpKSkdOzb1VxtQkIC8+bN44033iApKYna2lr8fj8AJSUlDB069Jwyna5IezwegsEgAK2tred0TGstEydO7Cjh27dvZ/369QC89tpr3H333eTm5pKTk4Pf7z/lXP/yl7/wyiuvnDITba3lwQcf7DhuYWEhd9xxBwDR0dEn7NeVxMREtm3bxrx583j88cf553/+53M6r3OhYiwiIiJyBs8///wJYxQQupjt2WefBeDZZ59lyZIlwIkztxUVFR3/7N/S0sKGDRuYMGECxhiuueaajrnezp/vjquvvpoXXniBQCBAWVkZmzZt6nhvxIgRHRcpvvLKK11+PjY2loaGhlO2jx8/noqKCjZv3gyExiJ27txJMBjk0KFDXHPNNfzoRz+itraWxsbGE861pqaGL3/5y/zmN78hNjb2hONef/31/OpXv6KxsRGAw4cPnzB6ctysWbN45513qKysJBAI8PzzzzN37lwqKysJBoN8/vOf53vf+x6ffPJJt39X50ozxiIX4uh7TicQEZGLqLm5mbfeeotf/vKXJ2xftWoVN998M08//TTDhw/n97//PYFAgL179zJhwgQgtJK8cuVKAoEAwWCQm2++mZtuugmARx99lOXLl/Ptb3+badOmdaygnuzkGeMnnniCpUuXsnHjRiZNmsS4ceOYO3dux/sPP/wwd9xxBz/4wQ+YNWtWl8dcvnw5d955J4899lhHOQcICwvj5Zdf5r777qOurg6/38/Xv/51xo0bx2233UZdXR3WWu6//35iY2NPONdf/OIXHD169JQ7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\n",
610 "text/plain": [
611 "<Figure size 864x432 with 1 Axes>"
612 ]
613 },
614 "metadata": {
615 "needs_background": "light"
616 },
617 "output_type": "display_data"
618 }
619 ],
620 "source": [
621 "rets_7030z = erk.bt_mix(rets_eq, rets_zc, allocator=erk.fixedmix_allocator, w1=0.7)\n",
622 "plt.figure(figsize=(12, 6))\n",
623 "#sns.distplot(terminal_values(rets_eq), color=\"red\", label=\"100% Equities\")\n",
624 "#sns.distplot(terminal_values(rets_bonds), color=\"blue\", label=\"100% Bonds\")\n",
625 "sns.distplot(erk.terminal_values(rets_7030b), color=\"orange\", label=\"70/30 Equities/Bonds\")\n",
626 "#sns.distplot(terminal_values(rets_g8020), color=\"green\", label=\"Glide 80 to 20\")\n",
627 "sns.distplot(erk.terminal_values(rets_7030z), color=\"grey\", label=\"70/30 Equities/Zeros\")\n",
628 "plt.legend();"
629 ]
630 },
631 {
632 "cell_type": "markdown",
633 "metadata": {},
634 "source": [
635 "### Conclusion\n",
636 "\n",
637 "Static or Naive risk budgeting involves allocating between the PSP and GHP using either a simple fixed mix or a blind glidepath. These can reduce the downside risk but come at the cost the expected return, and cannot be used to secure a minimum acceptable level of wealth or liabilities. In the next session, we'll examine dynamic approaches that will address the challenge of meeting a set of future liabilities such as replacement income, or a required level of wealth in the future.\n",
638 "\n",
639 "Before that, add the following code to the risk kit:\n",
640 "\n",
641 "```python\n",
642 "def bt_mix(r1, r2, allocator, **kwargs):\n",
643 " \"\"\"\n",
644 " Runs a back test (simulation) of allocating between a two sets of returns\n",
645 " r1 and r2 are T x N DataFrames or returns where T is the time step index and N is the number of scenarios.\n",
646 " allocator is a function that takes two sets of returns and allocator specific parameters, and produces\n",
647 " an allocation to the first portfolio (the rest of the money is invested in the GHP) as a T x 1 DataFrame\n",
648 " Returns a T x N DataFrame of the resulting N portfolio scenarios\n",
649 " \"\"\"\n",
650 " if not r1.shape == r2.shape:\n",
651 " raise ValueError(\"r1 and r2 should have the same shape\")\n",
652 " weights = allocator(r1, r2, **kwargs)\n",
653 " if not weights.shape == r1.shape:\n",
654 " raise ValueError(\"Allocator returned weights with a different shape than the returns\")\n",
655 " r_mix = weights*r1 + (1-weights)*r2\n",
656 " return r_mix\n",
657 "\n",
658 "\n",
659 "def fixedmix_allocator(r1, r2, w1, **kwargs):\n",
660 " \"\"\"\n",
661 " Produces a time series over T steps of allocations between the PSP and GHP across N scenarios\n",
662 " PSP and GHP are T x N DataFrames that represent the returns of the PSP and GHP such that:\n",
663 " each column is a scenario\n",
664 " each row is the price for a timestep\n",
665 " Returns an T x N DataFrame of PSP Weights\n",
666 " \"\"\"\n",
667 " return pd.DataFrame(data = w1, index=r1.index, columns=r1.columns)\n",
668 "\n",
669 "def terminal_values(rets):\n",
670 " \"\"\"\n",
671 " Computes the terminal values from a set of returns supplied as a T x N DataFrame\n",
672 " Return a Series of length N indexed by the columns of rets\n",
673 " \"\"\"\n",
674 " return (rets+1).prod()\n",
675 "\n",
676 "def terminal_stats(rets, floor = 0.8, cap=np.inf, name=\"Stats\"):\n",
677 " \"\"\"\n",
678 " Produce Summary Statistics on the terminal values per invested dollar\n",
679 " across a range of N scenarios\n",
680 " rets is a T x N DataFrame of returns, where T is the time-step (we assume rets is sorted by time)\n",
681 " Returns a 1 column DataFrame of Summary Stats indexed by the stat name \n",
682 " \"\"\"\n",
683 " terminal_wealth = (rets+1).prod()\n",
684 " breach = terminal_wealth < floor\n",
685 " reach = terminal_wealth >= cap\n",
686 " p_breach = breach.mean() if breach.sum() > 0 else np.nan\n",
687 " p_reach = breach.mean() if reach.sum() > 0 else np.nan\n",
688 " e_short = (floor-terminal_wealth[breach]).mean() if breach.sum() > 0 else np.nan\n",
689 " e_surplus = (cap-terminal_wealth[reach]).mean() if reach.sum() > 0 else np.nan\n",
690 " sum_stats = pd.DataFrame.from_dict({\n",
691 " \"mean\": terminal_wealth.mean(),\n",
692 " \"std\" : terminal_wealth.std(),\n",
693 " \"p_breach\": p_breach,\n",
694 " \"e_short\":e_short,\n",
695 " \"p_reach\": p_reach,\n",
696 " \"e_surplus\": e_surplus\n",
697 " }, orient=\"index\", columns=[name])\n",
698 " return sum_stats\n",
699 "\n",
700 "def glidepath_allocator(r1, r2, start_glide=1, end_glide=0.0):\n",
701 " \"\"\"\n",
702 " Allocates weights to r1 starting at start_glide and ends at end_glide\n",
703 " by gradually moving from start_glide to end_glide over time\n",
704 " \"\"\"\n",
705 " n_points = r1.shape[0]\n",
706 " n_col = r1.shape[1]\n",
707 " path = pd.Series(data=np.linspace(start_glide, end_glide, num=n_points))\n",
708 " paths = pd.concat([path]*n_col, axis=1)\n",
709 " paths.index = r1.index\n",
710 " paths.columns = r1.columns\n",
711 " return paths\n",
712 "\n",
713 "```\n"
714 ]
715 },
716 {
717 "cell_type": "code",
718 "execution_count": null,
719 "metadata": {},
720 "outputs": [],
721 "source": []
722 }
723 ],
724 "metadata": {
725 "kernelspec": {
726 "display_name": "Python 3",
727 "language": "python",
728 "name": "python3"
729 },
730 "language_info": {
731 "codemirror_mode": {
732 "name": "ipython",
733 "version": 3
734 },
735 "file_extension": ".py",
736 "mimetype": "text/x-python",
737 "name": "python",
738 "nbconvert_exporter": "python",
739 "pygments_lexer": "ipython3",
740 "version": "3.8.8"
741 }
742 },
743 "nbformat": 4,
744 "nbformat_minor": 2
745 }