Lección 7.4.3 · 55 min

PRIIPs, KID y ETFs estadounidenses

Un minorista europeo puede comprar acciones de Apple en su bróker pero no el ETF de EE. UU. que replica el S&P 500. La razón es un documento de tres páginas. Esta lección lee ese documento con código, comprueba sus cifras, calcula su indicador de riesgo y compara el coste de las alternativas con supuestos a la vista.

Fig. — Coste a 20 años de invertir 10.000 EUR frente al índice sin costes, con las hipótesis de la lección (comisiones, divisa y retención del 15 % sobre dividendos)
Lecciones del nivel 7
  1. 7.1 · Ingeniería de software para trading

    1. 7.1.1 Estructura de proyecto, configuración y calidad: del notebook al repositorio
    2. 7.1.2 Rendimiento: medir, perfilar y compilar solo lo que hace falta
    3. 7.1.3 Patrones: eventos, colas de mensajes y arquitectura hexagonal
  2. 7.2 · Infraestructura y despliegue

    1. 7.2.1 Docker y docker-compose: imágenes reproducibles con uv
    2. 7.2.2 VPS, nube y latencia; CI/CD con GitHub Actions
    3. 7.2.3 Orquestación y monitorización: grafos de tareas, logs estructurados, métricas, alertas y latidos
    4. 7.2.4 Seguridad y continuidad: 2FA, IP, copias y procedimientos ante fallos
  3. 7.3 · MLOps para modelos de trading

    1. 7.3.1 Registro de experimentos, modelos y datos: MLflow, DVC y una ejecución reproducida de principio a fin
    2. 7.3.2 Reentrenamiento programado, validación automática y champion/challenger
    3. 7.3.3 Monitorización del modelo en vivo y desactivación automática
    4. 7.3.4 Servir modelos: ONNX, inferencia en CPU o GPU y el coste de los LLM en producción
  4. 7.4 · Regulación, ética y fiscalidad

    1. 7.4.1 MiFID II: clientes, idoneidad y trading algorítmico
    2. 7.4.2 ESMA y CFD: apalancamiento, cierre y saldo negativo
    3. 7.4.3 PRIIPs, KID y ETFs estadounidenses
    4. 7.4.4 MiCA después del transitorio: comprobar un proveedor en los registros
    5. 7.4.5 Abuso de mercado: spoofing, layering y el bot que los imita sin querer
    6. 7.4.6 Fiscalidad del trading en España
    7. 7.4.7 Ética: datos personales, inteligencia artificial y la venta de señales
  5. 7.5 · Carrera profesional quant

    1. 7.5.1 Roles del quant: seis oficios alrededor de un mismo sistema
    2. 7.5.2 Dónde trabajar: qué hace cada empresa y qué dicen los registros
    3. 7.5.3 Portfolio público y entrevistas: enseñar criterio, no rentabilidades
    4. 7.5.4 Certificaciones, formación y prop firms: qué certifica cada cosa y qué mide un examen

Qué es un PRIIP y por qué una acción no lo es

La lección 1.2.2 explicó la regla práctica: un ETF domiciliado en EE. UU. no suele tener documento de datos fundamentales (KID), y sin él un bróker europeo no puede vendérselo a un cliente minorista. Esta lección va a la definición, al documento y a las cifras.

El Reglamento (UE) 1286/2014 se aplica a los productos de inversión minorista empaquetados (PRIIP, por sus siglas en inglés) y a los productos de inversión basados en seguros. El artículo 4.1 define el primero como una inversión en la que, «independientemente de su forma jurídica, el importe reembolsable al inversor minorista está sujeto a fluctuaciones debido a la exposición a determinados valores de referencia o a la evolución de uno o varios activos no adquiridos directamente por tal inversor». Tres casos:

Producto¿PRIIP?Por qué
Acción de una empresa de EE. UU.NoEl inversor compra el activo directamente
ETF de EE. UU. sobre el S&P 500SíEl reembolso depende de acciones que compra el fondo, no el inversor
Opción cotizada sobre ese ETFSíSu valor depende de un activo de referencia

El artículo 5 obliga al productor (la gestora, el emisor) a elaborar el KID y publicarlo antes de ponerlo a disposición de minoristas; el artículo 13, a quien lo vende o asesora a entregarlo con tiempo antes de que el minorista quede obligado. Una gestora de EE. UU. que no comercializa su fondo en la UE no tiene obligación de elaborar un KID, y el bróker no puede elaborarlo por ella. El resultado es el bloqueo que ve el inversor en la pantalla de órdenes. Los fondos UCITS estuvieron exentos (artículo 32) hasta el 31 de diciembre de 2022, fecha a la que lo prorrogó el Reglamento (UE) 2021/2259; desde 2023 también usan el KID de PRIIPs.

