将几个季度报告的季度股息年化

Annualizing quarterly dividends reported over several quarters

我有一家假设公司在过去五年的季度股息支付历史。这是可重现的代码:

Date<-as.Date(c("2013-11-01", "2014-02-01", "2014-05-01", "2014-08-01", "2014-11-01", "2015-02-01", "2015-05-01", "2015-08-01", "2015-11-01", "2016-02-01", "2016-05-01", "2016-08-01", "2016-11-01", "2017-02-01", "2017-05-01", "2017-08-01", "2017-11-01", "2018-02-01", "2018-05-01", "2018-08-01"))
Dividend<-c(0.08, 0.10, 0.10, 0.10, 0.10, 0.11, 0.00, 0.11, 0.11, 0.13, 0.13, 0.13, 0.13, 0.14, 0.14, 0.00, 0.16, 0.15, 0.15, 0.15)
data.frame(Date,Dividend)

具有以下输出:

         Date Dividend
1  2013-11-01     0.08
2  2014-02-01     0.10
3  2014-05-01     0.10
4  2014-08-01     0.10
5  2014-11-01     0.10
6  2015-02-01     0.11
7  2015-05-01     0.00
8  2015-08-01     0.11
9  2015-11-01     0.11
10 2016-02-01     0.13
11 2016-05-01     0.13
12 2016-08-01     0.13
13 2016-11-01     0.13
14 2017-02-01     0.14
15 2017-05-01     0.14
16 2017-08-01     0.00
17 2017-11-01     0.16
18 2018-02-01     0.15
19 2018-05-01     0.15
20 2018-08-01     0.15

我的问题是如何将其转换为显示每个完整年份支付的股息的输出,如果第一年和最后一年不完整(如本例中的 2013 年和 2018 年)则忽略它们,并且不假设年度股息始终等于季度股息 x 4(在我的示例中,2015 年和 2017 年没有相同数量的季度股息)。

所以输出看起来像这样:

Date    Dividend
2014    0.40
2015    0.33
2016    0.52
2017    0.44

我们可以从数据框中删除最大值和最小值 year,然后按 year 分组并求和。

library(dplyr)
library(lubridate)

df %>%
  filter(year(Date) != min(year(Date)) & year(Date) != max(year(Date))) %>%
  group_by(year = year(Date)) %>%
  summarise(Dividend = sum(Dividend))

#   year Dividend
#  <dbl>    <dbl>
#1  2014     0.4 
#2  2015     0.33
#3  2016     0.52
#4  2017     0.44

它的基础 R 等价物是

df$Year <- as.numeric(format(df$Date, "%Y"))
aggregate(Dividend~Year, df[with(df, Year != min(Year) & Year != max(Year)), ],sum)

#  Year Dividend
#1 2014     0.40
#2 2015     0.33
#3 2016     0.52
#4 2017     0.44

有了data.table你可以试试

df<-data.frame(Date,Dividend)
library(data.table)
setDT(df)[,.(TotDiv=sum(Dividend)),
          by=year(Date), ][-c(which.min(year),which.max(year))]
   year TotDiv
1: 2014   0.40
2: 2015   0.33
3: 2016   0.52
4: 2017   0.44

不完整是怎么定义的?您知道该公司每年有 4 div 笔付款,或者 2 笔或 1 笔(或 12 笔)。根据你的推理 none 其他答案是正确的,因为他们只是假设不应该考虑第一年和最后一年,但是 2018 年 11 月第四次付款时会发生什么?

由于您使用的是 quantmod,因此数据应为 xts 格式。使用 apply.yearly 会将数据汇总到年度行,使用数据集中每一年的最后可用日期。我将函数的 FUN 部分用于 return 2 列,其中 1 列包含汇总的 dividends,1 列包含当年支付的 dividends 的数量。由于公司倾向于结构化 dividend 付款(1、2、4 或 12),您可以使用最大付款次数 div 来过滤掉不符合此要求的年份。

当您有特殊的 dividends 之类的东西不是每年都支付时,这可能会失败。此外,支付 dividends 的开始并不总是符合规则。 Microsoft 于 2013 年开始支付 dividends,并且只有 2 笔付款,之后是每季度付款。

df1 <- data.frame(Date = as.Date(c("2013-11-01", "2014-02-01", "2014-05-01", "2014-08-01", "2014-11-01", "2015-02-01", "2015-05-01", "2015-08-01", "2015-11-01", "2016-02-01", "2016-05-01", "2016-08-01", "2016-11-01", "2017-02-01", "2017-05-01", "2017-08-01", "2017-11-01", "2018-02-01", "2018-05-01", "2018-08-01")),
                  Dividend = c(0.08, 0.10, 0.10, 0.10, 0.10, 0.11, 0.00, 0.11, 0.11, 0.13, 0.13, 0.13, 0.13, 0.14, 0.14, 0.00, 0.16, 0.15, 0.15, 0.15))

# data in xts form since quantmod is being used.
my_xts <- xts(df1$Dividend, order.by = df1$Date)

annual_data <- apply.yearly(my_xts, function(x) as.matrix(data.frame(sum(x), length(x)))  )
names(annual_data) <- c("total_divs", "no_divs")

# filter data to include only maximum dividens
annual_data[annual_data$no_divs == max(annual_data$no_divs)]

           total_divs no_divs
2014-11-01       0.40       4
2015-11-01       0.33       4
2016-11-01       0.52       4
2017-11-01       0.44       4