Notebook
In [55]:
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.sentdex import sentiment
from quantopian.pipeline.factors import SimpleMovingAverage
from quantopian.pipeline.factors import RSI
from quantopian.pipeline.data import factset
from quantopian.pipeline.classifiers.fundamentals import Sector
from alphalens.utils import get_clean_factor_and_forward_returns
from alphalens.tears import create_full_tear_sheet, create_returns_tear_sheet
from alphalens.performance import mean_information_coefficient
from __future__ import division
import numpy as np
import pandas as pd
import functools
In [58]:
def make_pipeline(): 
    base_universe = QTradableStocksUS()
    
    '''
    Fundamental Factors
    '''
    roce = (
        Fundamentals.ebit.latest / (
            Fundamentals.total_assets.latest 
                - Fundamentals.current_liabilities.latest
            )
    )
    free_cash_flow = Fundamentals.free_cash_flow.latest
    shares_outstanding = Fundamentals.shares_outstanding.latest
    pe_ratio = Fundamentals.pe_ratio.latest
    shareholder_yield = Fundamentals.total_yield.latest
    revenue_growth = Fundamentals.revenue_growth.latest
    pfcf = Fundamentals.fcf_ratio.latest
    lt_debt_equity = Fundamentals.long_term_debt_equity_ratio.latest
    d_eps_growth = Fundamentals.diluted_eps_growth.latest
    
    '''
    Sentiment Factors
    '''
    sentiment_signal = sentiment.sentiment_signal.latest
    mean_sentiment_21day = SimpleMovingAverage(inputs=[sentiment.sentiment_signal], window_length=21)
    
    '''
    Technical Factors
    '''
    rsi = RSI()
    
    '''
    Filters
    '''
    good_pe = (pe_ratio < 15) & (pe_ratio > 5)
    low_share_count = shares_outstanding < 50000000
    good_pfcf = (pfcf < 15) & (pfcf > 5)
    high_yield = shareholder_yield > 0.1
    high_roce = roce > 0.1
    low_de = lt_debt_equity < 0.2 # huge filter
    high_revenue_growth = revenue_growth > 0.1 # huge filter
    rsi_buy = rsi < 30
    good_d_eps_growth = d_eps_growth > 0.2
    good_sent = mean_sentiment_21day > 0
    
    value1 = (
        high_yield 
        & good_pe 
        & low_share_count
        & good_pfcf
    )
    canslim = (
        rsi_buy
        & good_d_eps_growth
        & low_share_count  
        & good_sent
    )
    '''
    Sectors
    '''
    sector = Sector()
    
    '''Pipeline Columns'''
    value1_columns = {
        'shares_outstanding': shares_outstanding,
        'shareholder_yield': shareholder_yield,
        'pe': pe_ratio,
        'pfcf': pfcf,
        'sector': sector,
    }
    
    canslim_columns = {
        'rsi': rsi,
        'd_eps_growth': d_eps_growth,
        'shares_outstanding': shares_outstanding,
        'mean_sentiment_21day': mean_sentiment_21day,
        'sector': sector,
    }
    
    return Pipeline(
        columns = canslim_columns,
        screen=base_universe & canslim
    )
In [59]:
pipeline_output = run_pipeline(make_pipeline(), '2019-01-01', '2019-10-10')
print(pipeline_output.shape)
pipeline_rows = pipeline_output.shape[0]

