运行 python 中的多个 OLS 回归
Running multiple OLS regressions in python
我需要 运行 很多 OLS 回归 (~1.600)。我为 ~1.600 个观测值中的每一个收集了 60 个数据点。
我正在使用 Fama & French 5 因子模型,其中每个观察值的 60 个数据点与样本中的日期相匹配。例如。我在数据框中有从开始日期 ['2010-1-1'] 到结束日期 ['2015-1-1'] 的五个因子参数。
我需要 运行 针对给定股票的股票 returns 这些参数。现在,由于五个因子参数收集在一个数据框中,大约有 96.000 行 (1600*60) 和五列(每个因子),我需要 select 前 60 个观察值,运行 这些针对一组 returns 和 OLS,存储估计系数,然后 select next 60 个观测值,用于因子参数和股票 returns。
我试过像这样使用切片:
start = 0
stop = 59
empty_list = []
for i in my_data:
coef = my_date[i][start:stop]
# run regression with the coef slice and store them in a dataframe
start += 60
stop += 60
但是,我似乎无法让它工作。关于如何解决这个问题的任何建议?
使用 groupby
+ np.arange() // 60
from statsmodels.api import formula
import pandas as pd
df = pd.DataFrame(
np.random.randn(96000, 6),
columns=['f1', 'f2', 'f3', 'f4', 'f5', 'r']
)
f = 'r ~ f1 + f2 + f3 + f4 + f5'
def regress(df, f):
return formula.ols(f, df).fit().params
results = df.groupby(np.arange(len(df)) // 60).apply(regress, f=f)
results.head()
Intercept f1 f2 f3 f4 f5
0 -0.108910 0.205059 0.006981 0.088200 0.064486 -0.003423
1 0.155242 -0.057223 -0.097207 -0.098114 0.163142 -0.029543
2 0.014305 -0.123687 -0.120924 0.017383 -0.168981 0.090547
3 -0.254084 -0.063028 -0.092831 0.137913 0.185524 -0.088452
4 0.025795 -0.126270 0.043018 -0.064970 -0.034431 0.081162
我需要 运行 很多 OLS 回归 (~1.600)。我为 ~1.600 个观测值中的每一个收集了 60 个数据点。
我正在使用 Fama & French 5 因子模型,其中每个观察值的 60 个数据点与样本中的日期相匹配。例如。我在数据框中有从开始日期 ['2010-1-1'] 到结束日期 ['2015-1-1'] 的五个因子参数。
我需要 运行 针对给定股票的股票 returns 这些参数。现在,由于五个因子参数收集在一个数据框中,大约有 96.000 行 (1600*60) 和五列(每个因子),我需要 select 前 60 个观察值,运行 这些针对一组 returns 和 OLS,存储估计系数,然后 select next 60 个观测值,用于因子参数和股票 returns。
我试过像这样使用切片:
start = 0
stop = 59
empty_list = []
for i in my_data:
coef = my_date[i][start:stop]
# run regression with the coef slice and store them in a dataframe
start += 60
stop += 60
但是,我似乎无法让它工作。关于如何解决这个问题的任何建议?
使用 groupby
+ np.arange() // 60
from statsmodels.api import formula
import pandas as pd
df = pd.DataFrame(
np.random.randn(96000, 6),
columns=['f1', 'f2', 'f3', 'f4', 'f5', 'r']
)
f = 'r ~ f1 + f2 + f3 + f4 + f5'
def regress(df, f):
return formula.ols(f, df).fit().params
results = df.groupby(np.arange(len(df)) // 60).apply(regress, f=f)
results.head()
Intercept f1 f2 f3 f4 f5
0 -0.108910 0.205059 0.006981 0.088200 0.064486 -0.003423
1 0.155242 -0.057223 -0.097207 -0.098114 0.163142 -0.029543
2 0.014305 -0.123687 -0.120924 0.017383 -0.168981 0.090547
3 -0.254084 -0.063028 -0.092831 0.137913 0.185524 -0.088452
4 0.025795 -0.126270 0.043018 -0.064970 -0.034431 0.081162