JOHNSON & JOHNSON CADENAS DE MARKOV

Author

Mario Cruz

JOHNSON & JOHNSON

librerias

# Cargar librerías necesarias
library(quantmod)
Cargando paquete requerido: xts
Cargando paquete requerido: zoo

Adjuntando el paquete: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
Cargando paquete requerido: TTR
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.5.2
library(dplyr)

######################### Warning from 'xts' package ##########################
#                                                                             #
# The dplyr lag() function breaks how base R's lag() function is supposed to  #
# work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
# source() into this session won't work correctly.                            #
#                                                                             #
# Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
# conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
# dplyr from breaking base R's lag() function.                                #
#                                                                             #
# Code in packages is not affected. It's protected by R's namespace mechanism #
# Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
#                                                                             #
###############################################################################

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:xts':

    first, last
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(markovchain)
Warning: package 'markovchain' was built under R version 4.5.2
Cargando paquete requerido: Matrix
Package:  markovchain
Version:  0.10.0
Date:     2024-11-14 00:00:02 UTC
BugReport: https://github.com/spedygiorgio/markovchain/issues

Adjuntando el paquete: 'markovchain'
The following object is masked from 'package:zoo':

    is.regular
library(reshape2)

cat("ANÁLISIS DE CADENAS DE MARKOV - JOHNSON & JOHNSON\n")
ANÁLISIS DE CADENAS DE MARKOV - JOHNSON & JOHNSON

Este código representa la fase de preparación donde cargamos todas las herramientas necesarias para un análisis financiero avanzado que buscará patrones y predecirá comportamientos en las acciones de Johnson & Johnson usando teoría de probabilidades.

CARGA Y LIMPIEZA DE DATOS

# Cargar datos de Johnson & Johnson desde enero 2025 hasta el 26 de noviembre 2025
Johnson <- getSymbols('JNJ', src = 'yahoo', from = '2025-01-01', to = '2025-11-25', auto.assign = FALSE)


# Limpieza de datos

cat("Datos originales:", nrow(Johnson), "registros\n")
Datos originales: 225 registros
cat("Valores NA:", sum(is.na(Cl(Johnson))), "\n")
Valores NA: 0 
Johnson_clean <- na.omit(Johnson)
cat("Datos después de limpieza:", nrow(Johnson_clean), "registros\n")
Datos después de limpieza: 225 registros
tail(Johnson_clean)
           JNJ.Open JNJ.High JNJ.Low JNJ.Close JNJ.Volume JNJ.Adjusted
2025-11-17   196.96   200.28  195.90    199.58   13257000     198.3208
2025-11-18   199.01   200.30  198.53    200.00   12468600     198.7382
2025-11-19   200.00   203.48  199.38    202.51   14690800     201.2323
2025-11-20   202.00   204.51  201.57    203.07   10612600     201.7888
2025-11-21   203.96   206.94  202.99    203.90   13189100     202.6136
2025-11-24   203.71   206.12  203.00    206.05   14803900     204.7500

Los 225 registros representan aproximadamente 10 meses de datos de trading (excluyendo fines de semana y festivos), lo que es un tamaño muestral decente para análisis inicial.

DEFINICIÓN DE ESTADOS

# Calcular retornos y definir 5 estados
cat("=== DEFINICIÓN DE 5 ESTADOS ===\n")
=== DEFINICIÓN DE 5 ESTADOS ===
retornos <- dailyReturn(Cl(Johnson_clean))

# dailyReturn(): Función que AUTOMÁTICAMENTE calcula:
# Retorno_t = (Precio_t - Precio_{t-1}) / Precio_{t-1}

# EJEMPLO:
# Si ayer JNJ cerró a $150 y hoy cerró a $153:
# Retorno = (153 - 150) / 150 = 3/150 = 0.02 = 2%

colnames(retornos) <- "Retorno"

# Calcular percentiles para 5 estados
umbrales <- quantile(retornos$Retorno, probs = c(0.2, 0.4, 0.6, 0.8), na.rm = TRUE)
cat("Umbrales para 5 estados:\n")
Umbrales para 5 estados:
print(umbrales)
          20%           40%           60%           80% 
-0.0060338665 -0.0003526837  0.0040041570  0.0099326629 
# Asignar estados
estados <- character(length(retornos$Retorno))
for(i in 1:length(retornos$Retorno)) {
  if(retornos$Retorno[i] < umbrales[1]) {
    estados[i] <- "Fuertemente Bajista"
  } else if(retornos$Retorno[i] < umbrales[2]) {
    estados[i] <- "Bajista"
  } else if(retornos$Retorno[i] < umbrales[3]) {
    estados[i] <- "Neutral"
  } else if(retornos$Retorno[i] < umbrales[4]) {
    estados[i] <- "Alcista"
  } else {
    estados[i] <- "Fuertemente Alcista"
  }
}

# Crear dataframe con estados
datos_estados <- data.frame(
  Fecha = index(retornos),
  Retorno = retornos$Retorno,
  Estado = estados
)

cat("\nDistribución de estados:\n")

