├── README.md └── jupyter ├── .ipynb_checkpoints ├── Capital Asset Pricing Model Implementation-checkpoint.ipynb ├── Capital Asset Pricing Model-checkpoint.ipynb ├── Modern Portfolio Implementation -checkpoint.ipynb ├── Modern Portfolio Theory-checkpoint.ipynb ├── Stock Market Basics -checkpoint.ipynb └── Untitled-checkpoint.ipynb ├── Capital Asset Pricing Model Implementation.ipynb ├── Capital Asset Pricing Model.ipynb ├── Modern Portfolio Implementation .ipynb ├── Modern Portfolio Theory.ipynb ├── Stock Market Basics .ipynb ├── Untitled.ipynb └── images ├── CML2.jpg ├── SML.jpg ├── cal.png ├── efficientfrontier.png ├── lin_regress.png └── markowitz_port_optimization.png /README.md: -------------------------------------------------------------------------------- 1 | # Quantitative-Finance-Algorithmic-Trading-in-Python 2 | Quantitative Finance & Algorithmic Trading in Python course of Udemy 3 | 4 | This repository contains my jupyter notebooks and code for the udemy course Quantitative-Finance-Algorithmic-Trading-in-Python 5 | 6 | Quantitative Finance & Algorithmic Trading in Python 7 | -------------------------------------------------------------------------------- /jupyter/.ipynb_checkpoints/Capital Asset Pricing Model Implementation-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /jupyter/.ipynb_checkpoints/Capital Asset Pricing Model-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Capital Asset Pricing Model\n", 8 | "\n", 9 | "Markowitz-model work fine, BUT we can not get rid of all risk by diversification!\n", 10 | "\n", 11 | "_*There are two types of risk:*_\n", 12 | "1. Unsystematic risk: \"Specific Risk\" - This is the risk specific to individual stocks. It can be diversified away by incresing the number of stocks in the portfolio\n", 13 | "\n", 14 | "**Unsystematic Risk is the component of a stock's return that is not correlated with market moves**\n", 15 | "\n", 16 | "2. Systematic Risk: \"Market Risk\" - This risk can not be diversified away. For example: interest rates, recession or wat\n", 17 | "\n", 18 | "**Capital Risk Pricing Model measures this risk**\n", 19 | "
\n", 20 | "\n", 21 | "## Expected Return\n", 22 | "It was formulated in the early 1960s by Sharpe and his colleagues\n", 23 | "\n", 24 | "**Note: ** We use SPY500 as a represention of them arket as a whole\n", 25 | "\n", 26 | "\n", 27 | "$E[r_a] = r_f + \\beta_a(E[r_m]-r_f)$\n", 28 | "\n", 29 | "- $E[r_a]$ = The expected return of investment: it may be a single stock or a portfolio *effecient or not it does not matter*\n", 30 | "\n", 31 | "- $r_f$ = Base return because of risk-free rate\n", 32 | "- $\\beta_a(E[r_m]-r_f)$ = Market excess return multiplied by a factor *(beta)*\n", 33 | "\n", 34 | "**Linear relationship between any stock expected return and market premium!**\n", 35 | "\n", 36 | "$\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 37 | "\n", 38 | "- According to **CAPM** *beta* is the only relevant measure of a stock's risk\n", 39 | "- Measures the stock's relative volatility: how much the price of a given stock goes up/down compared to that of the whole market\n", 40 | "\n", 41 | "
\n", 42 | "\n", 43 | "## Beta Value\n", 44 | "\n", 45 | "$\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 46 | "\n", 47 | "beta = how risky your portfolio is relative to the market\n", 48 | "\n", 49 | "- If your portfolio has no risk: your expected return is the risk-free return\n", 50 | "\n", 51 | "- If your portfolio is more risky than the market: your expected return will be higher\n", 52 | "\n", 53 | "- If you portfolio is less rsky than the market: your expected return will be less\n", 54 | "\n", 55 | "We know how to calculate the $\\beta$ value for a single stock: \n", 56 | "- Just calculate the covariance between stock and market (SPY500) over the variance of the market\n", 57 | "$~~~\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 58 | "\n", 59 | "***How to deal with a portfolio containing several stocks?***\n", 60 | "\n", 61 | "A given portfolio's $\\beta$ beta value is the weighted sum of the stocks' betas within one portfolio\n", 62 | "
$\\beta_a = w_1\\beta_1 + w_2\\beta_2 + \\cdots + w_n\\beta_n$
\n", 63 | "\n", 64 | "The weights are the same as:\n", 65 | "\n", 66 | "\n", 67 | " stock: APPL GOOGL TSLA GE\n", 68 | " Precent: 20% 30% 25% 25%\n", 69 | " Weight: 0.2 0.3 0.25 0.25\n", 70 | " Weights = [0.2,0.3,0.25,0.25] = 1 (100%)\n", 71 | "\n", 72 | "$\\beta_a$ is a linear combination of $\\vec{b} \\cdot \\vec{w}$\n", 73 | "\\begin{equation}\n", 74 | "\\beta_a =\n", 75 | " \\vec{b}=\\begin{bmatrix}\n", 76 | " b_1 \\\\\n", 77 | " b_2 \\\\\n", 78 | " \\vdots\\\\\n", 79 | " b_n\\\\\n", 80 | " \\end{bmatrix}\n", 81 | "\\cdot\n", 82 | " \\vec{w}=\\begin{bmatrix}\n", 83 | " w_1 \\\\\n", 84 | " w_2 \\\\\n", 85 | " \\vdots\\\\\n", 86 | " w_n\\\\\n", 87 | " \\end{bmatrix}\n", 88 | "\\end{equation}\n" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": { 94 | "collapsed": true 95 | }, 96 | "source": [ 97 | "## Linear Regression w/ CAMP\n", 98 | "\n", 99 | "
$E[r_a] - r_f = \\alpha + \\beta(E[r_m]-r_f)$
\n", 100 | "\n", 101 | "Beta is the only relevant measure of risk: determines the additional premium beyond the risk-free rate\n", 102 | "\n", 103 | "**What is $\\alpha$ alpha?**\n", 104 | "\n", 105 | "*alpha $\\alpha$* is the difference between the actual return and the expected return.\n", 106 | "\n", 107 | "
$\\alpha = E[r_a] - (r_f + \\beta(E[r_m]-r_f))$
\n", 108 | "\n", 109 | "**For example:**\n", 110 | " CAPM may estimate that a portfolio should return **15%**, but it actually earned **20%**. In this case alpha is the difference so **+5%**\n", 111 | "\n", 112 | "***FOR CAPM ALPHA IS ZERO!***\n", 113 | "\n", 114 | "\n", 115 | "***Why use monthly returns?***\n", 116 | "- use daily returns if you want to deal with microscopic data. For example holidays, etc.\n", 117 | "- Daily returns are best for superior sgort-term tactical forecasting\n", 118 | "- For long term models **monthly returns** are favourable. The main benefit is that with monthly data, returns are at least approximately normall distributed\n", 119 | "\n", 120 | "***Most of the models assume normal Distribution*** \n", 121 | "\n", 122 | "$\\beta = 0.5$ less volatile than the market\n", 123 | "\n", 124 | "- Stock market goes up by 10% -> this stock goes up by 5%\n", 125 | "- Stock market falls by 2% -> this stock falls by 1%\n", 126 | "\n", 127 | "$\\beta = 1.5$ 50% more volatile than the market\n", 128 | "\n", 129 | "- Stock market goes up by 10% -> this stock goes up by 15%\n", 130 | "- Stock market falls by 2% -> this stock falls by 3%" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": { 137 | "collapsed": true 138 | }, 139 | "outputs": [], 140 | "source": [ 141 | "$" 142 | ] 143 | } 144 | ], 145 | "metadata": { 146 | "kernelspec": { 147 | "display_name": "Python 3", 148 | "language": "python", 149 | "name": "python3" 150 | }, 151 | "language_info": { 152 | "codemirror_mode": { 153 | "name": "ipython", 154 | "version": 3 155 | }, 156 | "file_extension": ".py", 157 | "mimetype": "text/x-python", 158 | "name": "python", 159 | "nbconvert_exporter": "python", 160 | "pygments_lexer": "ipython3", 161 | "version": "3.6.3" 162 | } 163 | }, 164 | "nbformat": 4, 165 | "nbformat_minor": 2 166 | } 167 | -------------------------------------------------------------------------------- /jupyter/.ipynb_checkpoints/Modern Portfolio Theory-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /jupyter/.ipynb_checkpoints/Stock Market Basics -checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /jupyter/.ipynb_checkpoints/Untitled-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEICAYAAABPgw/pAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAEh5JREFUeJzt3X2QnWdZx/HvRV8zXeiLhWOaRhaH\nimIDdbIURsDZpaCFztjC4GBHajJUFx1xcMgfZsCRjogWpZR/HDWlSHRKFygt7bSIxshSKy+6qbFp\njdACgSatCbVpyJYIpL38Y580Z8NuznPOnre98/3M7OxznnM/51x79fSXe5+9z3MiM5EkLX/PGnQB\nkqTuMNAlqRAGuiQVwkCXpEIY6JJUCANdkgphoOuEERHrI+KeQdch9YqBruJExKsi4osRcSAiHo+I\nf42Ilw26LqnXTh50AVI3RcRzgDuB3wY+CZwKvBr4/iDrkvrBGbpK81MAmXlzZj6VmYcy8x8z874j\nAyLigxGxPyK+GRGvb9p/XkTcUc3qH4qI32y675qIuCUiPhERByPi3oh4aX9/NOn4DHSV5mvAUxGx\nOSJeHxFnH3P/y4GvAucCfwbcGBFR3XczsBs4D3gz8CcRcUnTsZcDnwLOAT4OfCYiTundjyK1x0BX\nUTLzu8CrgARuAL5Tzbob1ZBvZeYNmfkUsBlYCTQiYnV13O9n5v9l5nbgI8BVTQ+/LTNvycwfAh8C\nTgde0Z+fTGrNQFdxMnNnZq7PzPOBC5mbcX+4uvt/msZ9r9ocqcY8npkHmx7qW8CqptsPNx37NEdn\n89JQMNBVtMz8b+BjzAX78TwCnBMRz27a9xPAnqbbq49sRMSzgPOr46ShYKCrKBHx0xGxISLOr26v\nBq4Evny84zLzYeCLwJ9GxOkR8RLgauCmpmFrI+JNEXEy8HvMrZw57uNK/WSgqzQHmfvD51ci4knm\nAvd+YEONY68ERpmbdd8GvDcztzTdfzvwFmA/c+fW31SdT5eGQvgBF1JrEXEN8MLMfOuga5EW4wxd\nkgphoEtSITzlIkmFcIYuSYVoeXGuiDgduBs4rRp/S2a+NyJeAEwx9zboe4GrMvMHx3usc889N0dH\nR5dcdC89+eSTnHHGGYMuY2jYj/nsx3z246he9mLbtm2PZeZzW42rc7XF7wOvyczZ6roV90TE3wPv\nAq7PzKmI+Cvm1uz+5fEeaHR0lJmZmRpPOTjT09OMj48PuoyhYT/msx/z2Y+jetmLiPhWnXEtT7nk\nnNnq5inVVwKvAW6p9m8GruigTklSl9Q6hx4RJ0XEdmAfsAX4OvBEZh6uhuxm/jUvJEl91tYql4g4\ni7l30P0h8DeZ+cJq/2rgs5m5ZoFjJoFJgEajsXZqaqobdffM7OwsIyMjgy5jaNiP+ezHfPbjqF72\nYmJiYltmjrUa19YnFmXmExExzdwlQ8+KiJOrWfqiFynKzE3AJoCxsbEc9vNtnhOcz37MZz/msx9H\nDUMvWp5yiYjnVjNzImIF8FpgJ/B55j4EAGAdc9e5kCQNSJ0Z+kpgc0ScxNw/AJ/MzDsj4r+AqYj4\nY+A/gBt7WKckqYWWgV59FuPPLbD/G8DFvShKktQ+3ykqSYUw0CWpEG2tcpFUvtGNdz2zvevaywZY\nidrlDF2SCmGgS1IhDHRJKoSBLkmFMNAlqRAGuiQVwmWLknrGJZD95QxdkgphoEtSIQx0SSqEgS5J\nhTDQJakQBrokFcJli5LadmQ54oY1h1nftDQRXJ44SM7QJakQBrokFcJAl6RCGOiSVAgDXZIKYaBL\nUiEMdEkqhIEuSYUw0CWpEAa6JBWiZaBHxOqI+HxE7IyIByLindX+ayJiT0Rsr77e0PtyJUmLqXMt\nl8PAhsy8NyKeDWyLiC3Vfddn5gd7V54kqa6WgZ6ZjwKPVtsHI2InsKrXhUmS2hOZWX9wxChwN3Ah\n8C5gPfBdYIa5Wfz+BY6ZBCYBGo3G2qmpqaXW3FOzs7OMjIwMuoyhYT/mOxH6sWPPgWe216w6c8H9\nRzRWwN5D9R63+bFK1MvXxsTExLbMHGs1rnagR8QI8AXg/Zl5a0Q0gMeABN4HrMzMtx3vMcbGxnJm\nZqbW8w3K9PQ04+Pjgy5jaNiP+U6Efow2XQ63+VK4o8dcJhfmLp973Y56V+Eu/bK6vXxtREStQK+1\nyiUiTgE+DdyUmbcCZObezHwqM58GbgAuXkrBkqSlqbPKJYAbgZ2Z+aGm/Subhr0RuL/75UmS6qrz\nu9IrgauAHRGxvdr3buDKiLiIuVMuu4C396RCSVItdVa53APEAnd9tvvlSJI65TtFJakQBrokFcJA\nl6RCGOiSVAgDXZIKYaBLUiEMdEkqhIEuSYUw0CWpEPUukyapaAtdSfF4+zWcnKFLUiEMdEkqhIEu\nSYUw0CWpEAa6JBXCQJekQhjoklQIA12SCmGgS1IhDHRJKoSBLkmFMNAlqRAGuiQVwkCXpEIY6JJU\nCANdkgphoEtSIVoGekSsjojPR8TOiHggIt5Z7T8nIrZExIPV97N7X64kaTF1ZuiHgQ2Z+TPAK4Df\niYgXAxuBrZl5AbC1ui1JGpCWgZ6Zj2bmvdX2QWAnsAq4HNhcDdsMXNGrIiVJrUVm1h8cMQrcDVwI\nfDszz2q6b39m/shpl4iYBCYBGo3G2qmpqSWW3Fuzs7OMjIwMuoyhYT/mK7UfO/Yc6Oi4xgrYe6je\n2DWrzuzoOZaLXr42JiYmtmXmWKtxtQM9IkaALwDvz8xbI+KJOoHebGxsLGdmZmo936BMT08zPj4+\n6DKGhv2Yr9R+jG68q6PjNqw5zHU7Tq41dte1l3X0HMtFL18bEVEr0GutcomIU4BPAzdl5q3V7r0R\nsbK6fyWwr9NiJUlLV2eVSwA3Ajsz80NNd90BrKu21wG3d788SVJddX5XeiVwFbAjIrZX+94NXAt8\nMiKuBr4N/EpvSpQk1dEy0DPzHiAWufuS7pYjSeqU7xSVpELU+/O0JC1R80qa0le8DIozdEkqhIEu\nSYUw0CWpEAa6JBXCQJekQhjoklQIly1KJ6hOL8il4eUMXZIKYaBLUiEMdEkqhIEuSYUw0CWpEAa6\nJBXCQJekQhjoklQIA12SCmGgS1IhDHRJKoSBLkmFMNAlqRAGuiQVwkCXpEIY6JJUCANdkgphoEtS\nIVoGekR8NCL2RcT9TfuuiYg9EbG9+npDb8uUJLVSZ4b+MeDSBfZfn5kXVV+f7W5ZkqR2tQz0zLwb\neLwPtUiSliAys/WgiFHgzsy8sLp9DbAe+C4wA2zIzP2LHDsJTAI0Go21U1NTXSi7d2ZnZxkZGRl0\nGUPDfsy3HPuxY8+BZ7bXrDpzwf2daqyAvYfaP665jlL08rUxMTGxLTPHWo3rNNAbwGNAAu8DVmbm\n21o9ztjYWM7MzLR8vkGanp5mfHx80GUMDfsx33Lsx+jGu57Z3nXtZQvu79SGNYe5bsfJbR/XXEcp\nevnaiIhagd7RKpfM3JuZT2Xm08ANwMWdPI4kqXs6CvSIWNl0843A/YuNlST1R8vflSLiZmAcODci\ndgPvBcYj4iLmTrnsAt7ewxolSTW0DPTMvHKB3Tf2oBZJ0hL4TlFJKkT7f56WtGx1Y2WLhpczdEkq\nhIEuSYUw0CWpEAa6JBXCQJekQhjoklQIA12SCmGgS1IhDHRJKoSBLkmFMNAlqRAGuiQVwkCXpEIY\n6JJUCANdkgphoEtSIQx0SSqEgS5JhTDQJakQBrokFcIPiZY0UM0fXL3r2ssGWMny5wxdkgphoEtS\nIQx0SSpEy0CPiI9GxL6IuL9p3zkRsSUiHqy+n93bMiVJrdSZoX8MuPSYfRuBrZl5AbC1ui1JGqCW\ngZ6ZdwOPH7P7cmBztb0ZuKLLdUmS2hSZ2XpQxChwZ2ZeWN1+IjPParp/f2YueNolIiaBSYBGo7F2\namqqC2X3zuzsLCMjI4MuY2jYj/mWSz927DnQl+dprIC9h9o/bs2qM5/Zbq61zv5h1cvXxsTExLbM\nHGs1rufr0DNzE7AJYGxsLMfHx3v9lEsyPT3NsNfYT/ZjvuXSj/VNa7t7acOaw1y3o/0Y2fVr489s\nN9daZ/+wGobXRqerXPZGxEqA6vu+7pUkSepEp4F+B7Cu2l4H3N6dciRJnaqzbPFm4EvAiyJid0Rc\nDVwLvC4iHgReV92WJA1Qy5NfmXnlIndd0uVaJElL4DtFJakQBrokFcLL50rLTAmXmx3t0rLKEnrR\nTc7QJakQBrokFcJAl6RCGOiSVAgDXZIKYaBLUiFctigtYy7bUzNn6JJUCANdkgphoEtSIQx0SSqE\ngS5JhTDQJakQLluUNDQWuwqjyzPrcYYuSYUw0CWpEAa6JBXCQJekQhjoklQIA12SCuGyRUnLih8w\nvThn6JJUCANdkgphoEtSIZZ0Dj0idgEHgaeAw5k51o2iJEnt68YfRScy87EuPI4kaQk85SJJhYjM\n7PzgiG8C+4EE/jozNy0wZhKYBGg0GmunpqY6fr5+mJ2dZWRkZNBlDA37Md8w9GPHngML7l+z6syW\nY7qtsQL2HurLU7W02M/fvL9ZnTHt6OVrY2JiYludU9pLDfTzMvORiHgesAX43cy8e7HxY2NjOTMz\n0/Hz9cP09DTj4+ODLmNo2I/5hqEfi63Dbl5L3a212q1sWHOY63YMx9tZFvv5F1tj3u116L18bURE\nrUBf0imXzHyk+r4PuA24eCmPJ0nqXMeBHhFnRMSzj2wDvwjc363CJEntWcrvSg3gtog48jgfz8zP\ndaUqSVLbOg70zPwG8NIu1iJJWgKXLUpSIYbjz9OSfkS7qzD6tbJlWJ3oPz84Q5ekYhjoklQIA12S\nCmGgS1IhDHRJKoSBLkmFcNmi1GUlfvhw6Ur5b+YMXZIKYaBLUiEMdEkqhIEuSYUw0CWpEAa6JBXC\nQJekQrgOXeqCOpduXWytc7sfaKz+WW7r052hS1IhDHRJKoSBLkmFMNAlqRAGuiQVwkCXpEIsm2WL\ny2350IngRPhvcuxywQ1rDrO+h0sIXZ7Yfd3qabuv92Oftx//jzhDl6RCGOiSVAgDXZIKsaRAj4hL\nI+KrEfFQRGzsVlGSpPZ1HOgRcRLwF8DrgRcDV0bEi7tVmCSpPUuZoV8MPJSZ38jMHwBTwOXdKUuS\n1K7IzM4OjHgzcGlm/kZ1+yrg5Zn5jmPGTQKT1c0XAV/tvNy+OBd4bNBFDBH7MZ/9mM9+HNXLXjw/\nM5/batBS1qHHAvt+5F+HzNwEbFrC8/RVRMxk5tig6xgW9mM++zGf/ThqGHqxlFMuu4HVTbfPBx5Z\nWjmSpE4tJdD/HbggIl4QEacCvwrc0Z2yJEnt6viUS2Yejoh3AP8AnAR8NDMf6Fplg7NsTg/1if2Y\nz37MZz+OGngvOv6jqCRpuPhOUUkqhIEuSYU44QM9Is6JiC0R8WD1/ewFxjw/IrZFxPaIeCAifmsQ\ntfZDzX5cFBFfqnpxX0S8ZRC19kOdflTjPhcRT0TEnf2usddaXeIjIk6LiE9U938lIkb7X2X/1OjH\nL0TEvRFxuHq/Tt+c8IEObAS2ZuYFwNbq9rEeBX4+My8CXg5sjIjz+lhjP9Xpx/eAX8/MnwUuBT4c\nEWf1scZ+qtMPgD8HrupbVX1S8xIfVwP7M/OFwPXAB/pbZf/U7Me3gfXAx/tbnYEOc5cr2Fxtbwau\nOHZAZv4gM79f3TyNsvtWpx9fy8wHq+1HgH1Ay3exLVMt+wGQmVuBg/0qqo/qXOKjuUe3AJdExEJv\nPCxBy35k5q7MvA94ut/FlRxMdTUy81GA6vvzFhoUEasj4j7gYeADVZCVqFY/joiIi4FTga/3obZB\naKsfBVrF3Gv+iN3VvgXHZOZh4ADwY32prv/q9GNgls1H0C1FRPwT8OML3PWeuo+RmQ8DL6lOtXwm\nIm7JzL3dqrGfutGP6nFWAn8HrMvMvs9GuqVb/ShUnUt81LoMSCGG+mc9IQI9M1+72H0RsTciVmbm\no1VA7WvxWI9ExAPAq5n79XLZ6UY/IuI5wF3AH2Tml3tUal908/VRoDqX+DgyZndEnAycCTzen/L6\nbqgveeIpl7nLFayrttcBtx87ICLOj4gV1fbZwCsZ/qtGdqpOP04FbgP+NjM/1cfaBqFlPwpX5xIf\nzT16M/DPWe47Fof7kieZeUJ/MXeubyvwYPX9nGr/GPCRavt1wH3Af1bfJwdd94D78Vbgh8D2pq+L\nBl37oPpR3f4X4DvAIeZmcb806Nq72IM3AF9j7u8k76n2/RHwy9X26cCngIeAfwN+ctA1D7gfL6te\nA08C/ws80K/afOu/JBXCUy6SVAgDXZIKYaBLUiEMdEkqhIEuSYUw0CWpEAa6JBXi/wFBvTs2IPPY\negAAAABJRU5ErkJggg==\n", 11 | "text/plain": [ 12 | "" 13 | ] 14 | }, 15 | "metadata": {}, 16 | "output_type": "display_data" 17 | } 18 | ], 19 | "source": [ 20 | "import numpy as np\n", 21 | "import pandas_datareader as web\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "\n", 24 | "stocks = ['Shop']\n", 25 | "\n", 26 | "startDate = '01/01/2001'\n", 27 | "endDate = '01/01/2017'\n", 28 | "\n", 29 | "data = web.DataReader(stocks,data_source='yahoo',start=startDate,end=endDate)['Adj Close']\n", 30 | "\n", 31 | "dailyReturns = (data/data.shift(1))-1\n", 32 | "dailyReturns.hist(bins=100)\n", 33 | "plt.show()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "collapsed": true 41 | }, 42 | "outputs": [], 43 | "source": [] 44 | } 45 | ], 46 | "metadata": { 47 | "kernelspec": { 48 | "display_name": "Python 3", 49 | "language": "python", 50 | "name": "python3" 51 | }, 52 | "language_info": { 53 | "codemirror_mode": { 54 | "name": "ipython", 55 | "version": 3 56 | }, 57 | "file_extension": ".py", 58 | "mimetype": "text/x-python", 59 | "name": "python", 60 | "nbconvert_exporter": "python", 61 | "pygments_lexer": "ipython3", 62 | "version": "3.6.3" 63 | } 64 | }, 65 | "nbformat": 4, 66 | "nbformat_minor": 2 67 | } 68 | -------------------------------------------------------------------------------- /jupyter/Capital Asset Pricing Model Implementation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Captial Asset Pricing Model Implementation\n", 8 | "\n", 9 | "Appicable Equations:\n", 10 | "\n", 11 | "$E[r_a] = r_f + \\beta_a(E[r_m]-r_f)$\n", 12 | "\n", 13 | "- $E[r_a]$ = The expected return of investment: it may be a single stock or a portfolio *effecient or not it does not matter*\n", 14 | "\n", 15 | "- $r_f$ = Base return because of risk-free rate\n", 16 | "- $\\beta_a(E[r_m]-r_f)$ = Market excess return multiplied by a factor *(beta)*\n", 17 | "\n", 18 | "
$\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$
\n", 19 | "\n", 20 | "
$\\beta_a = w_1\\beta_1 + w_2\\beta_2 + \\cdots + w_n\\beta_n$
\n", 21 | "\n", 22 | "
$\\alpha = E[r_a] - (r_f + \\beta(E[r_m]-r_f))$
" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 25, 28 | "metadata": {}, 29 | "outputs": [ 30 | { 31 | "name": "stdout", 32 | "output_type": "stream", 33 | "text": [ 34 | "[[ 0.00230049 0.00093755]\n", 35 | " [ 0.00093755 0.00131399]]\n", 36 | "Beta from formula: 0.713510389352\n", 37 | "Beta from regression: 0.713510389352\n" 38 | ] 39 | }, 40 | { 41 | "data": { 42 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJoCAYAAAC3G1IbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xl8VNXdx/HvjxBMKkgQUEkQAbVR\nESGAUKEoSm3QR1ukbmhxqdXaulSxqVtbEPqILYpa7eb61AUpKlBKFcTaKBW1AgFBFBeWQlDEJaxB\nQ3KeP+6dMFkmmUkyd5Z83q9XXiZ3zr33Nzfnpsy355xrzjkBAAAAAAAAQWqT6AIAAAAAAADQ+hBK\nAQAAAAAAIHCEUgAAAAAAAAgcoRQAAAAAAAACRygFAAAAAACAwBFKAQAAAAAAIHCEUgAAJAEzu9DM\nXmjG/sVm9sOWrCmZRHt9zOwWM3soiJpagpmNMLNNUbadaGZPRNnWzOxRM/vCzP5jZsPNbE0z6nRm\ndoT//Z/M7JdNPVYzavg/M/t1S7dNFma23sy+FeG1lHs/AABEg1AKAIAYmNkFZrbEzHaa2Udm9ryZ\nfbO5x3XOPemc+3bYeapDgJZiZpf4xz23JY9bz3l6+udp20CbiWZW4V/HMjNbbGYnRGpf+/o00O52\n51xcwjn/PW0Jf19m1tbMPjEzF49zNsM3JZ0qqbtzbrBzbpFzLr8lDuycu9I5N7kljoX4I9ACACQz\nQikAAKJkZuMl3SPpdkkHS+oh6Q+SvpvIumJwsaTP/f8mg78659pL6irp35JmmZnVbtRQuJUAZZJO\nC/v5dElfJKiWhhwmab1zbleiCwEAAIiEUAoAgCiYWUdJkyRd5Zyb5Zzb5ZyrcM793TlX5LcZbGav\n+SN/PjKz+82sXdgxnJlda2ZrzexTM5tqZm381y4xs3/737/i77LCH0l0npl1MrN5ZrbVn5I1z8y6\nx1D/YZJOknSFpEIzOzjstS7+8crM7HMzWxRW141mVmpmO8xsjZmN9Le3MbObzOxDM/vMzGaa2YH+\nIUP1l/n1RxwBJUnOuQpJf5F0iKTO/rV41czuNrPPJU0Mvz7++fuY2UK/3i1mdou/vXqKW9iIrYvN\n7L/+Nb817BjZZvYX/3q+Y2Y/j2Iq3eOSLgr7+SJJj9W61rlmNtev7QMzu7zWOf/PP+dqScfXs++z\n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\nlHLOPSDpAUkaNGiQGzFiRNMrRlIrLi4Wv19I9AXsQ19AOPoDQugLCKEvIIS+kJreeecddejQocWP\nu2PHjpiOG2rboUMHPfzwwzr++OM1ZcoUbdiwQePGjdOuXbskSffff7+GDh2qSZMm6Z133tHw4cN1\n8cUX66yzzqq3XUPnOuWUU/TWW2+pQ4cOmjZtmh555BFJ0g9/+ENdd911kqT27dtr586dKi4u1sSJ\nE9WlSxetWrVKAwcO1BNPPKH77rtPH330kc4880x16dJFL774oi677DItWbJEZqYf/OAHuv766+vU\nkJWVpYKCgqivT7hkCqXelHSkmfWSVCrpfEkXRLOjmXWStNs596WZdZE0TNJv41YpAAAAAABIaXNK\nSjV1wRptLitXbk62igrzNbogllWEGte7d29VVVXpk08+0UEHHaSFCxcqKytL77//vsaOHaslS5bo\njjvu0J133ql58+ZJknbv3l1vu0j27t2r559/XqNGjdLSpUv16KOP6o033pBzTkOGDNFJJ51UJzQq\nKSnR22+/rdzcXA0bNkyvvvqqrr32Wk2bNk3/+te/1KVLFy1dulSlpaVatWqVJKmsrKxFr42URGtK\nOef2Srpa0gJJ70ia6Zx728wmmdl3JMnMjjezTZLOkfRnM3vb3/1oSUvMbIWkf0m6o9ZT+wAAAAAA\nACR5gdTNs1aqtKxcTlJpWblunrVSc0pKW/xcoWWTKioqdPnll6tv374655xztHp1/bFFtO3Ky8vV\nv39/DRo0SD169NBll12mf//73zrrrLO0//77q3379hozZowWLVpUZ9/Bgwere/fuatOmjfr376/1\n69fXadO7d2+tXbtW11xzjebPn68DDjig6RchgmQaKSXn3HOSnqu17Vdh378pb1pf7f0WS+ob9wIB\nAAAAAEDKm7pgjcorKmtsK6+o1NQFa1p0tNTatWuVkZGhgw46SLfddpsOPvhgrVixQlVVVcrKyqp3\nn7vvvjuqdtnZ2Vq+fHmNbdGuG77ffvtVf5+RkaG9e/fWadOpUyetWLFCCxYs0O9//3vNnDmzelpg\nS0makVIAAAAAAABB2FxWHtP2pti6dauuvPJKXX311TIzbdu2Td26dVObNm30+OOPq7LSC8U6dOig\nHTt2VO8XqV00TjzxRM2ZM0e7d+/Wrl27NHv2bA0fPjzq/cNr+fTTT1VVVaXvfe97mjx5spYtWxb1\n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\nACLi4QxIuPffl77+9ejaTpggTZwoSSouLtaIESPiVlZt5eXlevfdd+s956BBg5SXl6e5c+eqsrKy\nevTStm3bdN555+mhhx5Su3btVFRUpJ/+9Kd6/fXX6z1HS60pVVJSoqqqKq1bt05HHHFE9fbFixer\nuLi4RRcdb8p1WbZsmdauXatevXpp/fr1+vOf/6yioiKdeuqpevbZZ9WuXTsdd9xxmjdvns4999wW\nq1WqOZp98+bNyrtn3ygryVu0/Uc/+pEkadeuXS167lSVNKGUpMGSPnDOrZUkM5sh6buSwkOp70qa\n6H//jKT7rbVPwAQAAACSFA9nQOCuuUa6//7o2m7cKNUafZMoy5cvV2Vlpfr3r3+cxemnn64HH3xQ\nr776avW6TN26dauxSPbZZ5+t+fPnRzxHS6wpVVlZqVWrVunLL7/U8OHDddVVV+nggw/WypUr9cgj\nj6hfv3765S9/2axzhGvKdVm2bJmuuOIKff/735ck9evXT3v27NGf/vQnHXjggZKkQw89VHv37m2x\nOuuTm5urwYMHa9GiRRo3bpyGDh2qBx98UJ9++qlGjRqlF154Qffcc4/OO+88devWLa61JLNkmr6X\nJyl8fOAmf1u9bZxzeyVtkxQa89bLzErM7GUzGx7vYgEAAAA0rPZ0lrycbE0Z05f1pNAyNm+uOQ3P\nLHIgdeWVNafhOZc0gZS0b92kSOFLaN2m2bNnV2+bN2+eRo4cqdzcXHXs2FGFhYU65phj4lrnu+++\nq/Lyco0dO1aHHHKIJk+erJ///OdatGiRfvGLX6i4uFgdOnRosfM15bqUlJToO9/5TvXPK1as0De/\n+c3qQMo5p9WrV8f9WknSzJkzdcYZZ2jOnDkaP368srKytGjRIt1999066qijdP3112v79u1xryOZ\nWbSLi8WbmZ0jqdA590P/53GSBjvnrglr87bfZpP/84fyRljtlNTeOfeZmQ2UNEdSH+dcnd+umV0h\n6QpJOvjggwfOmDEjzu8MibJz5061b98+0WUgCdAXEEJfQDj6A0LoCwihLyS3wx57TL0efTSqtm/8\n5S8q79GjyedK9r6wcuVKTZgwQb/85S/Vp08ftWvXTpMnT9Zhhx2miy66KG7nXbhwoW6//Xbdd999\nOvbYY+N2nqbatm2bRo8erblz51aHY1OnTlVOTo4uv/xySVJpaakuvfRSPffcc2rbNrrJY8neH5LR\n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\nc1SSz3Q/Htn9/Mg52l2T5Ee6n/9Ckj9b6a/PbbjjIclVSU6dY59fSfKX3c+fkeStK/21ui3fWEjy\nbUlO77Y5LMn7kzyxe9+5YQxuSdYluSHJQ7s/w48nOXFWmzl/r5Oc2G1/eJITusdZ188x3Ubvtsix\ncHKSY7uff2+SyZ595ny9cBvt2yLHw/FJrp3nuB9K8pgkleQfpl8z3Eb3tpixMKvNSUk+03PfuWHM\nbn2OheOTfF+SNyZ5Ws/2hd5XOC8c5M1MKcbNU5Jc1P38oiRb52izJcl7W2u3ttZuS/LeJD/a26Cq\nHp7k6HTefDK+lmQ8HOC4b09yhv92jLyDHgutta+31t6XJK21byX5aJLjhtBnls6jk1zfWvtM92d4\ncTpjotd8v9dPSXJxa+2brbXPJrm+e7x+jsnoOeix0Frb2Vq7ubv9k0nuU1WHD6XXLJfFnBvmVFUP\nSnK/1toHWued6Bsz92sOo2WpxsJPJ3nLsvaU5XbAsdBa+1xr7RNJ7p6175x/SzovLI5QinFzTGvt\ni0nS/TjXFNmNSb7Qc/+m7rZeP53Ofz96K/0/tao+UVVvr6oHL2WnWTZLMR5e351u/fs9f3jcs09r\n7a4ktyf5jqXuPEtqSc4NVbUhyU8kuaJns3PD6OvnvD/f7/V8+/ZzTEbPYsZCr6cm2dla+2bPtrle\nLxhtix0PJ1TVzqr6x6r64Z72Nx3gmIyepTo3/FT2D6WcG8bLYl7fF/qbwXnhIB260h2A2arq8iTf\nOcdDL+73EHNsm32ZyWck+bme+3+f5C2ttW9W1S+l81+Sx4UVt8zj4Wdaa5NVdd8kl6QzJt54gH1Y\nIct9bqiqQ9P5Q/M1rbXPdDc7N4yHfn5n52sz3/a5/nHnPDD6FjMWOg9WPSLJK5I8oefx+V4vGG2L\nGQ9fTPIfWmu3VNUpSbZ3x4a/EcbTUpwbfjDJ11tr1/Y87twwfhbzOzzo3xL0QSjFyGmtPX6+x6rq\nS1X1oNbaF7vTJL88R7ObkmzuuX9cOuu9p4/x/UkOba1d0/Oct/S0/6t0/hhlBCzneGitTXY/fq2q\n3pzOdN43dvd5cJKbukHF/ZPcuvivhsVY7nNDkguTXNdae3XPczo3jIfp39lpxyW5eZ42s3+vF9r3\nQMdk9CxmLKSqjkvyd0l+vrV2w/QOC7xeMNoOejx0Z9N/M0laa9dU1Q1JvqvbvneJt3PDeFjUuaHr\nGZk1S8q5YSz1MxYW2nfzrH2vivPColi+x7i5LMn0VQ7OTvKOOdrsSPKEqjqyOlfgekJ327T91oJ3\n38ROe3KSf12yHrOcDno8VNWhVfWAJKmq9UmelGT6P1+9x31akitnLfVk9Czq3FBVL03nj88X9O7g\n3DA2Ppzk4VV1QlUdls4bh8tmtZnv9/qyJM/oXnXphCQPT6dYaT/HZPQc9FjoLt99V5JzW2tXTzc+\nwOsFo20x4+GBVbUuSarqoemcGz7TXSL+tar6T92lWj+fuV9zGC2LeZ1IVR2S5Onp1B9Kd5tzw3ha\nzOv7nH9LOi8s0kpXWndzG+SWzrruK5Jc1/14VHf7qUle29Pu2ekUq70+ybNmHeMzSb571rbz0ilq\n+vEk75v9uNto3hYzHpJ8ezpXYPxE92f/J0nWdR+7T5K3ddt/KMlDV/prdVvWsXBcOlOs/zXJx7q3\n53Qfc24Yk1uSH0vy6XSuqPPi7raXJHly9/N5f6/TWQJ6Q5Ld6blazlzHdBv928GOhSS/l+TOnvPA\nx9KpTzfv64Xb6N8WMR6e2nP+/2iSn+g55qnphA83JPmzJLXSX6fb8o2F7mObk/zLrOM5N4zprY+x\n8APpzH66M8ktST7Zs++c7zOdFw7+Vt1vIAAAAAAMjeV7AAAAAAydUAoAAACAoRNKAQAAADB0QikA\nAAAAhk4oBQAAAMDQCaUAAAAAGDqhFAAAAABDJ5QCAFa1qvqFqmpVtXml+wIAwL2EUgDAiqiqzd2w\nqFXVn83T5uiq+la3zVVD7uJBq6pHVtUfVtXxa+m5D0ZV3a+q7u4ZC62qbq+qD1XVM1a6fwDA8hFK\nAQAr7RtJnllVh8/x2M8lqSR3DbdLi/bIJH+Q5Pg19twH41Hp/Izfms7P++eTvCLJg5O8parOWsG+\nAQDLSCgFAKy0v0tyZJKnzPHYs5K8O8k3h9qjg1RV66rq20b1eEthGfr0qO7HN7fW3tRa+5vW2suT\nPLO7/WeW8LkAgBEilAIAVtpHk3w8nQDqHlX16CSPSPL62TtU1X2r6qVV9cGq+kpVfbOqrq+q8/sN\nTKrqxd2lYn9aVYd0tx1eVb9bVZ+sqm9U1Z6q+vuqOnmO/adrVT2+qn6/qm5IZ9bXp3r6/L6eJWlv\nOEB/5jveT/bbt6r6w4Weu7usr821tK+qPjd7ieRCfep57HFV9dtVdUP35/Dpqjp74e/+DKd0P+6c\ntf2G7sf7D3AsAGCMHLrSHQAASCdI+eOqOq61dlN327OTfDnJO+dovzHJc5JckuTN6Szv+89JfifJ\nyUm2zPdE3QDqz5L8cpJzW2vnd7evT/J/kjw2yd9029w/yXOTXF1VP9Ja+8gch/wfSdYn+askX03y\nyXRm+TwvycuT/Gu33Q1z7DuX2cfbPUDfLk3yoEU8d999SrKp+9jLk0wk+V/pzGj75SRvqKrrW2tX\n93HsRyX599baF2Ztf1L34z8vsu8AwIgSSgEAo+BNSf57OvWEXl5VE0mekeS1rbW7qmp2+88keXBr\nbW/Ptj+vqv+W5Peq6tGttQ/N3ql73Dcn+fEkZ7fW3tjz8K8l2ZzkR1trO3r2+Ysk16YTzGyeo+8T\nSU5urX29Z58T0gmG3ttau+rAX/4Bj/db/fSttfaJqvrAIp57kD5Nh1KHJ/mB1tq3utvfns7P59eS\nLBhKVdURSb4ryfur6gHdzQ9M8uR06mLtTvLKJfoaAIARY/keALDiWmu3JLksyS90N52Vzkyg183T\n/lvTgVRVHVpVR3ZDjcu7TX5wjt2OSvLeJI9P8hOzAqkk+dkk/5bkmqp6wPQtyWHd/X6oG2rN9j97\nw5olMNfxDrZvy9mnaX8xHUglSWttMsmnkzy8j+M+Mp2/R/9zkn/v3j6V5KVJ/jTJY1prty+m4wDA\n6DJTCgAYFa9P8q6q+qF0lu59qLX2qfkaV9WvJPmldOpOzf5H25Fz7PKGJEck+ZHW2v+d4/HvSWdG\n0L8v0McHJJm9zOzTC7Q/GHMd72D7tlQW+ho/M8e2W5I8pI/jTteTOifJNenMuvrhdJZhPqa1dtsg\nnQQAxotQCgAYFTuSTKazbOv0dGoTzamqXpjOsq73JHlNkpuTfCudWlNvyNyzwd+aTjH1/1pVT2mt\nTc0+bJJdSV64QB/nCoWWcpbUfMc72L7N1hZ4bKG/Cxf6GvfNs32/NZdzmL7y3v/uqSX2rqo6Kslz\nq+qM1toVfRwHABhDQikAYCS01vZV1RuTnJtkKsnFCzT/uSSfS/LE1trd0xur6kcX2Od/J7kinULh\n76yqn5i1JO26dOoZXdl7zIO0UPhzMAbp20LPfWv341HpfP+SJFV1n3QKpF+/iD4ejFOS3NITSE27\nMJ0i7j+dzs/sHlX1E0nOT2d8PD/JtyfZls7V+16T5PuSfCidJZpLHRgCAEtITSkAYJT8ZZI/SvJL\nB6gltC+d8OWe2ThVdWg6y8Dm1Vq7OJ2g44eT/EO30Pa0Nyb5zswzG6mqjunnC+i6o/vxqAH2Wcgg\nfVvouaeX4T1+1vbfypD/LuzWwPruJB+b/Vj3SoKTSZ5cVetmPfyoJA9N8tkkxyf5vSQXJHlRkqem\ns2xwU+69eh8AMKLMlAIARkZr7fNJ/rCPpm9Pcl46wdKlSe6X5JlJ9i64V+c53l5Ve5P8bZIdVfXE\n1tpXk/xJkjOTXFBVj0tyZZKvJvkPSc5I8o10lhX248NJ7k7y4qo6MsmdST7bWvtgn/vPNkjfFnru\ny9MpmP6SqvqOdIKdH0ryn5J85SD7drAemWRd5gilut6dzmyp05L8U8/2RyW5sLX2piSpqo8nuU86\nQeat3W1fiL9zAWDkmSkFAIyjC5L8bjozZv4kya+mU1/q5/vZubX2jnSu8HdKkvdU1Ybu1fx+PMlv\nprNU7o+SvCrJT6VTzPu8fjvXDdeenU5x8v+Z5C1ZoEZWH8fru28LPXdrbV+SpyS5Ksmvp7MM7rB0\nrn5358H27yBN15OaL5R6Z/fjf5m1/eR0rtQ47fuT/N+eQKqSnJjOVfwAgBFWrS11yQMAAFh6VfWA\ndAq6HzV9Zb6qem2Sf2+tndu9/7Ak1ya5bzfMAwBGlJlSAACMi0cl+dx0INWz7ZpZ93cJpABg9Aml\nAAAYFycn+ej0napan+QRmRlKzWgDAIwuy/cAAAAAGDozpQAAAAAYOqEUAAAAAEMnlAIAAABg6IRS\nAAAAAAydUAoAAACAoRNKAQAAADB0QikAAAAAhk4oBQAAAMDQ/f/GO21t3v7iRgAAAABJRU5ErkJg\ngg==\n", 43 | "text/plain": [ 44 | "" 45 | ] 46 | }, 47 | "metadata": {}, 48 | "output_type": "display_data" 49 | }, 50 | { 51 | "name": "stdout", 52 | "output_type": "stream", 53 | "text": [ 54 | "Expected return: 0.0901131588095\n" 55 | ] 56 | } 57 | ], 58 | "source": [ 59 | "import matplotlib.pyplot as plt\n", 60 | "import numpy as np\n", 61 | "import pandas_datareader.data as web\n", 62 | "import pandas as pd\n", 63 | "import datetime\n", 64 | "import scipy.optimize as optimize\n", 65 | "\n", 66 | "\n", 67 | "def capm(startDate,endDate,ticker1, ticker2):\n", 68 | " \n", 69 | " risk_free_rate = 0.05\n", 70 | " # time frame for calcuating returns\n", 71 | " month = 12\n", 72 | " daily = 252 \n", 73 | " \n", 74 | " # get stock data from yahoo\n", 75 | " stock1 = web.get_data_yahoo(ticker1, startDate, endDate)\n", 76 | " stock2 = web.get_data_yahoo(ticker2, startDate, endDate)\n", 77 | " \n", 78 | " # we prefer monthly returns instead of daily returns\n", 79 | " return_stock1 = stock1.resample('M').last()\n", 80 | " return_stock2 = stock2.resample('M').last()\n", 81 | " \n", 82 | " # create a dataframe from thae data - adjusted close price is usually used\n", 83 | " data = pd.DataFrame({'s_adjclose':return_stock1['Adj Close'], 'm_adjclose':return_stock2['Adj Close']}, index=return_stock1.index)\n", 84 | " \n", 85 | " # use natural logarithm of the returns\n", 86 | " data[['s_returns','m_returns']] = np.log(data[['s_adjclose','m_adjclose']]/data[['s_adjclose','m_adjclose']].shift(1))\n", 87 | " \n", 88 | " # no need for NaN/missing values\n", 89 | " data = data.dropna()\n", 90 | " \n", 91 | " # Covariance Matrix: the diagonal items are the variances - off diagonals are the covariance\n", 92 | " # The matrix is symmetric: cov[0,1] = cov[1,0]\n", 93 | " covmat = np.cov(data[\"s_returns\"],data[\"m_returns\"])\n", 94 | " print(covmat)\n", 95 | " \n", 96 | " # calculate beta using covarience\n", 97 | " beta = covmat[0,1]/covmat[1,1]\n", 98 | " print(\"Beta from formula:\",beta)\n", 99 | " \n", 100 | " # Use linear Regression to fit a line to the data [Stock_Returns, market_returns] - slope is the beta\n", 101 | " beta,alpha = np.polyfit(data['m_returns'],data[\"s_returns\"],deg=1)\n", 102 | " print(\"Beta from regression:\", beta)\n", 103 | " \n", 104 | " # plot\n", 105 | " fig,axis = plt.subplots(1,figsize=(20,10))\n", 106 | " axis.scatter(data[\"m_returns\"],data[\"s_returns\"], label=\"Data Points\")\n", 107 | " axis.plot(data[\"m_returns\"],beta*data[\"m_returns\"] + alpha, color='red', label=\"CAPM Line\")\n", 108 | " plt.title('Capital Asset Pricing Model, finding alphas and betas')\n", 109 | " plt.xlabel('Makert return $R_m$', fontsize=18)\n", 110 | " plt.ylabel('Stock return $R_a$')\n", 111 | " plt.text(0.08,0.05, r'$R_a = \\beta * R_m + \\alpha$', fontsize=18)\n", 112 | " plt.legend()\n", 113 | " plt.grid(True)\n", 114 | " plt.show()\n", 115 | " \n", 116 | " # calculate the expected return acording to the CAPM formula \n", 117 | " expected_return = risk_free_rate + beta*(data['m_returns'].mean()*month-risk_free_rate)\n", 118 | " print(\"Expected return:\",expected_return)\n", 119 | "if __name__ == \"__main__\":\n", 120 | " # using historical data 2010-2017: the market is the S&P500\n", 121 | " capm('2010-01-01','2017-01-01','IBM','^GSPC')" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": null, 127 | "metadata": { 128 | "collapsed": true 129 | }, 130 | "outputs": [], 131 | "source": [] 132 | } 133 | ], 134 | "metadata": { 135 | "kernelspec": { 136 | "display_name": "Python 3", 137 | "language": "python", 138 | "name": "python3" 139 | }, 140 | "language_info": { 141 | "codemirror_mode": { 142 | "name": "ipython", 143 | "version": 3 144 | }, 145 | "file_extension": ".py", 146 | "mimetype": "text/x-python", 147 | "name": "python", 148 | "nbconvert_exporter": "python", 149 | "pygments_lexer": "ipython3", 150 | "version": "3.6.3" 151 | } 152 | }, 153 | "nbformat": 4, 154 | "nbformat_minor": 2 155 | } 156 | -------------------------------------------------------------------------------- /jupyter/Capital Asset Pricing Model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Capital Asset Pricing Model\n", 8 | "\n", 9 | "Markowitz-model work fine, BUT we can not get rid of all risk by diversification!\n", 10 | "\n", 11 | "_*There are two types of risk:*_\n", 12 | "1. Unsystematic risk: \"Specific Risk\" - This is the risk specific to individual stocks. It can be diversified away by incresing the number of stocks in the portfolio\n", 13 | "\n", 14 | "**Unsystematic Risk is the component of a stock's return that is not correlated with market moves**\n", 15 | "\n", 16 | "2. Systematic Risk: \"Market Risk\" - This risk can not be diversified away. For example: interest rates, recession or wat\n", 17 | "\n", 18 | "**Capital Risk Pricing Model measures this risk**\n", 19 | "
\n", 20 | "\n", 21 | "## Expected Return\n", 22 | "It was formulated in the early 1960s by Sharpe and his colleagues\n", 23 | "\n", 24 | "**Note: ** We use SPY500 as a represention of them arket as a whole\n", 25 | "\n", 26 | "\n", 27 | "$E[r_a] = r_f + \\beta_a(E[r_m]-r_f)$\n", 28 | "\n", 29 | "- $E[r_a]$ = The expected return of investment: it may be a single stock or a portfolio *effecient or not it does not matter*\n", 30 | "\n", 31 | "- $r_f$ = Base return because of risk-free rate\n", 32 | "- $\\beta_a(E[r_m]-r_f)$ = Market excess return multiplied by a factor *(beta)*\n", 33 | "\n", 34 | "**Linear relationship between any stock expected return and market premium!**\n", 35 | "\n", 36 | "$\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 37 | "\n", 38 | "- According to **CAPM** *beta* is the only relevant measure of a stock's risk\n", 39 | "- Measures the stock's relative volatility: how much the price of a given stock goes up/down compared to that of the whole market\n", 40 | "\n", 41 | "
\n", 42 | "\n", 43 | "## Beta Value\n", 44 | "\n", 45 | "$\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 46 | "\n", 47 | "beta = how risky your portfolio is relative to the market\n", 48 | "\n", 49 | "- If your portfolio has no risk: your expected return is the risk-free return\n", 50 | "\n", 51 | "- If your portfolio is more risky than the market: your expected return will be higher\n", 52 | "\n", 53 | "- If you portfolio is less rsky than the market: your expected return will be less\n", 54 | "\n", 55 | "We know how to calculate the $\\beta$ value for a single stock: \n", 56 | "- Just calculate the covariance between stock and market (SPY500) over the variance of the market\n", 57 | "$~~~\\beta_a = \\frac{Cov(r_a,r_m)}{Var(r_m)}$\n", 58 | "\n", 59 | "***How to deal with a portfolio containing several stocks?***\n", 60 | "\n", 61 | "A given portfolio's $\\beta$ beta value is the weighted sum of the stocks' betas within one portfolio\n", 62 | "
$\\beta_a = w_1\\beta_1 + w_2\\beta_2 + \\cdots + w_n\\beta_n$
\n", 63 | "\n", 64 | "The weights are the same as:\n", 65 | "\n", 66 | "\n", 67 | " stock: APPL GOOGL TSLA GE\n", 68 | " Precent: 20% 30% 25% 25%\n", 69 | " Weight: 0.2 0.3 0.25 0.25\n", 70 | " Weights = [0.2,0.3,0.25,0.25] = 1 (100%)\n", 71 | "\n", 72 | "$\\beta_a$ is a linear combination of $\\vec{b} \\cdot \\vec{w}$\n", 73 | "\\begin{equation}\n", 74 | "\\beta_a =\n", 75 | " \\vec{b}=\\begin{bmatrix}\n", 76 | " b_1 \\\\\n", 77 | " b_2 \\\\\n", 78 | " \\vdots\\\\\n", 79 | " b_n\\\\\n", 80 | " \\end{bmatrix}\n", 81 | "\\cdot\n", 82 | " \\vec{w}=\\begin{bmatrix}\n", 83 | " w_1 \\\\\n", 84 | " w_2 \\\\\n", 85 | " \\vdots\\\\\n", 86 | " w_n\\\\\n", 87 | " \\end{bmatrix}\n", 88 | "\\end{equation}\n" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": { 94 | "collapsed": true 95 | }, 96 | "source": [ 97 | "## Linear Regression w/ CAMP\n", 98 | "\n", 99 | "
$E[r_a] - r_f = \\alpha + \\beta(E[r_m]-r_f)$
\n", 100 | "\n", 101 | "Beta is the only relevant measure of risk: determines the additional premium beyond the risk-free rate\n", 102 | "\n", 103 | "**What is $\\alpha$ alpha?**\n", 104 | "\n", 105 | "*alpha $\\alpha$* is the difference between the actual return and the expected return.\n", 106 | "\n", 107 | "
$\\alpha = E[r_a] - (r_f + \\beta(E[r_m]-r_f))$
\n", 108 | "\n", 109 | "**For example:**\n", 110 | " CAPM may estimate that a portfolio should return **15%**, but it actually earned **20%**. In this case alpha is the difference so **+5%**\n", 111 | "\n", 112 | "***FOR CAPM ALPHA IS ZERO!***\n", 113 | "\n", 114 | "\n", 115 | "***Why use monthly returns?***\n", 116 | "- use daily returns if you want to deal with microscopic data. For example holidays, etc.\n", 117 | "- Daily returns are best for superior sgort-term tactical forecasting\n", 118 | "- For long term models **monthly returns** are favourable. The main benefit is that with monthly data, returns are at least approximately normall distributed\n", 119 | "\n", 120 | "***Most of the models assume normal Distribution*** \n", 121 | "\n", 122 | "$\\beta = 0.5$ less volatile than the market\n", 123 | "\n", 124 | "- Stock market goes up by 10% -> this stock goes up by 5%\n", 125 | "- Stock market falls by 2% -> this stock falls by 1%\n", 126 | "\n", 127 | "$\\beta = 1.5$ 50% more volatile than the market\n", 128 | "\n", 129 | "- Stock market goes up by 10% -> this stock goes up by 15%\n", 130 | "- Stock market falls by 2% -> this stock falls by 3%" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": { 137 | "collapsed": true 138 | }, 139 | "outputs": [], 140 | "source": [ 141 | "$" 142 | ] 143 | } 144 | ], 145 | "metadata": { 146 | "kernelspec": { 147 | "display_name": "Python 3", 148 | "language": "python", 149 | "name": "python3" 150 | }, 151 | "language_info": { 152 | "codemirror_mode": { 153 | "name": "ipython", 154 | "version": 3 155 | }, 156 | "file_extension": ".py", 157 | "mimetype": "text/x-python", 158 | "name": "python", 159 | "nbconvert_exporter": "python", 160 | "pygments_lexer": "ipython3", 161 | "version": "3.6.3" 162 | } 163 | }, 164 | "nbformat": 4, 165 | "nbformat_minor": 2 166 | } 167 | -------------------------------------------------------------------------------- /jupyter/Modern Portfolio Theory.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Modern Portfolio Theory\n", 8 | "\n", 9 | "It was formulated in the 1950's by Markowitz (award nobel prize for it)\n", 10 | "\n", 11 | "**What was the main idea?**\n", 12 | "A single stock is quite unpredictable: we do not know for certain whether the price will go up or down. **But** _we may combine several stocks_ in order to reduce the risk as much as possible!\n", 13 | "\n", 14 | "This is called **DIVERSIFICATION**\n", 15 | "\n", 16 | "Combining assests is the main idea: it is the same for Black-Scholes Model!\n", 17 | "\n", 18 | "The idea is the any loss is one stock is offest by the gain in other stocks in the portfoilo\n", 19 | "\n", 20 | "_*The model has several assumptions*_\n", 21 | " \n", 22 | " 1) The Returns are normally distributed\n", 23 | " - To describe normal distributions we need mean (mew) and variance(omega) exclusively\n", 24 | " \n", 25 | " 2) Investors are risk-averse: investors will take on more risk if they are expecting more reward\n", 26 | "\n", 27 | "*As always less risk less return*\n", 28 | "\n", 29 | "Modern Portfolio theory allows investors ro construct optimal portfolios offering maximum possible expected return for a given level of risk!\n", 30 | "\n", 31 | "**So what is an efficient portfolio?** \n", 32 | "This is a portfolio that has the highest reward for a given level of risk OR te lowest level of risk for a given reward! ng available stocks in a way that all positions are long\n", 33 | "\n", 34 | "\n", 35 | "# Mathimatical Formulation\n", 36 | "\n", 37 | "The investors are not allowed to set up short positions in a security\n", 38 | "\n", 39 | "So 100% of the wealth has to be divided amoung all options \n", 40 | "*For example: **APPL, GOOGL, TSLA, GE***\n", 41 | "\n", 42 | " stock: APPL GOOGL TSLA GE\n", 43 | " Precent: 20% 30% 25% 25%\n", 44 | " Weight: 0.2 0.3 0.25 0.25\n", 45 | " Weights = [0.2,0.3,0.25,0.25] = 1 (100%)\n", 46 | " \n", 47 | "Above is how an investor might split amounst all avaiable assets\n", 48 | "\n", 49 | "### Formulation:\n", 50 | "\n", 51 | "\n", 52 | "$w_{i}$ \\- weight of the i\\-th stock\n", 53 | "\n", 54 | "$r_{i}$ \\- return of the i\\-th stock *calculated based on historical data*\n", 55 | "\n", 56 | "$u_{i}$ \\- expected return for security i *it is mean more or less*\n", 57 | "\n", 58 | "***How to calculate the return?***\n", 59 | "\n", 60 | "We can calculate the return on a day by day basis with:\n", 61 | "\n", 62 | "*Daily Return*\n", 63 | "\n", 64 | "```\n", 65 | " ((stockPrice_n - stockPrice_n-1) / stockPrice_n-1) x 100 // returns %\n", 66 | "```\n", 67 | "\n", 68 | "***Usually we use the natural logarithm as the return!\n", 69 | "\n", 70 | "`log(((stockPrice_n - stockPrice_n-1) / stockPrice_n-1))`\n", 71 | "\n", 72 | "*We use log of return instead of actual prices of stocks as a form of normalization: Important for machine learning techniques and statistical analysis*\n", 73 | "\n", 74 | "`log((stockPrice_n / stockPrice_n-1) - 1)`\n", 75 | "\n", 76 | "*Using the log allows for faster algo's*\n", 77 | "\n", 78 | "\n", 79 | "\n" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "## Expected return of a morkowitz model portfolio\n", 87 | "**Not a dynamic model, not ideal**\n", 88 | "\n", 89 | "$w_{i}$ \\- weight of the i\\-th # stock\n", 90 | "\n", 91 | "$r_{i}$ \\- return of the i\\-th stock # *calculated based on historical data*\n", 92 | "\n", 93 | "$u_{i}$ \\- expected return for security i # *it is mean more or less*\n", 94 | "\n", 95 | "*This model relies heavily on historical data. Historical mean performance is assumed to be the best estimator for future (expected) performance*\n", 96 | "\n", 97 | "$\\mu_{porfolio} = E($$\\sum_{i}w_{i}r_{i}$$)=$$\\sum_{i}w_{i}E(r_{i})$$=$$\\sum_{i}w_{i}\\mu_{i}$$ = \\underline{w}^{T} \\underline{\\mu}$\n", 98 | "\n", 99 | "***This is the expected return of the portfolio!***" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "
\n", 107 | "## Risk and Return of a morkowitz model portfolio\n", 108 | "\n", 109 | "$\\underline{What~about~the~risk~of~the~portfolio?}$\n", 110 | "\n", 111 | "- The risk has something to do with the volatility, which has something to do with standard deviation and varience!\n", 112 | "\n", 113 | "Equation: $\\sigma_{ij} = E[(r_{i} - \\mu_{j})(r_{j}-\\mu_{i})]$ // *covariance*\n", 114 | "\n", 115 | "- Test: What is volatility? A - volatility is the measurement of dispersion of expected returns in a security\n", 116 | "\n", 117 | "**Covariance** measures how much TWO stocks vary together\n", 118 | "\n", 119 | "$\\rightarrow \\sigma_{ij} < 0$ // A negative covarience means returns have inverse relationship\n", 120 | "\n", 121 | "$\\rightarrow \\sigma_{ij} > 0$ // A postive covarience means returns are correlated \n", 122 | "\n", 123 | "**Markowitz's Theory** is abot diversifiation: Processing stocks with high positice covariance does NOT provide very much diversification!\n", 124 | " - The aim of diversification is to eliminate fluctuations in the long term\n", 125 | " \n", 126 | "**Variance** measures how much variation is in ONE stock\n", 127 | "\n", 128 | "Equation: $\\sigma_{i}^{2} = E[(r_{i} - \\mu_{i})^2]$ // *variance*\n", 129 | "\n", 130 | "- For calculating the variance of the port we need the covariance matrix of the stocks involved in the portfolio\n", 131 | "\n", 132 | "$\\Sigma =$ \n", 133 | "$\n", 134 | "\\begin{bmatrix}\n", 135 | " \\sigma^{2}_{1} & \\dots & \\sigma_{1n} \\\\\n", 136 | " \\vdots & \\ddots & \\vdots \\\\\n", 137 | " \\sigma_{n1} & \\dots & \\sigma^{2}_{n}\n", 138 | "\\end{bmatrix}\n", 139 | "$\n", 140 | "\n", 141 | "This covariance matrix contains the relationship between all the stocks in the port\n", 142 | "\n", 143 | "***Expected Port Variance***\n", 144 | "\n", 145 | "$\\sigma_{portfolio}^{2} = E[(r_{i}-\\mu_{i})^{2}] = \\Sigma_{i}\\Sigma_{j}w_{i}w_{j}\\sigma_{ij} \\\\ \\sigma_{portfolio}^{2} =\\underline{w}^{T}\\underline{\\Sigma}\\underline{w}$\n", 146 | "\n", 147 | "$\\sigma_{portfolio}= \\sqrt{\\underline{w}^{T}\\underline{\\Sigma}\\underline{w}}$ is linear algebra calculation which is a fast vectorized formula\n", 148 | "\n", 149 | "*Python implementation*:\n", 150 | "`portfolio_volatility = np.sqrt(np.dot(weights.T,np.dot(returns.cov()*252,weights))) \n", 151 | "`\n" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "
\n", 159 | "## The Expected Return vs Expected Risk\n", 160 | "\n", 161 | "\n", 162 | "\n", 163 | "The Dots represent different $w$ weight distrubitions $\\rightarrow$ different portfolio stock distrubitions\n", 164 | "\n", 165 | "An investor is interested in\n", 166 | "\n", 167 | "1. The maximum return given a fixed risk level\n", 168 | "2. The minimum risk given a fixed return\n", 169 | "\n", 170 | "These portfolios make up the so-called: ***Efficient-frontier***\n", 171 | "\n", 172 | "\n", 173 | "\n", 174 | "This is the main feature of the Markowitz model: the investor can decide the risk or the expected return\n", 175 | "\n", 176 | "*Remember:* If you want to make money, you have to take risk!" 177 | ] 178 | }, 179 | { 180 | "cell_type": "markdown", 181 | "metadata": { 182 | "collapsed": true 183 | }, 184 | "source": [ 185 | "
\n", 186 | "## Sharpe-Ratio\n", 187 | "\n", 188 | "***What is the Sharpe-ratio?***\n", 189 | "\n", 190 | "*It is one of the most import risk/return measures used in finance William Sharpe used this parameter!*\n", 191 | "\n", 192 | "1. It describes how much excess return you are receiving for extra volatility that you endure holding a riskier asset/stock\n", 193 | "\n", 194 | "2. It measures the excess return (risk oremium) per uint of standard deviation on an asset(s)\n", 195 | "\n", 196 | "

