Universidad de Sucre
Facultad de Ciencias Económicas y Administrativas
Programa de Economía | Asignatura: Análisis de Datos | Docente: Samuel Coronado

Estudiante: Luis Esteban Martinez Monterroza
Fecha: 05/11/2026

INTRODUCCIÓN

Evaluar una inversión exige medir cuánto rinde y también cuánto riesgo se asume para obtener ese rendimiento. Este informe compara el comportamiento mensual de tres acciones del sector defensa y aeroespacial de EE. UU.: Lockheed Martin (LMT), RTX Corporation (RTX) y General Dynamics (GD).

Con 81 rendimientos mensuales entre feb 2020 y oct 2026, se calculan estadísticos de rendimiento y volatilidad, la evolución acumulada, las caídas máximas, la relación entre las tres series y el resultado de una cartera con ponderación igual. El periodo incluye la caída por la pandemia (2020), el alza de tasas de 2022 y los conflictos geopolíticos de los últimos años, lo que permite observar cómo reaccionan estas empresas, ligadas al gasto militar, en contextos muy diferentes.

Empresas analizadas
Ticker Empresa Actividad principal
LMT LMT Lockheed Martin Es el mayor contratista de defensa del mundo (avión F-35, misiles y sistemas espaciales); sus ingresos dependen del presupuesto militar de EE. UU.
RTX RTX RTX Corporation Combina defensa (Raytheon: misiles y radares) con aviación comercial (motores Pratt & Whitney y Collins Aerospace), por lo que también depende del tráfico aéreo.
GD GD General Dynamics Fabrica submarinos, vehículos de combate y jets ejecutivos Gulfstream; mezcla contratos militares de largo plazo con ventas civiles.

OBJETIVOS

Objetivo general

  • Comparar el rendimiento y el riesgo mensual de LMT, RTX y GD entre 2020 y 2026 mediante el procesamiento de series de precios en RStudio.

Objetivos específicos

  • Calcular los rendimientos mensuales de cada acción y resumir su promedio, mediana, volatilidad y proporción de meses positivos.
  • Medir el rendimiento acumulado y anualizado frente al riesgo asumido, incluida la caída máxima desde un pico.
  • Analizar la relación entre las tres series y el efecto de combinarlas en una cartera de ponderación igual.

HERRAMIENTAS UTILIZADAS

La descarga y el procesamiento se realizaron en RStudio con las siguientes librerías:

  • quantmod: descarga de precios históricos desde Yahoo Finance (getSymbols) y extracción del precio ajustado (Ad).
  • xts: manejo de series de tiempo y agregación mensual (apply.monthly).
  • zoo: soporte de índices temporales y rezagos (lag, index).
  • knitr: generación de tablas y del informe en formato HTML para su publicación en RPubs.
  • graphics (R base): gráficos de línea y de barras con plot, abline, legend y barplot.

METODOLOGÍA

Se descargaron de Yahoo Finance los precios de cierre ajustado (incluyen dividendos y divisiones de acciones, en dólares) desde el 01/01/2020 hasta el 05/11/2026. Con apply.monthly(precios, last) se tomó el último dato de cada mes: 82 precios, del 31/01/2020 al 30/10/2026, que producen 81 rendimientos mensuales. El registro del mes en curso no tiene cierre y se excluyó.

El rendimiento mensual en porcentaje es:

\[R_t = \left(\frac{P_t}{P_{t-1}} - 1\right) \times 100\]

Sobre esa serie se calcularon:

  • Estadísticos mensuales: promedio, mediana, desviación estándar (volatilidad), mínimo, máximo y porcentaje de meses con rendimiento positivo.
  • Rendimiento y volatilidad anualizados: con \(n = 81\) meses, \(P_0\) el primer precio y \(P_T\) el último:

\[R_{anual} = \left(\frac{P_T}{P_0}\right)^{12/n} - 1 \qquad \sigma_{anual} = \sigma_{mensual}\sqrt{12}\]

  • Relación retorno/riesgo: rendimiento anualizado dividido entre volatilidad anualizada. No es un índice de Sharpe, porque no descuenta una tasa libre de riesgo.
  • Caída máxima (drawdown): mayor pérdida desde un máximo previo del valor acumulado \(V\):

