Notebook

Pipeline Example Using Market Cap and Sentiment

In [1]:
# Imports needed to create and run pipeline
from quantopian.pipeline import Pipeline  
from quantopian.research import run_pipeline  

# Import any PIPELINE data we want to use
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.sentdex import sentiment_free as sentiment

# Import any INTERACTIVE data we want to use
from quantopian.interactive.data.sentdex import sentiment_free as sentiment_interactive

# Import any built in factors we want to use
from quantopian.pipeline.factors.fundamentals import MarketCap

# Import any built in filters we want to use
from quantopian.pipeline.filters.morningstar import Q1500US
# maybe should be
# from quantopian.pipeline.filters import Q1500US
In [2]:
# Lets first check the data type of our pipline datasets
type(sentiment.sentiment_signal)
Out[2]:
<class 'zipline.pipeline.data.dataset.BoundColumn'>
In [3]:
# Now lets check the data type of our interactive data
type(sentiment_interactive.sentiment_signal)
Out[3]:
<class 'blaze.expr.expressions.Field'>
In [4]:
# Make a function with our pipline datasets to return our pipeline

def make_pipeline():  
    # Create the factors we want use
    sentiment_factor = sentiment.sentiment_signal.latest  
    market_cap =  Fundamentals.market_cap.latest 

    # Create a filter to select our 'universe'
    # Our universe is made up of stocks that have a non-null sentiment signal that was updated in  
    # the last day, are not within 2 days of an earnings announcement, are not announced acquisition  
    # targets, and are in the Q1500US.

    universe = (Q1500US()  
                & sentiment_factor.notnull()  
                & (market_cap > 50000000) ) 

    # Create our pipeline columns and filter to just our universe
    # Note that the 'longs' and 'shorts' columns are boolean filters creted from factors
    pipe = Pipeline(  
        columns={  
            'sentiment': sentiment_factor,  
            'longs': (sentiment_factor >= 4),  
            'shorts': (sentiment_factor <= 2),  
        },  
        screen=universe  
    )  
    return pipe  
In [5]:
# Now lets see our pipeline in action
# Run our pipeline and print the results
results = run_pipeline(make_pipeline(), '2017-1-7', '2017-1-7')
results
Out[5]:
longs sentiment shorts
2017-01-09 00:00:00+00:00 Equity(2 [ARNC]) False -1.0 True
Equity(24 [AAPL]) True 5.0 False
Equity(62 [ABT]) True 6.0 False
Equity(67 [ADSK]) False 3.0 False
Equity(76 [TAP]) False -1.0 True
Equity(114 [ADBE]) False -1.0 True
Equity(122 [ADI]) False -1.0 True
Equity(128 [ADM]) False 1.0 True
Equity(161 [AEP]) False 3.0 False
Equity(166 [AES]) False 3.0 False
Equity(168 [AET]) False -1.0 True
Equity(185 [AFL]) False 1.0 True
Equity(216 [HES]) False -1.0 True
Equity(239 [AIG]) False -1.0 True
Equity(337 [AMAT]) False -1.0 True
Equity(351 [AMD]) True 5.0 False
Equity(357 [TWX]) False 2.0 True
Equity(368 [AMGN]) False -3.0 True
Equity(410 [AN]) True 6.0 False
Equity(438 [AON]) False -1.0 True
Equity(448 [APA]) True 6.0 False
Equity(455 [APC]) True 4.0 False
Equity(460 [APD]) False 3.0 False
Equity(465 [APH]) True 5.0 False
Equity(630 [ADP]) False -1.0 True
Equity(660 [AVP]) True 4.0 False
Equity(663 [AVY]) False -3.0 True
Equity(679 [AXP]) True 6.0 False
Equity(693 [AZO]) False 1.0 True
Equity(698 [BA]) False 1.0 True
... ... ... ...
Equity(36118 [DPS]) False -1.0 True
Equity(36372 [SNI]) False -1.0 True
Equity(36930 [DISC_A]) True 5.0 False
Equity(38084 [MJN]) False -1.0 True
Equity(38936 [DG]) False -3.0 True
Equity(39546 [LYB]) False -1.0 True
Equity(39626 [EXPR]) False -1.0 True
Equity(39778 [QEP]) True 5.0 False
Equity(39840 [TSLA]) False -3.0 True
Equity(40430 [GM]) False 2.0 True
Equity(40852 [KMI]) True 6.0 False
Equity(41462 [MOS]) False -1.0 True
Equity(41579 [P]) False 2.0 True
Equity(41636 [MPC]) True 4.0 False
Equity(42023 [XYL]) False -1.0 True
Equity(42118 [GRPN]) False -1.0 True
Equity(42173 [APTV]) True 6.0 False
Equity(42230 [TRIP]) False -3.0 True
Equity(42251 [WPX]) True 5.0 False
Equity(42270 [KORS]) False -1.0 True
Equity(42277 [ZNGA]) False -1.0 True
Equity(42788 [PSX]) False -1.0 True
Equity(42950 [FB]) True 6.0 False
Equity(43694 [ABBV]) False -1.0 True
Equity(44931 [NWSA]) True 4.0 False
Equity(45815 [TWTR]) True 4.0 False
Equity(48892 [IGT]) True 6.0 False
Equity(49203 [GCI]) False -1.0 True
Equity(50070 [HTZ]) True 6.0 False
Equity(50428 [AA]) False 3.0 False

484 rows × 3 columns

In [6]:
# Now lets see what our interactive data is
sentiment_interactive
Out[6]:
symbol sentiment_signal sid asof_date timestamp
0 AAPL 6.0 24 2012-10-15 2012-10-16
1 AAPL 2.0 24 2012-10-16 2012-10-17
2 AAPL 6.0 24 2012-10-17 2012-10-18
3 AAPL 6.0 24 2012-10-18 2012-10-19
4 AAPL 6.0 24 2012-10-19 2012-10-20
5 AAPL 6.0 24 2012-10-20 2012-10-21
6 AAPL 1.0 24 2012-10-21 2012-10-22
7 AAPL -1.0 24 2012-10-22 2012-10-23
8 MSFT 6.0 5061 2012-10-22 2012-10-23
9 AAPL -3.0 24 2012-10-23 2012-10-24
10 MSFT 6.0 5061 2012-10-23 2012-10-24
In [7]:
# The above dataframe can be manipulated interactively (hence the name)
# For instance find securities with a sentiment signal > 5
sentiment_interactive[sentiment_interactive.sentiment_signal > 5]
Out[7]:
symbol sentiment_signal sid asof_date timestamp
0 AAPL 6.0 24 2012-10-15 2012-10-16
1 AAPL 6.0 24 2012-10-17 2012-10-18
2 AAPL 6.0 24 2012-10-18 2012-10-19
3 AAPL 6.0 24 2012-10-19 2012-10-20
4 AAPL 6.0 24 2012-10-20 2012-10-21
5 MSFT 6.0 5061 2012-10-22 2012-10-23
6 MSFT 6.0 5061 2012-10-23 2012-10-24
7 MSFT 6.0 5061 2012-10-25 2012-10-26
8 MSFT 6.0 5061 2012-10-26 2012-10-27
9 MSFT 6.0 5061 2012-10-27 2012-10-28
10 MSFT 6.0 5061 2012-10-29 2012-10-30