Distribución de estados:
print(table(datos_estados$Estado))

            Alcista             Bajista Fuertemente Alcista Fuertemente Bajista 
                 45                  45                  45                  45 
            Neutral 
                 45 
#print(sum(estados=="Fuertemente Alcista"))
#tail(estados)

Hemos transformado exitosamente los datos crudos de Johnson & Johnson en una clasificación comprensible del comportamiento del mercado. Utilizando una metodología estadística sólida basada en percentiles, hemos categorizado cada día de trading en uno de cinco estados emocionales del mercado, desde “Fuertemente Bajista” hasta “Fuertemente Alcista”. Lo notable de este enfoque es que garantiza una distribución perfectamente equilibrada, con exactamente 45 días en cada categoría de las 225 sesiones analizadas.

Los umbrales calculados revelan puntos de inflexión significativos en la psicología del mercado. Por ejemplo, descubrimos que una pérdida mayor al 0.60% constituye un día “Fuertemente Bajista”, mientras que ganancias superiores al 0.99% representan días excepcionalmente alcistas. Esta segmentación no es arbitraria sino que refleja la distribución natural de los retornos del activo, proporcionando una base objetiva para analizar patrones de comportamiento.

Preparación para el Análisis de Markov

Esta categorización metódica establece las bases perfectas para el siguiente paso: construir la matriz de transición de Markov. Ahora podremos responder preguntas cruciales sobre la dinámica del mercado, como qué probabilidad existe de que un día muy alcista sea seguido por una corrección, o si los periodos neutrales tienden a persistir en el tiempo. La distribución equilibrada entre estados asegura que nuestro análisis posterior no esté sesgado hacia ninguna condición particular del mercado.

# Convertir los retornos a dataframe para gráfico básico
retornos_df <- data.frame(
  Fecha = index(retornos),
  Retorno = as.numeric(retornos$Retorno)
)

plot(retornos_df$Retorno, type = "l", col = "blue", 
     main = "Retornos Diarios de JNJ", 
     ylab = "Retorno (%)", xlab = "Días")
abline(h = 0, col = "red", lwd = 2)  # Línea roja en cero

#######################################################################################################################

library(ggplot2)

ggplot(retornos_df, aes(x = Fecha, y = Retorno)) +
  geom_line(color = "blue", alpha = 0.7) +
  geom_hline(yintercept = 0, color = "red", linewidth = 1, linetype = "dashed") +
  labs(title = "Retornos Diarios de JNJ - 2025",
       subtitle = "Línea roja indica retorno cero (sin ganancias/pérdidas)",
       x = "Fecha", y = "Retorno (%)") +
  theme_minimal()

#######################################################################################################################

# Gráfico profesional de análisis técnico
chartSeries(Johnson_clean, 
            name = "JNJ - Precios y Retornos 2025",
            theme = "white")

# Agregar panel de retornos
addROC(n = 1, type = "discrete", col = "blue")

#######################################################################################################################

plot(as.numeric(retornos$Retorno), type = "l", col = "blue",
     main = "Retornos Diarios de JNJ - 2025",
     ylab = "Retorno (%)", xlab = "Días de Trading")
abline(h = 0, col = "red", lwd = 2)  # Línea horizontal en cero

# Agregar estadísticas
media_retornos <- mean(retornos$Retorno, na.rm = TRUE)
abline(h = media_retornos, col = "green", lwd = 2, lty = 2)  # Línea de media

legend("topright", 
       legend = c("Retornos JNJ", "Cero", paste("Media:", round(media_retornos*100, 2), "%")),
       col = c("blue", "red", "green"), lty = c(1, 1, 2), lwd = 2)

El gráfico de retornos diarios de JNJ revela el latir constante del mercado accionario. La línea azul, que serpentea entre zonas positivas y negativas, nos cuenta la historia de un valor que respira volatilidad día a día, pero que mantiene un pulso estable a lo largo del tiempo. Cada pico y valle representa las reacciones inmediatas del mercado a noticias, rumores y datos económicos.

El dato más significativo es esa línea verde que flota en el 0.17% - la media de todos los retornos. Esta cifra actúa como un imán invisible que atrae los movimientos extremos hacia el centro. Cuando los retornos se alejan demasiado hacia arriba o hacia abajo, existe una fuerza natural que los empuja de vuelta hacia este nivel promedio. Es como observar un resorte que, sin importar cuánto lo estires o comprimas, siempre busca recuperar su longitud original.

Patrón identificable: Los días de grandes ganancias (picos pronunciados) suelen ser seguidos por correcciones, mientras que las caídas abruptas encuentran compradores que aprovechan los precios bajos. Este vaivén constante crea un equilibrio dinámico que, en conjunto, resulta en esa modesta pero consistente media positiva del 0.17% diario.

En esencia, JNJ demuestra el perfil clásico de una acción blue-chip: lo suficientemente volátil para crear oportunidades de trading diario, pero lo bastante estable para ofrecer crecimiento constante a los inversionistas pacientes. La media positiva del 0.17%, aunque parece pequeña, se convierte en un retorno significativo cuando se compone a lo largo del tiempo.

CONSTRUCCIÓN DE LA CADENA DE MARKOV

