Metodología pública · scoring abierto

Cómo se calcula el ranking del comparador

El score 0-100 que ves en cada banco es una fórmula determinista que combina TAE efectiva, vinculaciones, comisiones, letra pequeña y flexibilidad. Está testeada contra una invariante crítica: cambiar el flag de afiliación de un banco NO altera su score. Lo verificamos en cada release con un property test.

Contenidos
  1. Filosofía del comparador
  2. Fórmula del score · paso a paso
  3. Penalizaciones por letra pequeña
  4. TAE efectiva · qué significa
  5. Disclosure radical · cómo declaramos afiliación
  6. Fuentes de datos y scraping responsable
  7. Tests automáticos que garantizan la imparcialidad
  8. Comparador de seguros · hogar y vida

1 · Filosofía del comparador

El comparador muestra todos los bancos que ofrecen hipoteca en España, no una selección curada. Tomamos los datos públicos que cada banco está obligado a publicar (Circular BdE 5/2012, LCCI Ley 5/2019, RD 309/2019), los normalizamos y aplicamos un algoritmo público que aproxima la oferta real al cliente.

No es publicidad. Cuando un banco tiene acuerdo comercial con nosotros (afiliación), lo declaramos explícitamente en su fila y en la ficha de detalle, incluyendo la comisión aproximada que recibimos. Pero el ranking se calcula igual con o sin acuerdo: el flag de afiliación no entra en la fórmula del score. Esto es verificable porque el código es abierto y los tests automáticos lo prueban (ver sección 7).

El modelo Wirecutter aplicado a hipotecas. No fingimos no aceptar comisiones. Aceptamos algunas pero declaramos cuáles, cuánto, y garantizamos que el ranking no se contamina. Los bancos sin acuerdo aparecen exactamente en la misma posición que tendrían si tuviéramos acuerdo con todos o con ninguno.

2 · Fórmula del score · paso a paso

El score es una función pura del producto hipotecario y del perfil de usuario seleccionado (joven, pareja o autónomo). El banco como entidad solo aporta un pequeño bonus por tener FIPER online (+3 puntos).

# Pseudocódigo público · ver scripts/bancos_scoring.py
score = 100

# Bloque 1 · penalización por TAE efectiva
TAE_BASELINE = 2.0  # excelente
score -= 14 * max(0, TAE_efectiva - TAE_BASELINE)

# Bloque 2 · vinculaciones obligatorias
score -= 0.8 * (coste_anual_obligatorias_eur / 100)
score -= 0.5 * num_vinculaciones_negativas

# Bloque 3 · comisiones
score -= 6 * comision_apertura_pct
score -= 3 * compensacion_subrogacion_pct

# Bloque 4 · bonus flexibilidad / transparencia
score += bonus_flexibilidad   # 0% amort = +4, plazo >30 = +2, LTV >80 = +3
score += bonus_transparencia  # TAE publicada = +5, FIPER online = +3

# Bloque 5 · letra pequeña · ver sección 3
score -= penalizaciones_letra_pequena
score += bonus_letra_pequena

# Clamp final · garantiza rango 0-100
score = max(0, min(100, score))

Pesos por bloque · justificación

VariablePesoPor qué
TAE efectiva sobre baseline 2.0% −14 × diff Mayor peso del modelo · cada punto porcentual extra sobre la excelencia hipotética cuesta ~14 puntos. Una TAE de 3.0% pierde 14, una de 4.0% pierde 28.
Vinculaciones obligatorias caras −0.8 × €/100 Un seguro vida obligatorio de 480€/año baja el score en ~3.8 puntos. Tiene peso porque te lo facturan año tras año durante toda la vida del préstamo.
Comisión de apertura −6 × pct Pago único pero significativo: 1% sobre 200.000€ son 2.000€ de salida.
Compensación por subrogación −3 × pct Encarece la salida del préstamo si quieres cambiar de banco más adelante. Bloquea la competencia.
0% amortización parcial +4 Flexibilidad crítica si recibes una herencia, bonus o paga extra grande.
TAE publicada · circular 5/2012 +5 Transparencia que la ley exige pero no todos cumplen sin presión.

3 · Penalizaciones por letra pequeña

Aquí es donde el comparador se diferencia del 95% de los comparadores del mercado. Catalogamos hasta 21 cláusulas que afectan a tu economía a lo largo de la vida del préstamo. Las 10 más relevantes están integradas en la fórmula del score:

