【问题标题】:converting daily Total Returns and Prices to annual values in R将每日总回报和价格转换为 R 中的年度值
【发布时间】:2017-04-02 04:39:59
【问题描述】:

我有一些银行从 1997 年到 2015 年的每日总回报和股票价格数据,例如:

DATE         Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P  ... and so on for all other banks
01/01/1997         103.13           10.43       NA       NA
02/01/1997         104.66           11.12   153.89    23.08
03/01/1997            ...             ...      ...      ...
...and so on
for all other
days until
31/12/2015

使用 R,我需要将它们转换为“年中值”,以便为每个银行获得总回报和价格的单个年中值,显然,为了制作面板数据集。

nb:数据包含大量缺失值,代码必须考虑这个问题! :)

【问题讨论】:

  • 可以查看quantmod包。

标签: r dataset time-series missing-data panel-data


【解决方案1】:

您可以使用formatDATE 中提取年份(一旦转换为Date 类)将日期转换为日期的年份。然后使用dplyr:

library(dplyr)
res <- df %>% group_by(Year=format(as.Date(DATE,format="%d/%m/%Y"),"%Y")) %>% 
              summarise_at(vars(-DATE), median, na.rm=TRUE)

我们首先将group_by 转换为Year,然后我们使用summarise_at 汇总除DATE 之外的每一列的median。请注意,我们将参数na.rm=TRUE 传递给median 以忽略NA

或者使用aggregate:

df$Year <- format(as.Date(df$DATE,format="%d/%m/%Y"),"%Y")
df <- df[,!(names(df)=="DATE")]
res <- aggregate(. ~ Year, data=df, FUN=median, na.rm=TRUE, na.action=NULL)

在这里,我们预处理df 以将DATE 列更改为Year,并使用公式. ~ Year 指定聚合按Year 分组的所有列。请注意,在 aggregate 中,我们指定了 na.action=NULL,因为默认的 na.action will remove rows that have anyNA. Instead, we passna.rm=TRUEto the functionmedianto handleNA's。

为了说明,我扩充了您发布的数据:

df <- structure(list(DATE = c("01/01/1997", "02/01/1997", "03/01/1997", 
"04/01/1997", "01/01/1998", "02/01/1998", "03/01/1998", "04/01/1998"
), Bank1_TotalReturn = c(103.13, 104.66, 105.23, NA, 113.13, 
114.66, 115.23, NA), Bank1_Price = c(10.43, 11.12, 12.15, NA, 
11.43, 12.12, NA, 13.15), Bank2_TR = c(NA, 153.89, 145.89, 136.89, 
140.92, 153.89, 145.89, 146.89), Bank2_P = c(NA, 23.08, NA, NA, 
20.9, 23.08, 25.73, 25.98)), .Names = c("DATE", "Bank1_TotalReturn", 
"Bank1_Price", "Bank2_TR", "Bank2_P"), class = "data.frame", row.names = c(NA, 
-8L))
##        DATE Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P
##1 01/01/1997            103.13       10.43       NA      NA
##2 02/01/1997            104.66       11.12   153.89   23.08
##3 03/01/1997            105.23       12.15   145.89      NA
##4 04/01/1997                NA          NA   136.89      NA
##5 01/01/1998            113.13       11.43   140.92   20.90
##6 02/01/1998            114.66       12.12   153.89   23.08
##7 03/01/1998            115.23          NA   145.89   25.73
##8 04/01/1998                NA       13.15   146.89   25.98

使用这两种方法的数据,结果是:

print(res)
##   Year Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P
##1  1997            104.66       11.12   145.89  23.080
##2  1998            114.66       12.12   146.39  24.405

如果目的是计算平均值而不是中位数,则只需将 mean 替换为 median。对于aggregate 解决方案:

res <- aggregate(. ~ Year, data=df, FUN=mean, na.rm=TRUE, na.action=NULL)
print(res)
##  Year Bank1_TotalReturn Bank1_Price Bank2_TR Bank2_P
##1 1997            104.34    11.23333 145.5567 23.0800
##2 1998            114.34    12.23333 146.8975 23.9225

【讨论】:

  • 非常感谢,但我有一个疑问:为什么您使用“中位数”而不是“平均值”函数来转换值?只是为了理解潜在的推理:)
  • 当你说中等时,我以为你的意思是median。你也可以在那里使用mean。如果那是你想要的。请查看我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2013-12-31
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多