Metodología del Grado Capivio — v1.1.0

§0 — Preámbulo

Para el profesional fiscal que revisa este documento: cada dimensión cita BOE / BdE / AEAT / DGT con URL donde existe una fuente primaria pública. Cuando no existe tal fuente, se etiqueta explícitamente como convención Capivio (Tier 3). Casillas AEAT en §9, Art. 23.2 LIRPF en §6, disposición transitoria para contratos pre-2023 en §10.

Para el propietario: §0.5 resume en lenguaje plano qué significa tu letra, por qué cambia entre comunidades autónomas y cómo se puede mejorar.


Disclaimer. Documento auditable. No constituye (a) asesoramiento financiero bajo MiFID II, (b) recomendación de inversión personalizada en el sentido del Art. 4.1.4 MiFID II, (c) análisis fiscal vinculante, ni (d) servicio de intermediación en actividades de financiación participativa bajo Reglamento UE 2020/1503. Capivio no está inscrita como Empresa de Asesoramiento Financiero (EAF) ni como Empresa de Servicios de Inversión (ESI). Consulta a un profesional antes de tomar decisiones.


§0.5 — TL;DR para el propietario

¿Qué mide el Grado Capivio? Una letra (AAA → D, como S&P o la etiqueta energética de tu piso) que resume seis dimensiones de tu análisis de inversión inmobiliaria:

  1. Rendimiento neto — rentabilidad después de gastos y antes de impuestos
  2. Cashflow estresado — si los tipos suben y aumenta la vacancia, ¿sigues en positivo?
  3. Ventaja territorial — cuánto te penaliza o te favorece el ITP de tu CCAA y tu tramo de reducción IRPF
  4. Margen defensivo — cobertura de deuda (DCR): cuánto holgura tienes para pagar la hipoteca
  5. Apalancamiento — cuánto financias con deuda (LTV): menos deuda = más puntos
  6. Precisión AEAT — qué tan completa está tu declaración de casillas relevantes del Modelo 100

Cada dimensión se puntúa de 0 a 100. El compuesto es la media (redondeada) de las seis. La letra se asigna según umbrales fijos: AAA si sacas 95+, A si sacas 80-84, B si sacas 55-64, etc.

¿Por qué mi alquiler en Cataluña obtiene menos puntos de "ventaja territorial" que en Madrid?

El ITP (Impuesto sobre Transmisiones Patrimoniales) varía por CCAA. Madrid cobra 6%; Cataluña cobra 10-13% progresivo; Baleares 8%; País Vasco 4% foral. Capivio toma el tipo mínimo habitual (Madrid 6%) como referencia neutra. Cada punto porcentual por encima resta 10 puntos a la dimensión. Multiplica por tu tramo de reducción IRPF (que varía entre 50% y 90% según Art. 23.2 LIRPF).

¿Puedo mejorar mi grado?

Sí. La palanca más común: si tu tramo actual es 50% y tu propiedad está en zona tensionada + podrías alquilar a un inquilino de 18-35 años, aplicar el 70% (Art. 23.2.b LIRPF) te puede sumar varios puntos. Capivio calcula el delta real (no estimado). Otra vía: aplicar correctamente la amortización del 3% sobre el valor de construcción (Art. 23.1.b LIRPF + Art. 14 RIRPF). Si no está aplicada, tu "Precisión AEAT" baja.

¿Quién puede verificar las fuentes?

Toda cita en este documento apunta a BOE, BdE, AEAT, DGT, boletines autonómicos (DOGV, DOGC, BOJA, DOG, BOCM, BOIB, etc.) o lleva la etiqueta explícita de "convención Capivio" (§§3, 4, 8). La bibliografía consolidada está en §13.


§1 — Composición del grado

Tabla de letras (verbatim desde backend/src/services/fiscalScoringService.js)

AAA: score >= 95
AA:  score >= 90
A+:  score >= 85
A:   score >= 80
A-:  score >= 75
B+:  score >= 65
B:   score >= 55
C:   score >= 40
D:   score >= 0

Evaluación: iterar de arriba hacia abajo, devolver la primera coincidencia donde Math.round(score) >= min. Por tanto un score de 94.5 redondea a 95 → AAA (half-up).

Fórmula de interpolación lineal (canonical)

score = lowerScore + (value − lowerBound) / (upperBound − lowerBound) × (upperScore − lowerScore)

Convención de banda: medio-abierta [lower, upper) con >= en el borde inferior. La banda superior queda cerrada en 100 (clamp explícito). Se aplica en todas las dimensiones.

Composición ponderada

