r - 计算每月的权重差异
问题描述
我正在处理一些投资组合数据,但我对这种数据操作感到困惑。我有这个样本数据
df <- tibble(
date = as.Date(c("2020-01-31", "2020-01-31", "2020-01-31",
"2020-02-29", "2020-02-29", "2020-02-29",
"2020-03-31", "2020-03-31", "2020-03-31") ),
id = c("KO", "AAPL", "MSFT",
"KO", "AAPL", "GOOG",
"KO", "AAPL", "MSFT"),
weight = c(0.3, 0.4, 0.3,
0.5, 0.3, 0.2,
0.6, 0.2, 0.2),
`weight_change (desired column)` = c(NA, NA, NA,
0.2, -0.1, 0.2,
0.1, -0.1, 0.2)
)
这些是样本投资组合中的头寸。投资组合每个月都会获得新的权重。我要计算的是每个项目的重量变化在前几个月的重量方面。在这个例子中,我们看到在 2 月底,KO 的当前权重为 0.5,比上个月增加了 0.2。AAPL 下降了 0.1,而 GOOG 取代了 MSFT,因此与上个月的变化是其当前的全部权重:0.2。如何设置变异,使其查找前一个日期的股票并计算权重之间的差异?
解决方案
如果每个“id”的数据是每月的,我们可以做一个complete
来考虑缺失的月份,然后做一个分组diff
library(dplyr)
library(tidyr)
library(zoo)
df %>%
mutate(yearmonth = as.Date(as.yearmon(date))) %>%
group_by(id) %>%
complete(yearmonth = seq(first(yearmonth), last(yearmonth), by = '1 month')) %>%
mutate(weight_change = if(n() == 1) weight else c(NA, diff(replace_na(weight, 0)))) %>%
ungroup %>%
select(names(df), weight_change) %>%
filter(!is.na(date))
# A tibble: 9 x 5
# date id weight `weight_change (desired column)` weight_change
# <date> <chr> <dbl> <dbl> <dbl>
#1 2020-01-31 AAPL 0.4 NA NA
#2 2020-02-29 AAPL 0.3 -0.1 -0.1
#3 2020-03-31 AAPL 0.2 -0.1 -0.100
#4 2020-02-29 GOOG 0.2 0.2 0.2
#5 2020-01-31 KO 0.3 NA NA
#6 2020-02-29 KO 0.5 0.2 0.2
#7 2020-03-31 KO 0.6 0.1 0.100
#8 2020-01-31 MSFT 0.3 NA NA
#9 2020-03-31 MSFT 0.2 0.2 0.2
推荐阅读
- python - 为什么 pandas diff 返回 -1e-09 而不是 0?
- xamarin - 使用 PdfSharp.Xamarin.Forms 创建 PDF 时无法显示 ListView 数据
- node.js - 强大的在Node js中保存没有扩展名的文件
- android - 在 Room Database Android 的 @Dao 文件中找不到 @Entity 类名
- reactjs - 如何将 React 应用程序部署到 azure 并更改默认页面
- python - 在节点js中将一个目录中的文件打开到另一个目录
- apache-spark - 过滤 RDD 以返回
- javascript - 如何在 react-tabulator 中插入新行
- gradle - dependsOn 另一个带有参数值的任务
- mysql - 无法在虚拟环境中为 django 安装 mysqlclient