Strasmore Research
Tổng hợp thị trường Matt ConnorBởi Matt Connor · Cập nhật 2026-09-05 · data as of September 5, 2026 · refreshed weekly

Cổ phiếu tăng và giảm mạnh nhất năm 2026

Xem bảng xếp hạng cổ phiếu tăng và giảm mạnh nhất năm 2026, dựa trên thanh khoản thực tế, loại trừ chia tách và quỹ đòn bẩy để chọn mã đáng chú ý.

Các cổ phiếu có diễn biến tốt nhất từ đầu năm 2026 hiện được dẫn đầu bởi SNDK, tăng 536.4% từ phiên giao dịch đầu tiên của năm đến phiên đã hoàn tất gần nhất. Trang này xếp hạng những cổ phiếu tăng và giảm mạnh nhất năm 2026 trong số các mã thực sự được giao dịch. Dữ liệu được đo trực tiếp từ bảng điện của sở giao dịch, không lấy từ bản tổng hợp của nhà cung cấp dữ liệu. Bảng xếp hạng được cập nhật trong suốt năm. Các đợt chia tách cổ phiếu và các quỹ đòn bẩy được loại khỏi dữ liệu trước khi xếp hạng. Đây là nguyên nhân khiến phần lớn các danh sách hiệu suất từ đầu năm thường có sai lệch.

Các cổ phiếu tăng giá mạnh nhất năm 2026

Mỗi mã dưới đây đều vượt qua ngưỡng thanh khoản trước khi được xếp hạng: giá trị cổ phiếu khớp lệnh bình quân ít nhất 100 triệu USD trong mỗi phiên hoàn tất trong tháng qua. Một tỷ lệ tăng lớn ở một cổ phiếu không có giao dịch đáng kể chỉ là báo giá, không phải kết quả thực tế.

Truy vấnCổ phiếu tăng mạnh nhất năm 2026: top 10 từ đầu năm trong nhóm giao dịch sôi động
tickerlợi nhuận từ đầu năm (%)giá trị giao dịch USD bình quân/ngày (triệu)
SNDK536.415431
MRNA3995598
TWST305.4202
DELL301.83566
TXG287.5142
AEHR262.8208
MXL233.4114
AXTI226.9525
MU224.820455
AMLX183.5131
Câu lệnh SQL chính xác đằng sau mỗi con số
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
Tự chạy truy vấn này

SNDK dẫn đầu từ đầu năm với mức tăng 536.4%, tiếp theo là MRNA với 399% và TWST đứng thứ ba với 305.4%. Ở vị trí thứ mười trên bảng, AMLX, vẫn tăng 183.5%, nên toàn bộ danh sách đã tăng vượt xa mọi chỉ số diện rộng.

Cột giá trị bằng USD bên cạnh mỗi mức tăng cũng chứa nhiều thông tin không kém tỷ lệ phần trăm. AMLX đạt giá trị giao dịch bình quân khoảng 131 triệu USD mỗi ngày. SNDK, mã đứng đầu bảng, đạt bình quân 15431 triệu USD. Mọi mã trong danh sách này đều có giá trị giao dịch trên 100 triệu USD mỗi ngày. Khoảng dao động phía trên ngưỡng đó đủ rộng để cùng một tỷ lệ tăng mang hai ý nghĩa khác nhau ở hai đầu. Một mã có thanh khoản thấp dễ bị đẩy giá hơn và khó bán ra tại mức giá đang hiển thị hơn.

Những cổ phiếu giảm mạnh nhất năm 2026

Cùng một thước đo nhưng theo chiều ngược lại: những mã có mức giảm lũy kế từ đầu năm lớn nhất trong số các mã vượt cùng ngưỡng thanh khoản.

Truy vấnCổ phiếu giảm mạnh nhất năm 2026: 10 mã giảm mạnh nhất từ đầu năm trong nhóm giao dịch sôi động
tickerlợi nhuận từ đầu năm (%)giá trị giao dịch USD bình quân/ngày (triệu)
TTD-60.5192
WING-54.4103
APP-54.11257
CSGP-52.8144
FLUT-52.7140
STLA-51.5105
BSX-51763
KLAR-50.4145
RBLX-49.1303
JOBY-48.8153
Câu lệnh SQL chính xác đằng sau mỗi con số
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
Tự chạy truy vấn này

