Strasmore Research
Обзор рынка Matt ConnorАвтор: Matt Connor · Обновлено 2026-10-18 · data as of October 18, 2026 · refreshed weekly

Крупнейшие акции роста и падения 2026 года

Крупнейшие акции, лидеры роста и падения 2026 года, ранжированные по биржевой ленте сделок с учётом реальной ликвидности; дробления акций и фонды с кредитным плечом исключены.

Лидерами роста среди акций 2026 года пока остаются MRNA: с начала первой торговой сессии года по последнюю завершённую сессию рост составил 692.8%. На этой странице ранжируются крупнейшие акции — лидеры роста и падения 2026 года с начала года — среди бумаг, которые действительно торгуются; расчёт ведётся по биржевой ленте сделок, а не по сводке поставщика данных, и рейтинг обновляется по ходу года. Дробления акций и фонды с кредитным плечом исключаются ещё до составления рейтинга — именно здесь большинство списков с начала года незаметно дают сбой.

Крупнейшие акции — лидеры роста 2026 года

Каждое название в списке ниже прошло порог ликвидности прежде, чем попало в рейтинг: в среднем не менее $100 млн оборота акций за завершённую сессию на протяжении последнего месяца. Крупный процентный рост по бумаге, которую никто не торгует, — это котировка, а не результат.

ЗапросКрупнейшие акции-лидеры роста 2026 года: топ-10 с начала года среди активно торгуемых бумаг
ТикерДоходность с начала года (%)Средний дневной объём, $ млн
MRNA692.83002
SNDK47111073
TWST355.2476
TXG343.5334
MXL338.4246
DELL2683100
AXTI236.9499
AEHR229.3203
PBF218.3195
KOD215.7389
Точный SQL-код для каждого числа
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 10
Запустите сами

MRNA возглавляет год с результатом 692.8%, следом идёт SNDK с 471%, третье место занимает TWST с 355.2%. Десятая строчка таблицы, KOD, всё ещё показывает рост на 215.7%, так что весь список далеко опередил любой широкий индекс.

Столбец с суммой оборота рядом с каждым движением цены несёт не меньше информации, чем процент. KOD в среднем даёт около $389 млн оборота в день. MRNA на вершине списка в среднем даёт $3002 млн. Каждое название здесь проходит порог в $100 млн в день, но диапазон значений выше этого порога настолько широк, что один и тот же заголовочный процент означает две разные вещи на двух концах шкалы. По бумаге с низкой ликвидностью легче подтолкнуть цену вверх и труднее выйти из позиции по цене, которая указана на экране.

Крупнейшие аутсайдеры среди акций в 2026 году

Тот же показатель, но в обратную сторону: самые глубокие падения с начала года среди бумаг, прошедших тот же порог ликвидности.

ЗапросКрупнейшие акции-аутсайдеры 2026 года: десять худших с начала года среди активно торгуемых бумаг
ТикерДоходность с начала года (%)Средний дневной объём, $ млн
CTVA-80.8410
TTD-65.7176
FLUT-64.8159
JOBY-64.3114
STLA-61.5126
OKLO-59.4288
APP-59.11168
SMR-57.8217
FICO-54.5998
Z-54.1114
Точный SQL-код для каждого числа
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 10
Запустите сами

Самое глубокое падение с начала года показывает CTVA — -80.8%, за ней следует TTD с результатом -65.7%. На десятом месте списка находится Z с показателем -54.1%. Часть бумаг в этом списке — крупные компании с широкой базой держателей акций, а не спекулятивные микрокапитализации, и именно это чаще всего удивляет в списке аутсайдеров. Ликвидность и внимание аналитиков не создают никакой защиты для котировок. Тот, кто держал одну из этих бумаг как непропорционально крупную долю портфеля, принял на себя движение в полном объёме — эту зависимость страница риск владения одной акцией измеряет через показатели волатильности и просадки.

