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

Pro-Rata Matching

Install and import#

bash
npm install fintech-algorithms
ts
import { proRataMatching } from "fintech-algorithms/matching-engines-and-venue-logic/continuous-matching/pro-rata-matching";

Signature#

proRataMatching(incomingRaw, priceRaw, lotRaw, restingRaw)

Allocates a fill across all resting orders at a price in proportion to size, ignoring arrival time. Common in some futures markets, and it removes the incentive to queue that price-time creates — participants instead inflate size.

Parameters#

NameTypeNotes
incomingRawOrderThe aggressing order.
priceRawnumberPrice level at which allocation occurs.
lotRawnumberLot size; allocations round to it, and the rounding remainder must be redistributed rather than lost.
min: 1 · integer: true
restingRawOrder[]Resting orders at that price.

Returns#

{ allocations, residual, remainder_handling, … }

Per-order allocation with how the rounding remainder was distributed.

Errors#

  • When lot size is not a positive integer — throws

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

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#

incomingRaw
600
priceRaw
100
lotRaw
10
restingRaw
[
  {
    "order_id": "R-1",
    "side": "sell",
    "price": 100,
    "remaining_quantity": 500,
    "arrival_sequence": 10
  },
  {
    "order_id": "R-2",
    "side": "sell",
    "price": 100,
    "remaining_quantity": 300,
    "arrival_sequence": 20
  },
  {
    "order_id": "R-3",
    "side": "sell",
    "price": 100,
    "remaining_quantity": 200,
    "arrival_sequence": 30
  }
]

Call#

proRataMatching(incomingRaw, priceRaw, lotRaw, restingRaw)

Returns#

object with 9 fields: model, price, lot_size, incoming_quantity, executable_quantity, allocated_quantity, unfilled_quantity, allocations, …

{
  "model": "single-price-lot-aware-pro-rata",
  "price": 100,
  "lot_size": 10,
  "incoming_quantity": 600,
  "executable_quantity": 600,
  "allocated_quantity": 600,
  "unfilled_quantity": 0,
  "allocations": [
    {
      "order_id": "R-1",
      "resting_quantity": 500,
      "allocated_quantity": 300,
      "remaining_quantity": 200,
      "arrival_sequence": 10
    },
    {
      "order_id": "R-2",
      "resting_quantity": 300,
      "allocated_quantity": 180,
      "remaining_quantity": 120,
      "arrival_sequence": 20
    },
    {
      "order_id": "R-3",
      "resting_quantity": 200,
      "allocated_quantity": 120,
      "remaining_quantity": 80,
      "arrival_sequence": 30
    }
  ],
  "state": "fully-allocated"
}

Other exports#

This module also exports priceTimePriority, sizeTimePriority, hybridProRataTime, 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#

Pro-Rata Matching — system map

Calculation flow#

Pro-Rata Matching calculation flow
flowchart LR
    S1["Validate oneprice and wholelot inputs"]
    S2["Compute executable quantity"]
    S3["Calculate each raw proportional share"]
    S4["Floor shares to lots"]
    S5["Award residual lots by fractional remainder size then "]
    S1 --> S2
    S2 --> S3
    S3 --> S4
    S4 --> S5
    S5 --> D{"wholelot rounding and capacity caps"}
    D --> O["allocated_quantity + diagnostics"]
    O --> A["Audit: Allocation is proportional before lot rounding"]

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 Continuous Matching family#