Mức giảm lũy kế từ đầu năm lớn nhất thuộc về TTD, ở mức -60.5%, tiếp theo là WING, ở mức -54.4%. Đứng thứ mười trong danh sách là JOBY, ở mức -48.8%. Một số mã trong danh sách này là các công ty lớn, được nhiều nhà đầu tư nắm giữ, thay vì các micro cap mang tính đầu cơ. Đây là điều khiến nhiều người bất ngờ khi xem danh sách cổ phiếu giảm mạnh. Thanh khoản và mức độ bao phủ của chuyên viên phân tích không tạo ra mức sàn cho giá cổ phiếu. Nhà đầu tư phân bổ tỷ trọng quá lớn vào một trong các mã này phải chịu trọn mức biến động, được trang rủi ro khi nắm giữ một cổ phiếu đo lường bằng các chỉ số biến động và drawdown.

Thị trường tăng giá đến đâu trong năm 2026

Bảng xếp hạng chỉ cho thấy hai cực. Độ rộng thị trường cho thấy phần còn lại: toàn bộ danh mục được sàng lọc, bao gồm cả các quỹ chỉ số, được phân bổ như thế nào giữa các mã tăng và giảm, phân theo mức độ biến động.

Truy vấnĐộ rộng từ đầu năm: phân bổ của vũ trụ được sàng lọc theo các khoảng lợi suất
nhómtêntỷ trọng bên (%)
Down 40%+1835.5
Down 20-40%6935.5
Down 10-20%7835.5
Down 0-10%16235.5
Up 0-10%15264.5
Up 10-25%19864.5
Up 25-50%14264.5
Up 50%+10364.5
Câu lệnh SQL chính xác đằng sau mỗi con số
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
Tự chạy truy vấn này

64.5% số mã được sàng lọc tăng từ đầu năm và 35.5% giảm. Phân bổ này cho thấy những gì bảng top-ten che khuất. Có 18 mã nằm trong nhóm Down 40%+ ở một đầu và 103 mã trong nhóm Up 50%+ ở đầu kia, so với 162 mã trong nhóm Down 0-10%152 mã trong nhóm Up 0-10% ở hai phía của mức không đổi. Trong bất kỳ năm nào, phần lớn thị trường đều biến động ở mức thông thường; các mã xuất hiện trong hai bảng trên là ngoại lệ tạo nên các mức bình quân.

Thị trường đang ở đâu

Diễn biến của một cổ phiếu riêng lẻ sẽ khác khi đặt trong tương quan với diễn biến của chính thị trường. Bốn ETF chỉ số lớn, trong đúng cùng một khoảng thời gian:

Truy vấnBốn ETF chỉ số lớn, từ đầu năm, trong cùng khoảng thời gian đo lường
nhãnlợi nhuận từ đầu năm (%)tính từ ngàytính đến ngày
Russell 2000 (IWM)19.22026-01-022026-09-03
Nasdaq 100 (QQQ)15.72026-01-022026-09-03
S&P 500 (SPY)12.72026-01-022026-09-03
Dow (DIA)11.42026-01-022026-09-03
Câu lệnh SQL chính xác đằng sau mỗi con số
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
Tự chạy truy vấn này

Cả hai bảng và biểu đồ trên đều được đo trong cùng một khoảng thời gian: phiên giao dịch đầy đủ đầu tiên của năm 2026 (2026-01-02) đến phiên gần nhất đã hoàn tất (2026-09-03). Trong khoảng thời gian này, Russell 2000 (IWM) tăng 19.2% và Dow (DIA) tăng 11.4%. Mọi mã trong bảng tăng giá đều vượt xa cả bốn chỉ số. Đây là tác động về mặt toán học của một chỉ số: hàng trăm cổ phiếu được gộp thành một đường dữ liệu, khiến các biến động riêng lẻ phần nào triệt tiêu lẫn nhau. Độ phân tán bên dưới đường dữ liệu đó rộng hơn nhiều so với bản thân đường dữ liệu, còn bảng xếp hạng các ngành trong nửa đầu năm xếp hạng cả mười một ngành theo tương quan với nhau.

