1 votos

Obtención de la rentabilidad mensual mediante quantmod, si el ticker de entrada es una variable

Soy nuevo en los paquetes quantmod y quandl . Me encontré con un problema mientras intentaba obtener los datos de la devolución del período. Abajo está mi código fuente:

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

El problema de este código es que el monthlyReturn no funcionará, dando un error de Error in try.xts(x) : Error in UseMethod("as.xts") : no applicable method for 'as.xts' applied to an object of class "character" .

Este error no me parece muy intuitivo. He probado con un ticker real y me he dado cuenta de que el monthlyReturn(ticker, subset='2017-11-10') sólo funcionará si el ticker no es de tipo carácter (por ejemplo, AAPL en lugar de 'AAPL' funcionará bien).

¿Puedo saber cuál es el motivo?

2voto

Marcx Puntos 308

Al escribir getSymbols(ticker) la función está creando un objeto xts en el env global nombrado por el ticker. En la primera iteración, cuando i = 1, el ticker es un carácter, "AAMC".

A continuación, cuando intente obtener los rendimientos mensuales de ese objeto xts recién creado, monthlyReturn(ticker, subset='2017-11-10') está haciendo referencia al carácter, no al objeto xts recién creado, llamado AAMC también.

Para solucionarlo, podría xtsTicker <- getSymbols(ticker, auto.assign = FALSE) entonces monthlyReturn(xtsTicker, subset='2017-11-10')

También hay que tener en cuenta una cosa, selected$MonthyReturn <- hace referencia a todas las filas de esa columna. Esto debería cambiarse por selected$MonthyReturn[i] .

Si bien esto responde a su pregunta de por qué la función monthlyReturn() no funciona, esto no puede hacer que su bucle for funcione. Este bucle está obligado a ejecutar en los errores, que se romperá en. Para algunos tickers, no habrá un retorno mensual para dar. En ese caso, podría añadir una sentencia if para encargarse de eso. Una opción sería:

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

También habrá ocasiones en las que no se pueda descargar un teletipo, por lo que se producirá otro error.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X