ml-finance-python

python scripts for finance machine learning

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

Relative Value Factor Notebook.ipynb

(170455B)


      1 {
      2  "cells": [
      3   {
      4    "cell_type": "markdown",
      5    "metadata": {},
      6    "source": [
      7     "#Relative Value Factor Algorithm\n",
      8     "\n",
      9     "By Gil Wassermann\n",
     10     "\n",
     11     "Strategy taken from \"130/30: The New Long-Only\" by Andrew Lo and Pankaj Patel\n",
     12     "\n",
     13     "Part of the Quantopian Lecture Series:\n",
     14     "* www.quantopian.com/lectures\n",
     15     "* github.com/quantopian/research_public\n",
     16     "\n",
     17     "Notebook released under the Creative Commons Attribution 4.0 License. Please do not remove this attribution."
     18    ]
     19   },
     20   {
     21    "cell_type": "markdown",
     22    "metadata": {},
     23    "source": [
     24     "In the last notebook, we looked at traditional value factors that evaluated whether or not a stock could be considered cheap. However, many of the metrics in this last algorithm ignore subtleties that exist between industry groups. In this notebook, we will refine and add to these factors in order to devise metrics that are industry-relative. For this algorithm we will make use of Pipeline's classifiers and zscore method, which are described in detail here (https://www.quantopian.com/posts/pipeline-classifiers-are-here)."
     25    ]
     26   },
     27   {
     28    "cell_type": "markdown",
     29    "metadata": {},
     30    "source": [
     31     "First, let us import all necessary libraries and functions for this algorithm. These are similar to those in the Traditional Value Factor Algorithm, with the notable inclusion of Sector, a classifier."
     32    ]
     33   },
     34   {
     35    "cell_type": "code",
     36    "execution_count": 1,
     37    "metadata": {
     38     "collapsed": true
     39    },
     40    "outputs": [],
     41    "source": [
     42     "import numpy as np\n",
     43     "import pandas as pd\n",
     44     "import matplotlib.pyplot as plt\n",
     45     "from quantopian.pipeline.classifiers.morningstar import Sector\n",
     46     "from quantopian.pipeline import Pipeline\n",
     47     "from quantopian.pipeline.data.builtin import USEquityPricing\n",
     48     "from quantopian.research import run_pipeline\n",
     49     "from quantopian.pipeline.data import morningstar\n",
     50     "from quantopian.pipeline.factors import CustomFactor"
     51    ]
     52   },
     53   {
     54    "cell_type": "markdown",
     55    "metadata": {},
     56    "source": [
     57     "#Relative Value\n",
     58     "\n",
     59     "The metrics used to create this strategy are given by Lo/Patel as:\n",
     60     "\n",
     61     "* Industry-Relative Price to Trailing 12-Month Sales\n",
     62     "* Industry-Relative Price to Trailing 12-Month Earnings\n",
     63     "* Industry-Relative Price to Trailing 12-Month Cash Flows\n",
     64     "\n",
     65     "While many of these metrics may seem similar to those of the last notebook, the key addition is the fact that they are taken in the context of their own industry. In this notebook, we will see how this industry-relative approach captures certain nuances that more general factors miss."
     66    ]
     67   },
     68   {
     69    "cell_type": "markdown",
     70    "metadata": {},
     71    "source": [
     72     "##Industry-Relative Price to TTM Sales\n",
     73     "\n",
     74     "This is calculated as a simple ratio between price per share and trailing 12-month (TTM) sales. This data will eventually be standardized over industry groups. The standardization procedure is explained later in the notebook.\n",
     75     "\n",
     76     "Let us create a factor for this metric and have a look at the data. For an introduction to Pipeline Factors, have a look at (https://www.quantopian.com/posts/quantopian-lecture-series-long-slash-short-traditional-value-case-study)\n",
     77     "\n",
     78     "NB: Like the previous notebook, we are using Morningstar's built-in Price to Sales Ratio as an approximation of Price to TTM Sales for speed of computation."
     79    ]
     80   },
     81   {
     82    "cell_type": "code",
     83    "execution_count": 2,
     84    "metadata": {
     85     "collapsed": false
     86    },
     87    "outputs": [
     88     {
     89      "data": {
     90       "text/html": [
     91        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
     92        "<table border=\"1\" class=\"dataframe\">\n",
     93        "  <thead>\n",
     94        "    <tr style=\"text-align: right;\">\n",
     95        "      <th></th>\n",
     96        "      <th></th>\n",
     97        "      <th>Price / TTM Sales</th>\n",
     98        "      <th>Sector</th>\n",
     99        "    </tr>\n",
    100        "  </thead>\n",
    101        "  <tbody>\n",
    102        "    <tr>\n",
    103        "      <th rowspan=\"15\" valign=\"top\">2015-06-08 00:00:00+00:00</th>\n",
    104        "      <th>Equity(2 [AA])</th>\n",
    105        "      <td>0.6254</td>\n",
    106        "      <td>101</td>\n",
    107        "    </tr>\n",
    108        "    <tr>\n",
    109        "      <th>Equity(21 [AAME])</th>\n",
    110        "      <td>0.4797</td>\n",
    111        "      <td>103</td>\n",
    112        "    </tr>\n",
    113        "    <tr>\n",
    114        "      <th>Equity(24 [AAPL])</th>\n",
    115        "      <td>3.6187</td>\n",
    116        "      <td>311</td>\n",
    117        "    </tr>\n",
    118        "    <tr>\n",
    119        "      <th>Equity(25 [AA_PR])</th>\n",
    120        "      <td>NaN</td>\n",
    121        "      <td>101</td>\n",
    122        "    </tr>\n",
    123        "    <tr>\n",
    124        "      <th>Equity(31 [ABAX])</th>\n",
    125        "      <td>5.9388</td>\n",
    126        "      <td>206</td>\n",
    127        "    </tr>\n",
    128        "    <tr>\n",
    129        "      <th>Equity(39 [DDC])</th>\n",
    130        "      <td>1.7552</td>\n",
    131        "      <td>101</td>\n",
    132        "    </tr>\n",
    133        "    <tr>\n",
    134        "      <th>Equity(41 [ARCB])</th>\n",
    135        "      <td>0.3431</td>\n",
    136        "      <td>310</td>\n",
    137        "    </tr>\n",
    138        "    <tr>\n",
    139        "      <th>Equity(52 [ABM])</th>\n",
    140        "      <td>0.3650</td>\n",
    141        "      <td>310</td>\n",
    142        "    </tr>\n",
    143        "    <tr>\n",
    144        "      <th>Equity(53 [ABMD])</th>\n",
    145        "      <td>11.7812</td>\n",
    146        "      <td>206</td>\n",
    147        "    </tr>\n",
    148        "    <tr>\n",
    149        "      <th>Equity(62 [ABT])</th>\n",
    150        "      <td>3.6266</td>\n",
    151        "      <td>206</td>\n",
    152        "    </tr>\n",
    153        "    <tr>\n",
    154        "      <th>Equity(64 [ABX])</th>\n",
    155        "      <td>1.3845</td>\n",
    156        "      <td>101</td>\n",
    157        "    </tr>\n",
    158        "    <tr>\n",
    159        "      <th>Equity(66 [AB])</th>\n",
    160        "      <td>12.9702</td>\n",
    161        "      <td>103</td>\n",
    162        "    </tr>\n",
    163        "    <tr>\n",
    164        "      <th>Equity(67 [ADSK])</th>\n",
    165        "      <td>4.8664</td>\n",
    166        "      <td>311</td>\n",
    167        "    </tr>\n",
    168        "    <tr>\n",
    169        "      <th>Equity(69 [ACAT])</th>\n",
    170        "      <td>0.6112</td>\n",
    171        "      <td>102</td>\n",
    172        "    </tr>\n",
    173        "    <tr>\n",
    174        "      <th>Equity(70 [VBF])</th>\n",
    175        "      <td>NaN</td>\n",
    176        "      <td>-1</td>\n",
    177        "    </tr>\n",
    178        "  </tbody>\n",
    179        "</table>\n",
    180        "</div>"
    181       ],
    182       "text/plain": [
    183        "                                              Price / TTM Sales  Sector\n",
    184        "2015-06-08 00:00:00+00:00 Equity(2 [AA])                 0.6254     101\n",
    185        "                          Equity(21 [AAME])              0.4797     103\n",
    186        "                          Equity(24 [AAPL])              3.6187     311\n",
    187        "                          Equity(25 [AA_PR])                NaN     101\n",
    188        "                          Equity(31 [ABAX])              5.9388     206\n",
    189        "                          Equity(39 [DDC])               1.7552     101\n",
    190        "                          Equity(41 [ARCB])              0.3431     310\n",
    191        "                          Equity(52 [ABM])               0.3650     310\n",
    192        "                          Equity(53 [ABMD])             11.7812     206\n",
    193        "                          Equity(62 [ABT])               3.6266     206\n",
    194        "                          Equity(64 [ABX])               1.3845     101\n",
    195        "                          Equity(66 [AB])               12.9702     103\n",
    196        "                          Equity(67 [ADSK])              4.8664     311\n",
    197        "                          Equity(69 [ACAT])              0.6112     102\n",
    198        "                          Equity(70 [VBF])                  NaN      -1"
    199       ]
    200      },
    201      "execution_count": 2,
    202      "metadata": {},
    203      "output_type": "execute_result"
    204     }
    205    ],
    206    "source": [
    207     "# Custom Factor 1 : Price to Trailing 12 Month Sales       \n",
    208     "class Price_to_TTM_Sales(CustomFactor):\n",
    209     "    inputs = [morningstar.valuation_ratios.ps_ratio]\n",
    210     "    window_length = 1\n",
    211     "    \n",
    212     "    def compute(self, today, assets, out, ps):\n",
    213     "        out[:] = ps[-1]\n",
    214     "\n",
    215     "# create pipeline\n",
    216     "temp_pipe_1 = Pipeline()\n",
    217     "\n",
    218     "# add our factor\n",
    219     "temp_pipe_1.add(Price_to_TTM_Sales(), 'Price / TTM Sales')\n",
    220     "\n",
    221     "# add sector classifier\n",
    222     "temp_pipe_1.add(Sector(), 'Sector')\n",
    223     "\n",
    224     "# get data\n",
    225     "temp_res_1 = run_pipeline(temp_pipe_1, '2015-06-06', '2015-06-06')\n",
    226     "\n",
    227     "# show first 15 rows\n",
    228     "temp_res_1.head(15)"
    229    ]
    230   },
    231   {
    232    "cell_type": "markdown",
    233    "metadata": {},
    234    "source": [
    235     "Before performing analysis on this data, let us look at the Sector column. This is an example of a Pipeline Classifier. Whereas a CustomFactor outputs numerical information, a Classifier ouputs categorical information. For example, Sector can take on one of a certain number of discrete integers (11 as of writing), each of which corresesponds to the industry of the company that has issued the equity. These are listed fully in https://www.quantopian.com/help. \n",
    236     "\n",
    237     "As an example, let us examine the differences between two industries: Retail (here, given by code 102) and Technology (311). Retail companies tend to have small profit margins, whereas tech companies tend to have large profit margins. You make a much larger mark-up on a microchip than an paperclip. This is reflected in the Price to Sales Ratio. Tech sales dollars are valued more, as they generate more profit for the company. Therefore, investors are willing to pay a higher price for those sales. This increases the numerator of the Price to Sales equation, making the ratio larger for companies with big profit margins.  \n",
    238     "\n",
    239     "NB: We look at the quartiles of Price to Sales Ratios in order to limit the effect of outliers. Certain companies may employ peculiar strategies that lead to extreme values that could distort metrics like the mean or standard deviation."
    240    ]
    241   },
    242   {
    243    "cell_type": "code",
    244    "execution_count": 4,
    245    "metadata": {
    246     "collapsed": false
    247    },
    248    "outputs": [
    249     {
    250      "name": "stdout",
    251      "output_type": "stream",
    252      "text": [
    253       "Retail Quartiles: \n",
    254       "0.25    0.5925\n",
    255       "0.50    1.1198\n",
    256       "0.75    2.0755\n",
    257       "dtype: float64\n",
    258       "\n",
    259       "Tech Quartiles: \n",
    260       "0.25    1.045375\n",
    261       "0.50    2.120600\n",
    262       "0.75    4.023625\n",
    263       "dtype: float64\n"
    264      ]
    265     }
    266    ],
    267    "source": [
    268     "# Separate sectors into two data frames\n",
    269     "retail_df = temp_res_1[temp_res_1['Sector'] == 102]['Price / TTM Sales']\n",
    270     "tech_df = temp_res_1[temp_res_1['Sector'] == 311]['Price / TTM Sales']\n",
    271     "\n",
    272     "# get quartiles and print results\n",
    273     "print 'Retail Quartiles: \\n' + str(retail_df.quantile([0.25, 0.5, 0.75])) + '\\n'\n",
    274     "print 'Tech Quartiles: \\n' + str(tech_df.quantile([0.25, 0.5, 0.75]))"
    275    ]
    276   },
    277   {
    278    "cell_type": "markdown",
    279    "metadata": {},
    280    "source": [
    281     "Indeed, the median Price to Rales Ratio for tech companies is almost double that of retail companies, which agrees with our narrative explanation. From this data, it is clear that comparisons of Price to Sales Ratios are only really valid when they are conducted within a single industry. This is because a good Price to Sales Ratio for one industry might be terrible for another. "
    282    ]
    283   },
    284   {
    285    "cell_type": "markdown",
    286    "metadata": {},
    287    "source": [
    288     "##Industry-Relative Price to TTM Earnings\n",
    289     "\n",
    290     "This is calculated as a simple ratio between price per share and TTM earnings per share standardized over industry groups.\n",
    291     "\n",
    292     "At first glance this might look like a better metric than the Price to Sales Ratio as earnings take both revenue and cost into account. However, Price to Earnings Ratios can also be misleading as the accounting conventions used to calculate it are quite vague.\n",
    293     "\n",
    294     "Although it is possible for two companies in the same industry to have completely different approaches to calculating their earnings, companies in the same sector are more likely to use similar methodologies to eachother in order to maintain comparability. Intra-industry calculations are by no means identical, however they are more likely to be similar than inter-industry comparisons.\n",
    295     "\n",
    296     "Let us load up the data for this factor and plot the box and whisker plots for each sector. Box and whisker plots (known as boxplots in most Python libraries) are a quick and easy way to have a look at the distribution of data points. The \"whiskers\" represent the high and low values while the \"box\" designates the 25th and 75th percentiles (interquartile range). The 50th percentile (median) is represented by a notch within the \"box\". Once again, we will use the Morningstar built-in fundamental as an approximation to the TTM transformation. "
    297    ]
    298   },
    299   {
    300    "cell_type": "code",
    301    "execution_count": 5,
    302    "metadata": {
    303     "collapsed": false
    304    },
    305    "outputs": [
    306     {
    307      "data": {
    308       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAIMCAYAAADGsixvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt4VNXZ/vF7EpKACVQCgkZEPBRjGVBIPKBQDCKUaG2p\nclBIPNCIWsFDxSAoVKpFsIWiiByEFqUWec0rRUVi+VmpQhUSFAmKlBZBAoQzFBJICPv3B828JGQy\nM2Fn71kz3891zXVBmOysecjMnvtZa6/xWJZlCQAAAABwmhi3BwAAAAAA4YrABAAAAAB+EJgAAAAA\nwA8CEwAAAAD4QWACAAAAAD8ITAAAAADgB4EJACJUcXGxunTpouzsbGVnZ2vQoEFas2aNLcd+8skn\ntXz5cr//XlBQoH379tnys+xWWlqqnj17VvtacXGxbrvttpCPVVJSovvuu09ZWVkaMGCAxowZo+PH\nj4d0jB07dujLL78M+WcDAJxBYAKACHbxxRfrtdde02uvvabHH39cL7/8siM/Ny8vT3v37nXkZ4XK\nsix5PJ7Tvl7b1wL5/e9/r9tuu02vv/66Fi5cqEaNGunjjz8O6Riffvqp1q1bF/LPBgA4o5HbAwAA\nNJxTP5t89+7dOvfccyWdnBkZPXq0ysvLFRsbq+eee047duzQq6++qhkzZqigoECzZs3SuHHj9PDD\nD+uiiy7S5s2b1alTJ40dO9Z3zOPHj+vpp5/Wtm3bVFFRoeHDh8vj8WjZsmXatGmTXnrpJd/PPH78\nuEaOHKkdO3aoc+fOev/99/XRRx8pKytLl112mU6cOKHHHntMo0aN0qFDh1RZWamnnnpKl19+ua69\n9lp9+umnkqQRI0YoKytLn332mXbu3KkdO3Zo9+7deuKJJ9StWzf99a9/1dy5c9WoUSN5vV7l5ubq\n8OHDGjFihMrLy9WlS5daa1VeXq6RI0fq22+/VYcOHfTLX/5St99+u/Lz8yVJixcv1tdff63c3Fzf\n9/znP//RoUOHfH9/5plnfH+eMmWK1qxZo8rKSg0ePFg333yztm/frtzcXFmWpZSUFOXm5uqll15S\nXFycUlJSdP7552v8+PGKiYlRYmKiJk6cqA0bNmju3LkqLS3VE088Ia/Xe6a/FgCAEBCYACCCbd68\nWdnZ2Tp27Jh27dqlV199VZI0depU3X777erbt6/y8/P10ksv6fnnn1deXp5Wrlyp6dOn6/nnn5ck\nffPNN3r55ZfVunVr9e/fXxs2bPAd/91331Xjxo31+uuva9euXcrKylJ+fr5SU1P1q1/9yheWJOnj\njz9WeXm5FixYoI8++kjz5s3z/dv3v/99DRw4UC+//LKuvPJK/fznP1dRUZF+85vf6PXXX/c7+7Nr\n1y7NmTNHGzduVG5urrp06aJXXnlFb775puLi4vTII49ozZo12rBhg9q3b69Ro0ZpyZIleu+99047\n1r///W/Nnj3b9zh37Nih1NRUFRQUKD09XcuWLdOwYcOqfU9OTo4efPBBLVq0SNddd51+/OMfq23b\ntiooKND27dv1+uuvq7y8XD/72c900003acqUKRo6dKhuuOEG/fa3v1VxcbF+9rOfqXnz5srIyNBd\nd92l3NxcdezYUXPnztW8efN0zTXXaOPGjfrggw/UqBGnbQBwGkvyACCCVS3Je/PNNzVnzhw98sgj\nqqysVFFRka655hpJ0jXXXKOvv/5akjRy5Eg9/fTTuv7669WmTRtJUrt27dS6dWtJ0hVXXKHNmzf7\njl9UVKSrr75aktSqVSslJCTo4MGDkqrPbknSv/71L9/sTo8ePRQbG+v7t06dOp12PK/Xq61bt9Z6\nrCpdu3aVJLVv3167du3Spk2btH37dg0dOlRZWVnaunWrduzYoX/961/q3Lmz7/HW5sILL/Q9Tq/X\nq2+//VY//elP9c477+jYsWPatm2bOnToUO17rrjiCn344YcaOnSodu3apf79+2vFihX6/PPP9eWX\nXyo7O1tDhw6VdHJW76uvvvKN4/HHH/c97lNr1LFjR984q/5fUlNTCUsA4BJefQEgSlx88cVq0qSJ\nduzYoZiYGF8IqaioUEzMyf7Z4cOH1bhxY5WUlPi+78SJE9X+XHVf6eR1P6eGmYqKimpB6FSWZVX7\nt1NnjeLi4k77miRVVlaedpxTN1U4dWySFB8frw4dOmjOnDnVvl5YWOgbd83v8cfj8ah79+564YUX\ntHz5ct14442n3efYsWNKSEhQz5491bNnT3Xu3FnvvvuuUlNTddttt+m+++6rdv/Y2Nigf/6p/y9V\n9QEAOI8ZJgCIYKeGmQMHDviuY+rYsaPvmqBVq1b5rot57rnnNHnyZJWUlGjt2rWSpO+++0579uzR\niRMntHbtWl166aW+Y3bq1Ml3nKoglpSUpJiYmNN2i2vbtq2KiookSZ988kmtYejUcX3xxRdq3769\nJCkmJkbHjh1TWVmZb9ZFOhmEJGnDhg1KSUlRu3bttHnzZt8OfS+99JJ27dqliy66yLexQtXxa9q6\ndavvca5bt04XX3yxGjVqpOuuu06TJ0/Wrbfeelptb7nlFm3atMn3tZ07d6pt27bq1KmTPvzwQ1mW\npWPHjunZZ5897fG9+OKL+sc//iGPx+OrRfv27X11P/X/BQDgHmaYACCCffvtt8rOzpZlWaqoqNDY\nsWPVqFEjDR8+XGPGjNHChQsVHx+v5557TkuXLtW5556ryy67TE888YSeeOIJTZ48We3atdPkyZO1\nadMmpaWl6ZJLLvEdPzMzU5999pmys7N1/PhxjR8/XpJ01VVX6eGHH9b06dN998/IyFBeXp4GDx6s\nq6++Wmeffbak6rNK2dnZevLJJ3XXXXfJsiyNGzdOknTHHXeof//+uvTSS6uFiKSkJD3wwAMqLi7W\nmDFj1LhxY40ePVo5OTlKSEjQD37wA7Vq1Uo//elP9Ytf/EL33HOP300fLr/8ck2ZMkX//Oc/1aVL\nF9+4+/btq3Xr1umCCy6odn+Px6PJkydX2+ihTZs2GjdunBo3bqxrr71WAwcOlCTdeeedkqThw4fr\nySef1BtvvKGUlBQNHz5clmVp1KhRSk5O1pgxY/TMM88oJiZGzZo104QJE7R+/fp6/M8DAOzisfwt\nDAcARL3i4mKNGDFCeXl5Z3ysgwcP6rPPPlPv3r1VUlKie+65R0uWLKn38aZNm6bmzZtr8ODBZzy2\nukyZMkXt2rVTv379GvTnAADCEzNMAIA61efziWqTmJio999/X3PmzJFlWRo9erQtx21IQ4cOVWJi\noh555BG3hwIAcAkzTAAAAADgB5s+AAAAAIAfBCYAAAAA8IPABAAAAAB+EJgAAAAAwA8CEwAAAAD4\nQWACAAAAAD8ITAAAAADgB4EJAAAAAPwgMAEAAACAHwQmAAAAAPCDwAQAAAAAfhCYAAAAAMAPAhMA\nAAAA+EFgAgAAAAA/CEwAAAAA4AeBCQAAAAD8IDABAAAAgB8EJgAAAADwg8AEAAAAAH4QmAAAAADA\nDwITAAAAAPjRyO0BAAAaXmpqqi688ELFxsaqsrJSzZo102OPPaauXbuedt+SkhL9/Oc/1zvvvGPL\nz66oqNBNN92kjz76yPe1TZs2afjw4fJ4PDp06JCOHDmi8847T5L005/+VJ9//rm+/fZbSdLmzZt1\n4YUXKiYmRk2bNtXChQuVlZWlzZs36+OPP5bH4/Ed9y9/+Ytyc3P1+uuv66qrrqo2jrffflvjx4/3\n/RxJsixL5557rv7whz/Y8lglKTMzU/Pnz1dycrJtxwQAuIfABABRwOPx6PXXX1erVq0kSWvWrNED\nDzygpUuXqnnz5r77WZal1q1b2xaWJOmLL75Qp06dqn3t0ksv1fvvvy/pZJB55513NHfu3Fq///LL\nL6829irx8fH69NNPq4W+999/XykpKX7H0rlzZ78/J1iWZVULaTUtWbLkjI4PAAgvBCYAiAKWZcmy\nLN/fu3TporZt2+qLL75Q+/btNWjQIN1yyy1at26dJk6cqN69e2v9+vWSpAkTJmjZsmWKi4tT//79\nNXToUEnStGnT9O6776q8vFy9evXSk08+WWuQWLlyZa0zWfUde5Xu3bvrnXfe8R370KFD+u6779Sm\nTZt6/ZyjR49q1KhR2rBhg44fP66bbrpJubm5kqSsrCylp6frgw8+0LPPPquFCxcqJSXFNxPWrl07\nvfLKK0pISFBqaqqWL1+uLVu2aPLkybr66qu1bNkylZeX6/nnn1d6eroOHjyoESNG6LvvvlOnTp3U\ntGlTtW7dWg899JDmz5+vN954Q5KUlJSkCRMm6JJLLqln9QAAZ4prmAAgSh0/flzx8fGSpP379ys1\nNVXz58+XJF/w+ctf/qKioiL99a9/1VtvvaU//elPWrdunRYtWqT8/Hzl5eVp2bJl2rp1q+9Nfk1n\nGpj8ycjI0CeffKKKigpJUn5+vnr16lXv473xxhv6z3/+o6VLl+rtt9/W22+/rTVr1vj+ff369Xrv\nvffUuXNn38+bOnWqli1bpn379umvf/2rJFULjV999ZU6d+6sJUuW6I477tArr7wiSZoxY4ZatGih\nDz/8UDk5OXr33XclSUeOHNGLL76ovLw8LVmyRPfff3+1pYwAAOcRmAAgCi1fvlx79uxRly5dJEmV\nlZW1ho2///3v6tOnj2JiYpSUlKQlS5aoY8eO+uijj3TbbbcpMTFRMTExuv322/XBBx+c9v2HDx/W\n3r171a5dO9sfQ2Jiorp06aK///3vkk4uhevbt2+ts1FVPv/8c2VmZiozM1N9+/ZVZmam/vjHP0qS\n7r33Xk2fPl2S1LRpU33/+9/Xd9995/veH/7wh9WO1aNHDzVt2lQxMTFq3769tm/fLknVfn5SUpIy\nMjIkST/4wQ989yksLNTNN98sSerQoYNvyWJCQoI8Ho/+53/+R3v37lXPnj19M3oAAHewJA8AokR2\ndrZiY2N14sQJnX/++Zo9e7aaNGkiSYqNjVViYuJp33PgwAE1a9bM9/fGjRtLkv7zn/9o7ty5Wrhw\noSzL0okTJ2rd5ODTTz89bfMFO91888165513dOWVV2rPnj1KTU2t8/51XcO0ZcsWTZgwQZs3b1ZM\nTIx27typ2267zffv3/ve96rdv2nTpr4/V9W1Jn/3OXjwYLXjtW7dWpLUqFEjzZs3T6+88opefPFF\npaamauzYsWrfvn2djwsA0HAITAAQJWrbOCGQs88+W/v37/f9fe/evUpISFCrVq3Us2dPDR48uM7v\nX7lypa677rp6jTcYPXr00DPPPKN3331Xffr0OaNjjR8/Xl6vVzNmzJAk3XHHHXYMsVZJSUkqLS31\n/X337t1q27atpJM7Gk6dOlXHjx/X7NmzNW7cOP35z39usLEAAOrGkjwAiBJ1LVWr+W9Vf7/xxht9\nGzuUlpbqzjvv1KZNm3TjjTdq8eLFOnr0qCTpzTff1KJFi047bkNdv1QlPj5e3bp109y5c9W3b9+A\n96+rBvv27dPll18uSVqxYoW2bNmiI0eO2DbWU3Xq1ElLly6VJH399df68ssvJUkbN27Uww8/rIqK\nCjVq1Eher1cxMZyqAcBNzDABQBSoaxvs2v696u+ZmZn65ptv1KdPHyUkJKh///668sorJZ38LKV+\n/frJ4/Gobdu2eu6556odY8eOHYqLi1PLli1tH/upX7v55pv11Vdf+XaSq+uxfvHFF8rMzPT9vWqL\n8D/+8Y+6//77NWHCBL388svq1auXHnroIb344ovq0KFDwPoFGm9N999/vx555BH16dNHV155pXr1\n6iWPx6P27durTZs2uuWWWxQfH6/ExESNHTs26J8NALCfx6qr3fZfGzZs0PDhw3X33Xdr8ODB2rlz\np0aOHCnLsnTOOedo0qRJiouL0+LFi/Xaa68pNjZW/fv31+233+7EYwAAwGgPP/yw0tPTlZWV5fZQ\nAAA1BJznLysr08SJE3X99df7vjZ16lRlZWVp/vz5atu2rfLy8lRWVqbp06dr3rx5eu211zRv3jwd\nOnSoQQcPAICJ/vSnP+n++++XZVnau3evVq1a5Zu5AwCEl4CBKSEhQTNnzqy2pGLVqlW+bVIzMjK0\n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\n",
    309       "text/plain": [
    310        "<matplotlib.figure.Figure at 0x7f9a6a45ab50>"
    311       ]
    312      },
    313      "metadata": {},
    314      "output_type": "display_data"
    315     }
    316    ],
    317    "source": [
    318     "# Custom Factor 2 : Price to Trailing 12 Month Earnings\n",
    319     "class Price_to_TTM_Earnings(CustomFactor):\n",
    320     "    inputs = [morningstar.valuation_ratios.pe_ratio]\n",
    321     "    window_length = 1\n",
    322     "    \n",
    323     "    def compute(self, today, assets, out, pe):\n",
    324     "        out[:] = pe[-1]\n",
    325     "        \n",
    326     "temp_pipe_2 = Pipeline() \n",
    327     "temp_pipe_2.add(Price_to_TTM_Earnings(), 'Price / TTM Earnings')\n",
    328     "temp_pipe_2.add(Sector(), 'Sector')\n",
    329     "temp_res_2 = run_pipeline(temp_pipe_2, '2015-06-06', '2015-06-06')\n",
    330     "\n",
    331     "# clean extreme data points\n",
    332     "earnings_frame = temp_res_2[temp_res_2['Price / TTM Earnings'] < 100]\n",
    333     "\n",
    334     "# create boxplot by sector\n",
    335     "earnings_frame.boxplot(column='Price / TTM Earnings', by='Sector');"
    336    ]
    337   },
    338   {
    339    "cell_type": "markdown",
    340    "metadata": {},
    341    "source": [
    342     "From this graph it is easy to see that the makeup of Price to Earnings Ratios for different sectors differs substantially. Therefore, an industry-relative metric will be a more discerning value than a universe-wide one."
    343    ]
    344   },
    345   {
    346    "cell_type": "markdown",
    347    "metadata": {},
    348    "source": [
    349     "##Industry-Relative Price to TTM Cash Flows\n",
    350     "\n",
    351     "This is calculated as a simple ratio between price per share and TTM free cash flows per share standardized over industry groups.\n",
    352     "\n",
    353     "Unlike earnings, a company's cash flows are a very definite metric and is not subject to accounting irregularities. However, this, too, can benefit from an industry-relative approach as different industries have different regular cash flows.\n",
    354     "\n",
    355     "We will apply the same methodology as the previous factor in order to examine the data."
    356    ]
    357   },
    358   {
    359    "cell_type": "code",
    360    "execution_count": 6,
    361    "metadata": {
    362     "collapsed": false
    363    },
    364    "outputs": [
    365     {
    366      "data": {
    367       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0wAAAIMCAYAAADGsixvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYVPW+x/HPgICGWaJpYamZO207agpmlh6FCi+VJysv\npdDFtNNFdzdDxbTaWWk7zZ1ZXmA/prXVo2VWKtWp3F66CJpJpW7LMlHxLikICOv8wXGOKMsZYDFr\n1vB+Pc88T4zDj+98Y1jzWb/f+o3LMAxDAAAAAICzhNhdAAAAAAAEKgITAAAAAJggMAEAAACACQIT\nAAAAAJggMAEAAACACQITAAAAAJggMAFAkMrOzlbHjh2VlJSkpKQkDRo0SBs2bLBk7DFjxmjVqlWm\n/56RkaFDhw5Z8rOslpeXp/j4+DL3ZWdn64477qjwWDk5ORo+fLgSExM1YMAApaSk6OTJkxUaY8+e\nPfr+++8r/LMBAP5BYAKAINaiRQu9/fbbevvtt/XUU0/pjTfe8MvPXbJkiQ4ePOiXn1VRhmHI5XKd\ndX9593nz2muv6Y477tC8efO0aNEi1apVS6tXr67QGF9//bU2b95c4Z8NAPCPWnYXAACoPqd/Nvn+\n/ft18cUXSyqdGRk7dqwKCwsVGhqqiRMnas+ePZozZ47eeustZWRkaNasWZowYYL+8pe/6PLLL9eO\nHTvUrl07jR8/3jPmyZMn9cwzz2jXrl0qKirSiBEj5HK59Nlnn2n79u16/fXXPT/z5MmTGjVqlPbs\n2aMOHTpoxYoV+vLLL5WYmKhWrVqppKRETzzxhEaPHq3c3FwVFxdr3Lhxuuqqq3Tttdfq66+/liSN\nHDlSiYmJ+uabb7R3717t2bNH+/fv19NPP62uXbvq008/VVpammrVqiW3263k5GQdO3ZMI0eOVGFh\noTp27FhurwoLCzVq1Cj9+uuvatOmjZ588kndeeedSk9PlyQtW7ZMP/30k5KTkz3f88cffyg3N9fz\n9XPPPef576lTp2rDhg0qLi7W4MGDdfPNN2v37t1KTk6WYRiKjo5WcnKyXn/9dYWFhSk6OlpNmjTR\n888/r5CQEEVGRmrSpEnasmWL0tLSlJeXp6efflput7uqvxYAgAogMAFAENuxY4eSkpJUUFCgffv2\nac6cOZKkadOm6c4771Tv3r2Vnp6u119/XS+//LKWLFmidevWacaMGXr55ZclSVu3btUbb7yhxo0b\nq3///tqyZYtn/I8++ki1a9fWvHnztG/fPiUmJio9PV2tW7fWs88+6wlLkrR69WoVFhZqwYIF+vLL\nLzV37lzPv/3pT3/SwIED9cYbb+jqq6/WAw88oKysLL344ouaN2+e6ezPvn37lJqaqm3btik5OVkd\nO3bUm2++qYULFyosLEyPPfaYNmzYoC1btujKK6/U6NGjtXz5cn388cdnjfXLL79o9uzZnue5Z88e\ntW7dWhkZGYqNjdVnn32mBx98sMz3DBs2TA8//LCWLl2q6667TrfeequaNm2qjIwM7d69W/PmzVNh\nYaFuv/123XTTTZo6daqGDh2qHj166G9/+5uys7N1++23q379+oqLi9M999yj5ORktW3bVmlpaZo7\nd646d+6sbdu26ZNPPlGtWhy2AcDfWJIHAEHs1JK8hQsXKjU1VY899piKi4uVlZWlzp07S5I6d+6s\nn376SZI0atQoPfPMM7r++ut16aWXSpKaN2+uxo0bS5Lat2+vHTt2eMbPysrSNddcI0lq1KiRIiIi\ndPToUUllZ7ck6eeff/bM7nTv3l2hoaGef2vXrt1Z47ndbu3cubPcsU7p0qWLJOnKK6/Uvn37tH37\ndu3evVtDhw5VYmKidu7cqT179ujnn39Whw4dPM+3PM2aNfM8T7fbrV9//VW33XabPvzwQxUUFGjX\nrl1q06ZNme9p3769Pv/8cw0dOlT79u1T//79tXbtWm3cuFHff/+9kpKSNHToUEmls3o//vijp46n\nnnrK87xP71Hbtm09dZ76/9K6dWvCEgDYhL++AFBDtGjRQnXq1NGePXsUEhLiCSFFRUUKCSk9f3bs\n2DHVrl1bOTk5nu8rKSkp89+nHiuVXvdzepgpKioqE4ROZxhGmX87fdYoLCzsrPskqbi4+KxxTt9U\n4fTaJCk8PFxt2rRRampqmfszMzM9dZ/5PWZcLpe6deumV155RatWrdINN9xw1mMKCgoUERGh+Ph4\nxcfHq0OHDvroo4/UunVr3XHHHRo+fHiZx4eGhvr880///3KqPwAA/2OGCQCC2Olh5siRI57rmNq2\nbeu5Jujbb7/1XBczceJETZkyRTk5Odq0aZMk6ffff9eBAwdUUlKiTZs2qWXLlp4x27Vr5xnnVBCr\nW7euQkJCztotrmnTpsrKypIkrVmzptwwdHpd3333na688kpJUkhIiAoKCpSfn++ZdZFKg5Akbdmy\nRdHR0WrevLl27Njh2aHv9ddf1759+3T55Zd7NlY4Nf6Zdu7c6XmemzdvVosWLVSrVi1dd911mjJl\nivr27XtWb2+55RZt377dc9/evXvVtGlTtWvXTp9//rkMw1BBQYFeeOGFs57f3//+d3311VdyuVye\nXlx55ZWevp/+/wUAYB9mmAAgiP36669KSkqSYRgqKirS+PHjVatWLY0YMUIpKSlatGiRwsPDNXHi\nRK1cuVIXX3yxWrVqpaefflpPP/20pkyZoubNm2vKlCnavn27YmJidMUVV3jG79Onj7755hslJSXp\n5MmTev755yVJnTp10l/+8hfNmDHD8/i4uDgtWbJEgwcP1jXXXKMLL7xQUtlZpaSkJI0ZM0b33HOP\nDMPQhAkTJEl33XWX+vfvr5YtW5YJEXXr1tVDDz2k7OxspaSkqHbt2ho7dqyGDRumiIgI/fnPf1aj\nRo1022236ZFHHtF9991nuunDVVddpalTp+rf//63Onbs6Km7d+/e2rx5sy677LIyj3e5XJoyZUqZ\njR4uvfRSTZgwQbVr19a1116rgQMHSpLuvvtuSdKIESM0ZswYvfvuu4qOjtaIESNkGIZGjx6tqKgo\npaSk6LnnnlNISIjq1aunl156ST/88EMl/s8DAKziMswWhgMAarzs7GyNHDlSS5YsqfJYR48e1Tff\nfKOEhATl5OTovvvu0/Llyys93vTp01W/fn0NHjy4yrWdy9SpU9W8eXP169evWn8OACAwMcMEADin\nynw+UXkiIyO1YsUKpaamyjAMjR071pJxq9PQoUMVGRmpxx57zO5SAAA2YYYJAAAAAEyw6QMAAAAA\nmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMA\nAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJ\nAhMAAAAAmCAwAQAAAIAJAhMAAAAAmCAwAQAAAIAJAhMAAAAAmKhldwEAAOu1bt1azZo1U2hoqIqL\ni1WvXj098cQT6tKly1mPzcnJ0QMPPKAPP/zQkp9dVFSkm266SV9++aXnvu3bt2vEiBFyuVzKzc3V\n8ePHdckll0iSbrvtNm3cuFG//vqrJGnHjh1q1qyZQkJCdP7552vRokVKTEzUjh07tHr1arlcLs+4\nH3zwgZKTkzVv3jx16tTprFr27dunV199VRs3bpTL5VJkZKQSExPVr1+/Sj237OxsJSQk6Icffjjr\n344dO6bBgwfrxIkTmjJligYMGFDu4wAAzkJgAoAg5HK5NG/ePDVq1EiStGHDBj300ENauXKl6tev\n73mcYRhq3LixZWFJkr777ju1a9euzH0tW7bUihUrJEnvv/++PvzwQ6WlpZX7/VdddVWZ2k8JDw/X\n119/XSb0rVixQtHR0eWOk5eXpyFDhqhv3756+eWX5XK59Msvv2j48OE6efKk+vfvX6nnd3pgO92W\nLVuUm5urL774QtnZ2aaPAwA4C0vyACAIGYYhwzA8X3fs2FFNmzbVd999p+zsbHXr1k2TJk1SYmKi\nsrOz1aZNG89jX3rpJd1www3q1auXUlNTPfdPnz5dvXr1Unx8vF588cUy459u3bp15c5kVbb2U7p1\n61Ym2OXm5ur333/XpZdeWu4477//vho0aKBHH33UE15atGihN954QzExMZKkjRs36vbbb1fv3r11\nyy236KuvvpIkFRcXa9y4cerVq5d69uypkSNH6vjx45763nnnHd16662Kj4/XypUrtWfPHo0aNUoH\nDhxQnz59dPjw4TLPZ+rUqerdu7f69OmjMWPGKD8/X9OmTdNrr70mSSopKVFMTIz++7//W5J05MgR\nde7cWUVFRUpJSSm3DgCAfxCYAKCGOHnypMLDwyVJhw8fVuvWrTV//nxJ/z9r8sEHHygrK0uffvqp\nFi9erHfeeUebN2/W0qVLlZ6eriVLluizzz7Tzp079e6775b7c6oamMzExcVpzZo1KioqkiSlp6fr\nxhtvNH38+vXr1aNHj7Pub9WqlVq0aCFJGj9+vO6//36tWLFCDzzwgCZMmCBJWrNmjbKzs7Vy5Uql\np6erdevW+u677ySVhhuXy6UPP/xQycnJmjJlii655BJNmjRJ0dHRWr58eZlZvOXLl2v16tVaunSp\nPv74Y+Xm5mru3Lm69tprPWP+8MMP+tOf/qQNGzZIkjIzM3XNNddo3bp1pnUAAPyDwAQANcCqVat0\n4MABdezYUVLpDEp5YeNf//qXevbsqZCQENWtW1fLly9X27Zt9eWXX+qOO+5QZGSkQkJCdOedd+qT\nTz456/uPHTumgwcPqnnz5pY/h8jISHXs2FH/+te/JJUGkd69e5vOdB09elQNGjQ455jvv/+++vTp\nI0mKiYnRrl27JEn169fX9u3b9emnnyo/P18PP/ywrr/+es/33XHHHZKkP//5z9q7d+85f8aqVavU\nr18/RUREyOVy6fbbb9fatWvVoUMHbdu2TYZhKDMzU7fddpt++uknSaWB6dprr1X9+vX1888/m9YB\nAKh+XMMEAEEqKSlJoaGhKikpUZMmTTR79mzVqVNHkhQaGqrIyMizvufIkSOqV6+e5+vatWtLkv74\n4w+lpaVp0aJFMgxDJSUlioqKOuv7v/7663I3X7DKzTffrA8//FBXX321Dhw4oNatW5s+tn79+srJ\nyTnneB999JHmzZunvLw8FRcXe8JXu3bt9Mwzz2jevHlKTk5WfHy8nn32WUmlvYuIiJAkhYSEqKSk\n5Jw/49ChQ2V6esEFF+jgwYMKDw9Xy5YttXXrVq1fv15PPvmkPv74Yx06dEiZmZm688471aJFC08d\no0ePVlxcnJ599lnVrVvXl3YBACxAYAKAIFXexgneXHjhhWWuvzl48KAiIiLUqFEjxcfHa/Dgwef8\n/nXr1um6666rVL2+6N69u5577jl99NFH6tmz5zkf27lzZ7377rt65JFHyty/ceNGZWdnq1OnTnrm\nmWe0ePFitWrVSr/99pt69erleVxCQoISEhKUm5urMWPGaM6cOZXaKKJhw4Y6cuSI5+sjR454Zr46\nd+6sjRs36pdfflGLFi3UoUMHrV27VgcOHPAsGyyvjscee6zCdQAAKocleQAQpMyWqpX3b6e+vuGG\nG/TRRx+psLBQeXl5uvvuu7V9+3bdcMMNWrZsmU6cOCFJWrhwoZYuXXrWuNV1/dIp4eHh6tq1q9LS\n0tS7d+9zPva2227TyZMnNXHiRM91T9u3b9eoUaMUEhKiw4cP67zzztPll1+ukydPauHChZJKd9d7\n7733NGPGDElSvXr11KJFC891Xma9O9Op+3v06OHp3cmTJ7V48WLPtVWdO3fW0qVLPUsY27dvr3fe\neUexsbGSdM46AAD+wQwTAAQhb2+qz/z3U1/36dNHW7duVc+ePRUREaH+/fvr6quvllQaNvr16yeX\ny6WmTZtq4sSJZcbYs2ePwsLC1LBhQ8trP/2+m2++WT/++KOuuOIK08dLUkREhObNm6fJkyerV69e\nql27ts4//3yNGzfOE1i6d++unj17qmHDhkpOTtaGDRuUlJSktLQ0jRkzRj179lStWrXUrFkzvfzy\ny/rjjz9Me2dWc69evbRt2zbdfvvtkqRrr71WiYmJkkoD0rZt2/Twww9Lkjp06KBNmzZp0KBBkkoD\n7NixY8+qAwDgPy7jXKcg/8+WLVs0YsQI3XvvvRo8eLD27t2rUaNGyTAMXXTRRZo8ebLCwsK0bNky\nvf322woNDVX//v115513+uM5AAAAAEC18LokLz8/X5MmTSqzK8+0adOUmJio+fPnq2nTplqyZIny\n8/M1Y8YMzZ07V2+//bbmzp2r3Nzcai0eAAAAAKqT18AUERGhmTNnllli8e233youLk5S6edirFu3\nTps2bVK7du0UGRmpiIgIdezY0fN5EgAAAADgRF4DU0hIiOeDDk/Jz89XWFiYJKlBgwbat2+fDh48\nWGaL2aioKO3fv9/icgEAAADAf6q8S5633YEAAAAAwKkqtUteZGSkCgsLFR4erpycHDVu3FiNGjUq\nM6OUk5OjDh06nHOczMzMyvx4AAAAALBUTExMufdXKjB16dJF6enpuvXWW5Wenq5u3bqpXbt2Gjdu\nnI4dOyaXy6WNGzcqJSWl0oXZJTMzM+BqCjT0yDt65Bv65B098o4e+YY+eUePvKNHvqFP3gVaj841\nkeM1MG3atEnjxo3ToUOHFBoaqgULFig1NVWjR4/WwoULFR0drX79+ik0NFRPPvmk7r//foWEhGjE\niBGqW7eupU8EAAAAAPzJa2Bq3769Pvzww7PuT0tLO+u+hIQEJSQkWFMZAAAAANisyps+AAAAAECw\nIjABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAA\nAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkC\nEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAA\ngAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDAB\nAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACY\nIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAA\nAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkC\nEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAA\ngAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDAB\nAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACYIDABAAAAgAkCEwAAAACY\nIDABAAAAgIlalfmmvLw8JScn6+jRoyoqKtIjjzyili1batSoUTIMQxdddJEmT56ssLAwq+sFAAAA\nAL+pVGB6//331aJFCz3++OPat2+f7rnnHl199dUaMmSIevbsqalTp2rJkiUaNGiQ1fUCAAAAgN9U\nakleVFSUDh8+LEk6evSooqKitH79esXHx0uS4uLitG7dOuuqBAAAAAAbVCow9e7dW3v37lVCQoKS\nkpKUnJys/Px8zxK8Bg0aaP/+/ZYWCgAAAAD+5jIMw6joNy1btkwZGRl6/vnntXXrVqWkpGjPnj1a\nu3atJGnnzp1KTk7WP//5z3OOk5mZWbmqAQAAAMBCMTEx5d5fqWuYNmzYoG7dukmSWrVqpZycHNWp\nU0eFhYUKDw9XTk6OGjVqVKXC7JKZmRlwNQUaeuQdPfINffKOHnlHj3xDn7yjR97RI9/QJ+8CrUfn\nmsip1JK8Zs2a6bvvvpMkZWdn67zzztN1112nlStXSpLS09M9gQoAAAAAnKpSM0wDBw7U2LFjlZiY\nqOLiYv31r3/V5ZdfruTkZC1atEjR0dHq16+f1bUCAAAAgF9VKjCdd955eu211866Py0trcoFAQAA\nAECgqNSSPAAAAACoCQhMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAA\nJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQA\nAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCC\nwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAAAGCCwAQAAAAAJghMAAAA\n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\nhx9W9+7dNXfuXL3yyitav3696tSpI0latmyZ3n77bYWGhqp///668847ba7efyrSp4B/z23UMHl5\neca9995rTJgwwZg/f75hGIYxevRoIz093TAMw5gyZYrxz3/+0zAMw3j88ceNWbNmGSNHjrStXjv4\n2qP8/HwjLi7OOH78uGEYhtG/f39j+/btttXtb772adeuXcZf/vIXwzAMo7i42EhISDD27dtnW93+\nVJHXm2EYxpo1a4z+/fsbo0ePtqVeO3z99dfGsGHDDMMwjMOHDxs9evQwRo8ebaxcudIwjLI9uvba\na22r004V6VH//v2Nn376yTAMw3jiiSeMEydO2FO0DSrSp1Nyc3ONIUOG+L1Wu3z88cfGnDlzDMMw\njOzsbCMhIaHcHm3bts0YOHCgYRiGUVJSYvTu3ds4cOCAbXX7k689OnjwoJGQkGAUFhYaBQUFxoAB\nA4yCggI7S/eb8nr0/vvvG3//+9+NuLg4Iy8vzzCM0mNgz549jWPHjhknTpwwbrnlFuPo0aN2lu5X\nvvbJMAL/PXeNW5IXERGhmTNnqmHDhp77vv32W8XFxUmS4uLitG7dOknSxIkT1b59e1vqtJOvPapd\nu3aZDya+8MILdeTIEVtqtoOvfWrSpIlee+01SdKRI0cUEhKiunXr2lKzv1Xk9VZYWKi33nqrRs2+\nSVKnTp08Z9Pq1aunvLw8rV+/XvHx8ZLK9siooZua+tqjgwcPKj8/X61bt5Ykvfrqq4qIiLCtbn+r\nyO/SKampqbrnnnv8Xqtd+vTpo6FDh0qSdu/erUsuuaTcHtWrV09FRUUqLCzUiRMnFBoaqtq1a9tZ\nut/42qNdu3apRYsWCgsLU3h4uFq1aqVNmzbZWbrflNejnj17asSIEWUet2nTJrVr106RkZGKiIhQ\nx44dtWHDBjtKtoWvfZIC/z13jVuSFxISovDw8DL35efne5YENWjQQPv375ckzzRhTVORHp164791\n61bt3r27RizpOKUifZJK/xisWLFCycnJNeZ3qyI9mjVrloYMGaLIyEi/12mnkJAQz+/D4sWL1aNH\nD61Zs6bcHhUUFOipp57S7t27lZCQoHvvvdeusv3K1x5lZ2erXr16GjNmjH777Tf17NmzRoWBivwu\nSaW/T2vXrtVjjz1mS712GjRokPbt26c333xT999//1k9aty4sXr37q34+HiVlJRoxIgRNe5vk7ce\nNW/eXNu2bdORI0cUFhamTZs2qUuXLjZX7V+nevTWW2+Ve1w/cOCAoqKiPF9HRUWVeQ3WFN76JAX+\ne+4aF5i8qalncCvizB79+uuveuqpp/Tqq68qNDTUpqoCz5l9SklJ0ciRIzVkyBB17NhRTZo0samy\nwHGqR7/99pu2bt2qRx99VN98843NVdnjs88+05IlS5SamlrmOoDTf49Gjx6tvn37SpIGDx6sTp06\nqU2bNn6v1S7eemQYhrKzs/Xmm28qPDxcAwcOVNeuXXXFFVfYVbItfPldOvW47t27+7u8gLBgwQJt\n2bJFTz31VJm+nPrv33//Xenp6fr8889VWFiou+66S7169VL9+vXtKtnvvPWoXr16evLJJ/Vf//Vf\nuvTSS3XZZZfVuPdQp/do2bJlXh9f0/pzSkX7FIhq3JK88kRGRqqwsFCSlJOTo0aNGtlcUeAx69He\nvXs1YsQIvfLKK2rVqpWdJQaE8vqUk5OjzZs3S5LOP/98dezY0fN1TVRej1atWqWdO3dq0KBBev75\n57Vq1SqlpqbaXKn/rF69WrNmzdKcOXNUt25d09fbwIEDVadOHdWpU0ddunTRtm3b7Czbr3zpUcOG\nDdWyZUvVq1dPtWvXVkxMjP7973/bXLl/+fq7JElffPGFrrvuOrtKtUVWVpb27NkjSWrdurVKSkrK\n7dHmzZvVvn17hYeHq27durryyitrzOvN1x5JpUuuFixYoL/97W/Ky8vTpZdealvd/nRmj4qLi3Xo\n0CFJKrMRT6NGjcrMKNW095i+9skJCEySunTpovT0dElSenq6unXr5vk3wzBq7BmB05n1KCUlRRMm\nTPBcM1DTldengwcP6rnnnlNJSYmKi4v1ww8/qHnz5vYWaqPyepSUlKQPPvhACxYs0IQJE9S9e3fP\nuudgd+zYMb3yyit66623dP7550sqv0c7duzQww8/7Pk92rhxo1q2bGln6X7ja4+aNGmi48ePKzc3\nVyUlJfrpp590+eWX21m6X/nap1M2b95c4/52Z2Rk6B//+Iek0uVSeXl56tKli1auXCnp/3vUrFkz\nZWVlSZKKioq0bdu2GhMGfO1RcXGxkpKSVFhYqF27dmnnzp1yu912lu43Z/YoPz/fs/Tu9PeN7du3\nV1ZWlo4dO6bjx49r48aNiomJsa1uf/O1T6cE8ntulxGolVWTTZs2ady4cTp06JBCQ0N1wQUXKDU1\nVaNHj1ZhYaGio6P10ksvyeVy6T//8z+Vn5+vo0eP6uKLL1ZycrK6du1q91Oodr726Pfff1e/fv3U\ntm1bzzbH9913n+eC/mDna59CQ0M1a9YsffbZZzIMQ3FxcTVmq+OK9OiUb7/9Vu+//36N2VZ80aJF\nmj59upo3b+55HU2aNEkpKSln9ejVV1/V2rVrFR4erri4OD344IN2l+8XFenR999/rxdeeEEhISHq\n2rWrHn30UbvL95uK9EmSrr/+eq1du9bmqv2roKBAY8eO1d69e1VQUKARI0aoTZs2evrpp8/q0amP\ng3C5XOrTp48SExPtLt8vKtKjd999V4sXL1ZJSYnGjBmjzp07212+X5zZo0cffVQbNmzQF198oV9/\n/VXNmjVTbGysnn32WX3yySeaM2eOQkJClJiYqJtvvtnu8v3G1z6NHz8+4N9z17jABAAAAAC+Ykke\nAAAAAJggMAEAAACACQITAAAAAJggMAEAAACACQITAAAAAJggMAEAAACAiVp2FwAAgCStWrVKs2fP\nVmhoqPLy8nTZZZfp+eefV926dSs0zrJly9S3b99qqhIAUNPwOUwAANsVFRWpa9euWr58uRo0aCBJ\neuWVV9SwYUPdd999Po9TXFysPn36KD09vbpKBQDUMMwwAQBsV1BQoBMnTuj48eOewDRq1ChJ0tat\nWzVp0iSdPHlSJ0+e1Pjx49W6dWv99ttvGjdunAzDUEREhF588UVNnTpVu3fv1tChQ5WamqrFixdr\n4cKFqlOnjho2bKi//vWvioyMVExMjPr376+ioiI988wzdj51AECAY4YJABAQZs+erRkzZqhDhw66\n5ppr1LNnT11++eW69dZbNWPGDF122WXasmWLxo4dq/fee0/33nuv7r//fv3Hf/yHli9frgMHDuiG\nG27Q4MGD9eWXX2r37t26++67tWLFCtWpU0eTJk1S3bp19cgjj+iqq65SWlqaunTpYvfTBgAEOGaY\nAAABYdiwYRowYIDWrl2rr7/+WgMHDlRSUpJ27NihlJQUnTq/l5eXJ8MwtGnTJl1zzTWSpD59+kiS\nsrOzPeP9+OOPcrvdqlOnjiSpc+fOWrBggSTJMAx17NjRn08PAOBQBCYAQEA4ceKELrjgAvXp00d9\n+vRRr1699MwzzygiIkJvv/32WY8PCQlRSUmJ6Xgul6vM14ZhlLkvLCzMuuIBAEGLbcUBALZbs2aN\nBgwYoGPHjnnu27Vrl9q0aaMmTZpo1apVkqQdO3bojTfekCR16NBBq1f/b/t2bKJAGEVh9DooivGA\nNQiCTCt2I2I2YGgVY2piYL4wHUwBxuYmCrMV/Bsuy3JOBy/8LryvJMntdsv5fE5VVXm/30mSzWaT\nYRjyer2SJH3fp2ma3zwLgH/ADxMAf0LXdbler1kulxnHMXVd53A45Pl8pm3bTCaTfD6f7Pf7bLfb\nPB6PHI/HjOOY2WyW0+mUuq6z2+0ynU7TdV3u93sul0vm83lWq1Xats1isch6vc4wDKkquyEAPxNM\nAAAABaY1AACAAsEEAABQIJgAAAAKBBMAAECBYAIAACgQTAAAAAWCCQAAoEAwAQAAFHwDbovIywnz\nV6oAAAAASUVORK5CYII=\n",
    368       "text/plain": [
    369        "<matplotlib.figure.Figure at 0x7f9a6863c5d0>"
    370       ]
    371      },
    372      "metadata": {},
    373      "output_type": "display_data"
    374     }
    375    ],
    376    "source": [
    377     "# Custom Factor 3 : Price to Trailing 12 Month Cash Flows\n",
    378     "class Price_to_TTM_Cashflows(CustomFactor):\n",
    379     "    inputs = [morningstar.valuation_ratios.pcf_ratio]\n",
    380     "    window_length = 1\n",
    381     "    \n",
    382     "    def compute(self, today, assets, out, pcf):\n",
    383     "        out[:] = pcf[-1] \n",
    384     "        \n",
    385     "temp_pipe_3 = Pipeline() \n",
    386     "temp_pipe_3.add(Price_to_TTM_Cashflows(), 'Price / TTM Cashflows')\n",
    387     "temp_pipe_3.add(Sector(), 'Sector')\n",
    388     "temp_res_3 = run_pipeline(temp_pipe_3, '2015-06-06', '2015-06-06')\n",
    389     "\n",
    390     "# clean extreme data points\n",
    391     "cashflows_frame = temp_res_3[temp_res_3['Price / TTM Cashflows'] < 100]\n",
    392     "\n",
    393     "# create boxplot by sector\n",
    394     "cashflows_frame.boxplot(column='Price / TTM Cashflows', by='Sector');"
    395    ]
    396   },
    397   {
    398    "cell_type": "markdown",
    399    "metadata": {},
    400    "source": [
    401     "The box and whisker diagram here shows that, much like the Price to Sales Ratio, a good Price to Cash Flows Ratio differs from industry to industry. Therefore, this, too, will benefit from an industry-relative calculation.\n",
    402     "\n",
    403     "One thing to note is that cashflows and earnings are not related. For example, consider Sector 104, which represents Real Estate companies. Here, the spread of earnings for these companies is very wide, perhaps due to the high volatility of the industry: the real estate companies that do well do very well indeed, while those that do not perform do poorly. However, the spread is much tigher on the Price to Cash Flows Ratio, caused by steady and predictable cash flows (the amount of money needed to complete a building project is often known, or at least carefully estimated, beforehand)."
    404    ]
    405   },
    406   {
    407    "cell_type": "markdown",
    408    "metadata": {},
    409    "source": [
    410     "##Standardization\n",
    411     "\n",
    412     "We have seen, now, that comparisons across industries are innacurate at best and misleading at worst. We, therefore, need a different approach in order to rank the entire universe of equities. To do this, we will standardize each equity's ratios within its sector. \n",
    413     "\n",
    414     "To standardize a dataset, you need to\n",
    415     "\n",
    416     "1. calculate the mean and standard deviation of that dataset\n",
    417     "2. for each value in the dataset, subtract the mean and divide it by the standard deviation"
    418    ]
    419   },
    420   {
    421    "cell_type": "markdown",
    422    "metadata": {},
    423    "source": [
    424     "Standardization is a very common transformation in statistics. The value it gives (the z-score) can be interpreted as the number of standard deviations a measurement is from the mean of its dataset. The good news is that z-scores from different datasets can be compared to eachother as they have the same unit of measurement. Lets have a look at the histograms of the Price to Sales Ratios in the retail and tech industries in order to examine this metric further."
    425    ]
    426   },
    427   {
    428    "cell_type": "code",
    429    "execution_count": 7,
    430    "metadata": {
    431     "collapsed": false
    432    },
    433    "outputs": [
    434     {
    435      "data": {
    436       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAI5CAYAAAAythDaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtcVPW+//E3IKgg3hA0tLJjmh2tjpmdbW5+CplcwtpY\nebxhdjm1TUu7YFJmdjWxMnalZkfrmBmZlG1v0FVKyRtd7ehpb2STZiCgIgqKDOv3h5s5kVwGmDWz\nZng9H48eMbPWfNdnfUU/81nr+/0uH8MwDAEAAAAAALfydXcAAAAAAACAAh0AAAAAAEugQAcAAAAA\nwAIo0AEAAAAAsAAKdAAAAAAALIACHQAAAAAAC2jj7gAAmK9///668MIL5efnJ8MwVF1drSFDhmjO\nnDlq165dg5/dunWrLr74YvXo0aPB/W677TbNmjVLZWVlmjNnjj766CNnngIAAB5t3rx52rFjhyTp\nwIEDCgsLU9u2beXj46O1a9cqMDDQ4bZ+/vlnxcfH6/vvv3dKbM5uD0DzUaADrYCPj4/eeusthYWF\nSZLOnDmj+++/X0uXLtXMmTMb/Oybb76pqVOnNlqgv/HGG5KknTt3ysfHxzmBAwDgJebNm2f/+dpr\nr9Xzzz+vQYMGNbs9Z+dacjdgDQxxB1oBwzBkGIb9tb+/vyIiIrRv3z5JUmVlpZ5++mlFR0fr2muv\n1bJlyyRJqamp2r59u5KSkrR582adOnVKM2fOVExMjEaOHKkFCxbY24yKitLXX3/t2hMDAMAD/T4v\n//rrr7r77rsVHR2t2NhYbd261b4tPT1d0dHRiomJ0ezZs1VVVWVvY+XKlYqPj1dUVJQ+/vhjSdJ7\n772nBx54QMnJyYqOjtbo0aOVl5cnSTp27Jjuu+8+xcTEKD4+XitWrDgnturqar3wwguKjY1VXFyc\n5syZo9OnT0uSfvjhB40aNUoxMTFasmSJ4uPjlZOTo4SEBH3++ef2Nj777DPddNNNzu84oBWgQAda\nodLSUm3YsEFXXnmlJOn111/X/v37tXHjRm3cuFEZGRnKysrSjBkzFBYWZk/Uq1evVllZmTIyMvTB\nBx/ogw8+oCgHAKCFZs2apSuuuEKZmZlasmSJHnzwQZWVlSk/P18vvvii3nnnHWVkZOj48eN6++23\nJUlVVVVq27atNmzYoIceekgvvviivb0tW7ZoypQpyszM1KBBg7Ry5UpJ0sKFCxUaGqqMjAytWrVK\nK1euPGdY+/r167V9+3Z9+OGH2rhxo4qLi+2ff+yxx3TXXXcpIyNDbdu21c8//ywfHx/Fx8dr8+bN\n9jY+//xzxcfHm91tgFeiQAdaicmTJysuLk4jR47UyJEjdc011+jOO++UdDaRT5gwQW3atFG7du10\n44031ppDXnOV//bbb9fixYslScHBwerbt68OHDjg+pMBAMBLnDhxQrt379att94qSerdu7cGDRqk\nL774Qtu2bdNVV12lrl27SpJeeuklJSYm2j87ZswYSdKll16qgoIC+/v9+vXTJZdcIkkaMGCAfv31\nV0lSVlaWJkyYIEnq3LmzRo4cWetuvSR98cUXSkhIUEBAgHx8fDRmzBht27ZNJ0+e1L59+3T99ddL\nkiZNmqTq6mpJ0vXXX68tW7bozJkz9uPExsY6t6OAVoI56EArUTMH/ejRo4qJiVFsbKx8fc9eozt+\n/LieffZZvfjiizIMQ2fOnNEVV1xxThv5+fmaP3++8vLy5Ovrq4KCAoawAQDQAmVlZTIMQ7fccouk\nsxfFKyoqNHz4cB09elQdO3a07xsQEGD/2d/fX/7+/pIkPz8/e7Esnb2IXsPX11c2m02SzmmvY8eO\nOnLkSK14jhw5ok6dOtXap6SkRMePH5e/v7/at29vj6Vz586SpB49eqhfv37atm2bunXrpp49eza6\ndg2AulGgA61EzV3wLl26KDExUSkpKfa74WFhYbrzzjs1fPjwBtt48sknNXDgQC1dulSSNH78eHOD\nBgDAy3Xr1k1+fn5at25drQJcklavXq29e/faX584ccI+H7w5QkJCdOzYMYWGhkpSrZ9/v0+NY8eO\nqVu3burQoYOqqqp05swZ+fv768yZM7X2u/7665WZmakePXooLi6u2TECrR1D3IFW6LbbbtO3336r\n3bt3Szq7muyaNWtUXV0twzC0ZMkS+5A3f39/lZWVSZJKSkp06aWXSpK2bdum/Px8nTx50j0nAQCA\nF6hZuPWdd96RJJWXlys5OVmHDx/WiBEjtGvXLhUUFMgwDM2ZM0fr1q2TpFqLzDlqxIgRevfddyWd\nzekff/yxRowYUau9yMhIffjhhzp9+rSqqqq0du1ajRgxQsHBwerdu7cyMjIknb144OfnZ287JiZG\n2dnZ+vTTTxUTE9Ps/gBaOwp0oBX4/aNTgoKC9J//+Z/2VdgnTpyo8PBwXX/99YqLi9P+/fs1ePBg\n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\nnIsCHQAAAAAAC6BABwAAAADAAixdoM+fP1/jxo3T+PHj9cMPP7g7HK+VkpKicePG6ZZbbtHHH3/s\n7nC81unTp3Xddddp3bp17g7Fa/31r3/VjTfeqJtuuklZWVnuDscrlZeX695779XkyZM1fvx4bd26\n1d0heZV9+/bpuuuu09tvvy1JKigoUGJioiZNmqT7779fZ86ccXOETUcuNx953HXI5eYjl5uLPG6+\nluZyyxbou3btUn5+vtLS0vT000/rmWeecXdIXmnHjh36+9//rrS0NL3++ut69tln3R2S11q8eLE6\nd+7s7jC81rFjx/Tqq68qLS1Nr732mj799FN3h+SVPvjgA/3Lv/yLVq5cqdTUVP5tdqKKigotWLBA\nw4YNs7+XmpqqxMRErVq1ShdccIHS09PdGGHTkcvNRx53LXK5ucjl5iOPm8sZudyyBfpXX32lkSNH\nSpL69Omj48eP6+TJk26OyvsMGTJEqampkqSOHTuqoqJCLOzvfPv371deXp6GDx/u7lC8VnZ2toYN\nG6b27durW7duevLJJ90dklfq2rWrjh49KkkqLS1V165d3RyR92jbtq1ee+01devWzf7ezp07FRkZ\nKUmKjIxUdna2u8JrFnK5+cjjrkMuNx+53HzkcXM5I5dbtkAvLi6u9QvTpUsXFRcXuzEi7+Tr66v2\n7dtLkt577z0NHz5cPj4+bo7K+6SkpGj27NnuDsOr/fLLL6qoqNDUqVM1adIkffXVV+4OySvFxsaq\noKBAo0aN0uTJk/m9diJfX18FBATUeq+iokL+/v6SpJCQEBUVFbkjtGYjl5uPPO465HLzkcvNRx43\nlzNyeRvTonMyrgab65NPPtH777+v5cuXuzsUr7Nu3ToNGTJE4eHhkvhdNothGDp27JgWL16sgwcP\navLkyfr888/dHZbX+etf/6oePXpo2bJl2rdvnx577DG999577g6rVfCGfzu84RysijxuLnK5a5DL\nzUcedy9H/u2wbIEeFhZW6yr74cOHFRoa6saIvNeXX36pZcuWafny5erQoYO7w/E6WVlZOnjwoD76\n6CMVFBSobdu26tGjh4YOHeru0LxKt27dNGjQIPn4+Oj8889XUFCQjhw5wtAtJ/v6668VEREhSerf\nv78KCgpkGAZ37EwSFBSkyspKBQQEqLCwUGFhYe4OqUnI5a5BHjcfudw1yOXmI4+7XlNzuWWHuA8b\n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\nMTExio2NVUxMjJYtW2bf/sUXX6iwsNBpx/vll180YMCAFreTnJyspUuXOiEiwDrauDsAoDXz8fHR\nW2+9pbCwMEnSmTNndP/992vp0qWaOXNmg5998803NXXqVPXo0aPB/d544w1J0s6dO+Xj41PnPn/+\n85/1zDPP6P/9v/8nScrMzNS0adOUlZWl48eP67/+6790yy23NPX0nMYwjDpjr+98AABwxLx58+w/\nX3vttXr++ec1aNCgFrXp7NzkilyXmpqqU6dOadOmTfL19dXhw4c1ceJE9e7dW6NGjdIbb7yhmTNn\nqnv37k47ZlPPq77vAoC34Q464EaGYcgwDPtrf39/RUREaN++fZKkyspKPf3004qOjta1115rv5qd\nmpqq7du3KykpSZs3b9apU6c0c+ZMxcTEaOTIkVqwYIG9zaioKH399df1xnDkyBEVFxfriiuusL8X\nHR2t9evXq23btho/frwOHTqkuLg4VVVV6ZtvvtGYMWMUGxur+Ph4ffXVV5LOXg3/4x//qLfeekuj\nR4/W8OHDtXnzZknS6dOnNXPmTEVFRWny5Mm17vzv379fEyZMsN+937hxo31b//799frrrysmJkaG\nYSgrK0ujRo1SfHy8/cIDAADO8PucLEm//vqr7r77bkVHRys2NlZbt261b0tPT1d0dLRiYmI0e/Zs\nVVVV2dtZuXKl4uPjFRUVpY8//ljS2dFoDzzwgJKTkxUdHa3Ro0crLy9PknTs2DHdd999iomJUXx8\nvFasWHFOfNXV1XrhhRfsd/jnzJmj06dPS5J++OEHjRo1SjExMVqyZIni4+OVk5OjhIQEff755/Y2\nPvvsM910003ntP3TTz9pwIAB8vU9WxqEhYVpzZo1uvbaa/Xiiy9q165deuCBB/TRRx+poqLCHmvN\nRY0aEyZM0H//939r/PjxGj58uJKSkuzb1qxZo6ioKP3pT3/Spk2bap3X448/rujoaI0cOVLJycmq\nrq6WJCUlJSklJUU33HCDPvnkEx05ckRTpkzRyJEjNW3aNJ08edKRP1rAo1CgAxZSWlqqDRs26Mor\nr5Qkvf7669q/f782btyojRs3KiMjQ1lZWZoxY4bCwsLsiXr16tUqKytTRkaGPvjgA33wwQcNFuW/\n1bVrV1122WVKTEzU2rVrdfDgQUlSaGioJOnZZ59VeHi4Nm3apDZt2mju3Lm6/fbbtXnzZt155516\n/PHH7W0dO3ZMfn5+Wr9+vZKTk/XSSy9JktauXauSkhJ9+umn+stf/lLrC05KSoqGDx+uTZs26Zln\nntGjjz4qm81m324YhjIzM2UYhubMmaMnnnhCGzZskKRa+wEA4GyzZs3SFVdcoczMTC1ZskQPPvig\nysrKlJ+frxdffFHvvPOOMjIydPz4cb399tuSpKqqKrVt21YbNmzQQw89pBdffNHe3pYtWzRlyhRl\nZmZq0KBBWrlypSRp4cKFCg0NVUZGhlatWqWVK1fq+++/rxXL+vXrtX37dn344YfauHGjiouL7Z9/\n7LHHdNdddykjI0Nt27bVzz//LB8fH8XHx9svlkvS559/rvj4+HPOc/jw4Vq0aJFSU1P13XffyWaz\nqUuXLvLz89MDDzygkJAQLVq0SKNGjdJbb72l06dPKyMjQ++//77WrFlTK9asrCytXLlSmzZt0pdf\nfqnvv/9eR48e1fz58/Xmm29q3bp1taanZWRk6JtvvtHmzZu1adMmffPNN8rIyLBv3759u95//31d\nd911WrZsmc477zx98sknmj17dq3vE4C3oEAH3Gzy5MmKi4vTyJEjNXLkSF1zzTW68847JZ1N5BMm\nTFCbNm3Url073Xjjjfroo4/sn6250n/77bdr8eLFkqTg4GD17dtXBw4ccDiGFStW2JPuddddp9Gj\nR9uv+P/eBx98oLi4OEnS4MGD7QW9dLZgHjNmjKSz88N//fVXSVJOTo5GjRolHx8fde7cWZGRkfbP\nLF68WHfccYck6corr9Tp06dVVFRk3z5ixAhJ0j/+8Q9VVlZq6NChkqSEhIRz7nQAAOAsJ06c0O7d\nu3XrrbdKknr37q1Bgwbpiy++0LZt23TVVVepa9eukqSXXnpJiYmJ9s/W5MJLL7201qixfv366ZJL\nLpFUO09mZWVpwoQJkqTOnTtr5MiR5xSfX3zxhRISEhQQECAfHx+NGTNG27Zt08mTJ7Vv3z5df/31\nkqRJkybZ70Bff/312rJli86cOWM/Tmxs7DnnOnnyZD3zzDPas2ePpkyZomuuuUYLFiywf+637rrr\nLv3lL3+RJHXq1El9+vSp9Z0jJiZG/v7+CgoKUu/evfXrr7/qu+++08UXX6wLLrhA0tkcXiMuLk5r\n166Vr6+vAgICNHDgwFrfLa655hq1aXN2Vu6uXbsUExMjSTr//PM1ePDgc+IDPB1z0AE3q5mD/v/b\nu/foqMp7/+OfXCE3IiQECFDkRAEVqjbCkaacEIpQUKyI0gAJ1SLt4SKiEiSoUClLJGiRSinSA1ZR\nGo6QF0IAACAASURBVMF4qLooUWqlaihg9KAoVB3TyKUJJCEhNzJksn9/8MuUkGSYJLPnlvdrLdbK\n7D177+/eCfN9vrP38zxnzpyxD87S+IjZ2bNn9eSTT+rXv/61DMPQ+fPnmzyK3qiwsFCrVq1SQUGB\nAgMDVVRU1OIjbK2JjIzU/PnzNX/+fJWVlSknJ0cPPfSQ/vSnPzV771tvvaWtW7eqpqZGNputSZEc\nFBSkrl27SpICAwPtDYSKigpFRUXZ39etWzf7Y2nvv/++Nm7cqDNnztj7ljVuJ11I/o37iIyMbLYc\nAAAzVFZWyjAM+xgshmGotrZWycnJOnPmjLp162Z/b2hoqP3nkJAQhYSESLqQFy/OaRfnwsDAQPuT\nYJfur1u3biorK2sST1lZWZPc161bN5WWlurs2bMKCQlRWFiYPZYrrrhCktS7d28NGjRIH374oWJj\nY9W3b99Wx65pHCzv/Pnz2rdvn1auXKmwsDAtWLCgyfsKCgq0evXqJm2Oi8/x4lzdeI7l5eXN2gGN\nSktLtXLlSn3xxRcKDAxUSUmJrrrqKvv6i8+5pfYE4G8o0AEPayxwu3fvrvT0dGVlZdnvhsfFxem+\n++5TcnKyw32sWLFCQ4cOtY9kOm3aNKePX1xcrBMnTtgfq+/Ro4dmz56tP//5z/r666/tSb7xvY8/\n/rhee+01DR48WIWFhfZvsh3p1q2bKisr7a8bGx319fVauHChfvOb32jUqFGyWq26/vrrWxwEplu3\nbqqqqrK/Li0tZbAYAIBpYmNjFRQUpJ07dzYpwCVp27ZtOnLkiP11VVWVvT94e8TExKi8vNzevezi\nny99T6Py8nLFxsYqMjJS9fX1On/+vEJCQnT+/Pkm77v11luVm5ur3r1725+Au1h9fb3+9re/KSUl\nRQEBAQoJCdF//dd/afr06froo4+avf+Xv/ylEhMT7W2OqVOnXvb8oqOjdfbsWfvr0tJS+89PP/20\nunbtql27dikoKEgPPvhgq/u5tD1x5syZyx4b8DU84g54kXvvvVf/93//Z0+IP/zhD7V9+3Y1NDTI\nMAz97ne/sz/yFhISYk9SpaWluuaaayRJH374oQoLC50eOOVf//qX5s6dq8OHD9uXffrppyoqKtKw\nYcMUHBys6upq2Ww2nTlzRuHh4Ro4cKDq6+v16quvSpJqa2slqdVHzm+44Qa9++67amhoUFlZmf72\nt7/Ztzt37px9qpUXX3xRoaGhLcY+YMAABQcH6+DBg5Kk119/nQIdAGCaxoFb//jHP0qSampqlJmZ\nqVOnTmn06NE6ePCgioqK7GOk7Ny5U1LrudCR0aNH23NqaWmp3nnnHXsXr8b9paSk6E9/+pPq6upU\nX1+v1157TaNHj1ZUVJSuvPJKe7/tbdu2KSgoyL7vH/3oR8rLy9Nf/vKXFr9UDwoK0po1a/T888/b\n74RXVlbqr3/9q0aMGCFJCg4OthfYZWVluvbaayVdeOz++PHjl52SbtiwYbJYLPZH1y9+Qu/MmTMa\nPHiwgoKC9MUXX+jQoUOt7u/GG2/Unj17JF3o+vbJJ584PC7giyjQAQ+6tMCMiIjQ7Nmz7aOwz5gx\nQ/Hx8br11ls1ceJEffPNN/b+VuPHj9eDDz6oP/zhD5o7d66eeuopTZo0SR999JHmz5+v5557Tp98\n8slli9gbbrhBK1eu1BNPPGGfi3316tV69tln1adPHw0ePFjR0dH6wQ9+oOjoaCUnJ2v8+PGaNm2a\nxowZo+uvv97e7661Y02dOlWRkZEaO3asHnjgAft87FFRUZo1a5buuOMO3Xnnnbryyis1duxY/eIX\nv1BtbW2T/QUHB2vFihXKzMzUrbfequDgYIWHh7fvwgMAcImWctgTTzyhvLw8TZgwQXfddZcGDhyo\nuLg4xcfHa/ny5ZoxY4YmTJigrl27aubMma3u53IefvhhnT59WhMmTNA999yj+++/3/7Fe+P+Jk6c\nqO9///u64447dPvtt+vKK6+091tfvny5nnvuOU2aNEmGYSg2Nta+Xffu3e25/NK78o3737x5s44c\nOWKfA33q1KlKSkqyn9P48eO1YMECbd26VXPnztXKlSs1adIkffrpp5ozZ46effZZffrpp83OvfF1\nbGysFi1apPT0dN1+++26+uqr7e/52c9+ppdfflm33XabduzYoUceeUTZ2dnas2dPs/3993//t/75\nz39q7Nixeuqpp+ztCcCfBBgmj7L0xhtvaPPmzQoODtaCBQs0ePBgZWRkyDAM9ezZU1lZWfZ+OgAA\nwHscOHBADzzwgK6++moZhqHBgwfrvvvuI48DXm7EiBH64x//qISEBEnSY489puuvv97enx6A9zL1\n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\nwO0MAKbZtGmTccMNNxj33nuv8bvf/c745ptv7OvS0tKMffv2GYZhGHv27DGOHDliGIZhvPXWW8aC\nBQsMwzCMJUuWGA899JBhGIZx4sQJIzEx0TAMw/j1r39tPP3004ZhGMbnn39uDBkyxDhx4oRx7Ngx\n43//938NwzCMuro6IzEx0aiqqjL2799v3HTTTcbZs2cdbn+x/fv3G9OnT292TlOmTDEOHTpk/M//\n/I/x3HPPGYZhGDabzZgyZYpx9OhR48knnzS2bt1qGIZhfPbZZ8aUKVMMwzCMlJQU49tvv201xuPH\njxvJycmGYRhNfn788ceNzZs3G4ZhGKWlpUZSUpJRXV1tPPfcc/b4zp07Z9xwww3G2bNnjZUrVxq/\n//3v7e9vPBYAAO1BLieXA+7EHXTARLNnz9bUqVP14Ycf6u9//7t+8pOf6KGHHlJqaqok2b/tjo2N\n1Zo1a1RXV6fKykpFR0fb9zFixAhJUnx8vKqrq2UYhv7xj3/Y93HttdcqMjJSkhQTE6OPP/5Y2dnZ\nCgkJkdVqVUVFhSRp4MCBioqKkqRWt3dGZWWlgoKCtH//fhUXF2v//v2SJKvVqmPHjum2227T6tWr\nlZaWpj//+c/68Y9/3GR7RzG25NNPP9X06dMlST169FDv3r1VUFAgSUpMTJQkdenSRT169FB5ebnG\njx+vzMxMnTx5UsnJybrjjjucPjcAAC5FLieXA+5EgQ6Y6Ny5c4qOjtbEiRM1ceJE/ehHP9Lq1avt\nCbXR4sWL9atf/UojRozQe++9py1bttjXBQUFNXlvY0Pg4r5mNptNkvTiiy/q/Pnzys7OliTdfPPN\n9veEhIQ02U9L219OcXGxSktLddVVVyk0NFTz5s3TuHHjmr2vrKxMp0+f1jvvvGOPpfF4jmJsyaV9\n6hoaGuzLLr42jdflpptu0ltvvaV9+/Zp586deuONN/TMM884dX4AAFyKXE4uB9yJQeIAk3zwwQea\nOnWqfaRXSTp27JgGDBggSQoMDFR9fb0k2ROlzWbTn//8Z1mt1hb32Zi4EhIS9Mknn0iSDh06pNra\nWkkXRkxNSEiQJP3lL39RXV1di/u6dPuamhqHx5OkqqoqLV++XGlpaerSpYsSExO1a9cuSRcS7VNP\nPaWzZ89KkiZOnKgNGzZo4MCB6tGjR5N9tRbjxdfjYtdff70++OADSRcaFSUlJRo4cGCL8UrSyy+/\nrH/9618aPXq0Vq5cqc8++6zV9wIA4Ai5nFwOuBt30AGT/OAHP1BhYaHuuecehYeHyzAMxcbGatmy\nZZKkpKQkLV++XEuXLtXs2bM1c+ZM9erVS7Nnz9aSJUv00ksvNdtn47fNM2fO1MKFC3XPPffoqquu\nUv/+/SVJd911lx566CH97W9/05gxYzRp0iQtWrRIjzzySJP9XLr9d77znRbP4auvvtLMmTN1/vx5\nVVdX69Zbb9UvfvELSdKMGTP09ddfKzU1VQ0NDRo9erS6desmSZo0aZJuvfVWZWVlNYu9tRi3b9+u\nmJgYTZkyRatXr7Zvt2DBAi1dulR79+7V+fPn9atf/UphYWGtXpv/+I//0EMPPaSoqCg1NDRo0aJF\nTvy2AABojlxOLgfcLcAwnBjyEQAAAAAAmIpH3AEAAAAA8AIU6AAAAAAAeAEKdAAAAAAAvAAFOgAA\nAAAAXoACHQAAAAAAL0CBDgAAAACAF6BABwAAAADAC/w/MEsuvC4vJNIAAAAASUVORK5CYII=\n",
    437       "text/plain": [
    438        "<matplotlib.figure.Figure at 0x7f9a6b0b7c10>"
    439       ]
    440      },
    441      "metadata": {},
    442      "output_type": "display_data"
    443     }
    444    ],
    445    "source": [
    446     "# clean data, necessary as using mean and standard deviation\n",
    447     "retail_df = retail_df[retail_df < 10]\n",
    448     "tech_df = tech_df[tech_df < 10]\n",
    449     "\n",
    450     "# summary stats necessary for calculation\n",
    451     "retail_mean = retail_df.mean()\n",
    452     "retail_std = retail_df.std()\n",
    453     "tech_mean = tech_df.mean()\n",
    454     "tech_std = tech_df.std()\n",
    455     "\n",
    456     "# standardize the data\n",
    457     "retail_standard = (retail_df - retail_mean) / retail_std\n",
    458     "tech_standard = (tech_df - tech_mean) / tech_std\n",
    459     "\n",
    460     "# create a grid of plots\n",
    461     "fig, axes = plt.subplots(nrows=2, ncols=2)\n",
    462     "# name each set of axes\n",
    463     "ax_retail, ax_tech, ax_retail_st, ax_tech_st = axes.flat\n",
    464     "# number of bins for histograms\n",
    465     "bins = 50\n",
    466     "\n",
    467     "# retail\n",
    468     "ax_retail.hist(retail_df, bins=bins)\n",
    469     "ax_retail.axvline(retail_mean, color='blue')\n",
    470     "ax_retail.axvline(retail_mean - retail_std, color='blue')\n",
    471     "ax_retail.axvline(retail_mean + retail_std, color='blue')\n",
    472     "ax_retail.set_xlabel('Price / Sales')\n",
    473     "ax_retail.set_ylabel('Frequency')\n",
    474     "ax_retail.set_title('Retail')\n",
    475     "\n",
    476     "# tech\n",
    477     "ax_tech.hist(tech_df, bins=bins, stacked=True)\n",
    478     "ax_tech.axvline(tech_mean, color='green')\n",
    479     "ax_tech.axvline(tech_mean - tech_std, color='green')\n",
    480     "ax_tech.axvline(tech_mean + tech_std, color='green')\n",
    481     "ax_tech.set_xlabel('Price / Sales')\n",
    482     "ax_tech.set_ylabel('Frequency')\n",
    483     "ax_tech.set_title('Technology')\n",
    484     "\n",
    485     "# retail standardized\n",
    486     "ax_retail_st.hist(retail_standard, bins=bins)\n",
    487     "ax_retail_st.axvline(0, color='blue')\n",
    488     "ax_retail_st.axvline(-1, color='blue')\n",
    489     "ax_retail_st.axvline(1, color='blue')\n",
    490     "ax_retail_st.set_xlabel('Standard Deviations')\n",
    491     "ax_retail_st.set_ylabel('Frequency')\n",
    492     "ax_retail_st.set_title('Retail Standard')\n",
    493     "\n",
    494     "# tech standardized\n",
    495     "ax_tech_st.hist(tech_standard, bins=bins, stacked=True)\n",
    496     "ax_tech_st.axvline(0, color='green')\n",
    497     "ax_tech_st.axvline(-1, color='green')\n",
    498     "ax_tech_st.axvline(1, color='green')\n",
    499     "ax_tech_st.set_xlabel('Standard Deviations')\n",
    500     "ax_tech_st.set_ylabel('Frequency')\n",
    501     "ax_tech_st.set_title('Technology Standard')\n",
    502     "\n",
    503     "# prevent text overlap\n",
    504     "fig.tight_layout()"
    505    ]
    506   },
    507   {
    508    "cell_type": "markdown",
    509    "metadata": {},
    510    "source": [
    511     "As can be seen above, standardization allows comparison between two datasets. While the companies in the technology sector have larger and more spread out Price to Sales Ratios than those in the retail sector, standardization allows an analyst to compare the relative extremity of values between datasets. Now we *can* compare values across setors\n",
    512     "\n",
    513     "NB: Standardization is technically only effective if the underlying values are normally distributed. However, observation of the graphs suggests that the distribution of Price to Sales Ratios is perhaps exponential or lognormal (on account of the 0 lower bound and the strong positive skew). Therefore, this cross industry comparison can only be seen as an approximation."
    514    ]
    515   },
    516   {
    517    "cell_type": "markdown",
    518    "metadata": {},
    519    "source": [
    520     "##Full Pipeline\n",
    521     "\n",
    522     "To standardize our full Pipeline, we need to calculate the mean and standard deviation of each ratio in each industry. Then for each valuation ratio of each equity, we will need to subtract its industry's mean and divide by its industry's standard deviation. This sounds like it would need a very computationally involved bit of code. However, Pipeline's built-in zscore() method gives this potentially problematic code a one-line solution. For a full explanation of the zscore function see https://www.quantopian.com/posts/pipeline-classifiers-are-here.\n",
    523     "\n",
    524     "As with the previous notebook, we will also make a factor to create a proxy S&P500 for the ranking logic.\n",
    525     "\n",
    526     "Let us run the full Pipeline."
    527    ]
    528   },
    529   {
    530    "cell_type": "code",
    531    "execution_count": 8,
    532    "metadata": {
    533     "collapsed": false,
    534     "scrolled": false
    535    },
    536    "outputs": [
    537     {
    538      "data": {
    539       "text/html": [
    540        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
    541        "<table border=\"1\" class=\"dataframe\">\n",
    542        "  <thead>\n",
    543        "    <tr style=\"text-align: right;\">\n",
    544        "      <th></th>\n",
    545        "      <th></th>\n",
    546        "      <th>Price / TTM Cashflows</th>\n",
    547        "      <th>Price / TTM Earnings</th>\n",
    548        "      <th>Price / TTM Sales</th>\n",
    549        "      <th>SPY Proxy</th>\n",
    550        "    </tr>\n",
    551        "  </thead>\n",
    552        "  <tbody>\n",
    553        "    <tr>\n",
    554        "      <th rowspan=\"20\" valign=\"top\">2015-06-08 00:00:00+00:00</th>\n",
    555        "      <th>Equity(2 [AA])</th>\n",
    556        "      <td>-0.228260</td>\n",
    557        "      <td>-0.137305</td>\n",
    558        "      <td>-0.061063</td>\n",
    559        "      <td>1.527980e+10</td>\n",
    560        "    </tr>\n",
    561        "    <tr>\n",
    562        "      <th>Equity(21 [AAME])</th>\n",
    563        "      <td>-0.065546</td>\n",
    564        "      <td>-0.061818</td>\n",
    565        "      <td>-0.055851</td>\n",
    566        "      <td>7.920730e+07</td>\n",
    567        "    </tr>\n",
    568        "    <tr>\n",
    569        "      <th>Equity(24 [AAPL])</th>\n",
    570        "      <td>-0.102235</td>\n",
    571        "      <td>-0.254608</td>\n",
    572        "      <td>-0.051943</td>\n",
    573        "      <td>7.452470e+11</td>\n",
    574        "    </tr>\n",
    575        "    <tr>\n",
    576        "      <th>Equity(25 [AA_PR])</th>\n",
    577        "      <td>NaN</td>\n",
    578        "      <td>NaN</td>\n",
    579        "      <td>NaN</td>\n",
    580        "      <td>NaN</td>\n",
    581        "    </tr>\n",
    582        "    <tr>\n",
    583        "      <th>Equity(31 [ABAX])</th>\n",
    584        "      <td>-0.092681</td>\n",
    585        "      <td>-0.137099</td>\n",
    586        "      <td>-0.054737</td>\n",
    587        "      <td>1.197080e+09</td>\n",
    588        "    </tr>\n",
    589        "    <tr>\n",
    590        "      <th>Equity(39 [DDC])</th>\n",
    591        "      <td>-0.242844</td>\n",
    592        "      <td>-0.135980</td>\n",
    593        "      <td>-0.061062</td>\n",
    594        "      <td>1.607340e+09</td>\n",
    595        "    </tr>\n",
    596        "    <tr>\n",
    597        "      <th>Equity(41 [ARCB])</th>\n",
    598        "      <td>-0.141794</td>\n",
    599        "      <td>-0.274208</td>\n",
    600        "      <td>-0.045524</td>\n",
    601        "      <td>9.029610e+08</td>\n",
    602        "    </tr>\n",
    603        "    <tr>\n",
    604        "      <th>Equity(52 [ABM])</th>\n",
    605        "      <td>-0.100783</td>\n",
    606        "      <td>-0.230880</td>\n",
    607        "      <td>-0.045505</td>\n",
    608        "      <td>1.845380e+09</td>\n",
    609        "    </tr>\n",
    610        "    <tr>\n",
    611        "      <th>Equity(53 [ABMD])</th>\n",
    612        "      <td>-0.069797</td>\n",
    613        "      <td>-0.247635</td>\n",
    614        "      <td>-0.054732</td>\n",
    615        "      <td>2.642370e+09</td>\n",
    616        "    </tr>\n",
    617        "    <tr>\n",
    618        "      <th>Equity(62 [ABT])</th>\n",
    619        "      <td>-0.101121</td>\n",
    620        "      <td>-0.206759</td>\n",
    621        "      <td>-0.054739</td>\n",
    622        "      <td>7.247270e+10</td>\n",
    623        "    </tr>\n",
    624        "    <tr>\n",
    625        "      <th>Equity(64 [ABX])</th>\n",
    626        "      <td>-0.232389</td>\n",
    627        "      <td>-0.158385</td>\n",
    628        "      <td>-0.061063</td>\n",
    629        "      <td>1.361500e+10</td>\n",
    630        "    </tr>\n",
    631        "    <tr>\n",
    632        "      <th>Equity(66 [AB])</th>\n",
    633        "      <td>-0.067308</td>\n",
    634        "      <td>-0.119138</td>\n",
    635        "      <td>-0.046536</td>\n",
    636        "      <td>3.136030e+09</td>\n",
    637        "    </tr>\n",
    638        "    <tr>\n",
    639        "      <th>Equity(67 [ADSK])</th>\n",
    640        "      <td>-0.090698</td>\n",
    641        "      <td>0.070003</td>\n",
    642        "      <td>-0.046009</td>\n",
    643        "      <td>1.223180e+10</td>\n",
    644        "    </tr>\n",
    645        "    <tr>\n",
    646        "      <th>Equity(69 [ACAT])</th>\n",
    647        "      <td>-0.206946</td>\n",
    648        "      <td>-0.042954</td>\n",
    649        "      <td>-0.061894</td>\n",
    650        "      <td>4.226440e+08</td>\n",
    651        "    </tr>\n",
    652        "    <tr>\n",
    653        "      <th>Equity(70 [VBF])</th>\n",
    654        "      <td>NaN</td>\n",
    655        "      <td>NaN</td>\n",
    656        "      <td>NaN</td>\n",
    657        "      <td>NaN</td>\n",
    658        "    </tr>\n",
    659        "    <tr>\n",
    660        "      <th>Equity(76 [TAP])</th>\n",
    661        "      <td>-0.163318</td>\n",
    662        "      <td>-0.135310</td>\n",
    663        "      <td>1.218060</td>\n",
    664        "      <td>1.389700e+10</td>\n",
    665        "    </tr>\n",
    666        "    <tr>\n",
    667        "      <th>Equity(84 [ACET])</th>\n",
    668        "      <td>-0.039401</td>\n",
    669        "      <td>-0.130085</td>\n",
    670        "      <td>-0.061063</td>\n",
    671        "      <td>7.177060e+08</td>\n",
    672        "    </tr>\n",
    673        "    <tr>\n",
    674        "      <th>Equity(86 [ACG])</th>\n",
    675        "      <td>NaN</td>\n",
    676        "      <td>NaN</td>\n",
    677        "      <td>NaN</td>\n",
    678        "      <td>NaN</td>\n",
    679        "    </tr>\n",
    680        "    <tr>\n",
    681        "      <th>Equity(88 [ACI])</th>\n",
    682        "      <td>-0.004039</td>\n",
    683        "      <td>-0.151373</td>\n",
    684        "      <td>-0.061064</td>\n",
    685        "      <td>1.081390e+08</td>\n",
    686        "    </tr>\n",
    687        "    <tr>\n",
    688        "      <th>Equity(100 [IEP])</th>\n",
    689        "      <td>0.044639</td>\n",
    690        "      <td>-0.132753</td>\n",
    691        "      <td>-0.045315</td>\n",
    692        "      <td>1.124600e+10</td>\n",
    693        "    </tr>\n",
    694        "  </tbody>\n",
    695        "</table>\n",
    696        "</div>"
    697       ],
    698       "text/plain": [
    699        "                                              Price / TTM Cashflows  \\\n",
    700        "2015-06-08 00:00:00+00:00 Equity(2 [AA])                  -0.228260   \n",
    701        "                          Equity(21 [AAME])               -0.065546   \n",
    702        "                          Equity(24 [AAPL])               -0.102235   \n",
    703        "                          Equity(25 [AA_PR])                    NaN   \n",
    704        "                          Equity(31 [ABAX])               -0.092681   \n",
    705        "                          Equity(39 [DDC])                -0.242844   \n",
    706        "                          Equity(41 [ARCB])               -0.141794   \n",
    707        "                          Equity(52 [ABM])                -0.100783   \n",
    708        "                          Equity(53 [ABMD])               -0.069797   \n",
    709        "                          Equity(62 [ABT])                -0.101121   \n",
    710        "                          Equity(64 [ABX])                -0.232389   \n",
    711        "                          Equity(66 [AB])                 -0.067308   \n",
    712        "                          Equity(67 [ADSK])               -0.090698   \n",
    713        "                          Equity(69 [ACAT])               -0.206946   \n",
    714        "                          Equity(70 [VBF])                      NaN   \n",
    715        "                          Equity(76 [TAP])                -0.163318   \n",
    716        "                          Equity(84 [ACET])               -0.039401   \n",
    717        "                          Equity(86 [ACG])                      NaN   \n",
    718        "                          Equity(88 [ACI])                -0.004039   \n",
    719        "                          Equity(100 [IEP])                0.044639   \n",
    720        "\n",
    721        "                                              Price / TTM Earnings  \\\n",
    722        "2015-06-08 00:00:00+00:00 Equity(2 [AA])                 -0.137305   \n",
    723        "                          Equity(21 [AAME])              -0.061818   \n",
    724        "                          Equity(24 [AAPL])              -0.254608   \n",
    725        "                          Equity(25 [AA_PR])                   NaN   \n",
    726        "                          Equity(31 [ABAX])              -0.137099   \n",
    727        "                          Equity(39 [DDC])               -0.135980   \n",
    728        "                          Equity(41 [ARCB])              -0.274208   \n",
    729        "                          Equity(52 [ABM])               -0.230880   \n",
    730        "                          Equity(53 [ABMD])              -0.247635   \n",
    731        "                          Equity(62 [ABT])               -0.206759   \n",
    732        "                          Equity(64 [ABX])               -0.158385   \n",
    733        "                          Equity(66 [AB])                -0.119138   \n",
    734        "                          Equity(67 [ADSK])               0.070003   \n",
    735        "                          Equity(69 [ACAT])              -0.042954   \n",
    736        "                          Equity(70 [VBF])                     NaN   \n",
    737        "                          Equity(76 [TAP])               -0.135310   \n",
    738        "                          Equity(84 [ACET])              -0.130085   \n",
    739        "                          Equity(86 [ACG])                     NaN   \n",
    740        "                          Equity(88 [ACI])               -0.151373   \n",
    741        "                          Equity(100 [IEP])              -0.132753   \n",
    742        "\n",
    743        "                                              Price / TTM Sales     SPY Proxy  \n",
    744        "2015-06-08 00:00:00+00:00 Equity(2 [AA])              -0.061063  1.527980e+10  \n",
    745        "                          Equity(21 [AAME])           -0.055851  7.920730e+07  \n",
    746        "                          Equity(24 [AAPL])           -0.051943  7.452470e+11  \n",
    747        "                          Equity(25 [AA_PR])                NaN           NaN  \n",
    748        "                          Equity(31 [ABAX])           -0.054737  1.197080e+09  \n",
    749        "                          Equity(39 [DDC])            -0.061062  1.607340e+09  \n",
    750        "                          Equity(41 [ARCB])           -0.045524  9.029610e+08  \n",
    751        "                          Equity(52 [ABM])            -0.045505  1.845380e+09  \n",
    752        "                          Equity(53 [ABMD])           -0.054732  2.642370e+09  \n",
    753        "                          Equity(62 [ABT])            -0.054739  7.247270e+10  \n",
    754        "                          Equity(64 [ABX])            -0.061063  1.361500e+10  \n",
    755        "                          Equity(66 [AB])             -0.046536  3.136030e+09  \n",
    756        "                          Equity(67 [ADSK])           -0.046009  1.223180e+10  \n",
    757        "                          Equity(69 [ACAT])           -0.061894  4.226440e+08  \n",
    758        "                          Equity(70 [VBF])                  NaN           NaN  \n",
    759        "                          Equity(76 [TAP])             1.218060  1.389700e+10  \n",
    760        "                          Equity(84 [ACET])           -0.061063  7.177060e+08  \n",
    761        "                          Equity(86 [ACG])                  NaN           NaN  \n",
    762        "                          Equity(88 [ACI])            -0.061064  1.081390e+08  \n",
    763        "                          Equity(100 [IEP])           -0.045315  1.124600e+10  "
    764       ]
    765      },
    766      "execution_count": 8,
    767      "metadata": {},
    768      "output_type": "execute_result"
    769     }
    770    ],
    771    "source": [
    772     "# This factor creates the synthetic S&P500\n",
    773     "class SPY_proxy(CustomFactor):\n",
    774     "    inputs = [morningstar.valuation.market_cap]\n",
    775     "    window_length = 1\n",
    776     "    \n",
    777     "    def compute(self, today, assets, out, mc):\n",
    778     "        out[:] = mc[-1]\n",
    779     "        \n",
    780     "        \n",
    781     "# this function returns a pipeline that downloads all data necessary for the algo\n",
    782     "def Data_Pull():\n",
    783     "\n",
    784     "    # create the piepline for the data pull\n",
    785     "    Data_Pipe = Pipeline()\n",
    786     "    \n",
    787     "    # create sector partitions\n",
    788     "    sector = Sector()\n",
    789     "    \n",
    790     "    # create SPY proxy\n",
    791     "    Data_Pipe.add(SPY_proxy(), 'SPY Proxy')\n",
    792     "    \n",
    793     "    # Price / TTM Sales grouped by Industry\n",
    794     "    sales_grouped = Price_to_TTM_Sales().zscore(groupby=sector)\n",
    795     "    \n",
    796     "    # Price / TTM Earnings grouped by Industry\n",
    797     "    earnings_grouped = Price_to_TTM_Earnings().zscore(groupby=sector)\n",
    798     "    \n",
    799     "    # Price / TTM Cashflows grouped by Industry\n",
    800     "    cashflows_grouped = Price_to_TTM_Cashflows().zscore(groupby=sector)\n",
    801     "    \n",
    802     "    # add Price / TTM Sales to Pipeline\n",
    803     "    Data_Pipe.add(sales_grouped, 'Price / TTM Sales')\n",
    804     "    \n",
    805     "    # add Price / TTM Earnings to Pipeline\n",
    806     "    Data_Pipe.add(earnings_grouped, 'Price / TTM Earnings')\n",
    807     "    \n",
    808     "    # add Price / TTM Cashflows to Pipeline\n",
    809     "    Data_Pipe.add(cashflows_grouped, 'Price / TTM Cashflows')\n",
    810     "    \n",
    811     "    return Data_Pipe\n",
    812     "\n",
    813     "results = run_pipeline(Data_Pull(), '2015-06-06', '2015-06-06')\n",
    814     "results.head(20)"
    815    ]
    816   },
    817   {
    818    "cell_type": "markdown",
    819    "metadata": {},
    820    "source": [
    821     "Now, we will use the same metric to combine these values as in the last notebook. The one large difference between these methodologies is the ranking of the final scores. For each of the ratios here, a low value is considered to be an attractive investment. Therefore we rank the values in ascending order so that the \"best\" stocks are still at the head of the data series and the \"worst\" are in the tail. This ranking occurs in the composite_score function."
    822    ]
    823   },
    824   {
    825    "cell_type": "code",
    826    "execution_count": 9,
    827    "metadata": {
    828     "collapsed": false
    829    },
    830    "outputs": [
    831     {
    832      "data": {
    833       "text/plain": [
    834        "(2015-06-08 00:00:00+00:00, Equity(29375 [QKLS]))     -0.584313\n",
    835        "(2015-06-08 00:00:00+00:00, Equity(24831 [ESI]))      -0.581647\n",
    836        "(2015-06-08 00:00:00+00:00, Equity(39744 [BORN]))     -0.578041\n",
    837        "(2015-06-08 00:00:00+00:00, Equity(42464 [RNDY]))     -0.573479\n",
    838        "(2015-06-08 00:00:00+00:00, Equity(35012 [GRO]))      -0.568073\n",
    839        "(2015-06-08 00:00:00+00:00, Equity(26301 [DIT]))      -0.561397\n",
    840        "(2015-06-08 00:00:00+00:00, Equity(12765 [AOI]))      -0.555417\n",
    841        "(2015-06-08 00:00:00+00:00, Equity(24814 [DF]))       -0.547799\n",
    842        "(2015-06-08 00:00:00+00:00, Equity(24834 [CECO]))     -0.537287\n",
    843        "(2015-06-08 00:00:00+00:00, Equity(19817 [MTEX]))     -0.533288\n",
    844        "(2015-06-08 00:00:00+00:00, Equity(30017 [LFVN]))     -0.532106\n",
    845        "(2015-06-08 00:00:00+00:00, Equity(29228 [SPU]))      -0.524994\n",
    846        "(2015-06-08 00:00:00+00:00, Equity(14329 [ANDE]))     -0.520449\n",
    847        "(2015-06-08 00:00:00+00:00, Equity(7233 [SVU]))       -0.520080\n",
    848        "(2015-06-08 00:00:00+00:00, Equity(8722 [RELV]))      -0.515764\n",
    849        "(2015-06-08 00:00:00+00:00, Equity(21939 [SPTN]))     -0.514979\n",
    850        "(2015-06-08 00:00:00+00:00, Equity(3890 [IMKT_A]))    -0.506765\n",
    851        "(2015-06-08 00:00:00+00:00, Equity(27374 [LINC]))     -0.502989\n",
    852        "(2015-06-08 00:00:00+00:00, Equity(14098 [LTRE]))     -0.498891\n",
    853        "(2015-06-08 00:00:00+00:00, Equity(41783 [PME]))      -0.498463\n",
    854        "(2015-06-08 00:00:00+00:00, Equity(5183 [NAII]))      -0.497922\n",
    855        "(2015-06-08 00:00:00+00:00, Equity(29960 [SUMR]))     -0.493908\n",
    856        "(2015-06-08 00:00:00+00:00, Equity(6624 [SAFM]))      -0.491251\n",
    857        "(2015-06-08 00:00:00+00:00, Equity(38724 [ALN]))      -0.487551\n",
    858        "(2015-06-08 00:00:00+00:00, Equity(18855 [CENT]))     -0.487319\n",
    859        "(2015-06-08 00:00:00+00:00, Equity(33297 [CENT_A]))   -0.485448\n",
    860        "(2015-06-08 00:00:00+00:00, Equity(6330 [RAD]))       -0.483931\n",
    861        "(2015-06-08 00:00:00+00:00, Equity(8028 [CRVP]))      -0.483620\n",
    862        "(2015-06-08 00:00:00+00:00, Equity(35259 [LRN]))      -0.479704\n",
    863        "(2015-06-08 00:00:00+00:00, Equity(7988 [VLGE_A]))    -0.475279\n",
    864        "                                                         ...   \n",
    865        "(2015-06-08 00:00:00+00:00, Equity(24466 [MGCD]))      2.250898\n",
    866        "(2015-06-08 00:00:00+00:00, Equity(42244 [RRMS]))      2.251317\n",
    867        "(2015-06-08 00:00:00+00:00, Equity(26143 [NRG]))       2.251836\n",
    868        "(2015-06-08 00:00:00+00:00, Equity(26755 [LONG]))      2.253152\n",
    869        "(2015-06-08 00:00:00+00:00, Equity(23428 [CCOI]))      2.257763\n",
    870        "(2015-06-08 00:00:00+00:00, Equity(34692 [ATHN]))      2.262818\n",
    871        "(2015-06-08 00:00:00+00:00, Equity(34111 [SCOR]))      2.267639\n",
    872        "(2015-06-08 00:00:00+00:00, Equity(47434 [FCB]))       2.280530\n",
    873        "(2015-06-08 00:00:00+00:00, Equity(44747 [DATA]))      2.299100\n",
    874        "(2015-06-08 00:00:00+00:00, Equity(16511 [KMX]))       2.300366\n",
    875        "(2015-06-08 00:00:00+00:00, Equity(6421 [RENT]))       2.320707\n",
    876        "(2015-06-08 00:00:00+00:00, Equity(24073 [EEQ]))       2.349248\n",
    877        "(2015-06-08 00:00:00+00:00, Equity(17287 [AIII]))      2.391016\n",
    878        "(2015-06-08 00:00:00+00:00, Equity(24 [AAPL]))         2.393255\n",
    879        "(2015-06-08 00:00:00+00:00, Equity(26401 [CRM]))       2.425059\n",
    880        "(2015-06-08 00:00:00+00:00, Equity(41663 [RTRX]))      2.426343\n",
    881        "(2015-06-08 00:00:00+00:00, Equity(34833 [RBS]))       2.467736\n",
    882        "(2015-06-08 00:00:00+00:00, Equity(1010 [BNS]))        2.467833\n",
    883        "(2015-06-08 00:00:00+00:00, Equity(35035 [NPD]))       2.483405\n",
    884        "(2015-06-08 00:00:00+00:00, Equity(45585 [MMAC]))      2.519813\n",
    885        "(2015-06-08 00:00:00+00:00, Equity(28030 [DSS]))       2.550427\n",
    886        "(2015-06-08 00:00:00+00:00, Equity(34577 [TTHI]))      2.564149\n",
    887        "(2015-06-08 00:00:00+00:00, Equity(1587 [CDZI]))       2.684770\n",
    888        "(2015-06-08 00:00:00+00:00, Equity(41730 [ZG]))        2.692603\n",
    889        "(2015-06-08 00:00:00+00:00, Equity(37336 [SIXD]))      2.987099\n",
    890        "(2015-06-08 00:00:00+00:00, Equity(24853 [FCEL]))      3.070704\n",
    891        "(2015-06-08 00:00:00+00:00, Equity(12031 [RENX]))      3.254670\n",
    892        "(2015-06-08 00:00:00+00:00, Equity(47352 [BHBK]))      3.432712\n",
    893        "(2015-06-08 00:00:00+00:00, Equity(26141 [MGN]))       3.619338\n",
    894        "(2015-06-08 00:00:00+00:00, Equity(12099 [RELX]))      4.042818\n",
    895        "dtype: float64"
    896       ]
    897      },
    898      "execution_count": 9,
    899      "metadata": {},
    900      "output_type": "execute_result"
    901     }
    902    ],
    903    "source": [
    904     "# limit effect of outliers\n",
    905     "def filter_fn(x):\n",
    906     "    if x <= -10:\n",
    907     "        x = -10.0\n",
    908     "    elif x >= 10:\n",
    909     "        x = 10.0\n",
    910     "    return x   \n",
    911     "\n",
    912     "# standardize using mean and sd of S&P500\n",
    913     "def standard_frame_compute(df):\n",
    914     "    \n",
    915     "    # basic clean of dataset to remove infinite values\n",
    916     "    df = df.replace([np.inf, -np.inf], np.nan)\n",
    917     "    df = df.dropna()\n",
    918     "    \n",
    919     "    # need standardization params from synthetic S&P500\n",
    920     "    df_SPY = df.sort(columns='SPY Proxy', ascending=False)\n",
    921     "\n",
    922     "    # create separate dataframe for SPY\n",
    923     "    # to store standardization values\n",
    924     "    df_SPY = df_SPY.head(500)\n",
    925     "    \n",
    926     "    # get dataframes into numpy array\n",
    927     "    df_SPY = df_SPY.as_matrix()\n",
    928     "    \n",
    929     "    # store index values\n",
    930     "    index = df.index.values\n",
    931     "    df = df.as_matrix()\n",
    932     "    \n",
    933     "    df_standard = np.empty(df.shape[0])\n",
    934     "    \n",
    935     "    \n",
    936     "    for col_SPY, col_full in zip(df_SPY.T, df.T):\n",
    937     "        \n",
    938     "        # summary stats for S&P500\n",
    939     "        mu = np.mean(col_SPY)\n",
    940     "        sigma = np.std(col_SPY)\n",
    941     "        col_standard = np.array(((col_full - mu) / sigma)) \n",
    942     "\n",
    943     "        # create vectorized function (lambda equivalent)\n",
    944     "        fltr = np.vectorize(filter_fn)\n",
    945     "        col_standard = (fltr(col_standard))\n",
    946     "        \n",
    947     "        # make range between -10 and 10\n",
    948     "        col_standard = (col_standard / df.shape[1])\n",
    949     "        \n",
    950     "        # attach calculated values as new row in df_standard\n",
    951     "        df_standard = np.vstack((df_standard, col_standard))\n",
    952     "     \n",
    953     "    # get rid of first entry (empty scores)\n",
    954     "    df_standard = np.delete(df_standard,0,0)\n",
    955     "    \n",
    956     "    return (df_standard, index)\n",
    957     "\n",
    958     "# Sum up and sort data\n",
    959     "def composite_score(df, index):\n",
    960     "\n",
    961     "    # sum up transformed data\n",
    962     "    df_composite = df.sum(axis=0)\n",
    963     "    \n",
    964     "    # put into a pandas dataframe and connect numbers\n",
    965     "    # to equities via reindexing\n",
    966     "    df_composite = pd.Series(data=df_composite,index=index)\n",
    967     "    \n",
    968     "    # sort ascending - change from previous notebook\n",
    969     "    df_composite.sort(ascending=True)\n",
    970     "\n",
    971     "    return df_composite\n",
    972     "\n",
    973     "# compute the standardized values\n",
    974     "results_standard, index = standard_frame_compute(results)\n",
    975     "\n",
    976     "# aggregate the scores\n",
    977     "ranked_scores = composite_score(results_standard, index)\n",
    978     "ranked_scores"
    979    ]
    980   },
    981   {
    982    "cell_type": "markdown",
    983    "metadata": {},
    984    "source": [
    985     "NB: In the algorithm, standard_frame_compute and composite_score have been conflated into one function called aggregate_data."
    986    ]
    987   },
    988   {
    989    "cell_type": "markdown",
    990    "metadata": {
    991     "collapsed": true
    992    },
    993    "source": [
    994     "##Stock Choice\n",
    995     "\n",
    996     "Before blindly picking stocks based solely on the algorithm's output, it is always good practice to have a look at the histogram of the ranked scores."
    997    ]
    998   },
    999   {
   1000    "cell_type": "code",
   1001    "execution_count": 10,
   1002    "metadata": {
   1003     "collapsed": false
   1004    },
   1005    "outputs": [
   1006     {
   1007      "data": {
   1008       "image/png": "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\nuHHjct5552XYsGEZNmxYnn766STJI488kkGDBuWiiy7KQw89lCTZunVrRo8enaFDh+aSSy7Jq6++\nWupxAQAA0qKUN75p06bccsst6du3707LR48enX79+u203pQpUzJjxoy0aNEigwYNSm1tbWbNmpV2\n7drlW9/6VmbPnp3bbrstkyZNKuXIAAAApT2iVF1dnTvvvDOHHXbYO663aNGi9OjRI23atEl1dXVO\nOumkzJ8/P3PmzEn//v2TJKeddloWLFhQynEBAACSlDiUKisr06pVq12W33ffffnc5z6XUaNG5U9/\n+lPq6urSoUOHhus7dOiQ1atX77S8oqIilZWV2bp1aylHBgAAKO2pd7tz/vnnp3379jnuuOMyderU\n3H777enZs+dO69TX1+922+3bt+/RfcyfP/9dz7k/6JXSPBfLli3b620WL16c9evXv+ezvBP7AYn9\ngB3sBwe2t/8+tC+Q2A/YM02G0ty5c3PyySfvtOzJJ59sOCVub51yyikNX5999tm56aab8olPfCI/\n//nPG5avXLkyPXv2TKdOnVJXV5fu3bs3HElq0aLptuvVq9dfNNv+qBTPRdu2bZPHVuzVNieccEK6\ndev2ns/SmPnz59sPsB+QxH7ADr169bIvkMTPBHbYk1hu9NS7V199NXPmzMmECRMyZ86chv+eeeaZ\nfPOb3/yLh7rqqqvy0ksvJUnmzZuXbt26pUePHlm8eHE2bNiQjRs3ZuHChenVq1f69u2bmTNnJklm\nzZq1S7ABAACUQqOHZ1avXp3HH388f/jDHzJlypSG5ZWVlRkyZMge3fiiRYsyfvz4vPbaa6mqqsr0\n6dNz1VVXZdy4cWnTpk3atGmTb37zm6murs6oUaNy2WWXpbKyMiNGjEhNTU0GDBiQ2bNnZ+jQoamu\nrs7NN9/87h8xAABAExoNpZ49e6Znz57p16/fX3ya3cc//vE8+uijuyw/55xzdllWW1ub2tranZZV\nVlZmwoQJf9F9AwAA/KWafNe74447LldddVUuueSSJMmDDz6Y//mf/yn1XAAAAGXTZCjdcMMNOf/8\n8xveie6DH/xgrr/++pIPBgAAUC5NhtKbb76Zs88+OxUVFUmS3r17l3woAACActqjD5z985//3BBK\nv/3tb7N58+aSDgUAAFBOTX4o0Ze+9KUMHjw4q1evznnnnZc//elPufXWW5tjNgAAgLJoMpR69+6d\nhx9+OL/5zW/SqlWrHHvssY4oAQAA+7UmT7278sorU1FRkR49euS4447Lr3/96wwaNKg5ZgMAACiL\nJkPp3HPPzeWXX57XXnstkydPzk033ZRvf/vbzTEbAABAWTR56t2nPvWpHHHEETnvvPPSp0+fPPTQ\nQznooIOaYzYAAICyaDSUJk+evNPlj3/84/nd736XO++8M0ny5S9/ubSTAQAAlEmjoVRVVbXT5eOP\nPz7HH398yQcCAAAot0ZDafjw4Q1fb9iwITU1Namrq8v//M//5KSTTmqW4QAAAMqhyTdz+PrXv57H\nH388a9euzZAhQ3LfffflpptuaobRAAAAyqPJUHrhhRcyePDg/OQnP8nAgQPz7W9/O8uWLWuO2QAA\nAMqiyVCqr69Pkjz11FM566yzkiRbtmwp7VQAAABl1GQoHXvssRkwYEA2btyYj370o3n44YfTrl27\n5pgNAACgLJr8HKVvfOMb+c1vfpOuXbsmST784Q/ni1/8YskHAwAAKJcmQylJVq1alZdeeinJjtPu\n7rjjjsyaNaukgwEAAJRLk6E0ZsyYrFu3Li+99FJOOumk/PKXv8xVV13VHLMBAACURZOvUVq5cmWm\nTZuWY489Nt/5znfy/e9/P7/85S+bYzYAAICyaDKUtm3blu3bt2fr1q3ZvHlzjj766CxZsqQ5ZgMA\nACiLJk+9O+200zJt2rT0798/AwcOTJcuXZpjLgAAgLJpMpSuuuqqbNu2LVVVVenZs2fWrFmTvn37\nNsdsAAAAZdHkqXdJUlVVlRdffDG/+tWv0rp167Ru3brUcwEAAJRNo6H04x//OH369MkFF1yQ//qv\n/8rYsWPzxz/+Md/5zncyderU5pwRAACgWTV66t3dd9+dH/3oR1m+fHlGjhyZH//4x2nfvn3efPPN\nDB06NF/4wheac04AAIBm02goHXTQQTn66KNz9NFHp0uXLmnfvn2SpGXLljnooIOabUAAAIDmtkev\nUaqurt7pckVFRUmGAQAA2Bc0ekRpyZIlueaaa3b5ur6+Pi+//HLzTAcAAFAGjYbS6NGjG74+9dRT\nd7rutNNOK91EAAAAZdZoKA0cOLA55wAAANhn7NFrlAAAAA4kQgkAAKCg0VPviurr61NfX99wubJS\nYwEAAPunJkPpu9/9bu64445s3LgxyY5gqqioyH//93+XfDgAAIByaDKUZsyYkUceeSRHHXVUc8wD\nAABQdk2eP3fMMceIJAAA4IDS5BGl7t27Z9SoUenTp0+qqqoalg8aNKikgwEAAJRLk6G0atWqtGrV\nKr/85S93Wi6UAACA/VWToTRhwoTmmAMAAGCf0WgojRw5Mt/+9rfTr1+/VFRU7HL9U089Vcq5AAAA\nyqbRUBo/fnyS5IEHHmi2YQAAAPYFjYbSYYcdliQ5+uijm20YAACAfUGTbw8OAABwoGkylOrr65tj\nDgAAgH1Gk6F05plnZtKkSXnllVeaYx4AAICyazKUfvCDH+TQQw/NmDFjcumll+bRRx/Nli1bmmM2\nAACAsmgylDp16pRLL70006dPz9ixYzN16tScfvrpmTRpUjZv3twcMwIAADSrPXozh+eeey5jxozJ\nF7/4xfTr1y8PPPBADjnkkHz5y18u9XwAAADNrtG3B39L//7906VLlwwePDjf/OY307JlyyRJ165d\n8+STT5Z8QAAAgObW5BGlCy64IN/73vcyYMCAhkj6/ve/n8SH0QIAAPunRo8ovfDCC3n++efz4x//\nOEcccUTD8jfffDP/9m//ls985jOpqKholiEBAACaU6OhVF1dnTVr1mT9+vWZP39+w/KKiopcc801\nzTIcAABAOTQaSl27dk3Xrl1zyimn5MQTT2zOmQAAAMqq0VD6xje+kfHjx2fixIm7PcXu/vvvL+lg\nAAAA5dJoKA0aNChJMnLkyGYbBgAAYF/QaCgdd9xxSZIf/vCHufnmm3e67vLLL0+fPn1KOxkAAECZ\nNBpKjzzySKZPn57f/va3+exnP9uw/M0338yaNWuaZTgAAIByaDSUPvnJT+bkk0/O6NGjM2LEiIbl\nlZWV+fCHP9wswwEAAJRDo6GUJJ07d869996b9evXZ+3atQ3L169fn/bt25d8OAAAgHJ4x1BKdrz7\n3YwZM9KhQ4fU19cn2fFZSj/72c9KPhwAAEA5NBlKc+fOzXPPPZfq6urmmAcAAKDsKpta4ZhjjhFJ\nAADAAaXJI0pHHHFEPvvZz6ZXr16pqqpqWP7lL3+5pIMBAACUS5Oh1L59+5x66qnNMQsAAMA+oclQ\nGj58+C7LbrnllpIMAwAAsC9oMpRmz56df/3Xf214e/AtW7akffv2+epXv1ry4QAAAMqhyTdz+Pa3\nv53rr78+HTt2zB133JFPf/rTGTNmTHPMBgAAUBZNhlJNTU1OPPHEtGzZMh/5yEcycuTIfO9732uG\n0QAAAMqjyVPvtmzZknnz5uWQQw7Jj370o3Tt2jXLly9vjtkAAADKoslQ+vrXv566urpcc801DV9f\neeWVzTEbAABAWTQZSh/60IfyoQ99KEly1113lXwgAACAcmsylPr165eKiopdlj/11FOlmAcAAKDs\nmgylBx54oOHrN998M3PmzMnmzZtLOhQAAEA5NRlKRx999E6XP/jBD+byyy/PpZdeWqqZAAAAyqrJ\nUJozZ85Ol1esWJHf//73JRsIAACg3JoMpSlTpjR8XVFRkZqamnzta18r6VAAAADl1GQo3Xvvvc0x\nBwAAwD6j8p2unDt3bi6++OL07NkzJ598coYNG5bZs2c3XL9x48aSDwgAANDcGj2iNHPmzNx+++25\n+uqrc+KJJyZJfv3rX+fWW2/N5s2bc9ZZZ2X48OH593//92YbFgAAoDk0Gkp33XVX/vf//t858sgj\nG5b169cvH/3oR/OVr3wlhx56aOrq6pq8gxdffDEjRozIpZdems9+9rNZsWJFxowZk/r6+hx++OGZ\nOHFiWrZsmUceeST33HNPqqqqcuGFF2bQoEHZunVrxo4dm+XLl6eqqioTJkxIly5d3ptHDgAA0IhG\nT72rqKjYKZLe0qlTp2zatCljxozJjTfe+I43vmnTptxyyy3p27dvw7LJkyfnkksuyX333Ze/+qu/\nyowZM7Jp06ZMmTIld999d+65557cfffd+fOf/5zHHnss7dq1ywMPPJArr7wyt91227t4qAAAAHum\n0VDatGlToxtt3LgxP/3pT/M3f/M373jj1dXVufPOO3PYYYc1LJs3b17OPPPMJMmZZ56ZZ599NosW\nLUqPHj3Spk2bVFdX56STTsr8+fMzZ86c9O/fP0ly2mmnZcGCBXv14AAAAP4SjYZSz549d/uOd9/9\n7nfTvXv3VFRUNH3jlZVp1arVTss2bdqUli1bJkk6duyYVatWZc2aNenQoUPDOh06dMjq1atTV1fX\nsLyioiKVlZXZunXrnj0yAACAv1Cjr1EaM2ZMvvCFL+Sxxx7Lxz72sdTX12fhwoWpqqrKd7/73ffk\nzuvr6/dq+fbt2/fodufPn/8Xz7Q/6ZXSPBfLli3b620WL16c9evXv+ezvBP7AYn9gB3sBwe2t/8+\ntC+Q2A/YM42GUk1NTR544IE8++yzeeGFF1JdXZ1zzjknp5xyyru6wzZt2mTLli1p1apVVq5cmc6d\n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\nrcrhhx9exomAcnvmmWcyderUTJs2LTU1NeUehzJYvHhxOnbsmCOPPDLHHXdctm3bltdee22nMxDY\n/z399NN59dVX85//+Z9ZsWJFqqurc8QRR+TUU08t92g0s86dO+fcc89NknzgAx/IYYcdlpUrV+bo\no4/eZd33bSg1xb8UHHj69u2b22+/PYMHD87zzz+fzp07p3Xr1uUeCyiTDRs25NZbb833vve9tG3b\nttzjUCb/9//+3yxfvjzXXntt6urqsmnTJpF0AJo0aVLD17fffnu6dOkikg5Qjz76aJYtW5bhw4dn\nzZo1ee2119K5c+fdrltRvx8VxU9/+tN85zvfyapVq9KmTZsceuihmTFjRrnHohn967/+a+bNm5eq\nqqrccMMN6d69e7lHogwWLVqU8ePH57XXXktVVVXatWuX++67L+3atSv3aDSjH/zgB7n99tvzwQ9+\nsOEU7YkTJ+aII44o92g0o82bN+faa6/NihUrsnnz5owYMcKL+Q9wb4XSBRdcUO5RKIONGzdm1KhR\nWbduXerr6/OlL30pp59++m7X3a9CCQAA4L2wX73rHQAAwHtBKAEAABQIJQAAgAKhBAAAUCCUAAAA\nCoQSAABAgVACYLeefvrpXHzxxfnc5z6XCy+8MFdffXU2bNiQJFm4cGFeffXV9+R++vXrl+XLl7/r\n7Z955pnceeed73qeMWPG5OGHH95l+a9+9atceuml+dznPpchQ4bkiiuuyB//+Md3fX8A7JuEEgC7\nePPNN3PNNddk8uTJufvuu/Pggw/myCOPzIMPPpgk+eEPf5hXXnnlPbmvioqK92T7008/Pf/0T//0\nXoy0W2PGjMnYsWNz9913Z/r06enXr1/+/d//vWT3B0B5tSj3AADsezZv3pw33ngjGzduTMeOHZPs\nCIUkefLJJzNz5sz8+te/zrhx49KiRYvceuutOeigg/LGG2/kxhtvzEc/+tGMGzcunTp1yksvvZRl\ny5bl05/+dD7/+c9nzZo1GTlyZLZv357jjz8+b33u+aZNm/LVr341a9euzaZNm1JbW5srrrgi8+bN\ny5QpU3LQQQfl7LPPzllnnbXb7X/0ox/l2WefzdVXX51rrrkmFRUVqa+vz8KFC/PAAw+kR48emTRp\nUhYsWJDNmzend+/eGTNmTOrr63Pttdfmt7/9bY466qi8/vrru31O1q1bl/Xr1zdcvvjiixu+XrZs\nWcaPH58kadWqVSZMmJBOnTplypQpefrpp9OyZct85CMfyfjx47NixYpceeWV6d69e7p27Zp//ud/\n3u1cq1atyujRoxu+HxdddFE+9alPvcffaQAaI5QA2EVNTU2GDx+e888/Pz179kyfPn3y93//9zn2\n2GPTv3//3H333fnSl76Uk08+OT/72c9y00035bjjjsuPf/zj3HHHHZk8eXKS5NVXX80dd9yR5cuX\n55Of/GQ+//nP55577smJJ56YUaNG5YUXXsh9992XJFmzZk3OOuusXHDBBdmyZUtOO+20DB06NEny\n/PPPZ9asWWnbtm0mTZq02+2THUeXjjzyyNx7771Jkvvvvz9HHnlkevTokZkzZ2bVqlUN1w0fPjxP\nPfVUWrZsmaVLl+ahhx7KG2+8kf79++cf/uEfdnlOxo0bl3/+539Ot27d0qdPn9TW1ub4449Pktx4\n44254oor8nd/93d5/PHHM3PmzPTo0SNPPvlkHnrooVRWVuaqq67Ko48+mt69e+fll1/O7bffnmOO\nOWa3c/385z/PsmXL0rVr19x4443ZsmVLfvCDH5Touw3A7gglAHbriiuuyODBgzN79uw899xzueii\ni3L11VdnyJAhSdJwJOewww7Lrbfems2bN2f9+vVp165dw2306dMnSXLUUUdl48aNqa+vz0svvdRw\nG8cff3xqamqSJB07dsyCBQsyffr0tGzZMlu2bMm6deuSJMcee2zatm2bJLts/9byooULF+ZHP/pR\n7r///iTJ3Llzs3DhwgwbNiz19fXZuHFjXn311bz55pvp2bNnkuSggw7Kxz/+8d3e3vnnn5/a2to8\n++yzee6553LFFVdk0KBB+cpXvpJFixY1PNYBAwYkSe6+++707t07lZU7znI/+eSTs3jx4vTu3Tvt\n27fPMccc0+hcf/jDH9KvX79ceeWVGTduXPr169fwmAFoHkIJgN1644030q5duwwYMCADBgzIJz7x\nidxyyy27/MF+zTXX5Otf/3r69OmTp556KnfddVfDdVVVVTut+1Zcvf11Sdu2bUuyIyzefPPNTJ8+\nPUlyyimnNKzTsmXLnW7n7dtv3bp1l9nr6upyww035H/9r/+V6urqJDtOibvooovyj//4jzute9dd\ndzXEzNvn2d3zcfDBB+fss8/O2WefnYsvvjif/vSn85WvfCUVFRXZvn17ozO+/bEXH09jcyXJ448/\nnnnz5uUnP/lJ7r777nz/+9/f7WwAvPe8mQMAu/iv//qvDB48uOFd7pLklVdeaTgKUllZ2RAoa9as\nyYc//OFs27YtP/nJT7Jly5bd3uZbodC1a9csXLgwSbJo0aJs2rQpyY646dq1a5LkZz/7WTZv3rzb\n22ps+7ds27YtV199dUaPHp0uXbo0LO/Vq1f+8z//syGE/u3f/i2///3v07Vr1yxatChJsmHDhvzq\nV7/a5T5ffvnl1NbWZuXKlTs9H3/1V3+VJDnppJPyzDPPJEkee+yxhtMD586d23B/c+bMyYknnrjT\nc/FOcz322GP51a9+lVNPPTU33XRTVqxYsUuMAVA6jigBsIu//du/zbJly3LppZemdevWqa+vz2GH\nHZYbbrghSdK3b9/ceOONufbaa3PFFVdk2LBh6dy5c6644oqMHTs299xzzy63+dYRlmHDhmXkyJG5\n9NJL8+EPfzgf+MAHkiSDBg3K1Vdfnf/zf/5PzjrrrJx33nkZPXp0vvrVr+50O41t/5Ynnngizz//\nfKZNm5bvfve7qaioyGc+85mce+65WbRoUYYMGZKqqqr89V//dT7wgQ+kS5cueeyxxzJ48OAcddRR\nDafhvd2HPvShjBs3LldddVVatWqVysrKHHTQQbntttuSJNdff32uv/763HfffWnZsmUmTJiQzp07\nZ8CAARk6dGiqqqpy/PHH5x/+4R/yhz/8YaejTbW1tbud6/XXX8+NN96YVq1aJdlxKuTbj3wBUFoV\n9W//Zy0AAACcegcAAFAklAAAAAqEEgAAQIFQAgAAKBBKAAAABUIJAACgQCgBAAAU/P/xeETAOlTW\nngAAAABJRU5ErkJggg==\n",
   1009       "text/plain": [
   1010        "<matplotlib.figure.Figure at 0x7f9a6863c6d0>"
   1011       ]
   1012      },
   1013      "metadata": {},
   1014      "output_type": "display_data"
   1015     }
   1016    ],
   1017    "source": [
   1018     "# create the histogram\n",
   1019     "ranked_scores.hist(bins=50)\n",
   1020     "\n",
   1021     "# make scores into list for ease of manipulation\n",
   1022     "ranked_scores_list = ranked_scores.tolist()\n",
   1023     "\n",
   1024     "# add labels to axes\n",
   1025     "plt.xlabel('Standardized Scores')\n",
   1026     "plt.ylabel('Quantity in Basket')\n",
   1027     "\n",
   1028     "# show long bucket\n",
   1029     "plt.axvline(x=ranked_scores_list[25], linewidth=1, color='r')\n",
   1030     "\n",
   1031     "# show short bucket\n",
   1032     "plt.axvline(x=ranked_scores_list[-6], linewidth=1, color='r');"
   1033    ]
   1034   },
   1035   {
   1036    "cell_type": "markdown",
   1037    "metadata": {},
   1038    "source": [
   1039     "Although it is clear that the long and short baskets are removed from the larger concentration of equities, it is also clear that the histogram is positively skewed, leaving a long tail to the right and a short tail to the left. However, closer inspection reveals a more worrying problem than just excess skewness.\n",
   1040     "\n",
   1041     "Let us have a look at the sector makeup of our long basket. To do this, we will create a new Pipeline to extract the sector codes of the universe."
   1042    ]
   1043   },
   1044   {
   1045    "cell_type": "code",
   1046    "execution_count": 19,
   1047    "metadata": {
   1048     "collapsed": false
   1049    },
   1050    "outputs": [
   1051     {
   1052      "data": {
   1053       "text/html": [
   1054        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
   1055        "<table border=\"1\" class=\"dataframe\">\n",
   1056        "  <thead>\n",
   1057        "    <tr style=\"text-align: right;\">\n",
   1058        "      <th></th>\n",
   1059        "      <th>Score</th>\n",
   1060        "      <th>Sector</th>\n",
   1061        "    </tr>\n",
   1062        "  </thead>\n",
   1063        "  <tbody>\n",
   1064        "    <tr>\n",
   1065        "      <th>(2015-06-08 00:00:00+00:00, Equity(29375 [QKLS]))</th>\n",
   1066        "      <td>-0.584313</td>\n",
   1067        "      <td>205</td>\n",
   1068        "    </tr>\n",
   1069        "    <tr>\n",
   1070        "      <th>(2015-06-08 00:00:00+00:00, Equity(24831 [ESI]))</th>\n",
   1071        "      <td>-0.581647</td>\n",
   1072        "      <td>205</td>\n",
   1073        "    </tr>\n",
   1074        "    <tr>\n",
   1075        "      <th>(2015-06-08 00:00:00+00:00, Equity(39744 [BORN]))</th>\n",
   1076        "      <td>-0.578041</td>\n",
   1077        "      <td>205</td>\n",
   1078        "    </tr>\n",
   1079        "    <tr>\n",
   1080        "      <th>(2015-06-08 00:00:00+00:00, Equity(42464 [RNDY]))</th>\n",
   1081        "      <td>-0.573479</td>\n",
   1082        "      <td>205</td>\n",
   1083        "    </tr>\n",
   1084        "    <tr>\n",
   1085        "      <th>(2015-06-08 00:00:00+00:00, Equity(35012 [GRO]))</th>\n",
   1086        "      <td>-0.568073</td>\n",
   1087        "      <td>205</td>\n",
   1088        "    </tr>\n",
   1089        "    <tr>\n",
   1090        "      <th>(2015-06-08 00:00:00+00:00, Equity(26301 [DIT]))</th>\n",
   1091        "      <td>-0.561397</td>\n",
   1092        "      <td>205</td>\n",
   1093        "    </tr>\n",
   1094        "    <tr>\n",
   1095        "      <th>(2015-06-08 00:00:00+00:00, Equity(12765 [AOI]))</th>\n",
   1096        "      <td>-0.555417</td>\n",
   1097        "      <td>205</td>\n",
   1098        "    </tr>\n",
   1099        "    <tr>\n",
   1100        "      <th>(2015-06-08 00:00:00+00:00, Equity(24814 [DF]))</th>\n",
   1101        "      <td>-0.547799</td>\n",
   1102        "      <td>205</td>\n",
   1103        "    </tr>\n",
   1104        "    <tr>\n",
   1105        "      <th>(2015-06-08 00:00:00+00:00, Equity(24834 [CECO]))</th>\n",
   1106        "      <td>-0.537287</td>\n",
   1107        "      <td>205</td>\n",
   1108        "    </tr>\n",
   1109        "    <tr>\n",
   1110        "      <th>(2015-06-08 00:00:00+00:00, Equity(19817 [MTEX]))</th>\n",
   1111        "      <td>-0.533288</td>\n",
   1112        "      <td>205</td>\n",
   1113        "    </tr>\n",
   1114        "    <tr>\n",
   1115        "      <th>(2015-06-08 00:00:00+00:00, Equity(30017 [LFVN]))</th>\n",
   1116        "      <td>-0.532106</td>\n",
   1117        "      <td>205</td>\n",
   1118        "    </tr>\n",
   1119        "    <tr>\n",
   1120        "      <th>(2015-06-08 00:00:00+00:00, Equity(29228 [SPU]))</th>\n",
   1121        "      <td>-0.524994</td>\n",
   1122        "      <td>205</td>\n",
   1123        "    </tr>\n",
   1124        "    <tr>\n",
   1125        "      <th>(2015-06-08 00:00:00+00:00, Equity(14329 [ANDE]))</th>\n",
   1126        "      <td>-0.520449</td>\n",
   1127        "      <td>205</td>\n",
   1128        "    </tr>\n",
   1129        "    <tr>\n",
   1130        "      <th>(2015-06-08 00:00:00+00:00, Equity(7233 [SVU]))</th>\n",
   1131        "      <td>-0.520080</td>\n",
   1132        "      <td>205</td>\n",
   1133        "    </tr>\n",
   1134        "    <tr>\n",
   1135        "      <th>(2015-06-08 00:00:00+00:00, Equity(8722 [RELV]))</th>\n",
   1136        "      <td>-0.515764</td>\n",
   1137        "      <td>205</td>\n",
   1138        "    </tr>\n",
   1139        "    <tr>\n",
   1140        "      <th>(2015-06-08 00:00:00+00:00, Equity(21939 [SPTN]))</th>\n",
   1141        "      <td>-0.514979</td>\n",
   1142        "      <td>205</td>\n",
   1143        "    </tr>\n",
   1144        "    <tr>\n",
   1145        "      <th>(2015-06-08 00:00:00+00:00, Equity(3890 [IMKT_A]))</th>\n",
   1146        "      <td>-0.506765</td>\n",
   1147        "      <td>205</td>\n",
   1148        "    </tr>\n",
   1149        "    <tr>\n",
   1150        "      <th>(2015-06-08 00:00:00+00:00, Equity(27374 [LINC]))</th>\n",
   1151        "      <td>-0.502989</td>\n",
   1152        "      <td>205</td>\n",
   1153        "    </tr>\n",
   1154        "    <tr>\n",
   1155        "      <th>(2015-06-08 00:00:00+00:00, Equity(14098 [LTRE]))</th>\n",
   1156        "      <td>-0.498891</td>\n",
   1157        "      <td>205</td>\n",
   1158        "    </tr>\n",
   1159        "    <tr>\n",
   1160        "      <th>(2015-06-08 00:00:00+00:00, Equity(41783 [PME]))</th>\n",
   1161        "      <td>-0.498463</td>\n",
   1162        "      <td>205</td>\n",
   1163        "    </tr>\n",
   1164        "    <tr>\n",
   1165        "      <th>(2015-06-08 00:00:00+00:00, Equity(5183 [NAII]))</th>\n",
   1166        "      <td>-0.497922</td>\n",
   1167        "      <td>205</td>\n",
   1168        "    </tr>\n",
   1169        "    <tr>\n",
   1170        "      <th>(2015-06-08 00:00:00+00:00, Equity(29960 [SUMR]))</th>\n",
   1171        "      <td>-0.493908</td>\n",
   1172        "      <td>205</td>\n",
   1173        "    </tr>\n",
   1174        "    <tr>\n",
   1175        "      <th>(2015-06-08 00:00:00+00:00, Equity(6624 [SAFM]))</th>\n",
   1176        "      <td>-0.491251</td>\n",
   1177        "      <td>205</td>\n",
   1178        "    </tr>\n",
   1179        "    <tr>\n",
   1180        "      <th>(2015-06-08 00:00:00+00:00, Equity(38724 [ALN]))</th>\n",
   1181        "      <td>-0.487551</td>\n",
   1182        "      <td>205</td>\n",
   1183        "    </tr>\n",
   1184        "    <tr>\n",
   1185        "      <th>(2015-06-08 00:00:00+00:00, Equity(18855 [CENT]))</th>\n",
   1186        "      <td>-0.487319</td>\n",
   1187        "      <td>205</td>\n",
   1188        "    </tr>\n",
   1189        "    <tr>\n",
   1190        "      <th>(2015-06-08 00:00:00+00:00, Equity(33297 [CENT_A]))</th>\n",
   1191        "      <td>-0.485448</td>\n",
   1192        "      <td>205</td>\n",
   1193        "    </tr>\n",
   1194        "  </tbody>\n",
   1195        "</table>\n",
   1196        "</div>"
   1197       ],
   1198       "text/plain": [
   1199        "                                                       Score  Sector\n",
   1200        "(2015-06-08 00:00:00+00:00, Equity(29375 [QKLS]))  -0.584313     205\n",
   1201        "(2015-06-08 00:00:00+00:00, Equity(24831 [ESI]))   -0.581647     205\n",
   1202        "(2015-06-08 00:00:00+00:00, Equity(39744 [BORN]))  -0.578041     205\n",
   1203        "(2015-06-08 00:00:00+00:00, Equity(42464 [RNDY]))  -0.573479     205\n",
   1204        "(2015-06-08 00:00:00+00:00, Equity(35012 [GRO]))   -0.568073     205\n",
   1205        "(2015-06-08 00:00:00+00:00, Equity(26301 [DIT]))   -0.561397     205\n",
   1206        "(2015-06-08 00:00:00+00:00, Equity(12765 [AOI]))   -0.555417     205\n",
   1207        "(2015-06-08 00:00:00+00:00, Equity(24814 [DF]))    -0.547799     205\n",
   1208        "(2015-06-08 00:00:00+00:00, Equity(24834 [CECO]))  -0.537287     205\n",
   1209        "(2015-06-08 00:00:00+00:00, Equity(19817 [MTEX]))  -0.533288     205\n",
   1210        "(2015-06-08 00:00:00+00:00, Equity(30017 [LFVN]))  -0.532106     205\n",
   1211        "(2015-06-08 00:00:00+00:00, Equity(29228 [SPU]))   -0.524994     205\n",
   1212        "(2015-06-08 00:00:00+00:00, Equity(14329 [ANDE]))  -0.520449     205\n",
   1213        "(2015-06-08 00:00:00+00:00, Equity(7233 [SVU]))    -0.520080     205\n",
   1214        "(2015-06-08 00:00:00+00:00, Equity(8722 [RELV]))   -0.515764     205\n",
   1215        "(2015-06-08 00:00:00+00:00, Equity(21939 [SPTN]))  -0.514979     205\n",
   1216        "(2015-06-08 00:00:00+00:00, Equity(3890 [IMKT_A])) -0.506765     205\n",
   1217        "(2015-06-08 00:00:00+00:00, Equity(27374 [LINC]))  -0.502989     205\n",
   1218        "(2015-06-08 00:00:00+00:00, Equity(14098 [LTRE]))  -0.498891     205\n",
   1219        "(2015-06-08 00:00:00+00:00, Equity(41783 [PME]))   -0.498463     205\n",
   1220        "(2015-06-08 00:00:00+00:00, Equity(5183 [NAII]))   -0.497922     205\n",
   1221        "(2015-06-08 00:00:00+00:00, Equity(29960 [SUMR]))  -0.493908     205\n",
   1222        "(2015-06-08 00:00:00+00:00, Equity(6624 [SAFM]))   -0.491251     205\n",
   1223        "(2015-06-08 00:00:00+00:00, Equity(38724 [ALN]))   -0.487551     205\n",
   1224        "(2015-06-08 00:00:00+00:00, Equity(18855 [CENT]))  -0.487319     205\n",
   1225        "(2015-06-08 00:00:00+00:00, Equity(33297 [CENT_... -0.485448     205"
   1226       ]
   1227      },
   1228      "execution_count": 19,
   1229      "metadata": {},
   1230      "output_type": "execute_result"
   1231     }
   1232    ],
   1233    "source": [
   1234     "# create Pipeline for sectors\n",
   1235     "sector_pipe = Pipeline()\n",
   1236     "sector_pipe.add(Sector(), 'Sector')\n",
   1237     "sectors = run_pipeline(sector_pipe, '2015-06-06', '2015-06-06')\n",
   1238     "\n",
   1239     "# connect ranked scores with their sectors\n",
   1240     "scores_sectors = pd.concat([ranked_scores, sectors], axis=1, join='inner')\n",
   1241     "\n",
   1242     "# name the columns\n",
   1243     "scores_sectors.columns=['Score', 'Sector']\n",
   1244     "\n",
   1245     "# sort ranked scores ascending\n",
   1246     "scores_sectors.sort('Score', inplace=True)\n",
   1247     "\n",
   1248     "# show long bucket\n",
   1249     "scores_sectors.head(26)"
   1250    ]
   1251   },
   1252   {
   1253    "cell_type": "markdown",
   1254    "metadata": {},
   1255    "source": [
   1256     "Each of these securities has sector code 205 and therefore is involved in the Consumer Defensive sector (a subset of the retail space). Therefore, even though we tried to fight this through industry-relative metrics, it seems that the immense skew of these values has made them ineffectual. \n",
   1257     "\n",
   1258     "This means we need to go back to the drawing board. Where did we start? We wanted to trade based on values that were attractive in their own industry. To achieve this goal, given the fact that a single ranking system has not worked, we will need to effectively create baskets for each industry and then take out a 130/30 position in each of them. \n",
   1259     "\n",
   1260     "To do this we will first need to declare a dictionary of sector codes and sectors, loop through this dictionary and create long and short baskets for each industry."
   1261    ]
   1262   },
   1263   {
   1264    "cell_type": "code",
   1265    "execution_count": 18,
   1266    "metadata": {
   1267     "collapsed": false
   1268    },
   1269    "outputs": [
   1270     {
   1271      "name": "stdout",
   1272      "output_type": "stream",
   1273      "text": [
   1274       "LONG BUCKET\n",
   1275       "(2015-06-08 00:00:00+00:00, Equity(29375 [QKLS]))    -0.584313\n",
   1276       "(2015-06-08 00:00:00+00:00, Equity(24831 [ESI]))     -0.581647\n",
   1277       "(2015-06-08 00:00:00+00:00, Equity(39744 [BORN]))    -0.578041\n",
   1278       "(2015-06-08 00:00:00+00:00, Equity(42464 [RNDY]))    -0.573479\n",
   1279       "(2015-06-08 00:00:00+00:00, Equity(35012 [GRO]))     -0.568073\n",
   1280       "(2015-06-08 00:00:00+00:00, Equity(26301 [DIT]))     -0.561397\n",
   1281       "(2015-06-08 00:00:00+00:00, Equity(12765 [AOI]))     -0.555417\n",
   1282       "(2015-06-08 00:00:00+00:00, Equity(24814 [DF]))      -0.547799\n",
   1283       "(2015-06-08 00:00:00+00:00, Equity(24834 [CECO]))    -0.537287\n",
   1284       "(2015-06-08 00:00:00+00:00, Equity(19817 [MTEX]))    -0.533288\n",
   1285       "(2015-06-08 00:00:00+00:00, Equity(30017 [LFVN]))    -0.532106\n",
   1286       "(2015-06-08 00:00:00+00:00, Equity(29228 [SPU]))     -0.524994\n",
   1287       "(2015-06-08 00:00:00+00:00, Equity(14329 [ANDE]))    -0.520449\n",
   1288       "(2015-06-08 00:00:00+00:00, Equity(30851 [SKBI]))    -0.346147\n",
   1289       "(2015-06-08 00:00:00+00:00, Equity(2561 [ENZN]))     -0.346014\n",
   1290       "(2015-06-08 00:00:00+00:00, Equity(13331 [ADMP]))    -0.345680\n",
   1291       "(2015-06-08 00:00:00+00:00, Equity(31095 [CPHI]))    -0.344771\n",
   1292       "(2015-06-08 00:00:00+00:00, Equity(33298 [SNTA]))    -0.343898\n",
   1293       "(2015-06-08 00:00:00+00:00, Equity(26361 [AEZS]))    -0.343844\n",
   1294       "(2015-06-08 00:00:00+00:00, Equity(17849 [ESMC]))    -0.343746\n",
   1295       "(2015-06-08 00:00:00+00:00, Equity(34218 [TPI]))     -0.343535\n",
   1296       "(2015-06-08 00:00:00+00:00, Equity(32095 [PRTK]))    -0.343273\n",
   1297       "(2015-06-08 00:00:00+00:00, Equity(37649 [BSPM]))    -0.343104\n",
   1298       "(2015-06-08 00:00:00+00:00, Equity(47227 [GBIM]))    -0.342601\n",
   1299       "(2015-06-08 00:00:00+00:00, Equity(24470 [CBMX]))    -0.342093\n",
   1300       "(2015-06-08 00:00:00+00:00, Equity(30049 [LPTN]))    -0.341595\n",
   1301       "(2015-06-08 00:00:00+00:00, Equity(37496 [EBR]))     -0.399604\n",
   1302       "(2015-06-08 00:00:00+00:00, Equity(38830 [PAM]))     -0.395179\n",
   1303       "(2015-06-08 00:00:00+00:00, Equity(37495 [EBR_B]))   -0.390394\n",
   1304       "(2015-06-08 00:00:00+00:00, Equity(42431 [JE]))      -0.386254\n",
   1305       "                                                        ...   \n",
   1306       "(2015-06-08 00:00:00+00:00, Equity(44107 [NSLP]))    -0.314357\n",
   1307       "(2015-06-08 00:00:00+00:00, Equity(45141 [JONE]))    -0.314208\n",
   1308       "(2015-06-08 00:00:00+00:00, Equity(42887 [ROYT]))    -0.313590\n",
   1309       "(2015-06-08 00:00:00+00:00, Equity(32675 [BBEP]))    -0.313330\n",
   1310       "(2015-06-08 00:00:00+00:00, Equity(34958 [SHIP]))    -0.385837\n",
   1311       "(2015-06-08 00:00:00+00:00, Equity(30160 [CLNT]))    -0.382435\n",
   1312       "(2015-06-08 00:00:00+00:00, Equity(35143 [AMCO]))    -0.381894\n",
   1313       "(2015-06-08 00:00:00+00:00, Equity(40488 [GLBS]))    -0.378858\n",
   1314       "(2015-06-08 00:00:00+00:00, Equity(26507 [TOPS]))    -0.374658\n",
   1315       "(2015-06-08 00:00:00+00:00, Equity(19836 [DLHC]))    -0.371637\n",
   1316       "(2015-06-08 00:00:00+00:00, Equity(32102 [CODI]))    -0.371134\n",
   1317       "(2015-06-08 00:00:00+00:00, Equity(41252 [TEU]))     -0.370306\n",
   1318       "(2015-06-08 00:00:00+00:00, Equity(45798 [AVH]))     -0.369998\n",
   1319       "(2015-06-08 00:00:00+00:00, Equity(31474 [CREG]))    -0.368630\n",
   1320       "(2015-06-08 00:00:00+00:00, Equity(34549 [THTI]))    -0.368395\n",
   1321       "(2015-06-08 00:00:00+00:00, Equity(38633 [ASPS]))    -0.367987\n",
   1322       "(2015-06-08 00:00:00+00:00, Equity(46939 [CVEO]))    -0.366878\n",
   1323       "(2015-06-08 00:00:00+00:00, Equity(33876 [CSUN]))    -0.334227\n",
   1324       "(2015-06-08 00:00:00+00:00, Equity(23879 [LF]))      -0.334210\n",
   1325       "(2015-06-08 00:00:00+00:00, Equity(3208 [GIGA]))     -0.332771\n",
   1326       "(2015-06-08 00:00:00+00:00, Equity(32188 [LUNA]))    -0.332713\n",
   1327       "(2015-06-08 00:00:00+00:00, Equity(33985 [YGE]))     -0.332336\n",
   1328       "(2015-06-08 00:00:00+00:00, Equity(1365 [CCUR]))     -0.331875\n",
   1329       "(2015-06-08 00:00:00+00:00, Equity(18313 [JST]))     -0.331511\n",
   1330       "(2015-06-08 00:00:00+00:00, Equity(21811 [SMTX]))    -0.331045\n",
   1331       "(2015-06-08 00:00:00+00:00, Equity(13751 [RNVA]))    -0.330878\n",
   1332       "(2015-06-08 00:00:00+00:00, Equity(39907 [SMT]))     -0.330686\n",
   1333       "(2015-06-08 00:00:00+00:00, Equity(11537 [PNTR]))    -0.330651\n",
   1334       "(2015-06-08 00:00:00+00:00, Equity(32404 [CNIT]))    -0.330354\n",
   1335       "(2015-06-08 00:00:00+00:00, Equity(28024 [PERI]))    -0.330033\n",
   1336       "Name: Score, dtype: float64\n",
   1337       "\n",
   1338       "SHORT BUCKET\n",
   1339       "(2015-06-08 00:00:00+00:00, Equity(27215 [JVA]))     2.026677\n",
   1340       "(2015-06-08 00:00:00+00:00, Equity(1088 [BRID]))     2.098679\n",
   1341       "(2015-06-08 00:00:00+00:00, Equity(35035 [NPD]))     2.483405\n",
   1342       "(2015-06-08 00:00:00+00:00, Equity(24466 [MGCD]))    2.250898\n",
   1343       "(2015-06-08 00:00:00+00:00, Equity(41663 [RTRX]))    2.426343\n",
   1344       "(2015-06-08 00:00:00+00:00, Equity(34577 [TTHI]))    2.564149\n",
   1345       "(2015-06-08 00:00:00+00:00, Equity(26143 [NRG]))     2.251836\n",
   1346       "(2015-06-08 00:00:00+00:00, Equity(1587 [CDZI]))     2.684770\n",
   1347       "(2015-06-08 00:00:00+00:00, Equity(24853 [FCEL]))    3.070704\n",
   1348       "(2015-06-08 00:00:00+00:00, Equity(8276 [WPP]))      0.961210\n",
   1349       "(2015-06-08 00:00:00+00:00, Equity(27834 [MGH]))     1.829167\n",
   1350       "(2015-06-08 00:00:00+00:00, Equity(26141 [MGN]))     3.619338\n",
   1351       "(2015-06-08 00:00:00+00:00, Equity(16511 [KMX]))     2.300366\n",
   1352       "(2015-06-08 00:00:00+00:00, Equity(12031 [RENX]))    3.254670\n",
   1353       "(2015-06-08 00:00:00+00:00, Equity(12099 [RELX]))    4.042818\n",
   1354       "(2015-06-08 00:00:00+00:00, Equity(1010 [BNS]))      2.467833\n",
   1355       "(2015-06-08 00:00:00+00:00, Equity(45585 [MMAC]))    2.519813\n",
   1356       "(2015-06-08 00:00:00+00:00, Equity(47352 [BHBK]))    3.432712\n",
   1357       "(2015-06-08 00:00:00+00:00, Equity(24862 [STAR]))    2.226796\n",
   1358       "(2015-06-08 00:00:00+00:00, Equity(17287 [AIII]))    2.391016\n",
   1359       "(2015-06-08 00:00:00+00:00, Equity(41730 [ZG]))      2.692603\n",
   1360       "(2015-06-08 00:00:00+00:00, Equity(41374 [WIFI]))    1.261486\n",
   1361       "(2015-06-08 00:00:00+00:00, Equity(31350 [DDAY]))    2.020467\n",
   1362       "(2015-06-08 00:00:00+00:00, Equity(23428 [CCOI]))    2.257763\n",
   1363       "(2015-06-08 00:00:00+00:00, Equity(26617 [IOC]))     2.065364\n",
   1364       "(2015-06-08 00:00:00+00:00, Equity(42244 [RRMS]))    2.251317\n",
   1365       "(2015-06-08 00:00:00+00:00, Equity(24073 [EEQ]))     2.349248\n",
   1366       "(2015-06-08 00:00:00+00:00, Equity(6421 [RENT]))     2.320707\n",
   1367       "(2015-06-08 00:00:00+00:00, Equity(28030 [DSS]))     2.550427\n",
   1368       "(2015-06-08 00:00:00+00:00, Equity(37336 [SIXD]))    2.987099\n",
   1369       "(2015-06-08 00:00:00+00:00, Equity(44747 [DATA]))    2.299100\n",
   1370       "(2015-06-08 00:00:00+00:00, Equity(24 [AAPL]))       2.393255\n",
   1371       "(2015-06-08 00:00:00+00:00, Equity(26401 [CRM]))     2.425059\n",
   1372       "Name: Score, dtype: float64\n"
   1373      ]
   1374     }
   1375    ],
   1376    "source": [
   1377     "SECTOR_NAMES = {\n",
   1378     " 101: 'Basic Materials',\n",
   1379     " 102: 'Consumer Cyclical',\n",
   1380     " 103: 'Financial Services',\n",
   1381     " 104: 'Real Estate',\n",
   1382     " 205: 'Consumer Defensive',\n",
   1383     " 206: 'Healthcare',\n",
   1384     " 207: 'Utilities',\n",
   1385     " 308: 'Communication Services',\n",
   1386     " 309: 'Energy',\n",
   1387     " 310: 'Industrials',\n",
   1388     " 311: 'Technology' ,\n",
   1389     "}\n",
   1390     "\n",
   1391     "# create and populate the buckets\n",
   1392     "long_bucket = pd.Series()\n",
   1393     "short_bucket = pd.Series()\n",
   1394     "for key in SECTOR_NAMES:\n",
   1395     "    long_bucket = long_bucket.append(scores_sectors[scores_sectors['Sector'] == key]['Score'].head(13))\n",
   1396     "    short_bucket = short_bucket.append(scores_sectors[scores_sectors['Sector'] == key]['Score'].tail(3))        \n",
   1397     "\n",
   1398     "print 'LONG BUCKET\\n' + str(long_bucket) + '\\n'\n",
   1399     "print 'SHORT BUCKET\\n' + str(short_bucket)"
   1400    ]
   1401   },
   1402   {
   1403    "cell_type": "markdown",
   1404    "metadata": {},
   1405    "source": [
   1406     "Although this is a valid way to create an industry-relative strategy, I would argue that this solution is inelegant. The real issue with this strategy is its skewness. Standardization is more effective the closer the underlying distribution is to being Normal. Here, it is not very effective at all. However, the data *could* be manipulated to be more Normal through transformations such as reciprocals, logs, roots etc. I will leave it to the reader to experiment with these transformations and thereby create a more robust metric.\n",
   1407     "\n",
   1408     "It is important to realize when a strategy just will not work. Even if the basic idea is sound and the process used to rank the universe and trade the strategy is solid, some algorithms just do not work in practice. You should only be trading strategies that you are confident in, and I would encourage thorough examination of any algorithm from all angles before letting it loose on the market. "
   1409    ]
   1410   },
   1411   {
   1412    "cell_type": "markdown",
   1413    "metadata": {
   1414     "collapsed": true
   1415    },
   1416    "source": [
   1417     "Please see the full algorithm for backtested returns!"
   1418    ]
   1419   },
   1420   {
   1421    "cell_type": "markdown",
   1422    "metadata": {},
   1423    "source": [
   1424     "*The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory or other services by Quantopian.*\n",
   1425     "\n",
   1426     "*In addition, the content of the website neither constitutes investment advice nor offers any opinion with respect to the suitability of any security or any specific investment. Quantopian makes no guarantees as to accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.*"
   1427    ]
   1428   }
   1429  ],
   1430  "metadata": {
   1431   "kernelspec": {
   1432    "display_name": "Python 2",
   1433    "language": "python",
   1434    "name": "python2"
   1435   },
   1436   "language_info": {
   1437    "codemirror_mode": {
   1438     "name": "ipython",
   1439     "version": 2
   1440    },
   1441    "file_extension": ".py",
   1442    "mimetype": "text/x-python",
   1443    "name": "python",
   1444    "nbconvert_exporter": "python",
   1445    "pygments_lexer": "ipython2",
   1446    "version": "2.7.11"
   1447   }
   1448  },
   1449  "nbformat": 4,
   1450  "nbformat_minor": 0
   1451 }