Article contents
- Evidence and scope
- Illustration
- Process
- A time-specific envelope, not a constant percentage band
- Data alignment determines what was knowable
- Turn the concept into an explicit target-position rule
- Volatility sizing is a separate source of exposure
- Synthetic arithmetic and a failed continuation
- Published evidence and a reproducible comparison
- Common pitfalls
- Practical checklist
- Frequently asked questions
- Research sources
Evidence and scope
The paper reports +1,985% total return, 19.6% IRR, Sharpe 1.33 and 25% maximum drawdown for May 2007–April 2024, including its stated commission and slippage. These are author-reported results; no independent backtest was run here. [1]
Practical workflow
- Prepare historyAlign the previous 14 sessions by clock time and calculate daily volatility.
- Construct bandsAnchor to open and previous close with consistent corporate-action treatment.
- Update VWAPUse only current-session volume already received.
- Evaluate on scheduleSet a long, short or flat target after the checkpoint bar closes.
- Execute and liquidateCharge all position changes and flatten by the session deadline.
- Separate contributionsCompare bands, VWAP and sizing on untouched data.
A time-specific envelope, not a constant percentage band
Opening volatility and lunchtime volatility have different distributions. The noise-band idea measures a normal absolute move from the session open separately at each intraday clock time. A late-morning observation is compared with late-morning observations from earlier sessions, rather than with a rolling sequence of adjacent minutes.
For clock time k, define sigma(d, k) = mean(abs(P(d−j, k)/Open(d−j)−1), j=1…14). Using only completed previous sessions makes the baseline causal. The upper boundary is U(d, k)=max(Open(d), PreviousClose(d))×(1+sigma(d, k)); the lower is L(d, k)=min(Open(d), PreviousClose(d))×(1−sigma(d, k)). The gap-aware anchors make the envelope wider across an overnight gap.
This sigma is a mean absolute displacement, not the standard deviation of minute returns. Replacing it with a conventional rolling volatility indicator changes the signal. A large opening gap also has a different effect from a large move after the open because the anchors and intraday displacement play different roles.
The strategy hypothesis is persistence after price moves beyond usual intraday noise. It can fail when a news spike reverses, when the prior 14 sessions understate current volatility, or when price repeatedly crosses the boundary. None of those outcomes is ruled out by a high-volume breakout.
Data alignment determines what was knowable
The study uses IQFeed minute data. Its reported results include $0.0035 commission and $0.001 slippage per share. [1] Those are explicit assumptions rather than an assurance that every historical order could have executed at that cost.
Construct the historical matrix by exchange session and clock time. Holidays, daylight-saving transitions and shortened sessions need calendar-aware handling. A missing 10:00 observation is not equivalent to a zero return. State whether an incomplete historical session is excluded or whether the current decision is disabled.
Use a consistent corporate-action convention for the open, previous close and historical prices. Mixing an adjusted previous close with an unadjusted current open can manufacture a gap. Store the raw execution series separately from any transformed series used to estimate returns.
Session VWAP must use only received trades or completed bars. A bar-based approximation can use typical price, (H+L+C)/3, weighted by bar volume; it differs from a transaction-level benchmark. The difference should be measured where higher-resolution data are available, especially for bars with a wide range.
Turn the concept into an explicit target-position rule
The proposed implementation below evaluates only at predefined half-hour checkpoints. At a checkpoint, its target is long above max(U, VWAP), short below min(L, VWAP), and flat otherwise. It sends the resulting target after the bar becomes available. This is an explicit research variant; continuous protective exits and scheduled exposure updates must not be silently treated as equivalent.
Between checkpoints, a temporary boundary crossing does not generate a new decision in this variant. If a continuous protective stop is desired, specify it as a separate event-driven rule and test its additional turnover. A strategy with a half-hour entry schedule and tick-level exits has different path dependence from one that changes all exposure only every half hour.
The target is a desired position, not an instruction to add a fresh position repeatedly. Moving from +q shares to −q requires selling 2q shares. Moving from +q to zero requires q shares. Costs should follow the actual position change, including both legs of a reversal.
At the liquidation deadline, flattening takes priority over a new entry signal. In a production specification, cancel unfilled entry orders before requesting the final exit and reconcile fills arriving during the cancellation process.
before_session(d):
bands = build_from_completed_sessions(d, lookback=14)
daily_vol = sample_std(previous_14_daily_returns)
if data_incomplete or not isfinite(daily_vol) or daily_vol <= 0:
disable_session(); return
multiplier = min(4, 0.02 / daily_vol)
shares = floor(previous_equity * multiplier / session_open)
on_completed_bar(k):
if is_liquidation_deadline(k):
cancel_pending_entries(); submit_flat(); return
if session_disabled: return
update_session_vwap()
if is_decision_time(k):
target = 1 if close > max(upper[k], vwap) else (
-1 if close < min(lower[k], vwap) else 0)
submit_target_after_available_at(target * shares)
Volatility sizing is a separate source of exposure
One sizing specification is multiplier = min(4, 0.02/s), where s is the sample standard deviation of the previous 14 completed daily returns. Shares are floor(previous account equity × multiplier / session open). The 2% target and leverage cap belong to this configuration; they are not universal risk recommendations.
When s is zero, missing or nonfinite, disabling the session is safer than allowing division to create unlimited size. A minimum volatility floor would be a different declared rule. The sizing series must be fixed before the session rather than recalculated with the current day's closing return.
The leveraged and unleveraged versions should be shown separately. In the paper, the one-times version reports +380% total return, 9.7% IRR, Sharpe 1.24 and 12% maximum drawdown. [1] The performance difference cannot all be attributed to a better entry signal when the exposure policy has also changed.
Size caps require additional operational constraints. Check buying power, gross notional, broker margin and participation in the execution interval. An exposure rule based on a calm recent period can create large positions immediately before a volatility jump, so gap and delayed-exit stress tests are necessary.
Synthetic arithmetic and a failed continuation
Suppose the previous close is 500, today's open is 505 and sigma at the checkpoint is 0.003. Then U=505×1.003=506.515 and L=500×0.997=498.50. The asymmetry is caused by the opening gap. A symmetric band around 505 would not be the same calculation.
At 10:00, let VWAP be 506.20 and the completed close 506.80. The proposed rule targets long because 506.80 exceeds max(506.515,506.20). If the order fills at 506.86 and exits at 509.00, the price gain is $2.14 per share before costs. The fill is deliberately later and different from the signal close.
In a failed case, the 10:30 close is 506.30, its updated upper band is 506.60 and VWAP is 506.50. The target becomes flat. An exit fill at 506.24 loses $0.62 per share from the 506.86 entry. A prior crossing back below the band does not retroactively supply a better exit to a scheduled-decision implementation.
Test equality and timing explicitly: close exactly on the threshold is flat under strict comparisons; an observation received late cannot use an earlier execution price; and a session with insufficient history cannot produce a fully estimated band. These small cases often explain larger differences between public implementations.
Published evidence and a reproducible comparison
The paper's daily hit ratio is 43%, whereas its trade table reports 37% across 7,668 trades. [1] These denominators answer different questions. Keep IRR, total return, per-trade win rate and profitable-day frequency in separate fields.
The authors' public code article is useful for inspecting VWAP, exposure shifts and mechanics, but the complete example also includes an overnight-gap mean-reversion component. [2] Its combined equity cannot automatically be attributed to the intraday momentum component alone.
A separate public repository README reports an out-of-sample Sharpe of 0.39, annual return 4.8% and maximum drawdown 18.5% for May 2024–March 2026, compared with its in-sample Sharpe of 1.34. Only the README was inspected here; its licensed data and full execution were not independently reproduced. [3]
A useful comparison separates noise bands only, noise bands plus VWAP, and the same signals with volatility sizing. Keep execution, data adjustments and evaluation dates identical. Then report whether VWAP changes entry quality, exit timing, time in market or simply turnover.
Compare daily band arrays and target-position timestamps before returns. Follow with costs at the stated assumptions and stressed costs, one-bar delays, nearby lookbacks and independent market periods. The purpose is to determine which assumptions support the result, not to search until a preferred headline reappears.
Common pitfalls
Replacing the noise statistic without renaming the variant
A mean absolute open-to-time move is not a rolling standard deviation. The substitution changes both threshold scale and economic interpretation.
Giving scheduled signals continuous execution
A backtest can falsely improve exits by using every intrabar crossing while claiming half-hour decisions. Specify both entry and exit event frequencies.
Attributing a combined code example to one component
An example containing gap mean reversion and momentum needs separate attribution before it can validate either component.
Checklist before using this method
Check each item after verifying it on your data. Progress is saved in this browser; it does not certify a profitable strategy.
Frequently asked questions
Is VWAP the same as the upper or lower noise band?
No. VWAP is a volume-weighted current-session price reference; the bands estimate typical displacement from previous sessions at a matching time.
Does the reported Sharpe establish present-day profitability?
No. It describes a particular sample and cost model. Later-period evidence, execution replication and uncertainty must be evaluated separately.
Research sources
Each source supports the definition or evidence described beside it. The pseudocode, synthetic examples and proposed parameters require separate validation.
- Beat the Market: An Effective Intraday Momentum Strategy for S&P500 ETF (SPY)Zarattini, Aziz, Barbon — bản 03/02/2025. Full PDF read, including the version dated 3 February 2025. Tables 3 and 4 appear on physical and printed pages 15 and 16. No new replication was run. Checked: .
- Designing a Profitable Intraday Strategy Using Python and AlpacaConcretum Group. Authors' article and public code read. The complete example includes an additional overnight-gap component and is not automatically a pure momentum replication. Checked: .
- Out-of-Sample Evaluation of an Intraday Momentum Strategy for SPYSheimy Paz Serpa. Repository README inspected only; full licensed inputs and its reported out-of-sample execution were not independently reproduced. Checked: .
Related methods
Risk note
This content supports education and research design, not financial advice. Backtest is historical simulation, does not guarantee future performance and does not place real trades. Methods in this library are not automatically features available in the app. See methodology and learning center.
Validate rules before risking real capital
Check app support, data and individual simulated trades; advanced detectors may require a separate implementation.
Download Backtest on the App Store