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
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.
| 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. |
Objetivo general
Objetivos específicos
La descarga y el procesamiento se realizaron en RStudio con las siguientes librerías:
getSymbols) y extracción del precio ajustado
(Ad).apply.monthly).lag, index).plot, abline, legend y
barplot.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:
\[R_{anual} = \left(\frac{P_T}{P_0}\right)^{12/n} - 1 \qquad \sigma_{anual} = \sigma_{mensual}\sqrt{12}\]
\[DD_t = \frac{V_t}{\max_{s \le t} V_s} - 1\]
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.
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).
| 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%).
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.
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.
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.
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.
Precios de cierre ajustado mensual, ene 2020 - oct 2026. Valor de una inversión de 100 dólares al inicio del periodo.
| 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%.
Rendimiento compuesto por año calendario. El primer año cubre 11 rendimientos y el último, 10.
| 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%.
| 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).
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.
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.