CFDL

Credit: Fannie Mae REMIC with a stripped coupon, at six prepayment speeds

Security Group 3 of a Fannie Mae REMIC: a seasoned mortgage pool passing through to a single class, with the coupon stripped between it and an interest-only class that carries no principal.

Every number below is checked against an independent reference implementation on every commit — period by period, and on each metric, inside a declared tolerance. See benchmark methodology.

The case

Fannie Mae REMIC Trust 2019-2 divides $307,727,958 across three groups. Group 3 is $148,372,434 of Fannie Mae mortgage-backed securities, and its priority of payments is a single line:

The Group 3 Principal Distribution Amount to AB until retired.

Which makes it sound like nothing to model. The interest is where the deal is.

The pool passes through at 5.00%. Class AB takes 3.25% of that, and the remaining 1.75% is sold separately as Class IO — an interest-only class with no principal balance at all, entitled instead to 5.00% of a notional balance set at 35.0000000674% of AB's. The two reconstruct the pass-through rate:

3.25%  +  0.350000000674 x 5.00%  =  5.00000000337%

An investor in IO owns a slice of a coupon and nothing else. Their position shrinks as AB amortizes, they receive not one dollar of principal, and if the loans prepay quickly they lose most of what they paid.

The reference

The Prospectus Supplement dated 24 January 2019, page S-14, which publishes for Classes AB and IO the percentage of the original balance outstanding after each January's distribution for thirty years, at seven prepayment speeds, with a weighted average life for each. See SOURCE.md.

This case takes the 198% PSA column, the pricing speed.

What it exercises

Packcredit
Contract typescredit.loan
Language featurestwo waterfalls over one collateral, one for principal and one for interest; entity fields carrying class balances
ConventionsPSA on a pool seasoned past the ramp, a servicing and guaranty strip, a stripped coupon, a notional interest-only class

This is the first case in the repo where a coupon is stripped. Every other credit case pays interest at the rate the asset earns. Here three rates are in play at once and none of them is the mortgage rate:

  • the loans carry a 5.451% weighted average coupon;
  • 0.451% is the servicing and guaranty strip, carried as servicing_fee, so what reaches the trust is 5.00% exactly;
  • that 5.00% is then split 3.25% / 1.75% between a principal class and a notional one.

The interest waterfall is the test. It declares a residual step, and if the strip is right that step takes nothing:

pay ab_interest to party.ab_holders = asset.ab.balance * (0.0325 / 12.0)
pay io_interest to party.io_holders = asset.io.balance * (0.05 / 12.0)
pay residual    to party.residual   = remaining

The residual is zero in all 361 periods, to ten decimal places.

A note on why the class balances are fields at all. AB is a pass-through, so its balance is the pool's, and IO's is a fixed fraction of AB's — neither carries state of its own, and neither is copied. The field says what the class is (next prev.asset.pool.balance) and derives the number. That the balances land one period behind the distributions is not a workaround here but the deal's own convention: the supplement strikes interest on "the outstanding balance of that Certificate immediately prior to that Distribution Date", which is precisely the number these fields hold.

The result

Worst disagreement 0.3640 percentage points across 30 published cells, against a floor of 0.5 set by the table's whole-percent rounding.

Decrement, worst / mean0.3640 pp / 0.0841 pp
Informative cells (published value neither 0 nor 100)14 of 30
Class AB weighted average life4.6950, published 4.7
Residual to Classes R and RL0.0000000000, every period
Principal returned to AB148,372,434.00 against an original of 148,372,434

Over the 14 informative cells the mean error is 0.1803 pp — the signature of the issuer's rounding and nothing else.

The interest legs are asserted too, and they are external rather than model output: a published balance multiplied by a coupon stated on the cover. Their tolerance is the balance band carried through the coupon.

The class's weighted average life is folded from the principal the waterfall pays it (wal) and asserted at ±0.05, the print floor of a figure published to one decimal. The deal distributes on the 25th, and the waterfalls say so, so each payment sits on the day the supplement measures to.

The supplement's other columns are scenarios of this case, each varying the one term that differs — the prepayment speed — and asserting its own decrement column and class life from its own file:

speedasserted cellsworst balance, ppClass AB lifepublished
100% PSA1800.4146.09776.1
300% PSA1750.4833.66823.7
400% PSA1700.4752.94602.9
700% PSA1500.4271.69201.7
1000% PSA1350.4551.06091.1

Every balance sits inside the half-percent floor and every life inside the print floor of 0.05. The 0% PSA column ships as its own case (fnma_remic_2019_2_g3_psa000): the supplement prepares it on a different collateral assumption, a 360-month original and remaining term at 7.50%, so it is a different pool rather than a different speed.

The delta

Group 3 of three. Groups 1 and 2 are Structured Collateral: their assets are seventeen tranches of other Fannie Mae REMICs issued between 2002 and 2006. The instrument is fully specified for those groups too — one line each, the same as this one — but the cash arriving at them is another instrument's output, and reproducing the published tables would need those seventeen deals' own collateral. That is a compositional boundary, not a gap in this document, and it is why only Group 3 is here.

Seven speeds, one model. What the seven columns prove together is stronger than any one alone: a convention error in the prepayment curve, the seasoning ramp or the payment timing that hides under one column's whole-percent rounding has to hide under all seven columns and seven published lives simultaneously.

No losses. Fannie Mae guarantees timely payment of principal and interest, so the collateral cannot default in a way the classes would see.

Seasoned past the ramp. Weighted average loan age is 175 months, so 198% PSA is a flat 11.88% CPR in every period. The ramp is written out in full anyway — the model should say the pool prepays at 198% PSA, not at 11.88% CPR, because the second is a consequence of the first and stops being true if the seasoning changes.

model.total is a regression anchor from this model. Every other assertion is a published figure or derived from one.

Run configuration

{
  "deterministic": {
    "annual_discount_rate": 0.03
  },
  "scenarios": {
    "psa100": {
      "parameters": {
        "inputs.psa": 1.0
      }
    },
    "psa300": {
      "parameters": {
        "inputs.psa": 3.0
      }
    },
    "psa400": {
      "parameters": {
        "inputs.psa": 4.0
      }
    },
    "psa700": {
      "parameters": {
        "inputs.psa": 7.0
      }
    },
    "psa1000": {
      "parameters": {
        "inputs.psa": 10.0
      }
    }
  }
}

Verified results

Checked period by period: 6 series across 60 periods180 values in all, each within the tolerance shown.

  • domain.credit.principal_paid_to_date — within ±741862.17
  • asset.ab.balance — within ±741862.17
  • asset.io.balance — within ±259651.76
  • g3.interest.ab_interest — within ±2009.21
  • g3.interest.io_interest — within ±1081.88
  • g3.interest.residual — within ±0.01

Checked per scenario, each a full run under its own parameters:

Scenariomodel.totalmetric.ab_wal
psa100193,718,881.036.1
psa300175,695,352.453.7
psa400170,337,628.952.9
psa700161,035,147.511.7
psa1000156,352,857.61.1

Summary metrics for the base run:

MetricValueTolerance
domain.credit.principal148,372,434±0.01
model.total183,313,276.29±1
domain.credit.wal_years4.7±0.07
metric.ab_wal4.7±0.05