Pricing Engine

Powering accurate and timely pricing of financial instruments within the protocol

Futures on Carbon are cash settled rather than settled by physical delivery. This means that at the settlement, the buyer of a futures contract will not buy the actual underlying, nor the seller will sell the underlying. There will only be a transfer of losses/gains at the settlement of the contract, based on the settlement price.

Mark Price

The mark price is the price at which the futures contract will be valued at when it is being traded. This can (temporarily) vary from the actual futures market price in order to protect market participants against manipulative trading. This will also vary from the underlying spot price due to time premiums (contango or backwardation) being applied on the derivative.

Fair Price Marking

The mark price of a market is determined by finding a fair price based on the current market's order book and ensuring that it does not deviate too quickly or too much from the index price.

More specifically, the following formula is used to determine each market's mark price:

MPRaw = IndexPrice + EMA30s(FairPrice - IndexPrice)
MarkPrice = clamp(IndexPrice * (100 - MPBand / 2)%, MPRaw, IndexPrice * (100 + MPBand / 2)%)
> MPBand is a market parameter (see GET markets: mark_price_band) denoted in integer basis points,
> EMA30s means 30-second exponential moving average,
> clamp(min, x, max) means min if x < min, or max if x > max, else x.

Fair price can be determined by the following formula:

1. If either the buy or sell order book has no orders:
FairPrice = IndexPrice

2. Otherwise:
ImpactBid = max[averagePrice(sell orders up to ImpactSize lots), BestBidPrice - 0.1%]
ImpactAsk = min[averagePrice(buy orders up to ImpactSize lots), BestAskPrice + 0.1%]
> ImpactSize is a market parameter (see GET Markets: impact_size) denominated in base tokens (same as lot size)
FairPrice = (ImpactBid + ImpactAsk) / 2

Last Price Protected

In the case that the oracle network is down or the index price cannot be updated for any other reason, the mark price formulation falls back to use the last traded price of the market.

Users can detect this change by monitoring the marking_strategy from the GET Prices endpoint. In normal fair price marking, the value will be fair. When falling back to last price marking, the value will be last.

MPRaw = clamp(LastPrice * (100 - LPPBand / 2)%, LastPrice, LastPrice * (100 + LPPBand / 2)%)
MarkPrice = clamp(EMA30(MarkPrice) * 97.5%, MPRaw, EMA30(MarkPrice) * 102.5%)
> LPPBand is a market parameter (see GET markets: last_price_protected_band) denoted in integer basis points

Settlement Price

The last 30 minutes time-weighted average of the Index Price before each futures contract expiry time is used as the price for market settlement. At contract expiration, all open positions will be closed and the PnL (based on the the difference between the position's average opening price and this settlement price) will be automatically realized.

Last updated