在R中1分钟的条形中创建5分钟的条形

时间:2018-04-08 07:59:18

标签: r currency price trading stocks

我有这些数据

  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

OHLC分钟的1价格。我想找到5分钟的OHLC条。 OpenClose很简单,但我不知道如何HighLow

我需要在数据的子集中找到maximum/minimum值。 首先,我需要找到max(data[1:5,2])然后max(data[6:10,2]),依此类推。我需要将值放在名为High的向量中。对于Low价格min(data[1:5,3])

我需要像for loop这样的两个变量。

2 个答案:

答案 0 :(得分:0)

我不知道你的数据集有多大。但是,then(...)在这种情况下会很慢。就个人而言,我宁愿选择for loop函数,特别是已在aggregate中实现的函数。

我们要做的第一件事就是创建索引允许我们在每个子群上执行此功能。每个亚组包含5分钟的OHLC。

因此,让我们从阅读数据开始

阅读表格

Rbase

增加df 的大小,以更好地模拟实际用例场景。

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 <- rbind(df,df,df,df) recycling函数

cumsum()

现在,最后我们可以获得每5个OHLC 5分钟条的最小值和最大值,并将它们插入最终向量df$group <- c(1,0,0,0,0) df$group <- cumsum(df$group) High

Low

High <- aggregate(High ~ group, data = df, FUN = max)$High Low <- aggregate(Low ~ group, data = df, FUN = min)$Low

给出了更快的聚合替代方法
data.table

答案 1 :(得分:0)

基于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)