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 の公式ソース 3 件を組み合わせて照会するスキルです。従来の REST API(api.pub.cafci.org.ar/tipo-renta、/fondo/...、/estadisticas/...)は 2026-04 に廃止されました(CloudFront エッジから HTTP 403 が返されます)。これら 3 件のソースが代わりに使用されます。

データソース

#エンドポイント用途形式サイズ
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 で 403 が返されないよう、ブラウザーのヘッダーが必要です。

初期セットアップ(1 日に 1 回)

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) ファンド + クラスのポートフォリオ構成を取得する

ポートフォリオ構成は、<canvas> の data-pie-chart-items-value 属性として HTML に埋め込まれています。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 にあるクラスを表示して、どれを選ぶか尋ねます。
  • クラスが 1 つだけの場合は、自動的に続行します。

フィールドの対応関係

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、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(個別ファンド情報)

表を含む Markdown:

  • 過去のリターン:1 口当たり価値 + 7 日、1 か月、90 日、180 日、年初来、12 か月。
  • [日付] 時点の値:運用資産、1 口当たり価値。
  • ポートフォリオ構成: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回再試行してください。

結果の提示

  • 短く実用的な要約から始めてください。
  • 一覧/上位N件では、純資産、マーケットシェア、日次変動、主要な手数料(運用会社)を含めてください。
  • ファンド詳細では、名称、運用会社/預託会社、収益タイプ、手数料の全項目、現在の純資産、直近1か月と1年のリターンを含めてください。
  • 当日分のデータがまだ公開されていない場合(週末/祝日)は、直近のレポートの日付を明記してください。

コメント