我有一个dataframe index是从24年1月1日至今每一天的日期,columns是证券代码,dataframe里存储的是每一天的价格,如何计算每只证券每个月的月回报和回撤
时间: 2024-12-14 20:20:28 浏览: 15
为了计算每只证券每个月的月度回报和回撤,你需要按照以下步骤操作:
1. **设置索引月份**:首先,你需要把日期索引转换成月份,以便于后续的月度分析。你可以使用`pd.Grouper(freq='M')`创建每月的Grouping Key,这会根据DataFrame的索引自动划分成每月一组。
```python
monthly_index = pd.date_range(start=df.index[0], end=df.index[-1], freq='M')
df_monthly = df.reindex(monthly_index, method='ffill') # 使用向前填充方法(fillna)填充缺失值
```
这里假设你的DataFrame已经包含了完整的交易日数据,如果没有,则需要先补充完整。
2. **计算月度回报**:对于每个月的数据,我们可以计算回报率,即本月价格相对于上个月的价格变化。计算公式通常是 `(price_this_month / price_last_month) - 1`。假设`price`列为价格数据:
```python
df_monthly['Return'] = df_monthly.groupby(level=0)['price'].pct_change()
```
这里的`level=0`表示我们按照月份(即一级索引)进行分组。
3. **计算月度回撤**:回撤通常指从某个月的高点到下一个月低点的最大跌幅。我们可以用以下代码计算最大回撤:
```python
def max_drawdown(row):
highs = row[row['Return'].cummax()]
return (row['Return'].iloc[-1] - highs.iloc[-1]) / highs.iloc[-1]
df_monthly['Max_Drawdown'] = df_monthly.groupby(level=0)['Return'].apply(max_drawdown)
```
这里使用了累积最大回报(cumulative maximum return),然后计算当前月度回报减去这个累积最大回报,再除以累积最大回报得到回撤比例。
4. **结果整理**:现在你已经有了每个月的回报和回撤数据,你可以选择保留必要的列并整理结果。
```python
result = df_monthly[['code', 'Return', 'Max_Drawdown']].reset_index(drop=True)
```
阅读全文