для цикла не работает в R - PullRequest
2 голосов
/ 24 марта 2011

Вот код:

require("quantmod")

getSymbols("SPY")  

ticker <- SPY[,4]

win <- 0 

for(i in 11:NROW(ticker))

j <- i-10

if(ticker[i] > ticker[j])               

win <- win + 1

Я хотел бы проверить, больше ли сегодняшнее закрытие, чем закрытие 10 дней назад, и должно ли оно увеличивать переменную win.Я также попробовал следующее:

for(i in 11:NROW(ticker))

if(ticker[i] > ticker[i-10])               

win <- win + 1             

Кажется, что оба они должны работать, поэтому у меня на самом деле две проблемы.Сначала заставить его работать, но также важно понять, почему они не работают.Оба флага «аргумент имеет нулевую длину».Я догадываюсь, что виновником является тикер [j] или тикер [i-10].Главным образом потому, что когда я заменяю их жестко запрограммированным значением, они работают.

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Проблема в том, что тикер [i] не возвращает числовой объект, поэтому вы не можете сравнивать или вычитать его. Попробуйте это для удовольствия:

str(ticker[15])
ticker[15]-ticker[10]

Итак, просто оберните их в виде .numeric, и вы получите то, что вам нужно.

require("quantmod")
getSymbols("SPY")  
ticker <- SPY[,4]
win <- 0 
for(i in 11:NROW(ticker)){
    j <- i-10
    if(as.numeric(ticker[i]) > as.numeric(ticker[j])){             
        win <- win + 1
    }
}
1 голос
/ 24 марта 2011

Это не имеет ничего общего с циклами.Это потому, что xts / zoo выровнены по индексу перед выполнением каких-либо операций.ticker[i] > ticker[j] пусто, потому что индексы разные.

Вам также не нужен цикл for.Вы можете сделать это легко, отставая серии:

merged.ticker <- merge(ticker, lag(ticker,10))
win <- sum(merged.ticker[,1] > merged.ticker[,2], na.rm=TRUE)
lose <- sum(merged.ticker[,1] < merged.ticker[,2], na.rm=TRUE)
0 голосов
/ 24 марта 2011

Фигурные скобки - твой друг, мой друг.

...