Skip to content

Servicer Domain

The Servicer domain provides analytics for loan servicing operations: payment processing, accrual calculations, delinquency tracking, reconciliation, and regulatory reporting. While CalcBridge started as a CLO analytics platform, loan servicing represents a distinct segment with different compliance requirements, risk models, and operational workflows.


What Is Loan Servicing?

When a bank or financial institution originates a loan, someone has to handle the day-to-day administration: collecting monthly payments, tracking which borrowers are late, processing modifications when borrowers hit hardship, and reporting everything back to the entity that owns the loan. That role is the servicer.

Think of it as the difference between a landlord and a property manager. The landlord owns the asset and cares about returns. The property manager handles operations -- collecting rent, coordinating maintenance, managing tenant communications. The landlord might never interact with tenants directly; the property manager handles everything.

In structured finance, this distinction is critical. The loans inside a CLO are almost always serviced by a third-party servicer who has no economic interest in the portfolio's credit performance. The CLO manager owns the risk. The servicer handles the mechanics.

Why This Matters for CalcBridge Engineers

Understanding the servicer/manager distinction affects every feature decision. CLO features optimize for portfolio health (is the collateral pool strong enough?). Servicer features optimize for operational accuracy (are we processing payments correctly?). Same asset class, completely different questions.


CLO Manager vs Loan Servicer

Engineers building CalcBridge templates or features need to understand which segment they are serving. The operational models are fundamentally different:

Dimension CLO Manager Loan Servicer
Role Investor -- buys loans, manages portfolio risk Administrator -- collects payments, reports to owner
Compliance source Indenture (private deal document) Servicing agreement + federal/state regulators
Risk focus Portfolio credit quality Operational accuracy and timeliness
Test frequency Monthly/quarterly Daily/monthly
Failure consequence Cash diversion, trading restrictions Regulatory fines, servicer termination
Key metrics OC, IC, WARF, WAS, WAL, diversity score Payment accuracy, delinquency rates, remittance timing
Data granularity Portfolio-level aggregates Loan-level detail (every payment, every date)
CalcBridge value Compliance test automation, what-if scenarios Calculation pipeline, reconciliation, reporting

The Connection

Loans inside a CLO are typically serviced by a third-party servicer. The CLO manager selects the servicer, monitors their performance, and can replace them if servicing quality degrades. This means:

  • A single loan can appear in both a CLO manager's portfolio and a servicer's operational data
  • The CLO manager cares about the loan's credit metrics (rating, spread, maturity)
  • The servicer cares about the loan's operational status (payment history, escrow balance, modification status)
  • CalcBridge needs to serve both perspectives, but with different feature sets
flowchart LR
    subgraph Servicer["Servicer (Operations)"]
        S1["Collect Payments"]
        S2["Track Delinquencies"]
        S3["Process Modifications"]
        S4["Remit to Owner"]
    end

    subgraph Manager["CLO Manager (Investment)"]
        M1["Monitor Credit Quality"]
        M2["Run Compliance Tests"]
        M3["Execute Trades"]
        M4["Report to Investors"]
    end

    S4 -->|"Cash flows + reporting"| M1

    style Servicer fill:#DCFCE7,stroke:#22C55E
    style Manager fill:#DBEAFE,stroke:#3B82F6

Feature Mapping

CalcBridge features serve both segments, but the use cases are different. Engineers should understand which context applies when building or extending features:

Feature CLO Use Servicing Use
Formula Engine Compliance formulas (OC, WARF, diversity) Accrual calculations, payment allocation, day count conventions
Compliance Testing Indenture covenant tests (concentration, coverage, quality) Servicing accuracy tests (different framework -- see Servicing Tests)
What-If Scenarios Pre-trade simulation (buy/sell impact on compliance) Modification impact analysis (rate change, term extension)
Data Reconciliation Trustee tape vs internal portfolio data Remittance vs accounting records, servicer vs investor statements
Sanctions Screening Obligor screening against OFAC/EU lists Borrower screening against OFAC/EU lists
Export Provenance Trustee reports, investor packages Regulatory filings, servicer performance reports
Multi-Tenancy Per-deal isolation (each CLO is a tenant) Per-fund isolation (each fund/portfolio is a tenant)
Alias Profiles CLO holdings normalisation (15 profiles) Servicer snapshot normalisation (14 profiles)

Servicing Compliance Is Not CLO Compliance

The existing compliance testing documentation (test suites, thresholds, cushion analysis) is entirely CLO-focused. Servicing compliance tests are structurally different -- they validate operational accuracy rather than portfolio health. See Servicing Compliance Tests for the servicing framework.


FARF: CalcBridge's Servicing Implementation

What Is FARF?

The Federal Agency Receivables Fund (FARF) is CalcBridge's first -- and currently only -- production servicing client. FARF manages receivables from US federal government agencies. These are not leveraged loans in the traditional sense; they are government payment obligations with distinct characteristics:

  • Counterparty risk: US government agencies (not corporate borrowers)
  • Payment patterns: Government fiscal cycles, continuing resolutions, budget sequestration
  • Regulatory environment: Federal procurement regulations rather than consumer lending law
  • Collateral type: Government receivables, not real estate or corporate assets

