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
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
)
pipeline_output = run_pipeline(make_pipeline(), '2019-01-01', '2019-10-10')
print(pipeline_output.shape)
pipeline_rows = pipeline_output.shape[0]
pipeline_output.head(pipeline_rows)
unique_assets = pipeline_output.index.levels[1].unique()
count = unique_assets.shape[0]
print(unique_assets.shape)
pipeline_output.index.levels[1]