Я пытаюсь вычислить 12-месячные скользящие регрессионные коэффициенты для каждой группы по: 1) сгруппировать набор данных по уникальному идентификатору запаса ("PERMNO") 2) применить функцию (roll_betas2), которую я определил для каждой группы 3) вернуть новую группу с добавленной информацией.
Я хотел бы получить отзыв / предложение о том, как улучшить код, чтобы сделать его более эффективным!
from itertools import chain
def rolling_betas2(groupby_permno, window=11):
groupby_permno=groupby_permno.reset_index().drop("index", axis=1).reset_index()
num_obs = groupby_permno.shape[0]
temp_list = list()
for i in range(num_obs):
if i < window:
temp_list.append(list(np.full(4, np.nan)))
else:
X = np.hstack((np.ones((window+1, 1)), groupby_permno.iloc[i - window:i + 1][["Mkt-RF", "SMB", "HML", "UMD"]].values))
y = groupby_permno.iloc[i-window:i+1]["excessret"].values
coeffs = list(np.dot(np.linalg.inv(np.dot(X.T,X)),np.dot(X.T,y)))[1:]
temp_list.append(coeffs)
new_cols_betas = pd.DataFrame(np.array(list(chain(*temp_list))).reshape(num_obs, 4),
columns=["beta-Mkt-RF", "beta-SMB", "beta-HML", "beta-UMD"]).reset_index()
return pd.merge(groupby_permno, new_cols_betas, on="index", how="left")
stocks_data.groupby("PERMNO").apply(rolling_betas2)
Обратите внимание, что, поскольку это 12-месячный период, первые 11 наблюдений не будут иметь рассчитанных коэффициентов - входными данными регрессии являются данные за предыдущий 11 месяц плюс данные текущего месяца и, следовательно, np.nan. Например, запас А имеет информацию с января 2008 года по декабрь 2010 года, тогда коэффициент с января 2008 года по ноябрь 2008 года отсутствует.