top_color = g.vs[list(np.argsort(score)[-5:])]["name"] node_color.update({k: 'cyan' for k in top_color}) pos = igraph_draw( g, num=1, center_name=center_name, node_color=node_color, node_size=node_size, edge_color='r', k=2, pos=None, font_size=10, figsize=(11,12), labels={k:v for k,v in zip(g.vs['name'], g.vs['bea'])}, title=f"Production Flows {list(total['year'].unique())}") plt.show() # Construct monthly BEA industry returns for the same period of years codes = Sectoring(sql, f"bea{vintage}", fillna='') naics = pstat.build_lookup('lpermno', 'naics', fillna=0) caps, counts, rets = [], [], [] for year in years: date = bd.endyr(year - 1) univ = crsp.get_universe(date) univ['bea'] = codes[naics(univ.index, date)] univ = univ[univ['bea'].ne('')] grouped = univ.groupby('bea') caps.append(grouped['cap'].sum().rename(year)) counts.append(grouped['cap'].count().rename(year)) months = bd.date_range(date, bd.endyr(year), 'endmo') for rebaldate, end in zip(months[:-1], months[1:]): r = pd.concat([crsp.get_ret(bd.begmo(end), end), crsp.get_cap(rebaldate, use_permco=False), univ['bea']], axis=1, join='inner').dropna() grp = r.groupby('bea') # industry ret is sum of weighted rets r['wtdret'] = r['ret'].mul(r['cap'].div(grp['cap'].transform('sum'))) rets.append(grp['wtdret'].sum(min_count=1).rename(end))
plt.savefig(os.path.join(imgdir, f'{sent}.jpg')) plt.show() # Quintile cap-weighted spread portfolio weights: return Correlation """ - same year filings [yr]0101:[yr]1231 = bd.begyr(caldate) to caldate - lagged [yr+1]0401:[yr+2]0331 = bd.begmo(caldate,4) - bd.endmo(caldate,15) """ for ifig, key in enumerate(['mdasent', 'mdachg', 'mdacos']): ret1 = {} # to collect year-ahead spread returns ret0 = {} # to collect current-year spread returns for year in sorted(np.unique(data['year'])): # loop over years # compute current year spread returns beg = bd.begyr(year) end = bd.endyr(year) univ = data[data['year'] == year]\ .dropna(subset=[key])\ .set_index('permno')\ .join(crsp.get_cap(bd.offset(beg, -1)), how='inner')\ .join(crsp.get_ret(beg, end, delist=True), how='left') if len(univ): sub = fractiles(univ[key], [20, 80]) pos = weighted_average(univ.loc[sub == 1, ['cap', 'ret']], 'cap')['ret'] neg = weighted_average(univ.loc[sub == 3, ['cap', 'ret']], 'cap')['ret'] ret0[end] = { 'ret': pos - neg, 'npos': sum(sub == 1), 'nneg': sum(sub == 3)