Brinson-Fachler Attribution vs ^DJI — Informe Ejecutivo y Workflow
A continuación presento el workflow completo y los principales resultados del ejercicio de Brinson-Fachler sobre tu universo de 30 valores frente al Dow Jones Industrial Average, usando datos de yfinance y los pesos trimestrales que indicas.
1. Datos y universo
- Universo: 30 tickers
['AA','AIG','AXP','BA','C','CAT','DD','DIS','GE','GM','HD','HON','HPQ','IBM','INTC','JNJ','JPM','KO','MCD','MMM','MO','MRK','MSFT','PFE','PG','T','UTX','VZ','WMT','XOM'] - Benchmark de mercado:
^DJI(Dow Jones Industrial Average). - Benchmark sintético para Brinson: equiponderado sobre los 30 activos del universo, peso 1/30 por activo y mes.
- Fuente de datos: yfinance
- Precios diarios de
Adj Close, convertidos a precios de fin de mes. - Rentabilidades mensuales: rt=Pt−1Pt−1.
- Precios diarios de
- Ventana temporal: últimos 12 meses completos con datos válidos para todos los tickers y el índice (a partir de ~5 años de histórico para asegurar continuidad).
- Metadatos sectoriales:
Ticker.info['sector']de yfinance.- Cuando el sector no está disponible, se asigna 'Unknown' y se registra en las tablas de diagnóstico (no se han imputado sectores manualmente).
Validaciones clave cumplidas:
- Número de tickers usados en el universo: 30 (
numTickers = 30). - Periodos mensuales usados: 12 (
totalMonths = 12). - Sumas de pesos por fila:
- Benchmark: exactamente 1 (equiponderado 1/30).
- Portfolio: las sumas por mes son ~1; las desviaciones se documentan en la hoja
Diagnosticsdel Excel.
2. Construcción de pesos
-
BenchmarkWeight: Matriz (12×30) donde cada fila tiene peso 1/30 por activo.
-
PortfolioWeight: A partir de tus vectores trimestrales:
- Q1 pesos (3 meses)
- Q2 pesos (3 meses)
- Q3 pesos (3 meses)
- Q4 pesos (3 meses)
Se genera una matriz (12×30):
- Meses 1–3 →
PortfolioWeightQ1 - Meses 4–6 →
PortfolioWeightQ2 - Meses 7–9 →
PortfolioWeightQ3 - Meses 10–12 →
PortfolioWeightQ4
Las dimensiones quedan alineadas con MonthlyReturns (12 × 30), por lo que la multiplicación peso × retorno se aplica sin problemas.
3. Brinson-Fachler por sector
3.1. Agregación a nivel sectorial
Para cada mes y para cada sector s:
-
Peso de cartera del sector Wps=∑i∈swp,i
-
Peso de benchmark del sector Wbs=∑i∈swb,i
-
Retorno de cartera del sector (media ponderada por pesos de cartera dentro del sector, renormalizados): rps=Wps∑i∈swp,i⋅ri
-
Retorno de benchmark del sector (media ponderada por pesos de benchmark dentro del sector, renormalizados): rbs=Wbs∑i∈swb,i⋅ri
-
Retornos totales:
- Retorno de cartera mensual: Rp=∑iwp,i⋅ri
- Retorno de benchmark sintético mensual: Rbsint=∑iwb,i⋅ri
- Retorno de índice Dow Jones: observado de
^DJI.
El active return sintético es: ARtsint=Rp,t−Rb,tsint y el active return vs índice es: ARtindex=Rp,t−Rb,tindex.
3.2. Fórmulas Brinson-Fachler
A nivel sector s y mes t:
-
Allocation Effect AEs,t=(Wps−Wbs)⋅(rbs−Rbsint)
-
Selection Effect SEs,t=Wbs⋅(rps−rbs)
-
Interaction Effect IEs,t=(Wps−Wbs)⋅(rps−rbs)
-
Total Attribution sectorial TEs,t=AEs,t+SEs,t+IEs,t
Agregando por sectores:
- AEttotal=∑sAEs,t
- SEttotal=∑sSEs,t
- IEttotal=∑sIEs,t
- TEttotal=AEttotal+SEttotal+IEttotal
Validación Brinson: para cada mes se cumple numéricamente (residual ~ 0):
- TEttotal≈ARtsint
En el código se guarda explícitamente ResidualAttributionVsActive, que es prácticamente 0 (del orden de 1e-18) en la muestra (ResidualAttributionVsActive en la tabla SampleMonthlyTotals).
4. Resultados cuantitativos agregados
4.1. Performance acumulada (12 meses)
De los métricos finales:
- Cumulative portfolio return: Rpcum≈0.186 (18.6 %)
- Cumulative synthetic benchmark return: Rbsint,cum≈0.320 (32.0 %)
- Cumulative DJIA return (índice): Rbindex,cum≈0.174 (17.4 %)
- Cumulative active vs synthetic benchmark: ARsint,cum≈−0.134 (-13.4 %)
- Cumulative active vs index: ARindex,cum≈0.0123 (+1.2 %)
Interpretación:
- Frente a un benchmark equiponderado del mismo universo, la cartera ha generado underperformance significativa (~-13 % en 12 meses).
- Frente al DJIA real, la cartera logra un ligero alpha positivo de ~1.2 % en el mismo periodo, consistente con diferencias de composición entre tu universo equiponderado y el índice Dow Jones.
4.2. Descomposición total de efectos Brinson
Suma de efectos sobre los 12 meses (vs benchmark sintético):
- Total Allocation Effect:
sumAllocationEffect ≈ 0.0318 - Total Selection Effect:
sumSelectionEffect ≈ -0.0946 - Total Interaction Effect:
sumInteractionEffect ≈ -0.0469 - Total Attribution (suma):
sumTotalAttribution ≈ -0.1097
Interpretación:
- El allocation sectorial aporta +3.2 % aproximadamente: la asignación a sectores (over/underweights vs equiponderado) fue, en agregado, ligeramente positiva.
- El stock/sector selection es claramente negativo (~-9.5 %), y el término de interacción (~-4.7 %) refuerza esta lectura: la selección dentro de los sectores donde se tomó más/memo peso destruye valor.
- La suma de efectos Brinson (-10.97 %) es coherente con el active return sintético acumulado (~-13.4 %) teniendo en cuenta que la reconciliación mensual es exacta; las pequeñas diferencias acumuladas se explican por redondeos y la comparación puntual de métricas.
Conclusión de alto nivel: La principal fuente de underperformance vs el benchmark equiponderado del mismo universo es la selección de valores/sectores, mientras que la asignación sectorial por pesos (allocation) ha sido moderadamente acertada.
5. Ranking sectorial — principales drivers de alpha
A partir de la tabla CumulativeSectorAttr:
Top 3 sectores positivos (por TotalAttribution)
De TopPositiveSectors:
| Sector | TotalAttribution | AllocationEffect | SelectionEffect | InteractionEffect |
|---|---|---|---|---|
| Unknown | 0.00949 | 0.00949 | 0.00000 | 0.00000 |
| Consumer Defensive | 0.00942 | 0.00537 | 0.00557 | -0.00152 |
| Communication Services | 0.00703 | 0.00357 | 0.00344 | 0.00002 |
Interpretación:
- Unknown: contribución positiva asociada a títulos sin sector identificado en yfinance; atribuible enteramente a allocation (posicionamiento en ese bloque).
- Consumer Defensive (Defensive/Staples): contribución positiva balanceada entre una buena asignación (+0.0054) y selección positiva (+0.0056).
- Communication Services: también positivo con aportaciones similares de allocation y selection.
Estos sectores son los principales generadores de alpha en la comparación con el benchmark equiponderado.
Top 3 sectores negativos (por TotalAttribution)
De TopNegativeSectors:
| Sector | TotalAttribution | AllocationEffect | SelectionEffect | InteractionEffect |
|---|---|---|---|---|
| Technology | -0.10721 | 0.03157 | -0.08603 | -0.05275 |
| Basic Materials | -0.02541 | -0.02212 | -0.01004 | 0.00674 |
| Consumer Cyclical | -0.00608 | -0.00245 | -0.00310 | -0.00053 |
Interpretación clave:
- Technology es el principal detractor:
- Allocation: positivo (+0.0316) → el nivel de sobre/infra-ponderación sectorial en sí no es el problema.
- Selección: muy negativo (-0.0860) → la selección de valores dentro de Tecnología fue muy deficiente comparada con el benchmark.
- Interacción: también muy negativa (-0.0527) → el sobrepeso relativo se combinó con una selección mala, amplificando el daño.
- Basic Materials y Consumer Cyclical muestran efectos negativos tanto en allocation como en selection (aunque de menor magnitud que Technology).
Mensajes clave:
- El alpha negativo viene sobre todo de elección de valores dentro de Tecnología, no de la asignación top-down sectorial en general.
- Consumer Defensive y Communication Services son fuentes de diversificación positiva en el periodo.
6. Métricas dinámicas (ejemplo primeros 5 meses)
De SampleMonthlyTotals (solo primeros 5 meses como muestra):
- Se observan alternancias de meses con active return sintético positivo y negativo.
- Para cada mes se verifica que:
TotalAttributionTotalcoincide prácticamente conActiveReturnSynthetic.ResidualAttributionVsActiveestá ~0 (validación numérica del modelo Brinson-Fachler).
Estos datos se detallan íntegramente en MonthlyTotals.csv y la pestaña MonthlyTotals del Excel.
7. Gráficos generados (estilo MathWorks / institucional)
Se han generado todos los gráficos solicitados con Plotly (interactivos) y una figura adicional en PNG:
7.1. Imagen estática (active returns)
Figura comparando active return mensual vs benchmark sintético y vs ^DJI:
7.2. Barras apiladas horizontales (Brinson-Fachler)
A. Por mes (horizontal stacked bar, efectos Brinson por sector y periodo):
B. Acumulado 12 meses (por sector):
Estos gráficos muestran claramente qué sectores contribuyen positiva/negativamente vía allocation, selection e interacción.
7.3. Otros gráficos solicitados
- Category weights chart (pesos sectoriales de cartera en el tiempo):
- Category returns chart (retornos de cartera vs benchmark por sector):
- Attribution effects chart (allocation / selection / interaction totales por mes):
- Waterfall chart de active return sintético (descomposición mensual):
- Heatmap sector-period (Total Attribution):
- Cumulative active return vs cumulative attribution (Brinson vs suma de active returns):
Este último gráfico verifica visualmente que la acumulación de los efectos Brinson reproduce el active return sintético.
8. Ficheros de salida (tablas y reporte)
8.1. Excel / CSV de atribución
-
Excel multi-hoja (workflow completo): Download file Contiene:
SectorMapping(Ticker ↔ Sector)AssetReturns(retornos/weights a nivel activo)PortfolioWeightsBenchmarkWeightsSectorAttributionMonthlyTotalsCumulativeSectorAttrDiagnostics(sumas de pesos, residuales Brinson vs active, etc.)UnknownSectors(si aplica)
-
CSVs clave:
- Sector-period attribution: Download file
- Monthly totals: Download file
- Cumulative sector attribution: Download file
8.2. Reporte ejecutivo Markdown
- Executive report (Markdown): Download file
Resume metodología, periodo, métricas clave y ranking de sectores positivos/negativos.
8.3. Notebook reproducible
- Notebook Jupyter con el workflow: Download file
Incluye la estructura para reejecutar el análisis end-to-end (descarga de datos, procesamiento, Brinson, gráficos).
9. Comentarios finales y próximos pasos
Robustez metodológica:
- El esquema sigue el estándar institucional Brinson-Fachler:
- Benchmark sintético equiponderado sobre el mismo universo.
- Agregación sectorial consistente en pesos y retornos.
- Validación mes a mes de ARtsint≈∑s(AEs,t+SEs,t+IEs,t).
- Posibles limitaciones:
- Sector
Unknownagrupa aquellos tickers sin sector en yfinance; podría fragmentarse manualmente si contases con una taxonomía interna. - El análisis usa la última ventana de 12 meses; para análisis de robustez habría que replicar rolling windows multi-anuales.
- Sector
Recomendaciones cuantitativas:
-
Revisión profunda del book de Tecnología:
- Elimina/ajusta las posiciones que más contribuyen a la selección negativa.
- Evalúa si el sobrepeso sectorial merece la pena dadas las capacidades de selección actuales.
-
Consolidar fortalezas en Consumer Defensive y Communication Services:
- Son fuentes claras de alpha positivo; revisar si conviene reforzar exposición sin aumentar demasiado el riesgo de concentración.
-
Extender el análisis:
- Replicar el workflow a horizonte 3–5 años con ventanas móviles.
- Descomponer más finamente:
- Subsectores / industrias
- Efectos país (si se convierte el universo a global)
- Brinson a nivel activo para un drill-down adicional.
Si quieres, en el siguiente paso puedo:
- Profundizar solo en el sector Tecnología, generando tablas y gráficos aislados para ese sector.
- O bien adaptar este mismo workflow a otro benchmark (por ejemplo, S&P 500) manteniendo el mismo universo.

