MODELO ALTMAN ZSCORE PARA EMPRESAS MANUFACTURERAS Y QUE COTIZAN EN BOLSA

Este proyecto tiene como objetivo aplicar el modelo Altman Z-Score a una muestra de 20 empresas del sector textil que cotizan en bolsa, ubicadas en Estados Unidos y Europa, con el fin de estimar su probabilidad de quiebra y establecer si serían viables como receptoras de crédito. Para ello, se realiza un análisis de los estados financieros históricos de los últimos cinco años (2020-2024) y se evalúan indicadores financieros clave según lo estipulado en la metodología original de Altman.

La muestra está conformada por las siguentes empresas: Ralph Lauren Corp (RL.N) Deckers Outdoor Corp (DECK.N) Nike Inc (NKE.N) Skechers USA Inc (SKX.N) VF Corp (VFC.N) Kontoor Brands Inc (KTB.N) Levi Strauss & Co (LEVI.N) Crocs Inc (CROX.OQ) HanesBrands Inc (HBI) Prada SpA (1913.HK) Movado Group Inc (MOV.N) Steven Madden Ltd (SHOO.OQ) Wolverine World Wide Inc (WWW.N) PVH Corp (PVH.N) Unifi Inc (UFI.N) LVMH Moet Hennessy Louis Vuitton SE (LVMH.PA) Adidas AG (ADSGn.DE) Hermes International SCA (HRMS.PA) Christian Dior SE (DIOR.PA) Pandora A/S (PNDORA.CO)

Metodología del Modelo Altman Z-Score

El modelo Altman Z-Score fue desarrollado por Edward Altman en 1968 para predecir la probabilidad de quiebra en empresas manufactureras. El modelo utiliza una combinación lineal de cinco ratios financieros que reflejan la salud económica de una empresa:

𝑍=1.2𝑋1+1.4𝑋2+3.3𝑋3+0.6𝑋4+0.99𝑋5

Donde: X1 (Capital de trabajo / Total de activos): representa la liquidez.

X2 (Utilidades retenidas / Total de activos): mide la rentabilidad acumulada.

X3 (EBIT / Total de activos): indica la rentabilidad operativa (ROA).

X4 (Valor de mercado del capital / pasivo total): mide el apalancamiento de mercado.

X5 (Ventas / Total de activos): evalúa la eficiencia en el uso de activos.

Los valores de Z permiten clasificar a la empresa en tres categorías:

Z ≥ 3.0: Empresa solvente (bajo riesgo de quiebra).

1.81 ≤ Z < 3.0: Zona de precaución (riesgo medio).

Z < 1.81: Empresa insolvente (alto riesgo de quiebra).

Modelo en R

##Cambio de nombre de las variables o ratios financieros-Nuevos vectores##

# índice de liquidez ##IL
# índice de rentabilidad acumulada ## IRA
# Índice de rentabilidad de activos (ROA) ##ROA
# índice de apalancamiento de mercado##IAM
# Rotación de activos totales   ##RAT

c1<-paste0(seq(2020,2024),"_IL")
c2<-paste0(seq(2020,2024),"_IRA")
c3<-paste0(seq(2020,2024),"_ROA")
c4<-paste0(seq(2020,2024),"_IAM")
c5<-paste0(seq(2020,2024),"_RAT")

Se importan los datos financieros desde un archivo Excel. Cada empresa tiene registros de cinco indicadores financieros para los años 2020 a 2024:

library(readxl)
library(ggplot2)
bd <- read_excel("/Users/sofiaartunduaga/Desktop/Econometría/Copia de Base de Datos Modelo Riesgos.xlsx")
## New names:
## • `2020` -> `2020...2`
## • `2021` -> `2021...3`
## • `2022` -> `2022...4`
## • `2023` -> `2023...5`
## • `2024` -> `2024...6`
## • `2020` -> `2020...7`
## • `2021` -> `2021...8`
## • `2022` -> `2022...9`
## • `2023` -> `2023...10`
## • `2024` -> `2024...11`
## • `2020` -> `2020...12`
## • `2021` -> `2021...13`
## • `2022` -> `2022...14`
## • `2023` -> `2023...15`
## • `2024` -> `2024...16`
## • `2020` -> `2020...17`
## • `2021` -> `2021...18`
## • `2022` -> `2022...19`
## • `2023` -> `2023...20`
## • `2024` -> `2024...21`
## • `2020` -> `2020...22`
## • `2021` -> `2021...23`
## • `2022` -> `2022...24`
## • `2023` -> `2023...25`
## • `2024` -> `2024...26`
colnames(bd)
##  [1] "Empresa"   "2020...2"  "2021...3"  "2022...4"  "2023...5"  "2024...6" 
##  [7] "2020...7"  "2021...8"  "2022...9"  "2023...10" "2024...11" "2020...12"
## [13] "2021...13" "2022...14" "2023...15" "2024...16" "2020...17" "2021...18"
## [19] "2022...19" "2023...20" "2024...21" "2020...22" "2021...23" "2022...24"
## [25] "2023...25" "2024...26"
colnames(bd)[2:6]<-c1
colnames(bd)[7:11]<-c2
colnames(bd)[12:16]<-c3
colnames(bd)[17:21]<-c4
colnames(bd)[22:26]<-c5

