【问题标题】:Sum xts elements on a list row by row逐行对列表中的 xts 元素求和
【发布时间】:2016-12-22 02:05:37
【问题描述】:

我有一个名为 data 的 xts 对象,其中包含从 2015-01-01 17:00:00 到 2015-12-31 17:00:00 期间的 5 分钟回报。每个交易日从17:00:00开始,到次日同一时间结束,共计288个每日收益[(24小时*60分钟)/5分钟=288个日内收益]。回报表示为

head(data, 5)
                          DPRICE
2015-01-01 17:00:00 0.000000e+00
2015-01-01 17:05:00 9.797714e-05
2015-01-01 17:10:00 2.027022e-04
2015-01-01 17:15:00 2.735798e-04
2015-01-01 17:20:00 7.768653e-05

tail(data, 5)
                          DPRICE
2015-12-31 16:40:00 0.0001239429
2015-12-31 16:45:00 0.0001272704
2015-12-31 16:50:00 0.0010186764
2015-12-31 16:55:00 0.0006841370
2015-12-31 17:00:00 0.0002481227

根据 McMillan 和 Speight Daily FX Volatility Forecasts (2012),我正在尝试通过每 5 分钟日内间隔的平均绝对值对数据进行标准化。

数学公式是:

我的*代码是

library(xts)
std_data = abs(data) #create absolute returns
D <- split(std_data, "days") #splits data to days
mts.days <- lapply(seq_along(D) - 1, function(i) {
  if (i > 0) rbind(D[[i]]["T17:00:00/T23:55:00"], D[[i + 1]]["T00:00:00/T16:55:00"])
}) #creates a list with 365 elements each containing 288 unique returns
dummy = mapply(sum, mts.days) #add the first,second... observations from each element

使用这段代码,我创建了一个包含 365 个 xts 元素的列表,每个元素都有维度

> dim(mts.days[[2]])
[1] 288   1 

我想从每个元素中添加相同的观察结果来创建上述函数的分母。

【问题讨论】:

  • 所以您希望返回一个长度为 365*288 的向量?如果是这样,我会使用聚合操作,使用 dplyr 或 data.table
  • 虚拟值返回一个数字数组 [1:365],而我正在寻找添加列表 mts.days 中每个元素的第一个观察值。例如每天 17:00:00 返回,每天 17:05:00 等等。我认为mapplylapply 一样分别对每个元素的所有观察值求和。我希望返回一个 288 行 x 1 列的向量(我猜)。然后我想 std_data / dummy 并标准化返回。
  • @AllenWang 我不太确定如何使用 dplyr 或 data.table,因为我是 R 新手。对此感到抱歉

标签: r split subset xts quantitative-finance


【解决方案1】:

我不明白你的要求,但还是会试一试。

## generate bogus data
library(quantmod)
set.seed(123)
ndays <- 3
ndatperday <- 288
data <- cumsum(do.call("rbind", lapply(13:15, function(dd){
    xts(rnorm(ndatperday)/1e4,
        seq(as.POSIXct(paste0("2016-08-",dd," 17:00:00")),
            length = ndatperday, by = 300))

})))
colnames(data) <- "DPRICE"

## calculate percentage returns
ret <- ROC(data, type="discrete")

## this is probably not what you need: returns divided by the overall mean
ret/mean(abs(ret), na.rm=T)

## I suspect indeed that you need returns divided by the daily mean return
library(dplyr)
ret.df <- data.frame(ret)
## create a factor identifying the 3 days of bogus data
ret.df$day <- rep(paste0("2016-08-",13:15),each=ndatperday)
## compute daily mean return
dail <- ret.df %>%
    group_by(day) %>%
    summarise(mean=mean(abs(DPRICE), na.rm=TRUE))
## attach daily mean returns to the days they actually are associated to
ret.df <- ret.df %>% left_join(dail)
## normalize
ret.df$DPRICE <- ret.df$DPRICE/ret.df$mean

%%%%%%%%%

第二个镜头:读完论文 (http://onlinelibrary.wiley.com/doi/10.1002/for.1222/full) 我可能已经明白你的目的了:

library(quantmod)
library(dplyr)
set.seed(123)

## generate bogus 5-min series
ndays <- 365
ndatperday <- 288
data <- as.xts(zoo(0.1+cumsum(rt(ndays*ndatperday, df=3))/1e4,
                  seq(as.POSIXct("2015-01-01 17:00"),
                      as.POSIXct("2015-12-31 17:00"), by=300)))
colnames(data) <- "DPRICE"

## calculate 5-min percentage returns
ret <- ROC(data, type="discrete")

## create a factor identifying the 5-minute intra-day interval
ret.df <- as.data.frame(ret)
ret.df$intra5 <- strftime(index(ret), format="%H:%M")

## compute mean returns (over the year) for each of the 288 5-minute intra-day intervals
dail <- ret.df %>%
    group_by(intra5) %>%
    summarise(mean=mean(abs(DPRICE), na.rm=TRUE))

## attach mean returns to each datapoint
ret.df <- ret.df %>% left_join(dail)

## normalize
ret.df$DPRICE <- ret.df$DPRICE/ret.df$mean

【讨论】:

  • 感谢您的努力。这个答案让我回到 Andersen 和 Bollerslev 的实际论文,仔细检查我是否理解回报标准化的定义。一个错误是 summarise(mean=mean(abs(DPRICE), na.rm=TRUE)),因为 1/T 等于 1/365,所以可能像 summarise(mean=mean(abs(DPRICE)*(1/365), na.rm=TRUE)) 这样的东西更合适。
  • summarise(mean=sum​(abs(DPRICE)/365, na.rm=TRUE));此外,尚不清楚T=1128 的来源。
  • sorry 1128是原论文实现的天数T。我必须修复它。
  • 好的,我检查过了。这不是您提到的## I suspect indeed that you need returns divided by the daily mean return 的每日平均回报,而是每 5 分钟间隔的平均回报。 交易日从每天 17:00 开始,并在次日17:00。
  • 没有一百万个投票按钮可以点击您的答案。我非常感谢你的努力。这是我使用 R 的第一个月,它的魔力每天都在展现。仍然每个工具都与其用户一样强大,您先生是专家。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 2018-09-09
  • 1970-01-01
  • 2019-02-23
  • 2014-05-18
  • 1970-01-01
  • 2018-05-17
  • 2018-12-02
相关资源
最近更新 更多