TQTradingQuery

Volume · MNQ

Does a low-volume day on MNQ tend to precede a large range day

77

n low volume days

n=2572025-08-30 to 2026-09-06

n low volume days

77

n other days

180

low vol threshold

1,165,555.4

high range threshold

428.05

avg range after low volume

299.48

avg range after other

397.78

large range rate after low volume

0.18

large range rate after other

0.35

correlation prevvol range

0.38

Methodology

Computed by independently generating and running analysis code against real MNQ 1-minute bars from 2025-08-30 to 2026-09-06, 25 separate times in parallel, then taking the answer the largest group of independent attempts agreed on. The exact code is shown below.

Show the code

et = to_et(bars)
rth = rth_session(et)
rth = rth.copy()
rth['date'] = trading_date(rth)

daily = rth.groupby('date').agg(
    high=('high','max'),
    low=('low','min'),
    volume=('volume','sum')
)
daily['range'] = daily['high'] - daily['low']
daily = daily.dropna()
daily = daily.sort_index()

# shift volume to previous day, align with next day's range
daily['prev_volume'] = daily['volume'].shift(1)
daily['prev_range'] = daily['range'].shift(1)

valid = daily.dropna(subset=['prev_volume','range'])

if len(valid) >= 5:
    low_vol_thresh = valid['prev_volume'].quantile(0.3)
    high_range_thresh = valid['range'].quantile(0.7)

    low_vol_days = valid[valid['prev_volume'] <= low_vol_thresh]
    other_days = valid[valid['prev_volume'] > low_vol_thresh]

    low_vol_next_range_mean = float(low_vol_days['range'].mean())
    other_next_range_mean = float(other_days['range'].mean()) if len(other_days) > 0 else None

    low_vol_large_range_rate = float((low_vol_days['range'] >= high_range_thresh).mean())
    other_large_range_rate = float((other_days['range'] >= high_range_thresh).mean()) if len(other_days) > 0 else None

    corr = float(valid['prev_volume'].corr(valid['range']))

    result = {
        'sample_size': int(len(valid)),
        'n_low_volume_days': int(len(low_vol_days)),
        'n_other_days': int(len(other_days)),
        'low_vol_threshold': float(low_vol_thresh),
        'high_range_threshold': float(high_range_thresh),
        'avg_range_after_low_volume': low_vol_next_range_mean,
        'avg_range_after_other': other_next_range_mean,
        'large_range_rate_after_low_volume': low_vol_large_range_rate,
        'large_range_rate_after_other': other_large_range_rate,
        'correlation_prevvol_range': corr,
    }
else:
    result = {
        'sample_size': int(len(valid)),
        'n_low_volume_days': 0,
        'n_other_days': 0,
        'low_vol_threshold': None,
        'high_range_threshold': None,
        'avg_range_after_low_volume': None,
        'avg_range_after_other': None,
        'large_range_rate_after_low_volume': None,
        'large_range_rate_after_other': None,
        'correlation_prevvol_range': None,
    }
  • Generated and independently re-derived 25 times, then checked for logical consistency, before being shown to you -- the figures above are the answer the largest number of those independent attempts agreed on. Still a generated, one-off calculation, treat it as a rough, one-off analysis rather than a permanent fixture.

This is historical statistical information only. It is not investment advice, and past performance does not indicate future results. Trading involves risk of loss.