library(ggplot2)
library(readxl)
library(moments)
library(aod)
library(strucchange)
library(car)
library(lmtest)
tabla_cruda <- read_xlsx("CasoAccionesBD.xlsx", range = "A2:J30")
head(tabla_cruda)
## # A tibble: 6 × 10
## Accion Y X1 X2 X3 X4 X5 X6 X7 X8
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 39.5 1.76 2.21 3.8 -14.6 3.2 35 1 0
## 2 2 47.5 1.28 3.72 1.4 69.7 11.4 30 1 1
## 3 3 36.5 1 2.48 -15.7 88.7 0.6 29 1 1
## 4 4 33 1.58 2.36 3 4 2.6 27 1 1
## 5 5 91.2 0.28 1.83 10.5 22.4 26.1 44.8 1 0
## 6 6 7 0.11 0.37 11.8 -13.2 24.9 18.2 0 0
dim(tabla_cruda)
## [1] 28 10
names(tabla_cruda)
## [1] "Accion" "Y" "X1" "X2" "X3" "X4" "X5" "X6"
## [9] "X7" "X8"
summary(tabla_cruda)
## Accion Y X1 X2
## Min. : 1.00 Min. : 6.25 Min. :0.0000 Min. :0.310
## 1st Qu.: 7.75 1st Qu.:20.81 1st Qu.:0.2725 1st Qu.:1.022
## Median :14.50 Median :25.00 Median :0.5500 Median :1.655
## Mean :14.50 Mean :29.73 Mean :0.6454 Mean :1.804
## 3rd Qu.:21.25 3rd Qu.:34.72 3rd Qu.:0.9350 3rd Qu.:2.248
## Max. :28.00 Max. :91.25 Max. :1.7600 Max. :5.450
## X3 X4 X5 X6
## Min. :-15.700 Min. :-48.800 Min. :-1.00 Min. : 6.13
## 1st Qu.: 0.225 1st Qu.: 6.575 1st Qu.: 6.90 1st Qu.:14.79
## Median : 6.100 Median : 24.400 Median : 8.95 Median :18.94
## Mean : 7.939 Mean : 35.311 Mean :17.30 Mean :21.03
## 3rd Qu.: 16.500 3rd Qu.: 58.225 3rd Qu.:23.70 3rd Qu.:27.56
## Max. : 42.400 Max. :182.300 Max. :64.70 Max. :44.75
## X7 X8
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000
## Median :1.0000 Median :0.0000
## Mean :0.5714 Mean :0.3571
## 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000
datos <- head(tabla_cruda, 28)
str(datos)
## tibble [28 × 10] (S3: tbl_df/tbl/data.frame)
## $ Accion: num [1:28] 1 2 3 4 5 6 7 8 9 10 ...
## $ Y : num [1:28] 39.5 47.5 36.5 33 91.2 ...
## $ X1 : num [1:28] 1.76 1.28 1 1.58 0.28 0.11 1.3 0.4 0.25 0.91 ...
## $ X2 : num [1:28] 2.21 3.72 2.48 2.36 1.83 0.37 3.99 1.04 1 2.75 ...
## $ X3 : num [1:28] 3.8 1.4 -15.7 3 10.5 11.8 2.5 13.4 17.1 -3.3 ...
## $ X4 : num [1:28] -14.6 69.7 88.7 4 22.4 -13.2 15.7 6.9 38.2 26.4 ...
## $ X5 : num [1:28] 3.2 11.4 0.6 2.6 26.1 24.9 6.3 64.7 19.7 7.4 ...
## $ X6 : num [1:28] 35 30 29 27 44.8 ...
## $ X7 : num [1:28] 1 1 1 1 1 0 1 1 1 0 ...
## $ X8 : num [1:28] 0 1 1 1 0 0 0 0 0 1 ...
head(datos)
## # A tibble: 6 × 10
## Accion Y X1 X2 X3 X4 X5 X6 X7 X8
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 39.5 1.76 2.21 3.8 -14.6 3.2 35 1 0
## 2 2 47.5 1.28 3.72 1.4 69.7 11.4 30 1 1
## 3 3 36.5 1 2.48 -15.7 88.7 0.6 29 1 1
## 4 4 33 1.58 2.36 3 4 2.6 27 1 1
## 5 5 91.2 0.28 1.83 10.5 22.4 26.1 44.8 1 0
## 6 6 7 0.11 0.37 11.8 -13.2 24.9 18.2 0 0
Asumimos que X5 son los Activos y X6 el Precio 91 los que se usaran como instrumentos para X2 este siendo las ganancias.
ml1 <- lm(Y ~ X2 + X3 + X4, data = datos)
summary(ml1)
##
## Call:
## lm(formula = Y ~ X2 + X3 + X4, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.113 -4.966 -3.287 0.804 60.674
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.34932 6.66622 1.553 0.13363
## X2 10.47867 2.82225 3.713 0.00108 **
## X3 0.13650 0.23120 0.590 0.56044
## X4 -0.01707 0.06159 -0.277 0.78401
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.78 on 24 degrees of freedom
## Multiple R-squared: 0.4227, Adjusted R-squared: 0.3506
## F-statistic: 5.859 on 3 and 24 DF, p-value: 0.003768
Se explica la variable potencialmente endógena X2 con los instrumentos siendo X5, X6 y el resto de variables exógenas X3, X4
ETAPA_1 <- lm(X2 ~ X3 + X4 + X5 + X6, data = datos)
summary(ETAPA_1)
##
## Call:
## lm(formula = X2 ~ X3 + X4 + X5 + X6, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.21754 -0.43492 -0.04567 0.37951 2.30637
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.660089 0.461348 1.431 0.1659
## X3 -0.019892 0.013584 -1.464 0.1566
## X4 0.006870 0.003378 2.034 0.0537 .
## X5 -0.017704 0.010069 -1.758 0.0920 .
## X6 0.064905 0.017413 3.727 0.0011 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.781 on 23 degrees of freedom
## Multiple R-squared: 0.6176, Adjusted R-squared: 0.5511
## F-statistic: 9.286 on 4 and 23 DF, p-value: 0.0001282
residuos_v <- ETAPA_1$residuals
ETAPA_2 <- lm(Y ~ X2 + X3 + X4 + residuos_v, data = datos)
summary(ETAPA_2)
##
## Call:
## lm(formula = Y ~ X2 + X3 + X4 + residuos_v, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.394 -6.473 -1.295 0.636 37.028
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.93855 7.48735 -1.327 0.197409
## X2 20.81912 3.50573 5.939 4.7e-06 ***
## X3 0.60755 0.22126 2.746 0.011513 *
## X4 -0.07659 0.05147 -1.488 0.150291
## residuos_v -17.57475 4.57039 -3.845 0.000825 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.98 on 23 degrees of freedom
## Multiple R-squared: 0.6486, Adjusted R-squared: 0.5875
## F-statistic: 10.61 on 4 and 23 DF, p-value: 5.053e-05
En esta fase se consolidan los resultados del modelo de regresión lineal múltiple estimado con la muestra de 28 acciones delAnexo 1, se diagnostica el cumplimiento de supuestos econométricos y se aplican las ecuaciones estimadas para proyectar y evaluar la cartera de inversión propuesta del Anexo 2.
# Estimación del modelo completo con las 8 variables independientes
modelo_completo <- lm(Y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8, data = datos)
summary(modelo_completo)
##
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.5542 -2.1666 0.4654 2.7368 21.6218
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5.833731 6.266995 -0.931 0.3636
## X1 -9.606511 5.298470 -1.813 0.0857 .
## X2 4.387670 2.565001 1.711 0.1034
## X3 -0.033600 0.210619 -0.160 0.8749
## X4 0.024383 0.045307 0.538 0.5967
## X5 0.002512 0.132781 0.019 0.9851
## X6 1.459512 0.278390 5.243 4.64e-05 ***
## X7 4.550163 3.925066 1.159 0.2607
## X8 -0.243180 5.941847 -0.041 0.9678
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.713 on 19 degrees of freedom
## Multiple R-squared: 0.8173, Adjusted R-squared: 0.7404
## F-statistic: 10.63 on 8 and 19 DF, p-value: 1.417e-05
Rendimiento esperado siendo la diferencia entre el precio estimado y el precio actual de mercado.
Salud financiera de la empresa (dividendos, ganancias por acción, crecimiento en ventas e ingresos).
Un plazo de corto a mediano plazo como de 1 año. Los datos históricos corresponden a 1991-1992 para estimar el valor en 1993, por lo que las proyecciones pierden precisión a un horizonte mayor.
Crecimiento en ventas y rentabilidad operacional.
Capacidad de generación de utilidades por acción.
Historial de pago de dividendos.
Comportamiento del precio histórico en bolsa y respaldo de activos.
Definición y Planteamiento del Modelo Econométrico
¿Cuál es la ecuación del modelo que Oscar Aguilar tiene en mente?, plantee la ecuación general a utilizar. Y = β0 + β1X1 + β2X2 + β3X3 + β4X4 + β5X5 + β6X6 + β7X7 + β8X8 + u
¿Cuál es el mejor modelo para predecir una acción?, plantee la ecuación econométrica. Un modelo de Regresión Lineal Múltiple estimado por Mínimos Cuadrados Ordinarios (MCO):
Y_est = β0_est + β1_estX1 + β2_estX2 + β3_estX3 + β4_estX4 + β5_estX5 + β6_estX6 + β7_estX7 + β8_estX8
X1: Dividendo por acción en 1992
X2: Ganancias por acción en 1992
X3: Porcentaje de cambio en ventas totales en 1992
X4: Porcentaje de cambio en ingresos netos de 1992
X5: Porcentaje de cambio en activos
X6: Precio de cierre de la acción al 31/12/1991
X7: Variable dicotómica (1 = Bolsa Mexicana de Valores, 0 = Otro)
X8: Variable dicotómica (1 = Banco o institución de crédito, 0 = Otro)
-Capacidad explicativa como meta un R² ajustado alto y prueba F significativa.
-Significancia individual de los coeficientes (pruebas t y p-valores menores a 0.05 o 0.10).
-Cumplimiento de los supuestos sobre los residuos como normalidad, homocedasticidad e independencia.
-Ausencia de multicolinealidad severa entre las variables independientes.
-Validación y Estadísticas del Modelo
Es una técnica estadística que permite estimar el valor futuro o teórico de una variable en este caso el precio de la acción Y tomando en cuenta el impacto simultáneo de varias variables explicativas financieras, operativas y de mercado.
-Estimación de coeficientes por MCO.
-Evaluación ajuste R² y R² ajustado.
-Prueba de significancia global del modelo Estadístico F.
-Prueba de significancia individual de las variables Prueba t.
-Verificación de supuestos de residuos normalidad, homocedasticidad y multicolinealidad.
Y_est = -5.8337 - 9.6065X1 + 4.3877X2 - 0.0336X3 + 0.0244X4 + 0.0025X5 + 1.4595X6 + 4.5502X7 - 0.2432X8
R² (0.8173): El 81.73% de la variación en el precio de las acciones es explicada por las 8 variables del modelo.
Estadístico F (10.63, p-valor = 0.00001417): Demuestra que el conjunto de variables explicativas influye de forma estadísticamente significativa en el precio de la acción.
Error estándar de la regresión (8.713): Es la desviación promedio del precio real respecto a la predicción del modelo.
Se planteó H0: todos los coeficientes β son iguales a 0.
Se calculó el estadístico F = 10.63.
Se revisó el p-valor (0.00001417).
Como p-valor < 0.05, se rechazó H0 y se concluyó que el modelo es estadísticamente válido a nivel global con más del 95% de confianza.
-Se evaluó la prueba t y el p-valor para cada variable.
-La variable X6 (precio histórico 1991) resultó altamente significativa (p = 0.000046).
-La variable X1 (dividendos) presentó significancia marginal (p = 0.0857).
Las demás variables (X2 a X5, X7 y X8) no mostraron significancia individual (p > 0.10).
Diagnóstico Econométrico de Residuos y Multicolinealidad
# 1. Seleccionar las variables explicativas (X1 a X8) o incluir Y si lo deseas
vars_modelo <- datos[, c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8")]
# 2. Calcular la matriz de correlación
correlacion <- cor(vars_modelo, use = "complete.obs")
# 3. Convertir la matriz a dataframe de forma limpia (Base R)
cor_df <- as.data.frame(as.table(correlacion))
colnames(cor_df) <- c("Var1", "Var2", "Correlacion")
# 4. Gráfico de mapa de calor
ggplot(cor_df, aes(x = Var1, y = Var2, fill = Correlacion)) +
geom_tile(color = "white") +
geom_text(aes(label = round(Correlacion, 2)), color = "black", size = 3.5) +
scale_fill_gradient2(
low = "#5D9CEC",
mid = "white",
high = "#ED5565",
midpoint = 0,
limit = c(-1, 1)
) +
labs(
title = "Matriz de Correlación de Variables Independientes",
x = "",
y = "",
fill = "Correlación"
) +
theme_minimal()
. No se presentó multicolinealidad severa. La correlación más alta ocurrió entre X3 y X8 (-0.716), y entre X2 y X6 (0.595). Ninguna relación superó el umbral crítico de 0.80.
ggplot(data = NULL, aes(x = residuals(modelo_completo))) +
geom_histogram(bins = 10, fill = "navyblue", color = "white") +
labs(title = "Histograma de Residuales del Modelo",
x = "Residuos (e)",
y = "Frecuencia") +
theme_minimal()
No hubo problemas. El histograma de los residuos muestra una forma acampanada y centrada alrededor de cero, confirmando que las perturbaciones siguen una distribución normal.
# Guardar los valores predichos y residuos dentro del dataframe 'datos'
datos$valores_predichos <- ETAPA_2$fitted.values
datos$residuos_etapa2 <- ETAPA_2$residuals
### Diagrama de Dispersion Residuales
ggplot(datos, aes(x = valores_predichos, y = residuos_etapa2)) +
geom_point(color = "darkblue", size = 3) +
geom_hline(yintercept = 0, linetype = "dashed", color = "darkred", size = 1) +
geom_smooth(method = "lm", color = "darkgreen", size = 1, se = FALSE) +
labs(
title = "Gráfica de Dispersión de Residuales",
x = "Valores Ajustados (Predicción de Y)",
y = "Residuos (e)"
) +
theme_minimal()
No. En el gráfico de dispersión de valores ajustados contra residuos, los puntos se distribuyen de manera aleatoria alrededor del eje Y = 0, sin formar patrones ni formas de embudo, cumpliendo con los supuestos de homocedasticidad e independencia.
Se evaluó un modelo de regresión lineal múltiple para 28 acciones con una alta capacidad explicativa R² = 81.73% y validez global confirmada mediante la prueba F (p < 0.001). El diagnóstico econométrico confirmó el cumplimiento de normalidad, homocedasticidad y ausencia de multicolinealidad severa. La variable con mayor peso predictivo individual fue el precio de cierre previo (X6). El modelo es confiable para estimar precios teóricos e identificar acciones subvaluadas en el mercado.
Evaluación de la Cartera de Inversión (Anexo 2)
Cotizan en la Bolsa Mexicana de Valores (X7 = 1).
Presentan un sólido nivel de ganancias por acción (X2) y dividendos (X1).
Muestran crecimiento positivo en sus ventas (X3) e ingresos netos (X4).
KIMBER A: $62.45 (Precio real: $29.56)
VITRO A: $47.96 (Precio real: $14.28)
CEMEX: $40.36 (Precio real: $23.02)
TLEVISA CPO: $38.78 (Precio real: $25.93)
BIMBO A: $20.33 (Precio real: $65.51)
KIMBER A presenta el mejor precio estimado absoluto ($62.45).
Recomendación principal: VITRO A y KIMBER A.
VITRO A: Es la opción con mayor potencial de ganancia, cotiza a $14.28 pero su valor teórico según fundamentales es de $47.96 (subvaluada por más del 200%).
KIMBER A: Presenta el valor estimado más alto ($62.45) sustentado en altas ganancias por acción ($4.52) y cotiza a solo $29.56.
Acción a evitar: BIMBO A, ya que está fuertemente sobrevaluada (precio de mercado de $65.51 frente a un valor estimado de solo $20.33).