score = sum(non-null dimension scores) / count(non-null dimensions)
score = Math.round(clamp(score, 0, 100))
  • 6 dimensiones presentes (vista de detalle con fiscalSummary): peso 1/6 cada una.
  • Re-ponderación genérica cuando alguna dimensión es null: cualquier dim con input inválido (NaN, null, negativo fuera de rango) devuelve null, no 0. El compuesto se re-pondera sobre el subconjunto no-null. El caso más común es la vista de lista: precisionAeat cae a null porque no se obtiene fiscalSummary (evita N+1 en DB), quedando 5 dimensiones con peso 1/5 cada una.
  • Si todas las dimensiones son null → score = 0.

Drift entre vista de lista y vista de detalle

La vista de lista (5 dimensiones) puede diferir de la vista de detalle (6 dimensiones) para la misma análisis en hasta un rango (una letra arriba o una letra abajo). Esto está acotado por un test de regresión en backend/src/tests/analysisIntegration.test.js que usa LETTER_RANK para asegurar |listRank − detailRank| <= 1.


§2 — Catálogo de dimensiones

2.1 · rendimientoNeto (oro)

Input: netRoi (decimal, ej. 0.055 = 5,5%)

Tabla de bandas (verbatim):

< 0.02        → 0
[0.02, 0.04)  → interp [20, 50)
[0.04, 0.06)  → interp [50, 80)
[0.06, 0.08)  → interp [80, 95)
>= 0.08       → 95 + min(5, (v − 0.08) × 250), clamped to [0, 100]

La cola por encima de 0.08 tiene un soft-cap: el score crece de 95 a 100 sobre [0.08, 0.10) con pendiente 250, luego se estanca en 100. Un inversor con 10% netos obtiene 100; uno con 15% también obtiene 100 (no castiga pero tampoco sobre-recompensa magnitudes irreales).

Fuente de cita: Art. 22-23 LIRPF · BOE-A-2006-20764 (definición legal de rendimientos del capital inmobiliario).

Fuente de las bandas: Tier 3 · convención Capivio. Ancladas a:

  • El tipo de bono español a 10 años como referencia libre de riesgo (el umbral 2% es aproximadamente ese rango histórico reciente — por debajo no se justifica el riesgo adicional de una propiedad inmobiliaria frente a deuda soberana).
  • El percentil ~95 de yields netas observadas en el mercado español de inversión residencial (el umbral 8% es ese orden de magnitud).

Las bandas intermedias (4%, 6%) dividen ese rango en cuartiles pragmáticos.


2.2 · cashflowEstresado (oro)

Input: analysis (calcula baseline y stressed cashflow internamente)

Fórmula completa (verbatim):

baselineCF = analysis.annualCashflow
if baselineCF == null → null
if baselineCF <= 0   → 0

totalFinancing = sum(mortgageAmount, loanAmount legacy, loans[].amount)
monthlyRent    = analysis.monthlyRent

extraDebt        = 0.02 × totalFinancing
extraVacancyLoss = monthlyRent
stressedCF       = baselineCF − extraDebt − extraVacancyLoss

if stressedCF <= 0 → 0
else               → clamp(Math.round((stressedCF / baselineCF) × 100), 0, 100)

Fuente de cita: Metodología Capivio · stress +200pb & vacancy +1mes (Tier 3 convención; ver §3 para el detalle de origen).

Explicación del score como ratio: la dimensión no castiga el valor absoluto del cashflow estresado sino la proporción que sobrevive al shock. Un inversor con baseline 10.000€ y stressed 7.200€ obtiene 72; uno con baseline 2.000€ y stressed 1.440€ también obtiene 72 (misma resiliencia proporcional).


2.3 · ventajaTerritorial (oro)

Input: itpRate (decimal), reductionTier, comunidadAutonoma

Fórmula (verbatim):

if itpRate == null OR CCAA no reconocida → null

itpBase = clamp(100 − (itpRate − 0.06) × 1000, 0, 100)

multiplier:
  porcentaje >= 0.70 → 1.00
  porcentaje === 0.60 → 0.85
  porcentaje === 0.50 → 0.75
  else (VUT, 0, unknown) → 0.50

score = clamp(Math.round(itpBase × multiplier), 0, 100)

Nota importante sobre el factor × 1000: itpRate es decimal (0.06 = 6%). La expresión (itpRate − 0.06) × 1000 convierte un punto porcentual de diferencia (0.01) en 10 puntos de penalización. Documentado aquí para evitar errores de reimplementación que confundan decimal y porcentaje.

