4

我有一个要处理的 OHLC 股票报价数组。

             Open      High      Low        Close         Volume
2003-01-05   6111.01   6145.00   6102.70    6145.00         956
2003-01-08   6145.00   6190.00   5960.00    6135.05        8771
2003-01-09   6120.01   6250.00   6120.00    6225.00       10579
2003-01-10   6240.00   6285.00   6225.10    6261.00        8882
2003-01-13   6231.00   6325.00   6231.00    6270.00        8015
2003-01-14   6279.00   6295.00   6180.01    6190.00        8461

该公司对给定日期进行了拆分,因此我需要将该日期之前的所有打开、高、低、关闭列除以 1000。当我现在正在学习 R 基础知识时,我想为这项任务找出好的 R 解决方案。我设法编写的最好的代码是(无法找出如何应用于给定的列,stock$Open 不起作用):

apply(stock, 2, function(stock) stock/((index(stock)<"2007-07-20")*1000) )

但是,结果很奇怪,很多都是inf:

2006-10-26       Inf       Inf       Inf        Inf         Inf
2006-10-27       Inf       Inf       Inf        Inf         Inf
2006-10-30       Inf       Inf       Inf        Inf         Inf
2006-10-31       Inf       Inf       Inf        Inf         Inf
2006-11-01       Inf       Inf       Inf        Inf         Inf
2006-11-02       Inf       Inf       Inf        Inf         Inf
2006-11-03       Inf       Inf       Inf        Inf         Inf
2006-11-07       Inf       Inf       Inf        Inf         Inf

提前谢谢了!

4

3 回答 3

2

我不熟悉OHLC arrays,但假设 index 方法有效:

relevantRows<-index(stock) < "2007-07-20"

一旦你有了一个包含所有相关行的向量(实际上是一个逻辑向量,它为应该更改的行保存 TRUE),你可以像这样简单地使用它:

stock$Open[relevantRows]<-stock$Open[relevantRows]/1000

有可能(取决于OHLC arrays 的内部结构),即使这样也有效:

stock[relevantRows, c("Open", "High", "Low", "Close")]<-stock[relevantRows, c("Open", "High", "Low", "Close")]/1000
于 2011-10-14T11:28:02.697 回答
2

如果日期不在 20/7/2007 之前,则(index(stock)<"2007-07-20")is FALSEand so(index(stock)<"2007-07-20")*1000输出为零。您的Inf值是除以零的结果。

你可以试试这个:

stock[index(stock) < "2007-07-20", -5] <- stock[index(stock) < "2007-07-20", -5] / 1000
于 2011-10-14T11:35:33.127 回答
1

您可以使用adjRatiosTTR 包中的函数来执行此操作。看起来你已经有一个 xts 对象,所以这就是我使用的:

library(quantmod)
x <- structure(c(6111.01, 6145, 6120.01, 6240, 6231, 6279, 6145, 6190, 
6250, 6285, 6325, 6295, 6102.7, 5960, 6120, 6225.1, 6231, 6180.01, 
6145, 6135.05, 6225, 6261, 6270, 6190, 956, 8771, 10579, 8882, 
8015, 8461), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("Open", 
"High", "Low", "Close", "Volume")), index = structure(c(1041746400, 
1042005600, 1042092000, 1042178400, 1042437600, 1042524000), tzone = "",
tclass = "Date"), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "")
s <- xts(1/1000,as.Date("2003-01-10"))
r <- adjRatios(s,,Cl(x))
OHLC(x) * drop(r[,"Split"]) * drop(r[,"Div"])

如果您使用的是 Yahoo Finance 的数据,那么您可以使用adjustOHLCquantmod 中的函数自动从 Yahoo 提取拆分和股息数据并调整系列。查看?adjustOHLC更多选项。

于 2011-10-14T11:44:34.150 回答