import numpy as np
import pandas as pd
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import CustomFactor, Returns
from quantopian.pipeline.classifiers.fundamentals import Sector
from quantopian.pipeline.filters import QTradableStocksUS
import alphalens as al
universe = QTradableStocksUS()
pipe = Pipeline(
columns = {
'universe' : universe,
},
screen=universe
)
stock_universe = run_pipeline(pipe, '2015-01-01', '2017-12-28')
factor = []
forward_returns = []
year = None
month = None
# loop through each day
for timestamp, daily_factor in stock_universe.groupby(level=0):
# just to update user on processing progress
if (year != timestamp.year) or (month != timestamp.month):
print "Processing", timestamp.year, timestamp.month
year = timestamp.year
month = timestamp.month
# equities in the universe at that particular day
equities = daily_factor.index.levels[1]
# we use get_pricing() with minute resolution to fetch the minute prices at that particular day
__prices = get_pricing(equities, timestamp, timestamp, frequency='minute', fields='price', start_offset=1)
if len(__prices) < 242:
continue
# compute factor
__factor = __prices.iloc[:2].pct_change().iloc[1:] # yesterday close to today open gap
__factor = -__factor # mean reverting
factor.append(__factor)
# use Alphalens to compute forward returns for 30m, 60m, 90m, 120m, 180m, 240m
__forward_returns = al.utils.compute_forward_returns(__factor.stack(),
__prices,
periods=(30, 60, 90, 120, 180, 240))
forward_returns.append(__forward_returns)
forward_returns = pd.concat(forward_returns)
factor = pd.concat(factor).stack()
factor_data = al.utils.get_clean_factor(factor=factor,
forward_returns=forward_returns,
quantiles=7)
al.tears.create_returns_tear_sheet(factor_data)
al.tears.create_information_tear_sheet(factor_data)
# This doesn't make sense in this analysis
#al.tears.create_turnover_tear_sheet(factor_data)