nosíETF UCITSopcionesno hayExposición índice¿Minorista?ETF de EE. UU.¿Producto con KID?UCITS, otra divisaRiesgo 7, KID tipoAcciones sueltas
Fuente Mermaid
flowchart TB
  Q[Exposición índice] --> M{¿Minorista?}
  M -- no --> E[ETF de EE. UU.]
  M -- sí --> K{¿Producto con KID?}
  K -- ETF UCITS --> U[UCITS, otra divisa]
  K -- opciones --> O[Riesgo 7, KID tipo]
  K -- no hay --> A[Acciones sueltas]

El KID por dentro: secciones fijas

El artículo 8 del reglamento fija el título («Documento de datos fundamentales»), una declaración inicial que empieza por «Este documento le proporciona información fundamental que debe conocer sobre este producto de inversión. No se trata de material comercial» y las secciones, en este orden: producto y productor; «¿Qué es este producto?»; «¿Qué riesgos corro y qué podría obtener a cambio?», con un indicador resumido de riesgo y escenarios de rentabilidad; «¿Qué pasa si [el productor] no puede pagar?»; «¿Cuáles son los costes?»; «¿Cuánto tiempo debo mantener la inversión, y puedo retirar dinero de manera anticipada?»; «¿Cómo puedo reclamar?» y «Otros datos de interés». Como máximo tres páginas A4 (artículo 6.4).

El Reglamento Delegado (UE) 2017/653 desarrolla el método del riesgo, de los escenarios y de los costes. La Comisión lo modificó en 2021 en lo relativo a la metodología y la presentación de los escenarios, la presentación de los costes y la rentabilidad histórica (lo cuenta el considerando 4 del Reglamento 2021/2259). El formato que se ve hoy, y el de los KID sintéticos del curso, es el modificado.

Que el formato sea fijo es lo que permite leerlo con código. Los datos del nivel 6 traen los KID de cinco ETF UCITS de una gestora ficticia, los mismos que la lección 6.3.2 trocea para un RAG:

IN [01]python
import re

import numpy as np
import pandas as pd

docs = pd.read_parquet("rag6_documentos.parquet")
kids = docs[docs["tipo"] == "kid"].set_index("id_doc")
print(kids[["entidad", "fecha"]].to_string())
print(kids.loc["R10", "texto"][:300])
OUT [01]Los cinco KID del nivel 6
                                            entidad       fecha
id_doc
R10       Sintético Renta Variable Global UCITS ETF  2025-03-01
R12     Sintético Bonos Gobierno Euro 3-7 UCITS ETF  2025-03-01
R14         Sintético Mercados Emergentes UCITS ETF  2025-03-01
R16            Sintético Dividendo Europa UCITS ETF  2025-03-01
R18          Sintético Tecnología EE. UU. UCITS ETF  2025-03-01
# Documento de datos fundamentales — Sintético Renta Variable Global UCITS ETF

*Documento sintético para un curso de formación: empresa, cifras y personas inventadas.*

## Finalidad

Este documento le proporciona información fundamental sobre este producto de inversión. No se trata de material come

Leer y validar un KID con código

Un extractor por secciones y tablas. Las tablas son Markdown, así que basta con partir por |; los números vienen con punto de miles y coma decimal:

IN [02]python
def numero(txt):
    t = txt.replace("EUR", "").replace("%", "").replace(".", "")
    return float(t.replace(",", ".").strip())

def tabla(texto, cabecera):
    bloque = texto.split(cabecera, 1)[1].split("\n\n", 1)[0]
    filas = [f.strip().strip("|").split("|")
             for f in bloque.strip().splitlines()[2:]]
    return [[c.strip() for c in f] for f in filas]

def leer_kid(texto):
    k = {"isin": re.search(r"ISIN (\w{12})", texto).group(1)}
    m = re.search(r"riesgo: (\d) en una escala de 1 a 7\. Periodo de "
                  r"mantenimiento recomendado: (\d+) años", texto)
    k["sri"], k["rhp"] = int(m.group(1)), int(m.group(2))
    for f in tabla(texto, "| Escenario"):
        k[f"esc_{f[0].lower()}_1a"] = numero(f[1])
        k[f"esc_{f[0].lower()}_rhp"] = numero(f[3])
        k[f"rent_{f[0].lower()}_rhp"] = numero(f[4])
    comp = dict((f[0], f[1]) for f in tabla(texto, "| Composición"))
    k["gestion"] = numero(comp["Comisiones de gestión y otros "
                               "costes administrativos"])
    k["operacion"] = numero(comp["Costes de operación"])
    k["entrada_salida"] = (numero(comp["Costes de entrada"])
                           + numero(comp["Costes de salida"]))
    tot = dict((f[0], f[1:]) for f in tabla(texto, "| Inversión de"))
    k["coste_1a"] = numero(tot["Costes totales"][0])
    k["coste_rhp"] = numero(tot["Costes totales"][1])
    k["incidencia"] = numero(tot["Incidencia anual de los costes"][0])
    return k