Какая доля рынка растёт в 2026 году

Таблица лидеров показывает только два хвоста распределения. Breadth показывает основную массу: как весь отобранный набор бумаг, включая индексные фонды, делится между растущими и падающими именами, с разбивкой по размеру движения.

ЗапросШирота рынка с начала года: распределение отобранных бумаг по группам доходности
ГруппаНазванияДоля стороны (%)
Down 40%+3741.2
Down 20-40%8441.2
Down 10-20%10441.2
Down 0-10%18741.2
Up 0-10%16258.8
Up 10-25%19458.8
Up 25-50%11658.8
Up 50%+11658.8
Точный SQL-код для каждого числа
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 ord
Запустите сами

58.8% отобранных бумаг показывают рост с начала года, а 41.2% — снижение. Именно распределение скрыто в таблице топ-10. 37 бумаг находятся в категории Down 40%+ на одном конце шкалы, а 116 — в категории Up 50%+ на другом, против 187 в категории Down 0-10% и 162 в категории Up 0-10% по обе стороны от нулевого изменения. В любой конкретный год основная часть рынка ведёт себя вполне обычно, а бумаги из двух таблиц выше — это исключение, из которого складываются средние показатели.

Где стоит сам рынок

Год отдельной акции выглядит по-разному в зависимости от того, с чем его сравнивать — с самим рынком. Четыре крупных индексных ETF за то же самое окно:

ЗапросЧетыре основных индексных ETF с начала года за один и тот же период
МеткаДоходность с начала года (%)Дата начала измеренияДата окончания измерения
Nasdaq 100 (QQQ)17.42026-01-022026-10-15
S&P 500 (SPY)12.52026-01-022026-10-15
Russell 2000 (IWM)11.12026-01-022026-10-15
Dow (DIA)8.22026-01-022026-10-15
Точный SQL-код для каждого числа
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 DESC
Запустите сами

Обе таблицы и панель выше измерены за один и тот же период: с первой полной торговой сессии 2026 года (2026-01-02) по последнюю завершённую сессию (2026-10-15). За это время Nasdaq 100 (QQQ) показал доходность 17.4%, а Dow (DIA) — 8.2%. Каждая бумага из таблицы лидеров роста с большим отрывом превзошла все четыре индекса, и это просто арифметика работы индекса: сотни позиций усредняются в одну цифру, где отдельные движения частично гасят друг друга. Разброс под этой усреднённой цифрой был гораздо шире, чем сама цифра, и сводная таблица по секторам за первое полугодие ранжирует все одиннадцать секторов друг относительно друга.

Сплит акций, который искажает динамику с начала года

Сплит меняет количество акций и цену за акцию, но не меняет стоимость всей позиции. За такой длинный период многие компании проводят сплиты, и неоткорректированный расчёт с начала года принимает изменение цены за акцию за реальную динамику. Каждая из компаний ниже провела в 2026 году сплит или дала акции в виде дивиденда в размере, достаточном, чтобы сдвинуть цену как минимум на пятую часть, и каждая прошла тот же порог ликвидности, поэтому каждая была допущена в таблицы выше до того, как фильтр сплитов её отсеял.

ЗапросИсключено из таблиц: сплиты 2026 года, способные исказить динамику с начала года
ТикерНескорр. доходность с начала года (%)Влияние сплита на цену (%)Тип сплитаДата сплита
BKNG-96.9-96forward split2026-04-06
KLAC-86.2-90forward split2026-06-12
CVNA-85.6-80forward split2026-05-08
VGT-83.9-87.5forward split2026-04-21
VUG-81.7-83.3forward split2026-04-21
VOOG-81-83.3forward split2026-04-21
MGK-77.9-80forward split2026-04-21
IWF-73.9-75forward split2026-04-29
VO-72.2-75forward split2026-04-21
INTW-57.3-87.5forward split2026-06-26
CRWD-48.4-75stock dividend2026-07-02
MNST-40.9-50stock dividend2026-08-11
APH-40.6-50stock dividend2026-09-03
HON7.6100reverse split2026-06-29
ETHA141.8200reverse split2026-10-06
Точный SQL-код для каждого числа
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 ASC
Запустите сами

