程式

如果輸入程式碼是變數,則使用 quantmod 獲得月度回報

  • November 19, 2017

我是包裝quantmodquandl. 我在嘗試獲取期間返回數據時遇到了問題。下面是我的原始碼:

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')
  }
}

有時也會出現無法下載程式碼的情況,因此會出現另一個錯誤。

引用自:https://quant.stackexchange.com/questions/36863