kid = pd.DataFrame({i: leer_kid(t) for i, t in kids["texto"].items()}).T
kid[["isin", "sri", "rhp", "gestion", "operacion", "incidencia",
     "coste_1a", "coste_rhp"]]
OUT [02]Extractor de KID
             isin sri rhp gestion operacion incidencia coste_1a coste_rhp
R10  ZZ3353919667   4   5     0.2      0.06       0.26     26.0     139.0
R12  ZZ6549778970   2   5    0.12      0.05       0.17     17.0      89.0
R14  ZZ2516219569   5   5    0.35       0.1       0.45     45.0     239.0
R16  ZZ8471203886   4   5     0.3      0.02       0.32     32.0     170.0
R18  ZZ6812181936   5   5    0.25      0.07       0.32     32.0     168.0

Extraer no basta: un KID puede estar mal hecho, mal traducido o desactualizado, y un sistema que se alimenta de ellos (un comparador, un RAG como el de la lección 6.3.3) hereda sus errores. Las comprobaciones que se pueden hacer sin información externa:

  • ISIN. Doce caracteres: dos letras de país, nueve alfanuméricos y un dígito de control que se calcula con el algoritmo de Luhn sobre los dígitos, después de convertir cada letra en un número (A = 10 … Z = 35).
  • Escenarios. La rentabilidad media anual tiene que coincidir con el importe a 5 años; y el orden tiene que ser tensión < desfavorable < moderado < favorable.
  • Costes. La composición tiene que sumar la incidencia anual, y los costes totales del primer año tienen que ser la incidencia sobre 10.000 EUR: el texto prescrito de la presentación de costes supone que el primer año el inversor recupera lo invertido (0 %) y, para los demás periodos, el escenario moderado (preguntas y respuestas del Comité Mixto de las Autoridades Europeas de Supervisión sobre el KID).
IN [03]python
def isin_valido(isin):
    digitos = "".join(str(int(c, 36)) for c in isin[:-1])
    suma = 0
    for i, d in enumerate(reversed(digitos)):
        n = int(d) * (2 if i % 2 == 0 else 1)
        suma += n // 10 + n % 10
    return (10 - suma % 10) % 10 == int(isin[-1])

def validar(k, tol=0.15):
    avisos = []
    if not isin_valido(k["isin"]):
        avisos.append("ISIN: dígito de control")
    esc = ["tensión", "desfavorable", "moderado", "favorable"]
    finales = [k[f"esc_{e}_rhp"] for e in esc]
    if finales != sorted(finales):
        avisos.append("escenarios fuera de orden")
    for e in esc:
        final = k[f"esc_{e}_rhp"] / 10_000
        anual = 100 * (final ** (1 / k["rhp"]) - 1)
        if abs(anual - k[f"rent_{e}_rhp"]) > tol:
            avisos.append(f"rentabilidad {e}: {anual:.2f} %")
    suma = k["gestion"] + k["operacion"] + k["entrada_salida"]
    if abs(suma - k["incidencia"]) > 0.005:
        avisos.append("composición no suma la incidencia")
    if abs(k["coste_1a"] - 100 * k["incidencia"]) > 1:
        avisos.append("coste del primer año no es la incidencia")
    r = 1 + k["rent_moderado_rhp"] / 100
    esperado = 100 * k["incidencia"] * sum(r ** t
                                           for t in range(k["rhp"]))
    desvio = k["coste_rhp"] / esperado - 1
    if abs(desvio) > 0.03:
        avisos.append(f"coste a {k['rhp']} años {100 * desvio:+.1f} % "
                      f"frente al moderado")
    return avisos or ["sin avisos"]

for i, k in kid.iterrows():
    print(i, k["isin"], "|", "; ".join(validar(k)))
OUT [03]Validador de KID
R10 ZZ3353919667 | sin avisos
R12 ZZ6549778970 | sin avisos
R14 ZZ2516219569 | coste a 5 años -3.3 % frente al moderado
R16 ZZ8471203886 | coste a 5 años -3.5 % frente al moderado
R18 ZZ6812181936 | coste a 5 años -4.4 % frente al moderado

