import quantopian.optimize as opt
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import Latest, CustomFactor
from quantopian.pipeline.domain import US_EQUITIES
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.classifiers.fundamentals import Sector
from sklearn import preprocessing
from scipy import stats
import quantopian.pipeline.data.factset.estimates as fe
from scipy.stats.mstats import winsorize
from scipy.stats import kurtosis, skew
import alphalens as al
from scipy import stats
import numpy as np
import pandas as pd
universe = QTradableStocksUS()
fq1_eps_cons = fe.PeriodicConsensus.slice('EPS', 'qf', 1)
fq1_eps_cons_up = fq1_eps_cons.up
fq1_eps_cons_down = fq1_eps_cons.down
def make_factors():
class result(CustomFactor):
inputs = [fq1_eps_cons_up,
fq1_eps_cons_down]
window_length = 1
def compute(self, today, assets, out, up, down):
ratio_1 = up[-1] - down[-1]
out[:] = ratio_1
return {
'result': (result,1.0),
}
MORNINGSTAR_SECTOR_CODES = {
-1: 'Misc',
101: 'Basic Materials',
102: 'Consumer Cyclical',
103: 'Financial Services',
104: 'Real Estate',
205: 'Consumer Defensive',
206: 'Healthcare',
207: 'Utilities',
308: 'Communication Services',
309: 'Energy',
310: 'Industrials',
311: 'Technology' ,
}
factors = make_factors()
result = None
for name, (f,w) in factors.iteritems(): #.items() in Python 3.5
if result == None:
result = w*f(mask=universe)
else:
result += w*f(mask=universe)
pipe = Pipeline(
columns = {
'Result' : result,
'Sector' : Sector()
},
domain=US_EQUITIES,
screen= universe & ~result.isnull() & result.isfinite(),
)
results = run_pipeline(pipe, '2014-04-01', '2017-12-19')
result = results['Result']
print result.head(30)
sectors = results['Sector']
asset_list = results.index.levels[1].unique()
prices = get_pricing(asset_list, start_date='2014-04-01', end_date='2017-12-19', fields='open_price')
periods = (1, 3, 5)
factor_data = al.utils.get_clean_factor_and_forward_returns(factor=result,
prices=prices,
groupby=sectors,
groupby_labels=MORNINGSTAR_SECTOR_CODES,
periods=periods)
al.tears.create_full_tear_sheet(factor_data, by_group=True);