Sharpe-ratio: $S(x) = \\frac{r_{x} - R_{f}}{StdDev(x)}$

\n", 197 | "- $r_{x}$: average rate of return of investment x\n", 198 | "- $R_{f}$: rate of return of risk-free security\n", 199 | "\n", 200 | "*A Sharpe-Ratio **S(x) > 1** is considered to be good*\n", 201 | "\n", 202 | "Relating back to the Vol vs Return, the best portfolio will be:\n", 203 | "- On the Efficient Frontier line\n", 204 | "- Be the best balance of StdDev (Volatility) and Rate of Return\n" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "
\n", 212 | "## Capital Allocation Line\n", 213 | "\n", 214 | "\n", 215 | "\n", 216 | "Investors can have risk-free assets as well usually: for example treasury bills\n", 217 | "\n", 218 | "Consider this fact what is the optimal portfolio now?\n", 219 | "\n", 220 | "The optimal portfolios lie on the capital allocation line!\n", 221 | "\n", 222 | "\n", 223 | "\n", 224 | "" 225 | ] 226 | }, 227 | { 228 | "cell_type": "markdown", 229 | "metadata": { 230 | "collapsed": true 231 | }, 232 | "source": [ 233 | "### Efficient portfolios (portfolios that have maximum return for a given risk, or lowest level of risk for a fixed return) are on the capital allocation line!" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": { 240 | "collapsed": true 241 | }, 242 | "outputs": [], 243 | "source": [] 244 | } 245 | ], 246 | "metadata": { 247 | "kernelspec": { 248 | "display_name": "Python 3", 249 | "language": "python", 250 | "name": "python3" 251 | }, 252 | "language_info": { 253 | "codemirror_mode": { 254 | "name": "ipython", 255 | "version": 3 256 | }, 257 | "file_extension": ".py", 258 | "mimetype": "text/x-python", 259 | "name": "python", 260 | "nbconvert_exporter": "python", 261 | "pygments_lexer": "ipython3", 262 | "version": "3.6.3" 263 | } 264 | }, 265 | "nbformat": 4, 266 | "nbformat_minor": 2 267 | } 268 | -------------------------------------------------------------------------------- /jupyter/Stock Market Basics .ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Present value/future value of money " 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### Time value of money\n", 15 | "\n", 16 | "The important concept in finance is that of the time value of money $x today is worth more than $x in a year's time!!!\n", 17 | "\n", 18 | "_Why_? because we may invest $x today\n", 19 | " -> we may invest it into stocks\n", 20 | " -> we can lend it to the bank for some interest\n", 21 | "Future money worth less because of inflation will push prices higher so the buying power of your money will be lower!\n" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "### Future Value (FV)\n", 29 | "**Future Value** is the vlaue of a current asset at a specified date in the future based on assumed rate of growth over set time\n", 30 | "\n", 31 | "- Future Value = x (1 + r)^n\n", 32 | "\n", 33 | "**Present Value** is how much a future sum of money is worth today given a specified rate of interest\n", 34 | "\n", 35 | "- Present Value = x / (1 + r)^n\n", 36 | "\n", 37 | "\n", 38 | "r: interest rate (.05 to 5%)\n", 39 | "\n", 40 | "x: cash flow in future\n", 41 | "\n", 42 | "n: number of years" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "### Continuous Model w/ Differential equations\n", 50 | "\n", 51 | "Suppose we have amount x(t) in the bank in time t. How much does this increase in value from one day to the next?\n", 52 | " \n", 53 | " /-Taylor-Expansion\n", 54 | " x(t+dt) - x(t) = dx(t)/dt * dt\n", 55 | " \\-The cange in the amount of money within a dt day\n", 56 | " \n", 57 | "But the interest I recieve must be proportional to the actual x(t) amount I have and the r interest rate and the dt time step!\n", 58 | "\n", 59 | " x(t+dt) - x(t) = dx(t)/dt * dt = r x(t) dt\n", 60 | " \n", 61 | " dx(t)/dt = r x(t) *The soultion is x(t) = x(0)e^(r*t)\n", 62 | "\n", 63 | "- Continuous Future = x(0)e^(r\\*t)\n", 64 | "- Continuous Present = x(0) / e^(r\\*t)" 65 | ] 66 | }, 67 | { 68 | "cell_type": "markdown", 69 | "metadata": {}, 70 | "source": [ 71 | "## Time value of money implementation" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 13, 77 | "metadata": {}, 78 | "outputs": [ 79 | { 80 | "name": "stdout", 81 | "output_type": "stream", 82 | "text": [ 83 | "Value of $100\n", 84 | "Future Discrete: 101.0\n", 85 | "Future Continuous: 101.00501670841679\n", 86 | "Present Discrete: 99.00990099009901\n", 87 | "Present Continuous: 99.00498337491682\n" 88 | ] 89 | } 90 | ], 91 | "source": [ 92 | "from math import exp\n", 93 | " \n", 94 | "def discreteFutureValue(x,r,n):\n", 95 | " return x * (1+r)**n\n", 96 | "\n", 97 | "def discretePresentValue(x,r,n):\n", 98 | " return x / (1+r)**n\n", 99 | "\n", 100 | "def contFutureValue(x,r,n):\n", 101 | " return x * exp(r*n)\n", 102 | "\n", 103 | "def contPresentValue(x,r,n):\n", 104 | " return x / exp(r*n)\n", 105 | "\n", 106 | "if __name__ == \"__main__\":\n", 107 | " x = 100 # value of investment in dollars\n", 108 | " r = .01 # interest rate\n", 109 | " n = 1 # years\n", 110 | " print(\"Value of $100\")\n", 111 | " print(\"Future Discrete: \", discreteFutureValue(x,r,n))\n", 112 | " print(\"Future Continuous: \", contFutureValue(x,r,n))\n", 113 | " print(\"Present Discrete: \", discretePresentValue(x,r,n))\n", 114 | " print(\"Present Continuous: \", contPresentValue(x,r,n))" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "### Stock Market Basics" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "Stocks represent a small piece of ownship in the company\n", 129 | "\n", 130 | "Allows companies to sell ownership in an effort to raise money\n", 131 | "\n", 132 | "The shareholder gives money for a sontract stating how much of the company he owns\n", 133 | "\n", 134 | "**Why is this important**\n", 135 | "- Dividends + any growth of the stock's value\n", 136 | " (Dividends are payments made quaterly/bi-annually to shareholds, depends on the profitability of the given company)\n", 137 | "\n", 138 | "**What is volatility?**\n", 139 | "\n", 140 | "- Statistical measurement of the dispersion of returns for a given security\n", 141 | "- This is the amount of uncertainty/risk about the size of changes in the value of a given security (stock,bond, etc.)\n", 142 | "\n", 143 | "- We can measure volatility with standard deviation or variance between returns of the same security\n", 144 | "\n", 145 | "**Higher volatility == Higher risk**\n", 146 | "\n", 147 | "*How to approximate volatility?* With the **CAPM** Beta value\n", 148 | "\n", 149 | "__**CAPM - Capital Assetment Pricing Mangement**__\n", 150 | "\n", 151 | "Aim of stocks is to predict and trade future values \n", 152 | " " 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "### Commodities\n", 160 | "\n", 161 | "Commodities are raw products: gold, silver,oil\n", 162 | "\n", 163 | "These are traded on the FUTURE market\n", 164 | "- The price of these are unpredictable, but show seasonal trends/effects\n", 165 | "- Scarcit of the product results in higher prices and vice-versa\n", 166 | "- Most trading is done on the future market. You can make deals to buy/sell a given commodity at some time in the future." 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "### Currencies\n", 174 | "\n", 175 | "FOREX = Foreign Exchange\n", 176 | "\n", 177 | "- the top currencies to considerL USD, CAD, AUD, YEN and EUR\n", 178 | "- money is made by some mispricings: you can make arbitrage profits by exploiting these mispricings\n", 179 | "- Bellman-Ford algorithm\n", 180 | "- Fluctuation in exchange rates is unpredictable BUT it has something to do with interest rates\n", 181 | "- Bellman-Ford builds directed graph and performs shortest path to find arbitrage opportunities\n", 182 | "\n", 183 | "### Positions\n", 184 | "\n", 185 | "Long -> For long periods of ownership\n", 186 | "Short -> Expectation that the stock with momentarily inscrease before decreasing\n", 187 | "\n", 188 | "### Bonds \n", 189 | "Abond is a debt investment in which an investor loans money to an entity (company or government)\n", 190 | "- for a defined period of time\n", 191 | "- variable or fixed interest rate\n", 192 | "\n", 193 | "**BONDS ARE FIXED-INCOME SECURITIES**\n", 194 | "\n", 195 | "- interest rate of bonds are a bit higher than banks\n", 196 | "\n", 197 | "- Agencies assign ratings to bond issuers: if the issuer has poor credit -> risk of default is greater\n", 198 | "- The longer the bond maturity, greater the porbability of default\n", 199 | "- So bonds with longer time to maturity typically have higher interest rates\n", 200 | "\n", 201 | "**Bonds in general are less risk adverse than stocks**\n", 202 | "\n", 203 | "### Bond Price & Interest Rates \n", 204 | "\n", 205 | "Bonds Pricing\n", 206 | "\n", 207 | "par value - \\$1000\n", 208 | "10% rate/coupon\n", 209 | "2 years \n", 210 | "\n", 211 | "What does this mean?\n", 212 | "In two years the buyer will recieve \\$1000 plus 10% premium\n", 213 | "\n", 214 | "*How much would an investor pay for a bond? *\n", 215 | "We have to calculate the present value of that future cash flow (because we get \\$1000 in the future!) This reinforces that the most important concept in finance is that of the time value of money \\$x today is worth more than \\$x in the future\n", 216 | "\n", 217 | "There is an inverse relationship between interest rates and bond prices \n", 218 | "- if interest rates rise -> bond prices decline\n", 219 | "\n", 220 | "Present Value = 1000 / (1+.10)^2\n", 221 | "\n", 222 | "Present Value = 826.4462809917354\n" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": {}, 228 | "source": [ 229 | "### Bond price and Maturity\n", 230 | "\n", 231 | "two bonds:\n", 232 | "Bond A expires in 1 year\n", 233 | "Bond B expires in 10 years\n", 234 | "\n", 235 | "The interest rate (coupon) for bond V will be greater than for bond A... investors bear more risk for greater return. The longer the maturity the greater the risk something will happen to the company.\n", 236 | "\n", 237 | "### Bond Pricing Implementation\n", 238 | "\n", 239 | "Two types of bonds: \n", 240 | "\n", 241 | "- Zero-coupon bonds: we get the fixed value of bond at matrity\n", 242 | "Bond price = Present Value = par_value / (1 + marketRate)^n\n", 243 | "\n", 244 | "- Coupon bonds: we bond + coupon\n", 245 | "Bond price = (C/R)(1-(1/(1+r)^n)) + par_value/(1+r)^n\n", 246 | "\n", 247 | "\\*C: annual coupon payment \n", 248 | "\\*r: Interest Rate" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 12, 254 | "metadata": {}, 255 | "outputs": [ 256 | { 257 | "name": "stdout", 258 | "output_type": "stream", 259 | "text": [ 260 | "Price of the zero-coupon bond: $889.00\n", 261 | "Price of the coupon bond: $1027.75\n" 262 | ] 263 | } 264 | ], 265 | "source": [ 266 | "from math import exp\n", 267 | "\n", 268 | "def zeroBondPrice(par_value,market_rate,n):\n", 269 | " return par_value/(1+market_rate)**n\n", 270 | "\n", 271 | "def bondPrice(par_value,coupon, market_Rate,n):\n", 272 | " c = par_value *coupon\n", 273 | " return c/market_rate*(1-(1/(1+market_rate)**n))+ par_value/(1+market_rate)**n\n", 274 | "\n", 275 | "if __name__ == \"__main__\":\n", 276 | " par_value = 1000 # par value of the bond\n", 277 | " coupon = 0.05 # bond yield - coupon\n", 278 | " n = 3 # number of years \n", 279 | " market_rate = 0.04 #market rate of return\n", 280 | " \n", 281 | " print(\"Price of the zero-coupon bond: $%0.2f\" % zeroBondPrice(par_value,market_rate,n))\n", 282 | " print(\"Price of the coupon bond: $%0.2f\" % bondPrice(par_value, coupon,market_rate,n))" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": null, 288 | "metadata": { 289 | "collapsed": true 290 | }, 291 | "outputs": [], 292 | "source": [] 293 | } 294 | ], 295 | "metadata": { 296 | "kernelspec": { 297 | "display_name": "Python 3", 298 | "language": "python", 299 | "name": "python3" 300 | }, 301 | "language_info": { 302 | "codemirror_mode": { 303 | "name": "ipython", 304 | "version": 3 305 | }, 306 | "file_extension": ".py", 307 | "mimetype": "text/x-python", 308 | "name": "python", 309 | "nbconvert_exporter": "python", 310 | "pygments_lexer": "ipython3", 311 | "version": "3.6.3" 312 | } 313 | }, 314 | "nbformat": 4, 315 | "nbformat_minor": 2 316 | } 317 | -------------------------------------------------------------------------------- /jupyter/Untitled.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "image/png": "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\negAAAABJRU5ErkJggg==\n", 11 | "text/plain": [ 12 | "" 13 | ] 14 | }, 15 | "metadata": {}, 16 | "output_type": "display_data" 17 | } 18 | ], 19 | "source": [ 20 | "import numpy as np\n", 21 | "import pandas_datareader as web\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "\n", 24 | "stocks = ['Shop']\n", 25 | "\n", 26 | "startDate = '01/01/2001'\n", 27 | "endDate = '01/01/2017'\n", 28 | "\n", 29 | "data = web.DataReader(stocks,data_source='yahoo',start=startDate,end=endDate)['Adj Close']\n", 30 | "\n", 31 | "dailyReturns = (data/data.shift(1))-1\n", 32 | "dailyReturns.hist(bins=100)\n", 33 | "plt.show()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "collapsed": true 41 | }, 42 | "outputs": [], 43 | "source": [] 44 | } 45 | ], 46 | "metadata": { 47 | "kernelspec": { 48 | "display_name": "Python 3", 49 | "language": "python", 50 | "name": "python3" 51 | }, 52 | "language_info": { 53 | "codemirror_mode": { 54 | "name": "ipython", 55 | "version": 3 56 | }, 57 | "file_extension": ".py", 58 | "mimetype": "text/x-python", 59 | "name": "python", 60 | "nbconvert_exporter": "python", 61 | "pygments_lexer": "ipython3", 62 | "version": "3.6.3" 63 | } 64 | }, 65 | "nbformat": 4, 66 | "nbformat_minor": 2 67 | } 68 | -------------------------------------------------------------------------------- /jupyter/images/CML2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/CML2.jpg -------------------------------------------------------------------------------- /jupyter/images/SML.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/SML.jpg -------------------------------------------------------------------------------- /jupyter/images/cal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/cal.png -------------------------------------------------------------------------------- /jupyter/images/efficientfrontier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/efficientfrontier.png -------------------------------------------------------------------------------- /jupyter/images/lin_regress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/lin_regress.png -------------------------------------------------------------------------------- /jupyter/images/markowitz_port_optimization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceastIU/Quantitative-Finance-Algorithmic-Trading-in-Python/2c72b82577b3681b7b77f04ce55589e2082854c0/jupyter/images/markowitz_port_optimization.png --------------------------------------------------------------------------------