CAFCI Fondos Comunes Argentina
Skill para consultar información pública de fondos comunes de inversión en Argentina combinando tres fuentes oficiales de CAFCI. La API REST anterior (api.pub.cafci.org.ar/tipo-renta, /fondo/..., /estadisticas/...) fue discontinuada en 2026-04 (HTTP 403 desde CloudFront edge). Estas tres fuentes la reemplazan.
Fuentes de datos
| # |
Endpoint |
Para qué sirve |
Formato |
Tamaño |
| 1 |
https://estadisticas.cafci.org.ar/consulta-de-fondos.json |
Catálogo: fondos + clases + IDs + honorarios/fees + metadata |
JSON |
~2.7 MB |
| 2 |
https://api.pub.cafci.org.ar/pb_get |
Snapshot diario: vcp, patrimonio, market share, variaciones |
XLSX |
~900 KB |
| 3 |
https://defuddle.md/https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId} |
Ficha individual: rendimientos por período (7d/1m/90d/180d/YTD/12m) |
Markdown |
~2 KB |
| 4 |
https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId} (HTML directo) |
Composición de cartera (top activos + porcentaje) embebida como atributo del <canvas> |
HTML |
~23 KB |
Sin auth, sin token. Sólo /pb_get requiere headers de browser para no devolver 403.
Setup inicial (una vez por día)
DATE=$(date +%F)
TMP="${TMPDIR:-/tmp}"
SKILL_DIR="${SKILL_DIR:-/Users/ripio/Documents/Github/agent-skills/skills/cafci-fondos-comunes-argentina}"
CATALOG="${TMP}/cafci-catalog-${DATE}.json"
DAILY_XLSX="${TMP}/cafci-daily-${DATE}.xlsx"
DAILY="${TMP}/cafci-daily-${DATE}.json"
# 1. Catálogo (1134 fondos, 4549 clases, fees, IDs, metadata)
[ -s "$CATALOG" ] || \
curl -s "https://estadisticas.cafci.org.ar/consulta-de-fondos.json" -o "$CATALOG"
# 2. Snapshot diario (XLSX requiere headers)
[ -s "$DAILY_XLSX" ] || \
curl -s "https://api.pub.cafci.org.ar/pb_get" \
-H "origin: https://www.cafci.org.ar" \
-H "referer: https://www.cafci.org.ar/" \
-H "user-agent: Mozilla/5.0" \
-o "$DAILY_XLSX"
# 3. Parsear XLSX a JSON normalizado
[ -s "$DAILY" ] || \
python3 "${SKILL_DIR}/parse_cafci.py" "$DAILY_XLSX" > "$DAILY"
parse_cafci.py requiere openpyxl (pip3 install openpyxl).
Operaciones comunes
1) Listar tipos de renta (catálogo de categorías)
jq '.filtros.tipo_renta' "$CATALOG"
# [{"id":2,"nombre":"Renta Variable"}, {"id":3,"nombre":"Renta Fija"}, ...]
2) Buscar fondo por nombre + listar clases con fees
jq '.fondos[]
| select(.nombre | ascii_downcase | contains("ahorro"))
| {id, nombre,
tipo_renta: .tipo_renta.nombre,
sociedad_gerente: .sociedad_gerente.nombre,
clases: [.clases[] | {id, nombre,
fee_gerente: .honorarios.administracion_gerente,
fee_depositaria: .honorarios.administracion_depositaria,
ingreso: .honorarios.ingreso,
rescate: .honorarios.rescate}]}' "$CATALOG"
3) Listar fondos activos por tipo de renta
# tipo_renta.id 4 = Mercado de Dinero (ver paso 1 para el mapeo)
jq '.fondos[]
| select(.tipo_renta.id == 4 and .estado == 1)
| {id, nombre, sociedad_gerente: .sociedad_gerente.nombre, codigo_cnv}' "$CATALOG"
4) Top N por patrimonio en una categoría (usa DAILY)
# OJO: las categorías de DAILY combinan tipo_renta + moneda + región como string.
jq '[.fondos[] | select(.categoria == "Mercado de Dinero Peso Argentina")]
| sort_by(.patrimonio) | reverse | .[0:10]
| .[] | {nombre, patrimonio, market_share, variacion_dia_pct, variacion_mes_pct}' "$DAILY"
5) Ficha completa de un fondo+clase (combina las 3 fuentes)
FONDO_ID=1717
CLASE_ID=5772
# (a) Metadata + fees desde CATALOG
jq --argjson fid $FONDO_ID --argjson cid $CLASE_ID '
.fondos[] | select(.id == $fid)
| {id, nombre, codigo_cnv, objetivo, inicio, dias_liquidacion,
sociedad_gerente: .sociedad_gerente.nombre,
sociedad_depositaria: .sociedad_depositaria.nombre,
tipo_renta: .tipo_renta.nombre, region: .region.nombre,
horizonte: .horizonte.nombre, duration: .duration.nombre,
clase: (.clases[] | select(.id == $cid)
| {id, nombre, inversion_minima, honorarios,
ticker_bloomberg, ticker_isin})}' "$CATALOG"
# (b) Rendimientos por período + valor cuotaparte (defuddle markdown)
curl -s "https://defuddle.md/https://estadisticas.cafci.org.ar/fondos/${FONDO_ID}?clase=${CLASE_ID}"
# (c) Snapshot diario por nombre exacto de la clase
CLASE_NOMBRE=$(jq -r --argjson fid $FONDO_ID --argjson cid $CLASE_ID \
'.fondos[] | select(.id == $fid) | .clases[] | select(.id == $cid) | .nombre' "$CATALOG")
jq --arg n "$CLASE_NOMBRE" '.fondos[] | select(.nombre == $n)' "$DAILY"
6) Composición de cartera de un fondo+clase
La composición está embebida en el HTML como atributo data-pie-chart-items-value del <canvas>. defuddle no la captura.
FONDO_ID=1717
CLASE_ID=5772
curl -s "https://estadisticas.cafci.org.ar/fondos/${FONDO_ID}?clase=${CLASE_ID}" | python3 -c "
import sys, re, html, json
h = sys.stdin.read()
m_date = re.search(r'class=\"valores\">Valores al ([^<]+)<', h)
m = re.search(r'data-pie-chart-items-value=\"([^\"]+)\"', h)
print(json.dumps({
'fecha_cartera': m_date.group(1) if m_date else None,
'composicion': json.loads(html.unescape(m.group(1))) if m else []
}, ensure_ascii=False, indent=2))
"
Output:
{
"fecha_cartera": "10/04/2026",
"composicion": [
{"nombre": "Bonos Rep Argentina 2030", "porcentaje": 11.5},
{"nombre": "FCI IAM Liquidez en Dólares - Clase B", "porcentaje": 10.0},
...
{"nombre": "Resto de Activos", "porcentaje": 29.2}
]
}
7) Resolver fondoId/claseId desde un nombre
jq -r '.fondos[]
| select(.nombre | ascii_downcase | contains("ieb estrategico"))
| "\(.id)\t\(.nombre)\t" + ([.clases[] | "\(.id)=\(.nombre)"] | join(" | "))' "$CATALOG"
Workflows recomendados
A) Top N por patrimonio en categoría con fees
- Top N desde
$DAILY filtrando categoria (XLSX usa "Mercado de Dinero Peso Argentina", "Renta Fija Peso Argentina", etc).
- Para cada
nombre resultante, buscar la clase en $CATALOG por clases[].nombre exacto.
- Joinear patrimonio + variaciones (DAILY) con fees + sociedad gerente (CATALOG).
B) Ficha "todo en uno"
(fondoId, claseId) desde catálogo (paso 6).
- Tres queries en paralelo: CATALOG (metadata + fees), DAILY (patrimonio actual + variaciones), defuddle (rendimientos por período).
- Resumen accionable: nombre, sociedad gerente/depositaria, tipo de renta, fees, patrimonio, rendimientos.
C) Si el usuario no especifica clase
- Mostrar las clases disponibles en
$CATALOG y pedir cuál.
- Si hay una sola, continuar automáticamente.
Mapeo de campos
CATALOG (/consulta-de-fondos.json)
.generated_at — timestamp
.total_fondos — 1134
.total_clases — 4549
.filtros — catálogos: tipo_renta, region, horizonte, duration,
benchmark, moneda, sociedad_gerente, tipo_dinero,
tipo_renta_mixta (todos arrays de {id, nombre})
.fondos[] — array de fondos
.id, .nombre, .codigo_cnv, .estado (1=activo), .objetivo, .tipo_dinero,
.valuacion, .dias_liquidacion, .inicio (YYYY-MM-DD), .mm_puro, .mm_indice,
.sociedad_gerente {id, nombre}, .sociedad_depositaria {id, nombre},
.moneda {id, nombre}, .tipo_renta {id, nombre}, .tipo_renta_mixta,
.region {id, nombre}, .duration {id, nombre},
.benchmark {id, nombre}, .horizonte {id, nombre}
.clases[]
.id, .nombre, .moneda {id, nombre}, .inversion_minima,
.suscripcion, .liquidez, .rg384, .log_abierto,
.ticker_bloomberg, .ticker_isin
.honorarios.{ingreso, rescate, transferencia,
administracion_gerente, administracion_depositaria,
gasto_ordinario_gestion} — strings, % anual
DAILY (XLSX → JSON via parse_cafci.py)
.fecha_reporte — YYYY-MM-DD del último día hábil publicado
.categorias[] — 27 strings: "Renta Variable Peso Argentina", etc
(combina tipo_renta + moneda + región)
.fondos[] — 4052 clases con datos diarios
.nombre — nombre completo de la clase (ej "Galileo Acciones - Clase A")
.categoria — categoría XLSX
.moneda — ARS / USD / USB
.region — Arg / Lat / Glo
.horizonte — Cor / Med / Largo / Flex
.fecha — fecha del valor cuotaparte
.vcp_actual — valor cuotaparte hoy
.vcp_anterior — valor cuotaparte día hábil anterior
.variacion_dia_pct — % vs día anterior
.vcp_reexp_pesos — vcp re-expresado en pesos (= vcp_actual para ARS)
.variacion_mes_pct — % vs último día del mes anterior
.variacion_ytd_pct — % vs cierre del año anterior
.variacion_12m_pct — % vs hace 12 meses
.cantidad_cuotapartes
.patrimonio — patrimonio neto en moneda del fondo
.market_share — % del total
.depositaria — nombre de la sociedad depositaria
.codigo_cnv — código CNV
defuddle.md (ficha individual)
Markdown con tablas:
- Rendimiento histórico: Valor Cuotaparte + 7 días, 1 mes, 90 días, 180 días, En el año, 12 meses.
- Valores al [fecha]: patrimonio bajo administración, valor cuotaparte.
- Composición de Cartera: defuddle muestra solo la fecha. La composición real (top activos + porcentaje) está en el HTML directo como atributo
data-pie-chart-items-value del <canvas> — ver operación 6.
- Honorarios y Comisiones: gerente, depositaria, ingreso, egreso, transferencia, gastos ordinarios, comisión de éxito.
- Datos del Fondo: Administradora, Depositaria, Tipo de Renta, Tipo de DD, Región, Benchmark, Horizonte, Duration, Moneda, Código CNV.
- Inversión mínima (con moneda).
- Plazo de Liquidación.
Limitaciones conocidas
- Series temporales arbitrarias: el snapshot diario sólo expone día actual + ayer + mes anterior + fin de año + año pasado. No hay endpoint público de histórico libre.
- Composición de cartera detallada: el HTML expone los
14 activos principales agrupando el resto como "Resto de Activos" (30%). No se publica el desglose completo.
- API REST anterior (
api.pub.cafci.org.ar/tipo-renta, /fondo/..., /estadisticas/informacion/diaria/...): caída desde 2026-04 (HTTP 403 deliberado en CloudFront). No usar ni intentar reactivar.
- CATALOG vs DAILY: CATALOG cuenta fondos únicos (1134), DAILY cuenta clases (4052). Para joinear, usar
clases[].nombre (CATALOG) ↔ fondos[].nombre (DAILY) — son strings exactos.
- Tipo de renta: en CATALOG es solo "Renta Variable"; en DAILY es "Renta Variable Peso Argentina" (con moneda+región). No son intercambiables como filtro.
Manejo de errores
403 "Route not allowed" en api.pub.cafci.org.ar: faltan los headers origin, referer, user-agent.
total_fondos == 0 en CATALOG: probablemente bajó la API; reintentar.
- Fondo en CATALOG sin match en DAILY: revisar
.estado (debe ser 1) y nombre exacto de la clase.
- defuddle.md timeout: reintentar 1 vez con espera breve.
Presentación de resultados
- Empezar con un resumen corto y accionable.
- Para listados/top N: incluir patrimonio, market share, variación día y fees clave (gerente).
- Para ficha: incluir nombre, sociedad gerente/depositaria, tipo de renta, fees completos, patrimonio actual, rendimiento del último mes y año.
- Si los datos del día aún no se publicaron (fin de semana / feriado): aclarar fecha del último reporte.
1---2name: cafci-fondos-comunes-argentina3description: Consulta informacion publica de fondos comunes de inversion en Argentina via CAFCI, combinando catalogo JSON (fondos, clases, IDs y honorarios/fees), planilla diaria XLSX (patrimonio, valor cuotaparte, variaciones, market share) y ficha markdown por fondo (rendimientos por periodo). Usar cuando el usuario pida fondos comunes en Argentina, busqueda de fondo por nombre, fees/comisiones de un fondo, top fondos por patrimonio en una categoria, rendimientos por periodo, o mencione CAFCI.4---5
6# CAFCI Fondos Comunes Argentina
7
8Skill para consultar información pública de fondos comunes de inversión en Argentina combinando tres fuentes oficiales de CAFCI. La API REST anterior (`api.pub.cafci.org.ar/tipo-renta`, `/fondo/...`, `/estadisticas/...`) fue **discontinuada en 2026-04** (HTTP 403 desde CloudFront edge). Estas tres fuentes la reemplazan.
9
10## Fuentes de datos
11
12| # | Endpoint | Para qué sirve | Formato | Tamaño |
13|---|---|---|---|---|
14| 1 | `https://estadisticas.cafci.org.ar/consulta-de-fondos.json` | Catálogo: fondos + clases + IDs + **honorarios/fees** + metadata | JSON | ~2.7 MB |
15| 2 | `https://api.pub.cafci.org.ar/pb_get` | Snapshot diario: vcp, patrimonio, market share, variaciones | XLSX | ~900 KB |
16| 3 | `https://defuddle.md/https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId}` | Ficha individual: rendimientos por período (7d/1m/90d/180d/YTD/12m) | Markdown | ~2 KB |
17| 4 | `https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId}` (HTML directo) | Composición de cartera (top activos + porcentaje) embebida como atributo del `<canvas>` | HTML | ~23 KB |
18
19Sin auth, sin token. Sólo `/pb_get` requiere headers de browser para no devolver 403.
20
21## Setup inicial (una vez por día)
22
23```bash
24DATE=$(date +%F)
25TMP="${TMPDIR:-/tmp}"
26SKILL_DIR="${SKILL_DIR:-/Users/ripio/Documents/Github/agent-skills/skills/cafci-fondos-comunes-argentina}"
27
28CATALOG="${TMP}/cafci-catalog-${DATE}.json"
29DAILY_XLSX="${TMP}/cafci-daily-${DATE}.xlsx"
30DAILY="${TMP}/cafci-daily-${DATE}.json"
31
32# 1. Catálogo (1134 fondos, 4549 clases, fees, IDs, metadata)
33[ -s "$CATALOG" ] || \
34 curl -s "https://estadisticas.cafci.org.ar/consulta-de-fondos.json" -o "$CATALOG"
35
36# 2. Snapshot diario (XLSX requiere headers)
37[ -s "$DAILY_XLSX" ] || \
38 curl -s "https://api.pub.cafci.org.ar/pb_get" \
39 -H "origin: https://www.cafci.org.ar" \
40 -H "referer: https://www.cafci.org.ar/" \
41 -H "user-agent: Mozilla/5.0" \
42 -o "$DAILY_XLSX"
43
44# 3. Parsear XLSX a JSON normalizado
45[ -s "$DAILY" ] || \
46 python3 "${SKILL_DIR}/parse_cafci.py" "$DAILY_XLSX" > "$DAILY"
47```
48
49`parse_cafci.py` requiere `openpyxl` (`pip3 install openpyxl`).
50
51## Operaciones comunes
52
53### 1) Listar tipos de renta (catálogo de categorías)
54
55```bash
56jq '.filtros.tipo_renta' "$CATALOG"
57# [{"id":2,"nombre":"Renta Variable"}, {"id":3,"nombre":"Renta Fija"}, ...]
58```
59
60### 2) Buscar fondo por nombre + listar clases con fees
61
62```bash
63jq '.fondos[]
64 | select(.nombre | ascii_downcase | contains("ahorro"))
65 | {id, nombre,
66 tipo_renta: .tipo_renta.nombre,
67 sociedad_gerente: .sociedad_gerente.nombre,
68 clases: [.clases[] | {id, nombre,
69 fee_gerente: .honorarios.administracion_gerente,
70 fee_depositaria: .honorarios.administracion_depositaria,
71 ingreso: .honorarios.ingreso,
72 rescate: .honorarios.rescate}]}' "$CATALOG"
73```
74
75### 3) Listar fondos activos por tipo de renta
76
77```bash
78# tipo_renta.id 4 = Mercado de Dinero (ver paso 1 para el mapeo)
79jq '.fondos[]
80 | select(.tipo_renta.id == 4 and .estado == 1)
81 | {id, nombre, sociedad_gerente: .sociedad_gerente.nombre, codigo_cnv}' "$CATALOG"
82```
83
84### 4) Top N por patrimonio en una categoría (usa DAILY)
85
86```bash
87# OJO: las categorías de DAILY combinan tipo_renta + moneda + región como string.
88jq '[.fondos[] | select(.categoria == "Mercado de Dinero Peso Argentina")]
89 | sort_by(.patrimonio) | reverse | .[0:10]
90 | .[] | {nombre, patrimonio, market_share, variacion_dia_pct, variacion_mes_pct}' "$DAILY"
91```
92
93### 5) Ficha completa de un fondo+clase (combina las 3 fuentes)
94
95```bash
96FONDO_ID=1717
97CLASE_ID=5772
98
99# (a) Metadata + fees desde CATALOG
100jq --argjson fid $FONDO_ID --argjson cid $CLASE_ID '
101 .fondos[] | select(.id == $fid)
102 | {id, nombre, codigo_cnv, objetivo, inicio, dias_liquidacion,
103 sociedad_gerente: .sociedad_gerente.nombre,
104 sociedad_depositaria: .sociedad_depositaria.nombre,
105 tipo_renta: .tipo_renta.nombre, region: .region.nombre,
106 horizonte: .horizonte.nombre, duration: .duration.nombre,
107 clase: (.clases[] | select(.id == $cid)
108 | {id, nombre, inversion_minima, honorarios,
109 ticker_bloomberg, ticker_isin})}' "$CATALOG"
110
111# (b) Rendimientos por período + valor cuotaparte (defuddle markdown)
112curl -s "https://defuddle.md/https://estadisticas.cafci.org.ar/fondos/${FONDO_ID}?clase=${CLASE_ID}"
113
114# (c) Snapshot diario por nombre exacto de la clase
115CLASE_NOMBRE=$(jq -r --argjson fid $FONDO_ID --argjson cid $CLASE_ID \
116 '.fondos[] | select(.id == $fid) | .clases[] | select(.id == $cid) | .nombre' "$CATALOG")
117jq --arg n "$CLASE_NOMBRE" '.fondos[] | select(.nombre == $n)' "$DAILY"
118```
119
120### 6) Composición de cartera de un fondo+clase
121
122La composición está embebida en el HTML como atributo `data-pie-chart-items-value` del `<canvas>`. defuddle no la captura.
123
124```bash
125FONDO_ID=1717
126CLASE_ID=5772
127
128curl -s "https://estadisticas.cafci.org.ar/fondos/${FONDO_ID}?clase=${CLASE_ID}" | python3 -c "
129import sys, re, html, json
130h = sys.stdin.read()
131m_date = re.search(r'class=\"valores\">Valores al ([^<]+)<', h)
132m = re.search(r'data-pie-chart-items-value=\"([^\"]+)\"', h)
133print(json.dumps({
134 'fecha_cartera': m_date.group(1) if m_date else None,
135 'composicion': json.loads(html.unescape(m.group(1))) if m else []
136}, ensure_ascii=False, indent=2))
137"
138```
139
140Output:
141```json
142{
143 "fecha_cartera": "10/04/2026",
144 "composicion": [
145 {"nombre": "Bonos Rep Argentina 2030", "porcentaje": 11.5},
146 {"nombre": "FCI IAM Liquidez en Dólares - Clase B", "porcentaje": 10.0},
147 ...
148 {"nombre": "Resto de Activos", "porcentaje": 29.2}
149 ]
150}
151```
152
153### 7) Resolver fondoId/claseId desde un nombre
154
155```bash
156jq -r '.fondos[]
157 | select(.nombre | ascii_downcase | contains("ieb estrategico"))
158 | "\(.id)\t\(.nombre)\t" + ([.clases[] | "\(.id)=\(.nombre)"] | join(" | "))' "$CATALOG"
159```
160
161## Workflows recomendados
162
163### A) Top N por patrimonio en categoría con fees
164
1651. Top N desde `$DAILY` filtrando `categoria` (XLSX usa "Mercado de Dinero Peso Argentina", "Renta Fija Peso Argentina", etc).
1662. Para cada `nombre` resultante, buscar la clase en `$CATALOG` por `clases[].nombre` exacto.
1673. Joinear patrimonio + variaciones (DAILY) con fees + sociedad gerente (CATALOG).
168
169### B) Ficha "todo en uno"
170
1711. `(fondoId, claseId)` desde catálogo (paso 6).
1722. Tres queries en paralelo: CATALOG (metadata + fees), DAILY (patrimonio actual + variaciones), defuddle (rendimientos por período).
1733. Resumen accionable: nombre, sociedad gerente/depositaria, tipo de renta, **fees**, patrimonio, rendimientos.
174
175### C) Si el usuario no especifica clase
176
177- Mostrar las clases disponibles en `$CATALOG` y pedir cuál.
178- Si hay una sola, continuar automáticamente.
179
180## Mapeo de campos
181
182### CATALOG (`/consulta-de-fondos.json`)
183
184```
185.generated_at — timestamp
186.total_fondos — 1134
187.total_clases — 4549
188.filtros — catálogos: tipo_renta, region, horizonte, duration,
189 benchmark, moneda, sociedad_gerente, tipo_dinero,
190 tipo_renta_mixta (todos arrays de {id, nombre})
191.fondos[] — array de fondos
192 .id, .nombre, .codigo_cnv, .estado (1=activo), .objetivo, .tipo_dinero,
193 .valuacion, .dias_liquidacion, .inicio (YYYY-MM-DD), .mm_puro, .mm_indice,
194 .sociedad_gerente {id, nombre}, .sociedad_depositaria {id, nombre},
195 .moneda {id, nombre}, .tipo_renta {id, nombre}, .tipo_renta_mixta,
196 .region {id, nombre}, .duration {id, nombre},
197 .benchmark {id, nombre}, .horizonte {id, nombre}
198 .clases[]
199 .id, .nombre, .moneda {id, nombre}, .inversion_minima,
200 .suscripcion, .liquidez, .rg384, .log_abierto,
201 .ticker_bloomberg, .ticker_isin
202 .honorarios.{ingreso, rescate, transferencia,
203 administracion_gerente, administracion_depositaria,
204 gasto_ordinario_gestion} — strings, % anual
205```
206
207### DAILY (XLSX → JSON via `parse_cafci.py`)
208
209```
210.fecha_reporte — YYYY-MM-DD del último día hábil publicado
211.categorias[] — 27 strings: "Renta Variable Peso Argentina", etc
212 (combina tipo_renta + moneda + región)
213.fondos[] — 4052 clases con datos diarios
214 .nombre — nombre completo de la clase (ej "Galileo Acciones - Clase A")
215 .categoria — categoría XLSX
216 .moneda — ARS / USD / USB
217 .region — Arg / Lat / Glo
218 .horizonte — Cor / Med / Largo / Flex
219 .fecha — fecha del valor cuotaparte
220 .vcp_actual — valor cuotaparte hoy
221 .vcp_anterior — valor cuotaparte día hábil anterior
222 .variacion_dia_pct — % vs día anterior
223 .vcp_reexp_pesos — vcp re-expresado en pesos (= vcp_actual para ARS)
224 .variacion_mes_pct — % vs último día del mes anterior
225 .variacion_ytd_pct — % vs cierre del año anterior
226 .variacion_12m_pct — % vs hace 12 meses
227 .cantidad_cuotapartes
228 .patrimonio — patrimonio neto en moneda del fondo
229 .market_share — % del total
230 .depositaria — nombre de la sociedad depositaria
231 .codigo_cnv — código CNV
232```
233
234### defuddle.md (ficha individual)
235
236Markdown con tablas:
237- **Rendimiento histórico**: Valor Cuotaparte + 7 días, 1 mes, 90 días, 180 días, En el año, 12 meses.
238- **Valores al [fecha]**: patrimonio bajo administración, valor cuotaparte.
239- **Composición de Cartera**: defuddle muestra solo la fecha. La composición real (top activos + porcentaje) está en el HTML directo como atributo `data-pie-chart-items-value` del `<canvas>` — ver operación 6.
240- **Honorarios y Comisiones**: gerente, depositaria, ingreso, egreso, transferencia, gastos ordinarios, comisión de éxito.
241- **Datos del Fondo**: Administradora, Depositaria, Tipo de Renta, Tipo de DD, Región, Benchmark, Horizonte, Duration, Moneda, Código CNV.
242- **Inversión mínima** (con moneda).
243- **Plazo de Liquidación**.
244
245## Limitaciones conocidas
246
247- **Series temporales arbitrarias**: el snapshot diario sólo expone día actual + ayer + mes anterior + fin de año + año pasado. No hay endpoint público de histórico libre.
248- **Composición de cartera detallada**: el HTML expone los ~14 activos principales agrupando el resto como "Resto de Activos" (~30%). No se publica el desglose completo.
249- **API REST anterior** (`api.pub.cafci.org.ar/tipo-renta`, `/fondo/...`, `/estadisticas/informacion/diaria/...`): caída desde 2026-04 (HTTP 403 deliberado en CloudFront). No usar ni intentar reactivar.
250- **CATALOG vs DAILY**: CATALOG cuenta fondos únicos (1134), DAILY cuenta clases (4052). Para joinear, usar `clases[].nombre` (CATALOG) ↔ `fondos[].nombre` (DAILY) — son strings exactos.
251- **Tipo de renta**: en CATALOG es solo "Renta Variable"; en DAILY es "Renta Variable Peso Argentina" (con moneda+región). No son intercambiables como filtro.
252
253## Manejo de errores
254
255- `403 "Route not allowed"` en `api.pub.cafci.org.ar`: faltan los headers `origin`, `referer`, `user-agent`.
256- `total_fondos == 0` en CATALOG: probablemente bajó la API; reintentar.
257- Fondo en CATALOG sin match en DAILY: revisar `.estado` (debe ser 1) y nombre exacto de la clase.
258- defuddle.md timeout: reintentar 1 vez con espera breve.
259
260## Presentación de resultados
261
262- Empezar con un resumen corto y accionable.
263- Para listados/top N: incluir patrimonio, market share, variación día y fees clave (gerente).
264- Para ficha: incluir nombre, sociedad gerente/depositaria, tipo de renta, fees completos, patrimonio actual, rendimiento del último mes y año.
265- Si los datos del día aún no se publicaron (fin de semana / feriado): aclarar fecha del último reporte.