BKNG показал бы -96.9% на неоткорректированном экране после того, как forward split сдвинул цену за акцию на -96%, а KLAC показал бы -86.2% после того, как forward split сдвинул его цену на -90%. Ни один держатель ни той, ни другой бумаги в день вступления сплита в силу ничего не потерял. Цена за акцию была разделена, а количество акций умножено на тот же коэффициент. Столбец эффекта сплита выделяет именно то изменение цены, которое объясняется сплитом, — то есть ту часть, которую неоткорректированный экран принимает за динамику.

Последняя строка таблицы работает в обратную сторону: ETHA показывает 141.8% после того, как reverse split поднял цену за акцию на 200%, то есть увеличил цену, а не снизил её. Любой список, который пропускает этот шаг, публикует вымысел одновременно и в верхней, и в нижней части рейтинга, поэтому экран исключает бумаги со сплитами, а не пытается исправлять их цены. В эту таблицу может попасть не только компания, но и фонд: индексные фонды тоже проводят сплиты своих акций, и этот экран охватывает оба случая.

Как построен этот отбор

Каждый этап отбора с числом тикеров, прошедших его:

ЗапросОтбор по этапам: сколько бумаг проходит каждый фильтр
Этап отбораНазвания
Traded the first and the last full session4543
Averaging $100m+ a day over the past month1082
Opened 2026 above $10 a share1049
Not on the excluded-fund list1017
No split or stock dividend in 20261000
Точный SQL-код для каждого числа
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
)
Запустите сами

Метод отбора приведён полностью:

  • Окно. От первой полной торговой сессии 2026 года до последней полной сессии в ленте. Обе граничные точки определяются по минутным барам, и сессия учитывается только тогда, когда по ней есть полный набор баров за основную торговую сессию, поэтому день, который ещё не завершился, никогда не считается закрытым.
  • Доходность. Цена открытия первой основной сессии года против цены закрытия последней основной сессии, рассчитанная по минутным барам. Сделки в премаркете и постмаркете не учитываются. Это ценовая доходность без учёта дивидендов, поэтому бумага с высокой дивидендной доходностью показывает здесь результат несколько хуже, чем это было бы видно по показателю полной доходности.
  • Порог по ликвидности. Средний оборот в основную торговую сессию не менее $100 млн за сессию за последние 20 календарных дней, при этом учитываются только сессии, прошедшие от начала до конца. В противном случае неполная сессия делила бы часть дневного оборота в долларах на целый день и занижала бы оборот по каждой бумаге. Один этот фильтр сокращает список с 4543 тикеров до 1082.
  • Порог по цене. Акция открыла год выше $10 за штуку. Бумаги дешевле $10 дают большие проценты изменения на небольших ценовых шагах.
  • Фонды с плечом и обратные фонды исключаются по специально составленному списку, приведённому полностью в SQL-запросе под каждой таблицей. В него входят фонды, привязанные к индексам с плечом, и фонды на отдельные акции, умножающие дневное движение одной компании. Фонд с плечом может возглавить любой список лидеров по движению без единой корпоративной новости. Список ведётся вручную, в чём и его слабое место: фонд, запущенный в этом месяце, исключается только после того, как кто-то внесёт его в список.
  • Обычные фонды не отфильтровываются. Индексный или отраслевой ETF без плеча, проходящий пороги по ликвидности и цене, ранжируется здесь наравне с операционными компаниями и учитывается также в показателях широты рынка. Фонд — это корзина бумаг, уже учтённых в той же выборке, поэтому такие строки следует читать как результат корзины, а не как год отдельной компании.
  • Дробления. Любой тикер, по которому в течение 2026 года происходит дробление акций или выплата акциями, исключается из отбора — независимо от того, насколько малó соотношение дробления. Это осознанно консервативный выбор: он лишает места в рейтинге горстку действительно сильных бумаг, но зато никогда не выдаёт изменение числа акций за доходность. В таблице выше показаны исключённые тикеры, у которых дробление было достаточно крупным, чтобы имитировать движение цены.
  • Поздние размещения. Компания, вышедшая на биржу после первой сессии года, не имеет январской цены и в эти таблицы не попадает — а это реальный пробел в год с насыщенным календарём новых размещений.
  • Результат. Ранжируются 1000 тикеров, и верхняя и нижняя десятки из них образуют две таблицы на этой странице.

