Strasmore Research
Market recaps wey dey break am down Matt ConnorBy Matt Connor · Updated 2026-09-05 · data as of September 5, 2026 · refreshed weekly

Biggest Stock Movers This Month: Gainers and Losers

See the biggest stock movers this month, with gainers and losers ranked from exchange tape. Dollar value traded dey beside each move, and every filter dey clear.

The biggest stock movers for this month dey rank below, straight from exchange tape. E cover 22 completed trading sessions from Aug 5 reach Sep 3. The screen only keep operating companies wey trade at least $1 billion during the period, so real money dey behind every move for the board. Dem set leveraged and inverse funds aside. The window go move forward as new sessions complete.

Biggest stock gainers this month

This table rank the stocks wey gain pass others during the period. Each row show the dollar value wey change hands beside the percentage gain. Na this one dey show whether plenty people dey reprice the stock or trading dey thin.

QueryStocks wey gain pass this month (companies wey trade $1B+ for the period)
tickermonth return (%)month dollar bn
MRNA156.780.7
ASST117.13.2
HTFL84.71.8
TEAM72.416.6
CRCL66.622.8
ARX60.72.2
CAI57.92.4
AMLX54.22.1
AMR51.81.2
MSTR47.954.8
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT ticker,
       round((argMax(c, d) / argMin(o, d) - 1) * 100, 1) AS month_return_pct,
       round(sum(dollars) / 1e9, 1) AS month_dollar_bn
FROM (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMin(toFloat64(open), window_start) AS o,
           argMax(toFloat64(close), window_start) AS c,
           sum(toFloat64(close) * toFloat64(volume)) AS dollars
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 34 DAY
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker IN (SELECT ticker FROM global_markets.stocks_ratios
                     WHERE market_cap > 0)
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 45 AND today())
    GROUP BY ticker, d
)
GROUP BY ticker
HAVING sum(dollars) >= 1000000000 AND argMin(o, d) >= 10 AND count() >= 15
ORDER BY argMax(c, d) / argMin(o, d) DESC
LIMIT 10
Run am yourself

MRNA lead the list at 156.7%, with $80.7 billion traded. E come before ASST at 117.1% and HTFL at 84.7%. When stock move this much within one month, e usually first show as higher relative volume compared with the stock average daily volume. E often start with an overnight gap during one trading session, instead of steady rise across the whole period.

Biggest stock losers this month

Na the same setup, but for reverse side: the biggest drops for this period among companies wey clear the same $1 billion minimum.

QueryStocks wey lose pass this month (companies wey trade $1B+ for the period)
tickermonth return (%)month dollar bn
VISN-491.8
RARE-47.91.2
LASR-45.71.5
AGX-33.63
FLNC-33.21.7
FCEL-33.13.1
BLZE-32.81
YOU-31.21.6
SEZL-31.11.9
WYFI-301.2
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT ticker,
       round((argMax(c, d) / argMin(o, d) - 1) * 100, 1) AS month_return_pct,
       round(sum(dollars) / 1e9, 1) AS month_dollar_bn
FROM (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMin(toFloat64(open), window_start) AS o,
           argMax(toFloat64(close), window_start) AS c,
           sum(toFloat64(close) * toFloat64(volume)) AS dollars
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 34 DAY
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker IN (SELECT ticker FROM global_markets.stocks_ratios
                     WHERE market_cap > 0)
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 45 AND today())
    GROUP BY ticker, d
)
GROUP BY ticker
HAVING sum(dollars) >= 1000000000 AND argMin(o, d) >= 10 AND count() >= 15
ORDER BY argMax(c, d) / argMin(o, d) ASC
LIMIT 10
Run am yourself

VISN record the biggest drop at -49% on $1.8 billion worth of trades, while RARE follow at -47.9%. Pay attention to the dollar column for this table. Decline wey happen when plenty trading dey go on no be the same event as decline wey print for quiet market. This table separate the two instead of assuming say dem be the same.

Di same question for three different timeframes

One question, three windows. One stock fit top one board and no show for the other two.

Dem build the three boards separately, and their screens no be exactly the same. The weekly page get its own liquidity floor and minimum sessions across five-session window. The year-to-date page screen based on average daily dollar volume, no be total traded volume across the window. Each page explain its own rules for the method section. So read dem before you carry one stock from one board go another.

