Python pandas calculate rolling stock beta using rolling apply to groupby object in vectorized fashion

前端 未结 3 1964
一向
一向 2020-12-17 06:45

I have a large data frame, df, containing 4 columns:

             id           period  ret_1m   mkt_ret_1m
131146       CAN00WG0     199609 -0.1538    0.0471         


        
3条回答
  •  难免孤独
    2020-12-17 07:04

    Try pd.rolling_cov() and pd.rolling.var() as follows:

    import pandas as pd
    import numpy as np
    from StringIO import StringIO
    
        df = pd.read_csv(StringIO('''              id  period  ret_1m  mkt_ret_1m
        131146  CAN00WG0  199609 -0.1538    0.047104
        133530  CAN00WG0  199610 -0.0455   -0.014143
        135913  CAN00WG0  199611  0.0000    0.040926
        138334  CAN00WG0  199612  0.2952    0.008723
        140794  CAN00WG0  199701 -0.0257    0.039916
        143274  CAN00WG0  199702 -0.0038   -0.025442
        145754  CAN00WG0  199703 -0.2992   -0.049279
        148246  CAN00WG0  199704 -0.0919   -0.005948
        150774  CAN00WG0  199705  0.0595    0.122322
        153318  CAN00WG0  199706 -0.0337    0.045765
        160980  CAN00WH0  199709  0.0757    0.079293
        163569  CAN00WH0  199710 -0.0741   -0.044000
        166159  CAN00WH0  199711  0.1000   -0.014644
        168782  CAN00WH0  199712 -0.0909   -0.007072
        171399  CAN00WH0  199801 -0.0100    0.001381
        174022  CAN00WH0  199802  0.1919    0.081924
        176637  CAN00WH0  199803  0.0085    0.050415
        179255  CAN00WH0  199804 -0.0168    0.018393
        181880  CAN00WH0  199805  0.0427   -0.051279
        184516  CAN00WH0  199806 -0.0656   -0.011516
        143275  CAN00WO0  199702 -0.1176   -0.025442
        145755  CAN00WO0  199703 -0.0074   -0.049279
        148247  CAN00WO0  199704 -0.0075   -0.005948
        150775  CAN00WO0  199705  0.0451    0.122322'''), sep='\s+')
    
        df['beta'] = pd.rolling_cov(df['ret_1m'], df['mkt_ret_1m'], window=6) / pd.rolling_var(df['mkt_ret_1m'], window=6)
    
    print df
    

    Output:

                  id  period  ret_1m  mkt_ret_1m      beta
    131146  CAN00WG0  199609 -0.1538    0.047104       NaN
    133530  CAN00WG0  199610 -0.0455   -0.014143       NaN
    135913  CAN00WG0  199611  0.0000    0.040926       NaN
    138334  CAN00WG0  199612  0.2952    0.008723       NaN
    140794  CAN00WG0  199701 -0.0257    0.039916       NaN
    143274  CAN00WG0  199702 -0.0038   -0.025442 -1.245908
    145754  CAN00WG0  199703 -0.2992   -0.049279  2.574464
    148246  CAN00WG0  199704 -0.0919   -0.005948  2.657887
    150774  CAN00WG0  199705  0.0595    0.122322  1.371090
    153318  CAN00WG0  199706 -0.0337    0.045765  1.494095
    160980  CAN00WH0  199709  0.0757    0.079293  1.616520
    163569  CAN00WH0  199710 -0.0741   -0.044000  1.630411
    166159  CAN00WH0  199711  0.1000   -0.014644  0.651220
    168782  CAN00WH0  199712 -0.0909   -0.007072  0.652148
    171399  CAN00WH0  199801 -0.0100    0.001381  0.724120
    174022  CAN00WH0  199802  0.1919    0.081924  1.542782
    176637  CAN00WH0  199803  0.0085    0.050415  1.605407
    179255  CAN00WH0  199804 -0.0168    0.018393  1.571015
    181880  CAN00WH0  199805  0.0427   -0.051279  1.139972
    184516  CAN00WH0  199806 -0.0656   -0.011516  1.101890
    143275  CAN00WO0  199702 -0.1176   -0.025442  1.372437
    145755  CAN00WO0  199703 -0.0074   -0.049279  0.031939
    148247  CAN00WO0  199704 -0.0075   -0.005948 -0.535855
    150775  CAN00WO0  199705  0.0451    0.122322  0.341747
    

提交回复
热议问题