CláusulaPenalización / BonusPor qué
TIN sin bonificar > bonificado + 0.4 pp −hasta 20 Si te ofrecen 2.5% con vinculaciones pero el TIN real es 3.8% sin ellas, las vinculaciones son una trampa cara.
Vinculaciones inseparables −8 Si pierdes una bonificación (paro, jubilación) pierdes todas. Cláusula leonina muy común en grandes bancos.
Permite seguro externo (LCCI) +3 / −4 La ley te da el derecho a usar tu seguro de vida/hogar de otra compañía. Si el banco lo bloquea de facto, penalización.
Carencia permitida (gratis) +4 Si te quedas sin trabajo, puedes pagar solo intereses durante N meses. Vital en escenarios de paro.
Renovación automática seguros sin tope −2 El banco te puede subir la prima del seguro vinculado año tras año sin avisar.
Comisión por novación −4 × pct Si quieres renegociar (más plazo, menos cuota) en el futuro, te cuesta dinero.
Reclamación de posiciones deudoras > 30€ −hasta 3 Algunos bancos cobran 40-50€ por cada email de aviso si te retrasas un día.
TIN "cebo" inicial corto −4 Te ofrecen 1.5% el primer año y luego pasa a 3.5%. Marketing engañoso.
Cláusula de tipo mínimo (suelo encubierto) −5 Sucedáneo legal de la cláusula suelo · en variable, te impide beneficiarte si el Euribor baja a 0 o menos.
Vencimiento anticipado < 12 cuotas −4 La LCCI exige mínimo 12 cuotas impagadas antes de que el banco pueda ejecutar. Si el contrato dice menos, es ilegal.
No todos los bancos tienen estos datos catalogados aún · la letra pequeña requiere lectura manual del FIPER y del contrato modelo. Los bancos sin estas cláusulas auditadas se marcan con "LP" gris (pendiente). Estamos ampliando la cobertura semana a semana.

4 · TAE efectiva · qué es realmente

La TAE publicada por el banco es engañosa cuando hay vinculaciones, porque asume que cumples todos los productos vinculados. La TAE efectiva que usamos es:

TAE_efectiva = TAE_publicada
             - bonificaciones_aplicables_perfil
             + coste_vinculaciones_pp_equivalente

"Aplicables al perfil" significa que para un perfil joven asumimos que sí abre nómina (común) pero no contratará un plan de pensiones (incomún en jóvenes). Para un autónomo, la nómina no aplica. Para una pareja con compromisos, asumimos seguro de vida + hogar (común al firmar hipoteca).

Las vinculaciones se convierten a "puntos porcentuales equivalentes" calculando cuánto sube el coste total del préstamo en € si tienes que pagar X€/año en seguros vinculados durante todo el plazo, sobre un préstamo de referencia de 180.000 € a 25 años.

Ejemplo concreto: Una TAE publicada de 2.85% con seguro vida obligatorio de 480€/año equivale a una TAE efectiva de ~3.15% para un joven que no tendría ese seguro si no fuera por la hipoteca.

5 · Disclosure radical · cómo declaramos afiliación

Cuando tenemos acuerdo comercial con un banco, los datos están en data/bancos_hipoteca.json en un bloque visible:

{
  "id": "openbank",
  "afiliacion": {
    "activa": true,
    "red": "banco-directo",
    "comision_eur_estimada": 300,
    "tipo_pago": "por-firma"
  }
}

En la tabla del comparador, un banco con acuerdo activo aparece con badge morado € Acuerdo activo. Un banco sin acuerdo aparece con badge gris Sin acuerdo.

En la ficha de detalle de cada banco aparece la cantidad aproximada en € que recibimos por firma, la red (acuerdo directo, broker intermediario, etc.) y el modelo de pago.

Garantía editorial: el ratio de clicks que recibimos en bancos con afiliación vs sin afiliación se publica en nuestro dashboard interno (privado), y debe aproximarse al ratio de bancos con acuerdo en el top-N del ranking. Si está sesgado al alza, significa que el ranking está contaminado y lanzamos una revisión.

6 · Fuentes de datos · scraping responsable

Todos los datos provienen de fuentes que cada banco está obligado a publicar por ley:

El scraping se hace una vez a la semana, con un User-Agent identificado (antesdelafirma-bot/0.1), respetando robots.txt y con un throttle de 5 segundos entre requests. Cualquier banco que quiera dejar de aparecer puede contactarnos en editorial@antesdelafirma.com y lo retiramos en 24h (aunque legalmente nos asiste el derecho de información del público).

