Does price end monthly expiry Friday near the walls?
Over monthly expiry Fridays from May 2018 to December 2024, we did not detect price finishing the last half hour nearer the closer call or put wall than a random line would.
In plain words: nobody placed a trade and no trade is simulated on this page. It measures recorded prices, so a result here is not a trading result and no profit is implied.
In this article 9 sections
The short answer
No, not that we could detect. On monthly options expiry Fridays from May 2018 to December 2024, price did not finish the last half hour (to the last minute before the closing auction) nearer the closer call or put wall than random lines would, in any of six tests on SPY, QQQ and a pool of six large stocks. The earlier version, on a different level, found nothing either.
In plain counts, 12 of 46 SPY months finished within a tenth of an ATR of the closer wall, and 12 started that close. ATR is the average size of a day’s move.
This does not say expiry has no effect. SPY’s test could only have seen a shift of 20.7 percentage points or more in landing share, QQQ has only 31 months, and months with both walls on one strike were left out (see Limits).
What to do with this
- Treat the closer wall on monthly expiry Friday as a reference level, not a magnet: price ended no nearer to it than random lines would. If both walls sit on one strike, treat that day as unknown; the six tests left those months out.
- When a chart or post says price “pinned” to a wall, or a wall “held” a share of the time, ask how far the wall started from price and what random lines at the same distances would have scored. A wall near price ends near it unless price moves a lot (median SPY move in these 29 minutes: 0.10 ATR): SPY walls within 0.1 ATR (12 months) averaged +0.281 against chance, walls 0.5 to 1 ATR away (13 months) −0.367.
- Until your own log holds about 50 Fridays, keep a wall as a reference, not a prediction: at that size a log can only pick out an average gap from chance of about 0.12 (12 percentage points) or more.
Six tests of the last half hour of monthly expiry
80 monthly expiry Fridays · 2018-05 to 2024-12 · level in force at 15:30
The prices are recorded history. The walls are rebuilt after the fact from stored option data as the wall in force at a five-minute mark, so they can differ from the levels a live Prism by GEXfreak chart drew. No trades are involved.
This figure measures recorded prices and levels rebuilt from recorded data; no trade is involved.
- Average against chance (circle) or against the ordinary Friday (diamond)
- Ring: the earlier version’s average
- 95% range (thick bar)
- Range allowing for six tests (thin bar)
- Shaded band: the smallest shift the test could have seen
The six tests, in the order they were fixed before any result was read, with the earlier version (the prior-close level) in brackets. Every result is “not detected”. The smallest effect is in percentage points: a landing share runs from 0 to 1, so 0.207 is 20.7 percentage points.
| Test | Months (earlier) | Average (earlier) | 95% range | Range allowing for six tests | Smallest effect the test could see, percentage points (earlier) | Result |
|---|---|---|---|---|---|---|
| T1 · SPY vs chance | 46 (47) | +0.004 (+0.017) | −0.069 to +0.081 | −0.091 to +0.110 | 20.7 (21.0) | Not detected |
| T2 · SPY vs ordinary Friday | 46 (46) | −0.021 (−0.041) | −0.141 to +0.104 | −0.180 to +0.148 | 28.0 (25.0) | Not detected |
| T3 · QQQ vs chance | 31 (37) | +0.082 (+0.030) | −0.051 to +0.204 | −0.097 to +0.242 | 28.5 (24.3) | Not detected |
| T4 · QQQ vs ordinary Friday | 31 (35) | +0.064 (−0.005) | −0.077 to +0.202 | −0.125 to +0.248 | 36.1 (28.4) | Not detected |
| T5 · 6-name pool vs chance | 76 (80) | −0.007 (+0.011) | −0.068 to +0.053 | −0.089 to +0.073 | 12.5 (7.2) | Not detected |
| T6 · 6-name pool vs ordinary Friday | 73 (80) | −0.037 (+0.012) | −0.120 to +0.049 | −0.148 to +0.079 | 16.9 (11.2) | Not detected |
Tables, method and data source
Win counts and p-values. A month is won by the wall side when its landing share is above 0.5 (or above the ordinary Friday’s, in the ordinary-Friday tests); a tie is neither. The p-value is how often random flips of each month’s win or loss give a split at least as lopsided as the one seen, and 1.00 is what coin flips give. Adjusted p allows for the six tests run together and cannot exceed 1.
| Test | Ties (neither side won) | Wall side won | p (win count) | Adjusted p |
|---|---|---|---|---|
| T1 · SPY vs chance | 0 | 23 of 46 (50%) | 1.00 | 1.00 |
| T2 · SPY vs ordinary Friday | 0 | 22 of 46 (48%) | 0.88 | 1.00 |
| T3 · QQQ vs chance | 1 | 19 of 31 (61%) | 0.20 | 1.00 |
| T4 · QQQ vs ordinary Friday | 1 | 14 of 31 (45%) | 0.86 | 1.00 |
| T5 · 6-name pool vs chance | 1 | 36 of 76 (47%) | 0.82 | 1.00 |
| T6 · 6-name pool vs ordinary Friday | 0 | 34 of 73 (47%) | 0.64 | 1.00 |
Every test by era and month type: average and months (average · months). One decision clock only, 15:30, so “all months” is the test itself. Events, not months, are counted for the pool.
| Test | All months | Fallback era | Native era | Quarterly months | Other months |
|---|---|---|---|---|---|
| T1 · SPY vs chance | +0.004 · 46 | +0.015 · 32 | −0.021 · 14 | +0.010 · 21 | 0.000 · 25 |
| T2 · SPY vs ordinary Friday | −0.021 · 46 | −0.020 · 32 | −0.023 · 14 | +0.011 · 21 | −0.048 · 25 |
| T3 · QQQ vs chance | +0.082 · 31 | +0.064 · 24 | +0.143 · 7 | +0.058 · 8 | +0.090 · 23 |
| T4 · QQQ vs ordinary Friday | +0.064 · 31 | +0.081 · 24 | +0.006 · 7 | −0.019 · 8 | +0.093 · 23 |
| T5 · 6-name pool vs chance | −0.007 · 76 | −0.011 · 55 | +0.004 · 21 | +0.061 · 25 | −0.040 · 51 |
| T6 · 6-name pool vs ordinary Friday | −0.037 · 73 | −0.070 · 53 | +0.053 · 20 | +0.016 · 25 | −0.064 · 48 |
Every SPY monthly expiry Friday that was measured (46), from the recorded prices and the wall in force at 15:30. Columns A to E are the inputs of the spreadsheet steps; F to H are what the formulas return. The last two columns are the earlier level on the same month, where both levels measured it.
| A · Date | B · Price 15:30 | C · Price 15:59 | D · Nearer wall | E · ATR | F · Wall distance, ATR | G · Move toward the wall side, ATR | H · Landing share | Finished from the wall, ATR | Side | Earlier level: nearer wall | Earlier level: landing share |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2018-05-18 | 271.47 | 271.34 | 272.00 | 2.81423 | 0.1883 | −0.0462 | 0.5333 | 0.2345 | call | 272.00 | 0.6087 |
| 2018-06-15 | 277.12 | 277.20 | 276.00 | 2.10571 | 0.5319 | −0.0380 | 0.1778 | 0.5699 | put | 278.00 | 0.3696 |
| 2018-10-19 | 276.93 | 276.19 | 277.00 | 4.24536 | 0.0165 | −0.1743 | 0.9778 | 0.1908 | call | 277.00 | 1.0000 |
| 2018-12-21 | 240.76 | 240.69 | 240.00 | 6.28474 | 0.1209 | +0.0111 | 0.6667 | 0.1098 | put | 245.00 | 0.0652 |
| 2019-02-15 | 276.65 | 277.39 | 276.00 | 2.79215 | 0.2328 | −0.2650 | 0.4444 | 0.4978 | call | 275.00 | 0.1739 |
| 2019-03-15 | 281.47 | 281.35 | 282.00 | 2.38420 | 0.2223 | −0.0503 | 0.4889 | 0.2726 | call | 281.00 | 0.5870 |
| 2019-06-21 | 294.62 | 294.08 | 295.00 | 2.92328 | 0.1300 | −0.1847 | 0.6222 | 0.3147 | call | 296.00 | 0.3261 |
| 2019-07-19 | 297.80 | 297.12 | 298.00 | 2.09000 | 0.0981 | −0.3230 | 0.7556 | 0.4211 | put | 298.00 | 0.8043 |
| 2019-11-15 | 311.24 | 311.83 | 310.00 | 1.94782 | 0.6366 | −0.3029 | 0.0222 | 0.9395 | call | – | – |
| 2019-12-20 | 321.17 | 320.95 | 321.00 | 2.29509 | 0.0741 | +0.0959 | 0.8667 | 0.0218 | call | 321.00 | 0.8478 |
| 2020-02-21 | 332.99 | 333.49 | 335.00 | 3.36615 | 0.5971 | +0.1485 | 0.1111 | 0.4486 | call | – | – |
| 2020-04-17 | 284.61 | 286.73 | 285.00 | 9.46074 | 0.0412 | +0.2241 | 0.4444 | 0.1829 | call | – | – |
| 2020-07-17 | 322.29 | 321.67 | 320.00 | 5.44964 | 0.4202 | +0.1138 | 0.3333 | 0.3064 | put | 320.00 | 0.3478 |
| 2020-08-21 | 339.48 | 339.44 | 340.00 | 3.00891 | 0.1723 | −0.0155 | 0.6000 | 0.1878 | call | 340.00 | 0.6739 |
| 2020-09-18 | 331.22 | 330.69 | 330.00 | 6.95279 | 0.1755 | +0.0762 | 0.5778 | 0.0992 | put | 335.00 | 0.1957 |
| 2020-12-18 | 367.27 | 369.13 | 365.00 | 3.63804 | 0.6240 | −0.5113 | 0.0889 | 1.1352 | put | 368.00 | 0.4565 |
| 2021-01-15 | 376.50 | 375.68 | 375.00 | 4.29566 | 0.3492 | +0.1909 | 0.4667 | 0.1583 | put | – | – |
| 2021-03-19 | 390.81 | 389.50 | 390.00 | 6.49966 | 0.1246 | +0.2015 | 0.7778 | 0.0769 | put | – | – |
| 2021-05-21 | 416.01 | 414.95 | 415.00 | 5.58249 | 0.1809 | +0.1899 | 0.9778 | 0.0090 | put | 415.00 | 0.9348 |
| 2021-07-16 | 431.78 | 431.40 | 432.00 | 3.11860 | 0.0705 | −0.1218 | 0.8444 | 0.1924 | call | – | – |
| 2021-08-20 | 443.37 | 443.33 | 445.00 | 3.15811 | 0.5177 | −0.0111 | 0.2444 | 0.5288 | call | – | – |
| 2021-09-17 | 441.49 | 441.42 | 440.00 | 3.50805 | 0.4233 | +0.0185 | 0.3111 | 0.4048 | put | – | – |
| 2021-12-17 | 461.78 | 459.90 | 460.00 | 7.79889 | 0.2282 | +0.2411 | 0.9556 | 0.0128 | put | 460.00 | 1.0000 |
| 2022-02-18 | 434.31 | 434.27 | 430.00 | 8.18869 | 0.5263 | +0.0049 | 0.2000 | 0.5215 | put | – | – |
| 2022-03-18 | 444.04 | 444.47 | 445.00 | 9.58299 | 0.1002 | +0.0449 | 0.7333 | 0.0553 | call | – | – |
| 2022-05-20 | 385.25 | 389.60 | 380.00 | 11.43858 | 0.4590 | −0.3803 | 0.2889 | 0.8393 | put | 390.00 | 0.9565 |
| 2022-09-16 | 384.92 | 385.64 | 385.00 | 8.28751 | 0.0097 | +0.0869 | 0.6222 | 0.0772 | put | 390.00 | 0.1522 |
| 2022-11-18 | 395.90 | 396.09 | 400.00 | 7.80499 | 0.5253 | +0.0243 | 0.2222 | 0.5010 | call | 400.00 | 0.2391 |
| 2022-12-16 | 384.09 | 383.30 | 380.00 | 7.39500 | 0.5531 | +0.1068 | 0.1333 | 0.4462 | put | – | – |
| 2023-01-20 | 395.17 | 395.83 | 395.00 | 6.10243 | 0.0279 | −0.1082 | 0.9556 | 0.1360 | put | – | – |
| 2023-02-17 | 406.54 | 407.24 | 410.00 | 6.32136 | 0.5481 | +0.1115 | 0.1556 | 0.4366 | call | – | – |
| 2023-03-17 | 390.75 | 390.11 | 390.00 | 6.69750 | 0.1120 | +0.0956 | 0.8889 | 0.0164 | put | 394.00 | 0.3043 |
| 2023-04-21 | 411.83 | 412.18 | 412.00 | 3.89247 | 0.0437 | +0.0899 | 0.7556 | 0.0462 | call | 412.00 | 0.8043 |
| 2023-05-19 | 418.19 | 418.61 | 418.00 | 4.47611 | 0.0413 | −0.0949 | 0.8889 | 0.1363 | put | 420.00 | 0.4130 |
| 2023-06-16 | 439.57 | 439.43 | 440.00 | 4.56881 | 0.0941 | −0.0306 | 0.7778 | 0.1248 | call | 440.00 | 0.8261 |
| 2023-07-21 | 452.68 | 452.19 | 455.00 | 3.69390 | 0.6281 | −0.1327 | 0.0667 | 0.7607 | call | 453.00 | 0.8696 |
| 2023-08-18 | 436.14 | 436.46 | 435.00 | 4.67966 | 0.2436 | −0.0684 | 0.4222 | 0.3120 | put | 437.00 | 0.6304 |
| 2023-09-15 | 443.72 | 443.29 | 445.00 | 3.81362 | 0.3356 | −0.1128 | 0.4000 | 0.4484 | put | – | – |
| 2023-12-15 | 469.40 | 469.37 | 467.00 | 3.81326 | 0.6307 | +0.0092 | 0.0444 | 0.6215 | put | 467.00 | 0.1087 |
| 2024-01-19 | 482.14 | 482.42 | 480.00 | 4.20772 | 0.5086 | −0.0665 | 0.2667 | 0.5751 | call | – | – |
| 2024-03-15 | 510.13 | 509.74 | 510.00 | 4.46672 | 0.0291 | +0.0873 | 0.6889 | 0.0582 | put | 510.00 | 0.7826 |
| 2024-06-21 | 544.40 | 544.12 | 548.00 | 4.96520 | 0.7250 | −0.0564 | 0.0000 | 0.7814 | call | 545.00 | 0.7391 |
| 2024-08-16 | 554.10 | 554.21 | 555.00 | 10.71656 | 0.0844 | +0.0107 | 0.8000 | 0.0737 | call | 555.00 | 0.8913 |
| 2024-09-20 | 568.24 | 568.10 | 570.00 | 8.03389 | 0.2197 | −0.0168 | 0.5111 | 0.2365 | call | 570.00 | 0.5217 |
| 2024-10-18 | 584.46 | 584.57 | 585.00 | 5.26498 | 0.1026 | +0.0209 | 0.7111 | 0.0817 | call | 585.00 | 0.7826 |
| 2024-12-20 | 591.79 | 590.87 | 590.00 | 4.85525 | 0.3687 | +0.1895 | 0.3778 | 0.1792 | put | 590.00 | 0.4348 |
- One row per calendar month: the average landing share of that month's monthly-expiry session (SPY and QQQ: one session; the pool: equal weight across the names that qualified that month).
- Rebuilt level: The call and put wall of the Prism by GEXfreak research level model, rebuilt at each 5-minute mark from that morning's open interest and the prior close's option prices, and read at the latest rebuild that was usable at 15:30 ET: the 15:25 rebuild, usable at 15:26 (age 5 minutes). The 15:30 rebuild is usable only at 15:31 and is never read.
- Earlier level: The earlier version's wall: the nearest-expiry wall built from the prior close's option prices and open interest, usable from the 09:30 open and held all session. Its open interest was 21.7 to 33 hours old at 15:30. It is kept as the old level in the parity table.
- Every number in the tables was rebuilt from recorded prices and level rows and matched the study’s own saved results before it was written; the fingerprints are in the receipt. The 95% ranges come from re-drawing the monthly results 50,000 times in runs of 3 consecutive months (neighbouring months move together); the p-values from flipping each month’s win or loss at random 100,000 times.
- The levels here are rebuilt at the 5-minute mark from that morning's open interest and the prior close's option prices, re-evaluated at the price at that mark. They are a rebuild, not a record of what a live Prism by GEXfreak chart drew or what a member saw.
- Only SPY has a true intraday map to check the rebuild against (204 sessions, October 2025 to August 2026). Within $1 of it the rebuild matched the call wall 77.5% of the time and the put wall 83.3%, and it is weakest late in the day and in quarterly months. Accuracy for QQQ, for the stocks and for every session from 2018 to 2024 is unmeasured, and on an expiry Friday the expiring chain moves through the day, so a null on rebuilt levels does not speak for the live chart.
- Premium era: before 29 March 2023 an option's price is its last trade of the day, with a modeled value where a contract had none (the fallback era); from that date it is native. 32 of 46 SPY, 24 of 31 QQQ and 55 of 76 pool month rows sit in the fallback era, the least reliable era, and both eras are shown separately. Before 28 March 2023 the open interest behind a level is one start-of-day 09:31 ET stamp.
- One decision clock only (15:30, reading the 15:25 rebuild at age 5 minutes). The window runs from the 15:30 price to the last trade of the 15:59 minute; the closing auction is not measured, so a null says nothing about expiry effects that live in the close.
- The old and the rebuilt level are different constructions: the old one is the nearest-expiry wall built from the prior close (its open interest was 21.7 to 33 hours old at 15:30), usable from 09:30 and held all session; the rebuilt one is the level model's wall set at 15:30. A difference between the two shows how much the answer depends on the level source, not which one price respects, and it is not an improvement or a loss.
- Smallest detectable effect: each test had 80 percent power to see a shift of 12.5 to 36.1 percentage points in landing share (a value of 0.207 on the 0-to-1 scale is 20.7 percentage points). A not-detected result does not say there is no effect, and QQQ sits just above the 30-row floor (31 rows), so the loss of two rows would leave those tests underpowered.
- The pool is six names (AAPL, AMD, INTC, MSFT, NVDA, TSLA), about two names per month row, because BAC, DIA, IBM, NKE, UNH, WMT and XOM fall under the 60-month rule once coverage and book-quality gates are applied (IBM and UNH have no usable session). Names outside the pool are shown with rows and n and no p-value; GPRO and IWM have no rebuilt store, and DVN, GLD, PFE and VZ were already outside the earlier pool.
- Both walls sit at one strike on 32 of 79 SPY and 49 of 80 QQQ monthly sessions; those sessions are left out of the tests (the wall distances tie) and scored only in the same-strike sensitivity, which is descriptive. The sensitivity's run counts (480 monthly and 1,059 ordinary events added) are across all 15 names the study read; the table scores only SPY, QQQ and the six pool names: 352 monthly and 809 ordinary events before the cap (the audit's recount), and 32, 49 and 266 monthly events added after it for SPY, QQQ and the pool.
- The landing share cannot see a pull toward or away from the wall side that does not depend on the wall's distance; the study cannot separate that from momentum. Design B compares two ranks from different class pools, so its sign test is approximate and the interval is the second requirement.
- The events are the same sessions and the same 15:25 rebuilt level that the earlier version scored as a descriptive line (the same level by construction: both read the same 15:25 row and the coverage gates only remove name-years; the study's output tests the landing shares, not the level equality), so a detected call would not have been independent evidence; the monthly-expiry study holds 12 primary tests over the two protocols on overlapping sessions, and the four monthly-level studies hold 40 (about 2 false detections expected at 0.05 if nothing is there).
- Only the six tests carry p-values. Every other table (cuts by era and month type, parity, per year, by distance, per name, same-strike) is descriptive, has no adjustment for the many cells shown (about 159 interval cells with 8 or more rows, 7 of which exclude zero, as chance alone gives) and cannot change a test's result. Cells hold 1 to 55 rows and 3-row block intervals on so few rows are for pattern only.
- ATR is a research unit for scaling distances, not a site input. Raw prices are used, so a split inside the window is handled only by the corporate-action exclusion list.
- The protocol was frozen before any outcome data was read for it (protocol sha256 b308b57d9efad80c6293b2171d68294bd30a9b9bfcae4a03554d0ac766d0a211), the scored run was made once (attempt 1) and its independent audit passed, agreeing exactly on every row count, mean and class; it confirms the implementation, not the specification. Window 2018-05-01 to 2024-12-31; nothing dated 2025 or later was opened. Three wording corrections from the audit concern the freeze record and change no number: the dry-run count file was written before the runner's last edit and the run's own count reproduction supersedes it; the pre-freeze preflight also re-scored the earlier version's already-published snapshot line and revealed nothing beyond the earlier study's results; and the shared level-reading program is fingerprinted with line endings normalised to LF (ea82eeb09774...), the form Git stores; the hash the study recorded (1ca9a626...) is of the CRLF working-tree copy it ran with.
- This is a descriptive study of where price finished relative to recorded levels. It computes no trade, fill, fee or return and makes no claim of an edge; customer copy carries the site's CFTC Rule 4.41 back-test statement beside any figure from it.
Data receipt: 17 sources, built 2026-09-29
Each source is fingerprinted with SHA-256, so a changed file changes the fingerprint. A single file shows its own hash; a source of several files shows one hash of their names and hashes.
- Study results: the six tests and every table (single scored run) ·
1cb2b971518f4059… - Study protocol, frozen before any outcome data was read for it ·
b308b57d9efad80c… - Study plan text, written before any result was read ·
43c68963a57cafa2… - Study design counts, taken from calendars and coverage before results ·
4d53af0febdf2ee9… - Study count script (fingerprint only, not re-run) ·
821ec70490398533… - Study calculation code, frozen before the run (fingerprint only, not re-run) ·
9c4c397b5f43deed… - Study event table, rebuilt level (every kept event) ·
9bf82c2c42a36cd2… - Study event table, old level (every kept event) ·
2d1f03d91f6e7cec… - Study report, with the audit follow-up ·
ba5bbac03df94adc… - Independent audit verdict (pass) and its findings ·
eaff437506d1d9ec… - Earlier study protocol (v1) ·
cfe56b8105d28b33… - Earlier study results (v1) ·
b382d25a4799c96d… - Earlier study calculation code (v1, reused unchanged by the frozen runner) ·
73df9fc47ad72e1a… - Earlier study design counts (v1) ·
6b31f402fe3e3a7d… - Earlier evidence file (v1), copied in as the earlier version ·
c42cdb67a066c1c6… - Study errata addendum (wording of the audit's seven minor findings; nothing frozen is edited) ·
7e44dcf2ae75d0d8… - Shared snapshot reader, hash taken with CRLF line endings changed to LF; recorded, not imported ·
ea82eeb097740870…
Descriptive history, not a forecast. Sessions from 2018-05-01 to 2024-12-31; the last date read is 2024-12-31. One row is one calendar month.
How we tested
A monthly expiry Friday is the third Friday of the month, when the standard monthly options expire. At 15:30 ET we took SPY’s price and the nearer wall in force in the rebuild at that clock (the 15:25 rebuild), and measured how far price was from that wall, in ATR, at the last trade of the 15:59 minute. For SPY the median month started 0.22 ATR from the nearer wall ($1.07) and finished 0.24 ATR from it.
On 19 October 2018 SPY’s nearer wall was 0.0165 ATR from price; price moved 0.1743 ATR away and still finished 0.1908 ATR from it, so the landing share was 0.9778: price finished farther from 44 of the other 45 lines than from the wall. With no pull the average share is 0.5, and the figure reports it minus 0.5.
Six tests were fixed before any result was read: SPY, QQQ and a pool of six large US names, each against chance and against the ordinary Friday (the monthly Friday’s share minus the closest ordinary Friday’s).
What changed from the earlier version
The earlier version’s level was the nearest-expiry wall built from the prior close, usable from the 09:30 open and held all session, on 13 names with no coverage gates. This version reads the wall in force in the rebuild at 15:30, on six. They are different constructions, not a correction: a gap between them shows how much the answer depends on the level source.
Every test is still not detected. On the months both levels measured, the swap moves the average by −3.3 to +11.2 percentage points and every 95% range includes zero. On the months the chance tests share, the levels name the same strike on 40% to 55% and the same kind of wall on 77% to 87%.
| Test | Earlier level: average (months) | Rebuilt at 15:30: average (months) | Same months: change, points (95% range) |
|---|---|---|---|
| SPY vs chance | +0.017 (47) | +0.004 (46) | −2.3 (−13.7 to +9.4), 31 months |
| SPY vs ordinary Friday | −0.041 (46) | −0.021 (46) | −3.3 (−17.9 to +12.0), 29 months |
| QQQ vs chance | +0.030 (37) | +0.082 (31) | +10.7 (−2.5 to +26.5), 15 months |
| QQQ vs ordinary Friday | −0.005 (35) | +0.064 (31) | +11.2 (−10.6 to +35.5), 13 months |
| Pool vs chance | +0.011 (80) | −0.007 (76) | +3.3 (−1.9 to +8.4), 55 months |
| Pool vs ordinary Friday | +0.012 (80) | −0.037 (73) | −1.5 (−12.1 to +9.5), 48 months |
Check it yourself with Prism and a spreadsheet
One row per monthly expiry Friday of one symbol; write A, E and the two walls before 15:30, and fill B and C after the close. To practise, copy columns A to E of the SPY table from the figure (under “Tables, method and data source”) into a sheet: the formulas then return the study’s SPY numbers.
| Column | What to write | Where it comes from |
|---|---|---|
| A | Date | Monthly expiry Friday (the session before, if a holiday). |
| B | Price at 15:30 ET | Open of the 15:30 one-minute bar. |
| C | Price at 15:59 ET | Close of the 15:59 one-minute bar. |
| D | Nearer wall | The call or put wall on the Prism chart closer to B, read just before 15:30 (note the time). |
| E | ATR (14 days) | ATR(14) on your broker’s daily chart, session before Friday. |
| F | Distance to the wall, in ATR | Step 3. |
| G | Move toward the wall’s side, in ATR | Step 3. |
| H | Landing share | Step 5. |
The steps, and what a small log can say
- 1. The days. Start with the next monthly expiry Friday. Leave a Friday out, and list it separately, if both walls sit on one strike, the nearer wall is more than 1 ATR from price, or the session closes early (there is no 15:30 bar); the study kept 46 of 80 SPY months.
- 2. Columns A to E. Read the walls once, just before 15:30, and note the time. A smoothed (Wilder) ATR rescales F and G; use one method throughout.
- 3. Distance and move. In F2: =ABS(D2-B2)/E2. In G2: =SIGN(D2-B2)*(C2-B2)/E2, positive when price moved toward the wall’s side. Worked line, SPY 20 December 2024: B 591.79, C 590.87, E 4.85525, D 590.00 (the put wall, 1.79 below price; the call wall sat above), so F is 0.3687 and G is +0.1895.
- 4. The simplest check. =AVERAGE(G2:G47) is the average move toward the wall’s side and =COUNTIF(G2:G47,">0") counts the months price moved toward it. The 46 SPY months give −0.016 ATR and 24 of 46: no lean toward the wall.
- 5. Landing share. In H2, filled down: =(SUMPRODUCT(--(ABS(G2-$F$2:$F$47)>ABS(G2-F2)))+0.5*(SUMPRODUCT(--(ABS(G2-$F$2:$F$47)=ABS(G2-F2)))-1))/(COUNT($F$2:$F$47)-1). Change 47 to your last row; the −1 leaves out the row’s own line. Each other row is a random line at its own distance F; the formula counts those price finished farther from (ties half). Worked line: price finished 0.1792 ATR from the wall and farther than that from 17 of the other 45 lines, so H = 17 ÷ 45 = 0.3778. With the 46 SPY rows, H2 reads 0.5333.
- 6. Against chance. =AVERAGE(H2:H47)-0.5 returns +0.004 for the 46 SPY rows, the study’s SPY figure, and =COUNTIF(H2:H47,">0.5") counts the months above chance (23 of 46).
- 7. Read it against the table. Your log’s spread is =STDEV(H2:H47); one symbol’s months came to about 0.31. Your 95% range is your average ± =1.96*STDEV(H2:H47)/SQRT(COUNT(H2:H47)); the smallest gap your log could see uses 2.80 in place of 1.96.
- 8. Pace and tries. Usable SPY Fridays come to about 7 a year, so 20 takes about 3 years and 50 about 7; ordinary Fridays come about 4 times as fast, on a separate sheet. Several symbols on one Friday are not independent events, and every extra cut of your log is another try.
| Events logged | Your 95% range: your average ± | Smallest gap from chance it could see | What follows |
|---|---|---|---|
| About 20 (SPY: about 3 years) | ±0.14 | 0.19 | Too few to say anything. |
| About 50 (SPY: about 7 years) | ±0.09 | 0.12 | Includes zero: this page’s answer. Excludes zero: a lead, not a finding. |
| About 100 (SPY: about 14 years) | ±0.06 | 0.09 | Includes zero: no pull this large. Excludes zero: test it on new Fridays. |
Limits
- These levels are rebuilt at each five-minute mark; Prism by GEXfreak keeps no five-minute history of its levels. A tier-0 rebuild uses that morning’s open interest and the prior close’s option prices, re-evaluated at that mark’s market price. Only SPY has a true intraday map (from August 2025), used just to check accuracy. Within $1 of it, tier-0 matched the call wall 77.5% of the time, the put wall 83.3%, the daily flip 68.9%, the weekly flip 73.7% and the monthly flip 66.9%. QQQ and stock accuracy is unmeasured. A log made from the Prism chart tests Prism’s walls, which can differ, and on an expiry Friday the expiring options change through the day.
- Through 28 March 2023 an option’s price is a stored last trade, or a modeled value where none traded (the fallback-premium era); after that date prices are native. That era holds most rows: 32 of SPY’s 46 months, 24 of QQQ’s 31 and 55 of the pool’s 76. The figure shows both eras, and quarterly against other months, for every test.
- There is one decision clock, 15:30 ET. The window stops at the last trade of the 15:59 minute, so the closing auction, where a closing pull would finish, is not measured. It ends on 31 December 2024; no later data is used.
- The smallest shift in landing share a test could see was 12.5 to 36.1 percentage points, depending on the test (landing share runs from 0 to 1, so 0.207 is 20.7 points), so a smaller pull could be there unseen. QQQ has only 31 months, just above the 30-month floor for a test, and the ordinary-Friday tests are weaker still, since weekly options also expire on ordinary Fridays.
- Only months with two different walls were measured: SPY 46 of 80, QQQ 31 of 80 and 178 of 480 pool name-months. The rest had both walls on one strike (32, 49 and 272), a nearer wall over 1 ATR away (1, 0 and 3) or no usable data (1, 0 and 27). Added back, the shared-strike months leave the averages near zero (+0.016, +0.018, +0.004).
- The pool is six names (AAPL, AMD, INTC, MSFT, NVDA and TSLA), about two per month row; seven of the earlier 13 fall under the 60-month rule once coverage gates apply, so its 178 name-months are not independent events.
- For SPY and QQQ these are the same months, on the same rebuilt level, that the earlier study had already scored once without a test, so a detection would not have been independent evidence. The six tests are also part of 40 across four studies; about 2 would look like detections by chance.
- The era, month-type, year and distance tables are descriptive: no p-values, no correction for the many cells. Of the 48 ranges in the figure’s era, month-type and year views, 2 exclude zero, about what chance gives.
- This is not a live rule: the random lines borrow distances from later Fridays too, and landing share cannot see a steady drift toward one side (step 4).
Sources and editorial notes
Read the primary references and editorial policy
Published by GEXfreak. Prism by GEXfreak is the chart product these guides describe. Every figure comes from recorded market history: prices, option open interest and recorded sessions. Where a figure shows trade results, the trades are back-tested, not placed. This is product education, not independent investment research.
Each figure lists its data sources and their SHA-256 fingerprints under “Table, method and data source”. The references below explain the statistics and the disclosure wording used on this page. They do not endorse GEXfreak or these studies.
- Weekly Options (frequently asked questions) — Options Industry Council (OCC). Publication date not stated. Checked .
- Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing — Y. Benjamini and Y. Hochberg, Journal of the Royal Statistical Society: Series B 57(1): 289–300 (Oxford Academic). Published 1995. Checked .
- The Jackknife and the Bootstrap for General Stationary Observations — H. R. Künsch, The Annals of Statistics 17(3): 1217–1241. Published 1989. Checked .
- 17 CFR § 4.41: Advertising by commodity pool operators, commodity trading advisors, and the principals thereof — Code of Federal Regulations, Title 17 (Cornell Law School LII). Publication date not stated. Checked .
For the product’s calculation and data boundaries, read Prism’s methodology.
Check a level on your own chart.
Membership is required for live SPY, QQQ and IWM books. The figures on this page are recorded history, not a live book.
Create an account to save your layout; review current access conditions on the pricing page.