\[DD_t = \frac{V_t}{\max_{s \le t} V_s} - 1\]

  • Cartera de ponderación igual: promedio simple de los tres rendimientos de cada mes, equivalente a rebalancear mensualmente un tercio en cada acción.

El script clasifica la volatilidad de cada acción frente a la mediana de las tres. Como esa comparación puede depender de diferencias mínimas, los resultados se leen con las cifras completas y no solo con la etiqueta.

ANÁLISIS DE RESULTADOS

1. Estadísticos del rendimiento mensual

El mayor rendimiento promedio mensual es el de RTX (1.46%) y el menor el de LMT (1.02%). La volatilidad mensual va de 5.85% (GD) a 8.31% (RTX).

Tabla 1. Estadísticos del rendimiento mensual (%)
LMT RTX GD
Promedio mensual 1.02 1.46 1.29
Mediana mensual 0.27 1.18 1.04
Volatilidad (desv. est.) 8.13 8.31 5.85
Mejor mes 31.13 (ene 2026) 32.99 (nov 2020) 18.39 (oct 2022)
Peor mes -14.30 (abr 2026) -27.77 (mar 2020) -17.15 (mar 2020)
Meses positivos 41 de 81 (50.6%) 46 de 81 (56.8%) 48 de 81 (59.3%)
Percentiles 5 / 95 -8.79 / 14.78 -10.24 / 13.43 -7.31 / 11.45

Con el criterio del script, la volatilidad de LMT es igual a la mediana de las tres, la de RTX es superior a la mediana de las tres y la de GD es inferior a la mediana de las tres (mediana: 8.13%).

2. Evolución del rendimiento mensual

81 meses, feb 2020 - oct 2026. La línea verde punteada es el rendimiento promedio y las naranjas, el promedio ± 1 desviación estándar.

LMT - Lockheed Martin

Comentario: La acción presenta rendimiento promedio positivo (1.02% mensual), con una volatilidad mensual de 8.13%. El 50.6% de sus meses fueron positivos. Su comportamiento muestra volatilidad cercana a la mediana frente a las otras acciones.

Análisis: Tiene el menor rendimiento promedio del grupo y la intermedia volatilidad. Su peor mes fue abr 2026 (-14.30%) y su mejor mes fue ene 2026 (31.13%). Por cada 1% de volatilidad obtiene 0.13% de rendimiento. Es el mayor contratista de defensa del mundo (avión F-35, misiles y sistemas espaciales); sus ingresos dependen del presupuesto militar de EE. UU.

RTX - RTX Corporation

Comentario: La acción presenta rendimiento promedio positivo (1.46% mensual), con una volatilidad mensual de 8.31%. El 56.8% de sus meses fueron positivos. Su comportamiento muestra volatilidad superior a la mediana frente a las otras acciones.

Análisis: Tiene el mayor rendimiento promedio del grupo y la mayor volatilidad. Su peor mes fue mar 2020 (-27.77%) y su mejor mes fue nov 2020 (32.99%). Por cada 1% de volatilidad obtiene 0.18% de rendimiento. Combina defensa (Raytheon: misiles y radares) con aviación comercial (motores Pratt & Whitney y Collins Aerospace), por lo que también depende del tráfico aéreo.

GD - General Dynamics

Comentario: La acción presenta rendimiento promedio positivo (1.29% mensual), con una volatilidad mensual de 5.85%. El 59.3% de sus meses fueron positivos. Su comportamiento muestra volatilidad inferior a la mediana frente a las otras acciones.

Análisis: Tiene el intermedio rendimiento promedio del grupo y la menor volatilidad. Su peor mes fue mar 2020 (-17.15%) y su mejor mes fue oct 2022 (18.39%). Por cada 1% de volatilidad obtiene 0.22% de rendimiento. Fabrica submarinos, vehículos de combate y jets ejecutivos Gulfstream; mezcla contratos militares de largo plazo con ventas civiles.