Pipeline Execution Time: 1 Minute, 8.07 Seconds
(37, 5)
In [60]:
pipeline_output.head(pipeline_rows)
Out[60]:
d_eps_growth mean_sentiment_21day rsi sector shares_outstanding
2019-01-02 00:00:00+00:00 Equity(693 [AZO]) 0.347000 6.000000 28.800705 102 25205125.0
2019-01-04 00:00:00+00:00 Equity(693 [AZO]) 0.347000 6.000000 28.500147 102 25205125.0
2019-01-07 00:00:00+00:00 Equity(693 [AZO]) 0.347000 6.000000 27.593066 102 25205125.0
2019-01-08 00:00:00+00:00 Equity(693 [AZO]) 0.347000 6.000000 27.170973 102 25205125.0
2019-01-09 00:00:00+00:00 Equity(693 [AZO]) 0.347000 6.000000 28.511305 102 25205125.0
2019-02-04 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 1.761905 16.946474 102 30844541.0
2019-02-05 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 1.619048 18.237746 102 30844541.0
2019-02-06 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 1.476190 11.684611 102 30844541.0
2019-02-07 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 1.238095 9.542457 102 30844541.0
2019-02-08 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 1.095238 7.429963 102 30844541.0
2019-02-11 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.952381 7.878788 102 30844541.0
2019-02-12 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.809524 12.247697 102 30844541.0
2019-02-13 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.666667 14.308943 102 30844541.0
2019-02-14 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.523810 13.482454 102 30844541.0
2019-02-15 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.380952 10.221465 102 30844541.0
2019-02-19 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.238095 10.829103 102 30844541.0
2019-02-20 00:00:00+00:00 Equity(27674 [CMPR]) 1.333333 0.095238 13.944994 102 30844541.0
2019-03-15 00:00:00+00:00 Equity(8168 [WGO]) 0.228070 5.000000 25.365854 102 32025628.0
2019-03-18 00:00:00+00:00 Equity(8168 [WGO]) 0.228070 5.000000 27.602524 102 32025628.0
2019-03-21 00:00:00+00:00 Equity(8168 [WGO]) 0.228070 5.000000 29.288026 102 32025628.0
2019-03-25 00:00:00+00:00 Equity(8168 [WGO]) 0.228070 5.000000 28.197674 102 32025628.0
2019-03-26 00:00:00+00:00 Equity(8168 [WGO]) 0.228070 5.000000 29.709035 102 32025628.0
2019-04-18 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 3.857143 25.797239 206 39767431.0
2019-04-22 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 3.857143 21.126083 206 39767431.0
2019-04-23 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 3.809524 24.678309 206 39767431.0
2019-05-17 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 2.142857 27.745665 206 39817679.0
2019-05-20 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 2.095238 24.112150 206 39817679.0
2019-05-21 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.904762 24.172392 206 39817679.0
2019-05-22 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.857143 24.783147 206 39817679.0
2019-05-23 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.809524 26.468807 206 39817679.0
2019-05-24 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.761905 13.168972 206 39817679.0
2019-05-28 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.714286 12.590799 206 39817679.0
Equity(28016 [CMG]) 0.469484 4.142857 28.133592 102 27713556.0
2019-05-29 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.666667 17.156863 206 39817679.0
2019-05-30 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.619048 16.666667 206 39817679.0
2019-05-31 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.523810 29.629630 206 39817679.0
2019-06-03 00:00:00+00:00 Equity(6297 [QDEL]) 1.888889 1.476190 28.262677 206 39817679.0
In [61]:
unique_assets = pipeline_output.index.levels[1].unique()
count = unique_assets.shape[0]
print(unique_assets.shape)
(10041,)
In [62]:
pipeline_output.index.levels[1]
Out[62]:
Index([      Equity(2 [ARNC]),      Equity(21 [AAME]),      Equity(24 [AAPL]),
         Equity(25 [ARNC_PR]),      Equity(31 [ABAX]),      Equity(41 [ARCB]),
             Equity(52 [ABM]),      Equity(53 [ABMD]),       Equity(62 [ABT]),
            Equity(64 [GOLD]),
       ...
       Equity(53565 [AGNC_O]), Equity(53566 [THBR_W]),   Equity(53567 [THBR]),
         Equity(53568 [XOUT]),   Equity(53569 [MNPR]), Equity(53570 [RILY_P]),
         Equity(53571 [SBUG]),   Equity(53572 [GBUG]),   Equity(53573 [DRTT]),
         Equity(53574 [VALT])],
      dtype='object', length=10041)
In [ ]: