我有这个代码来计算回报:

import yfinance as yf
import numpy as np
import pandas as pd

df = yf.download('SPY', '2023-01-01')
df = df[['Close']]
df['d_returns'] = np.log(df.div(df.shift(1)))
df.dropna(inplace = True)

df_1M = pd.DataFrame()
df_2M = pd.DataFrame()
df_3M = pd.DataFrame()

df_1M['1M cummreturns'] = df.d_returns.cumsum().apply(np.exp)
df_2M['2M cummreturns']= df.d_returns.cumsum().apply(np.exp)
df_3M['3M cummreturns'] = df.d_returns.cumsum().apply(np.exp)

df1 = df_1M[['1M cummreturns']].resample('1M').max()
df2 = df_2M[['2M cummreturns']].resample('2M').max()
df3 = df_3M[['3M cummreturns']].resample('3M').max()

df1 = pd.concat([df1, df2, df3], axis=1)
df1

这提供了以下内容:

            1M cummreturns  2M cummreturns  3M cummreturns
Date            
2023-01-31  1.067381        1.067381        1.067381
2023-02-28  1.094428        NaN             NaN
2023-03-31  1.075022        1.094428        NaN
2023-04-30  1.092196        NaN             1.094428
2023-05-31  1.103356        1.103356        NaN
2023-06-30  1.164014        NaN             NaN
2023-07-31  1.202116        1.202116        1.202116
2023-08-31  1.198677        NaN             NaN
2023-09-30  1.184785        1.198677        NaN
2023-10-31  1.145738        NaN             1.198677
2023-11-30  1.198466        1.198466        NaN
2023-12-31  1.251746        NaN             NaN
2024-01-31  1.290032        1.290032        1.290032
2024-02-29  1.334174        NaN             NaN
2024-03-31  1.346699        1.346699        NaN
2024-04-30  NaN             NaN             1.346699

如何获取每行2M cummreturns列和3M cummreturns列中的有效值?

例如,2023-02-28行表示Feb-2023个月.列2M cummreturns3M cummreturns需要在接下来的2个月和3个月的时间内分别从Feb-2023开始有最大回报,同样的方式1M cummreturns在接下来的1个月时间内给出最大回报.

推荐答案

IIUC,你只想对第一列重新采样,以获得月份.然后计算rolling.max:

# compute once the max per month
tmp = df.d_returns.cumsum().apply(np.exp).resample('1M').max()

# then roll over the above with different windows
N = 3 # number of columns to generate
out = pd.DataFrame({f'{x+1}M cummreturns': tmp.rolling(x+1, min_periods=1).max()
                    for x in range(N)})

输出:

            1M cummreturns  2M cummreturns  3M cummreturns
Date                                                      
2023-01-31        1.067381        1.067381        1.067381
2023-02-28        1.094428        1.094428        1.094428
2023-03-31        1.075022        1.094428        1.094428
2023-04-30        1.092196        1.092196        1.094428
2023-05-31        1.103356        1.103356        1.103356
2023-06-30        1.164014        1.164014        1.164014
2023-07-31        1.202116        1.202116        1.202116
2023-08-31        1.198677        1.202116        1.202116
2023-09-30        1.184785        1.198677        1.202116
2023-10-31        1.145738        1.184785        1.198677
2023-11-30        1.198466        1.198466        1.198466
2023-12-31        1.251746        1.251746        1.251746
2024-01-31        1.290032        1.290032        1.290032
2024-02-29        1.334174        1.334174        1.334174
2024-03-31        1.346699        1.346699        1.346699

Python相关问答推荐

Django管理面板显示字段最大长度而不是字段名称

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

Pandas:将多级列名改为一级

海上重叠直方图

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

使用Python查找、替换和调整PDF中的图像'

如何杀死一个进程,我的Python可执行文件以sudo启动?

在Python中使用yaml渲染(多行字符串)

在代码执行后关闭ChromeDriver窗口

Flask运行时无法在Python中打印到控制台

在二维NumPy数组中,如何 Select 内部数组的第一个和第二个元素?这可以通过索引来实现吗?

删除特定列后的所有列

在Django中重命名我的表后,旧表中的项目不会被移动或删除

当输入是字典时,`pandas. concat`如何工作?

有没有一种方法可以在朗肯代理中集成向量嵌入

对于数组中的所有元素,Pandas SELECT行都具有值

在聚合中使用python-polars时如何计算模式

函数()参数';代码';必须是代码而不是字符串