Для цикла с xts

#r #xts #quantmod #quantitative-finance #quantstrat

#r #xts #квантовый режим #количественный-финансы #квантовый

Вопрос:

Я пытаюсь написать функцию, которая выполняет цикл по значениям open и close в объекте xts. Функция должна возвращать 1, когда значение закрытия i 1 больше, чем значение открытия i.

Вот функция

 longsig <- function(x){
    ls <- numeric(length=nrow(x))

    for(i in 1:length(ls)){

        if(Cl(x[i 1]) > Op(x[i])) {
            ls[i] <- 1
        } else {
            ls[i] <- 0
      } 
    }
    return(ls)
}
  

и вот раздел данных, к которому я пытаюсь применить эту функцию. Это объект xts.

      Open     High      Low    Close
2014-01-03 116.9000 119.6400 114.5300 116.9925
2014-01-10 116.9463 116.9463 111.9700 113.8825
2014-01-17 115.4144 115.5700 112.1500 114.0975
2014-01-24 114.7559 118.3400 114.1500 116.0950
2014-01-31 115.4255 119.0900 115.4255 117.5475
2014-02-07 116.4865 120.7400 116.4865 118.9450
  

Функция возвращает следующую ошибку

 Error in if (Cl(x[i   1]) > Op(x[i])) { : argument is of length zero
  

Очевидно, что я делаю что-то неправильно, применяя этот цикл к объекту xts, но у меня очень ограниченный опыт работы с xts. Любая помощь была бы высоко оценена.

Ответ №1:

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

Данные: 6 дней AMZN

            AMZN.Open AMZN.High AMZN.Low AMZN.Close AMZN.Volume AMZN.Adjusted
2019-01-23   1656.00   1657.43  1612.00    1640.02     5225200       1640.02
2019-01-24   1641.07   1657.26  1631.78    1654.93     4089900       1654.93
2019-01-25   1670.50   1683.48  1661.61    1670.57     4945900       1670.57
2019-01-28   1643.59   1645.00  1614.09    1637.89     4837700       1637.89
2019-01-29   1631.27   1632.38  1590.72    1593.88     4632800       1593.88
2019-01-30   1623.00   1676.95  1619.68    1670.43     5751700       1670.43

ifelse(Cl(AMZN)-lag(Op(AMZN)) > 0,1,0)

           AMZN.Close
2019-01-23         NA
2019-01-24          0
2019-01-25          1
2019-01-28          0
2019-01-29          0
2019-01-30          1
  

Если вы хотите поместить это в функцию

 compareOpCl <- function(x){
     ifelse(Cl(x)-lag(Op(x)) > 0,1,0)
 }
  

сделает это.