Los cinco ISIN tienen el dígito de control correcto; el prefijo ZZ, en cambio, no corresponde a ningún país: es la marca que usan los datos del curso para que nadie confunda estos fondos con fondos reales, y un validador de producción lo comprobaría contra la lista de códigos de país. Escenarios y composición de costes cuadran. El aviso es el de los costes a 5 años: en los cinco documentos son 5,3 veces los del primer año, cuando con el crecimiento del escenario moderado de los fondos de acciones (4,7 % o 4,8 % anual) la suma de cinco años de incidencia sobre un saldo creciente da 5,5. En los tres de R14, R16 y R18 el desvío pasa del 3 %; el de R10 se queda justo por debajo, y en el de bonos (R12), con un moderado del 1,9 %, el factor 5,3 casi coincide con lo esperado. La comprobación es aproximada (el reglamento detalla cómo se acumulan los costes dentro de cada año), pero un factor fijo para productos con rentabilidades distintas es una pregunta para la gestora.

Hay una segunda comprobación que solo se ve al comparar documentos entre sí:

IN [04]python
cols = [c for c in kid.columns if c.startswith("esc_")]
firma = kid[cols].astype(float).round(0).apply(tuple, axis=1)
for _, grupo in kid.groupby(firma):
    if len(grupo) > 1:
        print("mismos escenarios:", ", ".join(
            kids.loc[grupo.index, "entidad"]))
OUT [04]Escenarios idénticos en fondos distintos
mismos escenarios: Sintético Mercados Emergentes UCITS ETF, Sintético Tecnología EE. UU. UCITS ETF
mismos escenarios: Sintético Renta Variable Global UCITS ETF, Sintético Dividendo Europa UCITS ETF

Un fondo de renta variable global y otro de dividendos europeos con los mismos escenarios hasta el euro no es imposible, pero es muy improbable si cada uno se calcula con su propia historia. En estos datos sintéticos los escenarios dependen solo del indicador de riesgo; en un KID real, la misma coincidencia sería un indicio de plantilla copiada y una razón para no tomar las cifras como propias de ese fondo.

El indicador resumido de riesgo, desde la volatilidad

El anexo II del Reglamento Delegado 2017/653 mide el riesgo de mercado con la volatilidad equivalente al VaR (VEV): la volatilidad anualizada que corresponde al valor en riesgo al 97,5 % a lo largo del periodo de mantenimiento recomendado. Para los PRIIPs de la categoría 2 (exposición no apalancada, o con un múltiplo constante, a activos con historia de precios suficiente, como un ETF), el VaR se calcula con los momentos de la distribución de rendimientos de los últimos cinco años: volatilidad, asimetría y exceso de curtosis (una expansión de Cornish-Fisher). La VEV se convierte en clase con una tabla:

Clase de riesgo de mercado1234567
VEV< 0,5 %0,5-5 %5-12 %12-20 %20-30 %30-80 %> 80 %

Si los rendimientos fueran normales, la VEV sería la volatilidad anualizada; con colas gruesas o asimetría negativa es mayor. La aproximación de la celda usa solo la volatilidad de los últimos cinco años y, por tanto, infravalora el riesgo de las series con colas: sirve para entender la tabla, no para calcular un KID. Las series son de los datos del curso:

IN [05]python
etf = pd.read_csv("etf_indice_diario.csv", parse_dates=["fecha"])
fx = pd.read_parquet("fx3_diario.parquet")
ind = pd.read_csv("futuros3_indices_contado.csv", parse_dates=["fecha"])
fut = pd.read_parquet("futuros2_continuos.parquet")
cri = pd.read_parquet("cripto3_diario.parquet")

def s(df, filtro, col):
    return df[filtro].set_index("fecha")[col].sort_index()

series = {
    "BOA (futuro, bono 2 años)": s(fut, fut["mercado"] == "BOA",
                                   "cierre_ajustado"),
    "BOB (futuro, bono 5 años)": s(fut, fut["mercado"] == "BOB",
                                   "cierre_ajustado"),
    "QEVUSD (divisa)": s(fx, fx["par"] == "QEVUSD", "spot"),
    "ETF del nivel 1 (VL)": etf.set_index("fecha")["etf_vl"],
    "RVH (índice)": s(ind, ind["indice"] == "RVH", "contado"),
    "ETF x2 del nivel 1": etf.set_index("fecha")["etf_2x_precio"],
    "XBQ (cripto)": s(cri, (cri["exchange"] == "boreal")
                      & (cri["activo"] == "XBQ"), "cierre_spot"),
}
LIMITES = [0.5, 5, 12, 20, 30, 80]

def clase_mrm(vev_pct):
    return 1 + sum(vev_pct >= x for x in LIMITES)

filas = []
for nombre, p in series.items():
    p = p[p.index > p.index.max() - pd.DateOffset(years=5)]
    r = np.log(p).diff().dropna()
    anual = 365 if "cripto" in nombre else 252
    vol = 100 * r.std() * np.sqrt(anual)
    filas.append((nombre, round(vol, 2), clase_mrm(vol),
                  round(r.skew(), 2), round(r.kurt(), 1)))
mrm = pd.DataFrame(filas, columns=["serie", "vol_pct", "clase",
                                   "asimetria", "exceso_curtosis"])
