求助,时间序列数据计算的问题
本帖最后由 idleriver 于 2023-1-15 20:34 编辑大家好,我是刚开始学习python的新手。目前手上有这样一堆基金产品的净值数据,产品数量大概几百只,共三列,第一列是基金代码,第二列是数据日期,第三列是该产品当日的净值数据,大概如下表。由于每个产品成立的时间不一样,所以有的产品的成立时间长数据就多,有的产品成立时间段,数据就少,而且每个产品的净值披露周期也不一样,有的每周公布一次净值,比如下表的AAAAAA产品,有的每天公布一次净值,比如BBBBBB产品。
产品代码日期adj_nav
AAAAAA2019/12/161.0001
AAAAAA2019/12/231.0007
AAAAAA2019/12/301.0014
AAAAAA2020/1/61.0022
AAAAAA2020/1/131.0026
AAAAAA2020/1/201.0035
AAAAAA2020/2/31.0054
AAAAAA2020/2/101.0061
AAAAAA2020/2/171.0071
AAAAAA2020/2/241.0079
……
AAAAAA2022/12/121.0897
AAAAAA2022/12/191.0897
AAAAAA2022/12/261.0897
AAAAAA2023/1/31.0897
AAAAAA2023/1/91.0897
BBBBBB2020/1/81.0014
BBBBBB2020/1/151.002
BBBBBB2020/1/211.0027
BBBBBB2020/1/221.0029
BBBBBB2020/1/231.0029
BBBBBB2020/2/31.0049
BBBBBB2020/2/41.005
BBBBBB2020/2/51.005
……
BBBBBB2022/10/251.0916
BBBBBB2022/10/261.0916
BBBBBB2022/10/271.0917
BBBBBB2022/10/281.0918
BBBBBB2022/10/311.092
我想算产品的回撤情况(产品当前净值较近一段期间的最高净值的下跌幅度,计算公式=当前净值/近期最大净值-1),并且通过下列式子算出了产品成立以来的动态回撤,(动态即每天都求一下成立那天到当前日期期间的最大净值,再计算回撤,从而得到一个回撤的时间序列)。并且计算成功了。
df['pre_max']=df.groupby(['产品代码'])['adj_nav'].cummax()
df['动态回撤']=(df['adj_nav']-chrems['pre_max'])/chrems['pre_max']
但是,现在我想求一下产品近1年的最大回撤,即每天都计算一下当前那天到1年前这段区间内的最大净值,然后再跟现在的净值比较,求一个下跌幅度。我以为要用rolling去算,写了以下式子,结果系统报错了。请问这种情况该怎么写呢?
chrems['近1年最高净值']=chrems.groupby(['理财代码'])['adj_nav'].rolling(365, min_periods=1).max()
chrems['动态回撤(近1年)']=(chrems['adj_nav']-chrems['pre_max_1yr'])/chrems['pre_max_1yr']
有大佬能解答一下吗{:10_266:} 是用rolling,只是你不太会用而已。
如果躺在被窝里的我没记错的话,rolling方法可以针对“时间序列类型”的数据进行处理,参数写法支持如'7d',代表“近7天”,典型如求七天移动平均 rolling('7d', ...).mean()
而像你那样直接写数字的,是代表“近365行的数据”,而非你以为的“近一年”(问题是 你的数据总共可能都没365多行吧?)
所以,你可以再查查相关资料和例子 阿奇_o 发表于 2023-1-15 22:31
是用rolling,只是你不太会用而已。
如果躺在被窝里的我没记错的话,rolling方法可以针对“时间序列类型” ...
后来试过7D等写法了,还是报错,目前已上stackoverflow询问后通过其它方法解决,感谢。
页:
[1]