← Atlas

Project Record

Portfolio-Aware Liquidity Scoring for Bonds, Loans and CDS

Open in an AI assistant with a suggested prompt
Preview prompt
Summarize the Ionitsa project record titled "Portfolio-Aware Liquidity Scoring for Bonds, Loans and CDS" for a technical reader.
Cover the problem or research question, implementation or method, evidence or results, and limitations.
Separate facts stated on the page from your own assessment, note anything unclear or unverified, and avoid promotional language.

Primary source: https://ionitsa.com/projects/portfolio-aware-credit-liquidity-score.md
Canonical page: https://ionitsa.com/projects/portfolio-aware-credit-liquidity-score/

A production liquidity score that combines Markit and Bloomberg market evidence with position concentration, liquidation capacity and point-in-time stress conditions.

Domains
Hedge FundCredit
Capability
Market & Risk Systems
Methods
Risk ModelingData FusionStress TestingPortfolio Analytics

Executive Summary

A credit instrument can look liquid in a market-data terminal and still be hard for a particular fund to exit. The missing variable is the position itself. A 250,000bondlineanda250,000 bond line and a 25 million line do not have the same liquidity even when they share an identifier, price and vendor score. The same problem appears in syndicated loans, where transfer and settlement frictions matter, and in CDS, where liquidity belongs to a legal contract and tenor rather than merely an issuer name.

I implemented a portfolio-aware liquidity framework across bonds, loans and CDS. It combined Markit and Bloomberg observations with proprietary positions, fund NAV, issuer concentration and internal execution history. The output was a bounded score, an estimated liquidation horizon, a stress score and a set of reason codes. This let portfolio and risk teams distinguish a liquid instrument from a liquid position.

The central design choice was to avoid treating either vendor as ground truth. Inputs were normalized within comparable market buckets, stale or conflicting evidence was penalized, and the resulting market score was adjusted for the fund’s share of executable capacity. A point-in-time regime variable made the adjustment stronger when spreads widened, volatility rose or dealer support weakened.

This project demonstrates fixed-income market microstructure, cross-asset data normalization, portfolio risk engineering and explainable model design. The formulation below reconstructs the implemented idea without exposing licensed vendor fields, internal thresholds or proprietary fund data.

Problem

Liquidity is not a permanent security attribute. It is conditional on the side of the trade, requested size, time horizon and market state. Define the question at observation time tt as:

What fraction of position ii could the fund execute within horizon HH, at an acceptable cost, using only information available by tt?

Three distinctions follow.

  1. Instrument liquidity describes the market’s general capacity to trade a bond, loan facility or CDS contract.
  2. Position liquidity asks whether the fund’s actual balance is small or large relative to that capacity.
  3. Portfolio liquidity asks whether many positions are likely to demand the same scarce dealer balance sheet during a redemption or risk-reduction event.

A simple average of vendor scores answers only part of the first question. The implemented score therefore moves in layers: market evidence, data quality, position capacity and market regime.

Inputs and instrument identity

The production feature dictionary was vendor- and entitlement-specific. The model only requires economically meaningful groups, so the public description uses generic fields rather than claiming a particular proprietary schema.

DimensionBondsLoansCDS
Tightnessexecutable or composite bid-offerbid-offer and price dispersionpar-spread or upfront bid-offer
Depthobservable size, trade-size proxyfacility depth and dealer indicationsquoted notional and dealer breadth
Activitytrade count, volume, days since tradeupdate frequency and recent transfersquote updates and tenor activity
Resiliencespread recovery after shocksprice-update recoveryquote return and curve normalization
Frictiondenomination, issue size, optionalityassignment, consent and settlementtier, currency, clause, tenor and roll

Identity is resolved before scoring. A bond requires a point-in-time security identifier; a loan requires the facility or tranche rather than only the borrower; CDS requires the reference entity, seniority, currency, restructuring clause, tenor and contract version. A confident score on the wrong instrument is worse than a missing score.

Bloomberg describes its Liquidity Assessment as estimating liquidation cost and horizon at position level under current and stressed conditions. S&P Global’s fixed-income pricing suite, which includes products originating from IHS Markit, describes pricing and liquidity measures across bonds, leveraged loans and CDS. Those sources support the data layer; they do not remove the need for fund-specific calibration.

Step 1 — point-in-time normalization

Raw measures cannot be compared directly across asset classes, currencies, ratings or maturities. A five-basis-point spread means something different for a government bond, a high-yield bond and five-year CDS. Each feature is first directionally aligned so that larger means more liquid, then transformed within a comparable bucket b(i,t)b(i,t) using an empirical cumulative distribution known at time tt:

ui,k,t=Fk,b(i,t),t ⁣(xi,k,t),0ui,k,t1.u_{i,k,t}=F_{k,b(i,t),t^-}\!\left(x_{i,k,t}\right), \qquad 0\leq u_{i,k,t}\leq1.

