我有以下df:
message
我正在尝试运行 Close_x Close_y
key_0
2017-10-23 NaN NaN
2017-10-24 -0.147631 0.161791
2017-10-25 0.044194 -0.466305
2017-10-26 -0.069876 0.127095
2017-10-27 0.142261 0.807302
2017-10-30 -0.178176 -0.319247
2017-10-31 0.108544 0.094446
2017-11-01 -0.136536 0.159211
2017-11-02 -0.204280 0.018997
2017-11-03 0.324777 0.309708
2017-11-06 0.049001 0.127125
2017-11-07 0.108391 -0.018910
2017-11-08 0.167624 0.144365
2017-11-09 -0.183357 -0.376189
2017-11-10 0.126741 -0.089764
2017-11-13 0.523946 0.098363
2017-11-14 -0.481367 -0.230961
2017-11-15 -0.148953 -0.552568
2017-11-16 -0.320806 0.819606
2017-11-17 0.172988 -0.262596
2017-11-20 -0.242568 0.127568
2017-11-21 -0.220614 0.654114
2017-11-22 -0.287271 -0.075026
2017-11-24 0.483940 0.205610
2017-11-27 0.177181 -0.038426
2017-11-28 -0.005628 0.984851
2017-11-29 0.537868 -0.036923
2017-11-30 0.112756 0.819095
2017-12-01 0.018372 -0.202453
2017-12-04 -0.362582 -0.105216
... ... ...
2018-09-07 -0.176824 -0.221334
2018-09-10 -0.106907 0.189783
2018-09-11 -0.553854 0.373984
2018-09-12 -0.410831 0.035667
2018-09-13 -0.566335 0.528225
2018-09-14 -0.157859 0.027548
2018-09-17 -0.111232 -0.556972
2018-09-18 0.163057 0.536901
2018-09-19 -0.170732 0.125327
2018-09-20 0.241025 0.784059
2018-09-21 0.065865 -0.036853
2018-09-24 -0.321969 -0.351569
2018-09-25 0.489287 -0.130510
2018-09-26 0.197137 -0.328928
2018-09-27 0.535727 0.276329
2018-09-28 -0.151688 -0.000687
2018-10-01 -0.350278 0.364111
2018-10-02 -0.148503 -0.039669
2018-10-03 -0.252355 0.071152
2018-10-04 -0.104687 -0.816948
2018-10-05 -0.022230 -0.552798
2018-10-08 -0.123084 -0.039512
2018-10-09 -0.425363 -0.141790
2018-10-10 0.408815 -3.286423
2018-10-11 -0.629016 -2.057301
2018-10-12 -0.717824 1.420620
2018-10-15 -0.461052 -0.590498
2018-10-16 -0.385450 2.149560
2018-10-17 -1.040515 -0.025266
2018-10-18 -0.496977 -0.524702
,但始终会出错。我还想运行一个成功获得的rolling(21).cov(close_x,close_y)
。最终目标是在21周期滚动窗口中创建等于rolling(21).var(close_x)
的df(Beta)。帮不上忙吗?
答案 0 :(得分:0)
要获取列之间的协方差,您可以执行以下操作:
df.rolling(21).cov()
Close_x Close_y
key_0
2017-10-23 Close_x NaN NaN
Close_y NaN NaN
2017-10-24 Close_x NaN NaN
Close_y NaN NaN
2017-10-25 Close_x NaN NaN
Close_y NaN NaN
2017-10-26 Close_x NaN NaN
Close_y NaN NaN
2017-10-27 Close_x NaN NaN
Close_y NaN NaN
2017-10-30 Close_x NaN NaN
Close_y NaN NaN
2017-10-31 Close_x NaN NaN
Close_y NaN NaN
2017-11-01 Close_x NaN NaN
Close_y NaN NaN
2017-11-02 Close_x NaN NaN
Close_y NaN NaN
2017-11-03 Close_x NaN NaN
Close_y NaN NaN
2017-11-06 Close_x NaN NaN
Close_y NaN NaN
2017-11-07 Close_x NaN NaN
Close_y NaN NaN
2017-11-08 Close_x NaN NaN
Close_y NaN NaN
2017-11-09 Close_x NaN NaN
Close_y NaN NaN
2017-11-10 Close_x NaN NaN
Close_y NaN NaN
2017-11-13 Close_x NaN NaN
Close_y NaN NaN
2017-11-14 Close_x NaN NaN
Close_y NaN NaN
2017-11-15 Close_x NaN NaN
Close_y NaN NaN
2017-11-16 Close_x NaN NaN
Close_y NaN NaN
2017-11-17 Close_x NaN NaN
Close_y NaN NaN
2017-11-20 Close_x NaN NaN
Close_y NaN NaN
2017-11-21 Close_x 0.055186 0.004344
Close_y 0.004344 0.139974
2017-11-22 Close_x 0.057800 0.006661
Close_y 0.006661 0.140316
2017-11-24 Close_x 0.070428 0.011944
Close_y 0.011944 0.126975
要提取Close_x
和Close_y
之间的滚动协方差,只需执行以下操作:
df.rolling(21).cov().unstack()['Close_x']['Close_y']
key_0
2017-10-23 NaN
2017-10-24 NaN
2017-10-25 NaN
2017-10-26 NaN
2017-10-27 NaN
2017-10-30 NaN
2017-10-31 NaN
2017-11-01 NaN
2017-11-02 NaN
2017-11-03 NaN
2017-11-06 NaN
2017-11-07 NaN
2017-11-08 NaN
2017-11-09 NaN
2017-11-10 NaN
2017-11-13 NaN
2017-11-14 NaN
2017-11-15 NaN
2017-11-16 NaN
2017-11-17 NaN
2017-11-20 NaN
2017-11-21 0.004344
2017-11-22 0.006661
2017-11-24 0.011944
2017-11-27 0.011000
2017-11-28 0.005615
2017-11-29 -0.001627
2017-11-30 0.001503
2017-12-01 0.001986
2017-12-04 0.005164
Name: Close_y, dtype: float64
Close_x
的方差可以通过以下方式获得:
df['Close_x'].to_frame().rolling(21).var()
Close_x
key_0
2017-10-23 NaN
2017-10-24 NaN
2017-10-25 NaN
2017-10-26 NaN
2017-10-27 NaN
2017-10-30 NaN
2017-10-31 NaN
2017-11-01 NaN
2017-11-02 NaN
2017-11-03 NaN
2017-11-06 NaN
2017-11-07 NaN
2017-11-08 NaN
2017-11-09 NaN
2017-11-10 NaN
2017-11-13 NaN
2017-11-14 NaN
2017-11-15 NaN
2017-11-16 NaN
2017-11-17 NaN
2017-11-20 NaN
2017-11-21 0.055186
2017-11-22 0.057800
2017-11-24 0.070428
2017-11-27 0.071921
2017-11-28 0.070846
2017-11-29 0.083070
2017-11-30 0.083106
2017-12-01 0.081725
2017-12-04 0.086686
然后可以通过以下方式获得所需的结果
df_cov = df.rolling(21).cov().unstack()['Close_x']['Close_y']
df_var = df['Close_x'].to_frame().rolling(21).var()
(df_cov/(df_var.T)).T
Close_x
key_0
2017-10-23 NaN
2017-10-24 NaN
2017-10-25 NaN
2017-10-26 NaN
2017-10-27 NaN
2017-10-30 NaN
2017-10-31 NaN
2017-11-01 NaN
2017-11-02 NaN
2017-11-03 NaN
2017-11-06 NaN
2017-11-07 NaN
2017-11-08 NaN
2017-11-09 NaN
2017-11-10 NaN
2017-11-13 NaN
2017-11-14 NaN
2017-11-15 NaN
2017-11-16 NaN
2017-11-17 NaN
2017-11-20 NaN
2017-11-21 0.078712
2017-11-22 0.115246
2017-11-24 0.169587
2017-11-27 0.152945
2017-11-28 0.079259
2017-11-29 -0.019581
2017-11-30 0.018079
2017-12-01 0.024298
2017-12-04 0.059574