代码之家  ›  专栏  ›  技术社区  ›  ian_chan

每月频率的熊猫数据框每日回归

  •  0
  • ian_chan  · 技术社区  · 7 年前

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

               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 回复  |  直到 7 年前
        1
  •  1
  •   DJK    7 年前

    你可以从这样的方法开始

    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 加快计算速度。