Skip to content

Instantly share code, notes, and snippets.

@DBremen
Last active May 9, 2023 12:27
Show Gist options
  • Save DBremen/aa79538895bdc4d953f1516848b15010 to your computer and use it in GitHub Desktop.
Save DBremen/aa79538895bdc4d953f1516848b15010 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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