A Python backtest of the Silver Bullet AM Session strategy on NQ (Nasdaq 100) 1-minute data. The strategy is a time-restricted intraday reversal model that trades only the 10:00–11:00 AM ET window, using the 9:00 AM hourly candle as a reference range.
The setup waits for price to sweep one side of the 9 AM range, then looks for displacement and an ICT-style entry (Fair Value Gap, Order Block, or Breaker Block) targeting the opposite side.
At 10:00 AM ET, mark the high and low of the 9:00 AM hourly candle. Between 10:00 and 11:00 AM, wait for a 1-minute sweep of either side of that range. After the sweep, require an aggressive displacement candle back into the range, then enter on a Fair Value Gap, Order Block, or Breaker Block. Stop goes beyond the sweep, target is the opposite side of the 9 AM range. Risk 1% per trade; move stop to break-even at 3R. If no qualifying setup forms by 11:00 AM, skip the day.
Full rules in strategy.md. Implementation design notes in docs/plans/2026-02-26-backtest-design.md.
| File | Purpose |
|---|---|
backtest.py |
Full backtest engine — data loading, pattern detection (FVG / OB / BB), trade simulation, HTML report. |
strategy.md |
The strategy rules, framework, and reference back-test results from the source video. |
nq_1m.parquet |
NQ 1-minute OHLC bars (ET-timestamped) used as the input dataset. |
report.html |
Generated interactive HTML report from the most recent run. |
trades.csv |
Generated per-trade ledger from the most recent run. |
docs/plans/ |
Design notes for the backtest implementation. |
The key parameters at the top of backtest.py:
| Parameter | Default | Description |
|---|---|---|
ATR_PERIOD |
20 | Lookback for ATR used by the displacement filter. |
ATR_DISPLACEMENT_MULT |
1.5 | Displacement candle body must exceed this × ATR. |
BODY_RATIO_MIN |
0.70 | Displacement candle body must be ≥70% of its total range. |
FVG_MIN_GAP_ATR |
0.3 | Minimum FVG gap size as a fraction of ATR. |
RISK_PCT |
0.01 | Risk per trade (1% of account). |
BREAK_EVEN_R |
3.0 | Move stop to break-even at this R multiple. |
MIN_RR |
2.5 | Reject setups with R:R below this threshold. |
ACCOUNT_SIZE |
100,000 | Starting account balance. |
NQ_TICK |
0.25 | NQ minimum tick size. |
pip install pandas numpy pyarrow
python backtest.pyOutputs report.html (interactive equity curve, trade list, stats) and trades.csv in the project root.
nq_1m.parquet contains NQ 1-minute bars with a DateTime_ET column plus Open, High, Low, Close. Replace it with your own parquet of the same schema to backtest a different period or instrument.
For research and educational use only. Past performance of a backtest is not indicative of future results. Nothing here is financial advice.