mrm
OUT [05]Clase de riesgo de mercado aproximada
                       serie  vol_pct  clase  asimetria  exceso_curtosis
0  BOA (futuro, bono 2 años)     1.90      2      -0.35              1.5
1  BOB (futuro, bono 5 años)     4.82      2      -0.31              1.3
2            QEVUSD (divisa)     8.22      3      -0.19              0.8
3       ETF del nivel 1 (VL)    20.51      5       0.28              7.0
4               RVH (índice)    21.52      5      -0.03              0.8
5         ETF x2 del nivel 1    40.98      6       0.11              7.0
6               XBQ (cripto)    57.86      6      -0.12              2.3
Fig. — Volatilidad anualizada de cinco años de siete series del curso sobre los tramos de la clase de riesgo de mercado del Reglamento Delegado 2017/653 (aproximación normal)

Dos lecciones salen de la tabla. La primera: el ETF del nivel 1 queda a medio punto de la frontera entre 4 y 5. Un cambio pequeño de la volatilidad de cinco años mueve el número que ve el inversor, por eso el reglamento pide al productor hacer un seguimiento de los datos del indicador. La segunda: las series con exceso de curtosis alto, como el ETF del nivel 1 y su versión x2 (7,0), tendrían con el cálculo completo una VEV mayor que su volatilidad; para las series casi normales, como el índice RVH o la divisa, la aproximación se acerca más.

El indicador resumido combina la clase de mercado con una clase de riesgo de crédito (del emisor o de quien debe pagar). La tabla de la parte 3 del anexo II, tal cual:

IN [06]python
IRR = {  # filas: clase de crédito 1-6; columnas: clase de mercado 1-7
    1: [1, 2, 3, 4, 5, 6, 7],
    2: [1, 2, 3, 4, 5, 6, 7],
    3: [3, 3, 3, 4, 5, 6, 7],
    4: [5, 5, 5, 5, 5, 6, 7],
    5: [5, 5, 5, 5, 5, 6, 7],
    6: [6, 6, 6, 6, 6, 6, 7],
}

def indicador(clase_mercado, clase_credito):
    return IRR[clase_credito][clase_mercado - 1]

for m, c in [(2, 1), (2, 4), (5, 3), (7, 1)]:
    print(f"mercado {m}, crédito {c} -> indicador {indicador(m, c)}")
OUT [06]Del riesgo de mercado y de crédito al indicador resumido
mercado 2, crédito 1 -> indicador 2
mercado 2, crédito 4 -> indicador 5
mercado 5, crédito 3 -> indicador 5
mercado 7, crédito 1 -> indicador 7

Un fondo UCITS, con los activos separados en el depositario, suele tener riesgo de crédito bajo y su indicador es su clase de mercado. Un producto estructurado de un emisor débil puede tener un riesgo de mercado de 2 y un indicador de 5. Y los derivados son otra historia: el punto 4 del anexo II incluye en la categoría 1 los PRIIPs en los que se puede perder más de lo invertido y los derivados de los puntos 4 a 10 de la sección C del anexo I de MiFID II, y el punto 8 les asigna la clase de mercado 7. Una opción cotizada, un futuro o un CFD llevan indicador 7, sea cual sea la volatilidad del subyacente.

Escenarios de rentabilidad: lo que dicen y lo que no

Desde la modificación de 2021, los escenarios desfavorable, moderado y favorable de un PRIIP de categoría 2 salen de la historia del producto o de su índice de referencia: según las preguntas y respuestas del Comité Mixto, esa historia tiene que cubrir al menos 10 años y 5 más que el periodo de mantenimiento recomendado, se parte en subintervalos de la longitud de ese periodo y los resultados se ordenan para elegir cada escenario. El escenario de tensión se calcula aparte. Para ver de dónde salen esas cifras, una ilustración con la serie de un índice del nivel 3 (no es el método exacto del anexo IV, que tiene más pasos):

IN [07]python
rva = s(ind, ind["indice"] == "RVA", "contado").resample("ME").last()
finales = 10_000 * (rva.shift(-60) / rva).dropna()
print(f"{len(rva)} meses ({rva.index.min():%Y-%m} a "
      f"{rva.index.max():%Y-%m}); {len(finales)} ventanas de 5 años")
print(finales.quantile([0, 0.1, 0.5, 0.9, 1]).round(0).to_string())
OUT [07]Resultados de todas las ventanas de 5 años (ilustración)
192 meses (2010-01 a 2025-12); 132 ventanas de 5 años
0.0    11197.0
0.1    13047.0
0.5    17419.0
0.9    21629.0
1.0    37766.0

