2 votos

Error en has.Ad(x) : objeto 'BRK' no encontrado

Estoy tratando de fusionar una lista de cierres ajustados de una multitud de firmas para mi investigación sobre ESG, en relación con el riesgo/recompensa. Ninguna de las empresas parece tener problemas, excepto las acciones de Berkshire Hathaway (BRK-A).

El código es el siguiente:

library(quantmod)
library(PerformanceAnalytics)

maxDate <- "2017-06-23"
minDate <- "2020-12-31" 

average <- c("BABA", "BRK-A", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")
weights <- c(0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04)
getSymbols(average, from=maxDate, to=minDate)

# IMPORTANT: wait 30 seconds to let the source function finish! #
Port.prices <- na.omit(merge(Ad(BABA), Ad(BRK-A), Ad(V), Ad(JNJ), Ad(WMT), Ad(JPM), Ad(MA), Ad(PG), Ad(UNH), Ad(DIS), Ad(BAC), Ad(VZ), Ad(NKE), Ad(NVS), Ad(TM), Ad(MRK), Ad(T), Ad(ABT), Ad(ORCL), Ad(ABBV), Ad(TMO), Ad(XOM), Ad(ACN), Ad(BHP), Ad(CVX)))
Port.returns <- ROC(Port.prices, type="discrete")[-1,]
colnames(Port.returns) <- average 

¿Alguien tiene una solución (preferiblemente sencilla) para este problema? ¡Todavía soy un novato cuando se trata de R, así que alguna explicación sería genial!

Gracias de antemano.

Philip

2 votos

Pruebe a sustituir BRK-A por BRKA y Ad(BRK-A) por Ad(BRKA) respectivamente. Es posible que al analizador léxico no le guste el carácter menos.

0 votos

Hola, señor Rodionov, ¡gracias por su respuesta! Lamentablemente, la eliminación del "-" en las funciones average/getSymbols o/y merge no funcionó. Sin embargo, la respuesta de @pleb sí funcionó y el problema está resuelto. Gracias por comentar.

2voto

xrost Puntos 129

Cuando se obtienen datos mediante el paquete quantmod, es conveniente llamar a la función "Cierre ajustado Ad() directamente en getSymbols() , ya que usted puede se encuentran con problemas de otro tipo (por ejemplo, cargar los precios en el entorno R directamente, sin guardarlos en una variable).

Solución ad hoc utilizando su propio código:

Como se ha descrito anteriormente, se puede llamar a Ad() directamente en getSymbols() para las acciones de Berkshire Hathaway ( BRK-A ) solamente. Esto devuelve los precios de cierre ajustados, que pueden guardarse en una variable:

BRK <- Ad(getSymbols("BRK-A", from = maxDate, to = minDate, auto.assign = FALSE))

Ahora, sustituye Ad(BRK-A) en Port.prices con BRK y todo debería funcionar bien. Además, la configuración de auto.assign = FALSE devuelve los precios en lugar de cargarlos en el entorno R (véase la documentación aquí ).


Método alternativo de solución:

Me he tomado la libertad de proporcionar otra solución que funciona (comentarios debajo del código), que se parece a su propio código:

library(quantmod)
library(PerformanceAnalytics)
library(xts)

maxDate <- "2017-06-23"
minDate <- "2020-12-31" 

tickers <- c("BABA", "BRK-A", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")

n <- length(tickers)

prices <- xts()
weights <- rep(1/n, n)

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

  getdata <- try(Ad(getSymbols(tickers[i], 
    from = maxDate, to = minDate, auto.assign = FALSE, silent = T)))

  prices <- cbind(prices, getdata)

  print(sprintf("%s", i))
}

# IMPORTANT: wait 30 seconds to let the source function finish! #
Port.returns <- ROC(prices, type="discrete")[-1,]

Aportando algunos comentarios sobre mi código, con el fin de aliviar la confusión:

  1. Su vector de igual peso, weights puede generalizarse dividiendo con el número de activos, n y, a continuación, repitiendo este número n cantidad de veces.
  2. La biblioteca xts es una biblioteca de series temporales multivariantes y es una gran herramienta para reunir todos los precios de cierre ajustados en una matriz.
  3. El bucle for puede explicarse como sigue: Para cada teletipo en tickers obtenemos los precios de cierre ajustados, y los guardamos en una variable llamada getdata . A continuación, enlazamos la columna getdata con la matriz de series temporales de precios. Por lo tanto, no es necesario llamar a Ad() después. Al principio, prices es sólo una matriz vacía (objeto de serie temporal), por lo que llamar a cbind(prices, getdata) le dará los primeros precios de cierre ajustados para "BABA". Ahora, la segunda iteración vinculará los precios (que contienen los cierres ajustados de "BABA") y getdata (que contiene los cierres ajustados de "BRK-A"), lo que actualizará efectivamente el prices que ahora contiene tanto "BABA" como "BRK-A" en las columnas (y los cierres diarios en las filas). Esto sucederá hasta que el bucle for termine, dándole una matriz prices que contiene los precios de cierre de todos los activos definidos por su ticker en tickers .

La solución alternativa le ahorra algunos minutos de construcción manual de la matriz de precios, Port.prices y es extensible para cualquier cantidad de tickers (siempre que los tickers sean correctos). ¡Espero que esto ayude!

1 votos

Muchas gracias por su clara respuesta y sus exhaustivos comentarios. Es increíble ver tu método alternativo de solución; MUCHO más ágil que el mío, bastante útil. Gracias por su tiempo. - Philip

0voto

Kelin Field Puntos 16

Arreglo muy sencillo:

El problema: Para cada símbolo, getSymbols crea un objeto de datos en el entorno con ese nombre. La llamada posterior al objeto de datos BRK-A es interpretada por R como BRK menos A, y por supuesto no encuentra un objeto llamado BRK.

La solución: Cambie el nombre del objeto inmediatamente después de la llamada getSymbols de la siguiente manera. Usando backticks (shift ~, no comillas simples) para que el intérprete tome la cadena en su totalidad:

BRKA <- `BRK-A`

Y para completar, actualiza también tu vector de símbolos de BRK-A a BRKA para que las llamadas posteriores a este vector busquen BRKA y no BRK-A. Código actualizado:

library(quantmod)
library(PerformanceAnalytics)

maxDate <- "2017-06-23"
minDate <- "2020-12-31" 

average <- c("BABA", "BRK-A", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")
weights <- c(0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04)
getSymbols(average, from=maxDate, to=minDate)
BRKA <- `BRK-A`
average <- c("BABA", "BRKA", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")

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