Добавить столбец с индексом, начинающимся с 100, к матрице цены / доходности акций - PullRequest
1 голос
/ 11 марта 2012

Я недавно начал использовать R для расчетов с финансовыми данными, поэтому, пожалуйста, потерпите меня.Я постараюсь быть как можно более конкретным.

Что я пытаюсь сделать: Используя R с пакетом quantmod, я загружаю финансовые данные в матрицу, а затем добавляю столбецс ежедневными доходами, как показано ниже:

> getSymbols("^GDAXI",from="1900-01-01")
> "GDAXI"
> GDAXI$Returns<-dailyReturn(Cl(GDAXI))
> head(GDAXI)
               GDAXI.Open GDAXI.High GDAXI.Low GDAXI.Close GDAXI.Volume GDAXI.Adjusted  Returns
1990-11-26     1466.3     1466.3     1443.2    1443.2      0            1443.2          0.000000000
1990-11-27     1438.3     1438.3     1415.3    1415.3      0            1415.3         -0.019332040
1990-11-28     1410.0     1431.9     1402.8    1420.6      0            1420.6          0.003744789
1990-11-29     1420.4     1424.6     1415.8    1418.9      0            1418.9         -0.001196677
1990-11-30     1421.5     1443.9     1421.5    1441.2      0            1441.2          0.015716400
1990-12-03     1470.1     1476.6     1458.7    1462.6      0            1462.6          0.014848737

Однако в следующий раз я бы хотел добавить еще один столбец с индексом, начинающимся с 100, для последующих сравнений с другим временным рядом .Я не смог этого сделать.

Сначала я попытался

GDAXI$Index[1]=100
for(i in 2:nrow(GDAXI)){ GDAXI$Index[i]<-GDAXI$Index[i-1]*(1+GDAXI$Returns[i]) }

Но я получаю это сообщение об ошибке, которое я не понимаю:

Error in NextMethod(.Generic) : replacement has length zero

Затем я попытался

> GDAXI$Index<-ifelse(index(GDAXI$Returns)==index(first(GDAXI)),100,lag(GDAXI$Index,1)*(1+GDAXI$Returns))

и получил другое сообщение об ошибке:

Error in hasTsp(x) : attempt to set an attribute on NULL

Все, что мне нужно, - это столбец со следующими значениями (добавленный вручную в качестве иллюстрации):

1990-11-26  100.00
1990-11-27   98.066796
1990-11-28   98.4340255
1990-11-29   98.3162417
1990-11-30   99.8614191
1990-12-03  101.344235

Пожалуйста, помогите!Ранее, когда я писал код на VBA, я, вероятно, подхожу к этому неправильно.Но поиск в сети и stackoverflow пока не привели меня к решению.Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Вы можете просто разделить столбец цены закрытия на его первое значение.

library(quantmod)
ind <- function(x) {
  coredata(x) <- t(
    t(coredata(x)) / 
    apply(coredata(x),2,function(u){ c(u[!is.na(u)&u!=0],NA)[1] })
   )
  x
}
getSymbols("^GDAXI",from="1900-01-01")
GDAXI$Index <- 100 * ind( Cl(GDAXI) )

Ошибки в вашем коде в основном связаны с тем, что объекты xts не data.frames. Каждое значение связано с датой, и вы не можете объединить элементы для разных дат: когда вы пишете GDAXI$Index[i-1]*(1+GDAXI$Returns[i]), даты не совпадают.

lag, как и во второй попытке, эти даты изменяются, так что вычисления имеют смысл. Но ваш код рекурсивен: вы используете значение GDAXI$Index, чтобы определить себя (рекурсия работает только для функций).

0 голосов
/ 11 марта 2012

Посмотрите на команду cbind.

Я думаю, это то, что тебе нужно.

...