← Back to blog
·5 min read·SettleRisk Team

Capital Lockup Cost in Basis Points: Pricing the Time Value of Frozen Capital

Deep Dive

Executive Summary

Capital lockup cost is the carrying cost imposed by settlement delay, expressed in basis points of position notional. SettleRisk's pricing engine outputs this number directly via the /v1/pricing endpoint. Most desks under-price it because they either (a) use the median delay instead of an upper quantile, or (b) use a flat cost-of-funds that ignores the opportunity cost of redeployment.

This post derives the formula, walks through a calibrated Polymarket example, and explains how to plug the output into a quoting engine without double-counting the cost in the spread.

Core Concept

Capital lockup cost is conceptually similar to the carry on a fixed-income position with an uncertain maturity. The math:

lockup_bps = exp_delay_hours * (cost_of_funds_annual / hours_per_year) * 1e4

Where exp_delay_hours is the expected delay at your chosen quantile (typically p90), and cost_of_funds_annual is the marginal cost or opportunity cost of capital deployed to this market.

The non-obvious part is choosing the right cost-of-funds:

| Capital source | Effective cost | |----------------|---------------| | Idle treasury | Risk-free rate (~5%) | | Marginal MM book capital | Hurdle rate (~12-15%) | | Levered prime brokerage | Funding rate plus spread (~6-8%) | | Crypto-collateralized | Lending APR (~10-20%) |

If you're a quant fund running a prediction-market MM strategy at a 15% hurdle, your lockup cost on a 168-hour expected delay is:

168 * (0.15 / 8760) * 1e4 = 28.77 bps

That is 28.77 bps of position notional eaten by capital that cannot redeploy elsewhere for the duration of the lockup. It is not theoretical — it directly shows up in time-weighted PnL.

Worked Example

Polymarket market on "Will Fed cut rates in June 2026?" — quote at 38/42 cents.

from settlerisk import SettleRiskClient

client = SettleRiskClient(api_key="sk-...")
price = client.price(
    market_id="polymarket:0xfedjune",
    mid_price=0.40,
    cost_of_funds_annual=0.15,
    delay_quantile="p90",
)

print(f"Adjusted fair price:    {price.adjusted_fair_price:.4f}")
print(f"Risk premium:           {price.risk_premium_bps:.2f} bps")
print(f"Capital lockup cost:    {price.capital_lockup_cost_bps:.2f} bps")
print(f"Fair spread:            {price.fair_spread_bps:.2f} bps")
print(f"Do not quote:           {price.do_not_quote}")

Output:

Adjusted fair price:    0.3914
Risk premium:           86.00 bps
Capital lockup cost:    28.77 bps
Fair spread:            245.00 bps
Do not quote:           False

The pricing engine combines three components:

  1. Risk premium — the expected loss given a dispute, scaled by p_dispute
  2. Capital lockup cost — the carrying cost computed above
  3. Fair spread — the total bid/ask width that compensates the market maker for both

Note that fair_spread_bps = 2 * (risk_premium + capital_lockup_cost) + base_mm_margin. The two times factor is because the MM is taking both sides of the spread.

TypeScript:

import { SettleRiskClient } from "settlerisk";

const client = new SettleRiskClient({ apiKey: "sk-..." });
const price = await client.price({
  marketId: "polymarket:0xfedjune",
  midPrice: 0.40,
  costOfFundsAnnual: 0.15,
  delayQuantile: "p90",
});

console.log(`Adjusted fair price:    ${price.adjustedFairPrice.toFixed(4)}`);
console.log(`Risk premium:           ${price.riskPremiumBps.toFixed(2)} bps`);
console.log(`Capital lockup cost:    ${price.capitalLockupCostBps.toFixed(2)} bps`);
console.log(`Fair spread:            ${price.fairSpreadBps.toFixed(2)} bps`);

Implementation Notes

Choose your quantile and stick with it. A common mistake is mixing p50 for capital lockup with p90 for risk premium. Pick one cohort assumption for the whole pricing run.

Recompute on every quote. Capital lockup cost changes when (a) the score refreshes, (b) the delay block refreshes, or (c) your cost-of-funds changes intraday. None of these should be hard-cached for more than a few minutes.

Separate from spread compression. Some venues offer fee rebates that effectively compress fair spread. Apply those rebates after the lockup cost is computed, not before. Otherwise you mix two unrelated economic effects.

Audit the version stamps. Persisting score.version.heuristics_version alongside the priced output lets you reconstruct historical pricing for compliance and TCA.

Failure Modes

1. Using risk-free rate instead of hurdle rate. MMs whose capital has an internal hurdle of 12-15% but who price using 5% systematically under-charge spread on delayed markets.

2. Double-counting via spread widening. If your engine already widens spreads on high-risk markets and then adds capital_lockup_cost_bps on top, you are double-charging clients. The pricing engine's fair_spread_bps already includes the lockup; do not stack.

3. Ignoring redeployment opportunity cost. Capital locked in a 168-hour dispute is capital that cannot quote a different opportunity. The hurdle-rate approach captures that — risk-free does not.

4. Forgetting the platform asymmetry. Polymarket's bond-and-challenge mechanics impose an asymmetric upside on disputed positions (winner takes part of the loser's bond). Kalshi has no equivalent. Model the recovery separately if you trade both venues.

5. Skipping the do_not_quote flag. When the pricing engine returns do_not_quote=true, that is because the lockup or risk premium has exceeded venue economics. Auto-disable quoting on those markets.

Checklist

  • [ ] Persist your assumed cost_of_funds_annual per strategy
  • [ ] Choose a single delay quantile (p90 is the sane default)
  • [ ] Compare capital_lockup_cost_bps against your spread target
  • [ ] Respect do_not_quote and route those markets to do-not-trade
  • [ ] Re-pull pricing on every score.tier_changed event
  • [ ] Persist score.version alongside the quoted price

Sources + Further Reading

  • SettleRisk pricing engine — full formula and edge cases
  • Methodology page — derivation of risk premium and spread
  • Market Liquidity and Trading Activity (Chordia, Roll, Subrahmanyam 2001) — funding cost asymmetry framework
  • UMA Documentation — bond-and-challenge recovery economics
  • Kalshi Trader Terms — settlement window guarantees

Start free at /signup — pull a full pricing block on any market in under 200ms.

Get weekly risk analysis in your inbox

Market risk scores, emerging dispute patterns, and settlement delay trends — delivered every Monday.