Fuente de cita (CCAA-específica): extraída de backend/src/utils/itpRates.js::CCAA_CITATION_MAP. Cada una de las 19 entradas (17 CCAA + Ceuta + Melilla) cita su norma primaria (Ley 9/2018 CAM para Madrid, Llei 2/2014 para Cataluña, Ley 13/1997 GVA Art. 13 para Valencia, etc.).

Fuente del anchor 6% y la pendiente 10 puntos/1pp: Tier 3 · convención Capivio (ver §5).


2.4 · margenDefensivo (azul)

Input: dcr (Debt Coverage Ratio, NOI / servicio de deuda anual)

Tabla de bandas (verbatim):

< 1.0        → 0
[1.0, 1.2)   → interp [30, 50)
[1.2, 1.5)   → interp [50, 80)
>= 1.5       → 80 + min(20, (v − 1.5) × 40), clamped to [0, 100]

Fuente de cita: Metodología Capivio · umbral DCR 1,20 (convención bancaria) (Tier 3, ver §4).


2.5 · apalancamiento (azul)

Input: ltv (decimal, 0.70 = 70%)

Tabla de bandas (verbatim):

>= 0.90      → interp score de 30 a 0 sobre [0.90, 1.0] (inversión: peor LTV = peor score)
[0.80, 0.90) → interp [30, 60)
[0.70, 0.80) → interp [60, 85)
< 0.70       → 85 + min(15, (0.70 − v) × 50), clamped to [0, 100]

Inversión explícita: LTV más bajo → score más alto. Un inversor sin deuda (LTV 0) obtiene 100; con 70% de deuda obtiene 85; con 100% obtiene 0.

Fuente de cita: Ley 5/2019 LCCI · BOE-A-2019-3814 + BdE Circular 4/2017 · BOE-A-2017-14334.

Nota correctiva (v2 del prompt post-revisión fiscal): BdE Circular 4/2017 Anejo IX especifica un único umbral LTV 80% (preferential risk weight 35% vs. 75%/100%), no tres quiebres. Nuestro umbral primario 0.80 coincide con Anejo IX; los umbrales 0.70 y 0.90 son extensiones Capivio (Tier 3) para scoring más granular.


2.6 · precisionAeat (azul)

Input: fiscalSummary (opcional), reductionTier, analysis

Fórmula (verbatim):

if fiscalSummary == null OR reductionTier == null → null

applicable = [ingresosIntegros, amortizacionInmueble, tributos, otros]
if analysis.totalFinancing > 0 → applicable.push('intereses')

filled = (subset of applicable donde fiscalSummary[key] > 0)

casillaFillRatio     = filled.length / applicable.length
reductionTierOptimality = reductionTier.porcentaje / 0.90

score = Math.round(0.7 × casillaFillRatio × 100 + 0.3 × reductionTierOptimality × 100)
score = clamp(score, 0, 100)

Ver §9 para el detalle completo, la correspondencia con casillas específicas del Modelo 100 y un ejemplo trabajado.

Fuente de cita: Art. 23 LIRPF · BOE-A-2006-20764.


§3 — Convención Capivio: parámetros de estrés de cashflow

+200 puntos básicos de subida de tipos — Tier 2a

Se alinea con el shock adverso utilizado por el BdE en sus pruebas de resistencia sectoriales publicadas semestralmente en el Informe de Estabilidad Financiera.

No existe norma BdE que obligue a aplicar +200pb en la originación individual de hipotecas. La referencia regulatoria para evaluación de solvencia en la concesión de préstamos inmobiliarios es la Ley 5/2019 LCCI Art. 11 (obligación de evaluación rigurosa de solvencia, incluyendo la capacidad de pago ante evolución adversa de tipos).

+1 mes de vacancia adicional — Tier 3 · convención Capivio

No existe serie INE oficial de vacancia de alquiler con cadencia citable. Capivio clasifica este parámetro honestamente como convención:

  • Racional: aproximadamente 8% de vacancia adicional anual (1 mes / 12), coherente con la desviación típica observada en el mercado residencial español. Racional práctico: añadir un "cushion" de una desviación típica por encima de la vacancia base que el usuario ya ha introducido.
  • Propósito: añadir un "cushion" de una desviación por encima de la vacancia base que el usuario ya ha introducido.

Aplicación simultánea (no secuencial) — Tier 3 · convención Capivio

Ambos shocks co-ocurren en una sola evaluación. Convención conservadora de banca de inversión: los escenarios de estrés modelan correlación de cola (cuando los tipos suben, la vacancia también tiende a subir porque se deprime el mercado de alquiler).

Fórmula

Ver §2.2 para la fórmula exacta. El score captura la proporción de cashflow que sobrevive al shock, no el valor absoluto.