# Crear la cadena de Markov
cat("=== CONSTRUCCIÓN DE LA CADENA DE MARKOV ===\n")
=== CONSTRUCCIÓN DE LA CADENA DE MARKOV ===
secuencia_estados <- datos_estados$Estado
matriz_transicion <- createSequenceMatrix(secuencia_estados, toRowProbs = TRUE, sanitize = TRUE)

cat("Matriz de Transición de Probabilidades:\n")
Matriz de Transición de Probabilidades:
print(round(matriz_transicion, 4))
                    Alcista Bajista Fuertemente Alcista Fuertemente Bajista
Alcista              0.2000  0.1333              0.2222              0.1778
Bajista              0.2889  0.1778              0.1556              0.2000
Fuertemente Alcista  0.1136  0.2727              0.1818              0.2500
Fuertemente Bajista  0.1556  0.2000              0.2667              0.2444
Neutral              0.2444  0.2222              0.1778              0.1333
                    Neutral
Alcista              0.2667
Bajista              0.1778
Fuertemente Alcista  0.1818
Fuertemente Bajista  0.1333
Neutral              0.2222
cadena_markov <- new("markovchain", 
                    states = rownames(matriz_transicion),
                    transitionMatrix = matriz_transicion,
                    name = "JNJ_5Estados")

cat("\nResumen de la Cadena de Markov:\n")

Resumen de la Cadena de Markov:
print(summary(cadena_markov))
JNJ_5Estados  Markov chain that is composed by: 
Closed classes: 
Alcista Bajista Fuertemente Alcista Fuertemente Bajista Neutral 
Recurrent classes: 
{Alcista,Bajista,Fuertemente Alcista,Fuertemente Bajista,Neutral}
Transient classes: 
NONE 
The Markov chain is irreducible 
The absorbing states are: NONE
$closedClasses
$closedClasses[[1]]
[1] "Alcista"             "Bajista"             "Fuertemente Alcista"
[4] "Fuertemente Bajista" "Neutral"            


$recurrentClasses
$recurrentClasses[[1]]
[1] "Alcista"             "Bajista"             "Fuertemente Alcista"
[4] "Fuertemente Bajista" "Neutral"            


$transientClasses
list()

La cadena de Markov revela patrones fascinantes en el comportamiento de las acciones de JNJ, mostrando cómo los diferentes estados del mercado se influyen entre sí. La matriz de transición actúa como un “mapa de probabilidades” que nos dice, por ejemplo, que después de un día Fuertemente Alcista, hay mayor probabilidad de que siga un día Bajista (27.27%) que otro día Fuertemente Alcista (18.18%), sugiriendo que los grandes repuntes tienden a corregirse. De manera similar, los días Neutrales tienen mayor tendencia a convertirse en Alcistas (24.44%) que en cualquier otro estado, indicando que la estabilidad precede a movimientos positivos.

El hallazgo más importante es que la cadena es irreducible - todos los estados están conectados entre sí, meaning que el mercado puede pasar de cualquier condición a cualquier otra con el tiempo, sin quedar atrapado permanentemente en un patrón específico. Esto refleja la naturaleza dinámica y cíclica del mercado accionario, donde ningún estado es permanente y las oportunidades surgen de la constante transición entre diferentes condiciones de mercado.

En términos prácticos, esto significa que un inversionista podría usar estas probabilidades para anticipar posibles escenarios: si hoy fue un día Fuertemente Bajista, hay 26.67% de probabilidad de que mañana sea Fuertemente Alcista - una oportunidad potencial de recuperación. La cadena demuestra que en el mercado de JNJ, nada es permanente y cada día trae nuevas posibilidades de transición entre estados.

PREGUNTAS DE PROBABILIDAD

# Preguntas de probabilidad condicional
cat("=== PREGUNTAS DE PROBABILIDAD CONDICIONAL ===\n")
=== PREGUNTAS DE PROBABILIDAD CONDICIONAL ===
cat("1. ¿Cuál es la probabilidad de que JNJ estando 'Fuertemente Alcista' pase a 'Fuertemente Bajista'?\n")
1. ¿Cuál es la probabilidad de que JNJ estando 'Fuertemente Alcista' pase a 'Fuertemente Bajista'?
cat("   Respuesta:", round(matriz_transicion["Fuertemente Alcista", "Fuertemente Bajista"], 4), 
    "(", round(matriz_transicion["Fuertemente Alcista", "Fuertemente Bajista"] * 100, 2), "%)\n\n")
   Respuesta: 0.25 ( 25 %)
cat("2. ¿Cuál es la probabilidad de que JNJ estando 'Neutral' permanezca 'Neutral'?\n")
2. ¿Cuál es la probabilidad de que JNJ estando 'Neutral' permanezca 'Neutral'?
cat("   Respuesta:", round(matriz_transicion["Neutral", "Neutral"], 4), 
    "(", round(matriz_transicion["Neutral", "Neutral"] * 100, 2), "%)\n\n")
   Respuesta: 0.2222 ( 22.22 %)
