Plus fortes hausses et baisses de 2026
Les meilleures actions de 2026 et les plus fortes baisses, classées depuis la cote sur une vraie liquidité, fractionnements et fonds à effet de levier exclus.
Les meilleures actions de 2026 jusqu'ici sont menées par SNDK, en hausse de 469.1% depuis la première séance de l'année jusqu'à la dernière séance terminée. Cette page classe les plus fortes hausses et baisses d'actions de 2026 parmi les valeurs réellement négociées, mesurées depuis la cote plutôt que depuis un résumé de fournisseur, et elle s'actualise tout au long de l'année. Les fractionnements d'actions et les fonds à effet de levier sont retirés avant tout classement, ce qui est précisément l'endroit où la plupart des listes depuis le début de l'année se trompent en silence.
Plus fortes hausses de 2026
Chaque valeur ci-dessous a franchi un plancher de liquidité avant d'être classée : une moyenne d'au moins 100 millions de dollars d'actions ayant changé de mains par séance terminée sur le mois écoulé. Un fort pourcentage sur une action que personne ne négocie est une cotation, pas un résultat.
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
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
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS ytd_return_pct,
round(u.adv / 1e6, 0) AS avg_daily_dollar_m
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
ORDER BY (e.latest_close / e.year_open) DESC
LIMIT 10SNDK mène l'année à 469.1%, suivi de MXL à 321.1% et de AEHR en troisième position à 268.3%. La dixième place du tableau, AXTI, affiche encore 183.9% : l'ensemble du tableau a donc couru loin devant n'importe quel indice large.
La colonne des montants, à côté de chaque mouvement, porte autant d'information que le pourcentage. AXTI affiche un volume moyen d'environ 408 millions de dollars par jour. SNDK, en tête du tableau, affiche une moyenne de 19525 millions de dollars. Chaque valeur ici franchit les 100 millions de dollars par jour, et l'écart au-dessus de ce plancher est assez large pour que le même pourcentage affiché signifie deux choses différentes à ses deux extrémités. Une valeur peu liquide est plus facile à faire bouger et plus difficile à céder au prix affiché à l'écran.
Plus fortes baisses de 2026
La même mesure, en sens inverse : les baisses les plus marquées depuis le début de l'année parmi les valeurs qui franchissent le même plancher de liquidité.
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
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
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS ytd_return_pct,
round(u.adv / 1e6, 0) AS avg_daily_dollar_m
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
ORDER BY (e.latest_close / e.year_open) ASC
LIMIT 10La baisse la plus marquée depuis le début de l'année revient à EOSE à -65.3%, suivi de EPAM à -56.3%. La dixième place de la liste, SMR, se situe à -45.3%. Plusieurs valeurs ici sont de grandes sociétés largement détenues plutôt que des micro-capitalisations spéculatives, ce qui est l'aspect d'une liste de baisses qui surprend le plus. Ni la liquidité ni la couverture des analystes ne fixent de plancher sous un cours de bourse. Quiconque détient l'une d'elles pour une part disproportionnée de son portefeuille a subi le mouvement en entier, ce que la page sur le risque d'une seule action mesure avec des chiffres de volatilité et de drawdown.
Quelle part du marché est en hausse en 2026
Un classement ne montre que les deux extrémités. L'ampleur de marché montre le corps : comment l'ensemble de l'univers filtré, fonds indiciels compris, se répartit entre valeurs en hausse et en baisse, regroupées par tranche d'amplitude.
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
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
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
rets AS (
SELECT e.ticker AS ticker, (e.latest_close / e.year_open - 1) * 100 AS ret
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
)
SELECT bucket,
names,
round(100 * sum(names) OVER (PARTITION BY side) / sum(names) OVER (), 1) AS side_share_pct
FROM (
SELECT tup.1 AS bucket, tup.2 AS names, tup.3 AS ord, tup.4 AS side
FROM (
SELECT arrayJoin([
('Down 40%+', countIf(ret < -40), 1, 'down'),
('Down 20-40%', countIf(ret >= -40 AND ret < -20), 2, 'down'),
('Down 10-20%', countIf(ret >= -20 AND ret < -10), 3, 'down'),
('Down 0-10%', countIf(ret >= -10 AND ret < 0), 4, 'down'),
('Up 0-10%', countIf(ret >= 0 AND ret < 10), 5, 'up'),
('Up 10-25%', countIf(ret >= 10 AND ret < 25), 6, 'up'),
('Up 25-50%', countIf(ret >= 25 AND ret < 50), 7, 'up'),
('Up 50%+', countIf(ret >= 50), 8, 'up')
]) AS tup
FROM rets
)
)
ORDER BY ord62.3% des valeurs filtrées sont en hausse sur l'année et 37.7% sont en baisse. Cette répartition est ce qu'un tableau du top dix dissimule. 26 valeurs se trouvent dans la tranche Down 40%+ à une extrémité et 123 dans la tranche Up 50%+ à l'autre, contre 143 dans Down 0-10% et 194 dans Up 0-10% de part et d'autre de l'inchangé. L'essentiel du marché fait quelque chose d'ordinaire n'importe quelle année, et les valeurs des deux tableaux ci-dessus sont l'exception à partir de laquelle les moyennes sont construites.
Où en est le marché lui-même
L'année d'une seule action se lit différemment au regard de celle du marché lui-même. Les quatre grands ETF indiciels, sur exactement la même fenêtre :
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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
AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT multiIf(ticker = 'SPY', 'S&P 500 (SPY)', ticker = 'QQQ', 'Nasdaq 100 (QQQ)',
ticker = 'DIA', 'Dow (DIA)', ticker = 'IWM', 'Russell 2000 (IWM)', ticker) AS label,
round((latest_close / year_open - 1) * 100, 1) AS ytd_return_pct,
(SELECT toString(min(d)) FROM complete) AS measured_from_date,
(SELECT toString(max(d)) FROM complete) AS measured_through_date
FROM edges
ORDER BY ytd_return_pct DESCLes deux tableaux et le panneau ci-dessus sont mesurés sur une seule fenêtre : la première séance complète de 2026 (2026-01-02) jusqu'à la dernière séance terminée (2026-07-20). Sur cette période, Russell 2000 (IWM) a rapporté 18% et Dow (DIA) a rapporté 7.5%. Chaque valeur du tableau des hausses a dépassé les quatre indices avec une large marge, ce qui est l'arithmétique même d'un indice à l'œuvre : des centaines de positions moyennées en une seule ligne, où les mouvements individuels s'annulent en partie. La dispersion sous cette ligne était bien plus large que la ligne elle-même, et le bilan sectoriel du premier semestre classe les onze secteurs les uns par rapport aux autres.
Le fractionnement d'actions qui fausse un mouvement depuis le début de l'année
Un fractionnement modifie le nombre d'actions et le prix par action sans changer la valeur d'une position. Sur une fenêtre aussi longue, de nombreuses sociétés se fractionnent, et un calcul non ajusté depuis le début de l'année lit le changement du prix par action comme une performance. Les valeurs ci-dessous ont chacune connu en 2026 un fractionnement ou un dividende en actions assez important pour déplacer ce prix d'au moins un cinquième, et chacune a franchi le même plancher de liquidité : chacune était donc éligible aux tableaux ci-dessus avant que le filtre de fractionnement ne l'écarte.
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
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
HAVING adv >= 100000000
),
split_terms AS (
SELECT ticker,
argMax(split_to, execution_date) AS new_shares,
argMax(split_from, execution_date) AS old_shares,
round((old_shares / new_shares - 1) * 100, 1) AS split_price_effect_pct,
replaceAll(argMax(adjustment_type, execution_date), '_', ' ') AS split_type,
toString(max(execution_date)) AS split_date
FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today()
GROUP BY ticker
HAVING new_shares > 0 AND old_shares > 0
AND greatest(new_shares / old_shares, old_shares / new_shares) >= 1.25
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker IN (SELECT ticker FROM split_terms)
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
ranked AS (
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS unadjusted_ytd_pct,
s.split_price_effect_pct AS split_price_effect_pct,
s.split_type AS split_type,
s.split_date AS split_date
FROM edges AS e
INNER JOIN split_terms AS s ON e.ticker = s.ticker
WHERE e.year_open >= 10 AND e.ticker IN (SELECT ticker FROM universe)
)
SELECT ticker, unadjusted_ytd_pct, split_price_effect_pct, split_type, split_date
FROM (
SELECT ticker, unadjusted_ytd_pct, split_price_effect_pct, split_type, split_date,
row_number() OVER (ORDER BY unadjusted_ytd_pct ASC) AS rn_low,
row_number() OVER (ORDER BY unadjusted_ytd_pct DESC) AS rn_high
FROM ranked
)
WHERE rn_low <= 14 OR rn_high = 1
ORDER BY unadjusted_ytd_pct ASCBKNG afficherait -96.7% sur un filtre non ajusté après qu'un forward split a déplacé son prix par action de -96%, et VGT afficherait -85.1% après qu'un forward split a déplacé son prix de -87.5%. Aucun détenteur de l'une ou l'autre n'a rien perdu le jour où le fractionnement a pris effet. Le prix par action a été divisé et le nombre d'actions multiplié par le même facteur. La colonne d'effet du fractionnement isole la variation de prix que le fractionnement, à lui seul, explique, la part qu'un filtre non ajusté lirait comme une performance.
La dernière ligne du panneau va dans l'autre sens : DD affiche 235.9% après qu'un reverse split a relevé son prix par action de 200%, en augmentant le prix plutôt qu'en le réduisant. Toute liste qui saute cette étape publie une fiction en haut et en bas du tableau simultanément, c'est pourquoi le filtre met de côté les symboles fractionnés plutôt que d'essayer de corriger leurs prix. Un fonds peut atterrir dans ce panneau aussi facilement qu'une société : les fonds indiciels fractionnent aussi leurs parts, et ce filtre couvre les deux.
Comment ce filtre est construit
Chaque étape du filtre, avec le nombre de valeurs encore en lice après celle-ci :
Le SQL exact derrière chaque chiffre
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
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 count() >= 380
),
universe AS (
SELECT ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
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
HAVING sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 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 ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
flagged AS (
SELECT ticker,
year_open,
ticker IN (SELECT ticker FROM universe) AS liquid,
ticker NOT IN ('SPCX','KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL') AS not_geared,
ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today()) AS no_split
FROM edges
)
SELECT tup.1 AS screen_step, tup.2 AS names
FROM (
SELECT arrayJoin([
('Traded the first and the last full session', count()),
('Averaging $100m+ a day over the past month', countIf(liquid)),
('Opened 2026 above $10 a share', countIf(liquid AND year_open >= 10)),
('Not on the excluded-fund list', countIf(liquid AND year_open >= 10 AND not_geared)),
('No split or stock dividend in 2026', countIf(liquid AND year_open >= 10 AND not_geared AND no_split))
]) AS tup
FROM flagged
)La méthode, énoncée en intégralité :
- La fenêtre. De la première séance de bourse complète de 2026 jusqu'à la séance complète la plus récente sur la cote. Les deux bornes sont lues à partir des barres à la minute, et une séance ne compte que si elle porte un nombre complet de barres en heures régulières, si bien qu'une journée encore en cours n'est jamais traitée comme terminée.
- Le rendement. Le premier cours d'ouverture de séance régulière de l'année face au dernier cours de clôture de séance régulière, calculé à partir des barres à la minute. Les transactions du premarket et de l'after-hours sont ignorées. Ce sont des rendements de cours ; les dividendes ne sont pas réintégrés, si bien qu'une valeur à haut rendement paraît ici légèrement moins bonne qu'un chiffre de rendement total ne le montrerait.
- Le plancher de liquidité. Une moyenne d'au moins 100 millions de dollars de volume en heures régulières par séance sur les 20 derniers jours calendaires, en ne comptant que les séances qui se sont déroulées du début à la fin. Une séance partielle diviserait sinon une partie des montants d'une journée par une journée entière et sous-estimerait le volume de chaque valeur. Ce seul filtre fait passer le champ de 4476 symboles à 1056.
- Le plancher de prix. L'action a ouvert l'année au-dessus de 10 dollars par action. Les valeurs sous les 10 dollars produisent de forts pourcentages à partir de petits mouvements de prix.
- Les fonds à effet de levier et inverses sont exclus au moyen d'une liste maintenue à la main, imprimée en intégralité dans le SQL sous chaque tableau. Elle couvre les fonds à effet de levier sur indices et les fonds à effet de levier sur une seule action qui multiplient le mouvement quotidien d'une société. Un fonds à effet de levier peut dominer n'importe quel classement brut de mouvements sans la moindre actualité propre à une société. La liste est tenue à la main, ce qui en est la faiblesse : un fonds lancé ce mois-ci n'est exclu qu'une fois que quelqu'un l'y ajoute.
- Les fonds ordinaires ne sont pas filtrés. Un ETF indiciel ou sectoriel sans effet de levier qui franchit les planchers de liquidité et de prix est classé ici aux côtés des sociétés d'exploitation, et il figure aussi dans les décomptes d'ampleur de marché. Un fonds est un panier de valeurs déjà comptées dans le même univers : lisez ces lignes comme ce qu'a fait le panier, pas comme l'année d'une seule société.
- Fractionnements. Tout symbole dont un fractionnement ou un dividende en actions prend effet en 2026 est écarté, quelle que soit la petitesse du ratio. C'est le choix prudent : cela coûte à une poignée de valeurs réellement performantes une place au tableau, et cela ne publie jamais un changement de nombre d'actions comme un rendement. Le panneau ci-dessus montre les valeurs exclues dont le fractionnement était assez important pour simuler un mouvement.
- Cotations tardives. Une société entrée en bourse après la première séance de l'année n'a pas de prix de janvier et est absente de ces tableaux, ce qui constitue un vrai manque lors d'une année au calendrier de nouvelles cotations chargé.
- Le résultat. 966 valeurs sont classées, et les dix premières et dix dernières en constituent les deux tableaux de cette page.
La même question sur trois fenêtres
Le cumul depuis le début de l'année n'est qu'un échelon d'une échelle, et un mouvement paraît différent à chaque longueur. La vue hebdomadaire est les plus fortes hausses et baisses de la semaine, la vue mensuelle est les plus fortes hausses et baisses du mois, et cette page est l'année. Les planchers diffèrent selon l'échelon : cette page filtre sur une moyenne de 100 millions de dollars par jour sur le mois écoulé, tandis que les pages hebdomadaire et mensuelle filtrent sur le total des dollars négociés dans leur propre fenêtre, si bien qu'une valeur peut franchir un tableau et manquer un autre. Une valeur qui domine le tableau hebdomadaire après une seule réaction de résultats se retrouve souvent en milieu de tableau sur l'année. Pour le récit plus large derrière l'année écoulée jusqu'ici, le bilan de marché du premier semestre détaille les indices, les taux et les secteurs, et le fonctionnement des ETF à effet de levier explique pourquoi les fonds à effet de levier sont écartés ici.
FAQ
Quelle est la meilleure action de 2026 ?
Parmi les valeurs négociant en moyenne au moins 100 millions de dollars par jour, ayant ouvert l'année au-dessus de 10 dollars, sans fractionnement en 2026 et absentes de la liste des fonds à effet de levier, SNDK est la meilleure action de 2026 à ce jour, en hausse de 469.1% depuis la première séance de l'année. MXL est deuxième à 321.1%.
Quelles actions ont le plus baissé en 2026 ?
EOSE est la pire action de 2026 sur ce filtre à -65.3%, devant EPAM à -56.3%. La liste complète des plus fortes baisses de 2026 figure dans le second tableau ci-dessus, actualisée tout au long de l'année.
Comment un rendement depuis le début de l'année est-il calculé ?
Un rendement depuis le début de l'année compare le dernier cours au cours du début de l'année civile et exprime la variation en pourcentage. Ici, c'est le premier cours d'ouverture de séance régulière de 2026 mesuré face au cours de clôture de la séance terminée la plus récente. Les actions fractionnées pendant l'année sont écartées plutôt qu'ajustées, si bien qu'aucun facteur d'ajustement ne s'interpose entre le lecteur et la cote.
Les ETF à effet de levier figurent-ils dans la liste des hausses de 2026 ?
Non. Un fonds à effet de levier ou inverse multiplie le mouvement quotidien d'un indice ou d'une seule action, si bien qu'il domine régulièrement une liste brute de mouvements sans aucune actualité propre à une société. Ces fonds sont retirés nommément avant le classement, et la liste est visible dans le SQL sous chaque tableau. Les ETF indiciels et sectoriels ordinaires sont un cas différent : ils franchissent les mêmes planchers que n'importe quelle action et sont classés ici, si bien qu'un fonds peut apparaître sur l'un ou l'autre tableau.
Chaque tableau ici est une requête stockée avec son SQL attaché. Dépliez n'importe quel panneau pour auditer le filtre, ou reconstruisez-le avec vos propres planchers sur le terminal Strasmore.