§4 — Convención Capivio: umbral DCR ≥ 1,20

Clasificación: Tier 3 · convención Capivio.

Rango observado en práctica bancaria española para hipoteca de inversión: aproximadamente 1.15 a 1.30. Capivio selecciona 1.20 como valor conservador-medio del rango.

Por qué 1.20 específicamente. Es el valor que reduce el riesgo de impago más agresivamente sin ser excluyente para propietarios con cashflow ajustado pero estable. Un DCR de 1.0 significa que los ingresos exactamente cubren el servicio de deuda — cero holgura ante cualquier shock (subida de IBI, reparación extraordinaria, inquilino que no paga un mes). 1.20 deja un 20% de margen.

Honestidad de la cita. No existen páginas públicas de BBVA, Santander, CaixaBank o Sabadell que publiquen su umbral interno de DCR para hipoteca de inversión — esos criterios son confidenciales. Capivio no atribuye 1.20 a ninguna de esas entidades; el rango 1.15-1.30 es conocimiento de mercado, no cita. Esta es una convención Capivio honesta.

Por qué DCR es una dimensión del grado. Es la señal de solvencia primaria que usa el banco que financia la propiedad. Conocer tu DCR antes de pedir la hipoteca te dice si serás aceptado; conocerlo con la propiedad ya financiada te dice cuánto shock puedes absorber antes de impagar.

Ausencia de mandato BOE/BdE. DCR es convención de mercado, no requisito legal. Ninguna Circular BdE ni regulación CNMV obliga a este valor específico.


§5 — Anchor ITP 6% (Madrid)

Tier 2a — Referencias: backend/src/utils/itpRates.js::CCAA_CITATION_MAP cita la norma primaria de cada CCAA (Ley 9/2018 Comunidad de Madrid para el 6% madrileño; Llei 2/2014 para los tramos progresivos 10-11-13% de Cataluña; Ley 13/1997 GVA Art. 13 para el 10% valenciano, etc.).

Por qué Madrid 6% es el anchor. Es el tramo mínimo entre CCAAs con régimen común (Navarra 6% también coincide, País Vasco tiene 4% foral pero se trata como outlier por el régimen foral). Tomar Madrid como neutro produce una penalización lineal clara hacia CCAAs más caras.

Pendiente: 10 puntos por cada punto porcentual por encima de 6%. Ejemplo: Cataluña 10% → penalización de 40 puntos respecto al anchor (itpBase = 100 − (0.10 − 0.06) × 1000 = 100 − 40 = 60).


§6 — Multiplicadores de reducción IRPF

Tier 1 — Art. 23.2 LIRPF (Ley 35/2006, BOE-A-2006-20764) modificado por la Ley 12/2023, de 24 de mayo, por el derecho a la vivienda (BOE-A-2023-12203), disposición final 2.ª apartado Uno.

Mapping (ver §2.3 para la fórmula inline):

  • porcentaje >= 0.70 → multiplier 1.00 (tramo ya óptimo; no hay optimización adicional disponible)
  • porcentaje === 0.60 → multiplier 0.85 (proporcional al beneficio)
  • porcentaje === 0.50 → multiplier 0.75 (tramo base post-2024)
  • VUT / 0 / desconocido → multiplier 0.50 (el VUT no tiene reducción Art. 23.2 — Manual Renta 2025 §7.3.1.4; arrendamientos de temporada: DGT V3019-17)

Por qué 0.70 y 0.90 comparten el 1.00. Ambos son categorías "ya optimizadas" — el usuario no puede mejorar más la reducción dentro del marco Art. 23.2 actual. Diferenciar el multiplier entre 0.70 y 0.90 castigaría a contribuyentes legítimos del tramo 0.70 (alquiler a joven 18-35 en zona tensionada) sin justificación fiscal.


§7 — Bandas LTV

Tier 1-2a — Ley 5/2019 LCCI Art. 5 (BOE-A-2019-3814) + BdE Circular 4/2017 Anejo IX (BOE-A-2017-14334).

Correcciones respecto a v1 del prompt (post-revisión fiscal): BdE Circular 4/2017 Anejo IX especifica un único umbral LTV 80% para ponderación de riesgo preferencial (35% vs. 75%/100%), no los tres umbrales del scorer. Nuestro umbral primario 0.80 coincide con Anejo IX. Los umbrales 0.70 y 0.90 son extensiones Capivio (Tier 3) para un scoring más granular que un simple binario "<80% vs ≥80%".

Ver §2.5 para la fórmula verbatim (incluyendo la cola soft-cap 85 + min(15, (0.70 − v) × 50) para LTV < 0.70).


