努力将1分钟的收盘价格数据转换为R中的5分钟

时间:2012-08-23 03:44:26

标签: r xts trading

最近问这个问题,建议使用' to.minutes5()'功能。但是,这样做会出现以下错误:

Error in to.period(x, "minutes", k = 5, name = name, ...) : 
unsupported type

我的原始文本文件包含分隔列的日期和时间:

GBPUSD<- read.table("GBPUSD.txt", sep=',')

head(GBPUSD)

  V1           V2     V3     V4     V5     V6      V7    V8               
1 <TICKER> <DTYYYYMMDD> <TIME> <OPEN> <HIGH>  <LOW> <CLOSE> <VOL> 
2   GBPUSD     20010102 230100 1.5021 1.5021 1.5018  1.5018     4   
3   GBPUSD     20010102 230200 1.5019 1.5019 1.5019  1.5019     4     
4   GBPUSD     20010102 230300 1.5018 1.5019 1.5018  1.5019     4     
5   GBPUSD     20010102 230400 1.5019 1.5019 1.5019  1.5019     4     
6   GBPUSD     20010102 230500 1.5017 1.5018 1.5017  1.5018     4   

因此,我采取的第一步是使用新的“TIME”列中的paste()函数将它们混合到一列中:

GBPUSD$Time <-paste(GBPUSD[,2],GBPUSD[,3],sep=",") 

之后我使用新合并的'TIME'(第9列)创建了POSIXct时间戳:

time<- as.POSIXct(GBPUSD[,9], format="%Y%m%d,%H%M%S")

然后我开始使用收盘价和时间创建一个xts时间序列:

gbp<- xts(GBPUSD[7], time)

然而,当我调用.minutes5(gbp)时,我收到错误。

如何在不运行循环的情况下将文本文件中的一分钟收盘价转换为5分钟的价格?

此外,我如何将1分钟OHLC转换为5分钟OHLC?

更新

当我尝试khoxsey提出的建议时,我在下一行收到错误:

raw_cable <- read.table(header=FALSE, text=data, col.names=cn, colClasses=cl)
"Error in textConnection(text) : invalid 'text' argument"

我认为这是因为我首先导入了一个表格数据框并删除了第一行:

data<- read.table("GBPUSD.txt", sep=',')
data <- data[-1,] #deleted the initial header to add at a later step, as suggested

1 个答案:

答案 0 :(得分:2)

你并没有完全提供所有的代码,所以很难确切地告诉你哪里出错了,但是你非常接近。我复制了一些数据以获得更多观察结果并使用您的格式来获取时间字符串。 (顺便说一下,timeR中的一个函数,因此您可以将其变量称为其他内容。

第一块代码是可选的,只需要一些设置来获取包含代表性数据的数据框,然后将您的设置调用as.POSIXct来创建我们的索引:

forex_data <- "GBPUSD 20010102 230000 1.5021 1.5021 1.5018 1.5018 4
GBPUSD 20010102 230100 1.5021 1.5021 1.5018 1.5018 4
GBPUSD 20010102 230200 1.5019 1.5019 1.5019 1.5019 4
GBPUSD 20010102 230300 1.5018 1.5019 1.5018 1.5019 4
GBPUSD 20010102 230400 1.5019 1.5019 1.5019 1.5019 4
GBPUSD 20010102 230500 1.5017 1.5018 1.5017 1.5018 4
GBPUSD 20010102 230600 1.5019 1.5019 1.5019 1.5019 4
GBPUSD 20010102 230700 1.5018 1.5019 1.5018 1.5019 4
GBPUSD 20010102 230800 1.5019 1.5019 1.5019 1.5019 4
GBPUSD 20010102 230900 1.5017 1.5018 1.5017 1.5018 4
GBPUSD 20010102 231000 1.5017 1.5018 1.5017 1.5018 4"

cn <- c('TICKER','DTYYYYMMDD','TIME','OPEN','HIGH','LOW','CLOSE','Volume')
cl <- c(rep('character', 3), rep('numeric', 5))
raw_cable <- read.table(header=FALSE, text=forex_data, col.names=cn, colClasses=cl)

dt_tm <-as.POSIXct(paste(raw_cable[,2], raw_cable[,3],sep=","), format="%Y%m%d,%H%M%S")

现在我们有一个包含数据的data.frame和一个合适的索引向量,我们只使用价格和数据数据创建一个xts对象。在这里,这意味着最后5列。

require(xts)  
cable <- xts(raw_cable[,4:8], order.by=dt_tm)

最后,使用格式良好的xts对象,很容易累积到5分钟。有关其他可能性的信息,请参阅to.period的文档。这里要注意的一件重要事情是设置indexAt参数,这允许我们选择使用哪个结束分钟。为了好玩,请尝试文档中的其他可能性。

to.minutes5(cable, indexAt='startof', name=NULL)

                      Open   High    Low  Close Volume
2001-01-02 23:00:00 1.5021 1.5021 1.5018 1.5019     20
2001-01-02 23:05:00 1.5017 1.5019 1.5017 1.5018     20
2001-01-02 23:10:00 1.5017 1.5018 1.5017 1.5018      4