【问题标题】:Pull Return from first business day of the month from XTS object using R使用 R 从 XTS 对象中提取每月第一个工作日的返回
【发布时间】:2012-06-12 10:10:38
【问题描述】:

我对 R 很陌生,所以如果我在解释这个问题时出现任何术语错误,我深表歉意。

我在 csv 文件中有一组每日返回数据,我已设法将其转换为 xts 对象。数据格式为:

           HighYield..EUR. MSCI.World..EUR.
2002-01-31          0.0144           0.0031    
2002-02-01          0.0056          -0.0132       
2002-02-02          0.0373           0.0356       
2002-02-03         -0.0167          -0.0644      
2002-02-04         -0.0062          -0.0332      
2002-02-05         -0.0874          -0.1112 
...

我想创建一个脚本,该脚本将找到该月的第一个工作日(从索引中的值范围),然后创建一个包含这些返回的新 xts 对象。

例如,在脚本运行后,我会有一个 xts 对象,格式如下:

           HighYield..EUR. MSCI.World..EUR.
2002-01-31          0.0144           0.0031    
2002-02-28          0.0011          -0.0112       
2002-03-31          0.0222           0.0224       
2002-04-30         -0.0333          -0.0223      
2002-05-30         -0.0011          -0.0012      
2002-06-30         -0.0888          -0.0967 
...

有人可以帮帮我吗?并尽可能解释脚本的每个部分在做什么。

【问题讨论】:

  • 您的示例显示了每个月的最后一天,但没关系。有很多方法可以提取特定日期,例如(伪代码)if (month(dateval[i]>month(dateval[i-1]) then { copy this i-th row to output}。首先查看 lubridate 包,了解有用的与日期相关的功能。

标签: r xts


【解决方案1】:

感谢基础 R 语言的强大功能,您可以在一行中完成此操作:

 library(xts)
 data(sample_matrix)
 x <- as.xts(sample_matrix)
 do.call(rbind, lapply(split(x, "months"), first))

解释每个步骤的作用:

 # Split the xts object into a list with an element for each month.
 x1 <- split(x, "months")
 # Loop over the list (x1) and call the first() function on each element.
 # This returns a new list where each element only contains the first observation
 # from each respective element in x1.
 x2 <- lapply(x1, first)
 # Call rbind() with all the elements of x2 as arguments to rbind()
 # Same as rbind(x2[[1]], x2[[2]], ..., x2[[N]])
 x3 <- do.call(rbind, x2)

【讨论】:

  • 约书亚,你是一位学者,一位绅士。我欠你的债。
  • 如果我们假设“第一个工作日”实际上不包括周六和周日,我们不应该使用do.call(rbind, lapply(split(x[.indexwday(x) %in% 1:5], "months"), first)) 吗?或者“xts”有没有更好的方法来做到这一点?
  • @mrdwab:是的,这很好。我的回答假设该对象仅包含工作日。你的更好,但仍然不排除任何潜在的假期。 timeDate 包有很好的功能。
  • @JoshuaUlrich,很酷。我只是好奇而已。我会看看你建议的套餐,虽然我会四处走动并猜测印度假期不属于那个套餐的一部分;)
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 2014-03-18
  • 2014-04-30
  • 2019-08-21
  • 2021-07-13
  • 2021-12-18
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多