Chia cổ phiếu tạo ra biến động giả từ đầu năm

Chia cổ phiếu làm thay đổi số lượng cổ phiếu và giá mỗi cổ phiếu, nhưng không làm thay đổi giá trị của khoản nắm giữ. Trong một khoảng thời gian dài như vậy, nhiều công ty thực hiện chia cổ phiếu. Khi đó, cách tính từ đầu năm chưa điều chỉnh sẽ xem thay đổi của giá mỗi cổ phiếu là hiệu suất. Các mã dưới đây đều thực hiện chia cổ phiếu hoặc trả cổ tức bằng cổ phiếu trong năm 2026 với quy mô đủ lớn để làm giá mỗi cổ phiếu thay đổi ít nhất một phần năm. Đồng thời, mỗi mã đều vượt qua ngưỡng thanh khoản giống nhau, nên đủ điều kiện xuất hiện trên các bảng phía trên trước khi bộ lọc chia cổ phiếu loại ra.

Truy vấnLoại khỏi bảng: các đợt chia tách năm 2026 đủ lớn để làm sai lệch biến động từ đầu năm
tickertừ đầu năm chưa điều chỉnh (%)tác động của chia tách lên giá (%)loại chia táchngày chia tách
BKNG-96.4-96forward split2026-04-06
KLAC-86.3-90forward split2026-06-12
VGT-84.1-87.5forward split2026-04-21
CVNA-82.6-80forward split2026-05-08
VUG-81.9-83.3forward split2026-04-21
HDV-75.6-80forward split2026-04-29
IWF-74.1-75forward split2026-04-29
VO-71.7-75forward split2026-04-21
CRWD-54.6-75stock dividend2026-07-02
MNST-42.5-50stock dividend2026-08-11
APH-40.1-50stock dividend2026-09-03
MVLL4.3-66.7forward split2026-06-26
HON6.1100reverse split2026-06-29
DD224.3200reverse split2026-06-24
Câu lệnh SQL chính xác đằng sau mỗi con số
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
Tự chạy truy vấn này

BKNG sẽ hiển thị -96.4% trên màn hình chưa điều chỉnh sau khi một forward split làm giá mỗi cổ phiếu thay đổi -96%, còn KLAC sẽ hiển thị -86.3% sau khi một forward split làm giá thay đổi -90%. Không nhà đầu tư nào nắm giữ hai mã này bị mất giá trị vào ngày việc chia cổ phiếu có hiệu lực. Giá mỗi cổ phiếu được chia và số lượng cổ phiếu được nhân với cùng một hệ số. Cột tác động của việc chia cổ phiếu tách riêng phần thay đổi giá chỉ do việc chia cổ phiếu tạo ra. Đây là phần mà màn hình chưa điều chỉnh ghi nhận như hiệu suất.

Hàng cuối cùng của bảng diễn biến theo chiều ngược lại: DD hiển thị 224.3% sau khi một reverse split làm giá mỗi cổ phiếu tăng 200%, khiến giá tăng thay vì giảm. Bất kỳ danh sách nào bỏ qua bước này đều đồng thời đưa ra thông tin sai ở cả đầu và cuối bảng. Vì vậy, màn hình tách các ticker đã chia cổ phiếu sang một nhóm riêng thay vì cố điều chỉnh lại giá của chúng. Một quỹ cũng có thể xuất hiện trong bảng này như một công ty: các quỹ chỉ số cũng chia cổ phiếu, và màn hình này bao gồm cả hai loại.

Cách đo lường bộ lọc

Mỗi giai đoạn của bộ lọc, cùng số mã còn lại sau từng giai đoạn:

Truy vấnQuy trình sàng lọc theo từng bước: số mã vượt qua mỗi bộ lọc
bước lọctên
Traded the first and the last full session4471
Averaging $100m+ a day over the past month1000
Opened 2026 above $10 a share970
Not on the excluded-fund list938
No split or stock dividend in 2026922
Câu lệnh SQL chính xác đằng sau mỗi con số
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
)
Tự chạy truy vấn này

