在 R 中从 1 分钟条中创建 5 分钟条
Create 5 min bars out of 1 min bars in R
我有这些数据
Open High Low Close
1 6709.0 6709.5 6703.5 6705.0
2 6705.0 6710.5 6705.0 6710.0
3 6710.5 6713.5 6710.5 6713.5
4 6713.5 6713.5 6711.5 6712.0
5 6712.5 6715.0 6712.5 6714.0
6 6714.0 6716.0 6713.5 6716.0
这是 1
分钟柱的 OHLC
价格。我想找到 OHLC
个 5 分钟柱。
Open
和 Close
很简单,但我不知道 High
和 Low
.
怎么做
我需要在数据子集中找到 maximum/minimum
值。
所以首先我需要找到 max(data[1:5,2])
然后 max(data[6:10,2])
等等。我需要将这些值放在一个名为 High
的向量中。 Low
价格 min(data[1:5,3])
。
我需要带有两个变量的 for loop
之类的东西。
我不知道你的数据集有多大。但是,for loop
在这种情况下会很慢。就个人而言,我宁愿选择 aggregate
功能,具体来说,已经在 Rbase
.
中实现的功能
我们要做的第一件事是创建一个索引,它将允许我们在每个子组上执行该功能。每个子组包含 5 分钟柱的 OHLC。
因此,让我们从读取数据开始
阅读 table
df <- read.table(text = "Open High Low Close
+ 1 6709.0 6709.5 6703.5 6705.0
+
+ 2 6705.0 6710.5 6705.0 6710.0
+
+ 3 6710.5 6713.5 6710.5 6713.5
+
+ 4 6713.5 6713.5 6711.5 6712.0
+
+ 5 6712.5 6715.0 6712.5 6714.0")
增加 df 的大小 以更好地模拟真实用例场景。
df <- rbind(df,df,df,df)
创建索引,首先使用向量recycling
和cumsum()
函数
df$group <- c(1,0,0,0,0)
df$group <- cumsum(df$group)
现在,我们终于可以获取每 5 个 OHLC 5 分钟柱的最小值和最大值,并将它们插入到您的最终向量中,High
和 Low
High <- aggregate(High ~ group, data = df, FUN = max)$High
Low <- aggregate(Low ~ group, data = df, FUN = min)$Low
data.table
包
提供了一种更快的聚合替代方案
require(data.table)
dt <- data.table(df)
High <- dt[ , max(High), by = group]$V1
Low <- dt[ , min(Low), by = group]$V1
基于 dplyr
的解决方案甚至可以在行不是 5
的倍数时使用 ceiling
创建组来实现。
library(dplyr)
# Prepare large data.frame
df_mod <- bind_rows(df,df,df,df,df)
df_mod %>%
group_by(grp = ceiling(row_number()/5)) %>%
summarise(High = max(High), Low = min(Low)) %>%
select(-grp) %>%
as.data.frame()
# grp High Low
# 1 1 6715 6703.5
# 2 2 6716 6703.5
# 3 3 6716 6703.5
# 4 4 6716 6703.5
# 5 5 6716 6703.5
# 6 6 6716 6705.0
数据
#As provided an example by OP
df <- read.table( text =
"Open High Low Close
1 6709.0 6709.5 6703.5 6705.0
2 6705.0 6710.5 6705.0 6710.0
3 6710.5 6713.5 6710.5 6713.5
4 6713.5 6713.5 6711.5 6712.0
5 6712.5 6715.0 6712.5 6714.0
6 6714.0 6716.0 6713.5 6716.0",
header = TRUE)
我有这些数据
Open High Low Close
1 6709.0 6709.5 6703.5 6705.0
2 6705.0 6710.5 6705.0 6710.0
3 6710.5 6713.5 6710.5 6713.5
4 6713.5 6713.5 6711.5 6712.0
5 6712.5 6715.0 6712.5 6714.0
6 6714.0 6716.0 6713.5 6716.0
这是 1
分钟柱的 OHLC
价格。我想找到 OHLC
个 5 分钟柱。
Open
和 Close
很简单,但我不知道 High
和 Low
.
我需要在数据子集中找到 maximum/minimum
值。
所以首先我需要找到 max(data[1:5,2])
然后 max(data[6:10,2])
等等。我需要将这些值放在一个名为 High
的向量中。 Low
价格 min(data[1:5,3])
。
我需要带有两个变量的 for loop
之类的东西。
我不知道你的数据集有多大。但是,for loop
在这种情况下会很慢。就个人而言,我宁愿选择 aggregate
功能,具体来说,已经在 Rbase
.
我们要做的第一件事是创建一个索引,它将允许我们在每个子组上执行该功能。每个子组包含 5 分钟柱的 OHLC。
因此,让我们从读取数据开始
阅读 table
df <- read.table(text = "Open High Low Close
+ 1 6709.0 6709.5 6703.5 6705.0
+
+ 2 6705.0 6710.5 6705.0 6710.0
+
+ 3 6710.5 6713.5 6710.5 6713.5
+
+ 4 6713.5 6713.5 6711.5 6712.0
+
+ 5 6712.5 6715.0 6712.5 6714.0")
增加 df 的大小 以更好地模拟真实用例场景。
df <- rbind(df,df,df,df)
创建索引,首先使用向量recycling
和cumsum()
函数
df$group <- c(1,0,0,0,0)
df$group <- cumsum(df$group)
现在,我们终于可以获取每 5 个 OHLC 5 分钟柱的最小值和最大值,并将它们插入到您的最终向量中,High
和 Low
High <- aggregate(High ~ group, data = df, FUN = max)$High
Low <- aggregate(Low ~ group, data = df, FUN = min)$Low
data.table
包
require(data.table)
dt <- data.table(df)
High <- dt[ , max(High), by = group]$V1
Low <- dt[ , min(Low), by = group]$V1
基于 dplyr
的解决方案甚至可以在行不是 5
的倍数时使用 ceiling
创建组来实现。
library(dplyr)
# Prepare large data.frame
df_mod <- bind_rows(df,df,df,df,df)
df_mod %>%
group_by(grp = ceiling(row_number()/5)) %>%
summarise(High = max(High), Low = min(Low)) %>%
select(-grp) %>%
as.data.frame()
# grp High Low
# 1 1 6715 6703.5
# 2 2 6716 6703.5
# 3 3 6716 6703.5
# 4 4 6716 6703.5
# 5 5 6716 6703.5
# 6 6 6716 6705.0
数据
#As provided an example by OP
df <- read.table( text =
"Open High Low Close
1 6709.0 6709.5 6703.5 6705.0
2 6705.0 6710.5 6705.0 6710.0
3 6710.5 6713.5 6710.5 6713.5
4 6713.5 6713.5 6711.5 6712.0
5 6712.5 6715.0 6712.5 6714.0
6 6714.0 6716.0 6713.5 6716.0",
header = TRUE)