LABORATORIO - COBERTURA DE PORTAFOLIO CON OPCIONES

Bloque I - Descarga y preparacion de datos

Portafolio: AAPL, BAC, JNJ

—- 0. Paquetes —-

quantmod: descarga de precios (Yahoo Finance) y dividendos

xts/zoo: manejo de series de tiempo

paquetes <- c(“quantmod”, “xts”, “zoo”, “PerformanceAnalytics”) instalar <- paquetes[!(paquetes %in% installed.packages()[, “Package”])] if (length(instalar) > 0) install.packages(instalar)

lapply(paquetes, library, character.only = TRUE)

—- 1. Parametros generales —-

tickers <- c(“AAPL”, “BAC”, “JNJ”) fecha_ini <- as.Date(“2021-10-01”) fecha_fin <- Sys.Date() # fecha de descarga = hoy fuente <- “yahoo”

fecha_descarga <- Sys.time() cat(“Fecha y hora de descarga:”, format(fecha_descarga), “”)

—- 2. Descarga de precios (ajustados y no ajustados) —-

getSymbols trae OHLC + Volumen + Adjusted (precio ajustado por splits/dividendos)

precios_lista <- list()

for (tk in tickers) { getSymbols(tk, src = fuente, from = fecha_ini, to = fecha_fin, auto.assign = TRUE) precios_lista[[tk]] <- get(tk) }

—- 3. Ficha tecnica por activo (para el informe) —-

ficha_tecnica <- data.frame( ticker = tickers, empresa = c(“Apple Inc.”, “Bank of America Corp.”, “Johnson & Johnson”), sector = c(“Tecnologia”, “Financiero (banca comercial)”, “Salud / Consumo defensivo”), mercado = c(“NASDAQ”, “NYSE”, “NYSE”), fuente_precios = fuente, fuente_dividendos = fuente, fecha_descarga = format(fecha_descarga), fecha_inicio = as.character(fecha_ini), fecha_fin = as.character(fecha_fin), stringsAsFactors = FALSE )

—- 4. Extraer precio ajustado (para retornos) y precio de cierre no ajustado (spot) —-

precios_ajustados <- do.call(merge, lapply(precios_lista, Ad)) colnames(precios_ajustados) <- tickers

precios_cierre_no_ajustado <- do.call(merge, lapply(precios_lista, Cl)) colnames(precios_cierre_no_ajustado) <- tickers

—- 5. Revision de datos faltantes —-

faltantes <- sapply(list(precios_ajustados, precios_cierre_no_ajustado), function(x) sum(is.na(x))) names(faltantes) <- c(“precios_ajustados”, “precios_no_ajustados”) print(faltantes)

Si hay NAs (dias no coincidentes entre activos, festivos, etc.), se documenta

el tratamiento: aqui se usa “last observation carried forward” (na.locf)

if (any(is.na(precios_ajustados))) { precios_ajustados <- na.locf(precios_ajustados) } if (any(is.na(precios_cierre_no_ajustado))) { precios_cierre_no_ajustado <- na.locf(precios_cierre_no_ajustado) }

n_obs <- nrow(precios_ajustados) cat(“Numero de observaciones por activo:”, n_obs, “”)

—- 6. Descarga de dividendos por separado —-

dividendos_lista <- lapply(tickers, function(tk) { div <- getDividends(tk, from = fecha_ini, to = fecha_fin, src = fuente) colnames(div) <- tk div }) names(dividendos_lista) <- tickers

Tasa de dividendo anualizada aproximada (dividendos del ultimo ano / precio actual)

tasa_dividendo <- sapply(tickers, function(tk) { div <- dividendos_lista[[tk]] precio_actual <- as.numeric(last(precios_ajustados[, tk])) if (nrow(div) == 0) return(0) ult_12m <- div[index(div) >= (Sys.Date() - 365)] sum_div <- sum(ult_12m) round(sum_div / precio_actual, 4) }) ficha_tecnica\(tasa_dividendo_anualizada <- tasa_dividendo[ficha_tecnica\)ticker]

—- 7. Calculo de retornos —-

Se usan retornos logaritmicos (estandar para agregacion temporal y GBM/GARCH)

retornos_log <- diff(log(precios_ajustados)) retornos_log <- retornos_log[-1, ] # eliminar primer NA

retornos_simples <- (precios_ajustados / lag(precios_ajustados) - 1) retornos_simples <- retornos_simples[-1, ]

—- 8. Guardar todo para los siguientes bloques —-

saveRDS(precios_ajustados, “precios_ajustados.rds”) saveRDS(precios_cierre_no_ajustado, “precios_no_ajustados.rds”) saveRDS(dividendos_lista, “dividendos.rds”) saveRDS(retornos_log, “retornos_log.rds”) saveRDS(retornos_simples, “retornos_simples.rds”) write.csv(ficha_tecnica, “ficha_tecnica.csv”, row.names = FALSE)

cat(“— Ficha tecnica —”) print(ficha_tecnica)

cat(“guardados: precios_ajustados.rds, precios_no_ajustados.rds,”, “dividendos.rds, retornos_log.rds, retornos_simples.rds, ficha_tecnica.csv”)