Coding
Quant Python

Cost of Crossing the Spread

Difficulty

Read the problem, hints and solution here. The editor needs a bigger screen: open this page on a laptop to write and run your code.

Every fill has a cost measured against where the market was when it happened. Crossing the spread to get filled costs you half the spread; getting filled passively earns you half the spread. Transaction-cost analysis is mostly this one calculation, applied consistently, with the sign right.

Implement crossing_cost(fills).

Each fill is a tuple (symbol, side, qty, price, mid2):

  • side is 'B' or 'S';
  • qty and price are positive integers, price in ticks;
  • mid2 is twice the mid price, as an integer.

The mid sits half way between bid and ask, so on a one-tick spread it lands on a half tick. Passing it doubled keeps it exact and avoids floats entirely, so work in half-ticks throughout.

For each fill the cost in half-ticks is

  • 2 * price - mid2 for a buy, since paying above the mid costs money;
  • mid2 - 2 * price for a sell, since selling below the mid costs money.

A fill on the favourable side of the mid produces a negative cost. That is not an error: it is price improvement, and a market maker's fills should mostly look like this.

Return a list of (symbol, total_cost_in_half_ticks) for every symbol that appears, sorted by symbol ascending.

Examples

crossing_cost([("ES", "B", 10, 5000, 9998), ("ES", "S", 10, 5000, 10002)])
# [('ES', 40)]

crossing_cost([("A", "B", 2, 10, 21), ("B", "S", 3, 10, 19)])
# [('A', -2), ('B', -3)]

In the first, both fills cross by one half-tick on ten lots, so each costs 20 half-ticks. In the second, both fills are on the good side of a half-tick mid, so both show as price improvement.

Constraints

  • 0 <= len(fills) <= 2 * 10^5.
  • Everything is an integer and the answer is exact. Do not divide by two anywhere: report the total in half-ticks as specified.
  • A fill exactly at the mid costs zero.
Rate this problem
Language: Pythoncrossing_cost
Sample tests

Run your code to check it against the sample tests. Results appear here.

Rate this problem