Biggest Stock Movers This Month
The biggest stock movers this month, gainers and losers ranked from the exchange tape, with the dollars traded beside every move and every filter spelled out.
The biggest stock movers this month are ranked below straight from the exchange tape, covering the 21 completed trading sessions from Jun 22 through Jul 21. The screen keeps only operating companies that traded at least $1 billion across the window, so every move on the board has real money behind it. Leveraged and inverse funds are set aside, and the window rolls forward as new sessions complete.
Biggest stock gainers this month
The table ranks the largest gains over the window. Each row carries the dollars that changed hands beside the percentage, which is what separates a crowded repricing from a thin one.
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 10CRNX led the board at 133.6% on $9.4 billion traded, ahead of PBF at 75.5% and MAN at 56.8%. A move that size over a month usually shows up first as elevated relative volume against the stock's average daily volume, and it often starts with an overnight gap on one session rather than a steady climb across the whole window.
Biggest stock losers this month
The same construction in reverse: the steepest declines over the window, among companies clearing the same $1 billion floor.
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 10NVTS was the steepest decliner at -47.6% on $5.1 billion traded, with WOLF next at -47.1%. Watch the dollar column on this board. A decline the heavy tape took part in is a different event from one printed on a quiet market, and the two get told apart here rather than assumed.
The same question at three timeframes
One question, three windows. A name can top one board and appear nowhere on the other two.
- biggest stock losers this week, and the gainers beside them, over the trailing five sessions
- This page, over the trailing month
- the biggest stock movers of 2026, measured year to date
The three boards are built separately and their screens are not identical. The weekly page sets its own liquidity floor and session minimum over a five-session window, and the year-to-date page screens on average daily dollar volume rather than a total traded across the window. Each page states its own rules in its own method section, so read those before carrying a name from one board to another.
A single gap dominates the weekly board and washes out over a year. A slow monthly grind never reaches the weekly board at all. Reading the three side by side is the cheapest way to tell a one-day event from a trend.
Where the market stood over the same window
A stock's month reads differently against the market's own month. The four major index trackers, each rebased to its first opening print inside the window:
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 sessionBy the final session the S&P 500 tracker stood at 0.08%, the Nasdaq 100 tracker at -4.46%, the Dow tracker at 0.91% and the Russell 2000 tracker at -0.21%. Four baskets, one window, four different answers. Now set the leaderboard against that range: the top of the gainers board cleared 133.6% over the same sessions. Individual companies disperse far more than the baskets that hold them, which is the whole reason a movers list is a list of single names.
How the household names did
Readers looking for the best performing stocks this month usually also want to know where the names they already own landed. A fixed basket of eight household mega-caps, same window and same construction:
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) DESCThe group ran from 12.5% for META at the top to -6.6% for AVGO at the bottom. They did not move as a bloc, which is the ordinary case rather than the exception. Index membership groups these companies together; their revenue lines have very little to do with each other. The basket is a fixed list of eight names rather than a ranking, so treat it as orientation and not as a claim about which companies are largest.
What a normal month looks like
The leaderboards show the tail. This shows the body. All 1161 companies that cleared the screen, sorted into buckets by their return over the window:
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.260 of the screened companies gained 20% or more across the window, and 77 lost 20% or more. The two buckets nearest flat held 314 and 426 names. That chart is the shape a movers leaderboard gets cut from, and the top ten are its far right edge. Read the boards above with that in mind: a top-ten monthly move is an outlier by construction, never a typical month for a typical stock.
What puts a stock on a monthly movers list
A month is long enough to hold several events and short enough that one of them usually dominates. The names on these boards typically coincide with something dated on the company's calendar. Quarterly results are the most common: a beat or a miss resets the price in one session, and the rest of the month trades around the new level. Guidance changes do the same job without the accompanying results.
Merger and acquisition news leaves the most distinctive fingerprint on a monthly board. The stock jumps to a level near the announced deal price and then goes quiet, with the dollars traded staying enormous while the percentage change flattens out. If a name near the top of the gainers table shows a huge dollar figure and a price that stopped moving mid-window, that pattern is worth checking before anything else.
Sector moves matter over a month in a way they rarely do over a week. A shift in rates, oil, or memory pricing carries a whole group at once, which is why monthly boards often show clusters of similar businesses instead of ten unrelated names. Analyst actions, index additions and removals, trial and regulatory readouts, and short squeezes fill out the rest. None of it is visible in the percentage alone, which is why the dollars-traded column and the market's own window sit beside every move here.
How this is measured
Every threshold is stated here rather than left implied. A screen with hidden rules reads as data and is actually an opinion.
- The window. The trailing 30 calendar days ending at the most recent session whose tape is fully loaded, which came to the 21 sessions from Jun 22 to Jul 21. Two rules decide whether a session qualifies. It must have closed before the current date in New York, so the session in progress is never in scope. Its regular-hours bar count must also reach 85% of the median session across the 34-day scan, which holds back an earlier day whose tape is still filling in. A shortened holiday session prints roughly half a normal day of bars, so the same rule drops it rather than measuring it half loaded.
- The return. First regular-session opening price inside the window to last regular-session close, built from minute bars. Regular hours only, so premarket and after-hours prints are excluded. It is a price return: dividends are not added back.
- The floors. At least $1 billion traded across the whole window, an opening price of $10 or more, and prints on at least 15 of the window's sessions. The dollar floor is a monthly total, which makes it an easier bar to clear than the same figure measured over a single week.
- The exclusions. Leveraged and inverse funds are removed by name. Every ticker must also carry company fundamentals, a market capitalization on file, in our reference data. That second rule drops ETFs, closed-end funds, commodity trusts and the fast-growing family of leveraged single-stock products, which would otherwise fill most of both boards. That reference table holds one row per ticker rather than a dated daily snapshot, so the screen reads the whole table and no single date decides who is eligible. Any ticker with a stock split executing in the last 45 days is dropped rather than back-adjusted, since a split moves the per-share price without changing what a holding is worth. One symbol that vendor feeds have reassigned between two different companies is excluded by name.
- The mega-cap panel. A fixed basket of eight widely held large US companies, listed by name in that panel's SQL. It uses the same window and the same return construction as the boards, and it sits outside the dollar-volume screen.
- What is not applied. There is no sector filter, no market-cap floor and no index-membership requirement, so a heavily churned small company can sit on the board beside a large one. Ranking is by percentage change only, which is why the dollars-traded column is printed next to it.
One panel carries the receipt for all of it: the sessions the window covered, and the universe each board was screened from.
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 wThe screen started from 4124 tickers carrying a market capitalization in the reference table and finished with 1161 companies clearing the dollar-volume, price and session floors. Both figures are stored with every refresh of this page, so a run over a shrunken universe shows up in the receipt instead of passing unnoticed.
FAQ
What are the biggest stock gainers this month?
For the window ending Jul 21, the largest gains among companies trading over $1 billion were CRNX at 133.6% and PBF at 75.5%. The full top ten sits in the first table on this page, and it rolls forward as new sessions complete.
What stocks have dropped the most this month?
NVTS was the steepest decliner at -47.6%, followed by WOLF at -47.1%. Both are measured over the same 21 sessions, with the same $1 billion dollar-volume floor as the gainers board.
How are monthly stock returns measured?
A monthly return here is the change from a stock's first regular-session opening price inside the window to its last regular-session close, built from minute bars. It is a price return, so dividends are not added back, and any company with a stock split executing near the window is dropped rather than back-adjusted.
Why are leveraged ETFs excluded from a stock movers list?
A leveraged or inverse fund multiplies the daily move of an index or a single stock, so it can top a raw movers board on an ordinary market day with no company news behind it. Removing them keeps this a list of operating companies. How leveraged ETFs work covers the daily reset and the drift that comes with holding one for a month.
Every panel above is a stored query with its SQL attached. Open one, change the dollar floor or the window length, and screen the same tape yourself on the Strasmore terminal.