220520/19:53
Using a composite factor we can evaluate the quality of a company.
# Research-specific imports
from quantopian.research import run_pipeline
from alphalens.utils import get_clean_factor_and_forward_returns
from alphalens.tears import create_summary_tear_sheet, create_full_tear_sheet
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import CustomFactor
from quantopian.pipeline.data.builtin import EquityPricing
from quantopian.pipeline.data import Fundamentals
from quantopian.pipeline.data import factset
from quantopian.pipeline.filters import QTradableStocksUS
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
# Pipeline parameters
USE_SECTORS = True
PIPE_NORMALIZE = True
TRAIN_START="2010-01-01"
TEST_START="2015-01-01"
VAL_START="2018-01-01"
# Utility functions
def price_data(pipeline_output, start=TRAIN_START, end=TEST_START):
tickerlist = pipeline_output.index.levels[1].unique()
# Subtract/add one month from bounds
start_minus_one = datetime.strftime(datetime.strptime(start, "%Y-%m-%d") - timedelta(30), "%Y-%m-%d")
end_plus_one = datetime.strftime(datetime.strptime(end, "%Y-%m-%d") + timedelta(30), "%Y-%m-%d")
return get_pricing(symbols=tickerlist, start_date=start_minus_one, end_date=end_plus_one, fields="open_price"
)
def make_pipeline():
# Measures a company's asset growth rate.
sector = factset.RBICSFocus.l1_name.latest
mask = (sector != "Finance")
roic = Fundamentals.roic.latest
ltd_to_eq = Fundamentals.long_term_debt_equity_ratio.latest
fcf_yield = Fundamentals.fcf_yield.latest
factor = roic.rank(mask=mask) + \
ltd_to_eq.rank(ascending=False, mask=mask) + \
fcf_yield.rank(mask=mask)
return Pipeline(
columns={'signal': factor.rank(),
'sector':sector},screen=(QTradableStocksUS()) & mask)
pipeline_out = run_pipeline(pipeline=make_pipeline(), start_date=TRAIN_START, end_date=TEST_START)
factor_data = pipeline_out["signal"]
sector = pipeline_out["sector"]
factor_data.head()
prices = price_data(factor_data)
merged_data = get_clean_factor_and_forward_returns(
factor=factor_data,
prices=prices,
groupby=sector,
periods=(5, 10, 20)
)
merged_data.head()
create_summary_tear_sheet(merged_data)
create_full_tear_sheet(merged_data, by_group=True)