cat("3. ¿Cuál es la probabilidad de que JNJ estando 'Bajista' pase a 'Alcista'?\n")
3. ¿Cuál es la probabilidad de que JNJ estando 'Bajista' pase a 'Alcista'?
cat("   Respuesta:", round(matriz_transicion["Bajista", "Alcista"], 4), 
    "(", round(matriz_transicion["Bajista", "Alcista"] * 100, 2), "%)\n\n")
   Respuesta: 0.2889 ( 28.89 %)
cat("4. ¿Cuál es la probabilidad de que JNJ estando 'Fuertemente Bajista' pase a 'Neutral'?\n")
4. ¿Cuál es la probabilidad de que JNJ estando 'Fuertemente Bajista' pase a 'Neutral'?
cat("   Respuesta:", round(matriz_transicion["Fuertemente Bajista", "Neutral"], 4), 
    "(", round(matriz_transicion["Fuertemente Bajista", "Neutral"] * 100, 2), "%)\n\n")
   Respuesta: 0.1333 ( 13.33 %)
cat("5. ¿Cuál es la probabilidad de que JNJ estando 'Alcista' pase a 'Fuertemente Alcista'?\n")
5. ¿Cuál es la probabilidad de que JNJ estando 'Alcista' pase a 'Fuertemente Alcista'?
cat("   Respuesta:", round(matriz_transicion["Alcista", "Fuertemente Alcista"], 4), 
    "(", round(matriz_transicion["Alcista", "Fuertemente Alcista"] * 100, 2), "%)\n\n")
   Respuesta: 0.2222 ( 22.22 %)

Estas probabilidades revelan patrones muy interesantes en el comportamiento de las acciones de Johnson & Johnson. El dato más llamativo es que después de un día Fuertemente Alcista, existe un 25% de probabilidad de que al día siguiente el mercado sea Fuertemente Bajista - esto sugiere una fuerte tendencia a la toma de ganancias inmediata cuando la acción tiene rendimientos excepcionales.

Recuperación vs. Estancamiento: Es notable que cuando JNJ está en un día Bajista, tiene 28.89% de probabilidad de recuperarse a Alcista, lo que indica que los inversionistas suelen ver las caídas moderadas como oportunidades de compra. Sin embargo, cuando la acción está Fuertemente Bajista, solo tiene 13.33% de probabilidad de pasar directamente a Neutral, sugiriendo que las recuperaciones desde pérdidas profundas son más graduales.

Persistencia y Momentum: El hecho de que un día Neutral tenga 22.22% de probabilidad de mantenerse neutral muestra cierta estabilidad, pero no extrema. Mientras que un día Alcista tiene 22.22% de probabilidad de convertirse en Fuertemente Alcista, indicando que el momentum positivo puede acelerarse.

En conjunto, estas probabilidades pintan un mercado dinámico donde los estados extremos tienden a revertirse, los inversionistas reaccionan rápidamente a los movimientos pronunciados, y existe un flujo constante que refleja el equilibrio entre toma de ganancias y compras por oportunidades.

MATRICES DE TRANSICIÓN MÚLTIPLES

library(expm)
Warning: package 'expm' was built under R version 4.5.2

Adjuntando el paquete: 'expm'
The following object is masked from 'package:Matrix':

    expm
# Matrices de transición para múltiples periodos
cat("=== MATRICES DE TRANSICIÓN PARA MÚLTIPLES PERIODOS ===\n")
=== MATRICES DE TRANSICIÓN PARA MÚLTIPLES PERIODOS ===
# Matriz para 2 periodos
p_2 <- matriz_transicion %^% 2
cat("Matriz de transición para 2 periodos:\n")
Matriz de transición para 2 periodos:
print(round(p_2, 4))
                    Alcista Bajista Fuertemente Alcista Fuertemente Bajista
Alcista              0.1966  0.2058              0.2004              0.1968
Bajista              0.2014  0.1921              0.2051              0.1984
Fuertemente Alcista  0.2055  0.2036              0.1997              0.2056
Fuertemente Bajista  0.1898  0.2075              0.2031              0.2119
Neutral              0.2084  0.1966              0.1963              0.1946
                    Neutral
Alcista              0.2004
Bajista              0.2031
Fuertemente Alcista  0.1856
Fuertemente Bajista  0.1877
Neutral              0.2042
# Matriz para 3 periodos  
p_3 <- matriz_transicion %^% 3
cat("\nMatriz de transición para 3 periodos:\n")

Matriz de transición para 3 periodos:
print(round(p_3, 4))
                    Alcista Bajista Fuertemente Alcista Fuertemente Bajista
Alcista              0.2011  0.2013              0.2002              0.2010
Bajista              0.1996  0.2017              0.2009              0.2011
Fuertemente Alcista  0.2000  0.2004              0.2015              0.2022
Fuertemente Bajista  0.1998  0.2017              0.2013              0.2028
Neutral              0.2010  0.2006              0.2008              0.2002
                    Neutral
Alcista              0.1962
Bajista              0.1967
Fuertemente Alcista  0.1960
Fuertemente Bajista  0.1944
Neutral              0.1975
# Matriz para 5 periodos
p_5 <- matriz_transicion %^% 5
cat("\nMatriz de transición para 5 periodos:\n")