One big gap fit dominate the weekly board but disappear across one year. A slow monthly rise fit never reach the weekly board. If you read the three boards side by side, na the cheapest way to tell one-day event from a trend.

Wey market dey stand for the same period

One stock month fit read differently when you compare am with the market own month. The four major index trackers, each one rebased to the first opening print inside the period:

QueryThe four major index trackers for the same period, rebased to the first open
22 rows (showing 20)
sessionS&P 500 (%)Nasdaq-100 (%)Dow (%)Russell 2000 (%)
2026-08-05-0.78-1.24-0.09-0.88
2026-08-06-0.94-1.61-0.94-1.38
2026-08-07-0.34-0.45-0.68-0.3
2026-08-10-0.36-0.75-0.79-0.81
2026-08-11-0.7-1.09-1.11-0.47
2026-08-12-0.43-0.36-1.140.09
2026-08-130.250.8-10.35
2026-08-140.060.66-1.190.87
2026-08-17-0.410.5-1.670.54
2026-08-18-1.09-1.19-1.91-0.72
2026-08-19-0.88-1.39-1.65-0.23
2026-08-20-1.7-2.11-2.91-1.57
2026-08-21-1.31-1.77-2.04-0.82
2026-08-24-1.6-2.75-1.78-1.48
2026-08-25-1.29-2.15-1.49-1.05
2026-08-26-1.27-2.06-1.67-1.16
2026-08-27-0.62-0.71-1.5-0.86
2026-08-28-0.84-1.35-1.52-2.21
2026-08-31-1.15-1.3-2.16-2.82
2026-09-01-1.83-2.56-2.87-3.91
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT session,
       round(anyIf(cum_pct, ticker = 'SPY'), 2) AS sp500_pct,
       round(anyIf(cum_pct, ticker = 'QQQ'), 2) AS nasdaq100_pct,
       round(anyIf(cum_pct, ticker = 'DIA'), 2) AS dow_pct,
       round(anyIf(cum_pct, ticker = 'IWM'), 2) AS russell2000_pct
FROM (
    SELECT ticker,
           formatDateTime(d, '%Y-%m-%d') AS session,
           100 * (c / first_value(o) OVER (PARTITION BY ticker ORDER BY d) - 1) AS cum_pct
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMin(toFloat64(open), window_start) AS o,
               argMax(toFloat64(close), window_start) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 34 DAY
          AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
          AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
        GROUP BY ticker, d
    )
)
GROUP BY session
ORDER BY session
Run am yourself

By the last trading session, S&P 500 tracker stand at -0.35%, Nasdaq 100 tracker at -1.19%, Dow tracker at -1.17% and Russell 2000 tracker at -2.4%. Four baskets, one period, four different answers. Now compare the leaderboard with that range: the biggest gainers pass 156.7% across the same sessions. Individual companies dey spread much more than the baskets wey hold dem. Na the main reason movers list dey show single names.

How the household names perform

Readers wey dey find the stocks wey perform pass this month usually still wan know where the names wey dem already own land. Na fixed basket of eight household mega-caps, with the same window and same construction:

QueryEight popular mega-cap names for the same period
tickermonth return (%)
TSLA16.4
AAPL6.1
NVDA5.3
MSFT2.8
META1.7
AMZN-8.1
GOOGL-10.7
AVGO-15.3
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT ticker,
       round((argMax(c, d) / argMin(o, d) - 1) * 100, 1) AS month_return_pct
FROM (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMin(toFloat64(open), window_start) AS o,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 34 DAY
      AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'META', 'TSLA', 'AVGO')
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 45 AND today())
    GROUP BY ticker, d
)
GROUP BY ticker
HAVING count() >= 15
ORDER BY argMax(c, d) / argMin(o, d) DESC
Run am yourself

The group move from 16.4% for TSLA at the top reach -15.3% for AVGO at the bottom. Dem no move together as one bloc. Na the normal situation, no be exception. Index membership na wetin put these companies together; their revenue lines get very little connection with each other. The basket na fixed list of eight names, no be ranking. So use am for orientation, no be claim about which companies be the biggest.

How normal month dey look

Leaderboards dey show the tail end. Dis one dey show the main body. All 1110 companies wey pass the screen, arrange dem into buckets based on their return across the window:

QueryWhere every screened company land: monthly returns by bucket
return bucketstocks
down 20% or more52
down 10% to 20%158
down 0% to 10%422
up 0% to 10%314
up 10% to 20%100
up 20% or more64
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
)
SELECT tup.1 AS return_bucket,
       tup.3 AS stocks
