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.
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 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))
| Variable | Peso | Por 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. |
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áusula | Penalización / Bonus | Por 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. |
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.
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.
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.
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.
python tests/test_bancos_scoring.py y verificar que
el ranking es independiente del flag de afiliación.
test_mejor_rankea_mas_alto · si un producto tiene mejor TAE y menos vinculaciones, debe rankear más alto que uno peortest_score_en_rango · el score siempre está entre 0 y 100test_tae_efectiva_distinta_por_perfil · un autónomo no se beneficia de bonificación por nóminatest_dataset_real_valido · todos los bancos del JSON scorea sin errorestest_afiliacion_sin_secretos · todos los bancos con afiliacion.activa = true tienen los 4 campos requeridos (red, ref, comision_eur_estimada, tipo_pago)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:
# 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)
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
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).
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.
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.