ml-finance-python

python scripts for finance machine learning

git clone https://9o.is/git/ml-finance-python.git

kelly_mv.ipynb

(54259B)


      1 {
      2  "cells": [
      3   {
      4    "cell_type": "markdown",
      5    "metadata": {},
      6    "source": [
      7     "# Risk Management and The Kelly Criterion\n",
      8     "By Gideon Wulfsohn, Delaney Granizo-Mackenzie, and Thomas Wiecki\n",
      9     "\n",
     10     "Part of the Quantopian Lecture Series:\n",
     11     "\n",
     12     "* [quantopian.com/lectures](https://www.quantopian.com/lectures)\n",
     13     "* [github.com/quantopian/research_public](https://github.com/quantopian/research_public)\n",
     14     "\n",
     15     "Notebook released under the Creative Commons Attribution 4.0 License.\n",
     16     "\n",
     17     "---\n",
     18     "\n",
     19     "The Kelly Criterion is a method that was developed by John Larry Kelly Jr. while working at Bell Labs. Popularized by horse race gamblers and later by investors, the formula can be applied as a useful heuristic when deciding what percentage of your total captial should be allocated to a given strategy.\n",
     20     "\n",
     21     "Lets run through a simple application of the Kelly Criterion which is defined as follows:\n",
     22     "\n",
     23     "**Kelly Optimal Leverage = m<sub>i</sub> / s<sub>i</sub><sup>2</sup>**\n",
     24     "\n",
     25     "* m = mean returns\n",
     26     "\n",
     27     "* s = standard deviation of returns"
     28    ]
     29   },
     30   {
     31    "cell_type": "code",
     32    "execution_count": 2,
     33    "metadata": {
     34     "collapsed": true
     35    },
     36    "outputs": [],
     37    "source": [
     38     "# get pricing data for S&P 500 over a 13 year timeframe\n",
     39     "start = '2002-01-02'\n",
     40     "end = '2015-11-09'\n",
     41     "df = get_pricing('SPY', fields=['close_price'], start_date=start, end_date=end)"
     42    ]
     43   },
     44   {
     45    "cell_type": "code",
     46    "execution_count": 3,
     47    "metadata": {
     48     "collapsed": false,
     49     "scrolled": true
     50    },
     51    "outputs": [],
     52    "source": [
     53     "# compute daily returns, add as new column within dataframe\n",
     54     "daily_returns = (df.close_price.shift(-1) - df.close_price) / df.close_price\n",
     55     "df = df.ix[1:]\n",
     56     "df['daily_returns'] = daily_returns"
     57    ]
     58   },
     59   {
     60    "cell_type": "code",
     61    "execution_count": 4,
     62    "metadata": {
     63     "collapsed": false
     64    },
     65    "outputs": [
     66     {
     67      "data": {
     68       "text/html": [
     69        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
     70        "<table border=\"1\" class=\"dataframe\">\n",
     71        "  <thead>\n",
     72        "    <tr style=\"text-align: right;\">\n",
     73        "      <th></th>\n",
     74        "      <th>close_price</th>\n",
     75        "      <th>daily_returns</th>\n",
     76        "    </tr>\n",
     77        "  </thead>\n",
     78        "  <tbody>\n",
     79        "    <tr>\n",
     80        "      <th>2002-01-03 00:00:00+00:00</th>\n",
     81        "      <td>116.76</td>\n",
     82        "      <td>0.005567</td>\n",
     83        "    </tr>\n",
     84        "    <tr>\n",
     85        "      <th>2002-01-04 00:00:00+00:00</th>\n",
     86        "      <td>117.41</td>\n",
     87        "      <td>-0.006047</td>\n",
     88        "    </tr>\n",
     89        "    <tr>\n",
     90        "      <th>2002-01-07 00:00:00+00:00</th>\n",
     91        "      <td>116.70</td>\n",
     92        "      <td>-0.002913</td>\n",
     93        "    </tr>\n",
     94        "    <tr>\n",
     95        "      <th>2002-01-08 00:00:00+00:00</th>\n",
     96        "      <td>116.36</td>\n",
     97        "      <td>-0.005672</td>\n",
     98        "    </tr>\n",
     99        "    <tr>\n",
    100        "      <th>2002-01-09 00:00:00+00:00</th>\n",
    101        "      <td>115.70</td>\n",
    102        "      <td>0.002247</td>\n",
    103        "    </tr>\n",
    104        "  </tbody>\n",
    105        "</table>\n",
    106        "</div>"
    107       ],
    108       "text/plain": [
    109        "                           close_price  daily_returns\n",
    110        "2002-01-03 00:00:00+00:00       116.76       0.005567\n",
    111        "2002-01-04 00:00:00+00:00       117.41      -0.006047\n",
    112        "2002-01-07 00:00:00+00:00       116.70      -0.002913\n",
    113        "2002-01-08 00:00:00+00:00       116.36      -0.005672\n",
    114        "2002-01-09 00:00:00+00:00       115.70       0.002247"
    115       ]
    116      },
    117      "execution_count": 4,
    118      "metadata": {},
    119      "output_type": "execute_result"
    120     }
    121    ],
    122    "source": [
    123     "df.head()"
    124    ]
    125   },
    126   {
    127    "cell_type": "code",
    128    "execution_count": 5,
    129    "metadata": {
    130     "collapsed": false
    131    },
    132    "outputs": [
    133     {
    134      "name": "stdout",
    135      "output_type": "stream",
    136      "text": [
    137       "0.0609729006529\n",
    138       "0.196057542257\n"
    139      ]
    140     }
    141    ],
    142    "source": [
    143     "# compute mean and sd annual return using daily returns(252 trading days per year)\n",
    144     "mean_annual_return = df.daily_returns.mean() * 252\n",
    145     "annualized_std = df.daily_returns.std() * (252**.5)\n",
    146     "print mean_annual_return\n",
    147     "print annualized_std"
    148    ]
    149   },
    150   {
    151    "cell_type": "code",
    152    "execution_count": 6,
    153    "metadata": {
    154     "collapsed": false
    155    },
    156    "outputs": [],
    157    "source": [
    158     "mean_excess_return = mean_annual_return - .04\n",
    159     "sharpe_ratio = mean_excess_return / annualized_std\n",
    160     "\n",
    161     "opt_leverage = mean_excess_return / (annualized_std**2)"
    162    ]
    163   },
    164   {
    165    "cell_type": "code",
    166    "execution_count": 7,
    167    "metadata": {
    168     "collapsed": false
    169    },
    170    "outputs": [
    171     {
    172      "name": "stdout",
    173      "output_type": "stream",
    174      "text": [
    175       "Sharpe Ratio: 0.106973189664\n",
    176       "Kelly Optimal Leverage: 0.545621394786\n"
    177      ]
    178     }
    179    ],
    180    "source": [
    181     "print \"Sharpe Ratio: {}\".format(sharpe_ratio)\n",
    182     "print \"Kelly Optimal Leverage: {}\".format(opt_leverage)"
    183    ]
    184   },
    185   {
    186    "cell_type": "code",
    187    "execution_count": 8,
    188    "metadata": {
    189     "collapsed": false
    190    },
    191    "outputs": [
    192     {
    193      "name": "stdout",
    194      "output_type": "stream",
    195      "text": [
    196       "If the kelly optimal leverage is 0.545621394786 and you have $100000 to invest, you should buy $54562 worth of SPY under the assumption you believe the expected values of your returns by viewing them as gaussian.\n"
    197      ]
    198     }
    199    ],
    200    "source": [
    201     "capital = 100000\n",
    202     "purchase = int(capital * opt_leverage)\n",
    203     "print \"If the kelly optimal leverage is {} and you have ${} to invest, you should \\\n",
    204     "buy ${} worth of SPY under the assumption you believe the \\\n",
    205     "expected values of your returns by viewing them as gaussian.\".format(opt_leverage, capital, purchase)"
    206    ]
    207   },
    208   {
    209    "cell_type": "markdown",
    210    "metadata": {
    211     "collapsed": true
    212    },
    213    "source": [
    214     "# Mean-Varience Example"
    215    ]
    216   },
    217   {
    218    "cell_type": "code",
    219    "execution_count": 9,
    220    "metadata": {
    221     "collapsed": false
    222    },
    223    "outputs": [],
    224    "source": [
    225     "import math\n",
    226     "import numpy as np\n",
    227     "import cvxopt as opt\n",
    228     "import matplotlib.pyplot as plt\n",
    229     "from cvxopt import blas, solvers"
    230    ]
    231   },
    232   {
    233    "cell_type": "code",
    234    "execution_count": 10,
    235    "metadata": {
    236     "collapsed": true
    237    },
    238    "outputs": [],
    239    "source": [
    240     "np.random.seed(89)"
    241    ]
    242   },
    243   {
    244    "cell_type": "code",
    245    "execution_count": 11,
    246    "metadata": {
    247     "collapsed": false
    248    },
    249    "outputs": [],
    250    "source": [
    251     "# prevent cvxopt progress from printing\n",
    252     "solvers.options['show_progress'] = False\n",
    253     "\n",
    254     "# num assets\n",
    255     "n = 4\n",
    256     "\n",
    257     "# number of observations\n",
    258     "nobs = 1000\n",
    259     "\n",
    260     "def rand_weights(n):\n",
    261     "    ''' Produces n random weights that sum to 1 '''\n",
    262     "    k = np.random.randn(n)\n",
    263     "    return k / sum(k)\n",
    264     "\n",
    265     "def gen_returns(asset_count, nobs, drift=0.0):\n",
    266     "    ''' \n",
    267     "    Creates normally distributed series \n",
    268     "    :params:\n",
    269     "        asset_count: <int> number of series to create\n",
    270     "        nobs: <int> number of observations\n",
    271     "        drift: <float> skews the distribution to one side\n",
    272     "    :returns:\n",
    273     "        np.ndarray with <asset_count> rows and <nobs> columns\n",
    274     "    '''\n",
    275     "    return np.random.randn(asset_count, nobs) + drift\n",
    276     "    \n",
    277     "def random_portfolio(returns, weight_func):\n",
    278     "    ''' \n",
    279     "    Returns the mean and standard deviation of returns for a random portfolio\n",
    280     "    '''\n",
    281     "    w = weight_func(returns.shape[0])\n",
    282     "    mu = np.dot(np.mean(returns, axis=1) , w)\n",
    283     "    sigma = math.sqrt(np.dot(w, np.dot(np.cov(returns), w)))\n",
    284     "    # This recursion reduces outliers\n",
    285     "    if sigma > 2:\n",
    286     "        return random_portfolio(returns, weight_func)\n",
    287     "    return sigma, mu"
    288    ]
    289   },
    290   {
    291    "cell_type": "code",
    292    "execution_count": 12,
    293    "metadata": {
    294     "collapsed": false
    295    },
    296    "outputs": [
    297     {
    298      "data": {
    299       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAHxCAYAAABjxF1TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt0VOW9P/73zGRCbpOEhCQqpKgJtaeUKkbLIaKxFWst\nlR611tCKIuoptbVFcamtwMFLaGsPSo9WUy8IVIX1RaV4O7VFf/ATAkWDoj9pCwlfy0UgCZg7uUxm\nfn/EGWYm+37fe96vtViLZDJ7nr1n75nnsz/P83l80Wg0CiIiIiIiIpLlt7sBREREREREbsEAioiI\niIiISCEGUERERERERAoxgCIiIiIiIlKIARQREREREZFCDKCIiIiIiIgUsiWAWrp0KWpra1FbW4uP\nPvoo6bH+/n7cdddduPrqqxU/h4iIiIiIyAqWB1A7duzA/v37sXbtWtTV1aGuri7p8d/+9rf46le/\nquo5REREREREVrA8gNq+fTumT58OAKioqEBHRwd6enrij99xxx34+te/ruo5REREREREVrA8gGpr\na8Po0aPjPxcVFaG1tTX+c05ODqLRqKrnEBERERERWSHD7gZEo1H4fD7Dn9PY2KinWURERERElAaq\nqqpU/b3lAVRpaSna2triP7e0tKCkpCTpb1KDIyXPEaL2YBB5UWNjI68Fos/xeiAaxmuBaJiWpIvl\nQ/guuOACvPnmmwCAjz/+GGVlZcjJyUn6m9QhfEqeQ0REREREZDbLM1CTJ0/GxIkTUVtbi0AggMWL\nF2P9+vUIhUKYPn065syZgyNHjuDw4cO44oorMGfOHFx99dUjnkNERERERGQ1W+ZALViwIOnns846\nK/7/lStXKnoOERERERGR1WxZSJeIiIiIiMiNGEAREREREREpxACKiIiIiIhIIQZQRERERERECjGA\nIiIiIiIiUogBFBERERERkUIMoIiIiIiIiBRiAEVERERERKQQAygiIiIiIiKFGEAREREREREpxACK\niIiIiIhIIQZQRERERERECjGAIiIiIiIiUogBFBERERERkUIMoIiIiIiIiBRiAEVERERERKQQAygi\nIiIiIiKFGEAREREREREpxACKiIiIiIhIIQZQRERERERECjGAIiIiIiIiUogBFBERERERkUIMoIiI\niIiIiBRiAEVERERERKQQAygiIiIiIiKFGEAREREREREpxACKiIiIiIhIIQZQRERERERECjGAIiIi\nIiIiUogBFBERERERkUIMoIiIiIiIiBRiAEVERERERKQQAygiIiIiIiKFGEAREREREREpxACKiIiI\niIhIIQZQRERERERECjGAIiIiIiIiUogBFBERERERkUIMoIiIiIiIiBRiAEVERERERKQQAygiIiIi\nIiKFMux40aVLl+LDDz8EANx7772YNGlS/LGGhgY88sgjCAQCuOiii3Drrbeip6cHd999Nzo7OzEw\nMICf/vSnmDZtmh1NJyIiIiKy1aL6BuxqagUAnF1ZggfmVdvcovRieQZqx44d2L9/P9auXYu6ujrU\n1dUlPV5XV4fHHnsMa9aswdatW9Hc3Iz169fjzDPPxOrVq/E///M/I55DRERERJQOFtU34IO9rYhG\ngWgU+GBvK+bc/yaaDrbb3bS0YXkAtX37dkyfPh0AUFFRgY6ODvT09AAADhw4gIKCApSVlcHn86Gm\npgbbtm1DcXEx2tuHT4qOjg4UFRVZ3WwiIiIiItvFMk+JjnX04cEVf7OhNenJ8gCqra0No0ePjv9c\nVFSEtrY2AEBra2tScFRUVITW1lZcfvnlOHz4ML75zW9i9uzZuOeee6xuNhERERERkT1zoBJFo1HZ\nxzZs2IBTTz0VTz31FP7xj39g0aJFWLduney2GxsbDWsnkZvxWiA6idcD0TBeC+50Rtko7DvSn/S7\nUHYAV0/N53tqEcsDqNLS0njGCQBaWlpQUlICACgrK0t67OjRoygtLcX7778fLxrxpS99CUeOHEE0\nGoXP55N8raqqKhP2gMhdGhsbeS0QfY7XA9EwXgvuVVUFzLn/TRzr6AMAFBdkYeXiy2xulXtpCTot\nH8J3wQUX4M033wQAfPzxxygrK0NOTg4AYOzYseju7sahQ4cQDoexadMmTJs2DePHj8euXbsAAIcO\nHUJOTo5s8ERERERE5EUL505BcUEWiguysHDuFLubk3Ysz0BNnjwZEydORG1tLQKBABYvXoz169cj\nFAph+vTpWLJkCRYsWAAAmDFjBsaPH49rr70Wv/zlLzF79myEw2Hcf//9VjebiIiIiMgRKscVMutk\nI1vmQMUCpJizzjor/v/zzjsPa9euTXo8JycHy5cvt6RtREREREREYiwfwkdERERERORWDKCIiIiI\niIgUYgBFRERERESkEAMoIiIiIiIihRhAERERERERKcQAioiIiIiISCEGUERERERERAoxgCIiIiIi\nIlKIARQREREREZFCDKCIiIiIiIgUYgBFRERERESkEAMoIiIiIiIihTLsbgARERERkdssqm/ArqZW\nAMDZlSV4YF61zS0iqzADRURERESkwqL6BnywtxXRKBCNAh/sbcWc+99E08F2u5tGFmAARURERESk\nQizzlOhYRx8eXPE3G1pDVmMARUREREREpBADKCIiIiIiFc6uLBnxu+KCLCycO8WG1pDVWESCiIiI\niEiFB+ZVY879b+JYRx+A4eBp5eLLbG6VO7mxGAczUEREREREKi2cOwXFBVnMPOng1mIczEARERER\nkWs4JWNROa6QWSedpIpxOPnYMgNFRERERK7g1owFeQsDKCIiIiJyBZYP9xa3FuNgAEVERERERJZ7\nYF41iguy4j/HinFUjiu0sVXyOAeKiIiIiFzh7MoSfLA3OQulNGPhlLlTlGzh3CnxDKLTM08xzEAR\nERERkStozVhw7pRzxYpxuCHzFMMAioiIiIhcQ0v5cM6dIiNxCB8RERERuQbLh5PdmIEiIiIiIk9z\na7U3ciYGUERERETkaW6t9kbOxACKiIiIiDxPy9wpIiGcA0VEREREnse5U2QUZqCIiIiIiIgUYgBF\nRERERESkEAMoIiIiIiIihRhAERERERERKcQAioiIiIiISCEGUERERERERAqxjDkRERFRGlhU34Bd\nTa0AgDPKRqGqyuYGEbkUM1BEREREHreovgEf7G1FNApEo8C+I/2Yc/+baDrYbnfTiFyHARQRERGR\nx8UyT4mOdfThwRV/s6E1RO5mSwC1dOlS1NbWora2Fh999FHSYw0NDbjmmmtQW1uLxx9/PP77V155\nBd/97ndx1VVXYfPmzVY3mYiIiIiIyPoAaseOHdi/fz/Wrl2Luro61NXVJT1eV1eHxx57DGvWrMHW\nrVvR3NyMzz77DL///e+xZs0a/OEPf8Bbb71ldbOJiIiIXOvsypIRvysuyMLCuVNsaA2Ru1leRGL7\n9u2YPn06AKCiogIdHR3o6elBbm4uDhw4gIKCApSVlQEAampqsG3bNhQVFaG6uho5OTnIycnB/fff\nb3WziYiIiEyTWODh7MoSPDCv2tDtPzCvGnPufxPHOvoAAKHsAFYuvszQ1yBzmX2OkHKWZ6Da2tow\nevTo+M9FRUVoa2sDALS2tqKoqCjpsdbWVhw6dAh9fX348Y9/jB/+8IfYtm2b1c0mIiIil1pU34CZ\n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\n",
    300       "text/plain": [
    301        "<matplotlib.figure.Figure at 0x7f74fc02aad0>"
    302       ]
    303      },
    304      "metadata": {},
    305      "output_type": "display_data"
    306     }
    307    ],
    308    "source": [
    309     "# gather returns and plot\n",
    310     "\n",
    311     "return_vec = gen_returns(n, nobs, drift=0.01)\n",
    312     "stds, means = np.column_stack(\n",
    313     "    [random_portfolio(return_vec, rand_weights) for _ in xrange(500)]\n",
    314     ")\n",
    315     "\n",
    316     "f, ax = plt.subplots()\n",
    317     "\n",
    318     "plt.plot(stds, means, 'o')\n",
    319     "ax.set_xlabel('Volitility')\n",
    320     "ax.set_ylabel('Return')\n",
    321     "\n",
    322     "# convert to matrix\n",
    323     "k = np.array(return_vec)\n",
    324     "S = opt.matrix (np.cov(k))\n",
    325     "pbar = opt.matrix(np.mean(k, axis=1))\n",
    326     "\n",
    327     "# conditioning optimizer\n",
    328     "G = -opt.matrix(np.eye(n))   # negative n x n identity matrix\n",
    329     "h = opt.matrix(0.0, (n ,1))\n",
    330     "A = opt.matrix(1.0, (1, n))\n",
    331     "b = opt.matrix(1.0)\n",
    332     "\n",
    333     "# expected returns\n",
    334     "N = 100\n",
    335     "mus = [10**(5.0* t/N - 1.0) for t in range(N)]\n",
    336     "\n",
    337     "# efficient frontier weights\n",
    338     "portfolios = [\n",
    339     "    solvers.qp(mu*S, -pbar, G, h, A, b)['x'] \n",
    340     "    for mu in mus\n",
    341     "]\n",
    342     "\n",
    343     "# risk and return\n",
    344     "returns = [blas.dot(pbar, x) for x in portfolios]\n",
    345     "risks = [np.sqrt(blas.dot(x, S*x)) for x in portfolios]\n",
    346     "plt.plot(risks, returns, 'y-o')\n",
    347     "\n",
    348     "def get_kelly_portfolios():\n",
    349     "    ww = np.dot(np.linalg.inv(opt.matrix(S)), opt.matrix(pbar))\n",
    350     "    rks = []; res = [];\n",
    351     "    for i in np.arange(0.05, 20, 0.0001):\n",
    352     "        w = ww / i\n",
    353     "        rks.append(blas.dot(pbar, opt.matrix(w)))\n",
    354     "        res.append(np.sqrt(blas.dot(opt.matrix(w), S*opt.matrix(w))))\n",
    355     "    return res, rks\n",
    356     "\n",
    357     "res, rks = get_kelly_portfolios()\n",
    358     "    \n",
    359     "# display kelly portfolios for various leverages\n",
    360     "plt.plot(res, rks, 'ko', markersize=3)\n",
    361     "plt.plot(res, np.array(rks) * -1, 'ko', markersize=3);"
    362    ]
    363   }
    364  ],
    365  "metadata": {
    366   "kernelspec": {
    367    "display_name": "Python 2",
    368    "language": "python",
    369    "name": "python2"
    370   }
    371  },
    372  "nbformat": 4,
    373  "nbformat_minor": 0
    374 }