Phương pháp đầy đủ:

  • Khoảng thời gian. Từ phiên giao dịch đầy đủ đầu tiên của năm 2026 đến phiên đầy đủ gần nhất trên dữ liệu giao dịch. Hai mốc này được lấy từ các nến phút. Một phiên chỉ được tính khi có đủ số nến trong giờ giao dịch chính thức. Vì vậy, phiên đang diễn ra không bao giờ được xem là đã kết thúc.
  • Suất sinh lợi. So sánh giá mở cửa đầu tiên trong phiên chính thức của năm với giá đóng cửa cuối cùng trong phiên chính thức, tính từ các nến phút. Các giao dịch premarket và after-hours được bỏ qua. Đây là suất sinh lợi theo giá; cổ tức không được cộng trở lại. Vì vậy, mã có tỷ suất cổ tức cao sẽ có kết quả thấp hơn đôi chút so với khi tính theo tổng suất sinh lợi.
  • Ngưỡng thanh khoản. Giá trị giao dịch trung bình trong giờ chính thức phải đạt ít nhất 100 triệu USD mỗi phiên trong 20 ngày lịch gần nhất. Chỉ các phiên diễn ra trọn vẹn từ đầu đến cuối mới được tính. Nếu không, một phiên chưa đầy đủ sẽ lấy giá trị giao dịch của một phần ngày chia cho cả ngày, khiến thanh khoản của mọi mã bị đánh giá thấp. Bộ lọc này đưa phạm vi từ 4471 ticker xuống còn 1000.
  • Ngưỡng giá. Cổ phiếu phải mở cửa năm ở mức trên 10 USD mỗi cổ phiếu. Các mã dưới 10 USD có thể tạo ra tỷ lệ phần trăm lớn chỉ từ những bước giá nhỏ.
  • Các quỹ đòn bẩy và quỹ nghịch đảo bị loại thông qua một danh sách được tuyển chọn, được in đầy đủ trong SQL bên dưới mỗi bảng. Danh sách bao gồm các quỹ bám theo chỉ số bằng đòn bẩy và các quỹ cổ phiếu đơn lẻ khuếch đại biến động hàng ngày của một công ty. Một quỹ có đòn bẩy có thể đứng đầu danh sách các mã tăng mạnh nhất mà không cần bất kỳ tin tức doanh nghiệp nào. Danh sách được duy trì thủ công, và đây là điểm yếu của phương pháp: một quỹ ra mắt trong tháng này chỉ bị loại sau khi có người bổ sung vào danh sách.
  • Các quỹ thông thường không bị loại. ETF chỉ số hoặc ETF ngành không sử dụng đòn bẩy, nếu vượt qua ngưỡng thanh khoản và giá, được xếp hạng cùng các công ty hoạt động và cũng được tính trong các chỉ số độ rộng. Một quỹ là rổ gồm các mã đã được tính trong cùng vũ trụ, vì vậy hãy hiểu các dòng này là kết quả của cả rổ, không phải kết quả của một công ty trong năm.
  • Chia tách. Mọi ticker có đợt chia tách hoặc cổ tức bằng cổ phiếu có hiệu lực trong năm 2026 đều được để riêng, dù tỷ lệ chia là bao nhiêu. Đây là lựa chọn thận trọng: phương pháp này khiến một số mã thực sự tăng mạnh không được đưa vào bảng, nhưng không bao giờ công bố thay đổi số lượng cổ phiếu như một suất sinh lợi. Bảng phía trên hiển thị các mã bị loại vì đợt chia tách đủ lớn để tạo ra biến động giả.
  • Niêm yết muộn. Công ty niêm yết sau phiên đầu tiên của năm không có giá tháng Một và không xuất hiện trong các bảng này. Đây là một thiếu hụt thực tế trong một năm có lịch niêm yết mới dày đặc.
  • Kết quả. 922 mã được xếp hạng. Mười mã đứng đầu và mười mã đứng cuối tạo thành hai bảng trên trang này.

