如果輸入程式碼是變數,則使用 quantmod 獲得月度回報
我是包裝
quantmod
和quandl
. 我在嘗試獲取期間返回數據時遇到了問題。下面是我的原始碼:require(TTR) require(quantmod) SYMs <- TTR::stockSymbols() filtered = SYMs[!is.na(SYMs$Sector) & !is.na(SYMs$Industry),] selected = filtered[,c("Symbol", "Sector", "Industry")] for(i in 1:nrow(selected)){ ticker = selected$Symbol[i] getSymbols(ticker) selected$MonthyReturn <- monthlyReturn(ticker, subset='2017-11-10') }
這段程式碼的問題是monthlyReturn不會執行,報錯
Error in try.xts(x) : Error in UseMethod("as.xts") : no applicable method for 'as.xts' applied to an object of class "character"
。這個錯誤對我來說似乎不是很直覺。我嘗試了一個實際的股票程式碼,並註意到monthlyReturn(ticker, subset=‘2017-11-10’) 僅在股票程式碼不是字元類型時才有效(例如,AAPL 而不是’AAPL’ 可以正常工作)。
我能知道是什麼原因嗎?
在編寫
getSymbols(ticker)
函式時,在由股票程式碼命名的全域環境中創建一個 xts 對象。在第一次迭代中,當 i = 1 時,ticker 是一個字元,“AAMC”。接下來,當您嘗試獲取新創建的 xts 對象的每月回報時,
monthlyReturn(ticker, subset='2017-11-10')
您引用的是角色,而不是新創建的 xts 對象,也名為 AAMC。要解決此問題,您
xtsTicker <- getSymbols(ticker, auto.assign = FALSE)
可以monthlyReturn(xtsTicker, subset='2017-11-10')
還需要注意的一件事
selected$MonthyReturn <-
是引用該列中的所有行。這應該更改為selected$MonthyReturn[i]
.雖然這回答了您的問題,即為什麼monthlyReturn() 函式不起作用,但這可能不會使您的 for 循環起作用。這個循環必然會遇到錯誤,這將中斷。對於某些股票程式碼,不會有每月回報。在這種情況下,您可以添加一個 if 語句來解決這個問題。一種選擇是:
for(i in 1:nrow(selected)){ ticker = selected$Symbol[i] xtsTicker <- getSymbols(ticker, auto.assign = FALSE) if(nrow(monthlyReturn(xtsTicker, subset='2017-11-17')) == 0){ selected$MonthyReturn[i] <- NA }else{ selected$MonthyReturn[i] <- monthlyReturn(xtsTicker, subset='2017-11-17') } }
有時也會出現無法下載程式碼的情況,因此會出現另一個錯誤。