← All ideas
#038Mean reversionSwing

The 1% rule: S&P 500 and VIX moved in the same direction on the day

If the S&P 500 and VIX both rose 1% or more on the day, Dylan O'Neal expects a pullback and sells from resistance. If both fell 1%, the author expects a bounce from support. We set the levels, stop and exit.

Chart Fanatics · Dylan O'Neal · Watch video

Markets

Indices, Futures

Timeframe

D1, M15

Data

OHLC, Session times

Rules

Partly formalised

Difficulty

Medium

Status

Untested

Some rules were added by us and are marked in the text.

TradingView has pitfalls
EasyLanguage has pitfalls
MetaTrader 5 needs data or workarounds

Idea in brief

The S&P 500 and VIX usually move in opposite directions. The index falls, demand for puts rises, VIX goes up. The index rises, fear fades, VIX goes down. Dylan O'Neal, an S&P futures trader, suggests watching for days when this relationship breaks.

If on the day S&P futures rose 1% or more and VIX also rose 1% or more, the author believes the pressure on the market is too high and the rally is likely to break. The author looks for resistance on the S&P and sells from it. The mirror case: if both fell 1% or more, a bounce is more likely, and the author buys from support. The change is measured against yesterday's close.

The author calls this a hint, not a system. Resistance and support are chosen by hand, and the stop goes beyond the nearest extreme. Below are a daily version to test the anomaly itself and an intraday version with a level that can be calculated.

Why it might work

The author's explanation is based on options. VIX reflects the expected 30-day volatility of the S&P 500, which is derived from option prices. When funds buy puts for protection, VIX rises. If the index is rising at the same time, large players are hedging on the way up. In the author's view, such a rally is hard to sustain.

The second part of the explanation concerns algorithms. According to the author, almost all S&P futures volume goes through algorithms whose buy and sell programs react to VIX. That is why the author considers VIX the leading series: if VIX fell 1% together with the index, the author expects a bounce because of VIX, not the other way around.

We have not verified the share of algorithms or their link to VIX. The author gives no statistics on the 1% rule and only says that such days do not happen often.

The rule comes with a caveat from the author. When the S&P is at all-time highs or at a one-to-two-year high, VIX hits a natural floor. Puts are cheap, funds willingly buy protection, and VIX creeps up together with the market. The author calls this a false signal and does not sell in that situation.

Rules

Signal (author)

// ES: S&P 500 futures (or the SPX index), VIX: the volatility index
// "yesterday's close" for each series is taken at its official closing time
ES_Prev  = ES close yesterday at 16:00 ET        // Finetiq: closing time of the S&P 500 cash index; the author says "yesterday's close" without naming the hour
VIX_Prev = VIX close yesterday at 16:15 ET       // Finetiq: VIX daily close; the index is calculated until 16:15 ET while SPX options trade

ES_Chg  = ES  / ES_Prev  - 1
VIX_Chg = VIX / VIX_Prev - 1

AnomalyUp   = ES_Chg >= +1% AND VIX_Chg >= +1%   // author: pressure, expect a pullback down
AnomalyDown = ES_Chg <= -1% AND VIX_Chg <= -1%   // author: expect a bounce up

// author's filter: near highs VIX hits a floor, the sell is not traded
AtHigh = High(ES) today >= Highest(High(ES), 252)   // author: ATH or a one-to-two-year high; Finetiq: 252 days
IF AnomalyUp AND AtHigh THEN skip the sell signal
// the author makes no such caveat near lows

Variant A. Daily test of the anomaly (Finetiq)

This version needs no levels. It answers the question of whether the anomaly itself carries information.

// daily bars, decision after the VIX close at 16:15 ET
IF AnomalyUp AND NOT AtHigh
    SELL SHORT AT NEXT BAR OPEN               // Finetiq
IF AnomalyDown
    BUY AT NEXT BAR OPEN                      // Finetiq

