#Custom factor for Sector PE
from quantopian.pipeline import CustomFactor
class SectorPE(CustomFactor):
# Default inputs
inputs = [Fundamentals.pe_ratio, morningstar.asset_classification.morningstar_sector_code]
window_length = 252 #anual ratio
# dataframe of the latest pe_ratio and sector name the [-1] specifies how many days from current day you
# are getting values for. -1 being most recent.
def compute(self, today, assets, out, pe, sectors):
df = pd.DataFrame(index=assets, data={"pe_ratio": pe[-1],
"sector_code": sectors[-1]})
out[:] = df.groupby("sector_code").transform(np.mean).values.flatten()
from quantopian.pipeline import Pipeline, CustomFactor
from quantopian.pipeline.data import morningstar
from quantopian.pipeline.data.morningstar import Fundamentals
from quantopian.pipeline.domain import US_EQUITIES
from quantopian.pipeline.filters import Q500US
from quantopian.research import run_pipeline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Select a time range to inspect
period_start = '2002-11-17'
period_end = '2019-11-18'
# Pipeline definition
def make_pipeline():
base_universe = Q500US()
tradable_filter_notNull_PE = (Fundamentals.pe_ratio.latest.notnull() & Q500US())
sector = morningstar.asset_classification.morningstar_sector_code.latest
#https://www.quantopian.com/posts/morningstar-pe-ratio
#Adjusted Close Price/ EPS. If the result is negative, zero, >10,000 or <0.001, then null.
pe_ratio = Fundamentals.pe_ratio.latest
sector_pe = pe_ratio - pe_ratio.demean(groupby=sector) # simple way to get a sector average pe
#.rank(groupby=sector)
return Pipeline(
columns={
'pe_ratio': pe_ratio,
'custom_factor_sector_pe' : SectorPE(),
'demean sector_pe' : sector_pe,
'sector' : sector
},
screen=tradable_filter_notNull_PE
)
# Pipeline execution
#panda_dataFrame
data = run_pipeline(
make_pipeline(),
start_date=period_start,
end_date=period_end
)
data.tail(50)
from quantopian.pipeline.data.morningstar import Fundamentals
from quantopian.pipeline.domain import US_EQUITIES
from quantopian.pipeline.filters import Q500US
from quantopian.research import run_pipeline
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
#https://www.quantopian.com/posts/sector-performance-notebook
# Select a time range to inspect
period_start = '2002-11-17'
period_end = '2019-11-18'
sector_codes = {
# Cyclical
'101': 'Basic Materials',
'102': 'Consumer Cyclical',
'103': 'Finacial Services',
'104': 'Real Estate',
#Defensive
'205': 'Consumer Defensive',
'206': 'Healthcare',
'207': 'Utilities',
#Sensitive
'308': 'Communication Services',
'309': 'Energy',
'310': 'Industrials',
'311': 'Technology'}
sector = morningstar.asset_classification.morningstar_sector_code.latest
pe_ratio = Fundamentals.pe_ratio.latest
base_universe = Q500US()
tradable_filter_notNull_PE = (Fundamentals.pe_ratio.latest.notnull() & Q500US())
pipe = Pipeline(
columns={
'pe_ratio': pe_ratio,
'sector' : sector
},
screen=tradable_filter_notNull_PE
)
# Pipeline execution
#panda_dataFrame
data = run_pipeline(
pipe,
start_date=period_start,
end_date=period_end
)
data = data.reset_index()
#data.head()
#Redefine index
data.set_index(['level_0', 'sector'])
#group by date/sector
data = data.groupby(['level_0', 'sector']).mean()
data = data.unstack().dropna()
#https://www.analyticsvidhya.com/blog/2016/01/python-tutorial-list-comprehension-examples/
data = data.rename(columns = {i: sector_codes[str(int(i))] for i in [x[1] for x in data.columns]})
data.tail(50)
#data.plot(colormap=cm.Set1)
#plt.show()
#Testing graphing
# Slice dataframe to get values for each stock
idx = pd.IndexSlice
T_data = data.loc[idx[:, symbols('T')], :]
VZ_data = data.loc[idx[:, symbols('VZ')], :]
dates = data.index.levels[0] # x-coordinates
plt.plot(dates, T_data['pe_ratio'], label ='T PE Ratio')
plt.plot(dates, VZ_data['pe_ratio'], label='VZ PE Ratio')
# Add labels
plt.legend()
plt.title('PE Ratios')
plt.show()