Cùng một câu hỏi trong ba khung thời gian

Tính từ đầu năm là một nấc trên thang thời gian, và diễn biến giá sẽ khác nhau ở mỗi độ dài. Khung tuần là những cổ phiếu tăng và giảm mạnh nhất tuần này, khung tháng là những cổ phiếu biến động mạnh nhất tháng này, còn trang này theo dõi cả năm. Tiêu chí sàng lọc khác nhau ở mỗi nấc: trang này yêu cầu giá trị giao dịch trung bình 100 triệu USD mỗi ngày trong tháng vừa qua, trong khi các trang tuần và tháng sàng lọc theo tổng giá trị giao dịch trong chính khung thời gian đó. Vì vậy, một mã có thể vượt qua tiêu chí của bảng này nhưng không đạt bảng khác. Một mã đứng đầu bảng tuần nhờ phản ứng với một báo cáo kết quả kinh doanh thường chỉ ở giữa bảng khi xét cả năm. Để có bức tranh rộng hơn về diễn biến từ đầu năm, tổng quan thị trường nửa đầu năm trình bày chi tiết về các chỉ số, lãi suất và nhóm ngành; còn ETF đòn bẩy hoạt động như thế nào giải thích lý do các quỹ sử dụng đòn bẩy được loại khỏi danh sách này.

Câu hỏi thường gặp

Cổ phiếu có hiệu suất tốt nhất năm 2026 là mã nào?

Trong nhóm các mã có giá trị giao dịch bình quân ít nhất 100 triệu USD mỗi ngày, mở cửa năm ở mức trên 10 USD, không có đợt split nào trong năm 2026 và không nằm trong danh sách quỹ đòn bẩy, SNDK là cổ phiếu có hiệu suất tốt nhất năm 2026 tính đến nay, tăng 536.4% so với phiên đầu tiên của năm. MRNA đứng thứ hai với mức tăng 399%.

Những cổ phiếu nào giảm mạnh nhất năm 2026?

TTD là cổ phiếu có hiệu suất kém nhất trong năm 2026 theo tiêu chí sàng lọc này, giảm -60.5%, xếp trước WING với mức giảm -54.4%. Danh sách đầy đủ các cổ phiếu giảm mạnh nhất năm 2026 nằm trong bảng thứ hai ở trên và được cập nhật trong suốt năm.

Lợi suất cổ phiếu từ đầu năm được tính như thế nào?

Lợi suất từ đầu năm so sánh giá mới nhất với giá tại thời điểm bắt đầu năm dương lịch, rồi thể hiện mức thay đổi dưới dạng phần trăm. Ở đây, chỉ số này được tính bằng giá mở cửa của phiên giao dịch thông thường đầu tiên năm 2026 so với giá đóng cửa của phiên gần nhất đã hoàn tất. Các cổ phiếu thực hiện split trong năm được loại khỏi danh sách thay vì điều chỉnh dữ liệu, do đó không có hệ số điều chỉnh nào nằm giữa người đọc và dữ liệu giao dịch.

Các ETF đòn bẩy có được đưa vào danh sách cổ phiếu tăng giá năm 2026 không?

Không. Quỹ đòn bẩy hoặc quỹ inverse nhân biến động hằng ngày của một chỉ số hoặc một cổ phiếu đơn lẻ, nên thường đứng đầu danh sách các mã biến động mạnh dù không có tin tức doanh nghiệp nào hỗ trợ. Các quỹ này được loại theo tên trước khi xếp hạng, và danh sách được hiển thị trong SQL bên dưới mỗi bảng. ETF chỉ số và ETF ngành thông thường thuộc trường hợp khác: chúng phải đáp ứng cùng các ngưỡng như mọi cổ phiếu khác và được xếp hạng ở đây, nên một quỹ có thể xuất hiện trên cả hai bảng.


Mỗi bảng ở đây là một truy vấn được lưu trữ và có SQL đính kèm. Mở rộng bất kỳ bảng nào để kiểm tra tiêu chí sàng lọc, hoặc xây dựng lại truy vấn với các ngưỡng riêng trên terminal Strasmore.

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