StopLoss = EntryPrice ± 1.5 * ATR(14)         // Finetiq: starting value
IF BarsSinceEntry >= 3 THEN EXIT AT NEXT BAR OPEN
// Finetiq: the author speaks of a bounce "sooner rather than later" but names no time frame

Variant B. Intraday from a level (author's rule, Finetiq levels)

// 15-minute ES bars, conditions are checked at the close of each bar from 09:45 to 15:00 ET
// historical VIX is calculated in the US regular session, so there is no signal before 09:30 ET

IF AnomalyUp for the first time today AND NOT AtHigh
    Level = today's ES high at the time of the signal     // Finetiq: substitute for the resistance the author draws by hand
    SELL SHORT LIMIT at Level                             // author: sell from resistance
    StopLoss = Level + 0.25 * ATR(14, D1)                 // Finetiq; the author places the stop beyond the extreme
    Target   = EntryPrice - 2 * (StopLoss - EntryPrice)   // Finetiq: based on the author's example from another setup

IF AnomalyDown for the first time today
    Level = today's ES low at the time of the signal      // Finetiq
    BUY LIMIT at Level                                    // author: buy from support
    StopLoss = Level - 0.25 * ATR(14, D1)                 // Finetiq
    Target   = EntryPrice + 2 * (EntryPrice - StopLoss)   // Finetiq

CANCEL LIMIT at 15:30 ET                                  // Finetiq
EXIT at 15:55 ET                                          // Finetiq
// the author accepts any level: horizontal, Fibonacci, moving average, VWAP, order flow
// entry when the level is crossed, without waiting for the candle to close (author, trade review)

Parameters

Parameter Value Source
S&P change threshold 1% versus yesterday's close author
VIX change threshold 1% versus yesterday's close author
Trade direction against the S&P move author
Highs filter no sell at an ATH or a one-to-two-year high author
High window 252 days Finetiq
Hour of "yesterday's close" S&P 500 16:00 ET, VIX 16:15 ET Finetiq
Variant A: stop 1.5 × ATR(14) Finetiq
Variant A: holding period 3 days Finetiq
Variant B: level day's high or low at the time of the signal Finetiq
Variant B: stop 0.25 × daily ATR(14) beyond the level Finetiq
Variant B: target 2 stop distances Finetiq
Variant B: window signal 09:45-15:00 ET, exit 15:55 ET Finetiq

What to test

  1. Does VIX add anything beyond the index move. Take all days when the S&P rose 1% or more. Split them into days when VIX also rose 1% and days when VIX fell. Compare S&P returns 1, 3 and 5 days later. Do the same for declines. If the groups do not differ, the rule comes down to ordinary reversion after a strong day.
  2. Frequency and clusters. Count signals by year. The author says such days are rare. If most signals fall into a couple of crisis periods, the sample is smaller than it looks.
  3. Threshold neighborhood. 0.5%, 1%, 1.5% and 2%, separately for the S&P and for VIX. Daily VIX changes are usually several times larger than those of the index, so 1% for VIX may turn out to be almost any rise. A separate run with the S&P threshold as a fraction of the expected move under the author's rule of 16: VIX / 16.
  4. Which VIX. The spot VIX index versus the front VX future. They diverge historically, especially on expiration and roll days. Separately, compare the VIX close at 16:15 ET with the VIX value at 16:00 ET: in those 15 minutes the cash index is already closed, while VIX still moves with SPX options.
  5. Highs filter. Sells with and without the filter, windows of 252 and 504 days. This tests the author's caveat about the natural floor of VIX.
  6. Entry from a level versus entry at the open. Variant A versus variant B, and versus a limit at yesterday's high or low. If waiting for a level does not improve the average trade, the discretionary part of the rule adds nothing.
  7. Intraday costs. In variant B the stop is tight, and slippage on the stop on high-volatility days eats a noticeable share of the result. Run the test with 1-2 ticks of slippage.

Platform notes

TradingView (Pine Script)

  • The strategy trades the chart symbol (ES or SPY), and VIX is read as data: request.security("CBOE:VIX", "D", close). Yesterday's close without lookahead: request.security("CBOE:VIX", "D", close[1], lookahead = barmerge.lookahead_on).
  • The ES1! daily bar follows the CME session from 18:00 ET and closes later than VIX. The "daily" change on such a bar does not match the change against 16:00 ET. For an exact version, calculate the 16:00 ET close from intraday bars with time(timeframe.period, "0930-1600", "America/New_York"). The CBOE:VIX daily bar should close on the 16:15 ET value. Check it against the published Cboe close over several days: the VIX closing time can differ between data vendors.
  • In variant B the limit from the level and the stop can both fill within one 15-minute candle. The tester does not know their order: use use_bar_magnifier = true (paid plans) or test on a lower timeframe.

MultiCharts and TradeStation (EasyLanguage)

  • VIX is added as a second data stream (Close of Data2), and orders are sent only to Data1. In TradeStation the index is usually called $VIX.X; in MultiCharts the symbol depends on the data provider.
  • ES trades almost around the clock, VIX only in the regular session. If Data1 uses the full session, ES's "yesterday's close" will be at 17:00 ET. Give ES a 09:30-16:00 ET session template or store the 16:00 ET close yourself. VIX (Data2) needs a session template ending at 16:15 ET, otherwise the daily bar closes on the 16:00 ET value. Check your data vendor's VIX closing time against the published Cboe close.
  • A futures daily bar in TradeStation closes at settlement, not at the last trade. For the daily variant, use the same kind of bar in testing and in trading.
  • Sell short next bar at Level limit lives one bar. In variant B the limit is sent on every bar until 15:30 ET while there is no position.

MetaTrader 5 (MQL5)

  • Most brokers do not offer the spot VIX index. If a VIX symbol exists, it is usually a CFD on VX futures with rolls: a different level, jumps at contract changes and a different daily change. A signal on such a series has to be tested again.
  • For historical testing, VIX can be loaded as a custom symbol (CustomSymbolCreate, CustomRatesUpdate). Live trading still needs an external quote source.
  • An S&P 500 CFD daily bar closes at midnight broker server time (often GMT+2/+3, which is around 17:00 ET), not at 16:00 ET. Calculate the change against yesterday's close from M15 bars, converting 16:00 ET (S&P 500) and 16:15 ET (VIX) into server time with daylight saving time taken into account.
  • The second symbol is read via iClose(symbol, PERIOD_M15, 1), and the symbol must be in Market Watch. Take the signal from the closed bar.

Where the idea can break

  • The author shows no statistics. The rule is presented as a working hint on a channel where the video is sponsored by a prop firm, and the middle of the episode contains an ad for funding futures traders.
  • The author picks resistance and support levels by hand, using several tools at once. Our automatic substitute (the day's extreme) may select different trades.
  • Signals are rare and most likely cluster in periods of high volatility. Several years of a calm market may produce no signals at all, and the test result will rest on a couple of crises.
  • The explanation through the share of algorithms and their link to VIX is not backed by a source. If the link is weaker than the author says, the anomaly may mean nothing.
  • Take each series' close at its own time: S&P 500 at 16:00 ET, VIX at 16:15 ET. Futures and CFDs close differently, and the 1% threshold picks out different days on different series. Check the VIX daily closing time at your data vendor. A retail trader in MetaTrader 5 usually has no spot VIX.

Sources

Author's claims

These figures and statements are the author's. We have not verified them.

  • According to the author, about 90% of S&P 500 futures volume in the US comes from algorithms, and their buy and sell programs are tied to the VIX price. The video does not name a source for the figure.
  • The rule of 16 as the author puts it: VIX divided by 16 gives the expected daily move of the S&P 500 in percent over the next 30 days. VIX 32 means about 2% a day, VIX 64 about 4%.

Related ideas

Updated: 2026-09-10