Import all of the needed classes into code
from quantopian.research import run_pipeline, returns
from quantopian.research.experimental import get_factor_loadings, get_factor_returns
from quantopian.pipeline import Pipeline
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.factors import ExponentialWeightedMovingAverage
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.classifiers.fundamentals import Sector
import alphalens as al
import numpy as np
import matplotlib as plt
import pyfolio as pf
import math
Set the stock universe we are wishing to work with
universe = QTradableStocksUS()
Create Factor
factor1 = ExponentialWeightedMovingAverage(inputs=[USEquityPricing.close], window_length=5, decay_rate=0.5)
Create the pipeline of dynamic stocks
pipe = Pipeline(
columns = {
'factor': factor1,
'sector': Sector(mask=universe),
},
screen = universe
)
Run the pipeline to get results
factors = run_pipeline(pipe, '2005-01-01', '2010-12-31')
Drop all factors that doesn't return a value
factors = factors.dropna()
Get the assets returned
assets = factors.index.levels[1]
my_returns = returns(assets, '2005-01-01', '2010-12-31')
Get prices for stocks
prices = get_pricing(assets, start_date='2004-12-01', end_date='2010-01-31', fields='close_price')
Set Sectors, Get Returns, and handle potential bad data
sector_labels = dict(Sector.SECTOR_NAMES)
sector_labels[-1] = "Unknown"
Create Alphalens Analysis
factor_data = al.utils.get_clean_factor_and_forward_returns(
factor=factors["factor"],
prices=prices,
groupby=factors["sector"],
quantiles=5,
periods = (1, 5, 10)
)
Create Pyfolio Analysis
factor_returns, factor_positions, factor_benchmark = al.performance.create_pyfolio_input(
factor_data,
period = '1D',
capital = 100000000,
long_short = True,
group_neutral = False,
equal_weight = True,
quantiles = [1, 5],
groups = None,
benchmark_period = '1D'
)
Plot the returns
factor_data.plot()
Check correalation
np.corrcoef(factor_returns)
Check risk factor of Quantopian risk model to our factor in pyfolio
start_date = factor_data.index.levels[0].min()
end_date = factor_data.index.levels[0].max()
factor_loadings = get_factor_loadings(assets, start_date, end_date)
factor_returns = get_factor_returns(start_date, end_date)
pf.tears.create_perf_attrib_tear_sheet(
returns = assets,
positions = factor_positions,
factor_returns = factor_returns,
factor_loadings = factor_loadings,
pos_in_dollars = False,
)