Source code for finance_calcs.microstructure

"""Market microstructure metrics as polars expressions."""

from __future__ import annotations

import polars as pl

__all__ = [
    "amihud_illiquidity",
    "effective_spread_bps",
    "kyle_lambda",
    "order_imbalance",
    "quoted_spread_bps",
    "realized_spread_bps",
]


[docs] def quoted_spread_bps(bid: pl.Expr, ask: pl.Expr, *, mid: pl.Expr | None = None) -> pl.Expr: reference = mid if mid is not None else (bid + ask) / 2.0 return (ask - bid) / reference * 10_000.0
[docs] def effective_spread_bps(execution_price: pl.Expr, mid_price: pl.Expr, *, side: pl.Expr | None = None) -> pl.Expr: if side is None: return 2.0 * (execution_price - mid_price).abs() / mid_price * 10_000.0 return 2.0 * side * (execution_price - mid_price) / mid_price * 10_000.0
[docs] def realized_spread_bps(execution_price: pl.Expr, future_mid_price: pl.Expr, *, side: pl.Expr | None = None) -> pl.Expr: if side is None: return 2.0 * (execution_price - future_mid_price).abs() / future_mid_price * 10_000.0 return 2.0 * side * (execution_price - future_mid_price) / future_mid_price * 10_000.0
[docs] def order_imbalance(buy_volume: pl.Expr, sell_volume: pl.Expr) -> pl.Expr: total = buy_volume + sell_volume return (buy_volume - sell_volume) / total
[docs] def amihud_illiquidity(returns: pl.Expr, traded_notional: pl.Expr) -> pl.Expr: return returns.abs() / traded_notional
[docs] def kyle_lambda(returns: pl.Expr, signed_volume: pl.Expr) -> pl.Expr: return returns / signed_volume