The reference distribution ends at tt^-, before the scored observation. This prevents future market structure from leaking into historical scores. Buckets can be hierarchical—asset class, currency, rating, maturity and seniority—with shrinkage toward a broader parent bucket when the sample is thin.

For a cost-like feature such as bid-offer, the sign is reversed before applying the transform. Extreme observations are winsorized using thresholds estimated from the same trailing window. Missing values are not silently imputed as average liquidity.

Step 2 — vendor evidence without false precision

Let qi,t(v)(0,1)q^{(v)}_{i,t}\in(0,1) be the normalized score from source vv, after combining its available feature groups. Source weights αv\alpha_v depend on coverage, historical freshness and validation against internal executions, and sum to one. The fused market score is:

qi,tmkt=exp ⁣(vαvlog(qi,t(v)+ε))exp ⁣[λVarα(qi,t(v))].q^{mkt}_{i,t} = \exp\!\left(\sum_v \alpha_v\log(q^{(v)}_{i,t}+\varepsilon)\right) \exp\!\left[-\lambda\operatorname{Var}_{\alpha} \left(q^{(v)}_{i,t}\right)\right].

The weighted geometric mean is intentionally conservative: one weak source pulls the result down more than it would under an arithmetic mean. The second term penalizes vendor disagreement. Disagreement is information—it often signals a stale composite, a sparse market or a mapping problem.

Data quality enters separately:

qi,tdata=exp(ρaAi,t)exp(ρmMi,t),q^{data}_{i,t} = \exp(-\rho_a A_{i,t}) \exp(-\rho_m M_{i,t}),

where Ai,tA_{i,t} is age since the last valid observation measured in asset-class-appropriate units and Mi,tM_{i,t} is a weighted missingness score. This prevents a stale but historically attractive quote from retaining a high liquidity classification.

Step 3 — make the position part of the score

Let Bi,tB_{i,t} be the absolute portfolio balance at market value, NAVtNAV_t the fund’s net asset value, and Ci,tC_{i,t} the estimated executable daily capacity. Two ratios capture different risks:

ci,t=Bi,tNAVt,di,t=Bi,tpCi,t.c_{i,t}=\frac{B_{i,t}}{NAV_t}, \qquad d_{i,t}=\frac{B_{i,t}}{p\,C_{i,t}}.

ci,tc_{i,t} is the position’s fund concentration. di,td_{i,t} is expected days to liquidate when the fund limits itself to participation rate pp. Capacity is estimated from vendor depth and activity, then recalibrated against the fund’s own RFQs, fills, slippage and dealer responses. For a market with no trustworthy volume, Ci,tC_{i,t} is a conservative executable-size estimate rather than a fabricated ADV.

Issuer or risk-cluster crowding matters too. Let gj,t=ijBi,t/NAVtg_{j,t}=\sum_{i\in j}B_{i,t}/NAV_t be exposure to issuer, sector, country or a dealer-dependent liquidity bucket jj. This catches the case where ten modest positions all need the same exit channel.

Step 4 — market conditions as of the scoring date

The model uses a contemporaneous regime index, not today’s market description applied retrospectively. Let zm,tz_{m,t} be trailing standardized indicators such as broad credit bid-offer, cross-sectional quote dispersion, rates volatility, credit-index volatility, funding stress and dealer-response breadth. Then:

Rt=σ ⁣(γ0+mγmzm,t),σ(x)=11+ex.R_t=\sigma\!\left(\gamma_0+\sum_m\gamma_m z_{m,t}\right), \qquad \sigma(x)=\frac{1}{1+e^{-x}}.

RtR_t lies between zero and one, with one representing severe stress. All standardization parameters are estimated using observations available at tt. The feature set can vary with entitlement, but its meaning must remain stable: it measures the probability that normal execution assumptions are failing.

The model includes an interaction between regime and baseline illiquidity. Stress should hurt a thin loan or off-the-run bond more than an already deep, actively quoted instrument.

The portfolio-aware liquidity score

The layers combine on the log-odds scale. Define logit(q)=log(q/(1q))\operatorname{logit}(q) =\log(q/(1-q)). The instrument-position score is:

Li,t=100qi,tdataσ ⁣[logit(qi,tmkt)βdlog ⁣(1+di,tdi)βclog ⁣(1+ci,tci)βglog ⁣(1+gj,tgj)γRtξRt(1qi,tmkt)].\boxed{ L_{i,t}=100\,q^{data}_{i,t}\, \sigma\!\left[ \operatorname{logit}(q^{mkt}_{i,t}) -\beta_d\log\!\left(1+\frac{d_{i,t}}{d_i^*}\right) -\beta_c\log\!\left(1+\frac{c_{i,t}}{c_i^*}\right) -\beta_g\log\!\left(1+\frac{g_{j,t}}{g_j^*}\right) -\gamma R_t -\xi R_t(1-q^{mkt}_{i,t}) \right]. }

