Paper trading: XSP index options settle incorrectly — OTM shorts are credited, and the settlement index is the wrong value
Running a 0DTE iron butterfly on XSP in a paper account. Over four sessions
(2026-07-28 → 07-31) the account showed +$8,294 when the correct P&L was
−$1,437 — a ~$9,700 error on a $100k account in four trading days.
There appear to be two separate issues in expiry processing.
1. Out-of-the-money short options are credited instead of expiring worthless
The OPCSH activity descriptions apply (index − strike) × 100 × qty without
flooring the intrinsic at zero, so an OTM short pays the account its negative
intrinsic.
All from the 2026-07-30 expiry, same settlement value (XSR_px=738.31):
| symbol | qty | description | net_amount |
expected |
|---|---|---|---|---|
| XSP260730C00737000 | 1 | assign ((XSR_px=738.31)-(strike=737))*(mult=100)*(qty=1) |
−131 | −131 |
| XSP260730C00738000 | 1 | assign ((XSR_px=738.31)-(strike=738))*(mult=100)*(qty=1) |
−31 | −31 |
| XSP260730C00740000 | 1 | assign ((XSR_px=738.31)-(strike=740))*(mult=100)*(qty=1) |
+169 | 0 |
| XSP260730C00741000 | 2 | assign ((XSR_px=738.31)-(strike=741))*(mult=100)*(qty=2) |
+538 | 0 |
| XSP260730C00742000 | 1 | assign ((XSR_px=738.31)-(strike=742))*(mult=100)*(qty=1) |
+369 | 0 |
A short 742 call with the index at 738.31 is out of the money and must settle at
$0. It was credited $369. The ITM legs (737, 738) are handled correctly, so the
sign convention is right — only the max(0, …) floor is missing.
Same pattern on the put side, 2026-07-29 expiry (XSR_px=741.86):
| symbol | qty | net_amount |
expected |
|---|---|---|---|
| XSP260729P00737000 | 2 | +972 | 0 |
| XSP260729P00736000 | 1 | +586 | 0 |
Both puts are struck well below the settlement value, so both should be worthless.
2. The settlement value does not match the official XSP settlement
Per the Cboe contract spec, XSP weekly/daily options are PM-settled and the
exercise settlement value is one-tenth the official closing value of the S&P 500
index on the expiration day. The XSR_px used does not match that on any day:
| expiry | XSR_px used |
official SPX close | correct settlement (SPX/10) | error |
|---|---|---|---|---|
| 2026-07-28 | 740.86 | 7,428.78 | 742.878 | −2.02 |
| 2026-07-29 | 741.86 | 7,316.15 | 731.615 | +10.25 |
| 2026-07-30 | 738.31 | 7,437.64 | 743.764 | −5.45 |
| 2026-07-31 | 747.27 | 7,489.72 | 748.972 | −1.70 |
The errors go both directions and are far too large to be rounding. On 2026-07-28,
XSR_px (740.86) equals SPY’s closing price that day exactly, which suggests
an equity proxy is being used somewhere rather than the S&P 500 index close.
The 07-29 and 07-30 errors also look like they could be next-day index levels —
consistent with sampling the index when the overnight settlement job runs instead
of at the 16:00 ET expiry close.
Impact
For any defined-risk index structure (butterflies, condors, verticals) the paper
account’s P&L is unusable: the long wings expire correctly at zero via OPEXP,
while the short legs are mispriced, so the position’s defined risk is not
respected. The account drifts steadily upward regardless of what the market does.
Worth noting the account still reports no OPEXP record for the short legs
themselves — they are handled via OPASN (net_amount 0) plus OPCSH, so the
cash impact is only visible in the OPCSH description string.
Reproducing
Any XSP position held through expiry with a short leg that finishes out of the
money. The clearest case is a short OTM call or put with no offsetting position —
it should settle at $0 and instead credits cash.
Happy to supply account ID, order IDs and the full activity dump privately if
that helps. Paper environment, https://paper-api.alpaca.markets/v2.