【问题标题】:Create 5 min bars out of 1 min bars in R在 R 中从 1 分钟条中创建 5 分钟条
【发布时间】:2018-04-08 07:59:17
【问题描述】:

我有这些数据

  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 分钟柱。我想找到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(n in x){for (m in y){ High[i] <- max(data[n:m,2]) i=i+1 }} 这实际上可以工作,因为这样我就可以通过子集获得我想要的数据。但是我的电脑太慢了(data.frame 有 150 万行)。
  • 实际上,您的数据显示 6 个柱,所以我想创建大小为 6 的组。您需要创建 5 个柱的组吗?
  • 是的,每行是 1 分钟,所以我需要 5 人一组。我在帖子中输入的数据只是 head(data) 的输出。
  • 好的,非常感谢。

标签: r currency price trading stocks


【解决方案1】:

我不知道你的数据集有多大。但是,for loop 在这种情况下会很慢。就个人而言,我更愿意使用aggregate 函数,具体来说,已经在Rbase 中实现的函数。

我们要做的第一件事是创建一个索引,它将允许我们对每个子组执行功能。每个子组都包含 5 分钟柱的 OHLC。

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

阅读表格

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2018-06-30
      相关资源
      最近更新 更多