A quote that reports its own error

Nine tokenised-equity feeds, one session, one free call

Abstract. An option on the average price of a session has no closed form, and it is the contract a chain settles most naturally, because the average of a feed's own prints is what the feed already publishes. This paper quotes it on nine tokenised-equity feeds inside a single free view call and returns the standard error of the estimate with the price. The walk carries a variance that feeds on itself, with the per-ticker coefficients fitted in [2] and the arithmetic of [1]. The variance it starts from is read from the feed's own publishing rhythm rather than imported: a deviation feed publishes when its price has moved by a threshold, so publications per second of trading time give the variance. Over windows of sixty-four rounds the estimate has median ratio to realized five-minute volatility and lies within a third of it in percent of windows. The error bar is checked in the Brownian limit against Black-Scholes: across a hundred quotes the error each one reports agrees with the spread the hundred show to within percent. A live quote of 128 paths costs to million gas, inside the public node's budget of about million, and the at-the-money one-session call on NVDA at block was ± dollars. Nothing is written, owned or updatable.

Keywords. Asian options, Monte Carlo, standard error, deviation feeds, volatility clustering, view calls

1The price nobody quoted

The on-chain option protocols surveyed in [1] price from a closed form. An option on the average price over a session has none: the arithmetic mean of lognormal prices is not lognormal, and the standard treatment is simulation [4]. It is also the natural contract for a chain to settle. The average of a feed's own prints over a session is public, needs no second source, and one bad print moves it by a twenty-sixth of what it moves a close. So the contract that is easiest to settle on chain was the one that could not be quoted there. This paper quotes it, and returns with every price the standard error of the estimate that produced it, so that the number and the noise around it arrive together.

2The walk

One step is five minutes and a session is 78 steps. The log price moves by a normal draw scaled by the current standard deviation, and the variance for the next step is a fixed weight on the last squared move plus a fixed weight on the last variance:

(1)

This is GARCH(1,1) [5], and with α = β = 0 it is geometric Brownian motion. The coefficients are the per-ticker fits of [2], carried in the contract as constants, all in 1e18 (Table 1). The arithmetic is that of [1]: the standard deviation is a square root warm-started from the previous step with five Newton passes, each normal draw is one hash, and for a terminal payoff the exponential runs once a path. The average-price payoff needs the price itself at the points it averages, here every third step, so it exponentiates twenty-six times a path instead of once; Section 5 prices that difference.

Table 1. The coefficients carried per feed, from [2]. The long-run volatility is ω/(1 − αβ) per step, annualised over 78 steps a day and 252 days. The half-life is the number of five-minute steps for a shock to the variance to decay by half.

feedαβα + βhalf-lifelong-run vol

3Where the variance comes from

The walk needs a variance to start from. The usual source is a number imported from off chain or agreed by a vote [1]; here it is read from the feed itself. A deviation feed publishes when its price has moved by a fixed fraction δ of its value. For a driftless walk the expected time to travel δ is δ2/σ2, so the number of publications per second of trading time is the variance per second, and per five-minute step

(2)

taken over the feed's last sixty-four rounds, with δ the median absolute change between consecutive answers, n the number of gaps shorter than two hours and T their sum. Gaps longer than two hours are overnight or weekend and are not trading time. The same computation is run off chain on cached rounds and compared with the standard deviation of five-minute bar returns over the same span: on windows across the nine tickers the ratio of the two has median , tenth percentile and ninetieth percentile , and percent of windows fall within a third of realized (Table 2). The estimate is coarse where the feed is quiet: SPY publishes about once a day, so its sixty-four rounds span two months and Table 2 has a single window for it.

Table 2. Volatility read from the feed's rhythm, divided by realized five-minute volatility over the same span, per ticker: the number of sixty-four-round windows, the median ratio and its range.

feedwindowsmedian ratiorange

4The error bar