3. Crecimiento acumulado y riesgo

Precios de cierre ajustado mensual, ene 2020 - oct 2026. Valor de una inversión de 100 dólares al inicio del periodo.

Tabla 2. Rendimiento acumulado, anualizado y caída máxima
LMT RTX GD Cartera igual
Precio 31-01-2020 (USD) 357.35 81.06 150.55 -
Precio 30-10-2026 (USD) 636.95 199.80 372.59 -
Rendimiento acumulado 78.2% 146.5% 147.5% 134.2%
Rendimiento anualizado 8.9% 14.3% 14.4% 13.4%
Volatilidad anualizada 28.2% 28.8% 20.3% 22.4%
Retorno / riesgo 0.32 0.50 0.71 0.60
Caída máxima -26.5% -41.3% -24.9% -27.3%
Pico → mínimo sep 2024 → jul 2025 ene 2020 → oct 2020 ene 2020 → abr 2020 ene 2020 → mar 2020
Recuperó su pico ene 2026 ene 2022 mar 2021 may 2021

GD obtuvo el mayor rendimiento acumulado (147.5%) y LMT el menor (78.2%). En la relación retorno/riesgo lidera GD (0.71) y cierra LMT (0.32). La mayor caída desde un máximo previo fue la de RTX (-41.3%, de ene 2020 a oct 2020) y la más contenida la de GD (-24.9%).

A oct 2026, las acciones se ubican así respecto a su máximo histórico del periodo: LMT -1.5%; RTX -6.9%; GD -2.4%.

4. Rendimiento por año

Rendimiento compuesto por año calendario. El primer año cubre 11 rendimientos y el último, 10.

Tabla 3. Rendimiento anual (%)
Año LMT RTX GD Cartera igual Mejor acción
2020 -15.0% -22.2% -13.2% -15.5% GD
2021 3.2% 23.3% 43.8% 22.8% GD
2022 40.5% 20.0% 21.7% 27.5% LMT
2023 -4.3% -14.4% 7.1% -3.8% GD
2024 10.0% 40.8% 3.5% 17.7% RTX
2025 2.5% 61.4% 30.4% 30.7% RTX
2026 34.1% 10.1% 12.7% 19.7% LMT

LMT fue la mejor acción en 2 de los 7 años; RTX fue la mejor acción en 2 de los 7 años; GD fue la mejor acción en 3 de los 7 años.

El contraste más marcado entre acciones se dio en 2025: LMT 2.5%, RTX 61.4%, GD 30.4%.

5. Relación entre las acciones y cartera

Tabla 4. Correlación de los rendimientos mensuales
LMT RTX GD
LMT 1.00 0.59 0.60
RTX 0.59 1.00 0.72
GD 0.60 0.72 1.00

Las correlaciones mensuales entre pares son: LMT-RTX = 0.59; LMT-GD = 0.60; RTX-GD = 0.72. Las tres acciones subieron juntas en 27 de 81 meses y cayeron juntas en 19; en los otros 35 las señales fueron mixtas.

La cartera de ponderación igual tuvo una volatilidad mensual de 6.46%, frente a 5.85%-8.31% de cada acción. Rindió 13.4% anual con una volatilidad anualizada de 22.4%, una relación retorno/riesgo de 0.60 y una caída máxima de 27.3%. El 58.0% de sus meses fue positivo (en las acciones individuales, entre 50.6% y 59.3%).

Ordenadas por relación retorno/riesgo: GD (0.71) > Cartera (0.60) > RTX (0.50) > LMT (0.32).

CONCLUSIÓN

Entre feb 2020 y oct 2026, la acción con mayor rendimiento anualizado fue GD (14.4%) y la de menor rendimiento fue LMT (8.9%). La mejor relación retorno/riesgo correspondió a GD (0.71) y la menos eficiente a LMT (0.32). RTX fue la más volátil (8.31% mensual), por lo que resulta más adecuada para un inversionista que tolere mayor riesgo; la mayor caída máxima fue la de RTX (41.3%).

