ml-finance-python
python scripts for finance machine learning
git clone https://9o.is/git/ml-finance-python.git
notebook.ipynb
(59142B)
1 {
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {
6 "collapsed": true
7 },
8 "source": [
9 "# Zack's Broker Ratings Revision History\n",
10 "\n",
11 "In this notebook, we'll take a look at Zack's *Broker Ratings Revision History* dataset, available on [Quantopian](https://www.quantopian.com/store). This dataset spans 2002 through the current day and provides Analyst Ratings History for Securities.\n",
12 "\n",
13 "Update time: Zacks updates this dataset sometime during the first week of each month. In pipeline, your data will be updated close to midnight. So on the 27th, you will have data with a maximum asof_date of the 26th.\n",
14 "\n",
15 "## Notebook Contents\n",
16 "\n",
17 "There are two ways to access the data and you'll find both of them listed below. Just click on the section you'd like to read through.\n",
18 "\n",
19 "- <a href='#interactive'><strong>Interactive overview</strong></a>: This is only available on Research and uses blaze to give you access to large amounts of data. Recommended for exploration and plotting.\n",
20 "- <a href='#pipeline'><strong>Pipeline overview</strong></a>: Data is made available through pipeline which is available on both the Research & Backtesting environment. Recommended for custom factor development and moving back & forth between research/backtesting.\n",
21 "\n",
22 "### Free samples and limits\n",
23 "One key caveat: we limit the number of results returned from any given expression to 10,000 to protect against runaway memory usage. To be clear, you have access to all the data server side. We are limiting the size of the responses back from Blaze.\n",
24 "\n",
25 "There is a *free* version of this dataset as well as a paid one. The free sample includes data until 2 months prior to the current date.\n",
26 "\n",
27 "To access the most up-to-date values for this data set for trading a live algorithm (as with other partner sets), you need to purchase acess to the full set.\n",
28 "\n",
29 "With preamble in place, let's get started:\n",
30 "\n",
31 "<a id='interactive'></a>\n",
32 "#Interactive Overview\n",
33 "### Accessing the data with Blaze and Interactive on Research\n",
34 "Partner datasets are available on Quantopian Research through an API service known as [Blaze](http://blaze.pydata.org). Blaze provides the Quantopian user with a convenient interface to access very large datasets, in an interactive, generic manner.\n",
35 "\n",
36 "Blaze provides an important function for accessing these datasets. Some of these sets are many millions of records. Bringing that data directly into Quantopian Research directly just is not viable. So Blaze allows us to provide a simple querying interface and shift the burden over to the server side.\n",
37 "\n",
38 "It is common to use Blaze to reduce your dataset in size, convert it over to Pandas and then to use Pandas for further computation, manipulation and visualization.\n",
39 "\n",
40 "Helpful links:\n",
41 "* [Query building for Blaze](http://blaze.readthedocs.io/en/latest/queries.html)\n",
42 "* [Pandas-to-Blaze dictionary](http://blaze.readthedocs.io/en/latest/rosetta-pandas.html)\n",
43 "* [SQL-to-Blaze dictionary](http://blaze.readthedocs.io/en/latest/rosetta-sql.html).\n",
44 "\n",
45 "Once you've limited the size of your Blaze object, you can convert it to a Pandas DataFrames using:\n",
46 "> `from odo import odo` \n",
47 "> `odo(expr, pandas.DataFrame)`\n",
48 "\n",
49 "\n",
50 "###To see how this data can be used in your algorithm, search for the `Pipeline Overview` section of this notebook or head straight to <a href='#pipeline'>Pipeline Overview</a>"
51 ]
52 },
53 {
54 "cell_type": "code",
55 "execution_count": 2,
56 "metadata": {
57 "collapsed": false
58 },
59 "outputs": [],
60 "source": [
61 "# import the free sample of the dataset\n",
62 "from quantopian.interactive.data.zacks import broker_ratings as dataset\n",
63 "\n",
64 "# import data operations\n",
65 "from odo import odo\n",
66 "# import other libraries we will use\n",
67 "import pandas as pd\n",
68 "import matplotlib.pyplot as plt"
69 ]
70 },
71 {
72 "cell_type": "code",
73 "execution_count": 16,
74 "metadata": {
75 "collapsed": false
76 },
77 "outputs": [
78 {
79 "data": {
80 "text/html": [
81 "Timestamp('2002-01-02 00:00:00')"
82 ],
83 "text/plain": [
84 "Timestamp('2002-01-02 00:00:00')"
85 ]
86 },
87 "execution_count": 16,
88 "metadata": {},
89 "output_type": "execute_result"
90 }
91 ],
92 "source": [
93 "# Let's use blaze to understand the data a bit using Blaze dshape()\n",
94 "dataset.timestamp.min()"
95 ]
96 },
97 {
98 "cell_type": "code",
99 "execution_count": 4,
100 "metadata": {
101 "collapsed": false
102 },
103 "outputs": [
104 {
105 "data": {
106 "text/html": [
107 "464669"
108 ],
109 "text/plain": [
110 "464669"
111 ]
112 },
113 "execution_count": 4,
114 "metadata": {},
115 "output_type": "execute_result"
116 }
117 ],
118 "source": [
119 "# And how many rows are there?\n",
120 "# N.B. we're using a Blaze function to do this, not len()\n",
121 "dataset.count()"
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 6,
127 "metadata": {
128 "collapsed": false
129 },
130 "outputs": [
131 {
132 "data": {
133 "text/html": [
134 "<table border=\"1\" class=\"dataframe\">\n",
135 " <thead>\n",
136 " <tr style=\"text-align: right;\">\n",
137 " <th></th>\n",
138 " <th>file_prod_date</th>\n",
139 " <th>m_ticker</th>\n",
140 " <th>symbol</th>\n",
141 " <th>comp_name</th>\n",
142 " <th>comp_name_2</th>\n",
143 " <th>exchange</th>\n",
144 " <th>currency_code</th>\n",
145 " <th>rating_cnt_strong_buys</th>\n",
146 " <th>rating_cnt_mod_buys</th>\n",
147 " <th>rating_cnt_holds</th>\n",
148 " <th>rating_cnt_mod_sells</th>\n",
149 " <th>rating_cnt_strong_sells</th>\n",
150 " <th>rating_mean_recom</th>\n",
151 " <th>rating_cnt_with</th>\n",
152 " <th>rating_cnt_without</th>\n",
153 " <th>sid</th>\n",
154 " <th>asof_date</th>\n",
155 " <th>timestamp</th>\n",
156 " </tr>\n",
157 " </thead>\n",
158 " <tbody>\n",
159 " <tr>\n",
160 " <th>0</th>\n",
161 " <td>2016-10-04</td>\n",
162 " <td>AA</td>\n",
163 " <td>AA</td>\n",
164 " <td>ALCOA INC</td>\n",
165 " <td>Alcoa Inc.</td>\n",
166 " <td>NYSE</td>\n",
167 " <td>USD</td>\n",
168 " <td>6.0</td>\n",
169 " <td>3.0</td>\n",
170 " <td>3.0</td>\n",
171 " <td>0.0</td>\n",
172 " <td>1.0</td>\n",
173 " <td>2.2</td>\n",
174 " <td>16.0</td>\n",
175 " <td>3.0</td>\n",
176 " <td>2</td>\n",
177 " <td>2002-01-01</td>\n",
178 " <td>2002-01-02</td>\n",
179 " </tr>\n",
180 " <tr>\n",
181 " <th>1</th>\n",
182 " <td>2016-10-04</td>\n",
183 " <td>AAPL</td>\n",
184 " <td>AAPL</td>\n",
185 " <td>APPLE INC</td>\n",
186 " <td>Apple Inc.</td>\n",
187 " <td>NSDQ</td>\n",
188 " <td>USD</td>\n",
189 " <td>1.0</td>\n",
190 " <td>4.0</td>\n",
191 " <td>12.0</td>\n",
192 " <td>0.0</td>\n",
193 " <td>0.0</td>\n",
194 " <td>2.6</td>\n",
195 " <td>19.0</td>\n",
196 " <td>2.0</td>\n",
197 " <td>24</td>\n",
198 " <td>2002-01-01</td>\n",
199 " <td>2002-01-02</td>\n",
200 " </tr>\n",
201 " <tr>\n",
202 " <th>2</th>\n",
203 " <td>2016-10-04</td>\n",
204 " <td>ABT</td>\n",
205 " <td>ABT</td>\n",
206 " <td>ABBOTT LABS</td>\n",
207 " <td>Abbott Laboratories</td>\n",
208 " <td>NYSE</td>\n",
209 " <td>USD</td>\n",
210 " <td>9.0</td>\n",
211 " <td>7.0</td>\n",
212 " <td>4.0</td>\n",
213 " <td>0.0</td>\n",
214 " <td>0.0</td>\n",
215 " <td>1.8</td>\n",
216 " <td>21.0</td>\n",
217 " <td>1.0</td>\n",
218 " <td>62</td>\n",
219 " <td>2002-01-01</td>\n",
220 " <td>2002-01-02</td>\n",
221 " </tr>\n",
222 " </tbody>\n",
223 "</table>"
224 ],
225 "text/plain": [
226 " file_prod_date m_ticker symbol comp_name comp_name_2 exchange \\\n",
227 "0 2016-10-04 AA AA ALCOA INC Alcoa Inc. NYSE \n",
228 "1 2016-10-04 AAPL AAPL APPLE INC Apple Inc. NSDQ \n",
229 "2 2016-10-04 ABT ABT ABBOTT LABS Abbott Laboratories NYSE \n",
230 "\n",
231 " currency_code rating_cnt_strong_buys rating_cnt_mod_buys \\\n",
232 "0 USD 6.0 3.0 \n",
233 "1 USD 1.0 4.0 \n",
234 "2 USD 9.0 7.0 \n",
235 "\n",
236 " rating_cnt_holds rating_cnt_mod_sells rating_cnt_strong_sells \\\n",
237 "0 3.0 0.0 1.0 \n",
238 "1 12.0 0.0 0.0 \n",
239 "2 4.0 0.0 0.0 \n",
240 "\n",
241 " rating_mean_recom rating_cnt_with rating_cnt_without sid asof_date \\\n",
242 "0 2.2 16.0 3.0 2 2002-01-01 \n",
243 "1 2.6 19.0 2.0 24 2002-01-01 \n",
244 "2 1.8 21.0 1.0 62 2002-01-01 \n",
245 "\n",
246 " timestamp \n",
247 "0 2002-01-02 \n",
248 "1 2002-01-02 \n",
249 "2 2002-01-02 "
250 ]
251 },
252 "execution_count": 6,
253 "metadata": {},
254 "output_type": "execute_result"
255 }
256 ],
257 "source": [
258 "# Let's see what the data looks like. We'll grab three rows\n",
259 "dataset.tail(3)"
260 ]
261 },
262 {
263 "cell_type": "markdown",
264 "metadata": {},
265 "source": [
266 "Let's go over the columns:\n",
267 "- **file_prod_date**: File production date\n",
268 "- **m_ticker**: Master ticker or trading symbol\n",
269 "- **symbol**: Ticker\n",
270 "- **comp_name**: Company name\n",
271 "- **comp_name_2**: Company name 2\n",
272 "- **exchange**: Exchange traded\n",
273 "- **currency_code**: Currency code\n",
274 "- **rating_cnt_strong_buys**: Number of analysts with a strong buy rating\n",
275 "- **rating_cnt_mod_buys**: Number of analysts with a moderate buy rating\n",
276 "- **rating_cnt_holds**: Number of analysts with a hold rating\n",
277 "- **rating_cnt_mod_sells**: Number of analysts with a moderate sell rating\n",
278 "- **rating_cnt_strong_sells**: Number of analysts with a strong sell rating\n",
279 "- **rating_mean_recom**: Average rating recommendation\n",
280 "- **rating_cnt_with**: Number of analysts with a rating\n",
281 "- **rating_cnt_without**: Number of analysts with no rating\n",
282 "- **asof_date**: Observation date\n",
283 "- **timestamp**: This is our timestamp on when we registered the data.\n",
284 "\n",
285 "\n",
286 "We've done much of the data processing for you. Fields like `timestamp` and `sid` are standardized across all our Store Datasets, so the datasets are easy to combine. We have standardized the `sid` across all our equity databases.\n",
287 "\n",
288 "We can select columns and rows with ease. Below, we'll fetch all rows for Apple (sid 24) and explore the scores a bit with a chart."
289 ]
290 },
291 {
292 "cell_type": "code",
293 "execution_count": 9,
294 "metadata": {
295 "collapsed": false
296 },
297 "outputs": [
298 {
299 "data": {
300 "text/html": [
301 "<div>\n",
302 "<table border=\"1\" class=\"dataframe\">\n",
303 " <thead>\n",
304 " <tr style=\"text-align: right;\">\n",
305 " <th></th>\n",
306 " <th>symbol</th>\n",
307 " <th>name</th>\n",
308 " <th>sid</th>\n",
309 " <th>predicted_five_day_log_return</th>\n",
310 " <th>timestamp</th>\n",
311 " </tr>\n",
312 " </thead>\n",
313 " <tbody>\n",
314 " <tr>\n",
315 " <th>2016-10-03</th>\n",
316 " <td>AAPL</td>\n",
317 " <td>APPLE INC</td>\n",
318 " <td>24</td>\n",
319 " <td>0.003</td>\n",
320 " <td>2016-10-04 00:00:00.000000</td>\n",
321 " </tr>\n",
322 " <tr>\n",
323 " <th>2016-10-04</th>\n",
324 " <td>AAPL</td>\n",
325 " <td>APPLE INC</td>\n",
326 " <td>24</td>\n",
327 " <td>0.011</td>\n",
328 " <td>2016-10-06 04:01:28.909580</td>\n",
329 " </tr>\n",
330 " <tr>\n",
331 " <th>2016-10-05</th>\n",
332 " <td>AAPL</td>\n",
333 " <td>APPLE INC</td>\n",
334 " <td>24</td>\n",
335 " <td>0.021</td>\n",
336 " <td>2016-10-06 04:01:28.909580</td>\n",
337 " </tr>\n",
338 " </tbody>\n",
339 "</table>\n",
340 "</div>"
341 ],
342 "text/plain": [
343 " symbol name sid predicted_five_day_log_return \\\n",
344 "2016-10-03 AAPL APPLE INC 24 0.003 \n",
345 "2016-10-04 AAPL APPLE INC 24 0.011 \n",
346 "2016-10-05 AAPL APPLE INC 24 0.021 \n",
347 "\n",
348 " timestamp \n",
349 "2016-10-03 2016-10-04 00:00:00.000000 \n",
350 "2016-10-04 2016-10-06 04:01:28.909580 \n",
351 "2016-10-05 2016-10-06 04:01:28.909580 "
352 ]
353 },
354 "execution_count": 9,
355 "metadata": {},
356 "output_type": "execute_result"
357 }
358 ],
359 "source": [
360 "aapl_data = dataset_100[dataset_100.symbol == 'AAPL']\n",
361 "aapl = odo(aapl_data, pd.DataFrame)\n",
362 "# suppose we want the rows to be indexed by timestamp.\n",
363 "aapl.index = list(aapl['asof_date'])\n",
364 "aapl.drop('asof_date',1,inplace=True)\n",
365 "aapl[-3:]"
366 ]
367 },
368 {
369 "cell_type": "markdown",
370 "metadata": {},
371 "source": [
372 "<a id='pipeline'></a>\n",
373 "\n",
374 "#Pipeline Overview\n",
375 "\n",
376 "### Accessing the data in your algorithms & research\n",
377 "The only method for accessing partner data within algorithms running on Quantopian is via the pipeline API. Different data sets work differently but in the case of this data, you can add this data to your pipeline as follows:"
378 ]
379 },
380 {
381 "cell_type": "code",
382 "execution_count": 12,
383 "metadata": {
384 "collapsed": true
385 },
386 "outputs": [],
387 "source": [
388 "# Import necessary Pipeline modules\n",
389 "from quantopian.pipeline import Pipeline\n",
390 "from quantopian.research import run_pipeline\n",
391 "from quantopian.pipeline.factors import AverageDollarVolume"
392 ]
393 },
394 {
395 "cell_type": "code",
396 "execution_count": 9,
397 "metadata": {
398 "collapsed": false
399 },
400 "outputs": [],
401 "source": [
402 "# For use in your algorithms\n",
403 "# Using the full/sample paid dataset in your pipeline algo\n",
404 "from quantopian.pipeline.data.zacks import broker_ratings"
405 ]
406 },
407 {
408 "cell_type": "markdown",
409 "metadata": {},
410 "source": [
411 "Now that we've imported the data, let's take a look at which fields are available for each dataset.\n",
412 "\n",
413 "You'll find the dataset, the available fields, and the datatypes for each of those fields."
414 ]
415 },
416 {
417 "cell_type": "code",
418 "execution_count": 10,
419 "metadata": {
420 "collapsed": false
421 },
422 "outputs": [
423 {
424 "name": "stdout",
425 "output_type": "stream",
426 "text": [
427 "Here are the list of available fields per dataset:\n",
428 "---------------------------------------------------\n",
429 "\n",
430 "Dataset: broker_ratings\n",
431 "\n",
432 "Fields:\n",
433 "comp_name - object\n",
434 "exchange - object\n",
435 "currency_code - object\n",
436 "symbol - object\n",
437 "m_ticker - object\n",
438 "rating_mean_recom - float64\n",
439 "rating_cnt_without - float64\n",
440 "rating_cnt_strong_buys - float64\n",
441 "asof_date - datetime64[ns]\n",
442 "rating_cnt_mod_buys - float64\n",
443 "rating_cnt_holds - float64\n",
444 "file_prod_date - datetime64[ns]\n",
445 "rating_cnt_mod_sells - float64\n",
446 "comp_name_2 - object\n",
447 "rating_cnt_strong_sells - float64\n",
448 "rating_cnt_with - float64\n",
449 "\n",
450 "\n",
451 "---------------------------------------------------\n",
452 "\n"
453 ]
454 }
455 ],
456 "source": [
457 "print \"Here are the list of available fields per dataset:\"\n",
458 "print \"---------------------------------------------------\\n\"\n",
459 "\n",
460 "def _print_fields(dataset):\n",
461 " print \"Dataset: %s\\n\" % dataset.__name__\n",
462 " print \"Fields:\"\n",
463 " for field in list(dataset.columns):\n",
464 " print \"%s - %s\" % (field.name, field.dtype)\n",
465 " print \"\\n\"\n",
466 "\n",
467 "for data in (broker_ratings,):\n",
468 " _print_fields(data)\n",
469 "\n",
470 "\n",
471 "print \"---------------------------------------------------\\n\""
472 ]
473 },
474 {
475 "cell_type": "markdown",
476 "metadata": {},
477 "source": [
478 "Now that we know what fields we have access to, let's see what this data looks like when we run it through Pipeline.\n",
479 "\n",
480 "\n",
481 "This is constructed the same way as you would in the backtester. For more information on using Pipeline in Research view this thread:\n",
482 "https://www.quantopian.com/posts/pipeline-in-research-build-test-and-visualize-your-factors-and-filters"
483 ]
484 },
485 {
486 "cell_type": "code",
487 "execution_count": 13,
488 "metadata": {
489 "collapsed": false
490 },
491 "outputs": [],
492 "source": [
493 "# Let's see what this data looks like when we run it through Pipeline\n",
494 "# This is constructed the same way as you would in the backtester. For more information\n",
495 "# on using Pipeline in Research view this thread:\n",
496 "# https://www.quantopian.com/posts/pipeline-in-research-build-test-and-visualize-your-factors-and-filters\n",
497 "\n",
498 "columns = {'Strong Sells': broker_ratings.rating_cnt_strong_sells.latest,\n",
499 " 'Strong Buys': broker_ratings.rating_cnt_strong_buys.latest}\n",
500 "pipe = Pipeline(columns=columns, screen=broker_ratings.rating_cnt_mod_sells.latest.notnan())"
501 ]
502 },
503 {
504 "cell_type": "code",
505 "execution_count": 14,
506 "metadata": {
507 "collapsed": false
508 },
509 "outputs": [
510 {
511 "data": {
512 "image/png": "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\n",
513 "text/plain": [
514 "<IPython.core.display.Image object>"
515 ]
516 },
517 "execution_count": 14,
518 "metadata": {},
519 "output_type": "execute_result"
520 }
521 ],
522 "source": [
523 "# The show_graph() method of pipeline objects produces a graph to show how it is being calculated.\n",
524 "pipe.show_graph(format='png')"
525 ]
526 },
527 {
528 "cell_type": "code",
529 "execution_count": 15,
530 "metadata": {
531 "collapsed": false,
532 "scrolled": false
533 },
534 "outputs": [
535 {
536 "data": {
537 "text/html": [
538 "<div>\n",
539 "<table border=\"1\" class=\"dataframe\">\n",
540 " <thead>\n",
541 " <tr style=\"text-align: right;\">\n",
542 " <th></th>\n",
543 " <th></th>\n",
544 " <th>Strong Buys</th>\n",
545 " <th>Strong Sells</th>\n",
546 " </tr>\n",
547 " </thead>\n",
548 " <tbody>\n",
549 " <tr>\n",
550 " <th rowspan=\"30\" valign=\"top\">2013-11-01 00:00:00+00:00</th>\n",
551 " <th>Equity(2 [AA])</th>\n",
552 " <td>2.0</td>\n",
553 " <td>4.0</td>\n",
554 " </tr>\n",
555 " <tr>\n",
556 " <th>Equity(24 [AAPL])</th>\n",
557 " <td>27.0</td>\n",
558 " <td>0.0</td>\n",
559 " </tr>\n",
560 " <tr>\n",
561 " <th>Equity(31 [ABAX])</th>\n",
562 " <td>1.0</td>\n",
563 " <td>0.0</td>\n",
564 " </tr>\n",
565 " <tr>\n",
566 " <th>Equity(39 [DDC])</th>\n",
567 " <td>2.0</td>\n",
568 " <td>0.0</td>\n",
569 " </tr>\n",
570 " <tr>\n",
571 " <th>Equity(52 [ABM])</th>\n",
572 " <td>1.0</td>\n",
573 " <td>0.0</td>\n",
574 " </tr>\n",
575 " <tr>\n",
576 " <th>Equity(53 [ABMD])</th>\n",
577 " <td>4.0</td>\n",
578 " <td>1.0</td>\n",
579 " </tr>\n",
580 " <tr>\n",
581 " <th>Equity(62 [ABT])</th>\n",
582 " <td>9.0</td>\n",
583 " <td>0.0</td>\n",
584 " </tr>\n",
585 " <tr>\n",
586 " <th>Equity(64 [ABX])</th>\n",
587 " <td>2.0</td>\n",
588 " <td>0.0</td>\n",
589 " </tr>\n",
590 " <tr>\n",
591 " <th>Equity(66 [AB])</th>\n",
592 " <td>1.0</td>\n",
593 " <td>0.0</td>\n",
594 " </tr>\n",
595 " <tr>\n",
596 " <th>Equity(67 [ADSK])</th>\n",
597 " <td>5.0</td>\n",
598 " <td>0.0</td>\n",
599 " </tr>\n",
600 " <tr>\n",
601 " <th>Equity(69 [ACAT])</th>\n",
602 " <td>2.0</td>\n",
603 " <td>0.0</td>\n",
604 " </tr>\n",
605 " <tr>\n",
606 " <th>Equity(70 [VBF])</th>\n",
607 " <td>0.0</td>\n",
608 " <td>0.0</td>\n",
609 " </tr>\n",
610 " <tr>\n",
611 " <th>Equity(76 [TAP])</th>\n",
612 " <td>4.0</td>\n",
613 " <td>0.0</td>\n",
614 " </tr>\n",
615 " <tr>\n",
616 " <th>Equity(84 [ACET])</th>\n",
617 " <td>0.0</td>\n",
618 " <td>0.0</td>\n",
619 " </tr>\n",
620 " <tr>\n",
621 " <th>Equity(86 [ACG])</th>\n",
622 " <td>0.0</td>\n",
623 " <td>0.0</td>\n",
624 " </tr>\n",
625 " <tr>\n",
626 " <th>Equity(99 [ACO])</th>\n",
627 " <td>0.0</td>\n",
628 " <td>0.0</td>\n",
629 " </tr>\n",
630 " <tr>\n",
631 " <th>Equity(100 [IEP])</th>\n",
632 " <td>1.0</td>\n",
633 " <td>0.0</td>\n",
634 " </tr>\n",
635 " <tr>\n",
636 " <th>Equity(106 [ACU])</th>\n",
637 " <td>0.0</td>\n",
638 " <td>0.0</td>\n",
639 " </tr>\n",
640 " <tr>\n",
641 " <th>Equity(110 [ACXM])</th>\n",
642 " <td>2.0</td>\n",
643 " <td>1.0</td>\n",
644 " </tr>\n",
645 " <tr>\n",
646 " <th>Equity(112 [ACY])</th>\n",
647 " <td>0.0</td>\n",
648 " <td>0.0</td>\n",
649 " </tr>\n",
650 " <tr>\n",
651 " <th>Equity(114 [ADBE])</th>\n",
652 " <td>9.0</td>\n",
653 " <td>0.0</td>\n",
654 " </tr>\n",
655 " <tr>\n",
656 " <th>Equity(117 [AEY])</th>\n",
657 " <td>0.0</td>\n",
658 " <td>0.0</td>\n",
659 " </tr>\n",
660 " <tr>\n",
661 " <th>Equity(122 [ADI])</th>\n",
662 " <td>11.0</td>\n",
663 " <td>0.0</td>\n",
664 " </tr>\n",
665 " <tr>\n",
666 " <th>Equity(128 [ADM])</th>\n",
667 " <td>3.0</td>\n",
668 " <td>0.0</td>\n",
669 " </tr>\n",
670 " <tr>\n",
671 " <th>Equity(149 [ADX])</th>\n",
672 " <td>0.0</td>\n",
673 " <td>0.0</td>\n",
674 " </tr>\n",
675 " <tr>\n",
676 " <th>Equity(153 [AE])</th>\n",
677 " <td>0.0</td>\n",
678 " <td>0.0</td>\n",
679 " </tr>\n",
680 " <tr>\n",
681 " <th>Equity(154 [AEM])</th>\n",
682 " <td>4.0</td>\n",
683 " <td>0.0</td>\n",
684 " </tr>\n",
685 " <tr>\n",
686 " <th>Equity(157 [AEG])</th>\n",
687 " <td>0.0</td>\n",
688 " <td>0.0</td>\n",
689 " </tr>\n",
690 " <tr>\n",
691 " <th>Equity(161 [AEP])</th>\n",
692 " <td>7.0</td>\n",
693 " <td>0.0</td>\n",
694 " </tr>\n",
695 " <tr>\n",
696 " <th>Equity(162 [AEPI])</th>\n",
697 " <td>0.0</td>\n",
698 " <td>0.0</td>\n",
699 " </tr>\n",
700 " <tr>\n",
701 " <th>...</th>\n",
702 " <th>...</th>\n",
703 " <td>...</td>\n",
704 " <td>...</td>\n",
705 " </tr>\n",
706 " <tr>\n",
707 " <th rowspan=\"30\" valign=\"top\">2013-11-25 00:00:00+00:00</th>\n",
708 " <th>Equity(45505 [MONT])</th>\n",
709 " <td>3.0</td>\n",
710 " <td>0.0</td>\n",
711 " </tr>\n",
712 " <tr>\n",
713 " <th>Equity(45506 [PINC])</th>\n",
714 " <td>4.0</td>\n",
715 " <td>0.0</td>\n",
716 " </tr>\n",
717 " <tr>\n",
718 " <th>Equity(45520 [VMEM])</th>\n",
719 " <td>1.0</td>\n",
720 " <td>0.0</td>\n",
721 " </tr>\n",
722 " <tr>\n",
723 " <th>Equity(45521 [RNG])</th>\n",
724 " <td>3.0</td>\n",
725 " <td>0.0</td>\n",
726 " </tr>\n",
727 " <tr>\n",
728 " <th>Equity(45522 [ENZY])</th>\n",
729 " <td>3.0</td>\n",
730 " <td>0.0</td>\n",
731 " </tr>\n",
732 " <tr>\n",
733 " <th>Equity(45526 [PEGI])</th>\n",
734 " <td>2.0</td>\n",
735 " <td>0.0</td>\n",
736 " </tr>\n",
737 " <tr>\n",
738 " <th>Equity(45538 [CNHI])</th>\n",
739 " <td>0.0</td>\n",
740 " <td>0.0</td>\n",
741 " </tr>\n",
742 " <tr>\n",
743 " <th>Equity(45557 [RMAX])</th>\n",
744 " <td>2.0</td>\n",
745 " <td>0.0</td>\n",
746 " </tr>\n",
747 " <tr>\n",
748 " <th>Equity(45558 [BURL])</th>\n",
749 " <td>5.0</td>\n",
750 " <td>0.0</td>\n",
751 " </tr>\n",
752 " <tr>\n",
753 " <th>Equity(45559 [ESRT])</th>\n",
754 " <td>1.0</td>\n",
755 " <td>0.0</td>\n",
756 " </tr>\n",
757 " <tr>\n",
758 " <th>Equity(45577 [OCIP])</th>\n",
759 " <td>2.0</td>\n",
760 " <td>0.0</td>\n",
761 " </tr>\n",
762 " <tr>\n",
763 " <th>Equity(45578 [CHMI])</th>\n",
764 " <td>3.0</td>\n",
765 " <td>0.0</td>\n",
766 " </tr>\n",
767 " <tr>\n",
768 " <th>Equity(45579 [PBPB])</th>\n",
769 " <td>1.0</td>\n",
770 " <td>0.0</td>\n",
771 " </tr>\n",
772 " <tr>\n",
773 " <th>Equity(45617 [QTS])</th>\n",
774 " <td>3.0</td>\n",
775 " <td>0.0</td>\n",
776 " </tr>\n",
777 " <tr>\n",
778 " <th>Equity(45618 [AR])</th>\n",
779 " <td>8.0</td>\n",
780 " <td>0.0</td>\n",
781 " </tr>\n",
782 " <tr>\n",
783 " <th>Equity(45619 [LDRH])</th>\n",
784 " <td>4.0</td>\n",
785 " <td>0.0</td>\n",
786 " </tr>\n",
787 " <tr>\n",
788 " <th>Equity(45640 [WNRL])</th>\n",
789 " <td>1.0</td>\n",
790 " <td>0.0</td>\n",
791 " </tr>\n",
792 " <tr>\n",
793 " <th>Equity(45641 [CXP])</th>\n",
794 " <td>1.0</td>\n",
795 " <td>0.0</td>\n",
796 " </tr>\n",
797 " <tr>\n",
798 " <th>Equity(45642 [SGM])</th>\n",
799 " <td>2.0</td>\n",
800 " <td>0.0</td>\n",
801 " </tr>\n",
802 " <tr>\n",
803 " <th>Equity(45643 [MGNX])</th>\n",
804 " <td>3.0</td>\n",
805 " <td>0.0</td>\n",
806 " </tr>\n",
807 " <tr>\n",
808 " <th>Equity(45656 [GLPI])</th>\n",
809 " <td>1.0</td>\n",
810 " <td>0.0</td>\n",
811 " </tr>\n",
812 " <tr>\n",
813 " <th>Equity(45667 [VEEV])</th>\n",
814 " <td>3.0</td>\n",
815 " <td>0.0</td>\n",
816 " </tr>\n",
817 " <tr>\n",
818 " <th>Equity(45668 [PAGP])</th>\n",
819 " <td>1.0</td>\n",
820 " <td>0.0</td>\n",
821 " </tr>\n",
822 " <tr>\n",
823 " <th>Equity(45689 [VJET])</th>\n",
824 " <td>1.0</td>\n",
825 " <td>0.0</td>\n",
826 " </tr>\n",
827 " <tr>\n",
828 " <th>Equity(45733 [AERI])</th>\n",
829 " <td>2.0</td>\n",
830 " <td>0.0</td>\n",
831 " </tr>\n",
832 " <tr>\n",
833 " <th>Equity(45734 [COMM])</th>\n",
834 " <td>1.0</td>\n",
835 " <td>0.0</td>\n",
836 " </tr>\n",
837 " <tr>\n",
838 " <th>Equity(45735 [EIGI])</th>\n",
839 " <td>2.0</td>\n",
840 " <td>0.0</td>\n",
841 " </tr>\n",
842 " <tr>\n",
843 " <th>Equity(45755 [BRX])</th>\n",
844 " <td>0.0</td>\n",
845 " <td>0.0</td>\n",
846 " </tr>\n",
847 " <tr>\n",
848 " <th>Equity(45780 [TCS])</th>\n",
849 " <td>7.0</td>\n",
850 " <td>0.0</td>\n",
851 " </tr>\n",
852 " <tr>\n",
853 " <th>Equity(45815 [TWTR])</th>\n",
854 " <td>2.0</td>\n",
855 " <td>1.0</td>\n",
856 " </tr>\n",
857 " </tbody>\n",
858 "</table>\n",
859 "<p>72163 rows × 2 columns</p>\n",
860 "</div>"
861 ],
862 "text/plain": [
863 " Strong Buys Strong Sells\n",
864 "2013-11-01 00:00:00+00:00 Equity(2 [AA]) 2.0 4.0\n",
865 " Equity(24 [AAPL]) 27.0 0.0\n",
866 " Equity(31 [ABAX]) 1.0 0.0\n",
867 " Equity(39 [DDC]) 2.0 0.0\n",
868 " Equity(52 [ABM]) 1.0 0.0\n",
869 " Equity(53 [ABMD]) 4.0 1.0\n",
870 " Equity(62 [ABT]) 9.0 0.0\n",
871 " Equity(64 [ABX]) 2.0 0.0\n",
872 " Equity(66 [AB]) 1.0 0.0\n",
873 " Equity(67 [ADSK]) 5.0 0.0\n",
874 " Equity(69 [ACAT]) 2.0 0.0\n",
875 " Equity(70 [VBF]) 0.0 0.0\n",
876 " Equity(76 [TAP]) 4.0 0.0\n",
877 " Equity(84 [ACET]) 0.0 0.0\n",
878 " Equity(86 [ACG]) 0.0 0.0\n",
879 " Equity(99 [ACO]) 0.0 0.0\n",
880 " Equity(100 [IEP]) 1.0 0.0\n",
881 " Equity(106 [ACU]) 0.0 0.0\n",
882 " Equity(110 [ACXM]) 2.0 1.0\n",
883 " Equity(112 [ACY]) 0.0 0.0\n",
884 " Equity(114 [ADBE]) 9.0 0.0\n",
885 " Equity(117 [AEY]) 0.0 0.0\n",
886 " Equity(122 [ADI]) 11.0 0.0\n",
887 " Equity(128 [ADM]) 3.0 0.0\n",
888 " Equity(149 [ADX]) 0.0 0.0\n",
889 " Equity(153 [AE]) 0.0 0.0\n",
890 " Equity(154 [AEM]) 4.0 0.0\n",
891 " Equity(157 [AEG]) 0.0 0.0\n",
892 " Equity(161 [AEP]) 7.0 0.0\n",
893 " Equity(162 [AEPI]) 0.0 0.0\n",
894 "... ... ...\n",
895 "2013-11-25 00:00:00+00:00 Equity(45505 [MONT]) 3.0 0.0\n",
896 " Equity(45506 [PINC]) 4.0 0.0\n",
897 " Equity(45520 [VMEM]) 1.0 0.0\n",
898 " Equity(45521 [RNG]) 3.0 0.0\n",
899 " Equity(45522 [ENZY]) 3.0 0.0\n",
900 " Equity(45526 [PEGI]) 2.0 0.0\n",
901 " Equity(45538 [CNHI]) 0.0 0.0\n",
902 " Equity(45557 [RMAX]) 2.0 0.0\n",
903 " Equity(45558 [BURL]) 5.0 0.0\n",
904 " Equity(45559 [ESRT]) 1.0 0.0\n",
905 " Equity(45577 [OCIP]) 2.0 0.0\n",
906 " Equity(45578 [CHMI]) 3.0 0.0\n",
907 " Equity(45579 [PBPB]) 1.0 0.0\n",
908 " Equity(45617 [QTS]) 3.0 0.0\n",
909 " Equity(45618 [AR]) 8.0 0.0\n",
910 " Equity(45619 [LDRH]) 4.0 0.0\n",
911 " Equity(45640 [WNRL]) 1.0 0.0\n",
912 " Equity(45641 [CXP]) 1.0 0.0\n",
913 " Equity(45642 [SGM]) 2.0 0.0\n",
914 " Equity(45643 [MGNX]) 3.0 0.0\n",
915 " Equity(45656 [GLPI]) 1.0 0.0\n",
916 " Equity(45667 [VEEV]) 3.0 0.0\n",
917 " Equity(45668 [PAGP]) 1.0 0.0\n",
918 " Equity(45689 [VJET]) 1.0 0.0\n",
919 " Equity(45733 [AERI]) 2.0 0.0\n",
920 " Equity(45734 [COMM]) 1.0 0.0\n",
921 " Equity(45735 [EIGI]) 2.0 0.0\n",
922 " Equity(45755 [BRX]) 0.0 0.0\n",
923 " Equity(45780 [TCS]) 7.0 0.0\n",
924 " Equity(45815 [TWTR]) 2.0 1.0\n",
925 "\n",
926 "[72163 rows x 2 columns]"
927 ]
928 },
929 "execution_count": 15,
930 "metadata": {},
931 "output_type": "execute_result"
932 }
933 ],
934 "source": [
935 "# run_pipeline will show the output of your pipeline\n",
936 "pipe_output = run_pipeline(pipe, start_date='2013-11-01', end_date='2013-11-25')\n",
937 "pipe_output"
938 ]
939 },
940 {
941 "cell_type": "markdown",
942 "metadata": {},
943 "source": [
944 "Now you can take that and begin to use it as a building block for your algorithms, for more examples on how to do that you can visit our <a href='https://www.quantopian.com/posts/pipeline-factor-library-for-data'>data pipeline factor library</a>"
945 ]
946 }
947 ],
948 "metadata": {
949 "kernelspec": {
950 "display_name": "Python 2",
951 "language": "python",
952 "name": "python2"
953 },
954 "language_info": {
955 "codemirror_mode": {
956 "name": "ipython",
957 "version": 2
958 },
959 "file_extension": ".py",
960 "mimetype": "text/x-python",
961 "name": "python",
962 "nbconvert_exporter": "python",
963 "pygments_lexer": "ipython2",
964 "version": "2.7.12"
965 }
966 },
967 "nbformat": 4,
968 "nbformat_minor": 0
969 }