Se crea una función para calcular el Z-Score usando la fórmula clásica:

colnames(bd)
##  [1] "Empresa"  "2020_IL"  "2021_IL"  "2022_IL"  "2023_IL"  "2024_IL" 
##  [7] "2020_IRA" "2021_IRA" "2022_IRA" "2023_IRA" "2024_IRA" "2020_ROA"
## [13] "2021_ROA" "2022_ROA" "2023_ROA" "2024_ROA" "2020_IAM" "2021_IAM"
## [19] "2022_IAM" "2023_IAM" "2024_IAM" "2020_RAT" "2021_RAT" "2022_RAT"
## [25] "2023_RAT" "2024_RAT"
modeloz1_score<-function(X1,X2,X3,X4,X5){
  Z<-1.2*X1 + 1.4*X2 + 3.3*X3 + 0.6*X4 + 0.99*X5
  return(Z)
}

Para cada año entre 2020 y 2024, se extraen los valores de los cinco ratios correspondientes y se calcula el Z-Score, con base en esto, se asigna una etiqueta de riesgo (“Solvente”, “Precaución”, “Insolvente”):

year<-seq(2020,2024)

resultado_final<-list()
resultado_final_criterio<-list()
for( i in 2:6){
  
  X1<-bd[,i]
  X2<-bd[,i+5]
  X3<-bd[,i+10]
  X4<-bd[,i+15]
  X5<-bd[,i+20]
resultado<- modeloz1_score(X1,X2,X3,X4,X5)
  colnames(resultado)<-paste0("modelo_z_score","_",year[i-1])
    criterio<-ifelse(resultado>=3,"Solvente",
                   ifelse((resultado>=1.8 & resultado <3),"Precaucion","Insolvente"))
  
  criterio<-data.frame(criterio)
  
  colnames(criterio)<-paste0("Probabilidad_Default","_",year[i-1])
  
  
  resultado_final[i-1]<-list(resultado)
  resultado_final_criterio[i-1]<-list(criterio)
  
}

Se consolidan todos los resultados y clasificaciones de los cinco años en un solo DataFrame final:

resultado_final<-do.call("cbind",resultado_final)
resultado_final_criterio<-do.call("cbind",resultado_final_criterio)


bd_final<-cbind(bd,resultado_final,resultado_final_criterio)

Se genera un heatmap para visualizar gráficamente los Z-Scores por empresa y año, donde los colores muestran los valores relativos de riesgo:

Conclusiones

Empresas como Hermès, Deckers y Steven Madden serían candidatas viables para otorgar crédito, debido a sus excelentes indicadores de solvencia.

Empresas como HanesBrands o Christian Dior requieren un análisis más profundo y precaución, ya que sus Z-Scores las colocan en zona de alerta.

colnames(bd)
##  [1] "Empresa"  "2020_IL"  "2021_IL"  "2022_IL"  "2023_IL"  "2024_IL" 
##  [7] "2020_IRA" "2021_IRA" "2022_IRA" "2023_IRA" "2024_IRA" "2020_ROA"
## [13] "2021_ROA" "2022_ROA" "2023_ROA" "2024_ROA" "2020_IAM" "2021_IAM"
## [19] "2022_IAM" "2023_IAM" "2024_IAM" "2020_RAT" "2021_RAT" "2022_RAT"
## [25] "2023_RAT" "2024_RAT"
library(data.table)
resultado_final<-cbind(bd[,1],resultado_final)

resultado_final_2 <- melt(setDT(resultado_final), id.vars = c("Empresa"), variable.name = "year")

nchar(str(resultado_final_2$year[1]))
##  Factor w/ 5 levels "modelo_z_score_2020",..: 1
## integer(0)
resultado_final_2$year<-substr(resultado_final_2$year,19-3,19)


ggplot(resultado_final_2, aes(x = factor(year), y = reorder(Empresa, value))) +
  geom_tile(aes(fill = value), color = "white") +
  scale_fill_gradient(low = "lightblue", high = "red") +
  labs(
    title = "Heatmap de Valor por Empresa y Año",
    x = "Año",
    y = "Empresa",
    fill = "Valor"
  ) +
  theme_minimal() +
  theme(axis.text.y = element_text(size = 8))

ggplot(resultado_final_2, aes(x = factor(year), y = reorder(Empresa, value))) +
  geom_tile(aes(fill = value), color = "white") +
  geom_text(aes(label = round(value, 2)), size = 3) +  # Etiquetas con 2 decimales
  scale_fill_gradient(
    low = "lightblue", high = "red",
    oob = scales::squish
  ) +
  labs(
    title = "Heatmap de Valor por Empresa y Año",
    x = "Año",
    y = "Empresa",
    fill = "Valor"
  ) +
  theme_minimal() +
  theme(axis.text.y = element_text(size = 8))