Capital Lockup Cost in Basis Points: Pricing the Time Value of Frozen Capital
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:
- Risk premium — the expected loss given a dispute, scaled by
p_dispute - Capital lockup cost — the carrying cost computed above
- 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_annualper strategy - [ ] Choose a single delay quantile (p90 is the sane default)
- [ ] Compare
capital_lockup_cost_bpsagainst your spread target - [ ] Respect
do_not_quoteand route those markets to do-not-trade - [ ] Re-pull pricing on every
score.tier_changedevent - [ ] Persist
score.versionalongside 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.