§8 — Bandas de rendimientoNeto

Clasificación: Tier 3 · convención Capivio.

Anchors:

  • Umbral 2%: aproximadamente el rendimiento del bono soberano español a 10 años (libre de riesgo). Por debajo de este umbral no se justifica el riesgo adicional de una inversión inmobiliaria.
  • Umbral 8%: aproximadamente el percentil ~95 de las yields netas observadas en el mercado español de inversión inmobiliaria residencial. Por encima de 8% los casos empiezan a ser outliers (propiedades muy baratas en zonas de alto riesgo, o inputs del usuario sobre-estimados).
  • Umbrales intermedios 4% y 6%: cuartiles pragmáticos que dividen el rango [2%, 8%] en cuatro bandas de resolución.

Ver §2.1 para la fórmula verbatim incluyendo la cola soft-cap.


§9 — precisionAeat — mapeo de casillas y ejemplo

Casillas del Modelo 100 (Renta 2025) relevantes

Las siguientes casillas del Modelo 100 (sección E, rendimientos del capital inmobiliario) forman el set aplicable:

Campo interno Casilla Modelo 100 Descripción
ingresosIntegros 0102 y ss. Ingresos íntegros del capital inmobiliario
amortizacionInmueble 0107 Amortización del inmueble (3% sobre mayor de valor catastral de construcción o coste de adquisición)
intereses_financiacion 0106 Intereses de capitales ajenos (condicional: solo si la propiedad está financiada)
tributos_recargos 0115 IBI, tasas locales y recargos
otros_gastos_deducibles 0112 Gastos generales de la comunidad, seguros, servicios

Set aplicable dinámico: intereses solo entra si totalFinancing > 0. Un comprador al contado tiene 4 casillas aplicables, uno financiado tiene 5.

Fórmula (verbatim desde fiscalScoringService.js)

casillaFillRatio        = filled.length / applicable.length
reductionTierOptimality = reductionTier.porcentaje / 0.90
score = Math.round(0.7 × casillaFillRatio × 100 + 0.3 × reductionTierOptimality × 100)
score = clamp(score, 0, 100)

Ponderación: 70% completitud de casillas + 30% optimalidad del tramo de reducción. La completitud pesa más porque es el factor que más directamente predice errores AEAT (una casilla en blanco con valor real positivo es un error típico de autoliquidación).

Normalización del tramo: porcentaje / 0.90. El tramo máximo (0.90) normaliza a 1.0; el 0.70 da 0.778; el 0.50 da 0.556. No penaliza tramos legítimos, solo premia la optimización relativa.

Ejemplo trabajado

Piso con alquiler anual 12.000€, gastos deducibles 3.800€. De las 5 casillas aplicables, el propietario ha rellenado 4 (le falta informar otros_gastos_deducibles — seguro del hogar por 250€). Tramo de reducción aplicado: 0.70 (inquilino de 28 años en zona tensionada).

casillaFillRatio     = 4 / 5 = 0.80
reductionTierOptimality = 0.70 / 0.90 = 0.778
score = Math.round(0.7 × 0.80 × 100 + 0.3 × 0.778 × 100)
      = Math.round(56 + 23.3)
      = 79

precisionAeat = 79. Para subir a ≥ 85 necesita rellenar la quinta casilla O aplicar el tramo 0.90.

Nota de verificación anual

Las casillas citadas (0102, 0106, 0107, 0112, 0115) corresponden a la sección E del Modelo 100 para rendimientos del capital inmobiliario según el Manual Práctico Renta 2025 AEAT. Capivio re-verifica el mapeo cada ejercicio fiscal (ticket anual T-FISCAL-RENTA-{año}) para detectar migraciones o re-numeraciones AEAT. Última verificación: 2026-04-18. Si el lector observa divergencias tras una campaña de Renta posterior, consultar la última edición del Manual Práctico en el enlace de §13 y abrir un issue.

Ausencia en vista de lista

En la vista de lista (/analyses, /dashboard, etc.) esta dimensión se omite (score null) para evitar una consulta N+1 contra fiscalSummaryService. El compuesto se re-pondera sobre las 5 dimensiones restantes. La letra resultante puede diferir de la vista de detalle en hasta un rango (≤ 1 letra). Test de regresión en analysisIntegration.test.js acota este drift.


§10 — Lógica de palancas

Una "palanca" es una optimización accionable detectada por el motor. El grado se re-calcula hipotéticamente con la palanca aplicada y se expone el delta de puntos.

Palanca 1 · reduccion70

Dispara cuando:

reductionTier.porcentaje === 0.50
AND reductionTier.motivo === 'general_post_2024'
AND analysis.isZonaTensionada === true
AND analysis.tenantAge == null

