Last active
May 9, 2023 12:27
-
-
Save DBremen/aa79538895bdc4d953f1516848b15010 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "# Portfolio theory" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "<h1 id=\"tocheading\">Table of Contents</h1>\n<div id=\"toc\"></div>" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "%%javascript\n$.getScript('https://kmahelona.github.io/ipython_notebook_goodies/ipython_notebook_toc.js')", | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.Javascript object>", | |
"application/javascript": "$.getScript('https://kmahelona.github.io/ipython_notebook_goodies/ipython_notebook_toc.js')\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "import numpy as np\nimport pandas as pd\nimport pandas_datareader as pdr\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as mtick\nfrom pandas.plotting import register_matplotlib_converters\nregister_matplotlib_converters()\n#ax.yaxis.set_major_formatter(mtick.PercentFormatter())\npd.options.display.float_format = '${:,.2f}'.format\n%matplotlib inline\n#format DataFrame example\n#formatted = df.style.format({'EPS': '${:,.2f}', 'PE':'{:,.2f}', 'Exp_Ret': '{:,.2%}', 'Price': '${:,.2f}'})", | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Get one your worth of data for Apple and Gold and measure diff" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "stocks = 'AAPL GLD'.split()\nfrom datetime import datetime, timedelta\noneYearsAgo = (datetime.now() - timedelta(days=365)).date().isoformat()\ndata = pdr.get_data_yahoo(stocks, start=oneYearsAgo)['Close']\nvolatility = pd.DataFrame()\nfor stock in stocks:\n if stock not in volatility:\n volatility[stock] = np.log(data[stock]).diff()", | |
"execution_count": 31, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "volatility.info()", | |
"execution_count": 32, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": "<class 'pandas.core.frame.DataFrame'>\nDatetimeIndex: 253 entries, 2018-12-24 to 2019-12-24\nData columns (total 2 columns):\nAAPL 252 non-null float64\nGLD 252 non-null float64\ndtypes: float64(2)\nmemory usage: 5.9 KB\n", | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Measure annual Variance for Apple and Gold" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "#get annual variance\nvariance_aapl = volatility['AAPL'].var() * len(volatility['AAPL'])\nvariance_gld = volatility['GLD'].var() * len(volatility['GLD'])\nprint('AAPL variance: {}, Gold variance {}'.format(variance_aapl,variance_gld))", | |
"execution_count": 37, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": "AAPL variance: 0.07377679084088176, Gold variance 0.013643578043018223\n", | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Measure expected returns based on weights" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "#make up portfolio weights\nweight_aapl = .9\nweight_gld = 1 - weight_aapl\nexpectedReturn_aapl = .14\nexpectedReturn_gld = .07\nexpectedReturn = weight_aapl * expectedReturn_aapl + weight_gld * expectedReturn_gld\n'Expected return: {:,.2%}'.format(expectedReturn)", | |
"execution_count": 41, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 41, | |
"data": { | |
"text/plain": "'Expected return: 13.30%'" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Get annualized co-variance" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "#get the covariance annualized\n#ignore the first row since it contains NaN values\ncovariance = np.cov(volatility['AAPL'][1:],volatility['GLD'][1:])[0,1] * len(volatility['AAPL'])", | |
"execution_count": 44, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Get portfolio standard deviation" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "portfolio_stddev = np.sqrt(variance_aapl * weight_aapl **2 + variance_gld * weight_gld **2 + 2 * covariance * weight_aapl * weight_gld)\nportfolio_stddev", | |
"execution_count": 49, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 49, | |
"data": { | |
"text/plain": "0.241855424595427" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Get expected return and StdDev. based on step-wise weight" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "stepsize = .05\nsteps = int(1 / .05 + 1)\neffic = pd.DataFrame({'weight_aapl':np.zeros(steps), 'exp_ret': np.zeros(steps), 'stddev': np.zeros(steps)})\nw_aapl = 0.0\nfor weight in range(steps):\n w_gld = (1-w_aapl)\n effic['weight_aapl'][weight] = w_aapl\n effic['exp_ret'][weight] = w_aapl * expectedReturn_aapl + w_gld * expectedReturn_gld\n effic['stddev'][weight] = np.sqrt(variance_aapl * w_aapl ** 2 + variance_gld * w_gld ** 2 + covariance * w_aapl * w_gld) \n w_aapl = w_aapl + stepsize\neffic.style.format({\n 'weight_aapl': '{:,.2%}'.format,\n 'exp_ret': '{:,.2%}'.format,\n 'stddev': '{:,.2%}'.format,\n})\n\n", | |
"execution_count": 62, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 62, | |
"data": { | |
"text/plain": "<pandas.io.formats.style.Styler at 0x1b4e5d6ac08>", | |
"text/html": "<style type=\"text/css\" >\n</style><table id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0\" ><thead> <tr> <th class=\"blank level0\" ></th> <th class=\"col_heading level0 col0\" >weight_aapl</th> <th class=\"col_heading level0 col1\" >exp_ret</th> <th class=\"col_heading level0 col2\" >stddev</th> </tr></thead><tbody>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row0\" class=\"row_heading level0 row0\" >0</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row0_col0\" class=\"data row0 col0\" >0.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row0_col1\" class=\"data row0 col1\" >7.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row0_col2\" class=\"data row0 col2\" >11.68%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row1\" class=\"row_heading level0 row1\" >1</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row1_col0\" class=\"data row1 col0\" >5.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row1_col1\" class=\"data row1 col1\" >7.35%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row1_col2\" class=\"data row1 col2\" >11.01%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row2\" class=\"row_heading level0 row2\" >2</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row2_col0\" class=\"data row2 col0\" >10.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row2_col1\" class=\"data row2 col1\" >7.70%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row2_col2\" class=\"data row2 col2\" >10.53%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row3\" class=\"row_heading level0 row3\" >3</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row3_col0\" class=\"data row3 col0\" >15.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row3_col1\" class=\"data row3 col1\" >8.05%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row3_col2\" class=\"data row3 col2\" >10.26%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row4\" class=\"row_heading level0 row4\" >4</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row4_col0\" class=\"data row4 col0\" >20.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row4_col1\" class=\"data row4 col1\" >8.40%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row4_col2\" class=\"data row4 col2\" >10.22%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row5\" class=\"row_heading level0 row5\" >5</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row5_col0\" class=\"data row5 col0\" >25.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row5_col1\" class=\"data row5 col1\" >8.75%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row5_col2\" class=\"data row5 col2\" >10.40%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row6\" class=\"row_heading level0 row6\" >6</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row6_col0\" class=\"data row6 col0\" >30.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row6_col1\" class=\"data row6 col1\" >9.10%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row6_col2\" class=\"data row6 col2\" >10.81%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row7\" class=\"row_heading level0 row7\" >7</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row7_col0\" class=\"data row7 col0\" >35.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row7_col1\" class=\"data row7 col1\" >9.45%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row7_col2\" class=\"data row7 col2\" >11.42%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row8\" class=\"row_heading level0 row8\" >8</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row8_col0\" class=\"data row8 col0\" >40.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row8_col1\" class=\"data row8 col1\" >9.80%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row8_col2\" class=\"data row8 col2\" >12.18%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row9\" class=\"row_heading level0 row9\" >9</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row9_col0\" class=\"data row9 col0\" >45.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row9_col1\" class=\"data row9 col1\" >10.15%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row9_col2\" class=\"data row9 col2\" >13.09%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row10\" class=\"row_heading level0 row10\" >10</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row10_col0\" class=\"data row10 col0\" >50.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row10_col1\" class=\"data row10 col1\" >10.50%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row10_col2\" class=\"data row10 col2\" >14.11%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row11\" class=\"row_heading level0 row11\" >11</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row11_col0\" class=\"data row11 col0\" >55.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row11_col1\" class=\"data row11 col1\" >10.85%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row11_col2\" class=\"data row11 col2\" >15.22%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row12\" class=\"row_heading level0 row12\" >12</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row12_col0\" class=\"data row12 col0\" >60.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row12_col1\" class=\"data row12 col1\" >11.20%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row12_col2\" class=\"data row12 col2\" >16.39%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row13\" class=\"row_heading level0 row13\" >13</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row13_col0\" class=\"data row13 col0\" >65.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row13_col1\" class=\"data row13 col1\" >11.55%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row13_col2\" class=\"data row13 col2\" >17.63%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row14\" class=\"row_heading level0 row14\" >14</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row14_col0\" class=\"data row14 col0\" >70.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row14_col1\" class=\"data row14 col1\" >11.90%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row14_col2\" class=\"data row14 col2\" >18.91%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row15\" class=\"row_heading level0 row15\" >15</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row15_col0\" class=\"data row15 col0\" >75.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row15_col1\" class=\"data row15 col1\" >12.25%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row15_col2\" class=\"data row15 col2\" >20.22%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row16\" class=\"row_heading level0 row16\" >16</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row16_col0\" class=\"data row16 col0\" >80.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row16_col1\" class=\"data row16 col1\" >12.60%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row16_col2\" class=\"data row16 col2\" >21.57%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row17\" class=\"row_heading level0 row17\" >17</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row17_col0\" class=\"data row17 col0\" >85.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row17_col1\" class=\"data row17 col1\" >12.95%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row17_col2\" class=\"data row17 col2\" >22.94%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row18\" class=\"row_heading level0 row18\" >18</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row18_col0\" class=\"data row18 col0\" >90.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row18_col1\" class=\"data row18 col1\" >13.30%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row18_col2\" class=\"data row18 col2\" >24.33%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row19\" class=\"row_heading level0 row19\" >19</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row19_col0\" class=\"data row19 col0\" >95.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row19_col1\" class=\"data row19 col1\" >13.65%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row19_col2\" class=\"data row19 col2\" >25.74%</td>\n </tr>\n <tr>\n <th id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0level0_row20\" class=\"row_heading level0 row20\" >20</th>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row20_col0\" class=\"data row20 col0\" >100.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row20_col1\" class=\"data row20 col1\" >14.00%</td>\n <td id=\"T_e5292a76_275c_11ea_afed_74e5f95307e0row20_col2\" class=\"data row20 col2\" >27.16%</td>\n </tr>\n </tbody></table>" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "with plt.style.context('seaborn'):\n plt.scatter(effic['stddev'],effic['exp_ret'])\n plt.xlabel('StdDev/Risk')\n plt.ylabel('Expected Return')", | |
"execution_count": 66, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<Figure size 576x396 with 1 Axes>", | |
"image/png": "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s8r79uWXX2rp0qV64YUX1KFDB89yq+9r3vqyw77mrTc77GveeqsULPsa3yZXiz179mj58uVyu91KT0/X7NmztWbNGvXp00fJyclyOp2aO3euioqK1KxZM11zzTXKysqSdPm6zJ///GdJ0r333qv09HRJUk5Ojh599FFdunRJw4YN02OPPeb301BX2tdf//pXLVq0SN26dfO81u9//3v16tVLt99+uwoLC2UYhnr27KnHH39crVq18mtfDent4MGD+u1vf+s5vXv77bdrypQpki5/dOfBBx/UuXPn1KtXLz3zzDPV/mIP5t4k6dSpU7rtttu0Z8+eKjfhWeV9u/POO3XkyBFFRkZKkmJjY/Xiiy9Ksva+5q0vO+xr3nqzw75W2/8fg2lfI+ABALAhTtEDAGBDBDwAADZEwAMAYEMEPAAANkTAAwBgQwQ8YANbt27VpEmTlJqaqltuuUULFiyQJK1du7bWkZiPPPKI/vKXv3ieO3jwYE2aNEkpKSlKT0/Xf//3f8vtdje4vry8PGVkZEiSkpKSdMstt2jixIkaM2aM3nrrLc/zdu7cqZUrV9b6WmvXrvX5HABSSKALANAw+fn5evzxx5WZmanY2FgZhqGvvvpKkvTcc8/prrvuqvNniSdNmqSHH35Y0uXPJC9cuFAnT57UkiVLGlTjjh07qgwL+dOf/qQePXroyJEjSktL07BhwxQdHa3k5GS/D6QB7IojeMDivv/+e4WEhCg8PFzS5bnZvXr10uOPPy5JuvXWW5WamqqioiK5XC7dcccdmjhxou677z4VFhZ6fd24uDg99dRTeuONN3T+/HlJlweA3HrrrUpLS9PUqVP1j3/8Q5J0xx13eL40RJJ27dql//iP//A83rlzZ43B3aNHD7Vt29bzZR6bN2/WvHnzJEnHjx/X1KlTNXHiRI0fP17r16+vtv3XX3+tCRMm6OOPP67XfzPgasARPGBxPXv2VN++fTVixAjddNNNuuGGG5Samqrf/va3ev311/U///M/nolZixcv1o033qi5c+cqNzdXEydO1NChQ72+dteuXdW8eXN98803Cg8P1/PPP6/169erdevWOnr0qGbNmqXdu3dr8uTJeueddzRy5EhJl8eMVk6UKyoq0r/+9S9df/311V7/008/VUREhHr27Flt3euvv65hw4Zpzpw5ki6POP2p/fv3a/ny5Vq9enWViW8ALiPgAYtr0qSJnn/+eR05ckQHDhzQjh07tH79er377rvVnvvRRx95TrfHxcVp8ODBdf492dnZOnnypKZPn+5ZVl5eru+//14pKSlasWKFCgoK5HA49PHHH3uuk+/Zs0fDhw+v8lrz5s2TYRjKzc3Vc889V+MlhBtvvFErV65UWVmZbrrpJg0aNMizbt++fcrOztb69es9X1wCoCoCHrCJHj16qEePHpo+fbrGjh3bKKetjx8/rkuXLqlLly7KycnR0KFD9fTTT9f43OTkZM/s++TkZLVs2VLS5evv06ZNq/LcymvwW7du1cKFC7V9+3Zdc801VZ6TkpKifv366YMPPtC6deu0adMmPfPMM5Kkzp076+jRozp06BABD3jBNXjA4lwulz777DPP47y8PBUUFKhjx45q1aqViouLPesGDRqkTZs2Sbp8E93+/fu9vu6pU6e0ePFi3XbbbWrdurUSExOVnZ2to0ePep7jdDo9P6elpSkzM1OZmZlKS0uTdPlb0XJycvTLX/6yxt8xZswYJSYm1vjd2P/3f/+nyMhIpaWlac6cOVW+XvPaa6/Vhg0b9Mc//lHvvfeer/9EwFWJI3jA4srLy7V27Vp9++23at68uSoqKjR//nz17t1bd911l26//XY1b95cr776qhYvXqyHHnpI27ZtU+fOnZWYmFjltd555x3t379fFy9eVOvWrTVhwgTPzXKdOnXSqlWrtHjxYl26dEllZWW64YYb1LdvX0nSgAEDPH9MDBgwQNLl6+QDBgxQSIj3f2oWLFigtLQ0zZo1q8ryrVu36t1331VoaKgcDocWLVpUZX1MTIz+67/+SzNmzNDFixc91/wBXMa3yQEwzdKlS5WYmKiUlJRAlwJcdQh4AABsiGvwAADYEAEPAIANEfAAANgQAQ8AgA0R8AAA2BABDwCADRHwAADY0P8DAiOH9kzf7eMAAAAASUVORK5CYII=\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# to add a third security and get additional benefit from diversification you would need to adjust the weights\n# accordingly and add in terms for covariation of security 1 & 3 and security 2 & 3\n# so for an equal weight portfolio it would look something like this:\n# np.sqrt(.333 ** 2 * sec1_var + .333 ** 2 * sec2_var + .333 ** 2 * sec3_var + \n# 2 * cov_sec1_sec2 + 2 * cov_sec_1_sec2 + 2 * cov_sec2_sec3)", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3", | |
"language": "python" | |
}, | |
"language_info": { | |
"name": "python", | |
"version": "3.7.4", | |
"mimetype": "text/x-python", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"pygments_lexer": "ipython3", | |
"nbconvert_exporter": "python", | |
"file_extension": ".py" | |
}, | |
"toc": { | |
"nav_menu": {}, | |
"number_sections": true, | |
"sideBar": true, | |
"skip_h1_title": false, | |
"base_numbering": 1, | |
"title_cell": "Table of Contents", | |
"title_sidebar": "Contents", | |
"toc_cell": false, | |
"toc_position": {}, | |
"toc_section_display": true, | |
"toc_window_display": false | |
}, | |
"gist": { | |
"id": "aa79538895bdc4d953f1516848b15010", | |
"data": { | |
"description": "Portfolio theory https://nbviewer.jupyter.org/gist/DBremen/aa79538895bdc4d953f1516848b15010 ", | |
"public": true | |
} | |
}, | |
"_draft": { | |
"nbviewer_url": "https://gist.github.com/aa79538895bdc4d953f1516848b15010" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment