import numpy as np
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import CustomFactor
from quantopian.pipeline.classifiers.fundamentals import Sector
from quantopian.pipeline.filters import QTradableStocksUS
from time import time
from sklearn import preprocessing
from scipy.stats.mstats import winsorize
from quantopian.pipeline.data import factset
import alphalens as al
WIN_LIMIT = 0.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' ,
}
def make_factors():
class Altman_Z(CustomFactor):
inputs=[factset.Fundamentals.zscore_qf]
window_length = 1
def compute(self, today, assets, out, zscore_qf):
out[:] = preprocess(-zscore_qf[-1])
return {
'Altman_Z': Altman_Z,
}
def preprocess(a):
a = np.nan_to_num(a - np.nanmean(a))
a = winsorize(a, limits=[WIN_LIMIT,WIN_LIMIT])
return preprocessing.scale(a)
universe = QTradableStocksUS()
factors = make_factors()
combined_alpha = None
for name, f in factors.iteritems():
if combined_alpha == None:
combined_alpha = f(mask=universe)
else:
combined_alpha = combined_alpha+f(mask=universe)
pipe = Pipeline(
columns = {
'CombinedAlpha' : combined_alpha,
'Sector' : Sector()
},
screen=universe
)
start_timer = time()
results = run_pipeline(pipe, '2010-01-01', '2017-10-19',chunksize=252)
end_timer = time()
results.fillna(value=0);
print "Time to run pipeline %.2f secs" % (end_timer - start_timer)
my_factor = results['CombinedAlpha']
sectors = results['Sector']
asset_list = results.index.levels[1].unique()
prices = get_pricing(asset_list, start_date='2010-01-01', end_date='2017-10-19', fields='open_price')
periods = (1,3,5,10,21)
factor_data = al.utils.get_clean_factor_and_forward_returns(factor=my_factor,
prices=prices,
groupby=sectors,
groupby_labels=MORNINGSTAR_SECTOR_CODES,
periods=periods,
quantiles = 5)
mean_return_by_q_daily, std_err_by_q_daily = al.performance.mean_return_by_quantile(factor_data,
by_date=True)
mean_return_by_q, std_err_by_q = al.performance.mean_return_by_quantile(factor_data,
by_group=False)
ic = al.performance.factor_information_coefficient(factor_data)
al.tears.create_information_tear_sheet(factor_data)
al.tears.create_full_tear_sheet(factor_data, by_group=True);