FROM (
    SELECT arrayJoin(arrayZip(
               ['down 20% or more', 'down 10% to 20%', 'down 0% to 10%',
                'up 0% to 10%', 'up 10% to 20%', 'up 20% or more'],
               [1, 2, 3, 4, 5, 6],
               [countIf(r <= -20), countIf(r > -20 AND r <= -10), countIf(r > -10 AND r < 0),
                countIf(r >= 0 AND r < 10), countIf(r >= 10 AND r < 20), countIf(r >= 20)])) AS tup
    FROM (
        SELECT ticker,
               (argMax(c, d) / argMin(o, d) - 1) * 100 AS r
        FROM (
            SELECT ticker,
                   toDate(toTimeZone(window_start, 'America/New_York')) AS d,
                   argMin(toFloat64(open), window_start) AS o,
                   argMax(toFloat64(close), window_start) AS c,
                   sum(toFloat64(close) * toFloat64(volume)) AS dollars
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE window_start >= now() - INTERVAL 34 DAY
              AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
              AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
              AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
              AND ticker NOT IN ('SPCX')
              AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
              AND ticker IN (SELECT ticker FROM global_markets.stocks_ratios
                             WHERE market_cap > 0)
              AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                                 WHERE execution_date BETWEEN today() - 45 AND today())
            GROUP BY ticker, d
        )
        GROUP BY ticker
        HAVING sum(dollars) >= 1000000000 AND argMin(o, d) >= 10 AND count() >= 15
    )
)
ORDER BY tup.2
Run am yourself

64 of the companies wey pass the screen gain 20% or more across the window, while 52 lose 20% or more. The two buckets wey dey closest to flat contain 422 and 314 names. Na from this shape dem cut movers leaderboard, and the top ten na the far-right edge. Make you read the boards above with dis for mind: top-ten monthly move na outlier by design, e no be normal month for normal stock.

Wetin dey put stock for monthly movers list

One month long enough to contain different events, but e short enough say one of dem normally dominate. The names for these lists usually match something wey get date for the company calendar. Quarterly results na the most common one: beat or miss fit reset the price for one trading session, then the rest of the month go trade around the new level. Guidance changes fit do the same thing without the results alongside am.

Merger and acquisition news dey leave the clearest pattern for monthly list. Stock fit jump reach level near the announced deal price, then trading go quiet. The dollars traded still dey very high, while the percentage change flatten out. If a name near the top of the gainers table get very large dollar figure and price stop moving halfway through the period, na that pattern you suppose check first.

Sector moves matter more over one month than dem normally matter over one week. Change for rates, oil, or memory pricing fit carry one whole group at once. Na why monthly lists often show clusters of similar businesses instead of ten unrelated names. Analyst actions, index additions and removals, trial and regulatory readouts, plus short squeezes complete the rest. You no fit see any of this from percentage alone. Na why the dollars-traded column and the market’s own time window dey beside every move here.

How dem dey measure am

Dem state every threshold for here, instead of leaving anything implied. If screen get hidden rules, e go look like data but na opinion e really be.

  • The window. Na the trailing 30 calendar days wey end for the latest session wey tape don load complete. E cover the 22 sessions from Aug 5 reach Sep 3. Two rules decide whether session qualify. E must close before the current date for New York, so session wey still dey run no dey count. The regular-hours bar count must also reach 85% of the median session across the 34-day scan. This one hold back earlier day wey tape still dey fill. Shortened holiday session dey print roughly half the bars of normal day, so the same rule drop am instead of measuring am half-loaded.
  • The return. Na the first regular-session opening price inside the window reach the last regular-session close, built from minute bars. Regular hours only dey count, so premarket and after-hours prints no dey inside. Na price return be this: dividends no dey add back.
  • The floors. At least $1 billion must trade across the whole window. Opening price must be $10 or more, and prints must happen for at least 15 sessions inside the window. The dollar floor na monthly total, so e easier to clear than the same figure measured across one week.
  • The exclusions. Dem remove leveraged and inverse funds by name. Every ticker must also carry company fundamentals and get market capitalization for our reference data. This second rule remove ETFs, closed-end funds, commodity trusts and the fast-growing group of leveraged single-stock products. Without am, dem for fill most of both boards. The reference table get one row for each ticker instead of dated daily snapshot. So the screen read the whole table, and no single date decide who qualify. Any ticker wey get stock split executing within the last 45 days dey removed instead of back-adjusted, because split dey change per-share price but e no change wetin holding worth. Dem exclude one symbol by name because vendor feeds don reassign am between two different companies.
  • The mega-cap panel. Na fixed basket of eight widely held large US companies, with their names listed for that panel's SQL. E use the same window and the same return construction as the boards, and e dey outside the dollar-volume screen.
  • What is not applied. No sector filter dey. No market-cap floor dey, and no index-membership requirement dey. So small company wey people trade heavily fit sit for the board beside big company. Ranking na by percentage change only. Na why dollars-traded column dey printed beside am.

