scientia

the crucible

the simulation that
takes your money first.

A backtest that fills you at the mid, instantly, in full, is not a simulation of trading — it is a simulation of being the only participant. The Crucible charges you a queue, a delay, a spread and an impact before it will credit you with a single basis point. Everything below is live: drag it and watch what happens to an edge you thought you had.

inputs

18bps

what the signal is worth before friction

40ms

decision to acknowledgement, round trip

0.1% ADV

your order as a share of the day's volume

4bps

quoted, and you cross it

4.5bps

the venue's actual tier

62% ann

drives both impact and adverse selection

1,400trades/yr

how many times you pay all of the above

presets

net edge per trade

+4.9bps

tradeable

73% of the gross edge is consumed before the position is even open.

where it goes

half spread
2.0 bps
venue fee
4.5 bps
market impact
5.6 bps
latency
1.0 bps

fill rate

86.6%

of resting size, at the touch

annual, net

+68.1%

1,400 trades a year

capacity

$3,864,673

where impact eats the edge

the year that results

+34.2%

how the fills are decided

three numbers, none of them optional.

Queue position. A resting order is behind everything already at its price. The Crucible tracks how much size sits ahead of you and how much of it trades before the price moves away, which is why the fill rate falls as the spread widens rather than staying pinned at 100%.

Impact, square-root. Cost scales with the square root of participation, not linearly. Doubling your size does not double the damage — but it does mean the edge and the impact curve cross at a specific notional, and past that point more capital makes you less money. That crossing is the capacity number.

Latency as adverse selection. Over a delay of t you are, on average, filled into the move you were trying to catch. The cost grows with √t, which is why 40 ms is survivable and 300 ms usually is not, and why the same strategy can be profitable on one desk and worthless on another.

engine

enginecrucible 0.9.4 · rust
event modeldiscrete, order-driven
clockinjected; agents have none
bar storepoint-in-time, as_of per row
fillsqueue position + partial
impactsquare-root, participation-scaled
latencyconfigurable, default 40 ms
costsfee tier · funding · borrow
determinismseed → byte-identical run