BL-IS-005: Realised Cost Model

BIJECTIVE LABS


BIJECTIVE LABS . SEP 7, 2026


BL-IS-005: Realised Cost Model

Status: RELEASED

Classification: PUBLIC

Revision: 1

Date: 2026-09-07


1. What it computes

The round-trip cost of a position, from the operator's declared envelope rather than from a nominal fee.

c_rt  =  2 * fee  +  spread_cost  +  slippage  +  funding_accrual

Four terms. For most of the first programme the measurement path contained none of them, which is documented in BL-IN-002 and is the single largest error in the archive.


2. Envelope parameters are arguments

This is the design property that makes every cost-bound verdict in the record reusable.

cost_model(fee_schedule, channel, slippage_assumption, funding_series)

No fee is a constant inside a function. A reader substitutes their own schedule and re-runs any cost-bound verdict without editing logic. R-27 requires it, and BL-EC-001 section 7 is only usable because of it.

A fee buried as a literal makes a verdict unfalsifiable by anyone else, which for a published record is close to making it worthless.


3. The terms, one at a time

Fee. From the schedule for the declared tier and channel. Both legs, and for a hedged pair both legs at their actual sizes:

pair round trip  =  fee_per_leg * ( 1 + beta )  +  spread_per_leg

The ( 1 + beta ) factor is routinely omitted. At a hedge ratio of 1.4 the pair transacts 2.4 legs, not 2, and the omission understates cost most on exactly the pairs a selector prefers.

Spread cost. Half-spread at the decision timestamp, read from the recorded book rather than assumed. On the liquid set this ran around 3.0 basis points and the census in E-0051 gives the full distribution: median 5.26, 25th percentile 2.40, 90th percentile 18.54.

Slippage. Walk-the-book against recorded depth at the intended size, not a flat assumption. BL-IS-009 is the primitive.

Funding accrual. Realised funding over the holding period, signed by direction, and zero unless the position spans a settlement.

funding_bps  =  direction * sum over settlements in [t, t+h] of rate_k * 1e4

The sign is the part that gets missed. A short position through a positive-funding settlement receives and a long pays, so omitting the term biases some strategies favourably and others unfavourably with no consistent direction. Omitting it is not conservative.

One strategy in the archive ran its entire evaluation with this term stubbed at zero. The defect was found during a falsification review and the strategy was rebuilt on a single data path so that shadow and live could not diverge again.


4. Quoted against measured

The model computes a floor. Measured end to end, the floor is optimistic.

ChannelQuotedMeasured
Bybit taker to taker11.0 bps15.02 bps
Hybrid, 60-second passive budget8.85 to 12.17 bps

The gap is the difference between the price a model assumed and the price that was available. A layer-zero check run against the quoted schedule is optimistic by roughly a third, and that correction should be applied by anyone reusing these figures.


5. The wait-budget finding

The model exposes a result that contradicts the first lever most operators reach for.

Passive wait budgetDrift on unfilled names
60 seconds+11.7 bps
1 hour+102.2 bps

Orders that fail to fill are not a random subset. They are the names moving away, which is why they did not fill, and their drift compounds while the order rests. Total execution cost therefore rises with the wait budget rather than falling.

Any cost model that treats an unfilled order as costless will get this backwards.


6. Interface

realised_cost(entry_ts, exit_ts, direction, size, instrument, envelope) -> CostBreakdown
 
Returns each term separately, never only the total.
 
Raises when:
  any term is zero and zero is not the verified value for that term
  the funding series does not cover the holding period
  depth at the intended size is unavailable for the slippage term

The first check is R-17 expressed as a runtime guard. A funding term of zero is legitimate for a position that does not span a settlement and is a defect for one that does, and the model refuses to guess which case it is in.

Returning each term separately is not a convenience. It is what allowed the programme to see, on re-examination, that a strategy's reported return contained fourteen basis points of costs that had never been subtracted.


7. The instrument that failed

An earlier execution cost instrument double-counted adverse selection. It subtracted the markout and also subtracted a spread term that already contained it.

The instrument found the error itself and marked its own output superseded. Both artifacts remain published, E-0013 as the original and E-0014 as the replacement, because the pair is the evidence that the retraction happened.

R-26 requires this. An instrument found to be wrong retracts its output and is retained alongside its replacement rather than quietly deleted.


8. Status of this instrument, stated precisely

The reference implementation published under 05_INSTRUMENTS/src/ assembles the identity into one function. The research programme never had that function.

What existed during the programme was the terms, computed separately and at the point of use. A spread primitive. A markout primitive. A slippage adjustment living inside the stop simulator. Fee arithmetic written inline wherever a verdict needed it. Each piece was correct. Nothing owned the sum.

That is worth recording rather than glossing, for two reasons.

It is an honesty point. A reader should not infer from this document that a single audited cost model ran across the programme, because it did not, and the published implementation is new work written for this record.

It is also, in hindsight, part of the explanation for BL-IN-002. When four cost terms live in four places and no function owns their sum, an absent term is invisible: every individual piece looks right, and there is no single place where you would notice that one of them is never called. A realised return computed mid to mid survived review for weeks partly because there was nothing to compare it against.

The remedy generalises past this codebase. Give the cost identity one owner. Make every term an explicit argument to it, so that omitting one is a missing argument rather than a silent zero, and return the terms separately so that a reader can see which of them is doing the work.


9. What it does not model

Market impact. No strategy in this record ran at a size where its own transacting moved the book, so the operator's own footprint is absent from every figure here. An operator running at size should treat every cost number in this record as a floor that omits them.

Fill probability. The model prices a fill that happened. Whether it would have happened is BL-IS-008.

Financing beyond funding. Perpetual funding is the only carry term on this substrate. A reader on a venue with separate borrow costs needs an additional term.


10. Cross-references

BL-D-011 section 4 for the identity. BL-IN-002 for the incident. BL-EC-001 for the measured structure. BL-D-009 rules R-01, R-17 and R-27. Evidence E-0013, E-0014, E-0051.


Copyright (c) 2026 Bijective Labs. All rights reserved.