#display options
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
import numpy as np
import pandas as pd
import time
%matplotlib inline
import matplotlib as mpl
mpl.rc("savefig",dpi=100)
from matplotlib import pyplot as plt
#pandas option
pd.options.display.max_columns = 50
idx = pd.IndexSlice
def wins_one(df_var, p = 0.01):
return df_var.groupby(level = 1).apply(lambda x: x.clip(lower = x.quantile(p), upper = x.quantile(1. - p)))
percentile = [0.1, 0.25, 0.50, 0.75, 0.9][::-1]
scf_years=[1988,1991,1994,1997,2000,2003,2006,2009,2012,2015]
all_years=range(1980,2017)
Load compustat data from WRDS. We use annual data from 1980-2016. The following variables (named as per WRDS conventions) are used in our analysis.
#load compustat data
df = pd.read_stata('./compustat_mergenfo_plus_sale_at.dta')
df['fyear'] = df['fyear'].astype(int)
#set index after sorting
df = df.drop_duplicates(subset = ['gvkey', 'fyear']) #this is not ok.
df = df.sort_values(['gvkey', 'fyear'])
df = df.set_index(['gvkey', 'fyear'], verify_integrity = True, drop = False)
df = df[df['fic'] == 'USA']
We now construct some user-defined variables:
#calculate self-defined market value variable
df['mkvalt'] = df['csho'] * df['prcc_f']
df = df[pd.notnull(df['pi']) & pd.notnull(df['dvt']) & (pd.notnull(df['mkvalt']))]
#construct value weight
df['wgt_mval'] = df['mkvalt'] / df['mkvalt'].groupby(level = 1).sum()
#create income yield vars
df['pi_mval_ratio'] = (df['pi']/df['mkvalt']).replace([np.inf, -np.inf], np.nan)
#winsorize
df['pi_mval_ratio_wins'] = wins_one(df['pi_mval_ratio'])
sel=df['fyear'].isin(scf_years)
To change to scf_years replace the variable "all_years" by "scf_years." Means are computed after winsorizing.
EW_pi_mval=(df[sel]['pi_mval_ratio_wins']).groupby(level = 1).mean()
VW_pi_mval=(df[sel]['pi_mval_ratio_wins']*df[sel]['wgt_mval']).groupby(level = 1).sum()
num=(df[sel]['pi_mval_ratio_wins']).groupby(level = 1).count()
pi_mval_mom=pd.DataFrame([num,EW_pi_mval,VW_pi_mval])
pi_mval_mom=pi_mval_mom.T
pi_mval_mom.columns=['num','EW_mean','VW_mean']
per_pi_mval=[df[sel]['pi_mval_ratio'].groupby(level = 1).quantile(p) for p in percentile]
per_head=['p90','p75','p50','p25','p10']
for p in range(len(percentile)):
pi_mval_mom[per_head[p]]=per_pi_mval[p]
pi_mval_mom=pi_mval_mom[['num','EW_mean','VW_mean','p10','p25','p50','p75','p90']]
pi_mval_mom.to_csv('compustat_pi_mval_all_firms.csv')
pi_mval_mom
all_years=np.arange(1988,2016)
sel=df['fyear'].isin(all_years)
EW_pi_mval=(df[sel]['pi_mval_ratio_wins']).groupby(level = 1).mean()
VW_pi_mval=(df[sel]['pi_mval_ratio_wins']*df[sel]['wgt_mval']).groupby(level = 1).sum()
num=(df[sel]['pi_mval_ratio_wins']).groupby(level = 1).count()
pi_mval_mom=pd.DataFrame([num,EW_pi_mval,VW_pi_mval])
pi_mval_mom=pi_mval_mom.T
pi_mval_mom.columns=['num','EW_mean','VW_mean']
per_pi_mval=[df[sel]['pi_mval_ratio'].groupby(level = 1).quantile(p) for p in percentile]
per_head=['p90','p75','p50','p25','p10']
for p in range(len(percentile)):
pi_mval_mom[per_head[p]]=per_pi_mval[p]
pi_mval_mom=pi_mval_mom[['num','EW_mean','VW_mean','p10','p25','p50','p75','p90']]
pi_mval_mom.to_csv('compustat_pi_mval_all_firms_allyears.csv')
pi_mval_mom
x=0.2
var='mkvalt'
var_10=var+'_10'
tmp = df.merge(how = 'left', right = df[var].groupby(level = 1).quantile(x).to_frame(var_10), left_index = True, right_index = True)
df_p10 = df[df[var] < tmp[var_10]]
df_p10['wgt_mval'] = df_p10['mkvalt'] / df_p10['mkvalt'].groupby(level = 1).sum()
sel_10=df_p10['fyear'].isin(scf_years)
EW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).mean()
num=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).count()
VW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']*df_p10[sel_10]['wgt_mval']).groupby(level = 1).sum()
pi_mval_mom=pd.DataFrame([num,EW_pi_mval,VW_pi_mval])
pi_mval_mom=pi_mval_mom.T
pi_mval_mom.columns=['num','EW_mean','VW_mean']
per_pi_mval=[df_p10[sel_10]['pi_mval_ratio'].groupby(level = 1).quantile(p) for p in percentile]
per_head=['p90','p75','p50','p25','p10']
for p in range(len(percentile)):
pi_mval_mom[per_head[p]]=per_pi_mval[p]
pi_mval_mom=pi_mval_mom[['num','EW_mean','VW_mean','p10','p25','p50','p75','p90']]
pi_mval_mom.to_csv('compustat_pi_mval_small_firms_mc.csv')
pi_mval_mom
x=0.2
var='at'
var_10=var+'_10'
tmp = df.merge(how = 'left', right = df[var].groupby(level = 1).quantile(x).to_frame(var_10), left_index = True, right_index = True)
df_p10 = df[df[var] < tmp[var_10]]
df_p10['wgt_mval'] = df_p10['mkvalt'] / df_p10['mkvalt'].groupby(level = 1).sum()
sel_10=df_p10['fyear'].isin(scf_years)
EW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).mean()
num=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).count()
VW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']*df_p10[sel_10]['wgt_mval']).groupby(level = 1).sum()
pi_mval_mom=pd.DataFrame([num,EW_pi_mval,VW_pi_mval])
pi_mval_mom=pi_mval_mom.T
pi_mval_mom.columns=['num','EW_mean','VW_mean']
per_pi_mval=[df_p10[sel_10]['pi_mval_ratio'].groupby(level = 1).quantile(p) for p in percentile]
per_head=['p90','p75','p50','p25','p10']
for p in range(len(percentile)):
pi_mval_mom[per_head[p]]=per_pi_mval[p]
pi_mval_mom=pi_mval_mom[['num','EW_mean','VW_mean','p10','p25','p50','p75','p90']]
pi_mval_mom.to_csv('compustat_pi_mval_small_firms_at.csv')
pi_mval_mom.describe()
x=0.2
var='sale'
var_10=var+'_10'
tmp = df.merge(how = 'left', right = df[var].groupby(level = 1).quantile(x).to_frame(var_10), left_index = True, right_index = True)
df_p10 = df[df[var] < tmp[var_10]]
df_p10['wgt_mval'] = df_p10['mkvalt'] / df_p10['mkvalt'].groupby(level = 1).sum()
sel_10=df_p10['fyear'].isin(scf_years)
EW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).mean()
num=(df_p10[sel_10]['pi_mval_ratio_wins']).groupby(level = 1).count()
VW_pi_mval=(df_p10[sel_10]['pi_mval_ratio_wins']*df_p10[sel_10]['wgt_mval']).groupby(level = 1).sum()
pi_mval_mom=pd.DataFrame([num,EW_pi_mval,VW_pi_mval])
pi_mval_mom=pi_mval_mom.T
pi_mval_mom.columns=['num','EW_mean','VW_mean']
per_pi_mval=[df_p10[sel_10]['pi_mval_ratio'].groupby(level = 1).quantile(p) for p in percentile]
per_head=['p90','p75','p50','p25','p10']
for p in range(len(percentile)):
pi_mval_mom[per_head[p]]=per_pi_mval[p]
pi_mval_mom=pi_mval_mom[['num','EW_mean','VW_mean','p10','p25','p50','p75','p90']]
pi_mval_mom.to_csv('compustat_pi_mval_small_firms_sale.csv')
pi_mval_mom