rolling apply beta residual
def roll(df, d):
# stack df.values d-times shifted once at each stack
roll_array = np.dstack([df.values[i:i + d, :] for i in range(len(df.index) - d + 1)]).T
# roll_array is now a 3-D array and can be read into
# a pandas panel object
panel = pd.Panel(roll_array,
items=df.index[d - 1:],
major_axis=df.columns,
minor_axis=pd.Index(range(d), name='roll'))
# convert to dataframe and pivot + groupby
# is now ready for any action normally performed
# on a groupby object
return panel.to_frame().unstack().T.groupby(level=0)
def beta(df, d):
df=df.dropna(thresh=int(d / 2), axis=1)
df=df.fillna(0)
# first column is the market
X = df.values[:, [0]]
# prepend a column of ones for the intercept
X = np.concatenate([np.ones_like(X), X], axis=1)
# matrix algebra
b = np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(df.values[:, 1:])
return pd.Series(b[1], df.columns[1:], name='Beta')
def idioVol(df, d):
df=df.dropna(thresh=int(d / 2), axis=1)
df=df.fillna(0)
# first column is the market
X = df.values[:, [0]]
# prepend a column of ones for the intercept
X = np.concatenate([np.ones_like(X), X], axis=1)
# matrix algebra
b = np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(df.values[:, 1:]) #beta
resid=df.values[:,1:]-X.dot(b)# real value - fitted value
resid_std=np.std(resid,axis=0)
return resid_std