Простая задача R: разделить указанные столбцы на 1000 в указанных строках - PullRequest
4 голосов
/ 14 октября 2011

У меня есть массив биржевых котировок 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 для этой задачи.Лучшая часть кода, которую мне удалось закодировать, - это (не могу понять, как применить к данным столбцам, акция $ Open не работает):

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

Однако результаты странные, многие изэто инфы:

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

Большое спасибо заранее!

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Если дата не ранее 20/7/2007, то (index(stock)<"2007-07-20") равно FALSE, поэтому (index(stock)<"2007-07-20")*1000 равно нулю.Ваши Inf значения являются результатом деления на ноль.

Вы можете попробовать это:

stock[index(stock) < "2007-07-20", -5] <- stock[index(stock) < "2007-07-20", -5] / 1000
2 голосов
/ 14 октября 2011

Я не знаком с OHLC array s, но при условии, что метод индекса работает:

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

Как только у вас есть вектор, содержащий все соответствующие строки (на самом деле это логический вектор, который содержит TRUE для строк, которые должны быть изменены), вы, вероятно, можете использовать это просто так:

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

Возможно (в зависимости от внутренних элементов OHLC array с), что даже это работает:

stock[relevantRows, c("Open", "High", "Low", "Close")]<-stock[relevantRows, c("Open", "High", "Low", "Close")]/1000
1 голос
/ 14 октября 2011

Для этого вы можете использовать функцию adjRatios в пакете TTR. Похоже, у вас уже есть объект 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, то вы можете использовать функцию adjustOHLC в quantmod для автоматического извлечения данных разделения и дивидендов из Yahoo и корректировки ряда. См. ?adjustOHLC для получения дополнительной информации.

...