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ế.
| ticker | lợi nhuận từ đầu năm (%) | giá trị giao dịch USD bình quân/ngày (triệu) |
|---|---|---|
| SNDK | 536.4 | 15431 |
| MRNA | 399 | 5598 |
| TWST | 305.4 | 202 |
| DELL | 301.8 | 3566 |
| TXG | 287.5 | 142 |
| AEHR | 262.8 | 208 |
| MXL | 233.4 | 114 |
| AXTI | 226.9 | 525 |
| MU | 224.8 | 20455 |
| AMLX | 183.5 | 131 |
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 10SNDK 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.
| ticker | lợi nhuận từ đầu năm (%) | giá trị giao dịch USD bình quân/ngày (triệu) |
|---|---|---|
| TTD | -60.5 | 192 |
| WING | -54.4 | 103 |
| APP | -54.1 | 1257 |
| CSGP | -52.8 | 144 |
| FLUT | -52.7 | 140 |
| STLA | -51.5 | 105 |
| BSX | -51 | 763 |
| KLAR | -50.4 | 145 |
| RBLX | -49.1 | 303 |
| JOBY | -48.8 | 153 |
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 10Mứ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.
| nhóm | tên | tỷ trọng bên (%) |
|---|---|---|
| Down 40%+ | 18 | 35.5 |
| Down 20-40% | 69 | 35.5 |
| Down 10-20% | 78 | 35.5 |
| Down 0-10% | 162 | 35.5 |
| Up 0-10% | 152 | 64.5 |
| Up 10-25% | 198 | 64.5 |
| Up 25-50% | 142 | 64.5 |
| Up 50%+ | 103 | 64.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 ord64.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% và 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:
| nhãn | lợi nhuận từ đầu năm (%) | tính từ ngày | tính đến ngày |
|---|---|---|---|
| Russell 2000 (IWM) | 19.2 | 2026-01-02 | 2026-09-03 |
| Nasdaq 100 (QQQ) | 15.7 | 2026-01-02 | 2026-09-03 |
| S&P 500 (SPY) | 12.7 | 2026-01-02 | 2026-09-03 |
| Dow (DIA) | 11.4 | 2026-01-02 | 2026-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 DESCCả 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.
| ticker | từ đầu năm chưa điều chỉnh (%) | tác động của chia tách lên giá (%) | loại chia tách | ngày chia tách |
|---|---|---|---|---|
| BKNG | -96.4 | -96 | forward split | 2026-04-06 |
| KLAC | -86.3 | -90 | forward split | 2026-06-12 |
| VGT | -84.1 | -87.5 | forward split | 2026-04-21 |
| CVNA | -82.6 | -80 | forward split | 2026-05-08 |
| VUG | -81.9 | -83.3 | forward split | 2026-04-21 |
| HDV | -75.6 | -80 | forward split | 2026-04-29 |
| IWF | -74.1 | -75 | forward split | 2026-04-29 |
| VO | -71.7 | -75 | forward split | 2026-04-21 |
| CRWD | -54.6 | -75 | stock dividend | 2026-07-02 |
| MNST | -42.5 | -50 | stock dividend | 2026-08-11 |
| APH | -40.1 | -50 | stock dividend | 2026-09-03 |
| MVLL | 4.3 | -66.7 | forward split | 2026-06-26 |
| HON | 6.1 | 100 | reverse split | 2026-06-29 |
| DD | 224.3 | 200 | reverse split | 2026-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 ASCBKNG 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:
| bước lọc | tên |
|---|---|
| Traded the first and the last full session | 4471 |
| Averaging $100m+ a day over the past month | 1000 |
| Opened 2026 above $10 a share | 970 |
| Not on the excluded-fund list | 938 |
| No split or stock dividend in 2026 | 922 |
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
)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.