【问题标题】:handling calculations with date changes in xts - R处理 xts - R 中日期变化的计算
【发布时间】:2021-06-09 02:30:18
【问题描述】:

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

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

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

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)

那么如何计算盘中时段的三个小时回报率。

【问题讨论】:

    标签: r time-series tidyverse xts tibble


    【解决方案1】:

    计算所有回报然后删除隔夜回报可能更容易。为了获得 15 分钟的回报,您可以使用这些间隔创建时间序列,然后对缩减的数据运行计算。

    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
    

    【讨论】:

    • 感谢您的回复。我通过创建一个具有不同连续日期的列来尝试此操作。每当此列为 1(日期已更改)时,忽略该特定行的返回值。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2021-12-29
    相关资源
    最近更新 更多