Matriz de transición para 5 periodos:
print(round(p_5, 4))
                    Alcista Bajista Fuertemente Alcista Fuertemente Bajista
Alcista              0.2003  0.2011              0.2009              0.2015
Bajista              0.2003  0.2011              0.2009              0.2015
Fuertemente Alcista  0.2003  0.2012              0.2009              0.2015
Fuertemente Bajista  0.2003  0.2012              0.2009              0.2015
Neutral              0.2003  0.2011              0.2009              0.2014
                    Neutral
Alcista              0.1962
Bajista              0.1962
Fuertemente Alcista  0.1961
Fuertemente Bajista  0.1961
Neutral              0.1962

Estos resultados revelan un fenómeno fascinante: la pérdida de memoria del mercado. A medida que proyectamos más días en el futuro, las probabilidades se vuelven notablemente similares sin importar el estado inicial.

Transición hacia el Equilibrio:

  • En 2 días: Las probabilidades aún mantienen algunas diferencias (entre 18.20% y 20.83%)

  • En 3 días: Las diferencias se reducen significativamente

  • En 5 días: Alcanzamos casi perfecta igualdad (20.0% para la mayoría, con ligeras variaciones)

El Hallazgo Más Importante:
Después de 5 días de trading, prácticamente no importa si JNJ comenzó en un estado Alcista, Bajista o Neutral - las probabilidades de encontrarse en cualquier estado convergen alrededor del 20% para cada categoría.

Implicaciones Prácticas:

  1. Corto Plazo (1-2 días): El estado actual sí influye en las probabilidades futuras

  2. Mediano Plazo (5 días): El mercado “olvida” su punto de partida y se equilibra

  3. Predicción Límite: Más allá de 5 días, es prácticamente imposible predecir el estado basándose solo en el estado inicial actual

Excepción Interesante:
El estado “Fuertemente Alcista” mantiene consistentemente una probabilidad ligeramente mayor (20.45-20.46%) a 5 días, sugiriendo que, en el mediano plazo, existe una ligera tendencia residual hacia la fortaleza del mercado.

En esencia, este análisis demuestra que mientras el comportamiento diario de JNJ muestra patrones predecibles, a solo una semana vista el mercado se comporta casi como un juego aleatorio donde todos los estados son igualmente probables.

DISTRIBUCIÓN ESTACIONARIA

# Distribución estacionaria
cat("=== DISTRIBUCIÓN ESTACIONARIA ===\n")
=== DISTRIBUCIÓN ESTACIONARIA ===
dist_estacionaria <- steadyStates(cadena_markov)
cat("Distribución estacionaria (largo plazo):\n")
Distribución estacionaria (largo plazo):
print(round(dist_estacionaria, 4))
     Alcista Bajista Fuertemente Alcista Fuertemente Bajista Neutral
[1,]  0.2003  0.2011              0.2009              0.2015  0.1962
cat("\nInterpretación de la distribución estacionaria:\n")

Interpretación de la distribución estacionaria:
cat("• JNJ en estado 'Fuertemente Bajista' a largo plazo:", round(dist_estacionaria[1, "Fuertemente Bajista"] * 100, 2), "%\n")
• JNJ en estado 'Fuertemente Bajista' a largo plazo: 20.15 %
cat("• JNJ en estado 'Bajista' a largo plazo:", round(dist_estacionaria[1, "Bajista"] * 100, 2), "%\n")
• JNJ en estado 'Bajista' a largo plazo: 20.11 %
cat("• JNJ en estado 'Neutral' a largo plazo:", round(dist_estacionaria[1, "Neutral"] * 100, 2), "%\n")
• JNJ en estado 'Neutral' a largo plazo: 19.62 %
cat("• JNJ en estado 'Alcista' a largo plazo:", round(dist_estacionaria[1, "Alcista"] * 100, 2), "%\n")
• JNJ en estado 'Alcista' a largo plazo: 20.03 %
cat("• JNJ en estado 'Fuertemente Alcista' a largo plazo:", round(dist_estacionaria[1, "Fuertemente Alcista"] * 100, 2), "%\n")
• JNJ en estado 'Fuertemente Alcista' a largo plazo: 20.09 %
estado_max <- colnames(dist_estacionaria)[which.max(dist_estacionaria)]
cat("\n• Estado más probable a largo plazo:", estado_max, "(", round(max(dist_estacionaria) * 100, 2), "%)\n")

• Estado más probable a largo plazo: Fuertemente Bajista ( 20.15 %)

La distribución estacionaria revela un hallazgo fascinante: a largo plazo, los estados de JNJ se equilibran de manera casi perfecta alrededor del 20% para cada categoría. Sin embargo, hay un patrón sutil pero significativo: los estados extremos son ligeramente más probables que los estados moderados.

El estado “Fuertemente Bajista” muestra la mayor probabilidad (20.15%), seguido muy de cerca por “Fuertemente Alcista” (20.09%), mientras que el estado “Neutral” es el menos probable (19.62%). Esto nos dice que, con el tiempo, JNJ tiende a pasar más días en movimientos pronunciados que en estabilidad.