Cita: Art. 23.2.b LIRPF (añadido por Ley 12/2023, BOE-A-2023-12203). El tramo 70% aplica cuando se cumplen simultáneamente: (a) el inmueble está en zona tensionada declarada, (b) se trata de la primera utilización del inmueble como alquiler de vivienda habitual, y (c) el inquilino tiene 18-35 años. Ver Art. 23.2 en el BOE para el texto completo y las excepciones.

Palanca 2 · reduccion60 (informativa)

Dispara cuando:

reductionTier.porcentaje === 0.60
AND reductionTier.motivo === 'general_pre_2024'

Cita: DT 38.ª LIRPF, añadida por la disposición final 2.ª apartado Dos de la Ley 12/2023 (BOE-A-2023-12203) — remite a la reducción del Art. 23.2 LIRPF «en su redacción vigente a 31 de diciembre de 2021», para contratos de arrendamiento de vivienda celebrados con anterioridad a la entrada en vigor de esa ley (26/05/2023). La propia DT entra en vigor el 01/01/2024 (disposición final 9.ª), por lo que no produce efecto en el período impositivo 2023.

Esta palanca es informativa, no accionable: deltaPoints = 0. No hay optimización adicional disponible para contratos pre-2023; el régimen transitorio ya aplica el mejor tramo posible (60%, superior al 50% base post-Ley 12/2023).

Cálculo del delta

hypoResult  = computeSovereignGrade({ ...inputs, reductionTier: hypoTier, _skipLever: true })
deltaPoints = Math.max(0, Math.round(hypoResult.score − baselineScore))

El flag _skipLever: true en la recursión evita bucles infinitos.

Palancas no implementadas en v1.0.0

  • refinance — requeriría inputs hipotéticos del usuario (nueva tasa, nuevo plazo) que no tenemos en el análisis base. deltaPoints no es determinista sin esos inputs.
  • applyAmortization — la amortización del 3% debería estar siempre aplicada; si no lo está, es error del usuario en la introducción de gastos, no una palanca del grado.

Ambas planeadas para T-UX-GRADO-LEVERS-EXT cuando tengamos un flujo UI para recoger inputs hipotéticos.


§11 — Limitaciones conocidas

  • Baleares aplica flat 8% ITP (simplificación). El esquema real es progresivo 8-13%. Pendiente ticket T-ITP-BALEARES-BRACKETS.
  • Tipos de análisis sin grado. AFFORDABILITY, FLIP, RENT_VS_BUY, VACATION, MORTGAGE no reciben grado en v1. Pendiente T-UX-GRADO-OTHERTYPES.
  • Análisis públicos sin grado. La vista SharedAnalysisView (/shared/analysis/:token) no muestra el grado. Pendiente T-UX-GRADO-PUBLIC.
  • Drift letra lista vs detalle. Hasta un rango de diferencia (5-dim vs 6-dim compuesto). Acotado por test de regresión.
  • NaN/null/negativo → null. Cualquier dimensión con input inválido devuelve null, no 0. Esto evita falsificar el compuesto pero puede sorprender al lector ("¿por qué mi cashflow estresado no aparece?"). La UI debería mostrar un guión em-dash cuando una dimensión es null.
  • Bank criteria no citadas. El umbral DCR 1.20 es convención Capivio honesta (§4); no se atribuye a banca comercial porque esos criterios son confidenciales.

§15 — Metodología FLIP (T-UX-GRADO-OTHERTYPES v1.3)

Añade el Grado Capivio a análisis FLIP (capital gains, transacciones de compra-reforma-venta). Marco fiscal distinto de los alquileres: Art. 33-35 LIRPF (ganancias patrimoniales), no Art. 22-23 (rendimientos del capital inmobiliario).

Espacio de letras compartido con INVESTMENT

La misma tabla de umbrales LETTER_THRESHOLDS se usa para FLIP. Advertencia de comparabilidad: un FLIP con letra B no es directamente comparable a un INVESTMENT con letra B — las dimensiones subyacentes difieren. Las letras son comparaciones dentro del tipo, no entre tipos.

4 dimensiones FLIP

§15.1 · margenNetoFlip

Input: flipNetProfit / flipTotalProjectCost (margen sobre coste total del proyecto)

Fórmula (verbatim):

< 0       → 0
[0, 0.05)    → interp [0, 30)
[0.05, 0.12) → interp [30, 60)
[0.12, 0.20) → interp [60, 85)
[0.20, 0.28) → interp [85, 95)
>= 0.28      → 95 + min(5, (margin − 0.28) × 200), clamped to [0, 100]

