1. 引入库和数据
import numpy as np
import pandas as pd
import statsmodels.api as sm
from stargazer.stargazer import Stargazer
file = "C:/Users/yihan/hedge fund/PS_7_Buffetts_exercise.xlsx"
data = pd.read_excel(file, sheet_name="buffet_data", parse_dates=["date"], index_col="date")
factors = pd.read_excel(file, sheet_name="factors", parse_dates=["date"], index_col="date")
(1+data.loc[:,'Berkshire Hathaway, total return']).cumprod().plot();
Berkshire Hathaway 股票价格/累计收益
2.define 单因子 三因子 五因子模型
def time_series_regressions(y, x):
x_1 = x.loc[:,"Mkt-RF"]
model_1 = sm.OLS(y,sm.add_constant(x_1),missing = 'drop').fit()
x_2 = x.loc[:,["Mkt-RF", "SMB", "HML"]]
model_2 = sm.OLS(y,sm.add_constant(x_2),missing = 'drop').fit()
x_3 = x.loc[:,["Mkt-RF", "SMB", "HML", "BAB", "QMJ"]]
model_3 = sm.OLS(y,sm.add_constant(x_3),missing = 'drop').fit()
return [model_1,model_2,model_3]
3.计算超额收益
BRK = data.loc[:,"Berkshire Hathaway, total return"] - factors.loc[:,'RF']
BRK = BRK.rename("Berkshire Hathaway, excess return")# 给series加一个名字
4.回归结果
models = time_series_regressions(BRK, factors)
alphas = [round(model.params.loc["const"] * 100 * 12, 2) for model in models]
stargazer = Stargazer(models)
stargazer.add_line("Annualized Alpha (in %)", alphas)
stargazer.covariate_order(["const", "Mkt-RF", "SMB", "HML", "BAB", "QMJ"])
stargazer