from quantopian.pipeline.data import factset
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline.factors import CustomFactor, SimpleMovingAverage
from quantopian.pipeline.filters import QTradableStocksUS
from alphalens.tears import create_information_tear_sheet
from alphalens.utils import get_clean_factor_and_forward_returns
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.experimental import risk_loading_pipeline
from quantopian.pipeline.data.psychsignal import stocktwits
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data.builtin import USEquityPricing
def make_pipeline():
value = Fundamentals.ebit.latest / Fundamentals.enterprise_value.latest
quality = Fundamentals.roe.latest
sentiment_score = SimpleMovingAverage(
inputs=[stocktwits.bull_minus_bear],
window_length=3,
)
universe = QTradableStocksUS()
value_winsorized = value.winsorize(min_percentile=0.05, max_percentile=0.95)
quality_winsorized = quality.winsorize(min_percentile=0.05, max_percentile=0.95)
sentiment_score_winsorized = sentiment_score.winsorize(min_percentile=0.05, max_percentile=0.95)
combined_factor = (
value_winsorized.zscore() +
quality_winsorized.zscore() +
sentiment_score_winsorized.zscore()
)
longs = combined_factor.top(100, mask=universe)
avg_volume = SimpleMovingAverage(inputs=[USEquityPricing.volume], window_length=50)
filter_volume = avg_volume > 1000000
stocks_to_trade = longs & filter_volume
return Pipeline(
columns={
'longs': longs,
'combined_factor': combined_factor
},
screen=stocks_to_trade
)
pip = make_pipeline()
factor_data = run_pipeline(pip, '2010-1-1', '2012-1-1')
factor_data.head(3)
pricing_data = get_pricing(factor_data.index.levels[1], '2010-1-1', '2012-2-1', fields='open_price')
pricing_data.head(3)
merged_data = get_clean_factor_and_forward_returns(factor=factor_data.combined_factor, prices=pricing_data)
merged_data.head(3)
type(factor_data.combined_factor)
create_information_tear_sheet(merged_data)
create_returns_tear_sheet(merged_data)