Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
futures · 10 min read
Your Futures Notional Is Probably Wrong by 100x (And No Field in the Data Will Tell You)
Treasuries quote in points of par and grains in cents, so contract size is the wrong multiplier - and no metadata field distinguishes them. The one-line check that catches it.
I found this while extending an options-analytics engine from equity-index futures to the wider CME complex. It is the kind of bug that does not crash anything, does not produce an obviously silly number, and will sit quietly in your output until someone happens to compare a figure against a real contract value.
The Assumption That Breaks
Equity options are easy. One contract covers 100 shares, so dollar exposure is price x 100. Everyone internalises that multiplier of 100 and stops thinking about it.
Futures replace the 100 with a per-contract multiplier. The obvious place to find it is the contract size, which most market-data vendors expose directly - on Databento's GLBX feed it arrives as unit_of_measure_qty, a fixed-point integer you divide by 1e9.
And for most products that is correct. Crude oil is quoted in dollars per barrel over 1,000 barrels, so a $1.00 move is $1,000. Gold is dollars per troy ounce over 100 ounces. Euro FX is dollars per euro over EUR 125,000. The contract size and the dollar multiplier are the same number, because the price is quoted in dollars per unit.
Then you point the same code at a Treasury future.
Points of par
A 10-year Treasury note future quotes at something like 108.625.
That is not $108.625. It is 108.625% of $100,000 face value. One contract is about $108,625.
Run the obvious formula and you get 108.625 x 100,000 = $10,862,500. You have just valued a 10-year note contract at almost eleven million dollars. The correct multiplier is face value divided by 100, so $1,000 per point.
Cents
Corn quotes at 442.0. That is 442 cents per bushel, which is $4.42. Over 5,000 bushels the contract is worth about $22,100.
The obvious formula gives 442 x 5,000 = $2,210,000. Out by 100 again, in a different asset class, for a different reason. The correct multiplier is $50 per point.
And then, to keep you honest, soybean meal - sitting next to soybean oil in the same complex, on the same exchange, in the same product family - is quoted in dollars per short ton. No divide.
Why You Cannot Derive This From the Data
This is the part that matters if you are building something.
The natural instinct is to find the field that distinguishes these families and branch on it. There isn't one.
Currency is USD for every product mentioned above.
Display factor is 1.0 for corn and 1.0 for the 10-year note - two products that both need the divide - but 0.01 for soybean oil, which also needs the divide, and 0.01 for crude oil, which does not.
Display factor correlates with nothing useful. Any rule you derive from the metadata will be right for some products and silently wrong for others, which is worse than having no rule at all, because it will look like it works.
The quote convention is a property of the contract specification, not of the data feed. It has to live in an explicit, per-root table that a human verified.
The One-Line Check
There is a check that works for every product regardless of quote convention, and it is the most useful thing in this article.
The dollar multiplier is the value of a 1.0 move in the quoted price. The exchange publishes both the minimum tick size in quoted units and what that tick is worth in dollars. So:
Both sides are in the same quoted units, so the convention cancels out.
That last line deserves attention. The yen contract is JPY 12,500,000 and quotes around 0.0063, so its multiplier is twelve and a half million - by a wide margin the largest in the complex. A sanity bound is a very natural thing to add: "a multiplier over a million is obviously corrupt data, clamp it." That bound silently destroys the yen. Derive sanity bounds from the actual extremes of your instrument universe, not from what feels large.
The second check
Tick arithmetic is necessary but I would not ship on it alone, because it depends on having read the right row of the right spec sheet.
The independent check is a notional sanity test: multiply the current front-month price by your candidate multiplier and ask whether the answer is a plausible contract value. A 10-year note contract is roughly $110,000. If your arithmetic says $11 million, you used face value instead of face over 100.
Two independent derivations that agree is the bar. One derivation is a guess with a decimal point in it.
We validated 34 roots this way: measured each against live front-month closes, then re-derived every multiplier from published tick data, and required both to agree. One root - palladium - had sources disagreeing on whether the contract is 100 or 50 troy ounces. That is exactly the ambiguity that produces a 100x error, so we held the whole group until the tick arithmetic settled it: a $50.00 tick value divided by a $0.50 per-ounce tick is 100 ounces.
Why It Matters Beyond Notional
If this were only about a display figure it would be cosmetic. It is not, because the multiplier sits directly inside every exposure calculation.
Dollar gamma is gamma per contract multiplied by open interest, the contract multiplier and spot squared. A 100x multiplier error is a 100x error in gamma, delta, vanna and charm exposure. Everything downstream inherits it.
And the damage is worse than one wrong number. The entire point of expressing exposure in dollars is that it is comparable - across contracts, across asset classes, against an equity book. If your Treasury gamma is 100x too large and your equity gamma is correct, every cross-asset comparison is meaningless, and nothing about the output looks broken.
The Short Version
The multiplier is dollars per point, not contract size.
They differ by 100x for anything quoted in points of par (Treasuries) or in cents (most grains).
No metadata field distinguishes the families. It has to be an explicit table.
Verify with tick value / tick size, then sanity-check the resulting notional.
Derive sanity bounds from your real instrument universe, or you will clamp the yen to 1.
The failure mode here is not a crash or an obviously silly number. It is a plausible-looking figure that is wrong by two orders of magnitude, sitting in your output until someone compares it against a real contract value. If you compute exposure across more than one futures complex, spend an hour checking your multipliers against tick data. Two independent derivations that agree is the bar.