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": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAwmElEQVR4nO3dd3hVVbrH8e9KIw0CKbSEkAQCCUUCRKTbBTVIEyxYUNTp15lRHNGZ8d4Zyzg613GK15mxD8goKBYsICqiNA0QOhJKIAkBUgikkHrW/WOFSJXktH32yft5Hp8k+5yz93sw/Fhn7VWU1hohhBD2E2B1AUIIIZwjAS6EEDYlAS6EEDYlAS6EEDYlAS6EEDYV5M2LxcbG6qSkJG9eUgghbG/dunUlWuu40497NcCTkpLIzs725iWFEML2lFL7znZculCEEMKmJMCFEMKmJMCFEMKmvNoHfjb19fUUFBRQU1NjdSm2EhoaSkJCAsHBwVaXIoSwiOUBXlBQQPv27UlKSkIpZXU5tqC1prS0lIKCApKTk60uRwhhEcu7UGpqaoiJiZHwbgWlFDExMfKpRYg2zvIAByS8nSB/ZkIInwhwIYSN1ByFb16ExgarK2nzJMCBwMBAMjIyGDRoEEOGDGHVqlUA5OXlMWDAgFOeu3z5crKysk45NnPmTBYuXAjAJZdcQt++fcnIyCAjI4Prr7/eO29CCG/QGt75MXzwS8hdYnU1bZ7lNzF9QVhYGDk5OQAsWbKEOXPm8MUXXzh9vnnz5pGZmemm6oTwId+8ADsWm++3L4a0a62tp42TAD/NsWPH6NSpk9VlCOF7Dm6BJQ9D7yshrBPs/Mh0owRKjFjFp/7k/+f9rWw7cMyt5+zXvQOPTOj/vc85fvw4GRkZ1NTUUFRUxGeffebSNWfMmEFYWBgAV155JU899ZRL5xPCcnVVsPAOCOsIk/4P9q+GzW/CvpWQcrHV1bVZPhXgVjm5C2X16tXcdtttbNmy5azPPdfoj5OPSxeK8Dsf/QpKcuG2dyAyDnpfDkGhpjtFAtwyPhXg52spe8OIESMoKSmhuLj4rI/HxMRw5MiRU46VlZURGxvrjfKE8L7NC2HDv2HM/ZByiTkWEgG9LocdH8DVfwQZ1moJGYVymh07dtDY2EhMTMxZH09NTeXAgQNs374dgH379rFx40YyMjK8WKUQXlK2B97/OfS4CC6Zc+pj6VlwrBAOrLekNOFjLXCrnOgDBzNN/dVXXyUwMBCAb7/9loSEhObnPvPMM8ydO5c77riDmpoagoODeeGFF4iKimp+zsl94LGxsSxbtsx7b0YId2mog4WzICAApr5w5s3KPuNBBZrRKPFDramxjZMABxobG896PCkpifr6+rM+tmbNmrMeX758ubvKEsJan/3OtK6n/xs6Jp75eHg0JI0y/eBXPOL9+oR0oQghziL3E1j1V8icBf2uO/fz0iZAyU4o3um92kQzCXAhxKkqDsKiH0Ln/jDuse9/7omJPDve93xd4gznDXCl1EtKqcNKqTPG1Sml7lNKaaWUDMEQwh84GuHtu6G+Gqa9DMFh3//8qHjoPsSMRhFe15IW+CvA+NMPKqV6AFcB+91ckxDCKl89A3tXwNVPQlzflr0mPQsK18GxA56tTZzhvAGutV4BlJ3loWeABwDt7qKEEBbYvxY+fxwGTIXBt7b8dWkTzFdphXudU33gSqmJQKHWemMLnnuPUipbKZV9rskxQgiLHT8Cb82Cjj0g65nWTcyJ6wOxfWC79IN7W6sDXCkVDjwE/LYlz9da/1Nrnam1zoyLi2vt5byioKCAiRMnkpqaSq9evbj33nupq6tj+fLlREVFkZGRQVpaGvfff/8pryspKSE4OJjnn3/+lONJSUlMnTq1+eeFCxcyc+bM5p8//vhjhg0bRlpaGhkZGdxwww3s3296ombOnElycnLzcrQjR4703BsXAswSse/9DCqKYOpLEBp1/tecLu1ayPsKqs/2YV14ijMt8F5AMrBRKZUHJADrlVJd3VmYt2itmTJlCpMmTSI3N5edO3dSWVnJww8/DMCYMWPIyclhw4YNLF68mJUrVza/dsGCBQwfPpz58+efcd5169axbdu2M45v2bKFn/3sZ7z66qvs2LGDnJwcZsyYQV5eXvNznnrqKXJycsjJyWlem1wIj8l+ybSeL38EEpyckJM2AXQj7JQ1wr2p1QGutd6ste6stU7SWicBBcAQrfVBt1fnBZ999hmhoaHccccdgNnc4ZlnnuGll16iurq6+XlhYWFkZGRQWFjYfGz+/Pn86U9/orCwkIKCglPOe9999/HYY2cOwXryySd56KGHSE9Pbz523XXXMXbsWHe/NSHO7+AW+HiOWddkxE+dP0/3wdC++3drhQuvOO9MTKXUfOASIFYpVQA8orV+0SPVfPQgHNzs3nN2HQhX/+GcD2/dupWhQ09tdXTo0IHExER27drVfOzIkSPk5uY2B21+fj5FRUUMGzaM6dOn88Ybb3Dfffc1P3/69Ok899xzp5zjxPVO74o53ezZs3n00UcB6N+/P/PmzWvZexWiNeqqYOGdZonYyf8wU+adFRBgulE2zIW6aggJd1uZ4txaMgrlJq11N611sNY64fTwbmqJl3iuRGt9+eWXDBo0iPj4eMaNG0fXrqan6I033mD69OkA3HjjjWd0owQGBjJ79myeeOKJc567tLSUjIwM+vTpw9NPP918/OQuFAlv4TEfP2hmUU7+h1ki1lXpWdBwHHZ/6vq5RIv41loo39NS9pR+/fo172d5wrFjx9i/fz+9e/dmzJgxLF68mL179zJ8+HCmT59ORkYG8+fP5+DBg80Be+DAAXJzc0lNTW0+z6233soTTzxxyr6a/fv3Z/369QwaNIiYmBhycnJ4+umnqays9M4bFgJgy1uw/jUY/Uvodal7ztlzFIR2NItbpU9wzznF92rzU+kvv/xyqquree211wCzsNV9993HzJkzCQ//7mNgcnIyDz74IE8++WTzjc7CwkLy8vLIy8tjzpw5Z7TCg4OD+cUvfsEzzzzTfOyBBx7gsccea16OFjilr10Ijyvba5aITRgGlz7kvvMGBkPfq5u2Wjv7InDCvdp8gCulWLRoEQsWLCA1NZU+ffoQGhrK448/fsZzf/jDH7JixQrmz5/P5MmTT3ls6tSpZx2NMmvWLBoaGpp/HjhwIM8++yy33XYbffv2ZdSoUWzfvp2bb765+TmzZ89uHkaYkZFBXV2dG9+xaNMa6sx4b6WalogNdu/507Kg5qgZUig8TmntvYmUmZmZOjs7+5Rj27dvP2VEhmg5+bMTrbb0N7DqLzD9Neg30f3nr6uGP6bA4Blw7Z/cf/42Sim1Tmt9xj6Nbb4FLkSbsWuZCe/MOz0T3mBGn/Ru2mrN4fDMNUQzCXAh2oKKg/D2D6BzPxh3ZvegW6VPMLM6Zas1j/OJAPdmN46/kD8z0WIOByz6gRn3fX0Lloh1VZ9xEBAkk3q8wPIADw0NpbS0VAKpFbTWlJaWEhoaanUpwg5W/hn2LDdLxHZO8/z1wjpB0mgznFB4lOXjwBMSEigoKEBWKmyd0NDQUzZbFuKs8r+Gzx6F/pNhyG3eu25aFnx4PxR/2/J1xUWrWR7gwcHBJCcnW12GEP7neLnZVT4qHiY827olYl2Vdq0J8O3vS4B7kOVdKEIID2heIvaA6fd2ZolYV3ToDvFDpR/cwyTAhfBH616G7e/BZb+BhDOGD3tHWhYc2ABHC87/XOEUCXAh/M2hbU1LxF4GI//LujrSZas1T5MAF8Kf1FXDwjugXQfXl4h1VWwqxPaVrdY8SAJcCH+hNSz+BRTvgCn/gMjOVldklpjdt0q2WvMQCXAh/MWyR2DTf+DSh033iS9IyzJbrX37kdWV+CUJcCH8waq/wcpn4cK7YOxsq6v5TvfB0CFBRqN4iAS4EHa38Q1Y+rBZoOrqP3p3vPf5KGXGhO/+zEzlF24lAS6EneV+Au/+GJLHwpR/QUCg1RWdKT0LGmrMaojCrSTAhbCrgmx48zazwuAN8yCondUVnV3iSAiLlrVRPEACXAg7Kt4J86ZBZBe45S0I7WB1RecWGNS01doSsyOQcBsJcCHs5mgh/HuyWbL11rd9Y7jg+aRlQe1R2CdbrbmTBLgQdlJdBnOnmH0nb1kI0SlWV9QyvS6F4AjpRnEzCXAh7KKuGubfCGV74KbXodsgqytqueAw2WrNA84b4Eqpl5RSh5VSW0469nul1CalVI5SaqlSqrtnyxSijWusN1Pk8782u8knj7W6otZLnwCVB6FwndWV+I2WtMBfAcafduwprfUFWusMYDHwWzfXJYQ4QWt4/17Y+bHZ6d1TGxJ7WupVTVutydoo7nLeANdarwDKTjt27KQfIwDZD00IT1n235AzDy6ZAxfOsroa54V1hKQxph9ctlB0C6f7wJVSjyml8oEZfE8LXCl1j1IqWymVLdumCdFKq/9u9rS88C64+FdWV+O69Cwo220W3BIuczrAtdYPa617APOAn37P8/6ptc7UWmfGxcU5ezkh2p6Nb8CSh3xziryz+l5rvspoFLdwxyiUecBUN5xHCHHCiSnySWN8d4q8Mzp0g4QLpR/cTZwKcKVU6kk/TgTk85AQ7nLyFPkbX/fdKfLOSsuCoo1Qvt/qSmyvJcMI5wOrgb5KqQKl1CzgD0qpLUqpTcBVwL0erlOItsFOU+SdJVutuU3Q+Z6gtb7pLIdf9EAtQrRtdpwi74yYXhCXbvrBh//I6mpsTWZiCuEL7DpF3lnpWbB/FVSVWF2JrUmAC2E1O0+Rd1ZaFmiHbLXmIglwIax08hT5Kf+y5xR5Z3QbBFGJstWaiyTAhbDK6VPk+0+yuiLvad5q7XOorbS6GtuSABfCKv4yRd5Z6VnQWCtbrblAAlwIK5yYIp85yz+myDsjcQSEx0g3igskwIXwtpOnyF/zlH9MkXdGQGDTVmtLZas1J0mAC+FNucv8c4q8s9ImmK3W8lZYXYktSYAL4S0F2fDmrdA53T+nyDsj5RLZas0FEuBCeENVCbw+3cyunOGnU+SdERwKqVfAtx/KVmtOkAAXwhs++72ZZXnTf6B9F6ur8S1pE6DyEBR8Y3UltiMBLoSnFW2Eda/CsB+Y7hNxqj5XQUCwLDHrBAlwITxJa/jwATNc7uIHrK7GN4VGmRmostVaq0mAC+FJW96C/DVwxSNmT0hxdulZcGQvHN5mdSW2IgEuhKfUVsLS30C3DMi4xepqfFvfawElo1FaSQJcCE/56n+h4oDZzzJA/qp9r/ZdoMcw6QdvJfmtEsITyvbAqr/CBTdC4kVWV2MPaVlwcDMcybO6EtuQABfCE5b82oysuOK/ra7EPtKzzFdvbLWmNeSthHd+AgtmwvFyz1/TA867pZoQopV2fQrffmDCu0M3q6uxj+gU6NzfBPiIn3jmGuX7YeN/zCqQR/IgJBIaaqH4W5ixEKLiPXNdD5EWuBDu1FgPHz9owmj4j62uxn7Ss2D/avdutVZXZUL71Qnw54Hw+WPQMREm/xPu32m2sCvPhxevhEP2GgUjAS6EO339TyjZCeOekLVOnNG81dqHrp1Ha9i3Gt79KTzdFxb9wLS+L30Yfr4Zbn8fBt0AIRFmPZY7PgRHI7w83nSt2IR0oQjhLpXFsPwP0PtK6DPO6mrsqetA0zrevhiG3Nb615fnm9b2xtfNjeTgCOg/GTJuhp4jz710b7cL4K5PYO5U+PckmPJP8zofJwEunONwwL6vIC7NLNAk4NP/gfpqGP9E213j21VKmbVRvvkX1FZAu/bnf01dtdkUImce7PkC0Ga53rEPQPoEaBfZsmt3TIQ7l8D8m2DBHVBxCIb/0KW342kS4KL1yvaYu/f7V5mRFv0nwYV3m3G8bTW4CtfDhrkw8qcQm2p1NfaWdi2s+TvkfgIDppz9OVpD/loT2lsWQV2FCeBLHoRBN0KnJOeuHR4Nt70Db90FH/8KjhXCFf/js+P4zxvgSqmXgCzgsNZ6QNOxp4AJQB2wG7hDa13uwTqFL3A4IPtF+OS3JrivfgrKdkPO67B5gfn4e+FdMHCa6VtsKxwO+OhXEBFnWn3CNYnDITzWtKpPD/CjBU2jSF43v3vB4dBvUlMXySj3BG1wGEx/DT56AFb9BSqKYOJzEBTi+rndrCUt8FeAvwGvnXTsE2CO1rpBKfUkMAdooxv7tRFH9sF7P4W9K6DX5XDdX78bcnX5b2HTm/DNC2aX9aW/hcEzzH6Psb2trdsbNr8JBV+bv+SyzrfrTmy1tvUdM8RPO8zQwg1zYc9yQEPP0TDmPuh3Xcu6WZyp4ZqnoUO86RqrPAw3/NssvOVDlG7B6l9KqSRg8YkW+GmPTQau11rPON95MjMzdXZ2tjN1CqtoDetegaW/Nj+PewyG3H72rpITH2u//hdsexcc9ZByKQy7G1LHQaAf9tjVVsBfh0JUAsxa5rMftW1n5xKzAUbvK83vVO0xiEqEjJtMF0l0ivdqyZlvGi9xaWasuAVj+5VS67TWmacfd8ffqDuBN77nwvcA9wAkJia64XLCa44WwHs/g92fmeU+J/7d9DOei1Lm42/icKh4HNa/Butehv/cDB0SIPMOE/6Rcd57D5624mmzGcGN8yW83Sn5YgiLhryvzObPGTebG5NW/Bln3GRu1L95mxkrfstbENfX+3WchUstcKXUw0AmMEW34ETSArcJrU0f48cPgqMBrvyd6Q5x5i9PYwPs/Mi0yvd+4V83PUt3w98vggumw6TnrK7G/1QcMv3RvtItdSAH5k2Dxjqzs1LPEV679Lla4E7/c6aUmom5uTmjJeEtbOJYEcy/0eyc3mUA/Gil6QJxtuUTGGSGct3+HvzkG7hwlvl4/NJV8I8xpnumrsqtb8FrljwEQaFw+SNWV+Kf2nfxnfAG6J5hxopHxJqx4tutXznRqb+VSqnxwAPAdVrraveWJCyhtbkR+dxwc6No3BMw8wP39jXG9YGrn4RfboesP5trvn8v/CkdPp4DJbvcdy1P27kUdn5sdtmRPS7bjk5JcOdSM+LqjVvNJ0sLnbcLRSk1H7gEiAUOAY9gRp20A0qbnrZGa33eEe/SheKjKg/D4l+YYVsJw2DS/3ln9IjWsH+NmbSx7T373PRsqIP/a/r4/KPVPjm8THhYXTW8NctM+R/9SzMSy4PdgU7fxNRa33SWwy+6pSphvS1vwwf3mW6MK38HI35qhlB5g1KmH7HnCNPfefJNz6geMHSmb970XPs8lO6CGW9JeLdVIeEw/d/w4X1NG3cUwYS/eP33oUU3Md1FWuA+pKrU/PJtXQTdh5hWd+c0q6s6+03PzDvNPy7BoVZXZ/6h+etQSBoFN59z8JVoK7Q2I5E+fxR6XWYmAHlgXLonhxEKu9m+GBb/3Cxif9lvYNTPfae74sRNz/QJULzTTKn++h9m2v60VyGml7X1ffo/0FgL4x63tg7hG5SCi2ebseHv/Re8fI0ZK+6l+yIycLUtqS6Dt+6GN2ZA+65wz3IYe7/vhPfp4vrAhGfhpjfMKnP/uNjMzrNKQbZZe2PET6z/h0T4lsG3mE9kpbvgxSugJNcrl5UAbyt2LoHnRsDWt+HiB+Huz6HrGRNrfVPf8fDDL83kiQW3m3VHGuq8W4PDAR/OhsiuZgq3EKdLvRJmLjY3OF+8CvK/9vglJcD9Xc1Rs3Lg69PNSmt3fQqXzoHAYKsra52OiXDHR2aXm7XPw0vjzPos3rJxPhxYb/riPbH2hvAP8UPNWPGwjmYHoB0ubkxxHhLg/mzXp6bVvfF1M9TpnuVmMoJdBYWYtbZvmGtmQf5jjMf/ggDmH8Fl/22GWF4w3fPXE/YWnWLGinfuZ7ors1/y2KUkwP1RbaWZIDN3ilnWddYyuOIR/9niK30C/OALM6niPzeZhbYa6z13vS/+CFXFZhKSnaf+C++JjDPdKb2vMHMsPnvUjFhxMwlwf9NQZ6bCr3sVRv4MfrACEoZaXZX7RSebVs6Fd8Gqv8Ir18LRQvdfp3in6bIZcivED3H/+YX/Cokwi5wNvhVWPAVb3nL7JSTA/YnWZvXAvC/NuO6rHjWLAfmr4FC49k8w9UU4tBWeHw25y9x3fq1hyRyzr+Jlv3XfeUXbERhk1s6f9gr0P8fuQi6QAPcny5+ATf+BSx4yS2C2FQOvN/377bvBvKnw6e/NhCBX7VwCu5aZbbp8bTaosA+lzAbJHlgKVwLcX2yYC188CRkzzAJLbU1sKtz9qfm4+uXTZrW4ioPOn6+h1iynG9vXrM0ihA+SAPcHuz83Ny2TLzar/LXVG23BYTDxbzDpeShcB8+Padql3Amr/w5H9sLVf7DfkEvRZkiA292hrWankNg+Zs8+WVzJdB/d/RmEdYLXJsLyJ8HR2PLXHysy61ukZZn1LYTwURLgdnasCOZNNztzz1jgcxuuWqpzugnxC26A5Y/D3KlQWdyy1y57xOxEdNWjnq1RCBdJgNtVbQW8Pg1qymHGm2ZTXXGqdpEw+XmzzOf+1Wbiz75V3/+a/Wth0xtmCGZ0snfqFMJJEuB21NgAC2bCoW1meFK3QVZX5LuUgqG3w13LzCeVV7Lgq2fM2ianczTCRw9A++4w5pfer1WIVpIAtxutzTreu5aZMdCpV1pdkT10HWiGGva7zkyLn3+jWZ3xZBvmQlEOXPV7MwlDCB8nAW43K/9sNgIe9XPIvMPiYmwmtANc/zJc8zTs+dyMUsn/xjx2vBw+/R0kjoABUy0tU4iW8tGFoMVZbV5oWo8DpspO6M5Syozrjh9quqFeHg9X/h7K98PxMrj6j213GKawHQlwu9i3Ct75kWkhTnzOI7O62pT4IWadmHd/YqbLAwy9A7pdYG1dQrSCpIAdlOTC/JvMmtg3vu4be0P6g7COZmnacY+bfxgv+43VFQnRKtIC93WVxTDveggIMnvthUdbXZF/UcpskTbiJ1ZXIkSrSYD7srpqM1qi4iDM/EDGJQshTiFdKCdUl8GGeXC0wOpKDEcjvH23WdNj6guQkGl1RUIIH3PeAFdKvaSUOqyU2nLSsWlKqa1KKYdSyt7JUl8DX/0Zns2Ad39svr5/LxzJs7aupb+GHYtN/2z6BGtrEUL4pJa0wF8Bxp92bAswBVjh7oK8xuGATW/C3zLN2heJF8Ft78GQ2yDndfjLEFj0I3MD0dvWPA9rnoOLfggjfuz96wshbOG8feBa6xVKqaTTjm0HUHYdL7t3hWnhFm2ErhfAxL9DysXmsZSLYexsWPUXyH7Z7EY+YAqMuR+69PN8bTs+MOtQp2WZ1rcQQpyDx29iKqXuAe4BSExM9PTlvt/hHfDJbyF3CUT1gMn/hIHTzhxT3aGb2f189C9h9d/gmxfMfnZpWSbcPbWze8E6WDjLjFGe8i8ICPTMdYQQfkHpFuyU3NQCX6y1HnDa8eXA/Vrr7JZcLDMzU2dnt+ip7lVxyCwpuv41CIk0CxVd9MOW7xdZXWY2tl3zPNQehdSrTJD3GOa+Go/kwQtXmAWX7loGkZ3dd24hhK0ppdZprc+43+jfwwjrqsyO5Sv/Ao21MOweGPsARMS07jzh0XDpQ2as8Nf/Mru1vHil2QFn7GxIGu3a9OvqMph7PTTWw8yFEt5CiBbxzwB3NJqV5T5/HCoPQr+JZu2QmF6unTc0Csbeb1rv6142/zC8mmVm8Y2dbXZvaW2QN9TCG7dA+T649R2I6+NajUKINuO8XShKqfnAJUAscAh4BCgD/grEAeVAjtZ63Pku5vEuFK0h9xPTz128HRKGmV1VEi/yzPXqj8P6f5sVAo8VmgWSxs6GPuNbFuQOByy6BzYvgKkvmt3VhRDiNOfqQmlRH7i7eDTAizbC0t/A3i8gOgWu+G9Iv847K8s11Jqhh1/9r1nVrstAGHsfpE/8/kWnPv0dfPknuPy3MOY+z9cphLAl/+0DL8+Hzx4122CFdYLxT0Lmnd7d3DeonVmbe/AtZsnXL582S5XG9jVdLv2nQOBpf9TrXjHhPeR2M9pFCCFayb4t8JqjZmus1c+Zn4f/CEb/wqwwZzVHI2x7x+xsfnib+UQw+pdmg92gELObzrzp0OtSuOmNM8NdCCFO4j9dKA115gbiF09CdakJxct+bZZa9TUOB3z7Aax4ynTxRPUwLe6Vf4ZOyXDnR9CuvdVVCiF8nP27ULSG7e+ZHWnK9kDyWLOTiqcm1bhDQIBZxyQty9xcXfFH+PxR6BBvdpKX8BZCuMAeAZ7/DSx9GPLXQlwa3LzAbOZrl6n8SkGfq0zN+V9Dh+7mPyGEcIE9AnzLQjNTccKzkHGLffuMlfLckEYhRJtjjyS89CGz3VW7SKsrEUIIn2GPAA+NsroCIYTwObIjjxBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2JQEuBBC2NR5A1wp9ZJS6rBSastJx6KVUp8opXKbvnbybJlCCCFO15IW+CvA+NOOPQh8qrVOBT5t+lkIIYQXnTfAtdYrgLLTDk8EXm36/lVgknvLEkIIcT7O9oF30VoXNX1/EOhyricqpe5RSmUrpbKLi4udvJwQQojTuXwTU2utAf09j/9Ta52ptc6Mi4tz9XJCCCGaOBvgh5RS3QCavh52X0lCCCFawtkAfw+4ven724F33VOOEEKIlmrJMML5wGqgr1KqQCk1C/gDcKVSKhe4oulnIYQQXhR0vidorW86x0OXu7kWIYQQrSAzMYUQwoO01uSVVFFT3+j2c5+3BS6EEKJ1iitqWbW7hFW7SvlqVwmF5cd57c5hjO3j3pF4EuBCCOGiqtoGvt5bxle7Sli5q4QdBysAaB8axMheMfzg4hT6dm3v9utKgAshRCvVNzrIyS9nZVNgb9hfToNDExIUQGbPTswe15dRvWMZGB9FYIDyWB0S4EIIcR5aa3YcrGgO7K/3llFV14hSMDA+irvHpjCqVyyZSZ0IDQ70Wl0S4EIIcRYFR6qbAruUVbtLKKmsAyAlNoLJQ+IZ3TuW4SkxdAwPsaxGCXAhhACOVNWxek9pcz/2vtJqAOLat2N071hGNf3XvWOYxZV+RwJcCNHmHK9rJK+0ij3FVWwqNH3ZWw8cQ2uIbBfE8JRobh+RxOjUWFI7R6KU5/qxXSEBLoTwS40OTeGR4+wpqWRviQlr87WSA0drmp8XHKgYnNiJX1zRh1G9Y7kgIYrgQHtMkZEAF0LYltaasqo6E8zNIV3JnuIq9pVWU9foaH5u+9AgUuIiuSglhuTYCFLiIszX2EjCQrx349GdJMCFED7v5C6PvSWVJ4V1FUeP1zc/LzhQ0TPGBPNlaZ2bQjqSlLgIYiJCfLYrxFkS4EIISzgcmmM19RyprudIdR3l1XWUVdVTXl3Hkabv88uq2VtSRWH58VNe2y0qlOTYCLIu6EZKXCQpTS3q+I5hBNmk+8MdJMCFEC6rb3RQXn0ifOspq6pr/t4E80nfV9c1P9dxjq1gAgMUHcOCSegUxoVJnbghrkdzt0dSTAQR7SS6QAJcCNEKJZW1fLi5iC++Laakqo4jVaa1XFHTcM7XhAQFEB0eQsfwYDqFh5DetUPz950iQuh02vcdw0PoEBrkd90dniABLoT4XpW1DSzdepB3cw7w1a4SGh2alNgIEqLDSYoJp1NTOEdHhNAx/MxADgsOlDD2EAlwIcQZ6hocfLGzmHdzClm2/RA19Q7iO4Zxz9gUJmZ0J61rB6tLFEiACyGaOByatXvLeG9jIR9uPsjR4/VER4QwbWgPJmZ0Z0hiJwI8uDCTaD0JcCHaMK01Ww8c472NB3gv5wAHj9UQHhLIVf26MDEjntGpsbaZ1NIWSYAL4WFaazYVHOWDzUWEBgWYYW9xEaTERRJp0WiKfaVVvJtzgHdzCtldXEVQgOKSvnE8dG06V6R3JjxEosEO5P+SEB5SUlnLOxsKeTM7n52HKgkJDKDB4Thl6Fzn9u2aJ5v0ijPD5FJiI0no5P7xzIcravhgUxHv5hwgJ78cgGHJ0dw5OplrBnSjU4R1q+oJ50iAC+FGDY0Oln9bzJvZ+Xy24zANDk1Gj448PnkgWYO60S4ogP2l1ewurmJP05TvPcWVfLSliPLqM2cUpsRGkBwXQa/Y71rt0a0I2oqaepZsPcS7OYWs3FWCQ0O/bh2Yc3UaEwZ196mV9UTrSYAL4Qa7DleyYF0+b68vpLiiltjIEO4cncy0oQmkdjl1K63ULu3POAZmOdM9JZUm3JuCfU9JFZ9/e5j6xu+a7R3Dg5vX8EiJi2hquUfSMyacdkGB1DY08vmOYt7bWMiy7Yepa3DQIzqMH1/Sm4kZ3c96bWFPEuBCOKmipp4PNhXxZnY+6/eXExiguCytM9OGJnBpWudW3/zrFBHC0IhohvaMPuV4Q6ODwvLj7CmuYnfxiXVAKvkyt5i31hc0Py9AQUKn8OaJNbGRIdw8LJHrMrozuEdHGYvthyTAhWgFrc1Quzez8/lo80GO1zfSu3MkD12TxqTB8XRuH+r2awYFBtAzJoKeMRFcmtb5lMcqaurJK6k+qeVeSVhwIFmDujOqV0ybWhekLXIpwJVS9wJ3Awr4l9b6z+4oSggwYbmx4CjFFbUkRoeTGB1u2bKfB8qP89a6AhauL2BfaTWR7YKYNDie6ZkJZFjYum0fGszAhCgGJkRZcn1hLacDXCk1ABPew4A64GOl1GKt9S53FSfaptqGRhZvLOKVVXlsLjx6ymOd27czYR5jAr1nTDiJ0REkRocTG+ne5UJr6hv5ZNshFqwr4MvcYrSGESkx/PyKVMb372bbNaSF/3ClBZ4OrNVaVwMopb4ApgB/dEdhou05fKyGuWv38/rafZRU1pHaOZLHJg+gf/co9pdVk19Wzb5Ss1D/mt2lLNpQiD5pSF5ESCA9ok8O9nASYyLoGR1OfKewFvdJbyk8yoLsfN7JOcDR4/V0jwrlZ5elcv2QBBJjwj307oVoPVcCfAvwmFIqBjgOXANkn/4kpdQ9wD0AiYmJLlxO+KsN+4/wyqo8PthURKPWXJ7WmZkjkxnVO6a5RZ3Ro+MZr6upb6TgyPHvgr0p5PeWVPHFzmJqG77bjSVAQfeOYd8Fe3TESSEfTmOj5p2cQhZkF7Ct6BghQQGM79+VaZkJjOwVS6BMIRc+SGl9jgV5W/JipWYBPwaqgK1Ardb65+d6fmZmps7OPiPjRRtU1+Dgw81FvLwqj4355bRvF8T0C3tw24ie9IyJcPn8DoemuLKWfaUm3PPLqtlXVs2+UhPypVV1pzxfKdAaLkiIYtrQBK4bFE9UeLDLdQjhDkqpdVrrzNOPu3QTU2v9IvBi0wUeBwq+/xW+SWtN7uFKNhUcpW+X9vTr3kFaXB5SXFHLvLX7mLd2P8UVtaTERfD7if2ZMiTBrYv0BwQounQIpUuHUIYlR5/xeEVN/UndMtVU1TVy9YCupHeTVfaEfbg6CqWz1vqwUioR0/893D1led6hYzV8lVvCyl0lfLWrhMMVtc2PdQgNYlhyDCN6xTA8JZr0rh1kFTYXbcwv59VVeby/6QD1jZpL+8Yxc1QyY3rHWvJn2z40mP7do+jfXUZvCPtytcnzVlMfeD3wE611uesleUZVbQNr95byZVNo7zxUCUB0RAgje8UwJjWWQT068u3BClbvLmX1nlKWbT8EmJlvFyVHMyIlhhG9YunTJVImRbRAfaODj7Yc5JWVe1m/v5zIdkHMuKgnt49MIjnW9W4SIdo6l/rAW8ubfeANjQ42FR7lq9wSvsotYf3+IzQ4NO2CAhiWHM3o3rGM6h1Lv27nbl0fKD/eHOard5c2b6waExHC8JQYhveKYURKNL3iJNBPVlJZy/y1+5m7dh+HjtWSHBvB7SN6MnVoAu1DpV9ZiNY6Vx+43wS41pq9JVWs3FXCl7klrN5TSkVNA0rBgO5RjOody5jUWIb27ERosHPjd/PLqlm9p5Q1TaFedLQGgLj27RieEtPUQo8hKSa8TQb6lsKjvLwyj/c3HqCu0cHYPnHcMTKJi/vESReUEC7wywAvraxl5e5SVuaafuwTLeSETmGMSTUt7JG9Ylu1eltLaa3NeOQ937XQT/Sjd+0Q2tx/PiIllh7RYX4b6PWNDpZsPcgrK/PI3neE8JBArh+awG0jkujdOdLq8oTwC34R4DX1jXyTV2a6RXaVsPXAMcDcdBzZK5bRqaaVnRjt/Raw1po9JVXNXS5r95RSUmmGqsV3DDMt9F7mv3g/WMLz0LEaFq4rYO6afRQdrSExOpzbRyYxLTOBDtJNIoRb2TrA380xi+J/k3eEugYHwYGKoT07MSY1jlG9YxkYH+Vzw/601uw6XNncOl+zp5QjTes9p3Vtz6TB8UzM6E63KPuEeW1DI59uP8yC7Hy+2FmMQ8Po3rHMHJnEpWmdfe7/gRD+wtYB/r9Lv2XptkOM7m1a2cOSo2235ZPDofn2UAWrdpfywaYDrN9fjlJmbY3Jg+MZP6Crz97g21J4lIXrCngnp5Dy6nq6dghl6tB4rh/aQ0aTCOEFtg5wh0P73U2wfaVVLNpQyDsbCskrraZdUABX9uvClCHxjEmNs3wj2bKqOt7ZUMiCdQVsb5paflW/LkzL7MHo3jK1XAhvsnWA+zOtNRvyy3lnQyHvbzzAkep6YiJCmDCoO5MGxzMoIcpr/fkNjQ5W5BazILuAZdsPUd+oGRgfxbTMBK4b1J2O4bJnohBWkAC3gboGByt2FrMop5BPth2irsFBSmwEkwbHMykj3mMr4Z3YDmzR+kIOV9QSExHCpMHxTMtMIK2rTC0XwmoS4DZzrKaejzcf5O0NBazZUwZAZs9OTBocT9YF3VxuDVfU1LO4aTuwDU3bgV3atzPTMhO4tG9nQoJkJxchfIUEuI0Vlh/n3ZxCFq0vJPdwJcGBJmwnD47nsvTOtAtq2cQkh0OzZk8pC9YV8NGWImrqHaR2jmRaZoLHtgMTQrhOAtwPaK3ZVnSMResLeXfjAYoraukQGsS1F3Rj8uAEMnt2OuvN3vyyahauK+Ct9QUUHDlO+9AgrhvUnWmZPbzaxy6EcI4EuJ9pdGhW7irhnQ2FfLz1INV1jcR3DGPS4O5MHpxAfMcwPt5axILsAlbtLkUpM2b7+qEJjOvf1enlBIQQ3icB7seq6xpYuvUQb28o5KtcM8GmXVAAtQ0OEqPDuX5oAlOHJvjFDFAh2iKPbOggfEN4iNkhfdLgeA5X1PD+xiL2lVZxzcBuDEuK9rsx9EIIQwLcz3RuH8qs0clWlyGE8AIZKyaEEDYlAS6EEDYlAS6EEDYlAS6EEDYlAS6EEDYlAS6EEDYlAS6EEDYlAS6EEDbl1an0SqliYJ+TL48FStxYjpXkvfgef3kfIO/FV7nyXnpqreNOP+jVAHeFUir7bGsB2JG8F9/jL+8D5L34Kk+8F+lCEUIIm5IAF0IIm7JTgP/T6gLcSN6L7/GX9wHyXnyV29+LbfrAhRBCnMpOLXAhhBAnkQAXQgibskWAK6XGK6W+VUrtUko9aHU9zlBK9VBKfa6U2qaU2qqUutfqmlyllApUSm1QSi22uhZXKKU6KqUWKqV2KKW2K6VGWF2Ts5RSv2j6/dqilJqvlAq1uqaWUkq9pJQ6rJTactKxaKXUJ0qp3KavnayssSXO8T6eavr92qSUWqSU6uiOa/l8gCulAoG/A1cD/YCblFL9rK3KKQ3AfVrrfsBw4Cc2fR8nuxfYbnURbvAs8LHWOg0YhE3fk1IqHvgvIFNrPQAIBG60tqpWeQUYf9qxB4FPtdapwKdNP/u6VzjzfXwCDNBaXwDsBOa440I+H+DAMGCX1nqP1roO+A8w0eKaWk1rXaS1Xt/0fQUmJOKtrcp5SqkE4FrgBatrcYVSKgoYC7wIoLWu01qXW1qUa4KAMKVUEBAOHLC4nhbTWq8Ayk47PBF4ten7V4FJ3qzJGWd7H1rrpVrrhqYf1wAJ7riWHQI8Hsg/6ecCbBx8AEqpJGAwsNbiUlzxZ+ABwGFxHa5KBoqBl5u6g15QSkVYXZQztNaFwNPAfqAIOKq1XmptVS7rorUuavr+INDFymLc5E7gI3ecyA4B7leUUpHAW8DPtdbHrK7HGUqpLOCw1nqd1bW4QRAwBPg/rfVgoAp7fEw/Q1P/8ETMP0rdgQil1C3WVuU+2ox5tvW4Z6XUw5ju1HnuOJ8dArwQ6HHSzwlNx2xHKRWMCe95Wuu3ra7HBaOA65RSeZgurcuUUnOtLclpBUCB1vrEp6GFmEC3oyuAvVrrYq11PfA2MNLimlx1SCnVDaDp62GL63GaUmomkAXM0G6agGOHAP8GSFVKJSulQjA3Zd6zuKZWU0opTD/rdq31/1pdjyu01nO01gla6yTM/4/PtNa2bOlprQ8C+Uqpvk2HLge2WViSK/YDw5VS4U2/b5dj0xuyJ3kPuL3p+9uBdy2sxWlKqfGYLsfrtNbV7jqvzwd4U8f/T4ElmF/GN7XWW62tyimjgFsxrdWcpv+usbooAcDPgHlKqU1ABvC4teU4p+lTxEJgPbAZ8/fbNlPRlVLzgdVAX6VUgVJqFvAH4EqlVC7mE8YfrKyxJc7xPv4GtAc+afq7/7xbriVT6YUQwp58vgUuhBDi7CTAhRDCpiTAhRDCpiTAhRDCpiTAhRDCpiTAhRDCpiTAhRDCpv4fVsEBtDRqRcYAAAAASUVORK5CYII=\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 }