Как получить оценку высокой и низкой цены по внутридневным данным?
У меня есть следующие данные:
dput(head(trade.wide,10))
structure(c(54.7, 54.5, 54.5, 54.6, 54.65, 54.6, 54.65, 54.65,
54.65, 54.7), .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "", tclass = c("POSIXct",
"POSIXt"), tzone = "", class = c("xts", "zoo"), index = structure(c(1459482300,
1459482302, 1459482305, 1459482306, 1459482307, 1459482308, 1459482312,
1459482314, 1459482315, 1459482317), tzone = "", tclass = c("POSIXct",
"POSIXt")), .Dim = c(10L, 1L), .Dimnames = list(NULL, "PRICE"))
dput(tail(trade.wide,10))
structure(c(84.15, 84.1, 84.1, 84.05, 84.1, 84.05, 84, 84.1,
84.1, 84.2), .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "", tclass = c("POSIXct",
"POSIXt"), tzone = "", class = c("xts", "zoo"), index = structure(c(1472637583,
1472637584, 1472637585, 1472637586, 1472637588, 1472637595, 1472637596,
1472637597, 1472637598, 1472637600), tzone = "", tclass = c("POSIXct",
"POSIXt")), .Dim = c(10L, 1L), .Dimnames = list(NULL, "PRICE"))
Я пытаюсь оценить максимум и минимум в течение 30-минутных интервалов от начала (9:15:00).
df.OHLC<-to.period(trade.wide,period = "minutes", k=30, indexAt="startof")
Вот что я получаю:
head(df.OHLC,10)
trade.wide.Open trade.wide.High trade.wide.Low trade.wide.Close
2016-04-01 09:15:00 54.70 54.85 54.05 54.65
2016-04-01 09:30:07 54.65 56.50 54.65 56.05
2016-04-01 10:00:02 56.15 56.15 55.75 55.85
2016-04-01 10:30:03 55.80 56.20 55.70 56.10
2016-04-01 11:00:12 56.10 56.35 55.75 55.75
2016-04-01 11:30:12 55.75 55.80 55.40 55.50
2016-04-01 12:00:20 55.50 55.70 55.45 55.60
2016-04-01 12:30:24 55.55 55.75 55.25 55.50
2016-04-01 13:00:10 55.50 56.40 55.35 55.90
2016-04-01 13:30:17 55.85 57.35 55.75 57.20
Однако, у него есть метки времени 09:15:00, 09:30:07, 10:00:02,... Что мне нужно, это 09:15:00, 09:45:00, 10:15:00,.. Я также пытался period.max()
функция, но у него также есть похожие проблемы.
df.OHLC1<- do.call(rbind, lapply(split(trade.wide, "days"),function(x) period.max(x,endpoints(x,on= "minutes",k=30))))
head(df.OHLC1,10)
[,1]
2016-04-01 09:29:59 54.85
2016-04-01 09:59:56 56.50
2016-04-01 10:29:53 56.15
2016-04-01 10:59:59 56.20
2016-04-01 11:29:54 56.35
2016-04-01 11:59:52 55.80
2016-04-01 12:29:59 55.70
2016-04-01 12:59:54 55.75
2016-04-01 13:29:45 56.40
2016-04-01 13:59:59 57.35
tail(df.OHLC1)
[,1]
2016-08-31 13:29:59 86.55
2016-08-31 13:59:56 86.30
2016-08-31 14:29:59 85.85
2016-08-31 14:59:59 85.15
2016-08-31 15:29:58 84.90
2016-08-31 15:30:00 84.20
Интересно, почему эти функции несоразмерно делят время? Пожалуйста, помогите мне решить эту проблему. Спасибо
1 ответ
Используя ваши примеры данных, я получаю сначала:
trade.wide <- readRDS("sample")
df.OHLC <- to.period(trade.wide, period = "minutes", k = 30, indexAt = "startof")
head(df.OHLC, n = 4)
## trade.wide.Open trade.wide.High trade.wide.Low trade.wide.Close
## 2016-04-01 05:45:00 54.70 54.85 54.05 54.65
## 2016-04-01 06:00:07 54.65 56.50 54.65 56.05
## 2016-04-01 06:30:02 56.15 56.15 55.75 55.85
## 2016-04-01 07:00:03 55.80 56.20 55.70 56.10
Указанные метки времени на самом деле являются первыми в интервале, которые присутствуют в trade.wide
, Вы можете выровнять их с фактическими границами интервалов, используя align.time()
:
aligned <- align.time(df.OHLC, n = 30*60)
head(aligned, n = 4)
## trade.wide.Open trade.wide.High trade.wide.Low trade.wide.Close
## 2016-04-01 06:00:00 54.70 54.85 54.05 54.65
## 2016-04-01 06:30:00 54.65 56.50 54.65 56.05
## 2016-04-01 07:00:00 56.15 56.15 55.75 55.85
## 2016-04-01 07:30:00 55.80 56.20 55.70 56.1
В aligned
строки помечены временем в конце интервала, потому что align.time
округляет до следующих 30 кратных 30 минут. Если вы хотите пометить их временем в начале интервала, вам нужно вычесть 30 минут из отметок времени следующим образом:
index(aligned) <- index(aligned) - 30*60
head(aligned, n = 4)
## trade.wide.Open trade.wide.High trade.wide.Low trade.wide.Close
## 2016-04-01 05:30:00 54.70 54.85 54.05 54.65
## 2016-04-01 06:00:00 54.65 56.50 54.65 56.05
## 2016-04-01 06:30:00 56.15 56.15 55.75 55.85
## 2016-04-01 07:00:00 55.80 56.20 55.70 56.10
(см. Как я могу изменить временной ряд (XTS или ZOO) в R?)
Интервалы выбираются как 00:00
, 00:30
, 01:00
и т. д. Если вы хотите интервалы, такие как 00:15
, 00:45
, 01:15
и т. д. вы можете начать с вычитания 15 минут из отметок времени, а затем выполнить процедуру, аналогичную приведенной выше:
index(trade.wide) <- index(trade.wide) - 15*60
df.OHLC <- to.period(trade.wide, period = "minutes", k = 30, indexAt = "startof")
aligned <- align.time(df.OHLC, n = 30*60)
index(aligned) <- index(aligned) - 15*60
head(aligned, n = 4)
## trade.wide.Open trade.wide.High trade.wide.Low trade.wide.Close
## 2016-04-01 05:45:00 54.70 55.65 54.05 55.65
## 2016-04-01 06:15:00 55.60 56.50 55.30 55.90
## 2016-04-01 06:45:00 55.85 56.20 55.70 55.85
## 2016-04-01 07:15:00 55.85 56.35 55.70 55.90