我要做什么
我想按库存项目得出平均股价,流通量的回归系数和股价的R平方。 Apple,Amazon等,以及某些日期期限,例如2月15日至3月14日。作为涵盖30年的定量投资模拟的一部分。问题在于它太慢了。起初,我使用PostgreSQL编写了整个代码,但速度太慢-2小时后未完成。在问了管理信息系统的一位教授朋友之后,我第一次尝试了熊猫。
到目前为止实现的数据结构如下:
原始数据(数据框名为dfStock)
──────────────────────<< br />
代码日期日期组|价格|
──────────────────────<< br />
AAPL | 20200205 | 20200205 | ###。## |
AAPL | 20200206 | 20200305 | ###。## |
...
AAPL | 20200305 | 20200305 | ###。## |
AAPL | 20200306 | 20200405 | ###。## |
...
──────────────────────
结果(名为dfSumS的数据框)
──────────────────────<< br />
代码日期组|平均价格坡度R平方
──────────────────────<< br />
AAPL | 20200205 | ###。## | #。## | #。##
AMZN | 20200205 | ###。## | #。## | #。##
...
AAPL | 20200305 | ###。## | #。## | #。##
AMZN | 20200305 | ###。## | #。## | #。##
...
──────────────────────
目前的代码
'prevdt'对应于上面的'Date Group','compcd'代表公司代码
from sklearn.linear_model import LinearRegression
# Method Tried 1
model = LinearRegression()
def getRegrS(arg_cd, arg_prevdt):
x = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['rnk'].to_numpy().reshape((-1,1))
y = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['adjenp'].to_numpy()
model.fit(x, y)
return model.coef_[0], model.score(x,y)
# Method Tried 2
def getRegrS(arg_cd, arg_prevdt):
x = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['rnk'].to_numpy()
y = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['adjenp'].to_numpy()
rv = stats.linregress(x,y)
return rv[0], rv[2]
dfSumS['rnk'] = dfStock.groupby(['compcd','prevdt']).cumcount()+1
dfSumS[['slope','rsq']]= [getRegrS(cd, prevdt) for cd, prevdt in zip(dfSumS['compcd'], dfSumS['prevdt'])]
我之前尝试过的
根据此link中的建议,我尝试了矢量化,但收到消息“只能比较标记相同的Series对象”。无法解决此问题,我在上面提到了两个功能,它们的速度不够快。两者都使用了较少的代码集(例如2020年),但是一旦数据周期长达2到3个十年,就需要花费数小时。
我考虑过应用,迭代等问题,但是没有这样做,因为首先,链接说它比我做的要慢,其次,每一个似乎只适用于一列,而我必须得到两个结果-系数和R-square在同一时期内,因此两次调用它们肯定会更慢。
现在我正在尝试一些帖子中提到的泳池游戏
答案 0 :(得分:0)
恐怕如果您要运行成千上万的大型线性回归,那么您将不得不付出花费在运行上的时间的代价。如果仅对beta系数或r2值感兴趣,则分别使用numpy
分别为(XtX)^(-1)Xty
和cov(X,y)/sqrt(var(X)var(y))
来计算它们可能会更有效。