MIAC SRP Workbook Analysis
Source
File: MH_nGSA_3-31-2026.xlsx — MIAC Analytics SRP (Servicing Released Premium) pricing workbook provided by Third Federal (PowerSeller Desktop App client). Date: March 31, 2026.
WORKING DRAFT — Pending validation by Greg, Jay, and Tom.
Key Finding
This is NOT a loan-level MSR valuation. It is a market pricing grid — a set of base SRP values with multi-dimensional adjustments that can be applied to ANY loan in the pipeline. The structure is remarkably similar to LLPA grids and is directly evaluable by PSX's stacking engine.
Workbook Structure
8 sheets organized by product type and servicing fee level:
| Sheet | Product | Servicing Fee | Rows | Columns |
|---|---|---|---|---|
| Conventional 30 | Conv 30yr Fixed | 25 bps | 36 | 19 |
| Conventional 15 | Conv 15yr Fixed | — | 36 | 18 |
| GN30_44 | Govt 30yr (FHA/VA) | 44 bps | 41 | 15 |
| GN30_315 | Govt 30yr (FHA/VA) | 31.5 bps | 36 | 12 |
| GN30_19 | Govt 30yr (FHA/VA) | 19 bps | 36 | 12 |
| GN15_44 | Govt 15yr (FHA/VA) | 44 bps | 41 | 15 |
| GN15_315 | Govt 15yr (FHA/VA) | 31.5 bps | 37 | 12 |
| GN15_19 | Govt 15yr (FHA/VA) | 19 bps | 36 | 12 |
Data Components Per Sheet
1. Market Context (Row 3)
- Note Rate: Current market note rate (6.320% as of 3/31/2026)
- Par Rate: Par coupon rate (6.375%)
- Date: Valuation date
2. Base SRP Grid (Rows 7-23, Conventional)
The core pricing grid. SRP values in basis points indexed by rate spread to par (how far the loan's rate is from the current par rate):
| Index Spread | SRP (bps) | Multiple | Meaning |
|---|---|---|---|
| -1.000 | 153 | 6.12x | Deep discount — loan rate well below par |
| -0.500 | 139 | 5.56x | Below par |
| 0.000 | 126 | 5.04x | At par — baseline |
| +0.500 | 100 | 4.00x | Above par — higher prepay risk |
| +1.000 | 85 | 3.40x | Well above par — highest prepay risk |
The Multiple column expresses SRP as a multiple of the servicing fee (25 bps for Conv 30). A 5.04x multiple at par means the servicing right is worth 5.04 × 25 = 126 bps.
3. Excess Servicing Price Multiples (Columns 4-5)
Values for excess servicing strips at two spread ranges:
- (.2501 - .3750) — lower excess servicing strip
- (.3751 - .5000) — higher excess servicing strip
These are used when the servicing fee exceeds the minimum required — the excess has its own value.
4. Adjustment Grids
FICO Adjustments (basis points)
| FICO Range | Adjustment |
|---|---|
| < 620 | -16 bps |
| 620-639 | -10 bps |
| 640-679 | -7 bps |
| 680-719 | -2 bps |
| 720+ | 0 bps (base) |
UPB (Loan Balance) Adjustments (basis points)
| UPB Range | Adjustment |
|---|---|
| < $50K | -140 bps |
| $50K-99K | -42 bps |
| $100K-149K | -16 bps |
| $150K-199K | -7 bps |
| $200K-249K | -3 bps |
| $250K-299K | 0 bps (base) |
| $300K-349K | +2 bps |
| $350K-548.24K | +3 bps |
| $548.25K-647.2K | 0 bps |
| $647.3K-999K | -10 bps |
| $1M+ | -10 bps |
LTV Adjustments (basis points)
| LTV Range | Adjustment |
|---|---|
| < 85 | 0 bps |
| 85-89 | 0 bps |
| 90-94 | -1 bps |
| 95-99 | -3 bps |
| 100-109 | -5 bps |
| 110-119 | -7 bps |
| 120+ | -12 bps |
Program Adjustments (basis points)
| Program | Adjustment |
|---|---|
| HARP | +3 bps |
| Loan Mod | -7 bps |
| Waive Escrows | -14 bps |
Remittance Type Adjustments (basis points)
| Remit Type | Adjustment |
|---|---|
| FHLMC_STD | +5 bps |
| FNMA_MBS | +10 bps |
| FNMA_MBS_EXP | +3 bps |
Term Adjustments (basis points)
| Term | Adjustment |
|---|---|
| 20 Year | -7 bps |
| 25 Year | -3 bps |
5. Notes (Rows 34-36)
- Adjusted prices are floored at 0
- Base SRPs and adjusters are represented in basis points
- Coupons outside of +/- 100 bps ITM/OTM should be assigned +/- 100 bps SRP, respectively
How the Desk Uses This
For any loan in the pipeline:
1. Determine the loan's rate spread to par:
spread = loan_note_rate - current_par_rate (6.375)
2. Look up base SRP from the grid (interpolate if between rows)
3. Apply adjustments:
+ FICO adjustment (based on borr_credit_score)
+ UPB adjustment (based on loan_amount)
+ LTV adjustment (based on ltv)
+ Program adjustment (if HARP, Loan Mod, or Waive Escrow)
+ Remittance adjustment (based on remit type)
+ Term adjustment (if 20yr or 25yr)
4. Net SRP = Base SRP + sum(adjustments)
(floored at 0)
5. Compare Net SRP to the value of retaining servicing:
If Net SRP > retain value → sell servicing (take the SRP)
If retain value > Net SRP → retain servicing (keep the MSR)
Mapping to Desktop App Tables
| MIAC Data | Desktop App Table | Column |
|---|---|---|
| Base SRP values | rmcat_msr_prices | MSR price by instrument/coupon |
| FICO/UPB/LTV adjustments | rmcat_price_adjustment_values | Or a dedicated MSR adjustment table |
| Excess servicing multiples | Used in BestEx servicing strategy | excess_servicing_value calculation |
| Par rate / valuation date | rmcat_todays_par_rates | Market context |
Client Comparison: Third Federal vs. LG
A second MIAC workbook (LG_nGSA_2-27-2026.xlsx, dated Feb 27, 2026) reveals that the grid structure is universal but content varies per client:
| Component | Third Federal (MH) | LG |
|---|---|---|
| Sheets | 8 | 9 (adds Conventional Hybrids/ARMs) |
| Servicing fee tiers (Conv 30) | 1 (25 bps) | 3 (25, 37.5, 50 bps) |
| State adjustments | None | Full 50-state grid (TX: +13, CA: -16, FL: +5) |
| Base SRP at par (Conv 30, 25bps) | 126 bps / 5.04x | 123 bps / 4.93x |
| FICO adjustments | Same values (±1 bps) | Same values |
| UPB adjustments | Same values | Same values (LG has +4 for $548-647K) |
| LTV/Program/Remit/Term | Same values | Same values |
| Par rate | 6.375% (Mar 31) | 5.875% (Feb 27) |
Conclusion: MIAC uses a universal template. The adjustment grids (FICO, UPB, LTV, Program, Remit, Term) are nearly identical across clients. What varies: base SRP values (calibrated per client's portfolio), number of servicing fee tiers, presence of state adjustments, and which product sheets are included.
This means a single parser handles all clients — it just needs to detect variable column counts and optional sections.
API Integration Design
Loan Fields Required from Desktop App
For Rudy's plugin to send loan data to an SRP evaluation endpoint:
| Field | Required? | Why | Desktop App Source |
|---|---|---|---|
loan_id | Yes | Match results back | rmcat_loan.loan_id |
note_rate | Yes | Index spread (note_rate - par_rate) | rmcat_loan.note_rate |
borr_credit_score | Yes | FICO adjustment | loan.borr_credit_score |
loan_amount | Yes | UPB adjustment | rmcat_loan.loan_amount |
ltv | Yes | LTV adjustment | rmcat_loan.ltv |
state | Yes | State adjustment (if client has it) | rmcat_loan.state |
amortization_term | Yes | Term adjustment (20yr/25yr) | loan.amortization_term |
instrument_name | Yes | Which product sheet to use | rmcat_loan.instrument_name |
servicing_fee | Yes | Which servicing fee column | rmcat_loan.servicing_fee |
program_name | Optional | Program adjustment (HARP, Loan Mod) | rmcat_loan.program_name |
remittance_type | Optional | Remit adjustment (FHLMC_STD, FNMA_MBS) | Derived from pscat_instruments.rm_servicing_type or pscat_pools.remittance_type |
escrow_indicator | Optional | Waive Escrows adjustment (-14 bps) | loan.escrowindicator |
mortgage_type | Optional | Route Conv vs. Govt sheets | loan.loan_type |
All 9 required fields already exist in the Desktop App's tables. The optional fields are available via joins. Rudy doesn't need to add any new columns.
Expected Response
Per loan:
{
"loan_id": "12345",
"base_srp_bps": 126,
"multiple": 5.04,
"adjustments": {
"fico": -2,
"upb": 3,
"ltv": 0,
"state": -4,
"program": 0,
"remittance": 10,
"term": 0,
"escrow": 0
},
"net_srp_bps": 133,
"servicing_fee_bps": 25,
"index_spread": 0.125
}
Endpoint Location (Pending Decision)
Product Owner is evaluating whether this endpoint belongs in PSX (leverages existing stacking engine and LLPA endpoint pattern) or PSSaaS (MSR valuation is a secondary marketing operation, aligns with database-per-tenant model). Decision pending.
Desktop App Integration Gap
The API returns per-loan SRP values. But using those values in BestEx (servicing strategy), Risk Manager (position reconciliation), and reports requires additional SQL/stored procedures in the Desktop App that Tom/Greg/Rudy must write. The API is the calculation service; the Desktop App is the workflow integration. PSSaaS eliminates this gap by building both layers in one system.
Implications for PSX / PSSaaS
PSX Stacking Engine Compatibility
The MIAC SRP grid is structurally identical to an LLPA grid:
- Base value indexed by a primary dimension (rate spread vs. coupon rate)
- Additive adjustments across multiple dimensions (FICO, UPB, LTV, Program, Term)
- Floor at zero
PSX's stacking engine could evaluate MIAC SRP grids the same way it evaluates agency LLPAs — as an extracted_profile with participant_type = 'msr_pricing'. The dimensions (FICO, UPB, LTV) are the same dimensions the stacking engine already resolves.
Daily Interpolation
The base SRP grid uses Index Spread (rate relative to par) as its primary dimension. As rates move daily (captured via dataQollab TBA snapshots), the par rate changes, which shifts every loan's index spread, which changes every loan's SRP value. Daily re-evaluation is a simple grid lookup with the updated par rate — no new MIAC data needed.
Client-Specific vs. Universal
MIAC calibrates this grid for each client based on their portfolio characteristics. Different clients may have different base SRPs and different adjustment values. This means:
- The grid is tenant-specific in PSSaaS (database-per-tenant)
- Each tenant imports their own MIAC grid
- The structure is universal; the values are client-specific
Rudy's Plugin
Rudy's plugin for the Desktop App ingests this XLSX and populates the MSR pricing tables. The plugin needs to:
- Parse each sheet (8 product/servicing-fee combinations)
- Extract the base SRP grid (index spread → SRP/multiple)
- Extract all adjustment grids (FICO, UPB, LTV, program, remit, term)
- Write to the appropriate
rmcat_msr_*tables - Record the valuation date and par rate for context