You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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日收益率的计算,步骤如下:

  1. 先按个股(ticker)和日期(date)排序,确保时间序列的顺序正确
  2. 对每个个股分组,计算(1+日收益率)的滚动窗口乘积,窗口大小为n
  3. 将乘积结果减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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:15:27