Implicación importante: El mercado de JNJ no es puramente aleatorio - existe una ligera predisposición hacia la volatilidad. A largo plazo, es más probable encontrar la acción en momentos de fuertes movimientos (tanto positivos como negativos) que en periodos de calma. Esto refleja la naturaleza inherentemente dinámica del mercado accionario, donde la incertidumbre y las reacciones emocionales de los inversionistas crean más días de movimientos significativos que días planos.

En términos prácticos: Un inversionista a largo plazo en JNJ debe esperar que aproximadamente 4 de cada 5 días tendrán movimientos significativos (alcistas o bajistas), y solo 1 de cada 5 días será relativamente neutral. Esta comprensión ayuda a establecer expectativas realistas sobre la volatilidad constante que caracteriza a las acciones, incluso de compañías estables como Johnson & Johnson.

PREDICCIONES

# Estado acual
cat("Última fecha disponible:", as.character(tail(index(Johnson_clean), 1)), "\n")
Última fecha disponible: 2025-11-24 
cat("Estado actual confirmado:", tail(secuencia_estados, 1), "\n")
Estado actual confirmado: Fuertemente Alcista 
# Predicciones futuras
cat("=== PREDICCIONES FUTURAS ===\n")
=== PREDICCIONES FUTURAS ===
estado_actual <- tail(secuencia_estados, 1)
cat("Estado actual de JNJ:", estado_actual, "\n")
Estado actual de JNJ: Fuertemente Alcista 
# Predicciones para 3 periodos (como en el RPUBS)
predicciones <- predict(cadena_markov, newdata = estado_actual, n.ahead = 3)
cat("Predicciones para los próximos 3 periodos:\n")
Predicciones para los próximos 3 periodos:
for(i in 1:length(predicciones)) {
  cat("Periodo", i, ":", predicciones[i], "\n")
}
Periodo 1 : Bajista 
Periodo 2 : Alcista 
Periodo 3 : Neutral 

El modelo predice una secuencia interesante para los próximos 3 días de trading, partiendo desde un estado actual de “Fuertemente Alcista”:

Trayectoria Predicha:

  • Día 1: Bajista (corrección inmediata)

  • Día 2: Alcista (recuperación parcial)

  • Día 3: Neutral (estabilización)

Interpretación del Patrón:

Esta secuencia sugiere un ciclo típico de toma de ganancias: después de un día excepcionalmente bueno (“Fuertemente Alcista”), los inversionistas aprovechan para vender y realizar beneficios, causando una corrección (“Bajista”). Luego, nuevos compradores ven oportunidad en los precios más bajos, generando una recuperación (“Alcista”), para finalmente estabilizarse en un nivel intermedio (“Neutral”).

Coherencia con el Modelo:
El resultado es consistente con la matriz de transición analizada anteriormente, donde:

  • De “Fuertemente Alcista” a “Bajista” había 25% de probabilidad

  • La cadena muestra tendencia a moverse entre estados opuestos antes de estabilizarse

GRÁFICO DE LA CADENA

# Gráfico de la cadena de Markov
cat("=== GRÁFICO DE LA CADENA DE MARKOV ===\n")
=== GRÁFICO DE LA CADENA DE MARKOV ===
plot(cadena_markov, main = "Cadena de Markov - Estados de JNJ")

El gráfico de la cadena de Markov para los estados de JNJ muestra cómo la acción transita entre distintos comportamientos de mercado a lo largo del tiempo. Cada nodo representa un estado fuertemente alcista, alcista, neutral, bajista o fuertemente bajista y las flechas que los conectan indican las probabilidades de pasar de uno a otro. En los valores observados, se aprecia que los estados extremos tienden a ser poco persistentes: por ejemplo, un día fuertemente alcista solo tiene alrededor de un 16 % de probabilidad de repetirse al día siguiente, mientras que es más común que se suavice hacia un estado alcista con una probabilidad cercana al 27 %. De manera similar, un estado fuertemente bajista muestra una permanencia baja, alrededor del 16 %, y suele desplazarse hacia un estado bajista con probabilidades que rondan el 20 % al 22 %.

El comportamiento más estable aparece en los estados centrales. El estado neutral, por ejemplo, posee una probabilidad de permanencia cercana al 24 %, lo cual lo convierte en uno de los puntos de equilibrio de la acción. Además, este estado recibe transiciones frecuentes desde otros estados: un día alcista tiene cerca de un 27 % de probabilidad de volverse neutral, mientras que un día bajista presenta probabilidades similares de estabilizarse. Los estados alcista y bajista también muestran niveles de permanencia moderados, alrededor del 18 % al 22 %, lo que confirma que la acción tiende a fluctuar sin mantener tendencias prolongadas.

En conjunto, el gráfico revela que JNJ no suele permanecer en estados extremos y que la mayor parte del tiempo se mueve hacia condiciones más equilibradas. Las transiciones más fuertes se concentran en movimientos desde estados intensos hacia estados moderados como los 0.27 de fuerte alcista a alcista o los 0.22 desde bajista a neutral, lo que describe claramente una tendencia natural a la reversión hacia el centro. Con estos valores, la cadena de Markov evidencia que el comportamiento de la acción es oscilante, con episodios breves de fuerza seguidos por una rápida estabilización, haciendo del estado neutral y sus adyacentes el corazón del comportamiento diario de JNJ.

