Models / Tokenized assets / token_nav_gap
Token and NAV gap
How wide is the gap between a token's price and its NAV, how much of it can stale NAV explain, and at what size does redemption pay more than the pool?
Measures a token's premium or discount to NAV: mean, stdev, worst, share of days outside the mint and redeem band, AR(1) half-life, and how far NAV can drift unobserved between strikes. Compares exit through a constant-product pool with exit by redemption, and finds the size where they cross. Every number comes from the caller. Not a price, a quote or advice.
On these numbers, the gap averages -0.331% with 6.7% of days outside the band, against 1.38% of unobserved NAV drift, redemption pays more above 740.93 tokens, and at 5,000 tokens redemption pays 19,771 more in present value.
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.
Readings
The numbers, with their units.
Mean premium
-0.3308%
Last point -0.304%.
Stdev of the premium
0.5036%
Over 60 points.
Worst gap
watch-2.3928%
Worst discount -2.393%, worst premium 0.05%.
Days outside the band
watch6.667%
4 of 60 days. With one stdev of NAV drift allowed, 0 days.
Half-life of the gap
3.295days
AR(1) slope 0.8103. One day per observation.
NAV drift between strikes, one stdev
watch1.3848%
Vol 10% over 7 days. The fee band runs -1.137% to +0.637%.
Exit through the pool
watch468,125
Average price 93.625 against a pool mid of 98.4, slippage 4.853% with the fee.
Exit by redemption, present value
487,897
97.5793 per token from a NAV of 98.7, paid in 10 days. The split into both routes comes to 488,030.
What flips it
The value of one input where the outcome changes, with the others held.
position_tokens
740.93tokensnow 5,000
On these numbers, below this size the pool pays more per token. Above it redemption does, with its fee and settlement carry counted. Neither route is checked as open to this holder.
settle_days
318.74daysnow 10
At this size, a settlement this long brings redemption's present value down to what the pool pays. Longer settlement gives the pool the higher value.
redeem_fee_bps
501.19bpsnow 100
At this size, a redeem fee this high brings redemption's value down to what the pool pays.
Flags
What went past a line, and what to read before you trust the rest.
- watch4 of 60 days are outside the band of -1.137% to +0.637%, and none stay outside with one stdev of NAV drift, 1.385%, allowed. On these numbers stale NAV can explain every one of them. outside_band
- watchThe -0.304% gap on the last point is inside one stdev of unobserved NAV drift, 1.385%, so this NAV can't show whether the gap is real. gap_inside_nav_drift
- watchThe 3.3 day half-life is shorter than the 7 days between strikes, so it can't be told apart from the strike resetting the gap. half_life_inside_strike_cycle
- watchAt 5,000 tokens the pool's slippage is 4.85%, and it pays 19,771 less than redemption, which takes 10 days to pay. size_over_pool
What this leaves out
What the formula leaves out, by name.
- NAV moving between the request and the strike that sets the payment.
- Other trades in the pool, other pools, and arbitrage while a large exit is under way.
- Limits on redemption size, minimum redemption size, gates and queues.
- Transaction costs on the system recording the token, and the risk of a failed settlement.
- Liquidity providers leaving the pool in a stress, which would make the slippage worse.
- Whether this holder may acquire, hold, mint, redeem, pledge, sell or transfer this token, or use any pool. Those are legal questions for counsel.
- Fat tails in the asset: one stdev is only the scale of the drift.
- Taxes.
What it took as given (8)
What it took as given to get here.
- Premium uses each day's published NAV, stale or not. A gap between strikes mixes market moves with NAV that hasn't caught up.
- Stdev is the sample stdev, n - 1. Worst is the largest gap by size, with its sign.
- Band: the top is mint fee plus carry, the bottom is minus redeem fee and carry. Carry = cash rate * settle_days / 365. The mint fee defaults to the redeem fee. Outside means strictly outside, by more than a billionth of a point, so a price exactly on an edge isn't counted.
- AR(1) is ordinary least squares with an intercept on all points, in steps of one observation. If NAV changes only on strike days, part of the reversion is the strike resetting the gap, not the market closing it.
- NAV drift between strikes is one stdev of the asset's lognormal move over the full interval, vol * sqrt(days / 365). The average day is less stale than that.
- The pool is constant-product. The fee comes off the tokens sold in, before the swap. Slippage is measured against the pool's own mid, y / x, and includes the fee.
- Redemption pays NAV less the fee after settle_days, discounted at the cash rate, simple, actual/365. With a series, NAV is its last value. With premium_pct only, NAV is the pool's mid / (1 + premium).
- The split sells into the pool until its marginal price falls to the redemption value, and redeems the rest. It pays at least as much as either route alone.
- Premium %
- Band top %
- Band bottom %
- Outside the band
The data
- Pool average
- Pool marginal
- Redemption
The data
The gap over the series
| Measure | Value |
|---|---|
| Last premium % | -0.304 |
| Mean % | -0.3308 |
| Stdev % | 0.5036 |
| Worst discount % | -2.3928 |
| Worst premium % | 0.05 |
| Band top % | 0.637 |
| Band bottom % | -1.137 |
| Days outside the band | 4 |
| Days outside the band with one stdev of drift | 0 |
| AR(1) slope | 0.8103 |
| Half-life, days | 3.295 |
Exit at this size
| Route | Tokens through the pool | Tokens redeemed | Value per token | Cash value | Against NAV % |
|---|---|---|---|---|---|
| Pool | 5,000 | 0 | 93.63 | 468,125 | -5.142 |
| Redemption | 0 | 5,000 | 97.58 | 487,897 | -1.135 |
| Split at the marginal price | 369.78 | 4,630.22 | 97.61 | 488,030 | -1.108 |
Paste it into your agent
No connection needed. This prompt carries the method, the conventions and what this site's engine gives on the made-up numbers, so your agent can check its own work before it touches real ones. Every prompt, with its hash, is listed at /prompts.json. A copy that stays fixed for this version, for a stack to point at: /v/1.0/models/token_nav_gap.md.
# Token and NAV gap: a prompt from hedgefund.mdPaste this into your AI agent. It needs no connection to hedgefund.md. An agent that can run code should write and run it, and shouldn't work a long series by hand.**Question.** How wide is the gap between a token's price and its NAV, how much of it can stale NAV explain, and at what size does redemption pay more than the pool?## MethodPremium = (price / NAV - 1) * 100. AR(1): x[t+1] = a + phi x[t], half-life = -ln 2 / ln phi. NAV drift, one stdev = vol * sqrt(days / 365). Pool exit: out = y * q(1 - f) / (x + q(1 - f)). Redemption = NAV * (1 - fee) / (1 + r * settle / 365). Sizes cross at q = y / R - x / (1 - f). The pool's marginal price meets R at q = (sqrt(y x (1 - f) / R) - x) / (1 - f).## Conventions- Premium uses each day's published NAV, stale or not. A gap between strikes mixes market moves with NAV that hasn't caught up.- Stdev is the sample stdev, n - 1. Worst is the largest gap by size, with its sign.- Band: the top is mint fee plus carry, the bottom is minus redeem fee and carry. Carry = cash rate * settle_days / 365. The mint fee defaults to the redeem fee. Outside means strictly outside, by more than a billionth of a point, so a price exactly on an edge isn't counted.- AR(1) is ordinary least squares with an intercept on all points, in steps of one observation. If NAV changes only on strike days, part of the reversion is the strike resetting the gap, not the market closing it.- NAV drift between strikes is one stdev of the asset's lognormal move over the full interval, vol * sqrt(days / 365). The average day is less stale than that.- The pool is constant-product. The fee comes off the tokens sold in, before the swap. Slippage is measured against the pool's own mid, y / x, and includes the fee.- Redemption pays NAV less the fee after settle_days, discounted at the cash rate, simple, actual/365. With a series, NAV is its last value. With premium_pct only, NAV is the pool's mid / (1 + premium).- The split sells into the pool until its marginal price falls to the redemption value, and redeems the rest. It pays at least as much as either route alone.## Step 1: check your method on these made-up numbersThe numbers and names below are made up. They aren't market levels, typical values or anyone's real figures.```json{ "token_prices": [ 99.9, 99.85, 99.95, 100.05, 99.95, 99.9, 99.85, 100, 100.05, 99.95, 100, 100.1, 100.05, 99.95, 100.1, 100.15, 100.05, 100.1, 100, 100.1, 100.05, 100.2, 100.1, 99.5, 98.8, 98.2, 97.9, 98, 98.2, 98, 97.8, 97.9, 98, 98.1, 98.05, 98, 98.1, 98.2, 98.25, 98.2, 98.1, 98.15, 98.3, 98.35, 98.3, 98.4, 98.35, 98.3, 98.25, 98.4, 98.5, 98.45, 98.5, 98.45, 98.4, 98.45, 98.55, 98.5, 98.55, 98.4 ], "nav_values": [ 100, 100, 100, 100, 100, 100, 100, 100.1, 100.1, 100.1, 100.1, 100.1, 100.1, 100.1, 100.2, 100.2, 100.2, 100.2, 100.2, 100.2, 100.2, 100.3, 100.3, 100.3, 100.3, 100.3, 100.3, 100.3, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.4, 98.4, 98.4, 98.4, 98.4, 98.4, 98.4, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.6, 98.6, 98.6, 98.6, 98.6, 98.6, 98.6, 98.7, 98.7, 98.7, 98.7 ], "asset_vol_pct": 10, "days_between_strikes": 7, "pool_token_depth": 100000, "pool_cash_depth": 9840000, "position_tokens": 5000, "redeem_fee_bps": 100, "mint_fee_bps": 50, "pool_fee_bps": 10, "settle_days": 10, "cash_rate_pct": 5}```Work them out with the method above. Yours should match these within 0.5%.- Mean premium: -0.3308 %- Stdev of the premium: 0.5036 %- Worst gap: -2.3928 %- Days outside the band: 6.667 %- Half-life of the gap: 3.295 days- NAV drift between strikes, one stdev: 1.3848 %- Exit through the pool: 468125.1488- Exit by redemption, present value: 487896.6484Where the outcome flips, with the other inputs held:- position_tokens at 740.9288: On these numbers, below this size the pool pays more per token. Above it redemption does, with its fee and settlement carry counted. Neither route is checked as open to this holder.- settle_days at 318.7415: At this size, a settlement this long brings redemption's present value down to what the pool pays. Longer settlement gives the pool the higher value.- redeem_fee_bps at 501.1871: At this size, a redeem fee this high brings redemption's value down to what the pool pays.If yours differ, stop and tell the person which ones and by how much. Don't go on to real numbers until they match, or until the person has seen the difference. These values come from one engine and can be wrong too.## Step 2: run it on the person's numbersReplace every input with the person's own. Ask for any number you don't have, and don't invent one.## Step 3: reportGive one sentence beginning "On these numbers,", then the values, then where the outcome flips. Always add what this leaves out:- NAV moving between the request and the strike that sets the payment.- Other trades in the pool, other pools, and arbitrage while a large exit is under way.- Limits on redemption size, minimum redemption size, gates and queues.- Transaction costs on the system recording the token, and the risk of a failed settlement.- Liquidity providers leaving the pool in a stress, which would make the slippage worse.- Whether this holder may acquire, hold, mint, redeem, pledge, sell or transfer this token, or use any pool. Those are legal questions for counsel.- Fat tails in the asset: one stdev is only the scale of the drift.- Taxes.## LimitsResults are hypothetical: arithmetic on the numbers given, prepared with hindsight. Nobody achieved them, and costs and liquidity are only as assumed. They aren't a forecast, a recommendation, an offer or a record of real trading. Don't say what to buy, sell or hold, and don't use them to market an investment. Whether a person may hold or trade an instrument is a legal question for counsel.Provided as is, at your own risk, by hedgefund.md, which is not a fund and isn't anyone's adviser. Version 1.0. Source: https://hedgefund.md/models/token_nav_gap/prompt.md. Terms: https://hedgefund.md/termsCall it
The same code answers on this page, over HTTP, over MCP and on your own machine, and the same inputs give the same bytes. No key, and nothing is stored. Send positions by POST or run the library, because a URL can land in a server log. model.md holds all of this for your agent.
POST the inputs to /api/v1/token_nav_gap.
curl -s https://hedgefund.md/api/v1/token_nav_gap \ -H 'content-type: application/json' \ -d '{"token_prices":[99.9,99.85,99.95,100.05,99.95,99.9,99.85,100,100.05,99.95,100,100.1,100.05,99.95,100.1,100.15,100.05,100.1,100,100.1,100.05,100.2,100.1,99.5,98.8,98.2,97.9,98,98.2,98,97.8,97.9,98,98.1,98.05,98,98.1,98.2,98.25,98.2,98.1,98.15,98.3,98.35,98.3,98.4,98.35,98.3,98.25,98.4,98.5,98.45,98.5,98.45,98.4,98.45,98.55,98.5,98.55,98.4],"nav_values":[100,100,100,100,100,100,100,100.1,100.1,100.1,100.1,100.1,100.1,100.1,100.2,100.2,100.2,100.2,100.2,100.2,100.2,100.3,100.3,100.3,100.3,100.3,100.3,100.3,98.5,98.5,98.5,98.5,98.5,98.5,98.5,98.4,98.4,98.4,98.4,98.4,98.4,98.4,98.5,98.5,98.5,98.5,98.5,98.5,98.5,98.6,98.6,98.6,98.6,98.6,98.6,98.6,98.7,98.7,98.7,98.7],"asset_vol_pct":10,"days_between_strikes":7,"pool_token_depth":100000,"pool_cash_depth":9840000,"position_tokens":5000,"redeem_fee_bps":100,"mint_fee_bps":50,"pool_fee_bps":10,"settle_days":10,"cash_rate_pct":5}' \ | jq '{summary, flags, flips, not_modeled, inputs_hash}'The tool is token_nav_gap on https://hedgefund.md/mcp.
curl -s https://hedgefund.md/mcp \ -H 'content-type: application/json' -H 'accept: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"token_nav_gap","arguments":{"token_prices":[99.9,99.85,99.95,100.05,99.95,99.9,99.85,100,100.05,99.95,100,100.1,100.05,99.95,100.1,100.15,100.05,100.1,100,100.1,100.05,100.2,100.1,99.5,98.8,98.2,97.9,98,98.2,98,97.8,97.9,98,98.1,98.05,98,98.1,98.2,98.25,98.2,98.1,98.15,98.3,98.35,98.3,98.4,98.35,98.3,98.25,98.4,98.5,98.45,98.5,98.45,98.4,98.45,98.55,98.5,98.55,98.4],"nav_values":[100,100,100,100,100,100,100,100.1,100.1,100.1,100.1,100.1,100.1,100.1,100.2,100.2,100.2,100.2,100.2,100.2,100.2,100.3,100.3,100.3,100.3,100.3,100.3,100.3,98.5,98.5,98.5,98.5,98.5,98.5,98.5,98.4,98.4,98.4,98.4,98.4,98.4,98.4,98.5,98.5,98.5,98.5,98.5,98.5,98.5,98.6,98.6,98.6,98.6,98.6,98.6,98.6,98.7,98.7,98.7,98.7],"asset_vol_pct":10,"days_between_strikes":7,"pool_token_depth":100000,"pool_cash_depth":9840000,"position_tokens":5000,"redeem_fee_bps":100,"mint_fee_bps":50,"pool_fee_bps":10,"settle_days":10,"cash_rate_pct":5}}}' \ | jq '.result.structuredContent | {summary, flags, flips, not_modeled, inputs_hash}'One file with no dependencies, and nothing is sent anywhere.
curl -fsSL https://hedgefund.md/hedgefund.mjs -o hedgefund.mjs # read it before you run itnode hedgefund.mjs template token_nav_gap > mine.json # replace every number in itnode hedgefund.mjs run token_nav_gap mine.json | jq '{summary, flags, flips, not_modeled, inputs_hash}'Made-up numbers that run as they stand. Replace every one.
{ "token_prices": [ 99.9, 99.85, 99.95, 100.05, 99.95, 99.9, 99.85, 100, 100.05, 99.95, 100, 100.1, 100.05, 99.95, 100.1, 100.15, 100.05, 100.1, 100, 100.1, 100.05, 100.2, 100.1, 99.5, 98.8, 98.2, 97.9, 98, 98.2, 98, 97.8, 97.9, 98, 98.1, 98.05, 98, 98.1, 98.2, 98.25, 98.2, 98.1, 98.15, 98.3, 98.35, 98.3, 98.4, 98.35, 98.3, 98.25, 98.4, 98.5, 98.45, 98.5, 98.45, 98.4, 98.45, 98.55, 98.5, 98.55, 98.4 ], "nav_values": [ 100, 100, 100, 100, 100, 100, 100, 100.1, 100.1, 100.1, 100.1, 100.1, 100.1, 100.1, 100.2, 100.2, 100.2, 100.2, 100.2, 100.2, 100.2, 100.3, 100.3, 100.3, 100.3, 100.3, 100.3, 100.3, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.4, 98.4, 98.4, 98.4, 98.4, 98.4, 98.4, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.5, 98.6, 98.6, 98.6, 98.6, 98.6, 98.6, 98.6, 98.7, 98.7, 98.7, 98.7 ], "asset_vol_pct": 10, "days_between_strikes": 7, "pool_token_depth": 100000, "pool_cash_depth": 9840000, "position_tokens": 5000, "redeem_fee_bps": 100, "mint_fee_bps": 50, "pool_fee_bps": 10, "settle_days": 10, "cash_rate_pct": 5}Inputs
| Input | Type | Range | Required | What it is |
|---|---|---|---|---|
| token_prices | array | 30 to 2000 items | no | Token price, one per day, oldest first. Send with nav_values, or leave both out and send premium_pct. |
| nav_values | array | 30 to 2000 items | no | NAV per token as published, same days and length as token_prices. It may repeat between strikes. |
| premium_pct | number | -90 to 200 | no | Today's premium to NAV, when no series is sent. -1 means 1% below NAV. NAV is then the pool's price over 1 + premium. |
| asset_vol_pct | number | 0 to 500 | yes | Annual volatility of the asset under the token. 10 means 10%. |
| days_between_strikes | number | 0 to 400 | yes | Days between NAV strikes. 7 means weekly. 0 means NAV is always fresh. |
| pool_token_depth | number | over 0 to 10000000000000 | yes | Tokens in the constant-product pool. |
| pool_cash_depth | number | over 0 to 10000000000000 | yes | Cash in the constant-product pool. |
| position_tokens | number | over 0 to 10000000000000 | yes | Tokens to exit. |
| redeem_fee_bps | number | 0 to 5000 | yes | Fee to redeem, on NAV. 100 means 1%. |
| mint_fee_bps | number | 0 to 5000 | no | Optional. Fee to mint, for the top of the band. Default: the redeem fee. |
| pool_fee_bps | number | 0 to 5000 | no | Optional. Pool fee on tokens sold in. Default 0. |
| settle_days | number | 0 to 400 | yes | Days from a redemption request to its payment. |
| cash_rate_pct | number | 0 to 50 | yes | Rate that money could earn during settlement. 5 means 5%. |
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.