【问题标题】:How to handle irregularly spaced timeseries and returns a regularly spaced one如何处理不规则间隔的时间序列并返回规则间隔的时间序列
【发布时间】:2019-02-02 09:51:59
【问题描述】:

我有一个逐笔报价的股票价格数据集,我想将高频、不规则间隔的数据转换为频率较低、间隔规则的时间序列,以便以后进行数据分析。我在这里使用 R。

数据以 1 秒的频率跟踪每笔交易/报价的特定股票价值。因此,例如,在日期时间2009-07-16 13:30:01(参考下面的数据),在这一秒内有两个报价为145.88145.89

                   Date   Value
2009-07-16T13:30:01.000  145.88
2009-07-16T13:30:01.000  145.89
2009-07-16T13:30:02.000  145.57
2009-07-16T13:30:02.000  145.75
2009-07-16T13:30:03.000  145.65
2009-07-16T13:30:03.000  145.84
2009-07-16T13:30:03.000 145.776
2009-07-16T13:30:04.000  145.74
2009-07-16T13:30:04.000  145.68
2009-07-16T13:30:04.000  145.68
2009-07-16T13:30:04.000  145.76
2009-07-16T13:30:04.000  145.68
.
.
.

首先我想将数据转换成一个有规律的间隔时间序列,它只显示股票每秒的最新价值:

                   Date   Value
2009-07-16T13:30:01.000  145.89
2009-07-16T13:30:02.000  145.75
2009-07-16T13:30:03.000 145.776
2009-07-16T13:30:04.000  145.68
2009-07-16T13:30:05.000  145.76
2009-07-16T13:30:06.000  145.85
2009-07-16T13:30:07.000   145.8
2009-07-16T13:30:08.000  145.62
2009-07-16T13:30:09.000  145.85
2009-07-16T13:30:10.000  145.64
.
.
.

但最重要的是,我想将数据转换为定期间隔且频率较低的时间序列,例如 1 分钟,其中显示每分钟股票的最新价值:

                   Date  Value
2009-07-16T13:31:00.000 145.89
2009-07-16T13:32:00.000 145.53
2009-07-16T13:33:00.000 145.68
2009-07-16T13:34:00.000 145.14
2009-07-16T13:35:00.000  145.7
2009-07-16T13:36:00.000 145.83
2009-07-16T13:37:00.000 145.88
2009-07-16T13:38:00.000 145.62
2009-07-16T13:39.00.000 145.84
2009-07-16T13:40:00.000 145.63
.
.
.

我尝试使用 highfrequency 包中的 aggregatets(),但它没有返回我想要的结果。即使我在代码中指定了 1 分钟,日期时间也不是规则间隔且频率较低。

library(lubridate)
library(dplyr)
data$Date <- ymd_hms(data$Date)

library(xts)
data_xts <- as.xts(data[,"Value"], order.by=data[,"Date"])

library(highfrequency)
data_new <- aggregatets(data_xts, on="minutes", k=1)

我如何在 R 中做到这一点?

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @jay.sf 我在高频库下尝试过 aggregatets() 命令,但它没有给出我想要的结果......日期时间都混乱了,它不是规则间隔的,而不是低频
  • 感谢您添加代码,这是一个很好的问题!请参阅下面的答案。

标签: r datetime frequency


【解决方案1】:

之前进行聚合。

你得到的是这个。

> head(df1, 10)
                      date    value
1  2019-02-02T13:59:38.000 145.8922
2  2019-02-02T13:59:38.000 145.8820
3  2019-02-02T13:59:38.000 145.7998
4  2019-02-02T13:59:39.000 145.8122
5  2019-02-02T13:59:39.000 145.7355
6  2019-02-02T13:59:39.000 145.7822
7  2019-02-02T13:59:40.000 145.7078
8  2019-02-02T13:59:41.000 145.7133
9  2019-02-02T13:59:41.000 145.6906
10 2019-02-02T13:59:41.000 145.8749

现在我们使用aggregate()来获取每一秒的最新值(即每一秒的最高行号)。

df1.sec <- aggregate(value ~ date, df1, FUN=function(x) x[length(x)])
> head(df1.sec, 10)
                      date    value
1  2019-02-02T13:59:38.000 145.7998
2  2019-02-02T13:59:39.000 145.7822
3  2019-02-02T13:59:40.000 145.7078
4  2019-02-02T13:59:41.000 145.8749
5  2019-02-02T13:59:42.000 145.7630
6  2019-02-02T13:59:43.000 145.7921
7  2019-02-02T13:59:44.000 145.6459
8  2019-02-02T13:59:45.000 145.7680
9  2019-02-02T13:59:46.000 145.7966
10 2019-02-02T13:59:47.000 145.8542

然后我们通过substr() 删除秒来对分钟做同样的事情。

df1.min <- aggregate(value ~ substr(date, 1, 16), df1.sec, FUN=function(x) x[length(x)])
> head(df1.min, 10)
   substr(date, 1, 16)    value
1     2019-02-02T13:59 145.8073
2     2019-02-02T14:00 145.6909
3     2019-02-02T14:01 145.8617
4     2019-02-02T14:02 145.7452
5     2019-02-02T14:03 145.7080
6     2019-02-02T14:04 145.8530
7     2019-02-02T14:05 145.9772
8     2019-02-02T14:06 145.8247
9     2019-02-02T14:07 145.9125
10    2019-02-02T14:08 145.6915

(注意:如果重要的话,为了防止奇怪的列名"substr(date, 1, 16)",我们也可以这样做:)

# with(df1.sec, aggregate(list(value=value), by=list(date=substr(date, 1, 16)),
#                         FUN=function(x) x[length(x)]))
# #                date    value
# # 1  2019-02-03T09:43 146.0894
# # 2  2019-02-03T09:44 145.7456
# # ...

xts() 想要例如POSIXct 格式,所以我们转换一下。

df1.min$date.POSIX <- as.POSIXct(df1.min$`substr(date, 1, 16)`, format="%FT%H:%M")

现在我们可以在干净的数据上设置xts 对象。

library(xts)
data_xts <- xts(df1.min$value, order.by=df1.min$date.POSIX)

结果

> data_xts
                        [,1]
2019-02-02 13:59:00 145.8073
2019-02-02 14:00:00 145.6909
2019-02-02 14:01:00 145.8617
2019-02-02 14:02:00 145.7452
2019-02-02 14:03:00 145.7080
2019-02-02 14:04:00 145.8530
2019-02-02 14:05:00 145.9772
2019-02-02 14:06:00 145.8247
2019-02-02 14:07:00 145.9125
2019-02-02 14:08:00 145.6915

玩具数据

set.seed(42)
date <- as.POSIXct(unlist(sapply(as.matrix(1:1000), function(x) 
  rep(x, sample(1:3, 1))))[1:1000], origin=Sys.time())
df1 <- data.frame(date=date,
                  value=rnorm(1000, 145.8, 0.08962))
df1$date <- strftime(df1$date, format="%FT%H:%M:%S.000")

【讨论】:

  • 哇,非常感谢!我花了一些时间来理解一些代码,但我从中学到了很多:)
  • 检查!但我不能赞成你的回答,因为我没有 15 名声望......对此真的很抱歉 :( 我不熟悉这个论坛,但感谢你告诉我!一旦我获得足够的回报,我会回来投票声誉:)
  • 不客气@ChanYuEn。我相信你会在这里获得很多声誉:)
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多