Fuente: Tier 3 · convención Capivio · §15 margen FLIP.

Racional de los umbrales 5 / 12 / 20 / 28: Distribución observada de márgenes de FLIP residencial en España (post-Ley 12/2023, con costes de rehabilitación en alza):

  • 5% = umbral de viabilidad tras comisiones, IVA rehabilitación, ITP, etc.
  • 12% = mediana de FLIPs ejecutados por operadores profesionales
  • 20% = tramo de FLIP bueno (inmueble infravalorado + reforma eficiente)
  • 28% = excepcional, típicamente percentil 95 (inmueble distressed + reforma integral)

§15.2 · efectividadFiscal

Input: flipCapitalGainsTax / flipCapitalGain (tipo efectivo sobre la ganancia)

Fórmula (verbatim):

if capitalGain <= 0 → null (FLIP perdedor, dimensión cae)
if rate <= 0 → 100  (exención total: Art. 38 reinversión vivienda habitual o Art. 33.4.b ≥65 años)

[0,    0.19) → interp [100, 70)
[0.19, 0.21) → interp [70, 60)
[0.21, 0.23) → interp [60, 50)
[0.23, 0.27) → interp [50, 30)
[0.27, 0.30) → interp [30, 15)
>= 0.30      → max(0, 15 − (rate − 0.30) × 50)

Umbrales alineados con Ley 7/2024 Art. 66 LIRPF (base del ahorro, ejercicio 2025+):

  • 0-6k€ → 19%
  • 6k-50k€ → 21%
  • 50k-200k€ → 23%
  • 200k-300k€ → 27%
  • 300k€ → 30%

Fuente: Tier 1 · Art. 33-35 LIRPF · BOE-A-2006-20764 · Ley 7/2024.

§15.3 · apalancamientoFlip

Input: totalFinancing / flipPurchasePrice (LTV sobre precio de adquisición)

Fórmula: delegada a scoreApalancamiento (ver §2.5 INVESTMENT). Mismas bandas invertidas 0.70 / 0.80 / 0.90 / 1.0.

Fuente: Tier 2a · BdE Circular 4/2017 · BOE-A-2017-14334 + convención prudencial Capivio.

Nota de consistencia: La LCCI (Ley 5/2019) NO se cita aquí porque gobierna hipoteca residencial al consumidor (Art. 2.1 LCCI) — los FLIPs se financian típicamente como préstamo de inversión o a través de estructura societaria, fuera del ámbito LCCI.

§15.4 · timelineAggression

Input: flipTotalMonths (meses totales: rehabilitación + venta)

Fórmula (verbatim):

null / <= 0 → null
< 6         → 95  (tope suave "revisa tus inputs" — un FLIP de <6 meses sin modelo completo es sospechoso)
[6, 9)      → clamp(100 − m × 1.1, 85, 95)
[9, 12)     → interp [90, 70)
[12, 18)    → interp [70, 40)
[18, 24)    → interp [40, 15)
>= 24       → max(0, 15 − (m − 24) × 2)

Fuente: Tier 3 · convención Capivio · §15 cronograma FLIP.

Racional de los benchmarks 6/9/12/18/24 meses:

  • <6 meses: sospechoso — probablemente el modelo ignora tiempo de venta real
  • 6-9 meses: excelente (rehabilitación ligera + venta rápida)
  • 9-12 meses: sólido (operación estándar)
  • 12-18 meses: marginal (empieza a acumular costes de mantenimiento + riesgo de mercado)
  • 18 meses: elevado riesgo (desarrollos no previstos, pérdida de ventana de mercado)

Sin palancas en v1.3

FLIP v1.3 se publica sin palancas de optimización. Las palancas candidatas (reinvestmentExemption Art. 38.1, seniorExemption Art. 33.4.b ≥65 años, considerSLStructure Art. 29.1 LIS) se filan en T-UX-GRADO-FLIP-LEVERS pendiente de ampliación de schema (projectedReinvestmentInPrimaryResidence).

§12 — Changelog

Versión Fecha Resumen
1.0.0 2026-04-18 Publicación inicial correspondiendo a GRADE_SPEC_VERSION = '1.0.0'
1.1.0 2026-04-18 T-UX-GRADO-OTHERTYPES v1.3 — añadido tipo FLIP (4 dimensiones: margenNetoFlip, efectividadFiscal, apalancamientoFlip, timelineAggression). VACATION/RVB/AFFORDABILITY/MORTGAGE pendientes.

§13 — Fuentes (bibliografía consolidada)

Alfabético por fuente. URLs validadas HTTP 200 a la fecha de publicación (2026-04-18).