Con 16 años de historia mensual caben 132 ventanas de cinco años, con resultados entre 11.197 y 37.766 EUR y la mediana en 17.419. Casi todas se solapan: no son 133 observaciones independientes, son tres periodos de cinco años vistos desde distintos puntos de partida. Los escenarios de un KID resumen el pasado de ese producto con una regla común a todos los productos para que sean comparables; no son previsiones, y el propio documento lo dice («Los escenarios son ilustrativos y se basan en la evolución pasada»).

Alternativas para un minorista y lo que cuestan

AlternativaQué haceLo que se ganaLo que se pierde
ETF UCITS del mismo índiceFondo domiciliado en la UE con KIDSe puede comprar como minorista; protección UCITSOtro ticker, a veces otra divisa y otra bolsa; la retención sobre dividendos de EE. UU. se queda dentro del fondo (lección 7.4.6)
Opciones cotizadas sobre el ETF de EE. UU.Derivado con KID del tipo de contratoExposición apalancada o cubiertaIndicador de riesgo 7, conveniencia obligatoria (lección 7.4.1), decaimiento temporal y margen
Acciones del índice una a unaCompra directa: no son PRIIPsSin KID ni comisión de gestiónMuchas órdenes, comisiones y divisa por cada una; réplica imperfecta
Pasar a cliente profesionalFuera del ámbito de PRIIPsAcceso al ETF de EE. UU.Requisitos del anexo II y renuncia a protecciones (lección 7.4.1)

Sobre las opciones, las preguntas y respuestas del Comité Mixto (sección IX, de 2017) aceptan para los futuros y las opciones negociados en un mercado regulado un KID por grupo de contratos con las mismas características relevantes (tipo de derivado, subyacente, estilo de ejercicio), por ejemplo uno para las compras de calls sobre acciones, no uno por serie. Por eso un bróker puede ofrecer a un minorista opciones sobre un ETF que no podría venderle.

La comparación de costes entre el ETF UCITS y el de EE. UU. es donde más se equivocan los foros: se compara la comisión de gestión y se olvida lo demás. Una calculadora con todas las hipótesis a la vista. La comisión del UCITS es la del KID sintético del fondo de tecnología de EE. UU. (0,32 % de incidencia anual); todo lo demás son supuestos de la lección, no datos de ningún producto:

IN [08]python
H = dict(
    inversion=10_000, anos=20,
    precio=0.055, dividendo=0.015,    # rentabilidad bruta del índice
    coste_ucits=kid.loc["R18", "incidencia"] / 100,
    coste_eeuu=0.0010,                # hipótesis
    retencion=0.15,                   # hipótesis: en origen, EE. UU.
    divisa=0.002,                     # hipótesis: cada conversión
)

def valor_final(ucits, retencion_recuperable=False, h=H):
    v = h["inversion"] * (1 - (0 if ucits else h["divisa"]))
    coste = h["coste_ucits"] if ucits else h["coste_eeuu"]
    for _ in range(h["anos"]):
        div = v * h["dividendo"]
        ret = 0 if retencion_recuperable else div * h["retencion"]
        conv = 0 if ucits else (div - ret) * h["divisa"]
        v = v * (1 + h["precio"]) + div - ret - conv
        v *= 1 - coste
    return v * (1 - (0 if ucits else h["divisa"]))

bruto = H["inversion"] * (1 + H["precio"] + H["dividendo"]) ** H["anos"]
casos = {
    "UCITS acumulación (retención en el fondo)": valor_final(True),
    "EE. UU., retención no recuperable": valor_final(False),
    "EE. UU., retención recuperada en España": valor_final(False, True),
}
for k, v in casos.items():
    print(f"{k:42} {v:9,.0f} EUR  coste {bruto - v:7,.0f}")
OUT [08]Coste a 20 años: ETF UCITS frente a ETF de EE. UU. (hipótesis)
UCITS acumulación (retención en el fondo)     34,798 EUR  coste   3,899
EE. UU., retención no recuperable             36,204 EUR  coste   2,493
EE. UU., retención recuperada en España       37,757 EUR  coste     939

La calculadora simplifica dos cosas a propósito. Supone que la retención sobre los dividendos de EE. UU. dentro del fondo UCITS es la misma que la que sufre el inversor directo, y modela el caso de EE. UU. con los dividendos reinvertidos sin impuesto español: el tratamiento real (convenios de doble imposición, deducción en el IRPF, momento en que tributa cada opción) está en la lección 7.4.6 y cambia el resultado. Con estas hipótesis, el ETF UCITS que puede comprar un minorista es el más caro de los tres. Pero la diferencia entre los dos casos de EE. UU., que solo cambian la hipótesis sobre la retención (1.553 EUR), es mayor que la que separa al UCITS del de EE. UU. sin recuperarla (1.406 EUR), que recoge la diferencia de comisiones (0,22 puntos al año) y los costes de divisa. Hasta que no se escribe la hipótesis fiscal, la comparación no significa nada. La figura de la cabecera dibuja los tres casos.

