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.
Related Documentation¶
- Alias Profiles - How alias profiles work across domains
- CLO Domain - CLO-specific analytics (contrast with servicing)
- Servicing Compliance Tests - Compliance test framework for servicing operations
- Regulatory Landscape - Regulations driving both CLO and servicing features
- Compliance Testing - CLO compliance testing (for comparison)