La volatilidad mensual de las tres acciones va de 5.85% a 8.31%; lo que las diferencia es el retorno obtenido por ese riesgo y el momento en que cada una cayó o subió. Al ser las tres del sector defensa, su comportamiento está ligado al gasto militar de EE. UU. y a los conflictos geopolíticos: las correlaciones mensuales entre pares van de 0.59 a 0.72 y las tres subieron o cayeron juntas en 46 de 81 meses. La cartera de ponderación igual obtuvo una volatilidad mensual de 6.46% y una caída máxima de 27.3%, frente a 24.9%-41.3% de las acciones individuales; así, la combinación no redujo la volatilidad por debajo de la de la acción menos volátil.

Los resultados describen el pasado de un periodo con eventos extraordinarios (pandemia, alza de tasas, conflictos armados) y no garantizan el comportamiento futuro. Una extensión natural sería incorporar una tasa libre de riesgo para calcular un índice de Sharpe, probar ponderaciones distintas a la igual y añadir activos de otros sectores para lograr una diversificación real.

ANEXOS: SCRIPT COMPLETO UTILIZADO EN R

body { font-size: 16px; text-align: justify; }
h1, h2, h3 { text-align: left; }
table { margin-left: auto; margin-right: auto; font-size: 14px; }
.portada { text-align: center; line-height: 1.7; margin-bottom: 25px; }
.nota { font-size: 13px; color: #555; text-align: left; }

library(quantmod)
library(xts)
library(zoo)
library(knitr)

# ---- Parámetros ------------------------------------------------------------
acciones     <- c("LMT", "RTX", "GD")
fecha_inicio <- as.Date("2020-01-01")
fecha_fin    <- Sys.Date()

empresas <- c(LMT = "Lockheed Martin - Defensa y aeroespacial",
              RTX = "RTX Corporation - Defensa y aviacion",
              GD  = "General Dynamics - Defensa y aviacion ejecutiva")

contexto <- c(
  LMT = "Es el mayor contratista de defensa del mundo (avión F-35, misiles y sistemas espaciales); sus ingresos dependen del presupuesto militar de EE. UU.",
  RTX = "Combina defensa (Raytheon: misiles y radares) con aviación comercial (motores Pratt & Whitney y Collins Aerospace), por lo que también depende del tráfico aéreo.",
  GD  = "Fabrica submarinos, vehículos de combate y jets ejecutivos Gulfstream; mezcla contratos militares de largo plazo con ventas civiles.")

colores <- c(LMT = "blue", RTX = "red", GD = "purple", Cartera = "black")

# ---- Funciones auxiliares --------------------------------------------------
mes_es <- c("ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic")
fmt_mes <- function(d) paste(mes_es[as.integer(format(d, "%m"))], format(d, "%Y"))
f2 <- function(x, d = 2) formatC(x, format = "f", digits = d, big.mark = ",")

# ---- Descarga de precios ajustados (Yahoo Finance) -------------------------
precios <- do.call(merge, lapply(acciones, function(a) {
  Ad(getSymbols(a, src = "yahoo", from = fecha_inicio, to = fecha_fin,
                auto.assign = FALSE))
}))
colnames(precios) <- acciones

# ---- Precios y rendimientos mensuales --------------------------------------
precios_mensuales <- apply.monthly(precios, last)

# El mes en curso no tiene cierre: se excluye
ult <- as.Date(index(precios_mensuales)[nrow(precios_mensuales)])
mes_en_curso <- format(ult, "%Y-%m") == format(Sys.Date(), "%Y-%m")
if (mes_en_curso) precios_mensuales <- precios_mensuales[-nrow(precios_mensuales), ]

rend <- na.omit((precios_mensuales / lag(precios_mensuales, 1) - 1) * 100)

n         <- nrow(rend)                          # rendimientos mensuales
fechas    <- as.Date(index(rend))
fechas_v  <- as.Date(index(precios_mensuales))   # n + 1 precios
mat       <- coredata(rend); colnames(mat) <- acciones
cartera   <- rowMeans(mat)                       # ponderación igual
todo      <- cbind(mat, Cartera = cartera)
cols      <- colnames(todo)

# ---- Estadísticos mensuales ------------------------------------------------
st <- sapply(acciones, function(a) {
  x <- mat[, a]
  c(prom = mean(x), med = median(x), vol = sd(x),
    mejor = max(x), peor = min(x), pos = mean(x > 0) * 100,
    npos = sum(x > 0), p5 = unname(quantile(x, .05)), p95 = unname(quantile(x, .95)))
})
prom <- st["prom", ]; vol <- st["vol", ]

# ---- Crecimiento acumulado y caídas máximas --------------------------------
V <- apply(todo, 2, function(r) c(1, cumprod(1 + r / 100)))   # base 1

dd_info <- function(v, f) {
  dd    <- v / cummax(v) - 1
  imin  <- which.min(dd)
  ipico <- which(v[1:imin] == max(v[1:imin]))[1]
  rec   <- which(seq_along(v) > imin & v >= v[ipico])
  list(dd = min(dd) * 100, pico = f[ipico], minimo = f[imin],
       rec = if (length(rec)) f[rec[1]] else NA,
       actual = dd[length(dd)] * 100)
}
dd <- lapply(cols, function(k) dd_info(V[, k], fechas_v)); names(dd) <- cols

num <- sapply(cols, function(k) {
  v     <- V[, k]
  anual <- v[length(v)]^(12 / n) - 1
  vola  <- sd(todo[, k]) * sqrt(12) / 100
  c(acum = (v[length(v)] - 1) * 100, anual = anual * 100,
    vola = vola * 100, rr = anual / vola, dd = dd[[k]]$dd)
})

# ---- Rendimiento por año ---------------------------------------------------
anio  <- format(fechas, "%Y")
anual <- t(sapply(split(seq_len(n), anio), function(i)
  (apply(1 + todo[i, , drop = FALSE] / 100, 2, prod) - 1) * 100))
n_mes_anio <- table(anio)
lider <- acciones[apply(anual[, acciones, drop = FALSE], 1, which.max)]

# ---- Correlaciones y meses conjuntos ---------------------------------------
corr    <- cor(mat)
suben   <- sum(rowSums(mat > 0) == length(acciones))
caen    <- sum(rowSums(mat < 0) == length(acciones))
mixtos  <- n - suben - caen
pares   <- which(upper.tri(corr), arr.ind = TRUE)
nom_par <- paste(acciones[pares[, 1]], acciones[pares[, 2]], sep = "-")
val_par <- corr[pares]

# ---- Variables para el texto -----------------------------------------------
f_ini <- fmt_mes(fechas[1]); f_fin <- fmt_mes(fechas[n])
mejor_prom <- names(which.max(prom)); peor_prom <- names(which.min(prom))
mas_vol    <- names(which.max(vol));  menos_vol <- names(which.min(vol))
mejor_rr   <- names(which.max(num["rr", acciones]))
peor_rr    <- names(which.min(num["rr", acciones]))
mayor_dd   <- names(which.min(num["dd", acciones]))
menor_dd   <- names(which.max(num["dd", acciones]))
mejor_ac   <- names(which.max(num["acum", acciones]))
peor_ac    <- names(which.min(num["acum", acciones]))

kable(data.frame(Ticker = acciones,
                 Empresa = sub(" - .*", "", empresas),
                 `Actividad principal` = unname(contexto),
                 check.names = FALSE),
      align = "lll", caption = "Empresas analizadas")

mejor_txt <- sapply(acciones, function(a) paste0(f2(st["mejor", a]), " (", fmt_mes(fechas[which.max(mat[, a])]), ")"))
peor_txt  <- sapply(acciones, function(a) paste0(f2(st["peor", a]),  " (", fmt_mes(fechas[which.min(mat[, a])]), ")"))
tab1 <- rbind(
  "Promedio mensual"         = f2(st["prom", ]),
  "Mediana mensual"          = f2(st["med", ]),
  "Volatilidad (desv. est.)" = f2(st["vol", ]),
  "Mejor mes"                = mejor_txt,
  "Peor mes"                 = peor_txt,
  "Meses positivos"          = paste0(st["npos", ], " de ", n, " (", f2(st["pos", ], 1), "%)"),
  "Percentiles 5 / 95"       = paste0(f2(st["p5", ]), " / ", f2(st["p95", ])))
colnames(tab1) <- acciones
kable(tab1, align = "rrr", caption = "Tabla 1. Estadísticos del rendimiento mensual (%)")

med_vol <- median(vol)
clas <- sapply(acciones, function(a) {
  if (vol[a] > med_vol) "superior a la mediana de las tres"
  else if (vol[a] < med_vol) "inferior a la mediana de las tres"
  else "igual a la mediana de las tres"
})

par(mfrow = c(3, 1), mar = c(3, 4.5, 3, 1), mgp = c(2.3, 0.7, 0))
for (a in acciones) {
  v <- mat[, a]; m <- mean(v); s <- sd(v)
  r <- range(c(v, 0, m - s, m + s))
  plot(fechas, v, type = "l", lwd = 2, col = colores[a],
       main = paste("RENDIMIENTO MENSUAL -", a, "|", empresas[a]),
       cex.main = 1.1, xlab = "", ylab = "Rendimiento (%)",
       ylim = c(r[1], r[2] + diff(r) * 0.18))
  points(fechas, v, pch = 16, cex = 0.5, col = colores[a])
  abline(h = 0, lty = 2)
  abline(h = m, col = "darkgreen", lwd = 2, lty = 2)
  abline(h = c(m - s, m + s), col = "orange", lwd = 2, lty = 3)
  legend("topleft", horiz = TRUE, bty = "n", cex = 0.85, lwd = 2,
         legend = c("Rendimiento mensual", "Rendimiento promedio", "Volatilidad (± 1 DE)"),
         col = c(colores[a], "darkgreen", "orange"), lty = c(1, 2, 3))
}
par(mfrow = c(1, 1))

rango_rend <- rank(-prom); rango_vol <- rank(-vol)
pos_rend <- c("el mayor", "el intermedio", "el menor")
pos_vol  <- c("la mayor", "la intermedia", "la menor")

for (a in acciones) {
  v <- mat[, a]
  comp <- if (prom[a] > 0) "rendimiento promedio positivo" else if (prom[a] < 0) "rendimiento promedio negativo" else "rendimiento promedio neutro"
  rie  <- if (vol[a] > med_vol) "volatilidad superior a la mediana" else if (vol[a] < med_vol) "volatilidad inferior a la mediana" else "volatilidad cercana a la mediana"
  ip <- which.min(v); im <- which.max(v)

  cat("\n### ", a, " - ", sub(" - .*", "", empresas[a]), "\n\n", sep = "")
  cat("**Comentario:** La acción presenta ", comp, " (", f2(prom[a]), "% mensual), con una volatilidad mensual de ",
      f2(vol[a]), "%. El ", f2(st["pos", a], 1), "% de sus meses fueron positivos. Su comportamiento muestra ",
      rie, " frente a las otras acciones.\n\n", sep = "")
  cat("**Análisis:** Tiene ", pos_rend[rango_rend[a]], " rendimiento promedio del grupo y ", pos_vol[rango_vol[a]],
      " volatilidad. Su peor mes fue ", fmt_mes(fechas[ip]), " (", f2(v[ip]), "%) y su mejor mes fue ",
      fmt_mes(fechas[im]), " (", f2(v[im]), "%). Por cada 1% de volatilidad obtiene ",
      f2(prom[a] / vol[a]), "% de rendimiento. ", contexto[a], "\n\n", sep = "")
}

matplot(fechas_v, V * 100, type = "l", lty = c(1, 1, 1, 2), lwd = c(2, 2, 2, 3),
        col = colores[cols], xlab = "", ylab = "Valor de 100 USD invertidos",
        main = "Crecimiento acumulado")
abline(h = 100, col = "grey60", lty = 3)
legend("topleft", legend = c(acciones, "Cartera igual"), col = colores[cols],
       lty = c(1, 1, 1, 2), lwd = c(2, 2, 2, 3), bty = "n")

pi_ <- sapply(acciones, function(a) f2(as.numeric(precios_mensuales[1, a])))
pf_ <- sapply(acciones, function(a) f2(as.numeric(precios_mensuales[n + 1, a])))
tab3 <- rbind(
  setNames(c(pi_, "-"), cols),
  setNames(c(pf_, "-"), cols),
  f2(num["acum", ], 1) |> paste0("%"),
  f2(num["anual", ], 1) |> paste0("%"),
  f2(num["vola", ], 1)  |> paste0("%"),
  f2(num["rr", ]),
  f2(num["dd", ], 1)    |> paste0("%"),
  sapply(cols, function(k) paste(fmt_mes(dd[[k]]$pico), "→", fmt_mes(dd[[k]]$minimo))),
  sapply(cols, function(k) if (is.na(dd[[k]]$rec)) "No ha recuperado" else fmt_mes(dd[[k]]$rec)))
rownames(tab3) <- c(paste("Precio", format(fechas_v[1], "%d-%m-%Y"), "(USD)"),
                    paste("Precio", format(fechas_v[n + 1], "%d-%m-%Y"), "(USD)"),
                    "Rendimiento acumulado", "Rendimiento anualizado", "Volatilidad anualizada",
                    "Retorno / riesgo", "Caída máxima", "Pico → mínimo", "Recuperó su pico")
colnames(tab3) <- c(acciones, "Cartera igual")
kable(tab3, align = "rrrr", caption = "Tabla 2. Rendimiento acumulado, anualizado y caída máxima")

DD <- apply(V, 2, function(v) (v / cummax(v) - 1) * 100)
matplot(fechas_v, DD, type = "l", lty = c(1, 1, 1, 2), lwd = c(2, 2, 2, 3),
        col = colores[cols], xlab = "", ylab = "Caída desde el máximo (%)",
        main = "Caída desde el máximo previo (drawdown)")
abline(h = 0, col = "grey60", lty = 3)
legend("bottomleft", legend = c(acciones, "Cartera igual"), col = colores[cols],
       lty = c(1, 1, 1, 2), lwd = c(2, 2, 2, 3), bty = "n", ncol = 4)

tab4 <- data.frame(Año = rownames(anual),
                   apply(anual, 2, function(x) paste0(f2(x, 1), "%")),
                   `Mejor acción` = lider, check.names = FALSE, row.names = NULL)
colnames(tab4)[2:5] <- c(acciones, "Cartera igual")
kable(tab4, align = "lrrrrc", caption = "Tabla 3. Rendimiento anual (%)")

barplot(t(anual[, acciones]), beside = TRUE, col = colores[acciones],
        ylab = "Rendimiento anual (%)", main = "Rendimiento compuesto por año")
abline(h = 0)
legend("topleft", legend = acciones, fill = colores[acciones], bty = "n", horiz = TRUE)

cuenta <- table(factor(lider, levels = acciones))
cat(paste0("**", acciones, "** fue la mejor acción en ", cuenta, " de los ", length(lider), " años", collapse = "; "), ".\n", sep = "")
i_dif <- which.max(apply(anual[, acciones], 1, function(x) max(x) - min(x)))
cat("\nEl contraste más marcado entre acciones se dio en **", rownames(anual)[i_dif], "**: ",
    paste0(acciones, " ", f2(anual[i_dif, acciones], 1), "%", collapse = ", "), ".\n", sep = "")

kable(round(corr, 2), align = "rrr", caption = "Tabla 4. Correlación de los rendimientos mensuales")

vol_cart <- sd(cartera)
pos_cart <- mean(cartera > 0) * 100

rr_todos <- sort(num["rr", ], decreasing = TRUE)

Fuente de datos: Yahoo Finance mediante el paquete quantmod. Informe elaborado con R Markdown.