A quote is the mean of the payoffs over N paths and the standard error of that mean, s/√N, with s the sample standard deviation of the payoffs. The check is the Brownian limit, where the vanilla call has a closed form [3]. A hundred quotes of 128 paths each are priced at three strikes. Their average sits on Black-Scholes within standard errors of the hundred-quote mean at every strike, and the error each quote reports agrees with the spread the hundred actually show to within percent (Table 3). The error bar is not a decoration on the estimate; it is the estimate's own measurement of itself, and it is right.

Table 3. A hundred quotes of 128 paths against the closed form, spot 100, constant variance 4 × 10−6 per step, 78 steps. Prices in units of spot.

contractBlack-Scholesmean of 100reported errorobserved spreadratio

5Cost

Table 4 prices one quote at 78 steps as the paths grow, for the vanilla call, which exponentiates once a path, and for the average-price call, which exponentiates twenty-six times. The public node's budget for a view call was measured directly rather than assumed: with the engine's bytecode placed at an empty address by state override, the same average-price quote was asked with more and more paths until the node refused. It answered paths and refused , which by the slope of Table 4 puts the budget near million gas. A live quote of 128 paths, including the sixty-five round reads that set the variance, costs between and million gas across the nine feeds.

Table 4. Gas for one quote at 78 steps, NVDA coefficients, as measured by the test suite.

pathsvanilla callaverage-price call

6Quotes from the chain

Table 5 is the fork test at block . For each feed it shows the spot the feed held, the volatility read from its rhythm, annualised, the threshold the feed was found to publish at, and the at-the-money average-price call for one session with its standard error, seed 1, 128 paths.

Table 5. Nine feeds at one block. Prices in dollars; the error is the standard error of the quote, then as a share of it.

feedspotvol from rhythmδcall ± errorsharegas
Live from the deployed contract
feedspotfeed agecall ± error

Seed is the block number, so the estimate is drawn afresh each time and moves inside its own error bar. Refreshed every minute; the panel stops when the tab is hidden. Outside the trading session the feed age is measured in hours because the feed itself is quiet.

7What this is and is not

It is a price with its uncertainty printed next to it, computed by a public contract from public inputs, and reproducible by anyone who has the seed. It is not a quote to trade on. At 128 paths the error is to percent of the price, and a thousand paths would cost about million gas, several times the budget of Section 5. The variance it starts from is within a third of realized in five windows out of six, not all. Spot is the feed's last print, which outside a session can be hours old, and the age is returned with every quote. There is no discounting; the walk is a martingale at zero rate. Any contract that settles on this quote must average the same marks the walk averages, every fifteen minutes across the session, and must fix its own seed rule, because the engine takes the seed from the caller.

8Reproduction

test/Audit.t.sol writes Tables 3 and 4 during the run that checks them; test/Live.fork.t.sol writes Table 5 against the chain at the fixed block; tools/cadence.py writes Table 2 from the cached rounds and bars and stamps the SHA-256 of each input; tools/budget.py writes the node's budget. src/Engine.sol is the walk and the payoffs, src/Live.sol binds it to the feeds and reads the variance from their rhythm, src/Feeds.sol is generated from the fits of [2].

forge test  &&  python3 tools/cadence.py  &&  python3 tools/budget.py

Deployment pending. The engine repository is at github.com/St0kesEth/st0kes.

References

  1. [1]St0kes. Making simulation affordable on chain. st0kes.blog/simulation, 2026.
  2. [2]St0kes. The term a Monte Carlo engine drops. st0kes.blog/intermittency, 2026.
  3. [3]F. Black, M. Scholes. The pricing of options and corporate liabilities. Journal of Political Economy 81, 637–654, 1973.
  4. [4]A. Kemna, A. Vorst. A pricing method for options based on average asset values. Journal of Banking and Finance 14, 113–129, 1990.
  5. [5]T. Bollerslev. Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics 31, 307–327, 1986.