Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
research · 234 min read
Which endpoint signals helped? 30 light backtests across six options strategies
Thirty endpoint-derived signal rules tested across six options strategies on SPY, QQQ and IWM, 2020 to 2025: a ranked matrix with Sharpe, drawdown and controls, a selected-versus-rejected test for every rule, 30 research profiles with trade ledgers, and a reproducible research pack.
Does an endpoint signal help you choose better trades? We tested 30 fixed rules built from FlashAlpha endpoint ingredients on SPY, QQQ and IWM options from 2020 to 2025. Each rule selected entry dates for the same six option structures, which gives 180 signal-and-trade combinations, each measured on the dates the rule selected against the dates it rejected.
The carry proxy selected put spreads averaging +0.25% per trade with an annualized monthly Sharpe of 1.84, against +0.07% and 0.01 for the same spread on every date the signal could be computed. Positive GEX did not rescue the iron condor: -0.21% on 37 selected dates. The highest average belonged to long calls in a positive delta-exposure state, +0.53% on 69 trades, but its selected-minus-rejected range still included zero. No rule cleared that bar; three fell entirely below it.
This follows the options-strategy backtest. That study compared payoffs on identical months. This one asks whether a signal improves when to enter them, on the same trade ledger, with the same risk metrics, priced from FlashAlpha's options archive, the same data behind the Historical API.
These are reconstructed endpoint ingredients with explicit research rules, not historical records of the production API scores. The 30 tests draw on ingredients associated with 32 of the 93 documented routes. Shared inputs count once; the remaining 61 routes are listed in the coverage ledger with the reason they were not tested.
Revision 2. The first edition, published earlier the same day, read every open-interest feature from the trade's own expiry, usually a weekly holding a median 6,157 contracts of open interest, with zero archived OI in 46 of 133 windows. This edition reads them from the monthly carrying the most open interest (median 1.7 million contracts). Rules, thresholds and trades are unchanged. The revision table shows what moved.
30
fixed signal rules
6
option structures
133
shared ETF-month windows
180
signal-and-trade cells
798
distinct option trades
Read this before the ranking
The number: average P&L after bid/ask spreads and $0.65 per contract each way, as a percentage of the value of 100 shares of the ETF at entry. On a $500 ETF, +0.20% is $100 per trade. It is not a return on margin or premium. The ledger CSVs keep basis points; 1 bp is 0.01%.
The schedule: select at the first monthly close, enter at the next close and exit ten sessions later. Front options target 35 days to expiry; calendars also use a back expiry near 65 days. No stops or rolls.
The sample: the six structures share 133 eligible ETF-month windows across 65 calendar months. Missing signal inputs reduce a rule's sample further. Within a row of the matrix, all six structures use exactly the same dates. Different rows can use different dates, so each row carries its own control.
The controls: compare a selected trade with the same structure on all feature-valid dates (the unfiltered control) and on the rejected dates. A higher selected average can still mean giving up profitable trades, so the download also reports P&L per eligible window with skipped windows set to zero.
Risk metrics: Sharpe, profit factor and max drawdown use the definitions from the strategy article: a monthly series averaged across the ETFs traded that month, Sharpe as its mean over its standard deviation times the square root of 12 with no risk-free rate, drawdown on the running total of that series. Small samples make all three fragile.
The scope: rankings are descriptive. Thresholds were fixed before the first run but after reading the earlier study, and the expiry rule was revised after the first run. There is no untouched holdout. Thirty related gates and six payoffs create many chances to find an attractive result.
Signal-and-trade profiles, ranked by Sharpe
These 22 profiles each selected at least 30 trades. That is a display cutoff, not evidence of statistical adequacy. Each rule's primary trade was chosen before calculating the results. Rank sorts the annualized monthly Sharpe of the selected trades; Rank by mean shows the order by average result. The last two columns say whether the gate beat its own control and its own rejected dates.
Running total per eligible month, 2020 to 2025, in % of the 100-share reference value (not compounded, skipped months add zero). Solid lines are the four best profiles by Sharpe on their selected dates; dashed lines are the unconditional long call and bull put spread on all 133 shared windows.
Carry score 60 (BPS)DEX positive (LC)IV/RV 1.2x (BPS)VIX - SPX RV 5 (BPS)Long call, every windowBull put spread, every window
Risk detail for the same profiles
Same order, same rows. Sharpe rewards steady monthly results over a few large wins: the carry proxy leads at 1.84 against 0.01 for the unconditional put spread on the same windows, while the top row by mean, positive delta exposure, is 1.25 against 0.53. Control Sharpe is the same structure on every feature-valid date.
Each cell is the mean after costs, as % of the 100-share value, for the dates the signal selected. Every cell in a row uses exactly the same dates, so the trade count is one number per row. Rows follow the Sharpe order of the ranked table; rows with fewer than 30 trades come last and are marked so you can see where the evidence runs out. A dash means no selected trades.
LC long call, BCS bull call spread, BPS bull put spread, IC iron condor, CC call calendar, LS long straddle. Grey rows have fewer than 30 trades.
* fewer than 30 trades. Unfiltered reference on all 133 shared windows: long call +0.31%, bull call spread +0.10%, bull put spread +0.09%, iron condor -0.10%, call calendar -0.17%, long straddle -0.18%. Use each row's own control in the download for a sample-matched comparison. Matrix CSV
Did the gate help? Selected minus rejected, with 95% ranges
This is the question the ranking cannot answer on its own. For each rule with at least 30 trades, the dot is the selected average minus the rejected average, and the bar is the 95% month-block bootstrap range of that difference. A bar that stays above zero would say the gate picked better dates than it skipped; none does. A bar that stays below zero says the gate skipped its best dates.
Tick = selected mean minus rejected mean; bar = 95% month-block bootstrap range (1,000 resamples). Darker bars do not cross zero. Axis from -1.69% to +1.29%.
What the results suggest
The highest average is still a bullish option trade. Positive delta exposure selected 69 long calls averaging +0.53%, with Sharpe 1.25 against 0.53 for every eligible call. Its 95% range for the selected mean was -0.08% to +1.15%, and the selected-minus-rejected range was -0.35% to +1.29%. This does not establish predictive power: the rejected calls still averaged +0.05%, so skipping them cost 0.02% per eligible window.
Carry and IV/RV are the research candidates. The carry proxy selected 36 put spreads averaging +0.25%; the IV/RV rule selected 46 averaging +0.19%. Their rejected trades averaged -0.01% and -0.01%, which is why both improve Sharpe (1.84 and 1.00 against 0.01) and cut the drawdown (-1.12% and -1.19% against -6.49%). Counted per eligible window with skips worth zero, the improvement is under 0.01% for both. Both selected-minus-rejected ranges include zero.
A gamma label did not make the condor work. Positive normalized GEX selected 37 condors averaging -0.21%, against -0.10% on all 127 GEX-valid windows; delta-adjusted GEX did no better at -0.19%. Negative GEX selected 90 long straddles averaging -0.29%, worse than the +0.09% on positive-state dates. These one-expiry, lagged-OI proxies do not validate or refute a complete intraday dealer model.
Which expiry you read matters more than the signal. In the first edition, max pain above spot ranked second with +0.67% on 34 calls. Read from the monthly instead of a thin weekly, the same rule selects 42 calls averaging -0.31%, with a selected-minus-rejected range of -1.69% to -0.10%: it skipped the best dates. The exposure family moved from 70-87 usable windows, with 2022 almost absent, to 127-133.
Two liquidity-related filters skipped their best dates. The five-vol-point tail gate selected 103 put spreads averaging 0.00%; its 30 rejected trades averaged +0.38%. The 10% wing-quote filter selected 122 condors averaging -0.12%; the 11 rejected trades averaged +0.16%. Both ranges sit entirely below zero. A rich bought wing makes a credit spread less attractive, and tight quotes coincide with the calm months that condors do not need.
Some attractive numbers have almost no sample. Surface richness selected 2 put spreads, lagged call volume selected 3 calls and the OI pin score selected none, because the proxy never reached 80 on a monthly chain. None of them belongs near a leaderboard on these counts.
The chronological split is a useful check, not a holdout: carry averaged +0.27% on 25 trades in 2020-2023 and +0.21% on 11 in 2024-2025. IV/RV averaged +0.22% on 32 and +0.12% on 14. Both later samples are small. Year, period and ETF slices
Profiles follow the Sharpe order of the ranked table, with the small samples last. Each profile states the rule, the intended exposure, the measured result and the next test. The formula describes this experiment exactly; differences from native endpoint definitions are deliberate and disclosed. IV and RV are decimal annualized volatility unless a formula explicitly multiplies by 100. The tiles are shaded on a common scale per metric; the sparkline is the running total per eligible month, with the same structure on every eligible date as the grey reference.
Carry proxy score at least 60
Trades36
Mean+0.25%
Median+0.43%
Win rate75.0%
Sharpe1.84
Profit factor2.88
Max drawdown-1.12%
Worst trade-2.24%
Running total+5.1% vs +0.1%
Setup Compute round(50 + clip(200*(ATM_IV - RV20), -50, 50)) >= 60 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Uses the vol-carry score's fallback transformation to select put spreads. Production computes RV20 from 60 stored closes with the same sample-standard-deviation formula, so the inputs match; the proxy omits only the percentile branch that production prefers when VRP history exists.
Endpoint ingredients/v1/strategies/vol-carry/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 36 selected trades from 127 feature-valid windows. Mean after costs +0.25%; median +0.43%; win rate 75.0%; worst trade -2.24%. The unfiltered control averaged +0.07% with Sharpe 0.01; rejected dates averaged -0.01%. P&L per eligible window, including zero for skips, was +0.07%, a change of +0.01% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.06% to +0.48%; selected minus rejected is +0.26% with a range of -0.15% to +0.62%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Reconstruct the percentile branch from daily VRP history and compare it with this fallback score on the same dates.
Setup Compute sum(delta*lagged_OI*100*S) / sum(abs(contributions)) > 0 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call when the monthly-expiry delta exposure proxy is positive. Open interest does not reveal whether dealers own or are short those contracts.
Endpoint ingredients/v1/exposure/dex/{symbol}, /v1/exposure/summary/{symbol}, /v1/exposure/sheet/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 69 selected trades from 127 feature-valid windows. Mean after costs +0.53%; median +0.59%; win rate 58.0%; worst trade -4.21%. The unfiltered control averaged +0.31% with Sharpe 0.53; rejected dates averaged +0.05%. P&L per eligible window, including zero for skips, was +0.29%, a change of -0.02% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.08% to +1.15%; selected minus rejected is +0.48% with a range of -0.35% to +1.29%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare against same-date stock exposure and a negative-DEX control.
Setup Compute ATM_IV / RV20 >= 1.20 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells a put spread when implied volatility is rich relative to recent realized volatility. Directional equity exposure remains part of the trade.
Endpoint ingredients/v1/stock/{symbol}/summary, /v1/volatility/{symbol}, /v1/vrp/{symbol}, /v1/vrp/{symbol}/history, /v1/strategies/vol-carry/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 46 selected trades from 127 feature-valid windows. Mean after costs +0.19%; median +0.35%; win rate 73.9%; worst trade -2.24%. The unfiltered control averaged +0.07% with Sharpe 0.01; rejected dates averaged -0.01%. P&L per eligible window, including zero for skips, was +0.07%, a change of 0.00% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.05% to +0.39%; selected minus rejected is +0.20% with a range of -0.16% to +0.57%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Test 1.10 and 1.30 on new data, retaining the original 1.20 rule as the reference.
Setup Compute previous_close_VIX - 100*RV20_SPX >= 5 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells an ETF put spread when lagged VIX exceeds SPX realized volatility. The same macro state is shared by all three ETFs.
Endpoint ingredients/v1/macro/vix-state. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 57 selected trades from 133 feature-valid windows. Mean after costs +0.09%; median +0.26%; win rate 66.7%; worst trade -2.36%. The unfiltered control averaged +0.09% with Sharpe 0.14; rejected dates averaged +0.08%. P&L per eligible window, including zero for skips, was +0.04%, a change of -0.05% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.16% to +0.30%; selected minus rejected is +0.01% with a range of -0.35% to +0.33%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare SPY alone with QQQ and IWM before treating one SPX state as universal.
Setup Compute 100 * count(prior_month_VRP < current_VRP) / N >= 75 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells a put spread when IV minus RV is high relative to up to 12 earlier monthly observations. At least six prior observations are required. This is not the endpoint daily-history percentile.
Endpoint ingredients/v1/stock/{symbol}/summary, /v1/volatility/{symbol}, /v1/vrp/{symbol}, /v1/vrp/{symbol}/history, /v1/strategies/vol-carry/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 39 selected trades from 122 feature-valid windows. Mean after costs +0.14%; median +0.33%; win rate 76.9%; worst trade -2.24%. The unfiltered control averaged +0.05% with Sharpe -0.05; rejected dates averaged 0.00%. P&L per eligible window, including zero for skips, was +0.05%, a change of 0.00% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.16% to +0.41%; selected minus rejected is +0.14% with a range of -0.25% to +0.52%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Reconstruct daily history and compare a daily percentile with this monthly proxy.
Setup Compute CHEX_this_month - CHEX_previous_month > 0; CHEX=sum(charm*lagged_OI*100) at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call after the charm exposure proxy rises. This is an explicit directional research hypothesis; native charm totals are not a validated buy signal.
Endpoint ingredients/v1/exposure/chex/{symbol}, /v1/exposure/summary/{symbol}, /v1/exposure/sheet/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 57 selected trades from 118 feature-valid windows. Mean after costs +0.38%; median +0.53%; win rate 54.4%; worst trade -4.57%. The unfiltered control averaged +0.22% with Sharpe 0.30; rejected dates averaged +0.08%. P&L per eligible window, including zero for skips, was +0.18%, a change of -0.04% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.32% to +1.13%; selected minus rejected is +0.31% with a range of -0.43% to +1.14%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Hold the contract universe fixed, compare with stock beta and use an untouched period.
Setup Compute ln(S / S_20_sessions_ago) > 0 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys upside after a rising month. This tests continuation, with the long call still carrying bullish market exposure.
Endpoint ingredients/stockquote/{ticker}, /v1/stock/{symbol}/summary. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 71 selected trades from 132 feature-valid windows. Mean after costs +0.30%; median +0.39%; win rate 54.9%; worst trade -4.21%. The unfiltered control averaged +0.30% with Sharpe 0.42; rejected dates averaged +0.31%. P&L per eligible window, including zero for skips, was +0.16%, a change of -0.14% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.27% to +0.82%; selected minus rejected is -0.01% with a range of -0.96% to +0.91%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Match the call against a 50-share position on the same selected dates.
Setup Compute (put25_mid / put25_strike) * 365 / DTE >= 0.12 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Uses a cash-secured-put premium-yield ingredient to select put spreads. Annualized quoted premium is neither expected return nor the return on spread collateral.
Endpoint ingredients/v1/strategies/yield-enhancement/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 76 selected trades from 133 feature-valid windows. Mean after costs +0.15%; median +0.43%; win rate 75.0%; worst trade -3.90%. The unfiltered control averaged +0.09% with Sharpe 0.14; rejected dates averaged 0.00%. P&L per eligible window, including zero for skips, was +0.09%, a change of 0.00% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.15% to +0.41%; selected minus rejected is +0.16% with a range of -0.18% to +0.46%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Test the native cash-secured-put payoff with cash yield and assignment modeled.
Setup Compute ln(S / S_20_sessions_ago) < 0 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys upside after a falling month. This is a mean-reversion hypothesis, not a forecast supplied by the quote endpoint. Its selected dates are exactly the dates the momentum rule rejects.
Endpoint ingredients/stockquote/{ticker}, /v1/stock/{symbol}/summary. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 61 selected trades from 132 feature-valid windows. Mean after costs +0.31%; median +0.77%; win rate 55.7%; worst trade -4.57%. The unfiltered control averaged +0.30% with Sharpe 0.42; rejected dates averaged +0.30%. P&L per eligible window, including zero for skips, was +0.14%, a change of -0.16% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.46% to +1.07%; selected minus rejected is +0.01% with a range of -0.91% to +0.94%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare positive and negative momentum within each year and ETF, then test a new period.
Setup Compute VEX_this_month - VEX_previous_month > 0; VEX=sum(vanna*lagged_OI*100*S) at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call after the exposure proxy rises. The monthly expiry rolls from month to month, so this change mixes contract roll, OI and Greek effects.
Endpoint ingredients/v1/exposure/vex/{symbol}, /v1/exposure/summary/{symbol}, /v1/exposure/sheet/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 59 selected trades from 118 feature-valid windows. Mean after costs +0.09%; median -0.11%; win rate 49.2%; worst trade -4.21%. The unfiltered control averaged +0.22% with Sharpe 0.30; rejected dates averaged +0.36%. P&L per eligible window, including zero for skips, was +0.04%, a change of -0.18% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.56% to +0.72%; selected minus rejected is -0.27% with a range of -1.05% to +0.49%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Decompose changes on a fixed contract universe before interpreting them as hedge demand.
Setup Compute IV_put25 - IV_call25 >= 0.03 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells a put spread when downside IV exceeds upside IV by three volatility points. This research convention is put minus call, stated explicitly because the endpoints differ.
Endpoint ingredients/v1/strategies/skew/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 114 selected trades from 133 feature-valid windows. Mean after costs +0.08%; median +0.32%; win rate 72.8%; worst trade -3.90%. The unfiltered control averaged +0.09% with Sharpe 0.14; rejected dates averaged +0.09%. P&L per eligible window, including zero for skips, was +0.07%, a change of -0.01% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.14% to +0.29%; selected minus rejected is -0.01% with a range of -0.36% to +0.43%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare the three-point gate with stricter gates on new data; inspect whether it excludes any loss months.
Setup Compute (max_pain_strike - S)/S > 0 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call when the monthly-expiry payout-minimizing strike is above spot. A payout minimum does not itself imply a price attraction force.
Endpoint ingredients/v1/maxpain/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 42 selected trades from 133 feature-valid windows. Mean after costs -0.31%; median -0.22%; win rate 45.2%; worst trade -4.57%. The unfiltered control averaged +0.31% with Sharpe 0.46; rejected dates averaged +0.60%. P&L per eligible window, including zero for skips, was -0.10%, a change of -0.41% versus the unfiltered control.
The selected-mean 95% exploratory range is -1.04% to +0.49%; selected minus rejected is -0.91% with a range of -1.69% to -0.10%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare the distance shrinking with plain market appreciation on the same dates.
Setup Compute IV_put10 - mean(IV_ATM_call, IV_ATM_put) >= 0.05 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Selects a put spread when its far-downside wing is expensive. That wing is bought, so the condition does not directly sell the expensive tail.
Endpoint ingredients/v1/strategies/tail-pricing/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 103 selected trades from 133 feature-valid windows. Mean after costs 0.00%; median +0.26%; win rate 68.9%; worst trade -3.90%. The unfiltered control averaged +0.09% with Sharpe 0.14; rejected dates averaged +0.38%. P&L per eligible window, including zero for skips, was 0.00%, a change of -0.09% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.24% to +0.21%; selected minus rejected is -0.38% with a range of -0.72% to -0.04%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare with a structure that sells the measured richness while documenting its changed tail risk.
Setup Compute normalized_GEX < 0 at the signal close. When it passes, enter the long straddle under the common schedule.
Exposure Buys a straddle in a negative-GEX proxy state. The hypothesis is a larger move, but the trade still has to pay for implied volatility and execution.
Endpoint ingredients/v1/exposure/gex/{symbol}, /v1/exposure/summary/{symbol}, /v1/exposure/sheet/{symbol}, /v1/exposure/term-structure/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 90 selected trades from 127 feature-valid windows. Mean after costs -0.29%; median -0.53%; win rate 37.8%; worst trade -2.88%. The unfiltered control averaged -0.18% with Sharpe -0.27; rejected dates averaged +0.09%. P&L per eligible window, including zero for skips, was -0.21%, a change of -0.02% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.69% to +0.13%; selected minus rejected is -0.38% with a range of -0.90% to +0.10%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Score subsequent move size against the entry premium before optimizing the exit.
Setup Compute round(100*(0.7*exp(-(ATM_spread_pct+OI_weighted_spread_pct)/6)+0.3*min(ATM_OI/5000,1))) >= 60 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Selects condors with a high execution-score proxy, using the monthly expiry and lagged OI. High quoted liquidity does not establish positive expected P&L.
Endpoint ingredients/v1/liquidity/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 44 selected trades from 132 feature-valid windows. Mean after costs -0.08%; median +0.07%; win rate 56.8%; worst trade -3.14%. The unfiltered control averaged -0.09% with Sharpe -0.72; rejected dates averaged -0.10%. P&L per eligible window, including zero for skips, was -0.03%, a change of +0.07% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.31% to +0.14%; selected minus rejected is +0.02% with a range of -0.24% to +0.28%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Verify which depth and OI conventions the native score uses before testing a new threshold.
Setup Compute ATM_IV * sqrt(14/365) / abs(S / S_10_sessions_ago - 1) >= 1.5 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when a two-week implied move exceeds the previous ten-session net move. A small net move can conceal a volatile path.
Endpoint ingredients/v1/expected-move/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 78 selected trades from 132 feature-valid windows. Mean after costs -0.11%; median +0.03%; win rate 53.8%; worst trade -3.14%. The unfiltered control averaged -0.10% with Sharpe -0.72; rejected dates averaged -0.08%. P&L per eligible window, including zero for skips, was -0.07%, a change of +0.03% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.33% to +0.09%; selected minus rejected is -0.04% with a range of -0.33% to +0.25%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Replace the previous net move with realized path volatility and keep the payoff unchanged.
Setup Compute ATM_IV^2 - RV20^2 > 0 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when implied variance exceeds trailing realized variance. The same premium condition can behave differently on the put and call sides.
Endpoint ingredients/v1/stock/{symbol}/summary, /v1/volatility/{symbol}, /v1/vrp/{symbol}, /v1/vrp/{symbol}/history, /v1/strategies/vol-carry/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 88 selected trades from 127 feature-valid windows. Mean after costs -0.09%; median +0.02%; win rate 51.1%; worst trade -2.07%. The unfiltered control averaged -0.11% with Sharpe -0.81; rejected dates averaged -0.15%. P&L per eligible window, including zero for skips, was -0.07%, a change of +0.04% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.25% to +0.05%; selected minus rejected is +0.05% with a range of -0.29% to +0.42%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Separate put-side and call-side P&L before adding another volatility threshold.
Setup Compute ATM_IV / EWMA_vol >= 1.20; h = 0.94*h + 0.06*r^2 at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells a put spread against a volatility estimate that weights recent squared returns more heavily. It tests whether replacing the RV denominator improves selection.
Endpoint ingredients/v1/volatility/forecast/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 41 selected trades from 116 feature-valid windows. Mean after costs -0.02%; median +0.16%; win rate 58.5%; worst trade -2.24%. The unfiltered control averaged +0.05% with Sharpe -0.08; rejected dates averaged +0.09%. P&L per eligible window, including zero for skips, was -0.01%, a change of -0.06% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.37% to +0.28%; selected minus rejected is -0.11% with a range of -0.48% to +0.29%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Hold the dates fixed when comparing EWMA and sample-standard-deviation RV.
Setup Compute max((ask-bid)/mid for C25,C10,P25,P10) <= 0.10 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Selects condors with four relatively tight signal-day wing quotes. It is an execution condition, not a directional forecast or a promise about exit spreads.
Endpoint ingredients/v1/liquidity/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 122 selected trades from 133 feature-valid windows. Mean after costs -0.12%; median +0.03%; win rate 53.3%; worst trade -3.14%. The unfiltered control averaged -0.10% with Sharpe -0.72; rejected dates averaged +0.16%. P&L per eligible window, including zero for skips, was -0.11%, a change of -0.01% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.28% to +0.04%; selected minus rejected is -0.28% with a range of -0.59% to -0.02%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Track entry and exit spreads separately; check which dates the signal-day filter removes.
Setup Compute RV5 / RV20 < 1 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when recent close-to-close volatility is below its longer baseline. The question is whether calmer recent prices predict a quieter holding period.
Endpoint ingredients/v1/stock/{symbol}/summary, /v1/volatility/realized/{symbol}, /v1/volatility/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 70 selected trades from 127 feature-valid windows. Mean after costs -0.21%; median +0.02%; win rate 51.4%; worst trade -3.14%. The unfiltered control averaged -0.11% with Sharpe -0.81; rejected dates averaged +0.01%. P&L per eligible window, including zero for skips, was -0.11%, a change of 0.00% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.46% to +0.01%; selected minus rejected is -0.21% with a range of -0.53% to +0.07%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare the subsequent realized move with the entry straddle price on selected and rejected dates.
Setup Compute sum(sign*abs(delta)*gamma*lagged_OI*100*S^2*0.01) > 0 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when delta-weighted gamma exposure is positive. It changes which strikes matter relative to ordinary GEX.
Endpoint ingredients/v1/exposure/sheet/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 71 selected trades from 127 feature-valid windows. Mean after costs -0.19%; median -0.12%; win rate 42.3%; worst trade -2.07%. The unfiltered control averaged -0.10% with Sharpe -0.74; rejected dates averaged +0.02%. P&L per eligible window, including zero for skips, was -0.11%, a change of -0.01% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.34% to -0.04%; selected minus rejected is -0.21% with a range of -0.48% to +0.06%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Compare DAG and GEX on exactly the same dates, especially where their signs disagree.
Setup Compute sum(sign*gamma*lagged_OI*100*S^2*0.01) / sum(abs(contributions)) > 0 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor in a positive-GEX proxy state. The proxy reads one expiry, the monthly carrying the most open interest, with lagged settled OI; it does not establish actual dealer positions.
Endpoint ingredients/v1/exposure/gex/{symbol}, /v1/exposure/summary/{symbol}, /v1/exposure/sheet/{symbol}, /v1/exposure/term-structure/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 37 selected trades from 127 feature-valid windows. Mean after costs -0.21%; median -0.16%; win rate 40.5%; worst trade -1.96%. The unfiltered control averaged -0.10% with Sharpe -0.74; rejected dates averaged -0.05%. P&L per eligible window, including zero for skips, was -0.06%, a change of +0.04% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.41% to -0.01%; selected minus rejected is -0.15% with a range of -0.39% to +0.07%. Neither range adjusts for trying multiple signals or uncertain data vintages.
Test next Repeat with all expirations, verified OI availability and a hedge-flow interpretation fixed in advance.
Setup Compute (IV_put25 + IV_call25)/2 - ATM_IV >= 0.01 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when the 25-delta wings are rich relative to ATM. Both short wings and purchased protection influence the result.
Endpoint ingredients/v1/volatility/skew-term/{symbol}, /v1/volatility/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 4 selected trades from 133 feature-valid windows. Mean after costs +0.09%; median +0.21%; win rate 75.0%; worst trade -0.36%. The unfiltered control averaged -0.10% with Sharpe -0.72; rejected dates averaged -0.10%. P&L per eligible window, including zero for skips, was 0.00%, a change of +0.10% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.36% to +0.32%; selected minus rejected is +0.20% with a range of -0.20% to +0.46%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Expand the sample before interpreting the mean; retain the same one-point threshold.
Setup Compute lagged_monthly_expiry_call_volume / put_volume >= 1.5 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call after call volume exceeds put volume. The counts include both buyers and sellers, use a two-session lag, and are not classified aggressor flow.
Endpoint ingredients/v1/strategies/flow-anomaly/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 3 selected trades from 133 feature-valid windows. Mean after costs +1.07%; median +1.38%; win rate 66.7%; worst trade -2.71%. The unfiltered control averaged +0.31% with Sharpe 0.46; rejected dates averaged +0.29%. P&L per eligible window, including zero for skips, was +0.02%, a change of -0.29% versus the unfiltered control.
The selected-mean 95% exploratory range is -2.71% to +4.54%; selected minus rejected is +0.77% with a range of -3.04% to +4.22%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Reconstruct trade classification and compare signed flow with unsigned volume.
Setup Compute sum(call_OI_lag2 - call_OI_lag3) - sum(put_OI_lag2 - put_OI_lag3) > 0 at the signal close. When it passes, enter the long call under the common schedule.
Exposure Buys a call when matched-contract call OI increases more than put OI. Opening contracts can represent hedges, spreads or outright positions.
Endpoint ingredients/v1/exposure/narrative/{symbol}, /v1/exposure/oi-diff/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 26 selected trades from 133 feature-valid windows. Mean after costs +0.73%; median +1.05%; win rate 65.4%; worst trade -3.47%. The unfiltered control averaged +0.31% with Sharpe 0.46; rejected dates averaged +0.21%. P&L per eligible window, including zero for skips, was +0.14%, a change of -0.17% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.29% to +1.60%; selected minus rejected is +0.52% with a range of -0.45% to +1.36%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Require documented OI release times and separate expiry rolls from new positions.
Setup Compute IV_back_call50 - IV_front_call50 <= -0.02 at the signal close. When it passes, enter the call calendar under the common schedule.
Exposure Buys the back-month call and sells the front-month call when front IV is richer. The hoped-for convergence can still be outweighed by spot movement and spreads.
Endpoint ingredients/v1/strategies/term-structure/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 9 selected trades from 133 feature-valid windows. Mean after costs -0.14%; median 0.00%; win rate 44.4%; worst trade -0.80%. The unfiltered control averaged -0.17% with Sharpe -2.19; rejected dates averaged -0.17%. P&L per eligible window, including zero for skips, was -0.01%, a change of +0.16% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.50% to +0.24%; selected minus rejected is +0.04% with a range of -0.33% to +0.42%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Measure front-leg and back-leg P&L separately and test more eligible dates.
Setup Compute abs(max_pain_strike - S)/S <= 0.01 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor when spot is near the payout-minimizing strike. The ten-session exit occurs before expiry, when the pinning hypothesis may matter most.
Endpoint ingredients/v1/maxpain/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 15 selected trades from 133 feature-valid windows. Mean after costs -0.14%; median -0.13%; win rate 46.7%; worst trade -1.23%. The unfiltered control averaged -0.10% with Sharpe -0.72; rejected dates averaged -0.09%. P&L per eligible window, including zero for skips, was -0.02%, a change of +0.08% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.55% to +0.26%; selected minus rejected is -0.04% with a range of -0.45% to +0.38%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Test an expiry-aligned holding period as a separate experiment.
Setup Compute round(100*clip(max(0,1-5*abs(S-KmaxOI)/S)*(0.7+0.3*OI_concentration),0,1)) >= 80 at the signal close. When it passes, enter the iron condor under the common schedule.
Exposure Sells an iron condor only when the monthly-expiry OI concentration proxy is high. It is neither a calibrated pin probability nor a 0DTE replay.
Endpoint ingredients/v1/strategies/expiry-positioning/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample No selected trades from 133 feature-valid windows. There is no estimated win rate or trade return. Zero activity is not evidence of a profitable signal.
Test next Study score coverage before changing the threshold; do not choose a replacement from these outcomes.
Setup Compute mean(observed_put_IV - SVI_fitted_IV) >= 0.01 for 0.8*S <= K < S at the signal close. When it passes, enter the bull put spread under the common schedule.
Exposure Sells a put spread when at least five clean OTM put quotes exceed the saved SVI fit. The saved fit is a historical reconstruction with unverified original publication time.
Endpoint ingredients/v1/surface/{symbol}, /v1/surface/svi/{symbol}, /v1/adv_volatility/{symbol}, /v1/strategies/surface-anomaly/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 2 selected trades from 133 feature-valid windows. Mean after costs +0.52%; median +0.52%; win rate 100.0%; worst trade +0.19%. The unfiltered control averaged +0.09% with Sharpe 0.14; rejected dates averaged +0.08%. P&L per eligible window, including zero for skips, was +0.01%, a change of -0.08% versus the unfiltered control.
The selected-mean 95% exploratory range is +0.19% to +0.86%; selected minus rejected is +0.45% with a range of 0.00% to +0.91%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Verify fit vintages and fit quality, then test quote-level residuals on a larger sample.
Setup Compute IV_back_call50 - IV_front_call50 >= 0.02 at the signal close. When it passes, enter the call calendar under the common schedule.
Exposure Buys the back-month call and sells the front-month call when the back is richer. This is a fixed-maturity research gate, not the native earliest-to-latest curve.
Endpoint ingredients/v1/strategies/term-structure/{symbol}. This experiment reconstructs the stated ingredient and gate; it does not replay the full native response.
In the sample 4 selected trades from 133 feature-valid windows. Mean after costs -0.75%; median -0.71%; win rate 0.0%; worst trade -1.55%. The unfiltered control averaged -0.17% with Sharpe -2.19; rejected dates averaged -0.15%. P&L per eligible window, including zero for skips, was -0.02%, a change of +0.15% versus the unfiltered control.
The selected-mean 95% exploratory range is -0.99% to -0.01%; selected minus rejected is -0.59% with a range of -0.89% to +0.18%. With fewer than 30 trades, treat this as a small-sample illustration; the ranges are particularly fragile.
Test next Compare with the opposite slope using a broader sample and matched strikes.
The first edition read open interest, volume and Greeks for the exposure, max-pain, pin, volume, OI-shift and execution rules from the same expiry as the trade: the expiry nearest 35 days. On SPY that is usually a Monday or Wednesday weekly. Across the 133 shared windows it held a median 6,157 contracts of open interest against a median 1.7 million on the monthly, and the archive records zero open interest for it in 46 windows, all in 2020-2022. Those windows dropped out as "feature unavailable", so the ten affected rules were measured on 70-87 windows with the 2022 bear market almost absent, and their long-call control sat at +0.51% to +0.62% against +0.31% on the full sample. That, not the signals, put four of them at the top of the first ranking.
Revision 2 reads those features from the expiry carrying the most lagged open interest within 30-60 days of the signal, which is the monthly in every window (median 46 days to expiry). The trade itself, the quote-derived rules, the thresholds, costs, lags, cohort and bootstrap are unchanged. This change was made after the first results were known, which is one more reason to treat the study as exploratory.
Every trade and every signal in this article was priced from FlashAlpha's options archive: end-of-day bid and ask quotes, implied volatility, Greeks and open interest for the contracts in each month's chain, plus underlying closes, SVI fits and macro closes. The Historical API serves the same archive at one-minute resolution, back to January 3, 2017 for SPY, QQQ, IWM and eleven other symbols, with 8+ years of history on 54 symbols and 204 symbols in total.
This study
Three ETFs, one signal a month at the close, ten-session exit
Signals rebuilt from end-of-day chains, lagged OI and saved fits
Thirty fixed proxies for 32 routes, one expiry per feature
No intraday state, no classified flow, no 0DTE
With the Historical API
Any minute since 3 January 2017: test the signal at 10:30 and the exit at 15:30, or any schedule
The native scores themselves, replayed leak-free with ?at=: /v1/exposure/gex, /v1/maxpain, /v1/vrp, /v1/strategies/vol-carry, /v1/liquidity, /v1/expected-move
GET /v1/optionquote/{symbol}?at= returns every leg's bid, ask, implied volatility, Greeks and open interest at that minute, all expiries
204 symbols, 54 with 8+ years of history, unlimited daily requests on the Alpha plan
The Historical API is part of the Alpha plan, from $1,199/mo, with unlimited daily requests on the same key as the live API.
Trade accounting. We reuse the prior study's exact option trade outcomes, then independently check their raw quotes and cash flows. Long call buys a 50-delta call; bull call spread buys 50 and sells 25; bull put spread sells 25 and buys 10; condor sells 25-delta wings and buys 10-delta protection; calendar sells the ATM front call and buys the same strike in the back expiry; straddle buys an ATM call and put. Delta tolerance is 0.10. Buys pay ask, sells receive bid, plus $0.65 per contract per side.
Quote and date selection. The baseline requires positive uncrossed quotes on signal, entry and exit dates, displayed size for the trade and a signal spread at most the larger of $0.10 or 30% of midpoint. Windows spanning ex-dividend dates are excluded where the structure has a short call. The common six-structure cohort inherits those exclusions, including for long-only structures. Missing future quotes also exclude trades, so the retained sample can be biased.
Signal inputs. Read-only archive extracts contain signal-day option IV/Greeks and full strikes for expirations 30-80 days out, lagged option OI/volume, saved SVI fits and macro closes. Quote-derived rules (ATM IV, skew, tail, wings, term slope, put yield, wing spreads, surface residuals) read the trade's own front expiry, nearest 35 days within 30-45. OI-based rules (exposure, DAG, vanna and charm changes, max pain, pin score, call/put volume, OI shift, execution score) read the expiry carrying the most lagged open interest within 30-60 days, the monthly. Neither is an all-expiry model. Quote-derived IV requires 1%-300% decimal-vol bounds expressed as 0.01-3.00, valid quotes and the same spread check. No rejected selected contract is replaced with an easier quote.
Open interest. OI and option volume come from two observed trading sessions before the signal, and OI changes compare that day with the preceding session. Exact duplicate OI records are collapsed; conflicting duplicates abort the run. Greek exposure requires matched, valid Greeks covering at least 90% of lagged OI for the chosen expiry. These availability lags reduce same-day leakage risk but do not certify the original data publication vintage. Call-positive/put-negative GEX is a convention, not an observation of who holds the positions.
Volatility. RV5/RV20 use sample standard deviation of the last 5/20 unadjusted log returns, annualized by sqrt(252), the same formula the production vol-carry score applies to its stored closes. EWMA uses 60 returns, starts from the mean square of the first 20 and updates the remaining 40 with lambda 0.94. It is a fixed EWMA experiment, not a HAR/GARCH forecast replay. ATM IV is the mean of the nearest-spot call and put IV. Term slope uses the 50-delta calls in front and back expiries. Macro VIX and the 21 SPX closes needed for RV all precede the signal date.
Surface and changes. Surface residuals use the saved signal-date SVI forward and parameters, with w(k)=a+b[rho(k-m)+sqrt((k-m)^2+sigma^2)] and fitted IV=sqrt(w/T). Negative fitted variance is rejected; at least five clean OTM puts are required. SVI vintages are not certified. Vanna/charm changes compare consecutive available monthly calculations only when the previous scheduled observation was valid; the monthly expiry rolls, so the universe is not fixed.
Controls and risk metrics. The unfiltered control is the same structure on every feature-valid window of that rule. P&L per eligible window counts skipped windows as zero with no interest; its change versus the control equals minus the rejected trades' total divided by the eligible count, so it is positive exactly when the rejected dates lost money. Sharpe, profit factor and max drawdown follow the strategy article: months are lined up, each month's figure is the mean across the ETFs traded that month, Sharpe is the mean of that series over its standard deviation times sqrt(12) with no risk-free rate, max drawdown is the largest peak-to-trough fall of the running total (not compounded), profit factor is gross gains over gross losses. Control Sharpe applies the same recipe to every eligible window.
Uncertainty. We resample complete calendar months 1,000 times, keeping ETF observations in a month together, with seed 20260917. The mean and selected-minus-rejected intervals are percentile bootstrap summaries. They do not correct for serial dependence, multiple testing, correlated payoffs, retrospective choices or vintage errors. 9,204 selected signal/strategy observations reuse only 798 distinct option trades.
What is missing. Early assignment, margin, collateral interest, financing, taxes, impact and intraday account paths are not modeled. These are EOD historical quote simulations, not continuous account returns or executable track records. No endpoint has established a persistent edge from this exercise.
Which endpoints were not tested?
All 93 documented routes appear in the endpoint coverage matrix. 32 have an ingredient proxy in this experiment; none has been certified as an exact historical production-score replay. The other 61 are not assigned invented returns.
Group
Why it is outside this test
Classified flow and dealer premium
Daily call/put volume does not reproduce aggressor classification, opening/closing state or session flow.
0DTE and pin probabilities
A monthly ten-session trade cannot test a same-day forecast. Intraday paths and correctly timed state are required.
Earnings
Requires event-specific histories and pre-event information vintages. The prior 12-event examples do not validate these signals.
Dispersion, baskets and spot-vol correlation
Requires aligned constituent or daily IV histories beyond this monthly extraction.
Utilities, screeners, reference and account routes
A calculator or metadata response needs an explicit trading hypothesis and historical input universe before it has a return to rank.
Download and reproduce
Complete research pack: raw responses, exact SQL, rules, source hashes, code and results.
Suggested citation: FlashAlpha Research. Which endpoint signals helped? 30 light backtests across six options strategies. 17 September 2026, revision 2. Based on endpoint-light-backtest-v2.
Questions readers ask
Which signal performed best?
By Sharpe ratio, the order of the tables, the carry proxy ahead of a bull put spread, 1.84 on 36 trades. By average result, positive delta exposure ahead of a long call, +0.53% on 69 trades. Neither has a selected-minus-rejected range that clears zero, so neither is evidence of an edge.
What does the percentage mean?
Every result is a percentage of the value of 100 shares of the ETF when the trade was opened. A put spread at +0.25% on a $500 ETF made about $125 on a $50,000 reference position. It is not a return on the option premium, the margin or an account. The ledgers keep basis points, and one basis point is 0.01%.
Did any signal beat taking every trade?
On the selected dates, most did. Counted per eligible window, with skipped dates worth zero, the few rules that came out ahead did so by at most +0.07% per window, and those were condor rules skipping losing months. Every long-call rule skipped profitable months.
Why did max pain fall from second place to last?
Because the first edition read it from a weekly expiry with almost no open interest, on a sample that mostly excluded 2022. Read from the monthly on the full sample, the same rule skipped the best call months. The rule did not change; the input did. The revision table above shows every rule that moved.
Are these the production endpoint scores?
No. They are reconstructed ingredients with fixed research gates, computed from end-of-day archives with lagged open interest. Production scores use live chains, all expiries and, for vol-carry, a percentile branch that this study omits. The coverage ledger lists every route and what was and was not replayed.
Where does the data come from?
From FlashAlpha's options archive, read directly: end-of-day quotes, implied volatility, Greeks and open interest for every contract in each month's chain, plus underlying closes, SVI fits and macro closes. The Historical API serves the same archive at one-minute resolution back to January 2017. The research pack contains the exact SQL, raw responses and hashes.
Where should the next hour of research go?
Start with the carry and IV/RV put-spread ledgers. Their rejected dates were slightly negative, their Sharpe and drawdown improved against the unconditional spread, and their chronological halves point the same way. Check the worst dates, replay the native vol-carry percentile with the Historical API, and test the frozen rule on new months. One successful comparison on new dates would be worth more than another hundred filters.