ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
lab_101.ipynb
(55887B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Lab Session Notebook - Returns\n",
8 "\n",
9 "## From Prices to Returns\n",
10 "\n",
11 "In this lab we'll work the very basics of Returns - computing returns, and compounding a sequence of returns.\n",
12 "\n",
13 "Let's start with a set of prices for a stock \"A\", in a python list:"
14 ]
15 },
16 {
17 "cell_type": "code",
18 "execution_count": 1,
19 "metadata": {},
20 "outputs": [],
21 "source": [
22 "prices_a = [8.70, 8.91, 8.71]"
23 ]
24 },
25 {
26 "cell_type": "markdown",
27 "metadata": {},
28 "source": [
29 "Recall that the return from time $t$ to time ${t+1} is given by:\n",
30 "\n",
31 "$$ R_{t,t+1} = \\frac{P_{t+1}-P_{t}}{P_{t}} $$\n",
32 "\n",
33 "or alternately\n",
34 "\n",
35 "$$ R_{t,t+1} = \\frac{P_{t+1}}{P_{t}} - 1 $$\n",
36 "\n",
37 "If you come from R or another language that supports vectors, you might expect something like this to work:\n",
38 "\n",
39 "```python\n",
40 "#returns_a = prices_a[:-1]/prices_a[1:] - 1\n",
41 "```\n",
42 "\n",
43 "However, since Python lists do not operate as vectors, that will not work, generating an error about \"/\" not working for lists.\n"
44 ]
45 },
46 {
47 "cell_type": "code",
48 "execution_count": 2,
49 "metadata": {},
50 "outputs": [],
51 "source": [
52 "# WILL NOT WORK - THIS WILL GENERATE AN ERROR!\n",
53 "# prices_a[1:]/prices_a[:-1] -1"
54 ]
55 },
56 {
57 "cell_type": "markdown",
58 "metadata": {},
59 "source": [
60 "Instead, we can convert them to a `numpy` array. Numpy arrays _do_ behave like vectors, so this works:"
61 ]
62 },
63 {
64 "cell_type": "code",
65 "execution_count": 3,
66 "metadata": {},
67 "outputs": [
68 {
69 "data": {
70 "text/plain": "array([8.7 , 8.91, 8.71])"
71 },
72 "execution_count": 3,
73 "metadata": {},
74 "output_type": "execute_result"
75 }
76 ],
77 "source": [
78 "import numpy as np\n",
79 "\n",
80 "prices_a = np.array([8.70, 8.91, 8.71])\n",
81 "prices_a"
82 ]
83 },
84 {
85 "cell_type": "code",
86 "execution_count": 4,
87 "metadata": {},
88 "outputs": [
89 {
90 "data": {
91 "text/plain": "array([ 0.02413793, -0.02244669])"
92 },
93 "execution_count": 4,
94 "metadata": {},
95 "output_type": "execute_result"
96 }
97 ],
98 "source": [
99 "prices_a[1:]/prices_a[:-1] - 1"
100 ]
101 },
102 {
103 "cell_type": "markdown",
104 "metadata": {},
105 "source": [
106 "Now, let's add a few more days of prices and introduce a second stock. Let's call these two stocks \"BLUE\" and \"ORANGE\". Instead of using raw numpy arrays, we are going to use the far more powerful Pandas DataFrame, which wraps the functionality of numpy into a very convenient and easy to use data structure called a DataFrame. Note how the DtaFrame has two nicely indexed columns as well as a row index that by default runs from 0 to 4."
107 ]
108 },
109 {
110 "cell_type": "code",
111 "execution_count": 5,
112 "metadata": {},
113 "outputs": [],
114 "source": [
115 "import pandas as pd\n",
116 "\n",
117 "prices = pd.DataFrame({\"BLUE\": [8.70, 8.91, 8.71, 8.43, 8.73],\n",
118 " \"ORANGE\": [10.66, 11.08, 10.71, 11.59, 12.11]})"
119 ]
120 },
121 {
122 "cell_type": "code",
123 "execution_count": 6,
124 "metadata": {},
125 "outputs": [
126 {
127 "data": {
128 "text/plain": " BLUE ORANGE\n0 8.70 10.66\n1 8.91 11.08\n2 8.71 10.71\n3 8.43 11.59\n4 8.73 12.11",
129 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>8.70</td>\n <td>10.66</td>\n </tr>\n <tr>\n <th>1</th>\n <td>8.91</td>\n <td>11.08</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.71</td>\n <td>10.71</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.43</td>\n <td>11.59</td>\n </tr>\n <tr>\n <th>4</th>\n <td>8.73</td>\n <td>12.11</td>\n </tr>\n </tbody>\n</table>\n</div>"
130 },
131 "execution_count": 6,
132 "metadata": {},
133 "output_type": "execute_result"
134 }
135 ],
136 "source": [
137 "prices"
138 ]
139 },
140 {
141 "cell_type": "markdown",
142 "metadata": {},
143 "source": [
144 "**WARNING**\n",
145 "\n",
146 "However, because Pandas DataFrames will align the row index (in this case: 0, 1, 2, 3, 4) the exact same code fragment will not work as you might expect. (see the section on row alignment in the \"Crash Course\" videos if this is unclear to you)"
147 ]
148 },
149 {
150 "cell_type": "code",
151 "execution_count": 7,
152 "metadata": {},
153 "outputs": [
154 {
155 "data": {
156 "text/plain": " BLUE ORANGE\n1 8.91 11.08\n2 8.71 10.71\n3 8.43 11.59\n4 8.73 12.11",
157 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1</th>\n <td>8.91</td>\n <td>11.08</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.71</td>\n <td>10.71</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.43</td>\n <td>11.59</td>\n </tr>\n <tr>\n <th>4</th>\n <td>8.73</td>\n <td>12.11</td>\n </tr>\n </tbody>\n</table>\n</div>"
158 },
159 "execution_count": 7,
160 "metadata": {},
161 "output_type": "execute_result"
162 }
163 ],
164 "source": [
165 "prices.iloc[1:]"
166 ]
167 },
168 {
169 "cell_type": "code",
170 "execution_count": 8,
171 "metadata": {},
172 "outputs": [
173 {
174 "data": {
175 "text/plain": " BLUE ORANGE\n0 8.70 10.66\n1 8.91 11.08\n2 8.71 10.71\n3 8.43 11.59",
176 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>8.70</td>\n <td>10.66</td>\n </tr>\n <tr>\n <th>1</th>\n <td>8.91</td>\n <td>11.08</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.71</td>\n <td>10.71</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.43</td>\n <td>11.59</td>\n </tr>\n </tbody>\n</table>\n</div>"
177 },
178 "execution_count": 8,
179 "metadata": {},
180 "output_type": "execute_result"
181 }
182 ],
183 "source": [
184 "prices.iloc[:-1]"
185 ]
186 },
187 {
188 "cell_type": "code",
189 "execution_count": 9,
190 "metadata": {},
191 "outputs": [
192 {
193 "data": {
194 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 0.0 0.0\n2 0.0 0.0\n3 0.0 0.0\n4 NaN NaN",
195 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n </tbody>\n</table>\n</div>"
196 },
197 "execution_count": 9,
198 "metadata": {},
199 "output_type": "execute_result"
200 }
201 ],
202 "source": [
203 "prices.iloc[1:]/prices.iloc[:-1] - 1"
204 ]
205 },
206 {
207 "cell_type": "markdown",
208 "metadata": {},
209 "source": [
210 "We can fix this in one of several ways. First, we can extract the values of the DataFrame column which returns a numpy array, so that the DataFrame does not try and align the rows."
211 ]
212 },
213 {
214 "cell_type": "code",
215 "execution_count": 10,
216 "metadata": {},
217 "outputs": [
218 {
219 "data": {
220 "text/plain": " BLUE ORANGE\n0 0.024138 0.039400\n1 -0.022447 -0.033394\n2 -0.032147 0.082166\n3 0.035587 0.044866",
221 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0.024138</td>\n <td>0.039400</td>\n </tr>\n <tr>\n <th>1</th>\n <td>-0.022447</td>\n <td>-0.033394</td>\n </tr>\n <tr>\n <th>2</th>\n <td>-0.032147</td>\n <td>0.082166</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0.035587</td>\n <td>0.044866</td>\n </tr>\n </tbody>\n</table>\n</div>"
222 },
223 "execution_count": 10,
224 "metadata": {},
225 "output_type": "execute_result"
226 }
227 ],
228 "source": [
229 "prices.iloc[1:].values/prices.iloc[:-1] - 1"
230 ]
231 },
232 {
233 "cell_type": "markdown",
234 "metadata": {},
235 "source": [
236 "You could have also used the values in the denominator:"
237 ]
238 },
239 {
240 "cell_type": "code",
241 "execution_count": 11,
242 "metadata": {},
243 "outputs": [
244 {
245 "data": {
246 "text/plain": " BLUE ORANGE\n1 0.024138 0.039400\n2 -0.022447 -0.033394\n3 -0.032147 0.082166\n4 0.035587 0.044866",
247 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1</th>\n <td>0.024138</td>\n <td>0.039400</td>\n </tr>\n <tr>\n <th>2</th>\n <td>-0.022447</td>\n <td>-0.033394</td>\n </tr>\n <tr>\n <th>3</th>\n <td>-0.032147</td>\n <td>0.082166</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0.035587</td>\n <td>0.044866</td>\n </tr>\n </tbody>\n</table>\n</div>"
248 },
249 "execution_count": 11,
250 "metadata": {},
251 "output_type": "execute_result"
252 }
253 ],
254 "source": [
255 "prices.iloc[1:]/prices.iloc[:-1].values - 1"
256 ]
257 },
258 {
259 "cell_type": "markdown",
260 "metadata": {},
261 "source": [
262 "However, there are a couple of ways to do this without extracting the values, and these are probably a bit cleaner and more readable. The first option is to use the `.shift()` method on the array, which realigns the indices."
263 ]
264 },
265 {
266 "cell_type": "code",
267 "execution_count": 12,
268 "metadata": {},
269 "outputs": [
270 {
271 "data": {
272 "text/plain": " BLUE ORANGE\n0 8.70 10.66\n1 8.91 11.08\n2 8.71 10.71\n3 8.43 11.59\n4 8.73 12.11",
273 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>8.70</td>\n <td>10.66</td>\n </tr>\n <tr>\n <th>1</th>\n <td>8.91</td>\n <td>11.08</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.71</td>\n <td>10.71</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.43</td>\n <td>11.59</td>\n </tr>\n <tr>\n <th>4</th>\n <td>8.73</td>\n <td>12.11</td>\n </tr>\n </tbody>\n</table>\n</div>"
274 },
275 "execution_count": 12,
276 "metadata": {},
277 "output_type": "execute_result"
278 }
279 ],
280 "source": [
281 "prices"
282 ]
283 },
284 {
285 "cell_type": "markdown",
286 "metadata": {},
287 "source": [
288 "Since we want to get the row at index 0 (8.84 and 10.66) to line up with the row at index 1 (8.54 and 10.30) so we can divide the 2nd row (at index 1) by the first row (at index 0) we want to shift the rows in the denominator by 1 ... which we do with `.shift(1)`"
289 ]
290 },
291 {
292 "cell_type": "code",
293 "execution_count": 13,
294 "metadata": {},
295 "outputs": [
296 {
297 "data": {
298 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 8.70 10.66\n2 8.91 11.08\n3 8.71 10.71\n4 8.43 11.59",
299 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>8.70</td>\n <td>10.66</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.91</td>\n <td>11.08</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.71</td>\n <td>10.71</td>\n </tr>\n <tr>\n <th>4</th>\n <td>8.43</td>\n <td>11.59</td>\n </tr>\n </tbody>\n</table>\n</div>"
300 },
301 "execution_count": 13,
302 "metadata": {},
303 "output_type": "execute_result"
304 }
305 ],
306 "source": [
307 "prices.shift(1)"
308 ]
309 },
310 {
311 "cell_type": "markdown",
312 "metadata": {},
313 "source": [
314 "So, now we can obtain the returns on each day as follows:"
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": 14,
320 "metadata": {},
321 "outputs": [
322 {
323 "data": {
324 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 0.024138 0.039400\n2 -0.022447 -0.033394\n3 -0.032147 0.082166\n4 0.035587 0.044866",
325 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>0.024138</td>\n <td>0.039400</td>\n </tr>\n <tr>\n <th>2</th>\n <td>-0.022447</td>\n <td>-0.033394</td>\n </tr>\n <tr>\n <th>3</th>\n <td>-0.032147</td>\n <td>0.082166</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0.035587</td>\n <td>0.044866</td>\n </tr>\n </tbody>\n</table>\n</div>"
326 },
327 "execution_count": 14,
328 "metadata": {},
329 "output_type": "execute_result"
330 }
331 ],
332 "source": [
333 "returns = prices/prices.shift(1) - 1\n",
334 "returns"
335 ]
336 },
337 {
338 "cell_type": "markdown",
339 "metadata": {},
340 "source": [
341 "Note how we cannot compute returns for the first day, because we dont have the closing price for the previous day. In general, we lose one data point when we go from prices to returns.\n",
342 "\n",
343 "Finally, there is a built-in method in DataFrame that computes the percent change from one row to another. Since that is exactly what a return is (the percent change in price) we can just use this method to compute the return.\n"
344 ]
345 },
346 {
347 "cell_type": "code",
348 "execution_count": 15,
349 "metadata": {},
350 "outputs": [
351 {
352 "data": {
353 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 0.024138 0.039400\n2 -0.022447 -0.033394\n3 -0.032147 0.082166\n4 0.035587 0.044866",
354 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>0.024138</td>\n <td>0.039400</td>\n </tr>\n <tr>\n <th>2</th>\n <td>-0.022447</td>\n <td>-0.033394</td>\n </tr>\n <tr>\n <th>3</th>\n <td>-0.032147</td>\n <td>0.082166</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0.035587</td>\n <td>0.044866</td>\n </tr>\n </tbody>\n</table>\n</div>"
355 },
356 "execution_count": 15,
357 "metadata": {},
358 "output_type": "execute_result"
359 }
360 ],
361 "source": [
362 "returns = prices.pct_change()\n",
363 "returns"
364 ]
365 },
366 {
367 "cell_type": "markdown",
368 "metadata": {},
369 "source": [
370 "## Reading data from a CSV file\n",
371 "Since typing in returns is tedious, let's read the data in from a file. Pandas provides a convenient and simple way to read in a CSV file of the returns."
372 ]
373 },
374 {
375 "cell_type": "code",
376 "execution_count": 16,
377 "metadata": {},
378 "outputs": [
379 {
380 "data": {
381 "text/plain": " BLUE ORANGE\n0 8.7000 10.6600\n1 8.9055 11.0828\n2 8.7113 10.7100\n3 8.4346 11.5907\n4 8.7254 12.1070\n5 9.0551 11.7876\n6 8.9514 11.2078\n7 9.2439 12.5192\n8 9.1276 13.3624\n9 9.3976 14.4080\n10 9.4554 11.9837\n11 9.5704 12.2718\n12 9.7728 11.5892",
382 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>8.7000</td>\n <td>10.6600</td>\n </tr>\n <tr>\n <th>1</th>\n <td>8.9055</td>\n <td>11.0828</td>\n </tr>\n <tr>\n <th>2</th>\n <td>8.7113</td>\n <td>10.7100</td>\n </tr>\n <tr>\n <th>3</th>\n <td>8.4346</td>\n <td>11.5907</td>\n </tr>\n <tr>\n <th>4</th>\n <td>8.7254</td>\n <td>12.1070</td>\n </tr>\n <tr>\n <th>5</th>\n <td>9.0551</td>\n <td>11.7876</td>\n </tr>\n <tr>\n <th>6</th>\n <td>8.9514</td>\n <td>11.2078</td>\n </tr>\n <tr>\n <th>7</th>\n <td>9.2439</td>\n <td>12.5192</td>\n </tr>\n <tr>\n <th>8</th>\n <td>9.1276</td>\n <td>13.3624</td>\n </tr>\n <tr>\n <th>9</th>\n <td>9.3976</td>\n <td>14.4080</td>\n </tr>\n <tr>\n <th>10</th>\n <td>9.4554</td>\n <td>11.9837</td>\n </tr>\n <tr>\n <th>11</th>\n <td>9.5704</td>\n <td>12.2718</td>\n </tr>\n <tr>\n <th>12</th>\n <td>9.7728</td>\n <td>11.5892</td>\n </tr>\n </tbody>\n</table>\n</div>"
383 },
384 "execution_count": 16,
385 "metadata": {},
386 "output_type": "execute_result"
387 }
388 ],
389 "source": [
390 "prices = pd.read_csv('../data/sample_prices.csv')\n",
391 "prices"
392 ]
393 },
394 {
395 "cell_type": "code",
396 "execution_count": 17,
397 "metadata": {},
398 "outputs": [
399 {
400 "data": {
401 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 0.023621 0.039662\n2 -0.021807 -0.033638\n3 -0.031763 0.082232\n4 0.034477 0.044544\n5 0.037786 -0.026381\n6 -0.011452 -0.049187\n7 0.032676 0.117008\n8 -0.012581 0.067353\n9 0.029581 0.078249\n10 0.006151 -0.168261\n11 0.012162 0.024041\n12 0.021149 -0.055623",
402 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>0.023621</td>\n <td>0.039662</td>\n </tr>\n <tr>\n <th>2</th>\n <td>-0.021807</td>\n <td>-0.033638</td>\n </tr>\n <tr>\n <th>3</th>\n <td>-0.031763</td>\n <td>0.082232</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0.034477</td>\n <td>0.044544</td>\n </tr>\n <tr>\n <th>5</th>\n <td>0.037786</td>\n <td>-0.026381</td>\n </tr>\n <tr>\n <th>6</th>\n <td>-0.011452</td>\n <td>-0.049187</td>\n </tr>\n <tr>\n <th>7</th>\n <td>0.032676</td>\n <td>0.117008</td>\n </tr>\n <tr>\n <th>8</th>\n <td>-0.012581</td>\n <td>0.067353</td>\n </tr>\n <tr>\n <th>9</th>\n <td>0.029581</td>\n <td>0.078249</td>\n </tr>\n <tr>\n <th>10</th>\n <td>0.006151</td>\n <td>-0.168261</td>\n </tr>\n <tr>\n <th>11</th>\n <td>0.012162</td>\n <td>0.024041</td>\n </tr>\n <tr>\n <th>12</th>\n <td>0.021149</td>\n <td>-0.055623</td>\n </tr>\n </tbody>\n</table>\n</div>"
403 },
404 "execution_count": 17,
405 "metadata": {},
406 "output_type": "execute_result"
407 }
408 ],
409 "source": [
410 "returns = prices.pct_change()\n",
411 "returns"
412 ]
413 },
414 {
415 "cell_type": "code",
416 "execution_count": 18,
417 "metadata": {},
418 "outputs": [
419 {
420 "data": {
421 "text/plain": "BLUE 0.01\nORANGE 0.01\ndtype: float64"
422 },
423 "execution_count": 18,
424 "metadata": {},
425 "output_type": "execute_result"
426 }
427 ],
428 "source": [
429 "returns.mean()"
430 ]
431 },
432 {
433 "cell_type": "code",
434 "execution_count": 19,
435 "metadata": {},
436 "outputs": [
437 {
438 "data": {
439 "text/plain": "BLUE 0.023977\nORANGE 0.079601\ndtype: float64"
440 },
441 "execution_count": 19,
442 "metadata": {},
443 "output_type": "execute_result"
444 }
445 ],
446 "source": [
447 "returns.std()"
448 ]
449 },
450 {
451 "cell_type": "code",
452 "execution_count": 20,
453 "metadata": {},
454 "outputs": [
455 {
456 "data": {
457 "text/plain": "<AxesSubplot:>"
458 },
459 "execution_count": 20,
460 "metadata": {},
461 "output_type": "execute_result"
462 },
463 {
464 "data": {
465 "text/plain": "<Figure size 432x288 with 1 Axes>",
466 "image/png": "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\n"
467 },
468 "metadata": {
469 "needs_background": "light"
470 },
471 "output_type": "display_data"
472 }
473 ],
474 "source": [
475 "returns.plot.bar()"
476 ]
477 },
478 {
479 "cell_type": "code",
480 "execution_count": 21,
481 "metadata": {},
482 "outputs": [
483 {
484 "data": {
485 "text/plain": "<AxesSubplot:>"
486 },
487 "execution_count": 21,
488 "metadata": {},
489 "output_type": "execute_result"
490 },
491 {
492 "data": {
493 "text/plain": "<Figure size 432x288 with 1 Axes>",
494 "image/png": "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\n"
495 },
496 "metadata": {
497 "needs_background": "light"
498 },
499 "output_type": "display_data"
500 }
501 ],
502 "source": [
503 "prices.plot()"
504 ]
505 },
506 {
507 "cell_type": "markdown",
508 "metadata": {},
509 "source": [
510 "## Compounding Returns\n",
511 "\n",
512 "Now that we have a series of 12 monthly returns, we can produce the compounded return by multiplying the individual period returns, as long as the returns are expressed as growth rates in what I call \"1+R\" format.\n",
513 "\n",
514 "To compound the returns, all we need to do is add 1 to each return and then multiply them. The result is itself in \"1+R\" format, so we need to subtract 1.\n",
515 "\n",
516 "Let's compute the compounded return of our two series. "
517 ]
518 },
519 {
520 "cell_type": "code",
521 "execution_count": 22,
522 "metadata": {},
523 "outputs": [
524 {
525 "data": {
526 "text/plain": " BLUE ORANGE\n0 NaN NaN\n1 1.023621 1.039662\n2 0.978193 0.966362\n3 0.968237 1.082232\n4 1.034477 1.044544\n5 1.037786 0.973619\n6 0.988548 0.950813\n7 1.032676 1.117008\n8 0.987419 1.067353\n9 1.029581 1.078249\n10 1.006151 0.831739\n11 1.012162 1.024041\n12 1.021149 0.944377",
527 "text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>BLUE</th>\n <th>ORANGE</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1.023621</td>\n <td>1.039662</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0.978193</td>\n <td>0.966362</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0.968237</td>\n <td>1.082232</td>\n </tr>\n <tr>\n <th>4</th>\n <td>1.034477</td>\n <td>1.044544</td>\n </tr>\n <tr>\n <th>5</th>\n <td>1.037786</td>\n <td>0.973619</td>\n </tr>\n <tr>\n <th>6</th>\n <td>0.988548</td>\n <td>0.950813</td>\n </tr>\n <tr>\n <th>7</th>\n <td>1.032676</td>\n <td>1.117008</td>\n </tr>\n <tr>\n <th>8</th>\n <td>0.987419</td>\n <td>1.067353</td>\n </tr>\n <tr>\n <th>9</th>\n <td>1.029581</td>\n <td>1.078249</td>\n </tr>\n <tr>\n <th>10</th>\n <td>1.006151</td>\n <td>0.831739</td>\n </tr>\n <tr>\n <th>11</th>\n <td>1.012162</td>\n <td>1.024041</td>\n </tr>\n <tr>\n <th>12</th>\n <td>1.021149</td>\n <td>0.944377</td>\n </tr>\n </tbody>\n</table>\n</div>"
528 },
529 "execution_count": 22,
530 "metadata": {},
531 "output_type": "execute_result"
532 }
533 ],
534 "source": [
535 "returns + 1"
536 ]
537 },
538 {
539 "cell_type": "code",
540 "execution_count": 23,
541 "metadata": {},
542 "outputs": [
543 {
544 "data": {
545 "text/plain": "BLUE 1.123310\nORANGE 1.087167\ndtype: float64"
546 },
547 "execution_count": 23,
548 "metadata": {},
549 "output_type": "execute_result"
550 }
551 ],
552 "source": [
553 "np.prod(returns+1)"
554 ]
555 },
556 {
557 "cell_type": "code",
558 "execution_count": 24,
559 "metadata": {},
560 "outputs": [
561 {
562 "data": {
563 "text/plain": "BLUE 1.123310\nORANGE 1.087167\ndtype: float64"
564 },
565 "execution_count": 24,
566 "metadata": {},
567 "output_type": "execute_result"
568 }
569 ],
570 "source": [
571 "(returns+1).prod()"
572 ]
573 },
574 {
575 "cell_type": "code",
576 "execution_count": 25,
577 "metadata": {},
578 "outputs": [
579 {
580 "data": {
581 "text/plain": "BLUE 0.123310\nORANGE 0.087167\ndtype: float64"
582 },
583 "execution_count": 25,
584 "metadata": {},
585 "output_type": "execute_result"
586 }
587 ],
588 "source": [
589 "(returns+1).prod()-1"
590 ]
591 },
592 {
593 "cell_type": "code",
594 "execution_count": 26,
595 "metadata": {},
596 "outputs": [
597 {
598 "data": {
599 "text/plain": "BLUE 12.33\nORANGE 8.72\ndtype: float64"
600 },
601 "execution_count": 26,
602 "metadata": {},
603 "output_type": "execute_result"
604 }
605 ],
606 "source": [
607 "(((returns+1).prod()-1)*100).round(2)"
608 ]
609 },
610 {
611 "cell_type": "markdown",
612 "metadata": {},
613 "source": [
614 "## Annualizing Returns\n",
615 "\n",
616 "To annualize a return for a period, you compound the return for as many times as there are periods in a year. For instance, to annualize a monthly return you compund that return 12 times. The formula to annualize a monthly return $R_m$ is:\n",
617 "\n",
618 "$$ (1+R_m)^{12} - 1$$\n",
619 "\n",
620 "To annualize a quarterly return $R_q$ you would get:\n",
621 "\n",
622 "$$ (1+R_q)^{4} - 1$$\n",
623 "\n",
624 "And finally, to annualize a daily return $R_d$ you would get:\n",
625 "\n",
626 "$$ (1+R_d)^{252} - 1$$\n",
627 "\n",
628 "For example, to annualize a 1% monthly, and 4% quarterly and a 0.01% daily return you would do:"
629 ]
630 },
631 {
632 "cell_type": "code",
633 "execution_count": 27,
634 "metadata": {},
635 "outputs": [
636 {
637 "data": {
638 "text/plain": "0.12682503013196977"
639 },
640 "execution_count": 27,
641 "metadata": {},
642 "output_type": "execute_result"
643 }
644 ],
645 "source": [
646 "rm = 0.01\n",
647 "(1+rm)**12 - 1"
648 ]
649 },
650 {
651 "cell_type": "code",
652 "execution_count": 28,
653 "metadata": {},
654 "outputs": [
655 {
656 "data": {
657 "text/plain": "0.1698585600000002"
658 },
659 "execution_count": 28,
660 "metadata": {},
661 "output_type": "execute_result"
662 }
663 ],
664 "source": [
665 "rq = 0.04\n",
666 "(1+rq)**4 - 1"
667 ]
668 },
669 {
670 "cell_type": "code",
671 "execution_count": 28,
672 "metadata": {},
673 "outputs": [],
674 "source": []
675 }
676 ],
677 "metadata": {
678 "kernelspec": {
679 "display_name": "Python 3",
680 "language": "python",
681 "name": "python3"
682 },
683 "language_info": {
684 "codemirror_mode": {
685 "name": "ipython",
686 "version": 3
687 },
688 "file_extension": ".py",
689 "mimetype": "text/x-python",
690 "name": "python",
691 "nbconvert_exporter": "python",
692 "pygments_lexer": "ipython3",
693 "version": "3.8.8"
694 }
695 },
696 "nbformat": 4,
697 "nbformat_minor": 2
698 }