from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.factset import Fundamentals, EquityMetadata
from quantopian.pipeline.data import EquityPricing
from quantopian.pipeline.factors import RSI,BollingerBands,SimpleMovingAverage,EWMA,EWMSTD
from quantopian.pipeline.domain import US_EQUITIES
is_share = EquityMetadata.security_type.latest.eq('SHARE')
is_primary = EquityMetadata.is_primary.latest
primary_shares = (is_share & is_primary)
market_cap = Fundamentals.mkt_val.latest
universe = market_cap.top(1000, mask=primary_shares)
# 1-month (21 trading day) EWMA factor.
fast_ewma = EWMA.from_span(
inputs=[EquityPricing.close],
window_length=21,
span=15)
# 6-month (126 trading day) EWMA factor.
slow_ewma = EWMA.from_span(
inputs=[EquityPricing.close],
window_length=126,
span=15)
# Divide fast_ma by slow_ma to get momentum factor and z-score.
momentum = fast_ewma / slow_ewma
momentum_factor = momentum.zscore()
#Now that we defined a universe and a factor, we can choose a market and time period and simulate the factor.
#The code below creates a Pipeline instance that adds our factor as a column and screens down to equities in our universe. The Pipeline is then run over the US equities market from 2016 to 2019.
# Create a US equities pipeline with our momentum factor, screening down to our universe.
pipe = Pipeline(
columns={
'momentum_factor': momentum_factor,
},
screen=universe,
domain=US_EQUITIES,
)
# Run the pipeline from 2016 to 2019 and display the first few rows of output.
from quantopian.research import run_pipeline
factor_data = run_pipeline(pipe, '2016-01-01', '2019-07-15')
print("Result contains {} rows of output.".format(len(factor_data)))
factor_data.head()
#Step 3 - Test the factor.
from quantopian.pipeline.factors import Returns
# Create and run a Pipeline to get day-over-day returns.
returns_pipe = Pipeline(
columns={
'1D': Returns(window_length=2),
},
domain=US_EQUITIES,
)
returns_data = run_pipeline(returns_pipe, '2016-01-01', '2019-07-15')
# Import alphalens and pandas.
import alphalens as al
import pandas as pd
# Shift the returns so that we can compare our factor data to forward returns.
shifted_returns = al.utils.backshift_returns_series(returns_data['1D'], 2)
# Merge the factor and returns data.
al_returns = pd.DataFrame(
data=shifted_returns,
index=factor_data.index,
columns=['1D'],
)
al_returns.index.levels[0].name = "date"
al_returns.index.levels[1].name = "asset"
factor_data['momentum_factor'] = - factor_data['momentum_factor']
# Format the factor and returns data so that we can run it through Alphalens.
al_data = al.utils.get_clean_factor(
factor_data['momentum_factor'],
al_returns,
quantiles=5,
bins=None,
)
from alphalens.tears import create_full_tear_sheet
create_full_tear_sheet(al_data)