fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Bharath-Shumway Naive Distance-to-Default

Install and import#

bash
npm install fintech-algorithms
ts
import { bharathShumwayNaiveDistanceToDefault } from "fintech-algorithms/credit-risk-and-default/probability-of-default/bharath-shumway-naive-distance-to-default";

Signature#

bharathShumwayNaiveDistanceToDefault(equity_value, debt_face_value, equity_volatility, prior_year_equity_return, horizon_years)

Computes the Bharath and Shumway naive distance to default, which approximates the Merton solve with closed-form substitutes for firm value and asset volatility instead of iterating.

Parameters#

NameTypeNotes
equity_valuenumberMarket value of equity, in the same currency unit as the debt.
exclusive_min: 0
debt_face_valuenumberFace value of debt, used both as the default barrier and as the debt weight in the naive asset volatility.
exclusive_min: 0
equity_volatilitynumberAnnualised equity volatility as a decimal. Debt volatility is taken as 0.05 plus a quarter of it.
exclusive_min: 0
prior_year_equity_returnnumberThe past year's equity return, used directly as the asset drift in the naive approximation.
horizon_yearsnumberTime to the barrier, in years.
exclusive_min: 0

Returns#

{ naive_firm_value: number; naive_debt_volatility: number; naive_asset_volatility: number; naive_distance_to_default: number; naive_default_probability: number; state: string; reason: string }

naive_firm_value is equity plus debt, naive_debt_volatility is the 0.05-plus-quarter-of-equity-volatility proxy, and naive_asset_volatility is the value-weighted blend of the two. naive_distance_to_default follows the Merton expression with those substitutes, and naive_default_probability is the normal tail beyond it. state is calculated.

Errors#

  • When any argument is not a finite number — throws Error
  • When equity_value, debt_face_value, equity_volatility, or horizon_years is not positive — throws Error

Complexity: time O(1), space O(1).

Worked example#

verified This is the worked example published in the article, replayed by the test suite on every run. The output cannot drift.

Input#

equity_value
120
debt_face_value
80
equity_volatility
0.35
prior_year_equity_return
0.08
horizon_years
1

Call#

bharathShumwayNaiveDistanceToDefault(equity_value, debt_face_value, equity_volatility, prior_year_equity_return, horizon_years)

Returns#

object with 7 fields: naive_firm_value, naive_debt_volatility, naive_asset_volatility, naive_distance_to_default, naive_default_probability, state, reason

{
  "naive_firm_value": 200,
  "naive_debt_volatility": 0.1375,
  "naive_asset_volatility": 0.265,
  "naive_distance_to_default": 3.62708766745,
  "naive_default_probability": 0.000143317997,
  "state": "calculated",
  "reason": "bharath-shumway-naive-approximation"
}

Other exports#

This module also exports logisticPdModel, probitPdModel, throughTheCyclePd, pointInTimePd, mertonDistanceToDefault, campbellHilscherSzilagyiDistressProbability, calculate. Every module additionally exports run as an alias of its primary function, and a meta object carrying its catalog id, domain, family, shape and article URL.

Diagrams#

Bharath-Shumway Naive Distance-to-Default — article hero
Bharath-Shumway Naive Distance-to-Default — evidence clock
Bharath-Shumway Naive Distance-to-Default — formula anatomy
Bharath-Shumway Naive Distance-to-Default — method comparison
Bharath-Shumway Naive Distance-to-Default — system map
Bharath-Shumway Naive Distance-to-Default — validation layers

Calculation flow#

Bharath-Shumway Naive Distance-to-Default calculation flow
flowchart LR
    S1["Validate equity debt volatility priorreturn window hor"]
    S2["Set nave firm value to equity plus debt"]
    S3["Calculate nave debt and asset volatility"]
    S4["Insert prioryear equity return as the papers drift pro"]
    S5["Calculate nave DD and PhiDD returning every component"]
    S1 --> S2
    S2 --> S3
    S3 --> S4
    S4 --> S5
    S5 --> D{"positive E F sigmaE and T with a causal priorreturn window"}
    D --> O["naive_distance_to_default + diagnostics"]
    O --> A["Audit: naivefirmvalue equals equityvalue plus debtfacevalue"]

How it works#

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References#

The rest of the Probability of Default family#