我试图计算特定股票的月收益率,但是我想不出一个好的方法,它不使用大量的周期。 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
答案 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')
该值将是该月的回报平均值。