如何在Python中实现日收益率到2日/5日等多日收益率的转换
将日收益率转换为任意频率收益率(Python实现)
已知我们有按日期和个股分组的日收益率数据,需要将其转换为任意n日收益率(比如2日、5日)。计算逻辑为:n日收益率 = 连续n个(1+日收益率)的乘积 - 1,前n-1个交易日对应结果为NaN。
原始数据
import pandas as pd import numpy as np data = {'date': ['1/1/2022','1/1/2022', '1/2/2022','1/2/2022'], 'ticker': ['A', 'B','A', 'B'], '1dReturn': [0.11, 0.21,0.31, 0.41]} df = pd.DataFrame(data)
实现方案
我们可以通过分组滚动乘积来实现任意n日收益率的计算,步骤如下:
- 先按个股(ticker)和日期(date)排序,确保时间序列的顺序正确
- 对每个个股分组,计算(1+日收益率)的滚动窗口乘积,窗口大小为n
- 将乘积结果减1,得到n日收益率,前n-1个值自动为NaN
以下是封装好的函数:
def calculate_n_day_return(df, n): # 转换日期格式并排序 df['date'] = pd.to_datetime(df['date']) df_sorted = df.sort_values(by=['ticker', 'date']).reset_index(drop=True) # 计算滚动乘积并得到n日收益率 df_sorted[f'{n}dReturn'] = df_sorted.groupby('ticker')['1dReturn'] \ .apply(lambda x: (1 + x).rolling(window=n).prod() - 1) return df_sorted
示例:计算2日收益率
调用函数计算2日收益率,结果与预期一致:
result_df = calculate_n_day_return(df, 2) print(result_df)
输出结果:
date ticker 1dReturn 2dReturn 0 2022-01-01 A 0.11 NaN 1 2022-01-02 A 0.31 0.454100 2 2022-01-01 B 0.21 NaN 3 2022-01-02 B 0.41 0.706100
其中0.4541 = (1+0.11)(1+0.31)-1,0.7061 = (1+0.21)(1+0.41)-1,完全符合预期。
关键说明
- 必须先排序:如果原始数据的日期不是按顺序排列,滚动计算会出错,所以第一步的排序是必要的
- 滚动窗口的
window=n表示取当前行及之前共n行的数据计算乘积,因此前n-1行没有足够的数据,结果为NaN,符合业务逻辑 - 该函数支持任意正整数n,比如计算5日收益率只需传入
n=5即可
内容的提问来源于stack exchange,提问作者Tartaglia
相关产品推荐
相关产品推荐

