我有许多股票的每日回报数据,如下所示:
Stock A Stock B Stock C Market
date
1987-02-02 0.01 0.02 0.02 0.01
1987-02-03 0.02 0.03 0.02 0.02
1987-02-04 0.03 0.01 0.01 0.03
1987-02-05 0.04 0.03 0.05 0.04
我想在市场上计算股票A,B,C的30天回归,但仅在每个月末,即1987-02-28,1987-03-31 ...然后保存回归得到两个矩阵(一个用于常数项,一个用于系数):
Stock A Stock B Stock C
date
1987-02-28 const const const
1987-03-31 const const const
1987-04-30 const const const
Stock A Stock B Stock C
date
1987-02-28 coeff coeff coeff
1987-03-31 coeff coeff coeff
1987-04-30 coeff coeff coeff
到目前为止,我所做的是为“月末”创建一个指标,然后循环显示日期的所有行和列:
loop over columns:
loop over rows:
if end of month is true:
regress Stock on Market using past 30 days data
save the result
鉴于我有超过50年的大量股票(7000+),这种方式非常缓慢。我想知道是否有人之前已经处理过类似的问题,并且有更快的方法来实现这个问题?关于如何提高速度或效率的任何提示将不胜感激。
答案 0 :(得分:1)
你可以从这样的方法开始
import pandas as pd
import numpy as np
from datetime import datetime
from pandas.tseries.offsets import MonthEnd
#sample Data
df = pd.DataFrame(index=pd.DatetimeIndex(freq='D',start=datetime(1990,1,1),end=datetime(1995,12,25)),data=np.random.randint(0,100,(2185,3)),columns=['Stock A','Stock B','Stock C'])
#Create a column that has the end of the month for each date
df['end'] = df.index + MonthEnd(1)
#Groupby the end of the month and apply your regression function
for group,data in df.groupby('end'):
for row in data.columns #Sudo code loop over columns used per regression
regressFunction()
这应该消除在行和列上浪费的时间循环,而只是计算已知索引的回归。此外,计算parallel中的回归以加速计算可能是有益的。