大熊猫数据帧按月频率每日回归

时间:2018-01-30 21:26:32

标签: python pandas regression finance

我有许多股票的每日回报数据,如下所示:

           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+),这种方式非常缓慢。我想知道是否有人之前已经处理过类似的问题,并且有更快的方法来实现这个问题?关于如何提高速度或效率的任何提示将不胜感激。

1 个答案:

答案 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中的回归以加速计算可能是有益的。