从大熊猫的日收益中计算出月收益(以磅为单位)

时间:2018-09-07 07:56:09

标签: python pandas

我试图计算特定股票的月收益率,但是我想不出一个好的方法,它不使用大量的周期。 df具有以下格式

           MSFT-US  AAPL-US    GE    RF
 20150501    1.01   -0.33   -0.60   0.000
 20150504    0.32    0.06    0.16   0.000
 20150505   -1.19   -0.10    0.34   0.000
 20150506   -0.31    0.62   -0.20   0.000
 20150507    0.39    0.03   -0.43   0.000
 20150508    1.21   -0.54   -0.21   0.000
 20150511   -0.39    0.67   -0.11   0.000
 20150512   -0.27    0.00    0.11   0.000
 20150513    0.01    0.02   -0.06   0.000
 20150514    1.01   -0.10   -0.36   0.000
 20150515    0.05   -0.26   -0.01   0.000
 20150518    0.44    0.72   -0.09   0.000
 20150519   -0.09   -0.08    0.03   0.000
 20150520   -0.05    0.21   -0.09   0.000
 20150521    0.23   -0.31    0.09   0.000
 20150522   -0.22   -0.11   -0.14   0.000
 20150526   -1.01   -0.04   -0.02   0.000
 20150527    0.93    0.33   -0.39   0.000
 20150528   -0.11    0.11    0.07   0.000
 20150529   -0.58    0.02    0.05   0.000

所以我想要这样的东西(但不是总和):

         MSFT-US   AAPL-US     GE      RF
 201505    1.36     0.92     -1.89    0.00

4 个答案:

答案 0 :(得分:5)

假设您的日期列称为'date'

df['month'] = df['date'].astype(str).str[:6]

monthly_total = df.groupby('month').sum().drop('date', axis='columns')

给你

        MSFT-US  AAPL-US    GE   RF
month                              
201505     1.38     0.92 -1.86  0.0

要获得复合收益,我们需要在每个值上加1,然后使用.prod()

df[['MSFT-US', 'AAPL-US', 'GE', 'RF']] += 1
monthly_total = df.groupby('month').prod().drop('date', axis='columns')

给我们:

         MSFT-US   AAPL-US        GE   RF
month                                    
201505  0.008739  0.946043  0.070769  1.0

答案 1 :(得分:3)

df.index = df.index.map(lambda x:pd.to_datetime(str(x)))
df.groupby([df.index.year,df.index.month]).sum()

输出:

        MSFT-US AAPL-US GE  RF
2015    5   1.38    0.92    -1.86   0.0

答案 2 :(得分:0)

我假设您的数据框具有DatetimeIndex。如果是这样,我更喜欢从每日收益到每月收益的这种方法:

df.resample('M').agg(lambda x: (x + 1).prod() - 1)

但是您也可以申请其他频率。例如,对于上周五的每周收益:

df.resample('W-FRI').agg(lambda x: (x + 1).prod() - 1) 

答案 3 :(得分:0)

假设您的数据是每日收益,那么下面的摘要可用于为每月收益重新采样数据:

df.index = pd.to_datetime(df.index)
df = df.resample('1M').mean()
df.index = pd.to_datetime(df.index, format="%Y%m").to_period('M')

日期索引将采用以下格式:

PeriodIndex(['2015-07', '2015-08', '2015-09'...dtype='period[M]', name='date', freq='M')

该值将是该月的回报平均值。