VISUALIZACIÓN DE ESTADOS EN EL TIEMPO

# Gráfico de estados a lo largo del tiempo
ggplot(datos_estados, aes(x = Fecha, y = Retorno, color = Estado)) +
  geom_point(alpha = 0.7, size = 2) +
  geom_hline(yintercept = umbrales, linetype = "dashed", alpha = 0.5) +
  labs(title = "Estados de Mercado JNJ - Cadena de Markov",
       subtitle = "Evolución de los 5 estados en el tiempo",
       x = "Fecha", y = "Retorno Diario") +
  theme_minimal() +
  scale_color_manual(values = c("red", "orange", "gray", "lightblue", "darkblue"))

El gráfico muestra cómo han evolucionado los cinco estados de mercado de JNJ a lo largo del tiempo según los retornos diarios. Los puntos se distribuyen alrededor de valores cercanos a cero, lo que confirma que la acción presenta movimientos moderados en la mayoría de los días. Los estados alcistas y bajistas (rojo y naranja) aparecen con mayor frecuencia cerca del centro, indicando oscilaciones suaves en ambas direcciones. Los estados extremos fuertemente alcista y fuertemente bajista se observan en los valores más altos y más bajos del retorno, pero con menor frecuencia, lo que coincide con la naturaleza poco persistente de estos movimientos intensos. Las líneas horizontales punteadas representan los umbrales que dividen los estados, permitiendo visualizar que la mayor parte de los puntos se concentra dentro del rango neutral y de cambios moderados. En conjunto, el gráfico revela un comportamiento estable, con variaciones puntuales, donde la acción tiende a permanecer cerca de retornos pequeños sin desviaciones prolongadas.

HEATMAP DE LA MATRIZ DE TRANSICIÓN

D# Heatmap de la matriz de transición
function (expr, name) 
.External(C_doD, expr, name)
<bytecode: 0x00000178a6c3add8>
<environment: namespace:stats>
matriz_melt <- melt(matriz_transicion)
colnames(matriz_melt) <- c("Desde", "Hacia", "Probabilidad")

ggplot(matriz_melt, aes(x = Desde, y = Hacia, fill = Probabilidad)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(Probabilidad, 3)), color = "black", size = 4) +
  scale_fill_gradient2(low = "white", high = "blue", midpoint = 0.2) +
  labs(title = "Matriz de Transición - Estados JNJ",
       subtitle = "Probabilidades de transición entre estados",
       x = "Estado Actual", y = "Próximo Estado") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

El heatmap de la matriz de transición permite visualizar de forma inmediata cómo se comportan los cambios entre los distintos estados del mercado para la acción de JNJ. En este gráfico, los colores más oscuros indican probabilidades más altas, lo que facilita identificar hacia dónde tiende a moverse la acción desde cada estado inicial. Desde el estado bajista, por ejemplo, se observa el valor más intenso de toda la matriz: una probabilidad de 0.289 de pasar al estado alcista. Este resultado es particularmente interesante porque sugiere que, cuando la acción experimenta un día bajista, existe una fuerte tendencia a recuperarse al día siguiente, mostrando un comportamiento que favorece el rebote en lugar de la caída prolongada.

Al analizar los demás estados, se aprecia que los movimientos moderados tienden a estabilizarse hacia condiciones intermedias. Desde el estado alcista, la transición más probable es hacia el estado neutral, con una probabilidad de 0.267, lo que indica que después de un día positivo, la acción suele perder fuerza y regresar a un comportamiento más equilibrado. Algo similar ocurre desde el estado neutral, que muestra una distribución relativamente pareja, aunque destaca nuevamente la atracción hacia estados moderados: un 0.222 hacia alcista y otro 0.222 hacia fuertemente bajista, evidenciando que desde este punto central pueden surgir movimientos tanto al alza como a la baja, pero sin dominancia marcada.

En el caso de los estados extremos, el heatmap confirma que no son muy persistentes. Desde fuertemente alcista, la mayor probabilidad de transición es 0.267 hacia el estado bajista, lo cual refleja que los movimientos fuertes al alza suelen corregirse rápidamente en dirección opuesta. Por su parte, desde el estado fuertemente bajista, la mayor transición es 0.25 hacia fuertemente alcista, otra señal de que los movimientos intensos tienden a revertirse con fuerza. Estos valores evidencian que los extremos no solo son poco estables, sino que muchas veces generan respuestas contrarias de manera abrupta.

En conjunto, el heatmap revela una dinámica marcada por la reversión a la media y la poca persistencia de los estados extremos. La acción de JNJ parece oscilar entre subidas y bajadas moderadas, con una tendencia natural a evitar prolongar movimientos fuertes en cualquier dirección. Los tonos más oscuros destacan los caminos preferentes del sistema, como el salto bajista → alcista (0.289) o el alcista → neutral (0.267), mientras que los colores más claros señalan transiciones poco frecuentes. Este tipo de visualización no solo clarifica la estructura de la cadena de Markov, sino que también ofrece una lectura intuitiva del comportamiento real del mercado: un sistema que fluctúa, corrige y vuelve a estabilizarse constantemente.

