mcpField
C
cafci-fondos-comunes-argentina

cafci-fondos-comunes-argentina

github.com/ferminrp其他3952 次安装13 周前更新
代码仓库

关于 cafci-fondos-comunes-argentina

cafci-fondos-comunes-argentina 是一项技能,可从 CAFCI 数据源查询阿根廷共同基金公开信息。它整合基金目录、每日财务快照和单只基金详情,涵盖费用、收益及投资组合构成。

主要功能

  1. 01搜索基金目录和份额类别
  2. 02获取每日资产、市场份额及变动
  3. 03查看费用和基金元数据
  4. 04查询所列期间的收益
  5. 05提取主要持仓及其比例

适用场景

  1. 01按名称、类别或启用状态查找基金
  2. 02按资产规模对某类别基金排名
  3. 03整理基金及份额类别的综合资料
  4. 04比较费用、收益和投资组合持仓

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ferminrp/agent-skills --skill cafci-fondos-comunes-argentina

安装后在 Claude Code 中输入/cafci-fondos-comunes-argentina确认已加载。

附带文件parse_cafci.py

详细介绍

阿根廷 CAFCI 共同基金

用于结合 CAFCI 的三个官方数据源,查询阿根廷共同基金公开信息的技能。此前的 REST API(api.pub.cafci.org.ar/tipo-renta、/fondo/...、/estadisticas/...)已于 2026-04 停用(CloudFront edge 返回 HTTP 403)。这三个数据源取代了它。

数据源

#Endpoint用途格式大小
1https://estadisticas.cafci.org.ar/consulta-de-fondos.json目录:基金 + 类别 + ID + 管理费/费用 + 元数据JSON~2.7 MB
2https://api.pub.cafci.org.ar/pb_get每日快照:vcp、资产规模、市场份额、变动XLSX~900 KB
3https://defuddle.md/https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId}单只基金详情:各期间收益(7d/1m/90d/180d/YTD/12m)Markdown~2 KB
4https://estadisticas.cafci.org.ar/fondos/{fondoId}?clase={claseId}(直接 HTML)投资组合构成(主要资产 + 百分比),嵌入在 <canvas> 的属性中HTML~23 KB

无需身份验证,也无需令牌。只有 /pb_get 需要浏览器 headers,否则会返回 403。

初始设置(每天一次)

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 需要 openpyxl(pip3 install openpyxl)。

常见操作

1) 列出收益类型(类别目录)
jq '.filtros.tipo_renta' "$CATALOG"
# [{"id":2,"nombre":"Renta Variable"}, {"id":3,"nombre":"Renta Fija"}, ...]
2) 按名称搜索基金 + 列出带费用的类别
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) 按收益类型列出活跃基金
# 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) 某类别资产规模排名前 N 的基金(使用 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) 单只基金+类别的完整详情(结合 3 个数据源)
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) 单只基金+类别的投资组合构成

投资组合构成嵌入在 HTML 中,作为 <canvas> 的 data-pie-chart-items-value 属性。defuddle 不会捕获该属性。

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))
"

输出:

{
  "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) 根据名称解析 fondoId/claseId
jq -r '.fondos[]
       | select(.nombre | ascii_downcase | contains("ieb estrategico"))
       | "\(.id)\t\(.nombre)\t" + ([.clases[] | "\(.id)=\(.nombre)"] | join(" | "))' "$CATALOG"

推荐工作流

A) 按类别查询资产规模排名前 N 的基金及费用
  1. 从 $DAILY 中筛选 categoria,获取排名前 N 的基金(XLSX 使用“Mercado de Dinero Peso Argentina”“Renta Fija Peso Argentina”等名称)。
  2. 对每个结果 nombre,在 $CATALOG 中按 clases[].nombre 精确匹配类别。
  3. 将资产规模 + 变动(DAILY)与费用 + 管理公司(CATALOG)合并。
B) “一站式”详情
  1. 从目录获取 (fondoId, claseId)(步骤 6)。
  2. 并行查询 3 个数据源:CATALOG(元数据 + 费用)、DAILY(当前资产规模 + 变动)、defuddle(各期间收益)。
  3. 生成可执行摘要:名称、管理/托管公司、收益类型、费用、资产规模、收益。
C) 用户未指定类别时
  • 显示 $CATALOG 中可用的类别,并询问用户选择哪个。
  • 如果只有一个类别,则自动继续。

字段映射

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 → 通过 parse_cafci.py 转为 JSON)
.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(单只基金详情)

包含表格的 Markdown:

  • 历史收益:份额净值 + 7 天、1 个月、90 天、180 天、年初至今、12 个月。
  • 截至 [日期] 的数值:管理资产规模、份额净值。
  • 投资组合构成:defuddle 仅显示日期。实际构成(主要资产 + 百分比)位于直接 HTML 中,是 <canvas> 的 data-pie-chart-items-value 属性——参见操作 6。
  • 管理费和佣金:管理公司、托管公司、申购、赎回、转托管、日常费用、业绩佣金。
  • 基金信息:管理人、托管人、收益类型、DD 类型、地区、基准、投资期限、久期、货币、CNV 代码。
  • 最低投资金额(含货币)。
  • 结算期限。

已知限制

  • 任意时间序列:每日快照仅提供当天 + 昨天 + 上个月 + 年末 + 去年数据。没有公开的自由历史数据端点。
  • 详细投资组合构成:HTML 展示约 14 项主要资产,其余归为“其他资产”(约 30%)。未公开完整明细。
  • 旧版 REST API(api.pub.cafci.org.ar/tipo-renta、/fondo/...、/estadisticas/informacion/diaria/...):自 2026-04 起不可用(CloudFront 主动返回 HTTP 403)。请勿使用或尝试恢复。
  • CATALOG 与 DAILY:CATALOG 统计唯一基金(1134),DAILY 统计类别(4052)。进行关联时,使用 clases[].nombre(CATALOG)↔ fondos[].nombre(DAILY)——二者字符串完全相同。
  • 收益类型:CATALOG 中仅为“Renta Variable”;DAILY 中为“Renta Variable Peso Argentina”(含货币 + 地区)。两者不能互换用作筛选条件。

错误处理

  • api.pub.cafci.org.ar 返回 403 "Route not allowed":缺少 origin、referer、user-agent 请求头。
  • CATALOG 中的 total_fondos == 0:API 可能已宕机;请重试。
  • CATALOG 中的基金在 DAILY 中没有匹配项:检查 .estado(必须为 1)以及类别名称是否完全相同。
  • defuddle.md 超时:短暂等待后重试 1 次。

结果呈现

  • 先提供简短且可执行的摘要。
  • 对于列表/Top N:包括资产规模、市场份额、单日变动和关键费用(管理人)。
  • 对于基金详情:包括名称、管理公司/托管公司、收益类型、完整费用、当前资产规模、最近一个月和一年的回报。
  • 如果当天数据尚未发布(周末/节假日):请说明最近一次报告的日期。

评论

支持 Markdown