Si el scraping de una semana detecta un cambio > 1 punto porcentual en un campo, no se sobrescribe automáticamente · pasa a una cola de revisión manual para evitar publicar datos erróneos por bugs del parser.

7 · Tests automáticos · garantía de imparcialidad

El algoritmo de scoring se valida en cada release contra 6 tests automáticos en tests/test_bancos_scoring.py. Los dos más críticos:

def test_afiliacion_no_afecta_score():
    # Property test · INVARIANTE EDITORIAL CRÍTICA
    banco = cargar_banco("openbank")
    medianas = medianas_mercado(todos_los_bancos)

    score_con_afil = scorear(banco, medianas, perfil="joven")

    banco["afiliacion"]["activa"] = True
    banco["afiliacion"]["comision_eur_estimada"] = 500
    score_sin_afil = scorear(banco, medianas, perfil="joven")

    assert score_con_afil == score_sin_afil
    # Si este test falla, el ranking está contaminado.
Garantía verificable: el repositorio es público (próximamente · WIP). Cualquiera puede ejecutar python tests/test_bancos_scoring.py y verificar que el ranking es independiente del flag de afiliación.

Otros tests automáticos

8 · Comparador de seguros · hogar y vida

En el bloque "Tu perfil real" del comparador de hipotecas, justo debajo de los campos "¿cuánto pagas por tus seguros fuera del banco?", mostramos un mini-ranking de las mejores aseguradoras del mercado español para hogar y vida. La lógica:

Fórmula del score de seguros

# Pseudocódigo · ver scripts/seguros_scoring.py

# HOGAR
score = 100
score -= 25 * max(0, (prima_anual_eur / 100) - 1.2)   # baseline 120€/año = ideal
score -= 0.5 * franquicia_eur / 50                          # penaliza franquicia alta
score += 2 if franquicia_eur == 0
score += min(8, bonus_coberturas)                              # RC alta, robo, daños agua, etc.
score += min(5, bonus_atencion_cliente)                         # según OCU u otra fuente externa
score -= 4 if num_exclusiones_relevantes > 2
clamp(0, 100)

# VIDA
score = 100
score -= 28 * max(0, (prima_anual_eur / 100) - 1.4)   # baseline 140€/año
score += min(10, bonus_coberturas)                             # invalidez, enf. graves, doble capital
score += min(5, bonus_atencion_cliente)
score -= 5 if NOT cobertura_invalidez_permanente             # cobertura crítica
clamp(0, 100)

Garantía editorial · idéntica a la de bancos

El campo afiliacion.activa de cada aseguradora NO entra en la fórmula del score. Lo verificamos en cada release con dos property tests en tests/test_seguros_scoring.py:

def test_afiliacion_no_afecta_score_hogar():
    base = aseguradora_hogar_sintetica()
    base["afiliacion"] = {"activa": False, "comision_eur_estimada": 0}
    score_sin = calcular_score_hogar(base)["score"]

    base["afiliacion"] = {"activa": True, "comision_eur_estimada": 500}
    score_con = calcular_score_hogar(base)["score"]

    assert score_sin == score_con   # si esto falla, el ranking está contaminado

Disclosure radical

Mismo modelo que con bancos. Cuando una aseguradora tiene acuerdo comercial, aparece badge "€ Acuerdo activo" en su entrada del ranking. En su ficha individual declaramos la comisión aproximada (30-150€ por póliza según red de afiliación) y el modelo de pago (por póliza firmada o por lead).

No somos mediadores de seguros. Nos limitamos a redirigir al cotizador oficial de cada aseguradora. No vendemos pólizas, no cobramos prima ni intermediamos contratos. Por eso no necesitamos licencia DGSFP. Si en el futuro embebimos cotizador propio, lo declararíamos públicamente y nos inscribiríamos como agente vinculado conforme a la Ley 26/2006 (LDOSEC).

Catálogo actual

Los precios son estimaciones de mercado para un perfil de referencia: piso 80m² urbano para hogar, persona 35 años no fumadora para vida. Los precios reales varían con ubicación, antigüedad, historial médico, profesión, capital asegurado y siniestralidad. El comparador no sustituye una cotización personalizada · es una guía editorial para identificar a qué aseguradoras pedir cotización.

9 · Versionado y cambios

Cada cambio relevante en la fórmula de scoring se versiona y se anota en la fecha de publicación. Si cambiamos pesos o añadimos penalizaciones, lo declaramos públicamente aquí. La versión actual es la v1.0 · publicada 2026-05.

Para conflictos de interés, contacto editorial o solicitud de retirada de un banco, escribe a editorial@antesdelafirma.com.