Один и тот же вопрос в трёх временных окнах

Динамика с начала года — это одна ступень на лестнице, и движение выглядит по-разному на каждой из них. Недельный обзор — это крупнейшие победители и аутсайдеры недели среди акций, месячный обзор — это крупнейшие движения акций за месяц, а эта страница отражает год. Пороги отбора на разных ступенях различаются: эта страница отбирает бумаги со средним объёмом торгов от 100 миллионов долларов в день за последний месяц, тогда как недельная и месячная страницы отбирают бумаги по совокупному объёму торгов в долларах в рамках своих собственных окон, поэтому одна и та же бумага может пройти отбор на одной странице и не пройти на другой. Бумага, возглавляющая недельный рейтинг на фоне реакции рынка на отчётность, за год нередко оказывается в середине таблицы. Более широкий обзор итогов года см. в материале обзор рынка за первое полугодие, где разбираются динамика индексов, процентные ставки и секторальная картина, а материал как работают ETF с кредитным плечом объясняет, почему фонды с плечом здесь не рассматриваются.

Часто задаваемые вопросы

Какая акция показывает лучшую динамику в 2026 году?

Среди бумаг со среднедневным объёмом торгов не менее $100 млн, ценой на открытии года выше $10, без сплита в 2026 году и не входящих в список фондов с кредитным плечом, MRNA — лучшая по динамике акция 2026 года на сегодня: рост составляет 692.8% от первой сессии года. На втором месте SNDK с показателем 471%.

Какие акции больше всего потеряли в цене в 2026 году?

CTVA — худшая по динамике акция 2026 года по данному отбору, с показателем -80.8%, за ней следует TTD с показателем -65.7%. Полный список крупнейших аутсайдеров 2026 года приведён во второй таблице выше и обновляется по ходу года.

Как рассчитывается доходность акции с начала года?

Доходность с начала года сопоставляет последнюю цену с ценой на начало календарного года и выражает изменение в процентах. Здесь используется цена на открытии первой обычной торговой сессии 2026 года в сопоставлении с ценой закрытия последней завершённой сессии. Акции, прошедшие сплит в течение года, исключаются из отбора, а не корректируются, поэтому между читателем и биржевыми данными не стоит никакой поправочный коэффициент.

Включены ли в список лидеров роста 2026 года фонды с кредитным плечом?

Нет. Фонд с кредитным плечом или обратный фонд умножает дневное движение индекса или отдельной акции, поэтому он регулярно оказывается на вершине необработанного списка лидеров без каких-либо корпоративных новостей за этим движением. Такие фонды исключаются поимённо перед составлением рейтинга, и этот список виден в SQL-запросе под каждой таблицей. Обычные индексные и секторальные ETF — другой случай: они проходят те же пороговые требования, что и любая акция, и ранжируются наравне с ней, поэтому один и тот же фонд может оказаться в любом из двух списков.


Каждая таблица здесь представляет собой сохранённый запрос с прикреплённым SQL-кодом. Разверните любую панель, чтобы проверить отбор, или постройте его заново со своими пороговыми значениями на терминале Strasmore.

#market movers#gainers and losers#year to date#stock splits#market breadth