处理 xts - R 中日期变化的计算

handling calculations with date changes in xts - R

我有一个 xts 格式的股票数据集,其中包含一年的数据(以分钟为单位)。 我需要计算 returns,但仅限于同一日期的期间。 在避免今天第一次观察和昨天最后一次观察的 returns 的同时不计算 returns 的最有效方法是什么。

同理,如果要计算-15分钟returns,那么如何避免计算不在同一天的时段呢?

我包括一个以小时为周期的玩具数据集(因为原始数据集是分钟级的)

time_index <- seq(from = as.POSIXct("2021-01-01 07:00"), to = as.POSIXct("2021-02-28 18:00"), by = "hour")
set.seed(1)
value <- 100 + rnorm(n = length(time_index))
eventdata <- xts(value, order.by = time_index)

那么如何计算日内三个小时 returns。

计算所有 returns 然后删除隔夜的可能更容易。要获得 15 分钟 returns,您可以创建具有这些间隔的时间序列,然后 运行 对减少的数据进行计算。

library(xts)
library(lubridate)
library(TTR)

time_index <-
  seq(
    from = as.POSIXct("2021-01-01 07:00"),
    to = as.POSIXct("2021-02-28 18:00"),
    by = "hour"
  )
set.seed(1)
value <- 100 + rnorm(n = length(time_index))
eventdata <- xts(value, order.by = time_index)

# compute hourly returns and drop first observation per day
res <- TTR::ROC(eventdata, type = "discrete")
res2 <- res[-xts:::startof(res, by = "days")]

> head(res2)
                           [,1]
2021-01-01 08:00:00  0.00815204
2021-01-01 09:00:00 -0.01017404
2021-01-01 10:00:00  0.02451394
2021-01-01 11:00:00 -0.01245897
2021-01-01 12:00:00 -0.01146199
2021-01-01 13:00:00  0.01318717

# compute 15-minute returns
time_index2 <-   seq(
  from = as.POSIXct("2021-01-01 07:00"),
  to = as.POSIXct("2021-01-01 18:00"),
  by = "min"
)

length(time_index2)

time_index3 <- seq(ymd_hms(from = '2021-01-01 07:00:00'), 
                   by = '15 min', length.out=(661))

testasset <- xts(rnorm(661, sd = 0.03), order.by = time_index2)

res3 <- TTR::ROC(testasset[time_index3], type = "discrete")
head(res3)

> head(res3)
                          [,1]
2021-01-01 08:00:00         NA
2021-01-01 08:15:00 -0.6516079
2021-01-01 08:30:00 -5.7101543
2021-01-01 08:45:00 -0.5411609
2021-01-01 09:00:00 -2.2945892
2021-01-01 09:15:00 -2.3038205