2014-10-29 5 views
1

yahoo에서 일부 주식 데이터를 가져올 예정이며 일간 범위를 고가 - 저가로 계산하고 싶습니다. 그런 다음 각 주식의 범위를 단일 xts 오브젝트에 넣으려고합니다. 아래 코드는이 작업을 수행하지만 나에게 너무 복잡하게 보입니다.quantmod에 lapply를 사용하면 xts 객체로 바로 갈 수 있습니까?

문제는 lapply로 시작됩니다. xts 객체 목록을 얻지 만 [[]]을 사용하여 개별 객체 "a layer down"을 참조해야합니다. 각 xts 객체를 따옴표 [i]로 참조 할 수 있다면 for 루프가 아닌 apply 함수를 계속 사용할 수 있습니다. lapply 대신 sapply를 사용하려고했지만 오류가 발생했습니다. "배열의 오류 (dim, dimnames = if (! (is [ 'dimnames'[1] 배열 길이와 같지 않음의 길이 "

또한 두 번째 for 루프에서 사용한 연습이 싫습니다. 범위가 아직 존재하지 않으므로 작성해야하지만이 작업을 수행해야합니다. 방법은 루프의 목적을 물리 칠 것 같다. 더 좋은 방법이 있나요? 나는 또한 내가 그 중 하나의 좋은 방법이 아닙니다 알고 빈 XTS 개체를 만들지 않도록하고 싶습니다.

require(quantmod) 
tickers <- c("ERX", "EWJ", "EWW", "EWZ", "FAS", "FAZ") 

quotes <- lapply(tickers,function(x) getSymbols(x, src="yahoo", from="2014-10-10", auto.assign=FALSE)) 
names(quotes) <- tickers 

for (i in 1:length(quotes)){ 
    quotes[[i]] <- quotes[[i]][,2] - quotes[[i]][,3] 
    colnames(quotes[[i]]) <- paste(names(quotes)[i], "Range") 
} 

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

    if (i == 1) {range <- quotes[[i]]} 

    else {range <- merge(range, quotes[[i]])} 
} 

감사합니다.

답변

3

가장 쉬운 방법은 eapply와 환경의 모든 개체를 통해 다음 루프를 환경에서 데이터를 저장하는 것입니다 :

require(quantmod) 
tickers <- c("ERX", "EWJ", "EWW", "EWZ", "FAS", "FAZ") 
dataEnv <- new.env() 
getSymbols(tickers, env=dataEnv) 
# Calculate the range for all objects, 
# then merge all range columns into one object 
hl <- do.call(merge, eapply(dataEnv, function(x) Hi(x)-Lo(x))) 
# update the column names 
colnames(hl) <- gsub("(.*)High$", "\\1Range", colnames(hl)) 
+0

감사 여호수아. 당신이 만든 패키지는 매우 유용합니다. – mks212

+0

@ user2926358 : 고마워,하지만 나는 quantmod를 만들지 않았다. 제프 라이언이 그랬어. –

+0

공정한만큼, xts를위한 감사합니다! – mks212