The starred quantities are policy scales, not universal constants. For example, did_i^* can represent the maximum comfortable liquidation horizon for the instrument class. The coefficients are constrained to be non-negative so that more concentration, longer liquidation time, greater crowding or greater stress cannot mechanically improve liquidity.

This form has useful operating properties:

The score is a ranking and control variable, not a promise that an order will execute at a stated price.

From positions to the fund

A NAV-weighted arithmetic mean can hide a dangerous tail: many liquid holdings may overwhelm one position that cannot be sold. The portfolio headline is therefore a weighted harmonic mean:

Ltfund=100[iwi,t(Li,t100+ε)1]1,wi,t=Bi,tjBj,t.L^{fund}_t = 100\left[ \sum_i w_{i,t} \left(\frac{L_{i,t}}{100}+\varepsilon\right)^{-1} \right]^{-1}, \qquad w_{i,t}=\frac{B_{i,t}}{\sum_j B_{j,t}}.

For decisions, the more direct quantity is the fraction of the portfolio that can be liquidated by horizon HH:

Φt(H)=iBi,tmin(1,H/di,t)iBi,t.\Phi_t(H) = \frac{\sum_i B_{i,t}\min\left(1,H/d_{i,t}\right)} {\sum_i B_{i,t}}.

LtfundL^{fund}_t is useful for monitoring and limits; Φt(H)\Phi_t(H) answers a cash planning question. Both should be reported by asset class and under normal and stressed participation assumptions.

Worked example

Consider three hypothetical positions in a $500 million fund. The values below illustrate the mechanics; they are not historical results or vendor outputs.

PositionMarket scoreBalance / NAVDays to liquidateRegimeFinal score
Actively traded bond0.820.4%0.70.3072
Leveraged loan0.612.4%6.00.3039
Five-year CDS0.760.8%1.80.3062

If the bond balance rises from 0.4% to 4.0% of NAV while market observations are unchanged, its final score must fall: the instrument did not become less liquid, but the fund’s position did. If the regime index then rises from 0.30 to 0.85, the loan receives a larger additional penalty because its baseline market score was already weaker. That is the intended behaviour.

Implementation

The production pipeline was organized around point-in-time reproducibility:

flowchart LR
  A[Vendor files and APIs] --> B[Identity and timestamp controls]
  B --> C[Asset-class normalization]
  C --> D[Vendor fusion and data-quality penalty]
  E[Positions, NAV and internal executions] --> F[Capacity and concentration]
  G[Market-wide indicators] --> H[As-of regime index]
  D --> I[Portfolio-aware score]
  F --> I
  H --> I
  I --> J[Limits, dashboards and reason codes]

Every observation carried source, observed-at, received-at and effective-at timestamps. The daily job froze its inputs, score version, calibration version and overrides. Outputs included the score, expected liquidation horizon, normal/stress liquidatable fractions and reason codes such as STALE_QUOTE, VENDOR_DISAGREEMENT, POSITION_TOO_LARGE and STRESS_SENSITIVE.

Scores were recalculated after positions and NAV arrived, rather than copied unchanged from a market-data feed. Manual overrides required an expiry date and an owner so that a one-off trading judgement could not become permanent model state.

Calibration and validation

Internal execution data turns the framework from a plausible formula into a fund-specific model. Calibration targets can include realized half-spread, slippage, time to completion, fill ratio and dealer response rate. The preferred validation is walk-forward: coefficients and normalization windows are fit on past observations and tested on later executions.

The score should pass five classes of tests:

  1. Monotonicity: larger balances, staler quotes and greater stress never improve the score while other inputs are fixed.
  2. Ranking: lower-scored positions subsequently exhibit higher cost, lower fill rates or longer completion times.
  3. Calibration: predicted liquidation bands match realized frequencies.
  4. Stress stability: the model responds during known dislocations without requiring future information or arbitrary overrides.
  5. Mapping and lineage: each score can be reproduced from the exact contract, input snapshot and parameter version.

Performance is reported by asset class and liquidity bucket. A single pooled accuracy measure would let numerous liquid bonds disguise weak loan or CDS behaviour.

Trade-offs and model boundary

The model deliberately favors explainability over a black-box prediction of transaction cost. A monotone gradient-boosted model could estimate execution outcomes more flexibly, but a controlled score is easier to challenge, version and use in portfolio limits. The two can coexist: machine learning can estimate capacity or supply a challenger model without owning the final governance rule.

Vendor scores are correlated because they observe the same market, so source weights do not create independent evidence. Internal executions are also selection-biased: the fund trades what it believes it can trade. Limit orders, abandoned RFQs and quote requests should therefore be retained, not only fills.

CDS liquidity is not equivalent to the liquidity of the cash bond it may hedge. Loan settlement time is not the same as price impact. Short-side liquidity, borrow, consent, counterparty capacity and portfolio liquidation feedback may need separate penalties. The framework makes those additions explicit rather than hiding them in an unexplained vendor number.

References

Related work