Honest Assessment: Servicing Maturity in CalcBridge

FARF is a single production client with bespoke adapters. The servicing template library is not yet scoped for broader market adoption. Unlike CLO, where CalcBridge has 15 alias profiles covering multiple data providers and deal structures, servicing currently has deep coverage for one client's specific workflow. Engineers should design servicing features to be generalizable, but should not assume the current FARF implementation represents a complete servicing platform.

FARF Architecture

FARF operates as a standalone Flask application (fidera/farf/) with its own database, models, and import pipeline. It follows the Model-Importer-Calculation Service pattern used throughout CalcBridge:

flowchart TD
    subgraph Input["Data Sources"]
        EXCEL["Excel Workbooks\n(Operational Snapshots)"]
        GENEVA["Geneva XML\n(Portfolio Accounting)"]
        JPM["JPM Feeds\n(Cash Reconciliation)"]
    end

    subgraph Pipeline["FARF Processing Pipeline"]
        IMP["Importers\n(Excel parsing + validation)"]
        CALC["Calculation Services\n(Vectorized pandas/numpy)"]
        MODEL["Pydantic Models\n(Validation + typing)"]
        DB["PostgreSQL + JSONB\n(Storage)"]
    end

    subgraph Output["Applications"]
        WEB["Flask Webapp\n(Domains: buy, sell, define,\nnomad, vrs, twf, twp)"]
        REPORTS["Regulatory Reports"]
        RECON["Reconciliation Reports"]
    end

    EXCEL --> IMP
    GENEVA --> WEB
    JPM --> RECON
    IMP --> CALC
    CALC --> MODEL
    MODEL --> DB
    DB --> WEB
    DB --> REPORTS

    style Pipeline fill:#F0FDF4,stroke:#22C55E

Key FARF Components

Component Description
Bond Definitions Investment records for government receivables
Transaction Processing Buy/sell operations for receivables
Variable Rate Schedules (VRS) Interest accrual rate management over time
Key Data Service Agency lookup mappings used across all sheets
Risk Restrictions Constraint tracking for portfolio limits
Cross-Sheet Pipeline Dependent calculation chain across Excel sheets

Third-Party Integrations

System Purpose Integration Method
Geneva Portfolio accounting XML upload/export
JPM (J.P. Morgan) Cash management Account balances, statements, fund performance feeds
Nomad Portfolio tracking Reporting and reconciliation

Cross-Sheet Calculation Pipeline

The FARF calculation pipeline processes multiple interconnected Excel sheets. Import order matters because later sheets depend on data from earlier ones.

Import Order

flowchart LR
    KD["1. Key Data\n(Agency Lookups)"] --> PME["2. PME\n(Private Market Equiv.)"]
    PME --> ABC["3. ABC\n(Primary Portfolio)"]
    PME --> ATLYS["4. Atlys\n(Secondary Portfolio)"]

    style KD fill:#FEF3C7,stroke:#F59E0B
    style PME fill:#DBEAFE,stroke:#3B82F6
    style ABC fill:#DCFCE7,stroke:#22C55E
    style ATLYS fill:#DCFCE7,stroke:#22C55E

Import Order Is Critical

If sheets are imported out of order, XLOOKUP operations fail and fall back to default values. The P&L calculation (column CG) in both ABC and Atlys requires PME data. Always import Key Data first, then PME, then ABC/Atlys.

Calculation Services

Each sheet has a dedicated calculation service that implements the CA-CI derived columns using vectorized pandas/numpy operations:

Service Location Sheet Key Methods
KeyDataService farf/common/key_data_service.py Key Data load_agency_lookup()
PMECalculationService farf/common/pme_calculations.py PME enhance_dataframe_with_calculations()
ABCCalculationService farf/common/abc_calculations.py ABC calculate_all_ca_ci_columns(), clean_data_types()
AtlysCalculationService farf/common/atlys_calculations.py Atlys calculate_agency2(), calculate_weighted_realised_days()

Calculated Columns (CA-CI)

Servicer sheets include derived columns that are excluded during Excel import and computed by CalcBridge using vectorized operations. This mirrors how Excel users see calculated columns in their workbooks, but with significant performance improvements.

ABC Columns

Column Name Calculation Type Description
CA Agency2 XLOOKUP Agency mapping from Key Data sheet
CB Realised Days Conditional Days open when senior principal balance <= 0
CC Weighted Realised Days Aggregation Portfolio-weighted realised days
CD Weighted Total Days Aggregation Portfolio-weighted total days open
CE Remaining Equity Balance Remaining equity after principal payments
CF Senior Outstanding to Collateral Ratio Collateral coverage ratio
CG P&L Cross-sheet lookup Profit/loss from PME sheet via XLOOKUP
CH Overaccrual Risk Risk-adjusted accrual excess
CI Accrual > Invoice Value? Flag Boolean: is accrual greater than invoice?

Atlys Columns

