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

Depth-at-Distance Profile

Install and import#

bash
npm install fintech-algorithms
ts
import { depthAtDistanceProfile } from "fintech-algorithms/market-microstructure/market-depth-analytics/depth-at-distance-profile";

Signature#

depthAtDistanceProfile(bidsRaw, asksRaw, tickRaw, maxRaw)

Depth bucketed by distance from the touch, in ticks. Shows where liquidity actually sits rather than reducing the book to a single number.

Parameters#

NameTypeNotes
bidsRawLevel[]Bid levels.
asksRawLevel[]Ask levels.
tickRawnumberTick size.
min: 0
maxRawnumberMaximum distance in ticks to profile.
min: 0

Returns#

{ profile, max_distance, tick, … }

Depth per distance bucket on both sides.

Errors#

  • When tick size is not positive — throws

Complexity: time O(levels), space O(buckets).

Worked example#

executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

Input#

bidsRaw
[
  {
    "price": 99.99,
    "quantity": 500
  },
  {
    "price": 99.98,
    "quantity": 800
  },
  {
    "price": 99.97,
    "quantity": 1200
  }
]

Showing 3 of 5 elements.

asksRaw
[
  {
    "price": 100.01,
    "quantity": 300
  },
  {
    "price": 100.02,
    "quantity": 600
  },
  {
    "price": 100.03,
    "quantity": 1000
  }
]

Showing 3 of 5 elements.

tickRaw
0.01
maxRaw
4

Call#

depthAtDistanceProfile(bidsRaw, asksRaw, tickRaw, maxRaw)

Returns#

object with 8 fields: model, tick_size, max_distance_ticks, bid_profile, ask_profile, included_bid_depth, included_ask_depth, state

{
  "model": "same-side-best-tick-distance-profile",
  "tick_size": 0.01,
  "max_distance_ticks": 4,
  "bid_profile": [
    {
      "distance_ticks": 0,
      "quantity": 500,
      "cumulative_quantity": 500,
      "depth_share": 0.1388888888888889
    },
    {
      "distance_ticks": 1,
      "quantity": 800,
      "cumulative_quantity": 1300,
      "depth_share": 0.2222222222222222
    },
    {
      "distance_ticks": 2,
      "quantity": 1200,
      "cumulative_quantity": 2500,
      "depth_share": 0.3333333333333333
    }
  ],
  "ask_profile": [
    {
      "distance_ticks": 0,
      "quantity": 300,
      "cumulative_quantity": 300,
      "depth_share": 0.09090909090909091
    },
    {
      "distance_ticks": 1,
      "quantity": 600,
      "cumulative_quantity": 900,
      "depth_share": 0.18181818181818182
    },
    {
      "distance_ticks": 2,
      "quantity": 1000,
      "cumulative_quantity": 1900,
      "depth_share": 0.30303030303030304
    }
  ],
  "included_bid_depth": 3600,
  "included_ask_depth": 3300,
  "state": "bid-profile-heavier"
}

Other exports#

This module also exports cumulativeDepth, topNDepthImbalance, expectedFillPrice, sweepCostAndSlippage, liquidityWallConcentration, depthDepletionReplenishment, marketDepthHeatmap, 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#

Depth-at-Distance Profile — system map

Calculation flow#

Depth-at-Distance Profile calculation flow
flowchart LR
    S1["Validate tick alignment"]
    S2["Anchor each side at its own best quote"]
    S3["Map every level to an integer distance"]
    S4["Emit zero for unpopulated distances"]
    S5["Calculate quantity shares and cumulative depth"]
    S1 --> S2
    S2 --> S3
    S3 --> S4
    S4 --> S5
    S5 --> D{"tick alignment and inclusive maximum distance"}
    D --> O["included_bid_depth + diagnostics"]
    O --> A["Audit: Distance zero is populated on each nonempty side"]

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 Market-Depth Analytics family#