midprice-v1 methodology. Each example uses realistic numbers and can be replicated with a spreadsheet and public market data from Polymarket.
Every number below is computed using 8-decimal-place precision with round-half-up, matching the production system exactly. If you follow along in a spreadsheet, your results should match within rounding tolerance.
Example 1: Equal-Weighted Index with 5 Active Markets
A macro-themed series tracking 5 economic prediction markets, all actively trading with two-sided order books. Series Composition:| # | Market | Best Bid | Best Ask | Midprice | Raw Weight |
|---|---|---|---|---|---|
| 1 | Fed cuts by June | 0.82 | 0.83 | 0.8250 | 0.20 |
| 2 | CPI below 3% by Q2 | 0.71 | 0.72 | 0.7150 | 0.20 |
| 3 | Unemployment above 4.5% | 0.35 | 0.37 | 0.3600 | 0.20 |
| 4 | 10Y yield below 4% | 0.44 | 0.46 | 0.4500 | 0.20 |
| 5 | GDP growth above 2% | 0.58 | 0.59 | 0.5850 | 0.20 |
Compute midprices
For each market, average the best bid and best ask:Each midprice represents the market’s implied probability for that event occurring.
Normalize weights
Example 2: Index with Resolved Markets
A 4-market series where two markets have already settled — one won, one lost. Series Composition:| # | Market | Status | Tracked Outcome | Price Source | Price Used | Raw Weight |
|---|---|---|---|---|---|---|
| 1 | Fed cuts in January | Resolved | YES (Won) | Settlement | 1.00 | 0.25 |
| 2 | CPI below 2% in Q1 | Resolved | YES (Lost) | Settlement | 0.00 | 0.25 |
| 3 | Recession by mid-year | Active | YES | Midprice | 0.18 | 0.25 |
| 4 | Core PCE below 2.5% | Active | YES | Midprice | 0.62 | 0.25 |
Apply resolution prices
- Market 1: The tracked outcome (YES) won — settlement price = $1.00
- Market 2: The tracked outcome (YES) lost — settlement price = $0.00
- Markets 3 and 4 remain active and use live midprices from the order book
Interpret the result
The Raw NAV of 0.45 reflects the mix of settled outcomes and remaining active markets:
- The winning market (#1) contributes its full weight (0.25) to the NAV
- The losing market (#2) contributes nothing (0.00)
- The two active markets contribute based on their current implied probabilities
Resolved markets remain in the index with their settlement prices. They are not removed. This means a losing market at $0.00 permanently drags the index down by its weighted share, while a winning market at $1.00 permanently supports it. This is by design — the index tracks the full history of outcomes.
Example 3: Staleness — Missing Price Data
What happens when the system cannot fetch a current price for one of the underlying markets. Scenario: A 4-market series where Market #3’s price fetch fails after three retries.| # | Market | Current Price | Previous Price | Status |
|---|---|---|---|---|
| 1 | Market A | 0.72 (live) | 0.70 | Fresh |
| 2 | Market B | 0.55 (live) | 0.53 | Fresh |
| 3 | Market C | fetch failed | 0.41 | Stale (using fallback) |
| 4 | Market D | 0.88 (live) | 0.87 | Fresh |
Apply fallback for Market #3
The system attempted to fetch Market C’s order book three times with exponential backoff. All attempts failed (e.g., API timeout or network error).Fallback rule: Use the last successfully fetched price. Market C’s previous midprice was 0.41, so that value is used.
Flag the computation as stale
Because Market C used a fallback price, the entire computation is marked as stale. This flag is visible to investors.If Market C’s actual price had moved (say, from 0.41 to 0.48), the true NAV would be:The difference (0.6575 vs 0.6400) is 0.0175, or about 2.7% — entirely attributable to the stale data.
| Condition | Result |
|---|---|
| API timeout or network failure | Stale — uses last known price |
| One-sided order book (only bids, no asks) | Stale — midprice cannot be computed |
| Market data unavailable for all markets | Computation fails entirely |
| Market is resolved | Never stale — settlement prices are definitive |
Example 4: Tracking Index Level Over Time
How the Index Level tracks performance from inception to present, and how it relates to Raw NAV. Scenario: A series launches with an inception Raw NAV of 0.4200. Over six weeks, market prices shift:| Date | Raw NAV | Index Level Calculation | Index Level | Change |
|---|---|---|---|---|
| Week 0 (inception) | 0.42000000 | 100 x (0.4200 / 0.4200) | 100.00 | — |
| Week 1 | 0.43500000 | 100 x (0.4350 / 0.4200) | 103.57 | +3.57% |
| Week 2 | 0.39800000 | 100 x (0.3980 / 0.4200) | 94.76 | -5.24% |
| Week 3 | 0.41000000 | 100 x (0.4100 / 0.4200) | 97.62 | -2.38% |
| Week 4 | 0.45000000 | 100 x (0.4500 / 0.4200) | 107.14 | +7.14% |
| Week 5 | 0.44200000 | 100 x (0.4420 / 0.4200) | 105.24 | +5.24% |
| Week 6 | 0.47600000 | 100 x (0.4760 / 0.4200) | 113.33 | +13.33% |
Index Level after a gain (Week 1)
Raw NAV increased from 0.4200 to 0.4350 (underlying probabilities rose):The index is up 3.57% from inception.
Index Level after a decline (Week 2)
Raw NAV dropped to 0.3980 (some underlying probabilities fell):The index is down 5.24% from inception. Note: the drawdown from Week 1 to Week 2 is even larger — from 103.57 to 94.76, a decline of 8.5% week-over-week.
| Property | Explanation |
|---|---|
| Always starts at 100 | The base value is set at inception |
| Proportional to Raw NAV | A 10% increase in Raw NAV = a 10% increase in Index Level |
| Inception NAV is fixed | The denominator never changes — it is locked at the first computation |
| Cannot go below 0 | Because Raw NAV is bounded between 0 and 1, and inception is positive |
| Cannot exceed ~238 | Because Raw NAV maxes out at 1.0 (in the inception_raw_nav = 0.42 example above) |
The Index Level tracks theoretical index performance. Actual investor returns depend on NAV per Share, which accounts for real holdings, uninvested cash, and fees. See NAV Per Share for details on this distinction.
Formula Reference
For quick reference, all formulas used in these examples:| Formula | Expression |
|---|---|
| Midprice | (best_bid + best_ask) / 2 |
| Weight normalization | w'_i = w_i / sum(w) |
| Raw NAV | sum(w'_i x price_i) for all markets |
| Index Level | 100 x (raw_nav / inception_raw_nav) |
| NAV per Share | (position_value + custody_cash - accrued_fees) / shares_outstanding |