BOE (leyes y normativa estatal):

BdE (Banco de España):

  • Informe de Estabilidad Financiera (semestral, usado como referencia para el shock +200pb). Página consolidada de publicaciones BdE: https://www.bde.es/wbe/es/publicaciones/ · Last verified 2026-04-18 [archived — la URL directa del IEF se restructuró; navegar desde la página consolidada, sección "Estabilidad Financiera"]

AEAT y DGT:

CCAA (boletines autonómicos — consultados vía backend/src/utils/itpRates.js::CCAA_CITATION_MAP):

Enlaces sin URL verificable (convención Capivio — §§3, 4, 8): sin cita pública. Etiqueta explícita Tier 3 en texto.


§14 — Preguntas frecuentes (FAQ)

¿Qué artículo del BOE regula la reducción del 70% en el rendimiento neto del alquiler? Art. 23.2.b LIRPF, añadido por Ley 12/2023 (BOE-A-2023-12203). Aplica cuando el inquilino tiene 18-35 años y el inmueble está en zona tensionada, además de otras condiciones enumeradas en el propio artículo.

¿Cómo se calcula la amortización del 3% sobre el valor de construcción? Art. 23.1.b LIRPF + Art. 14.2.a RIRPF (RD 439/2007). Base de cálculo: el mayor entre (a) valor de construcción catastral, o (b) coste de adquisición de la parte construida (proporcional al porcentaje de construcción sobre el total del inmueble). Tipo: 3% anual.

¿Por qué Cataluña paga más ITP que Madrid? Cada CCAA fija su propio tipo ITP dentro del marco de la Ley 22/2009 de financiación autonómica. Cataluña (Llei 2/2014) aplica tramos progresivos 10-11-13%. Madrid (Ley 9/2018) aplica un tipo único del 6%. Capivio toma Madrid como anchor neutro en la dimensión ventajaTerritorial y penaliza CCAAs con tipos superiores.

¿Qué significa DCR y por qué 1,20? DCR (Debt Coverage Ratio) = Ingresos netos operativos / Servicio anual de deuda. Un DCR de 1.20 significa que los ingresos cubren el pago de hipoteca con un 20% de holgura. El umbral 1.20 es convención Capivio (ver §4 para la honestidad de la cita — no se atribuye a banca específica).

¿Mi contrato anterior al 26/05/2023 mantiene la reducción del 60%? Sí. Aplica la disposición transitoria 38.ª LIRPF (añadida por la disposición final 2.ª apartado Dos de la Ley 12/2023, BOE-A-2023-12203), que remite a la reducción del Art. 23.2 LIRPF «en su redacción vigente a 31 de diciembre de 2021».

¿Dónde consulto las casillas 0102, 0106, 0107 del Modelo 100? En el Manual Práctico Renta publicado anualmente por la AEAT (ver §13 para el enlace). La sección E del Modelo 100 cubre los rendimientos del capital inmobiliario con el detalle de todas las casillas aplicables.

¿Qué pasa si mi Comunidad Autónoma no aparece en CCAA_CITATION_MAP? La dimensión ventajaTerritorial devuelve null y el grado compuesto se re-pondera sobre las 5 dimensiones restantes. El impacto es una posible diferencia de ≤ 1 letra respecto al grado que se obtendría con la CCAA correctamente mapeada.

¿Por qué el grado puede diferir entre la vista de lista y la vista de detalle? La vista de lista usa 5 dimensiones (omite precisionAeat para evitar consultas DB adicionales). La vista de detalle usa las 6. El drift está acotado a ≤ 1 rango por un test de regresión. La letra autoritativa es la de la vista de detalle.


Notas editoriales finales

  • Prevalencia del código. Todas las fórmulas recogidas en este documento se han transcrito verbatim desde backend/src/services/fiscalScoringService.js. Ante cualquier discrepancia entre el texto y la implementación, prevalece el código.
  • Política de versionado. La metodología se rige por versionado semántico (MAJOR.MINOR.PATCH):
    • MINOR (p. ej., 1.0.0 → 1.1.0) — cambios en el cálculo del score compuesto que preservan los umbrales de asignación de letras.
    • MAJOR (p. ej., 1.x.y → 2.0.0) — modificación de los umbrales de letras o de su semántica.
    • PATCH (p. ej., 1.0.0 → 1.0.1) — correcciones editoriales, precisiones o nuevas citas sin impacto en el cálculo.

¿Quieres ver el grado de tu piso?

Introduce tus datos, aplica la reducción IRPF que te corresponde, y obtén tu Grado Capivio con citas BOE auditables.