Estimated Earnings Per Share / Price Note: a) The “Next” Year’s EPS Estimate is used; For instance, if today’s actual date is March 1, 2009, the “Current” EPS Estimate for MSFT is June 2009, and the “Next” EPS Estimate for MSFT is June 2010; the latter is used. b) The eps estimated data is sourced from a third party.
from quantopian.research import run_pipeline, symbols
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import Latest
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.data import morningstar
#from quantopian.pipeline.factors import CustomFactor, SimpleMovingAverage, AverageDollarVolume, Returns, RSI
#from quantopian.pipeline.classifiers.morningstar import Sector
from quantopian.pipeline.filters import Q500US, Q1500US
#from quantopian.pipeline.data.quandl import fred_usdontd156n as libor
#from quantopian.pipeline.data.zacks import EarningsSurprises
import pandas as pd
import numpy as np
import alphalens
#import pyfolio as pf
#from scipy import stats
#import matplotlib.pyplot as plt
#from sklearn import linear_model, decomposition, ensemble, preprocessing, isotonic, metrics
from quantopian.interactive.data.estimize import estimates_free
from quantopian.interactive.data.estimize import estimates
from quantopian.interactive.data.eventvestor import earnings_guidance_free
from quantopian.interactive.data.eventvestor import earnings_guidance
universe = Q1500US()
def make_pipeline():
close = Latest(inputs=[USEquityPricing.close], mask=universe)
fey = Latest(inputs=[morningstar.valuation_ratios.forward_earning_yield], mask=universe)
pipe = Pipeline(screen=universe,
columns={'close': close,
'forward_earning_yield': fey,
},
)
return pipe
Actually load the data
results = run_pipeline(make_pipeline(), '2014-01-01', '2017-01-01')
results.dropna(axis=0, inplace=True) ## drop days/stock pairs that have no forward_earning_yield
results.head()
Prepare factor
factor = results['forward_earning_yield']
factor.head()
Prepare prices
prices = pd.DataFrame(results['close'])
prices = prices.unstack(level=1)
prices.dropna(axis=1, inplace=True) ## drop stocks with no forward_earning_yield
prices.columns = prices.columns.droplevel(0)
prices.head()
i use one large period (252 days) because forward_earning_yield is one-year forward looking
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor = factor,
prices = prices,
quantiles = 2,
#periods = (3, 10, 30),
periods = (10, 30, 252),
)
actually compute the tear sheet
alphalens.tears.create_full_tear_sheet(factor_data)