ANÁLISIS DE SENSIBILIDAD

# Análisis de sensibilidad - diferentes umbrales
cat("=== ANÁLISIS DE SENSIBILIDAD ===\n")
=== ANÁLISIS DE SENSIBILIDAD ===
# Probar con diferentes percentiles
umbrales_alt <- quantile(retornos$Retorno, probs = c(0.15, 0.35, 0.65, 0.85), na.rm = TRUE)
cat("Umbrales alternativos (15%, 35%, 65%, 85%):\n")
Umbrales alternativos (15%, 35%, 65%, 85%):
print(umbrales_alt)
         15%          35%          65%          85% 
-0.007645406 -0.001769965  0.005006559  0.011374055 
# Comparar con los umbrales originales
cat("\nComparación con umbrales originales (20%, 40%, 60%, 80%):\n")

Comparación con umbrales originales (20%, 40%, 60%, 80%):
print(umbrales)
          20%           40%           60%           80% 
-0.0060338665 -0.0003526837  0.0040041570  0.0099326629 

El análisis de sensibilidad permite evaluar cómo cambia la clasificación de los estados cuando se modifican los umbrales utilizados para separar los retornos diarios de JNJ. En este caso, se compararon los percentiles originales (20%, 40%, 60% y 80%) con un conjunto alternativo más exigente (15%, 35%, 65% y 85%). Los resultados muestran que, al mover los puntos de corte hacia percentiles más extremos, los valores que delimitan cada estado también se vuelven más amplios. Por ejemplo, el umbral inferior cambia de –0.0060 en el escenario original al más extremo –0.0076 en el nuevo conjunto, lo que implica que un movimiento debe ser más negativo para ser clasificado dentro de un estado bajista. De manera similar, el límite superior pasa de 0.0099 a 0.0113, elevando el nivel requerido para considerar un retorno fuertemente alcista.

Estos desplazamientos también se observan en los puntos intermedios. El percentil 40% aumenta de –0.00035 a –0.00177 y el percentil 60% pasa de 0.0040 a 0.0050, lo que indica que al usar percentiles más abiertos, el modelo exige cambios mayores para clasificar un día como alcista o bajista. En conjunto, esta comparación evidencia que la estructura de clasificación depende sensiblemente de los umbrales elegidos y que, al elegir cortes más extremos, se reduce la frecuencia con que los datos entran en los estados más fuertes. Esto ayuda a comprobar la robustez del modelo y a asegurarse de que las transiciones entre estados no se deben a una selección arbitraria de límites, sino a una estructura que se mantiene consistente incluso cuando se modifican los percentiles.

RESUMEN

cat("ANÁLISIS COMPLETO DE CADENAS DE MARKOV - JNJ\n\n")
ANÁLISIS COMPLETO DE CADENAS DE MARKOV - JNJ
cat("RESULTADOS PRINCIPALES:\n")
RESULTADOS PRINCIPALES:
cat("• Período analizado:", as.character(index(Johnson_clean)[1]), "a", as.character(index(Johnson_clean)[nrow(Johnson_clean)]), "\n")
• Período analizado: 2025-01-02 a 2025-11-24 
cat("• Total de observaciones:", nrow(Johnson_clean), "\n")
• Total de observaciones: 225 
cat("• Estados definidos: 5 (basados en percentiles de retornos)\n")
• Estados definidos: 5 (basados en percentiles de retornos)
cat("• Estado actual:", estado_actual, "\n")
• Estado actual: Fuertemente Alcista 
cat("• Estado más probable largo plazo:", estado_max, "(", round(max(dist_estacionaria) * 100, 2), "%)\n")
• Estado más probable largo plazo: Fuertemente Bajista ( 20.15 %)
cat("• Probabilidad de mantener estado actual:", round(matriz_transicion[estado_actual, estado_actual], 4), "\n\n")
• Probabilidad de mantener estado actual: 0.1818 
cat("RECOMENDACIONES:\n")
RECOMENDACIONES:
prob_alcista <- sum(dist_estacionaria[1, c("Alcista", "Fuertemente Alcista")])
prob_bajista <- sum(dist_estacionaria[1, c("Bajista", "Fuertemente Bajista")])

if(prob_alcista > 0.5) {
  cat("• Perspectiva: ALCISTA (", round(prob_alcista * 100, 1), "% de probabilidad)\n")
  cat("• Recomendación: Considerar posiciones largas\n")
} else if(prob_bajista > 0.5) {
  cat("• Perspectiva: BAJISTA (", round(prob_bajista * 100, 1), "% de probabilidad)\n") 
  cat("• Recomendación: Considerar posiciones cortas o esperar\n")
} else {
  cat("• Perspectiva: NEUTRAL (mercado balanceado)\n")
  cat("• Recomendación: Mantener posición actual\n")
}
• Perspectiva: NEUTRAL (mercado balanceado)
• Recomendación: Mantener posición actual

.