Ejercicios

  1. Escribe una función que compruebe que un KID en texto tiene las secciones del artículo 8 en el orden correcto y aplícala a los cinco KID. Después quítale una sección a uno y comprueba que la detecta.
Solución
IN [09]python
SECCIONES = [
    "## Finalidad",
    "## Producto",
    "## ¿Qué es este producto?",
    "## ¿Qué riesgos corro y qué podría obtener a cambio?",
    "## ¿Qué pasa si",
    "## ¿Cuáles son los costes?",
    "## ¿Cuánto tiempo debo mantener la inversión",
    "## ¿Cómo puedo reclamar?",
    "## Otros datos de interés",
]

def secciones_ok(texto):
    pos = [texto.find(s) for s in SECCIONES]
    faltan = [s for s, p in zip(SECCIONES, pos) if p < 0]
    if faltan:
        return "faltan: " + "; ".join(faltan)
    return "ok" if pos == sorted(pos) else "orden incorrecto"

print({i: secciones_ok(t) for i, t in kids["texto"].items()})
roto = kids.loc["R12", "texto"].replace("## ¿Cómo puedo reclamar?", "")
secciones_ok(roto)
OUT [09]Secciones del artículo 8, en orden
{'R10': 'ok', 'R12': 'ok', 'R14': 'ok', 'R16': 'ok', 'R18': 'ok'}
'faltan: ## ¿Cómo puedo reclamar?'

Los cinco cumplen la estructura. La comprobación es útil antes de indexar documentos en un RAG (lección 6.3.2): un KID al que le falta una sección probablemente se ha extraído mal del PDF, y sus respuestas serán incompletas.

  1. En la calculadora, ¿qué comisión anual tendría que tener el ETF UCITS para igualar el valor final del ETF de EE. UU. con retención no recuperable? ¿Y con retención recuperada?
Solución
IN [10]python
def equilibrio(objetivo):
    lo, hi = 0.0, 0.02
    for _ in range(60):                   # bisección
        mid = (lo + hi) / 2
        v = valor_final(True, h={**H, "coste_ucits": mid})
        lo, hi = (mid, hi) if v > objetivo else (lo, mid)
    return 100 * mid

for k in list(casos)[1:]:
    print(f"{k:42} {equilibrio(casos[k]):.3f} %")
OUT [10]Comisión de equilibrio del UCITS
EE. UU., retención no recuperable          0.122 %
EE. UU., retención recuperada en España    0.000 %

Frente al ETF de EE. UU. con retención no recuperable, el UCITS empataría con una incidencia anual del 0,122 % en vez del 0,32 % de su KID. Frente al caso con retención recuperada no empata ni con comisión cero (la bisección se queda en 0,000 %): en esta hipótesis, la retención dentro del fondo es un coste que el inversor directo recupera y el UCITS no. La respuesta depende del tratamiento fiscal, no solo del producto.

  1. Un bróker te ofrece un ETF de EE. UU. si firmas «un formulario de cliente profesional». Explica qué tendría que comprobar el bróker antes de aceptarlo y qué documento dejarías de recibir con cada orden.
Solución

El bróker tendría que comprobar que cumples dos de los tres criterios del anexo II de MiFID II y del artículo 113 del Real Decreto 813/2023 (diez operaciones de volumen significativo por trimestre de media, cartera de más de 500.000 EUR, un año en un cargo del sector financiero) y seguir el procedimiento por escrito con declaración separada (lección 7.4.1). Un formulario sin esa comprobación no es una clasificación válida. Como profesional, el Reglamento PRIIPs no se aplica a tus compras: dejarías de recibir el KID, y con él el indicador de riesgo, los escenarios y los costes normalizados de cada producto; además, la entidad puede presumir tus conocimientos en la evaluación de conveniencia.

Respuesta plegada en cada pregunta

