2

最近问了这个问题,并被建议使用' 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   

所以我采取的第一步是使用新的“时间”列中的 paste() 函数将它们混合到一个列中:

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

之后,我使用新合并的“时间”(第 9 列)创建了一个 POSIXct 时间戳:

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

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

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

但是,当我调用 to.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
4

1 回答 1

2

你并没有完全提供你所有的代码,所以很难准确地说出你哪里出错了,但你已经很接近了。我复制了您的一些数据以获得更多观察结果,并使用您的格式来获取时间字符串。(顺便说一句,time是一个函数,R因此您可以将变量称为其他名称)。

第一段代码是可选的,只是一些设置来获取包含代表性数据的数据框,并调用您的设置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
于 2012-08-23T04:26:22.733 回答