Column Name Calculation Type Description
CA Agency2 XLOOKUP Agency mapping from Key Data sheet
CB Realised Days Conditional Days open when principal balance <= 0
CC Weighted Realised Days Aggregation Portfolio-weighted realised days
CD Weighted Total Days Aggregation Portfolio-weighted total days
CE Remaining Equity Balance Balance calculations
CF LTV Ratio Ratio Loan-to-value calculation
CG P&L Cross-sheet lookup Profit/loss from PME sheet
CH Overaccrual Risk Overaccrual risk calculation
CI Accrual Flag Flag Accrual status indicator

Column Name Conflicts Across Sheets

The same column letter means different things on different sheets. CB on Atlys is "Realised Days"; CB on PME is "Overaccrual." Always specify the sheet context when discussing columns. This is a common source of bugs when engineers work across multiple calculation services.

Vectorized Calculation Example

All calculated columns use vectorized pandas/numpy operations for performance. Here is the pattern used for conditional calculations:

import numpy as np
import pandas as pd

# Conditional: Realised Days (CB)
# If Senior Principal Balance <= 0, use Days Open; otherwise 0
df['realised_days'] = np.where(
    df['senior_principal_balance'] <= 0,
    df['days_open'],
    0
)

# Weighted aggregation: Weighted Realised Days (CC)
total_paid_loans = df.loc[
    df['senior_principal_balance'] <= 0, 'senior_loan'
].sum()
df['weighted_realised_days'] = np.where(
    df['senior_principal_balance'] <= 0,
    df['senior_loan'] / total_paid_loans * df['days_open'],
    0
)

# Cross-sheet lookup: P&L (CG)
pme_lookup = dict(zip(pme_df['y_cusip_a'], pme_df['pnl']))
df['pnl'] = df['y_cusip_a'].map(pme_lookup)

# Ratio with division-by-zero handling: CF
df['outstanding_to_collateral'] = np.where(
    df['collateral_value'] != 0,
    df['senior_outstanding'] / df['collateral_value'],
    np.nan
)

Y-Cusip-A: The Universal Key

Y-Cusip-A serves as the unique identifier across all FARF sheets. It is always located in column BW for ABC, Atlys, and PME sheets. This consistency simplifies cross-sheet lookups and database joins.


Alias Profiles

CalcBridge includes 14 servicer alias profiles for normalizing data from different servicing systems and regulatory templates:

Profile Description
default Baseline servicer snapshot
loan_servicer_portfolio_snapshot Portfolio snapshot with dashboard, concentration, capitalization
loan_servicer_monthly_report Monthly reporting format
boe_sme_loan_level_template Bank of England SME loan template
boe_corporate_loan_level_template BoE corporate loan template
boe_asset_finance_loan_level_template BoE asset finance template
rba_rmbs_loan_level_template Reserve Bank of Australia RMBS template
ecb_rmbs_loan_level_template European Central Bank RMBS template
ecb_sme_decc_loan_level_template ECB SME/DECC template
ecb_public_sector_deccs_template ECB public sector DECC template
cdfi_pledged_loan_monitoring CDFI pledged loan monitoring
fnfmb_reporting_templates FNFMB reporting format

Profile Structure

Servicer profiles organize aliases by section, reflecting the multi-sheet structure of servicing workbooks:

{
  "profile": "profile_name",
  "sheet_name_hints": {
    "key_data": ["Key Data", "Summary"],
    "risk_restrictions": ["Risk", "Restrictions"],
    "capital": ["Capital", "Investors"]
  },
  "section_aliases": {
    "key_data": {
      "snapshot": ["field aliases..."],
      "borrower": ["field aliases..."],
      "portfolio_composition": ["field aliases..."]
    },
    "risk_restrictions": {
      "borrower": ["field aliases..."],
      "region": ["field aliases..."]
    }
  }
}

Webapp Domains

The FARF webapp exposes servicing operations through a domain-driven Flask architecture:

Domain Purpose
define Bond definitions and investment record management
buy Purchase transaction processing
sell Sale transaction processing
nomad Nomad portfolio tracking integration
vrs Variable Rate Schedule management
twf TWF (Trustee Waterfall) processing
twp TWP (Trustee Waterfall Payments) processing
data Data retrieval and query endpoints
upload Excel file upload and import pipeline
agency_map Agency mapping configuration
riskrestrictions Risk restriction rule management
keydata Key data lookups and reference management

Building Servicing Features

What Exists Today

  • FARF production pipeline with complete Excel-to-database flow
  • 14 alias profiles covering BoE, RBA, ECB, and custom templates
  • Vectorized calculation services for CA-CI columns
  • Cross-sheet dependency management with caching
  • Geneva XML and JPM integration adapters

What Does Not Exist Yet

  • Generalized servicing template library (FARF is bespoke)
  • Servicing compliance test suite in CalcBridge core (see Servicing Tests for the framework)
  • Payment waterfall engine for general loan servicing
  • Borrower communication tracking
  • Escrow calculation engine
  • Loss mitigation workflow

Design for Generalization

When building new servicing features, design the interface to be client-agnostic even if the initial implementation is FARF-specific. Use the alias profile pattern to abstract data formats. Use the calculation service pattern to isolate business logic from import mechanics. Future servicing clients should be able to plug in without modifying core infrastructure.