Back to Research

Building a Pricing Engine When Your Training Data Is Sparse

Building a Pricing Engine When Your Training Data Is Sparse cover image

The defining constraint of corporate bond pricing is not algorithmic complexity. It is data sparsity. Most machine learning textbooks assume a training dataset where the label you want to predict appears frequently and is associated with a rich feature set for the same observation. In bond pricing, you are trying to predict the fair value OAS for a bond that may have fewer than 20 observable trades in the past year. That is not a solved problem with a standard architecture. It requires deliberate choices at every stage of the pipeline.

The Core Sparsity Problem

To be concrete about the scale of the challenge: if you want to build a per-CUSIP model for each of the 4,000 or so bonds in a typical mid-size IG universe, the median CUSIP in that universe will have produced on the order of 50 to 100 trade prints over the course of a full year. Many will have fewer. An off-the-run 10-year note from a secondary issuer, placed into buy-and-hold hands during its primary market offering, may produce 15 to 20 prints in 12 months, all concentrated in the first few weeks post-issuance when initial holders trim positions.

50 to 100 observations is insufficient to train a robust model for any specific bond. The feature set available for predicting OAS is large (rating, duration, sector, issuer financials, macro regime, comparable peer spreads, and more), and with 50 rows you will overfit immediately if you try to learn bond-specific relationships from first principles.

The solution, which we adopted early in Deep MM's development, is to not attempt per-CUSIP modeling. The entire problem is reframed as a cross-sectional learning problem: what features predict OAS across all bonds simultaneously, and then what bond-specific features explain the deviation of each bond from the cross-sectional fit. This hierarchical structure is the foundation of the approach.

Feature Engineering for Cross-Sectional Learning

For cross-sectional learning to work, you need features that generalize across bonds. That means representing each bond in a feature space where bonds with similar characteristics cluster together, so the model can learn from observations on comparable bonds when direct observations on the target bond are scarce.

Bond-Level Features

The core bond-level features are the structural attributes: modified duration, coupon, years-to-maturity, credit rating (numerical), seniority, and issuer sector. These are well-behaved, low-noise features that the model can reliably use to identify comparables. We also include computed features like spread-to-worst (for callable bonds), years-since-issuance, and original issue size, which contribute information about where a bond sits in the liquidity distribution within its sector.

Issuer-Level Features

The issuer's financial profile enters as a separate feature block: leverage ratio (net debt to EBITDA), interest coverage, EBIT margin, and total debt outstanding. These are sourced from the most recently available public filings and are updated when new filings appear. Issuer financial features carry the fundamental credit story that explains why two bonds with similar duration and rating but different issuers might trade at materially different spreads.

The challenge with issuer financial features is staleness and discontinuity. Quarterly filings create step functions in the feature values, and the market often prices in changes before they appear in filings. We address this by also incorporating analyst consensus estimate revisions as a leading indicator of what the next filing will show, rather than relying solely on the most recently published historical figures.

Macro-Regime Features

Cross-sectional OAS levels shift substantially with macro regime. The absolute level of CDX IG, the shape of the Treasury curve, and credit volatility all shift the entire cross-sectional spread surface. Without capturing these regime features, the model would confuse a bond that is "cheap" in a tight-spread environment with a bond that is "cheap" in a wide-spread environment, when they are fundamentally different situations.

We represent the macro regime as a vector of current index levels relative to their trailing distributions, rather than as raw levels. This normalization ensures that a 120bp CDX IG level in a historical low-spread environment and a 120bp CDX IG level in a returning-to-normal environment are represented differently, which they should be.

Regularization Strategy

Even in a cross-sectional setup with thousands of observations across all CUSIPs, regularization is essential. The feature space is high-dimensional relative to the number of genuinely distinct bonds, which creates collinearity and overfitting risks. Our regularization approach operates at two levels.

At the global model level, we apply standard L2 regularization with the penalty weight tuned through cross-validation. The cross-validation structure matters: we do not use random held-out samples, because bonds from the same issuer or sector are correlated. We use time-based holdout windows (train on months 1 to 18, validate on months 19 to 24, for example) and sector-blocked holdouts (hold out one complete sector and predict it from the others). The sector-blocked holdout is particularly harsh and informative: it tests whether the model has learned general credit pricing relationships or sector-specific ones that would fail to transfer.

At the issuer-specific residual level, we apply a hierarchical shrinkage that pulls idiosyncratic residuals toward zero when the observation count is low. An issuer with 50 total print observations gets more shrinkage applied to their idiosyncratic term than an issuer with 500 observations. This prevents the model from interpreting the noise in 10 prints as a genuine signal about that issuer's idiosyncratic spread premium.

Handling Structural Breaks in Training Data

Historical TRACE data covers credit environments ranging from pre-2008 normality to the March 2020 dislocation to the 2022 rate normalization period. These regimes have genuinely different statistical properties. Training a model on 10 years of undifferentiated data risks learning spurious relationships that held in a specific historical regime but not in others.

We weight training observations by their recency and regime similarity to the current environment. Observations from the prior 12 months receive full weight. Observations from 1 to 3 years ago receive moderate weight. Observations more than 3 years old receive low weight unless they were collected during a regime similar to the current one (assessed by comparing the regime score at time of observation against the current regime score). This recency weighting means the model's effective training set is always tilted toward the most relevant historical experience.

The tradeoff is that a model with heavy recency weighting has less data to learn from and may perform worse on novel conditions that require information from longer history. We do not pretend this tradeoff does not exist. For bonds that behave very differently across regimes (leveraged companies with floating-rate debt, for instance), model confidence intervals are deliberately wider to reflect the genuine uncertainty.

Inference Pipeline Considerations

The model architecture solves the statistical problem. The engineering challenge is running this at scale across 4,000 CUSIPs with updates every five minutes during market hours. Each update cycle requires ingesting new TRACE prints, axis observations, and cross-asset feeds, recomputing feature vectors, running inference, and delivering outputs through the API.

The per-CUSIP inference is fast because we run forward passes through a trained model rather than retraining. The computationally expensive operation is feature recomputation: the trailing windows for macro regime features, the peer-group comparables selection, and the axis decay calculations all require non-trivial computation on each cycle. We pre-compute and cache the stable components (issuer financials, structural bond features) and only recompute the time-varying components on each cycle.

For a bond that has received new information in the current cycle (a print, an axis observation, a CDS move), the confidence interval on the output narrows relative to its prior-cycle estimate. For a bond with no new information in the current cycle, the confidence interval remains unchanged or widens slightly due to increased staleness. This staleness signal is a feature rather than a limitation: it tells the desk in real time which fair value estimates are fresh and which are coasting on older information.

Access the Deep MM signal for your desk

The research describes the methodology. The live signal delivers it, updated every five minutes for 4,200+ CUSIPs.