如何计算DataFrame中daily_return的滚动年初至今标准差?
计算DataFrame每行的年初至今(YTD)标准差
原始DataFrame结构
daily_return year month day date 2018-12-27 NaN 2018 12 27 2018-12-28 1.020245 2018 12 28 2018-12-31 1.000650 2018 12 31 2019-01-02 1.020473 2019 01 02 2019-01-03 1.009129 2019 01 03 ... ... ... ... .. 2023-01-20 1.001087 2023 01 20 2023-01-23 0.998455 2023 01 23 2023-01-24 1.002491 2023 01 24 2023-01-25 1.004482 2023 01 25 2023-01-26 1.004953 2023 01 26
需求说明
需要为每行日期计算daily_return的年初至今(YTD)标准差,规则如下:
- 行
2018-12-31:计算2018年12月1日至31日期间的daily_return标准差,对应数据为[NaN, 1.020245, 1.000650] - 行
2019-01-03:仅计算2019年1月1日至3日的daily_return标准差,对应数据为[1.020473, 1.009129] - 行
2023-01-23:计算2023年1月1日至23日的所有daily_return标准差 - 行
2023-01-24:计算2023年1月1日至24日的所有daily_return标准差
已实现的相关功能
已通过以下代码实现月初至今(MTD)累积乘积:
df.groupby(['month', 'year'])['daily_return'].cumprod()
执行结果:
date 2018-12-27 NaN 2018-12-28 1.020245 2018-12-31 1.020909 2019-01-02 1.020473 2019-01-03 1.029789 ... 2023-01-20 0.999914 2023-01-23 0.998369 2023-01-24 1.000856 2023-01-25 1.005342 2023-01-26 1.010322
遇到的问题
尝试按年份分组计算标准差时,仅得到全年的整体标准差,而非每行对应的年初至今累积标准差:
df.groupby(['year'])['daily_return'].std()
执行结果:
year 2018 0.013856 2019 0.007128 2020 0.021325 2021 0.010358 2022 0.009854 2023 0.006444
解决方案
使用groupby结合expanding().std(),expanding()会对每个年份组内的数据进行累积计算,即从组内第一个数据到当前行的所有数据计算标准差:
df['ytd_std'] = df.groupby('year')['daily_return'].expanding().std().reset_index(level=0, drop=True)
结果说明
- 对于
2018-12-27:组内只有当前行的NaN,结果为NaN - 对于
2018-12-28:组内有效数据仅1个,标准差为NaN - 对于
2018-12-31:基于组内有效数据[1.020245, 1.000650]计算标准差 - 后续年份的每行都会自动累积计算当年截至当前日期的
daily_return标准差,完全符合需求
内容的提问来源于stack exchange,提问作者Pedro Rossi
相关产品推荐
相关产品推荐