One panel carry the receipt for everything: the sessions wey the window cover, plus the universe wey each board screen come from.

QueryThe period and screened universe behind every board for this page
first session datelast session datesessionscompanies wey dey on filecompanies wey dem screen
Aug 5Sep 32240771110
The exact SQL behind every number
WITH window_days AS (
    SELECT d
    FROM (
        SELECT d, max(d) OVER () AS last_full
        FROM (
            SELECT d
            FROM (
                SELECT d, bars, medianExact(bars) OVER () AS typical_bars
                FROM (
                    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, count() AS bars
                    FROM global_markets.delayed_stocks_minute_aggs
                    WHERE window_start >= now() - INTERVAL 34 DAY
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
                      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
                    GROUP BY d
                    HAVING d < toDate(toTimeZone(now(), 'America/New_York'))
                )
            )
            WHERE bars >= 0.85 * typical_bars
        )
    )
    WHERE d > last_full - 30
),
screened AS (
    SELECT ticker
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMin(toFloat64(open), window_start) AS o,
               sum(toFloat64(close) * toFloat64(volume)) AS dollars
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 34 DAY
          AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM window_days)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
          AND ticker NOT IN ('SPCX')
          AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
          AND ticker IN (SELECT ticker FROM global_markets.stocks_ratios
                         WHERE market_cap > 0)
          AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                             WHERE execution_date BETWEEN today() - 45 AND today())
        GROUP BY ticker, d
    )
    GROUP BY ticker
    HAVING sum(dollars) >= 1000000000 AND argMin(o, d) >= 10 AND count() >= 15
)
SELECT formatDateTime(w.first_d, '%b %e') AS first_session_date,
       formatDateTime(w.last_d, '%b %e') AS last_session_date,
       w.n AS sessions,
       (SELECT count() FROM global_markets.stocks_ratios WHERE market_cap > 0) AS companies_on_file,
       (SELECT count() FROM screened) AS companies_screened
FROM (SELECT min(d) AS first_d, max(d) AS last_d, count() AS n FROM window_days) AS w
Run am yourself

The screen start from 4077 tickers wey get market capitalization for the reference table, and e finish with 1110 companies wey clear the dollar-volume, price and session floors. Dem store both figures every time dem refresh this page. So if the run use smaller universe, e go show for the receipt instead of passing unnoticed.

FAQ

Which stocks gain pass most this month?

For the period wey end Sep 3, the companies wey gain pass among stocks wey dey trade above $1 billion be MRNA at 156.7% and ASST at 117.1%. The complete top ten dey for the first table for this page, and e dey update as new trading sessions finish.

Which stocks drop pass most this month?

VISN na the stock wey drop pass, at -49%. RARE follow am at -47.9%. Dem both dey measured across the same 22 sessions, with the same $1 billion dollar-volume minimum wey apply to the gainers board.

How una dey measure monthly stock returns?

Monthly return for here na the change from the stock first regular-session opening price inside the period to the last regular-session closing price. We calculate am from minute bars. Na price return be this, so dividends no dey added back. If company get stock split wey execute near the period, we remove am instead of doing back-adjustment.

Why una no include leveraged ETFs for stock movers list?

Leveraged or inverse fund dey multiply the daily move of index or one stock. So e fit reach top of raw movers board on normal market day even when no company news cause the move. Removing dem help keep the list for operating companies. How leveraged ETFs dey work explain the daily reset and the drift wey fit happen when person hold one for one month.


Every panel wey dey above na stored query with the SQL attached. Open any one, change the dollar minimum or the period length, then screen the same tape by yourself for the Strasmore terminal.

#market movers#gainers and losers#monthly returns#market data