Autoevaluación

  1. ¿Por qué un bróker europeo vende a un minorista acciones de una empresa de EE. UU. pero no un ETF de EE. UU. sobre el mismo índice?

    • APorque las acciones de EE. UU. tienen KID y los ETF no
    • BPorque una acción no es un producto empaquetado: lo que recibe el inversor no depende de activos que no compra directamente; un ETF sí lo es y necesita un KID que su gestora no elabora
    • CPorque los ETF de EE. UU. están prohibidos por ESMA
    • DPorque los ETF de EE. UU. no cotizan en euros
    Ver respuesta

    Respuesta B. Porque una acción no es un producto empaquetado: lo que recibe el inversor no depende de activos que no compra directamente; un ETF sí lo es y necesita un KID que su gestora no elabora

    El artículo 4.1 del Reglamento 1286/2014 define el PRIIP por la exposición a valores de referencia o a activos no adquiridos directamente por el inversor. Un ETF lo es; una acción, no. Sin KID, el artículo 13 impide venderlo a un minorista.

  2. Un KID dice: costes totales si sale después de 1 año, 32 EUR sobre 10.000 EUR invertidos. ¿Qué hipótesis de rentabilidad hay detrás de esa cifra?

    • ALa del escenario favorable
    • BLa del escenario moderado
    • CUna rentabilidad del 0 % el primer año; el escenario moderado para los demás periodos
    • DLa rentabilidad histórica del último año
    Ver respuesta

    Respuesta C. Una rentabilidad del 0 % el primer año; el escenario moderado para los demás periodos

    Es el texto prescrito de la presentación de costes (Preguntas y respuestas del Comité Mixto sobre el KID): el primer año se supone que el inversor recupera lo invertido (0 %); para el resto de periodos, el escenario moderado. Por eso 32 EUR son exactamente el 0,32 % de 10.000.

  3. La volatilidad anualizada de un fondo en los últimos cinco años es del 20,5 %. ¿Qué clase de riesgo de mercado le corresponde, si su distribución es aproximadamente normal y su riesgo de crédito es el de la clase 1?

    • A5: la tabla del anexo II pone el tramo de 20 % a 30 % en la clase 5, y con riesgo de crédito 1 el indicador resumido es igual a la clase de mercado
    • B4, porque está cerca del 20 %
    • C6
    • DDepende del periodo de mantenimiento recomendado
    Ver respuesta

    Respuesta A. 5: la tabla del anexo II pone el tramo de 20 % a 30 % en la clase 5, y con riesgo de crédito 1 el indicador resumido es igual a la clase de mercado

    La tabla de clases va de < 0,5 % (1) a > 80 % (7), con la frontera entre 4 y 5 en el 20 %. Con la fila de riesgo de crédito 1, el indicador es la clase de mercado. Una décima por encima de la frontera cambia el número que ve el inversor, por eso el reglamento pide hacer un seguimiento de los datos.

  4. ¿Qué indicador resumido de riesgo lleva el KID de una opción cotizada comprada por un minorista?

    • AEl que salga de la volatilidad del subyacente
    • BSiempre 1
    • C7: los derivados de la sección C del anexo I de MiFID II son PRIIPs de categoría 1 y su clase de riesgo de mercado es 7
    • DNo llevan indicador
    Ver respuesta

    Respuesta C. 7: los derivados de la sección C del anexo I de MiFID II son PRIIPs de categoría 1 y su clase de riesgo de mercado es 7

    El punto 4 del anexo II del Reglamento Delegado 2017/653 incluye en la categoría 1 los PRIIPs de los puntos 4 a 10 de la sección C del anexo I de MiFID II (derivados), y el punto 8 les asigna la clase 7. Con riesgo de crédito bajo, el indicador es 7.

  5. En la calculadora de la lección, ¿qué decide sobre todo si el ETF UCITS sale más caro o más barato que el de EE. UU.?

    • ASolo la comisión de gestión
    • BEl indicador resumido de riesgo
    • CEl escenario moderado del KID
    • DLas hipótesis sobre la retención de los dividendos (dónde se practica y si el inversor la recupera) y los costes de divisa, más que la diferencia de comisiones
    Ver respuesta

    Respuesta D. Las hipótesis sobre la retención de los dividendos (dónde se practica y si el inversor la recupera) y los costes de divisa, más que la diferencia de comisiones

    Con las hipótesis de la lección, cambiar si la retención en origen es recuperable mueve el coste a 20 años más que la diferencia de comisiones de gestión. Las reglas fiscales concretas están en la lección 7.4.6.

Ideas clave

  • Un PRIIP es una inversión cuyo reembolso depende de activos que el inversor no compra directamente: fondos, ETF, derivados, estructurados. Una acción o un bono simple no lo son.
  • Quien vende un PRIIP a un minorista debe entregarle antes el KID (art. 13); el productor lo elabora (art. 5). Los ETF de EE. UU. no suelen tenerlo, y por eso no se venden a minoristas de la UE.
  • El KID tiene secciones y textos fijos; sus cifras se pueden extraer y validar: ISIN, rentabilidades anualizadas de los escenarios, suma de los costes y costes totales con 0 % el primer año.
  • El indicador resumido de riesgo combina una clase de riesgo de mercado (por la volatilidad equivalente al VaR al 97,5 %, de < 0,5 % a > 80 %) y una de crédito; los derivados son siempre clase 7.
  • Las alternativas tienen costes distintos: el ETF UCITS (KID y retenciones dentro del fondo), las opciones (KID por tipo de contrato y riesgo 7) y el trato de profesional (sin KID ni protecciones); la comparación depende de hipótesis fiscales que hay que escribir.

Recursos