Cổ phiếu tăng giảm mạnh nhất năm 2026
Xếp hạng cổ phiếu tăng và giảm mạnh nhất năm 2026, tính từ dữ liệu khớp lệnh thực tế trên sàn, đã loại các trường hợp tách cổ phiếu và quỹ đòn bẩy.
Cổ phiếu tăng giá mạnh nhất năm 2026 tính đến hiện tại dẫn đầu bởi MRNA, tăng 692.8% tính từ phiên giao dịch đầu tiên của năm đến phiên gần nhất đã kết thúc. Trang này xếp hạng những cổ phiếu tăng và giảm mạnh nhất từ đầu năm 2026 trong số các mã thực sự có giao dịch, được đo từ dữ liệu khớp lệnh trên sàn thay vì bản tổng hợp của nhà cung cấp dữ liệu, và được cập nhật liên tục trong suốt năm. Các trường hợp tách cổ phiếu và các quỹ đòn bẩy đều bị loại trước khi xếp hạng, đây chính là điểm mà hầu hết các danh sách tăng giảm từ đầu năm thường mắc lỗi mà không hề nhận ra.
Những cổ phiếu tăng mạnh nhất năm 2026
Mỗi mã dưới đây đều vượt ngưỡng thanh khoản tối thiểu trước khi được xếp hạng: trung bình ít nhất 100 triệu đô la giá trị cổ phiếu được giao dịch mỗi phiên trong tháng qua. Một tỷ lệ phần trăm lớn trên một cổ phiếu không ai giao dịch chỉ là một mức giá yết, không phải một kết quả thực tế.
| Ticker | Lợi nhuận YTD (%) | GTGD BQ ngày (triệu $) |
|---|---|---|
| MRNA | 692.8 | 3002 |
| SNDK | 471 | 11073 |
| TWST | 355.2 | 476 |
| TXG | 343.5 | 334 |
| MXL | 338.4 | 246 |
| DELL | 268 | 3100 |
| AXTI | 236.9 | 499 |
| AEHR | 229.3 | 203 |
| PBF | 218.3 | 195 |
| KOD | 215.7 | 389 |
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 10MRNA dẫn đầu năm nay với mức 692.8%, tiếp theo là SNDK với 471% và TWST đứng thứ ba với 355.2%. Vị trí thứ mười trên bảng, KOD, vẫn tăng 215.7%, cho thấy toàn bộ bảng xếp hạng này đã bỏ xa bất kỳ chỉ số thị trường rộng nào.
Cột giá trị đô la bên cạnh mỗi mức biến động mang lượng thông tin không kém gì tỷ lệ phần trăm. KOD có giá trị giao dịch bình quân khoảng 389 triệu đô la mỗi ngày. MRNA ở vị trí đầu bảng có giá trị giao dịch bình quân 3002 triệu đô la. Mọi mã ở đây đều vượt ngưỡng 100 triệu đô la mỗi ngày, và khoảng cách phía trên ngưỡng đó đủ rộng để cùng một tỷ lệ phần trăm nổi bật lại mang hai ý nghĩa khác nhau ở hai đầu. Một mã có thanh khoản mỏng sẽ dễ bị đẩy giá hơn và khó thoát ra ở đúng mức giá hiển thị trên màn hình hơn.
Cổ phiếu giảm mạnh nhất năm 2026
Thước đo tương tự, chiều ngược lại: mức giảm tính từ đầu năm sâu nhất trong số các mã đạt cùng ngưỡng thanh khoản.
| Ticker | Lợi nhuận YTD (%) | GTGD BQ ngày (triệu $) |
|---|---|---|
| CTVA | -80.8 | 410 |
| TTD | -65.7 | 176 |
| FLUT | -64.8 | 159 |
| JOBY | -64.3 | 114 |
| STLA | -61.5 | 126 |
| OKLO | -59.4 | 288 |
| APP | -59.1 | 1168 |
| SMR | -57.8 | 217 |
| FICO | -54.5 | 998 |
| Z | -54.1 | 114 |
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 từ đầu năm sâu nhất thuộc về CTVA với -80.8%, theo sau là TTD với -65.7%. Đứng thứ mười trong danh sách, Z, ở mức -54.1%. Nhiều mã trong danh sách này là các công ty lớn, được nắm giữ rộng rãi, chứ không phải cổ phiếu vốn hóa siêu nhỏ mang tính đầu cơ, và đây chính là điểm khiến danh sách cổ phiếu giảm mạnh gây bất ngờ. Thanh khoản và mức độ theo dõi của giới phân tích không đặt ra bất kỳ ngưỡng chặn nào cho giá cổ phiếu. Ai nắm giữ một trong các mã này với tỷ trọng quá lớn trong danh mục sẽ chịu trọn biến động đó, điều mà trang rủi ro khi nắm giữ một cổ phiếu duy nhất đo lường bằng các số liệu về biến động và mức sụt giảm.
Bao nhiêu phần trăm thị trường tăng giá trong năm 2026
Bảng xếp hạng chỉ cho thấy hai đầu cực. Chỉ số breadth cho thấy phần thân: toàn bộ vũ trụ cổ phiếu được sàng lọc, kể cả các quỹ chỉ số, chia thành nhóm tăng giá và nhóm giảm giá, phân theo biên độ biến động.
| Nhóm | Tên | Tỷ trọng phía (%) |
|---|---|---|
| Down 40%+ | 37 | 41.2 |
| Down 20-40% | 84 | 41.2 |
| Down 10-20% | 104 | 41.2 |
| Down 0-10% | 187 | 41.2 |
| Up 0-10% | 162 | 58.8 |
| Up 10-25% | 194 | 58.8 |
| Up 25-50% | 116 | 58.8 |
| Up 50%+ | 116 | 58.8 |
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 ord58.8% mã trong số các mã được sàng lọc tăng giá tính từ đầu năm và 41.2% mã giảm giá. Sự phân bố này là điều mà bảng xếp hạng top 10 không thể hiện. 37 mã nằm trong nhóm Down 40%+ ở một đầu và 116 mã nằm trong nhóm Up 50%+ ở đầu kia, so với 187 mã trong nhóm Down 0-10% và 162 mã trong nhóm Up 0-10% ở hai bên mức không đổi. Phần lớn thị trường trong bất kỳ năm nào cũng chỉ biến động ở mức bình thường, và các mã trong hai bảng nêu trên chỉ là những trường hợp ngoại lệ mà từ đó các mức bình quân được tính ra.
Thị trường nói chung đang ở đâu
Diễn biến trong năm của một cổ phiếu đơn lẻ có ý nghĩa khác hẳn khi đặt cạnh diễn biến của chính thị trường. Bốn quỹ ETF chỉ số lớn, tính trong đúng cùng một khoảng thời gian:
| Nhãn | Lợi nhuận YTD (%) | Từ ngày | Đến ngày |
|---|---|---|---|
| Nasdaq 100 (QQQ) | 17.4 | 2026-01-02 | 2026-10-15 |
| S&P 500 (SPY) | 12.5 | 2026-01-02 | 2026-10-15 |
| Russell 2000 (IWM) | 11.1 | 2026-01-02 | 2026-10-15 |
| Dow (DIA) | 8.2 | 2026-01-02 | 2026-10-15 |
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 trên và biểu đồ phía trên đều được đo trong một khoảng thời gian: từ phiên giao dịch đầy đủ đầu tiên của năm 2026 (2026-01-02) đến phiên giao dịch gần nhất đã hoàn tất (2026-10-15). Trong khoảng thời gian đó, Nasdaq 100 (QQQ) đạt mức sinh lời 17.4% và Dow (DIA) đạt mức sinh lời 8.2%. Mọi mã trong bảng tăng giá đều vượt cả bốn chỉ số này với biên độ lớn, đây chính là bản chất số học của một chỉ số: hàng trăm mã cổ phiếu được tính trung bình vào một con số duy nhất, trong đó 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 con số đó rộng hơn nhiều so với con số của chính chỉ số, và bảng xếp hạng các ngành trong nửa đầu năm xếp hạng toàn bộ mười một ngành so với nhau.
Chia tách cổ phiếu khiến mức biến động từ đầu năm bị sai lệch
Việc chia tách 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ị thực của phầ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 tách cổ phiếu, và cách tính biến động từ đầu năm (YTD) không điều chỉnh sẽ hiểu sai sự thay đổi giá mỗi cổ phiếu này là hiệu suất thực tế. Các mã cổ phiếu dưới đây đều từng thực hiện chia tách hoặc trả cổ tức bằng cổ phiếu trong năm 2026 với mức độ đủ lớn để làm thay đổi giá cổ phiếu ít nhất một phần năm, và mỗi mã đều đạt ngưỡng thanh khoản tương tự, nên đều đủ điều kiện xuất hiện trong các bảng xếp hạng ở trên trước khi bị bộ lọc chia tách loại ra.
| Ticker | YTD chưa điều chỉnh (%) | Tác động giá chia tách (%) | Loại chia tách | Ngày chia tách |
|---|---|---|---|---|
| BKNG | -96.9 | -96 | forward split | 2026-04-06 |
| KLAC | -86.2 | -90 | forward split | 2026-06-12 |
| CVNA | -85.6 | -80 | forward split | 2026-05-08 |
| VGT | -83.9 | -87.5 | forward split | 2026-04-21 |
| VUG | -81.7 | -83.3 | forward split | 2026-04-21 |
| VOOG | -81 | -83.3 | forward split | 2026-04-21 |
| MGK | -77.9 | -80 | forward split | 2026-04-21 |
| IWF | -73.9 | -75 | forward split | 2026-04-29 |
| VO | -72.2 | -75 | forward split | 2026-04-21 |
| INTW | -57.3 | -87.5 | forward split | 2026-06-26 |
| CRWD | -48.4 | -75 | stock dividend | 2026-07-02 |
| MNST | -40.9 | -50 | stock dividend | 2026-08-11 |
| APH | -40.6 | -50 | stock dividend | 2026-09-03 |
| HON | 7.6 | 100 | reverse split | 2026-06-29 |
| ETHA | 141.8 | 200 | reverse split | 2026-10-06 |
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.9% trên một bảng lọc không điều chỉnh sau khi một đợt forward split khiến giá mỗi cổ phiếu của mã này -96%, và KLAC sẽ hiển thị -86.2% sau khi một đợt forward split khiến giá của mã này -90%. Không nhà đầu tư nắm giữ nào trong hai mã này bị mất bất cứ giá trị nào vào ngày lệnh chia tách có hiệu lực. Giá mỗi cổ phiếu bị chia và số lượng cổ phiếu được nhân lên theo cùng một tỷ lệ. Cột hiệu ứng chia tách tách riêng phần thay đổi giá chỉ do việc chia tách gây ra, đây chính là phần mà một bảng lọc không điều chỉnh sẽ hiểu nhầm là hiệu suất thực tế.
Dòng cuối cùng của bảng lại diễn ra theo chiều ngược lại: ETHA cho thấy 141.8% sau khi một đợt reverse split đẩy giá mỗi cổ phiếu của mã này 200%, tức là làm tăng giá thay vì giảm giá. Bất kỳ danh sách nào bỏ qua bước này đều công bố số liệu sai lệch ở cả nhóm đứng đầu và nhóm đứng cuối cùng một lúc, đó là lý do bảng lọc này loại các mã có chia tách ra riêng thay vì cố gắng đ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 dễ dàng như một công ty: các quỹ chỉ số cũng thực hiện chia tách cổ phiếu, và bảng lọc này áp dụng cho cả hai đối tượng.
Cách đo lường bộ lọc này
Từng giai đoạn của bộ lọc, kèm số mã cổ phiếu còn lại sau mỗi bước:
| Bước sàng lọc | Tên |
|---|---|
| Traded the first and the last full session | 4543 |
| Averaging $100m+ a day over the past month | 1082 |
| Opened 2026 above $10 a share | 1049 |
| Not on the excluded-fund list | 1017 |
| No split or stock dividend in 2026 | 1000 |
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, trình bày đầy đủ:
- Khung 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 có dữ liệu. Cả hai mốc đều được đọc từ dữ liệu nến từng phút, và một phiên chỉ được tính khi có đủ số lượng nến của toàn bộ giờ giao dịch chính thức, nên một ngày giao dịch còn dang dở sẽ không bao giờ được coi là đã hoàn tất.
- Mức lợi nhuận. So sánh giá mở cửa phiên chính thức đầu tiên trong năm với giá đóng cửa phiên chính thức gần nhất, tính từ dữ liệu nến từng phút. Các lệnh khớp trước giờ và sau giờ giao dịch chính thức đều bị bỏ qua. Đây là lợi nhuận tính theo giá, không cộng lại cổ tức, nên một mã có tỷ suất cổ tức cao sẽ cho kết quả kém hơn một chút so với con số tính theo tổng lợi nhuận.
- Ngưỡng thanh khoản tối thiểu. Giá trị giao dịch bình quân trong giờ giao dịch chính thức đạt tối thiểu 100 triệu USD mỗi phiên, tính trong 20 ngày lịch gần nhất, chỉ tính các phiên diễn ra trọn vẹn từ đầu đến cuối. Nếu tính cả phiên giao dịch dang dở, giá trị giao dịch của một phần ngày sẽ bị chia cho cả một ngày đầy đủ, khiến giá trị giao dịch của mọi mã đều bị đánh giá thấp hơn thực tế. Riêng bộ lọc này đã thu hẹp danh sách từ 4543 mã xuống còn 1082 mã.
- Ngưỡng giá tối thiểu. Cổ phiếu phải mở cửa đầu năm trên 10 USD/cổ phiếu. Các mã dưới 10 USD dễ tạo ra mức phần trăm biến động lớn chỉ từ những bước giá nhỏ.
- Các quỹ đòn bẩy và quỹ nghịch đảo bị loại trừ thông qua một danh sách được chọn lọc thủ công, in đầy đủ trong đoạn SQL bên dưới mỗi bảng. Danh sách này bao gồm các quỹ đòn bẩy theo chỉ số và các quỹ đơn cổ phiếu nhân biến động giá hàng ngày của một công ty. Một quỹ đòn bẩy có thể đứng đầu bất kỳ danh sách biến động thô nào mà không cần một tin tức nào về công ty. Danh sách này được cập nhật thủ công, và đó cũng là điểm yếu của nó: một quỹ mới niêm yết trong tháng này chỉ bị loại trừ sau khi có người bổ sung vào danh sách.
- Các quỹ thông thường không bị loại khỏi danh sách. Một quỹ ETF chỉ số hoặc theo ngành không dùng đòn bẩy, nếu vượt qua ngưỡng thanh khoản và ngưỡng giá, vẫn được xếp hạng ở đây cùng với các công ty hoạt động kinh doanh thông thường, và cũng được tính vào số liệu độ rộng thị trường. Một quỹ là một rổ các mã đã được tính trong cùng một tập hợp, nên cần đọc các dòng này như diễn biến của cả rổ, chứ không phải như kết quả của một công ty đơn lẻ.
- Chia tách cổ phiếu. Bất kỳ mã nào có chia tách cổ phiếu hoặc trả cổ tức bằng cổ phiếu có hiệu lực trong năm 2026 đều bị loại ra, dù tỷ lệ nhỏ đến đâu. Đây là lựa chọn thận trọng: nó khiến một số ít mã có kết quả thực sự tốt bị mất chỗ trên bảng xếp hạng, nhưng đổi lại không bao giờ công bố một thay đổi về số lượng cổ phiếu lưu hành như thể đó là lợi nhuận. Bảng phía trên cho thấy các mã bị loại có mức chia tách đủ lớn để tạo ra biến động giả.
- Niêm yết muộn. Một công ty niêm yết sau phiên giao dịch đầu tiên của năm sẽ không có giá tháng Một, nên không xuất hiện trong các bảng này — đây là một khoảng trống thực sự trong một năm có lịch niêm yết mới dày đặc.
- Kết quả. 1000 mã được xếp hạng, và mười mã đứng đầu cùng mười mã đứng cuối trong số đó tạo thành hai bảng trên trang này.
Cùng một câu hỏi, nhìn qua ba khung thời gian
Từ đầu năm đến nay chỉ là một nấc trong cả một bậc thang, và một biến động trông sẽ khác nhau ở mỗi độ dài thời gian. Góc nhìn theo tuần là những cổ phiếu tăng và giảm mạnh nhất tuần này, góc nhìn theo tháng là những cổ phiếu biến động mạnh nhất tháng này, còn trang này là góc nhìn theo năm. Ngưỡng sàng lọc khác nhau ở mỗi nấc: trang này sàng lọc theo khối lượng giao dịch bình quân 100 triệu USD một ngày trong tháng qua, còn 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 của chúng, nên một mã có thể lọt vào bảng này nhưng lại vắng mặt ở bảng khác. Một mã đứng đầu bảng xếp hạng tuần nhờ phản ứng sau báo cáo lợi nhuận thường chỉ nằm ở nhóm giữa bảng khi xét theo năm. Để nắm bức tranh rộng hơn về diễn biến từ đầu năm đến nay, bản tổng kết thị trường nửa đầu năm có đầy đủ chi tiết về chỉ số, lãi suất và các nhóm ngành, còn cách thức hoạt động của các ETF đòn bẩy giải thích lý do các quỹ có sử dụng đòn bẩy được tách riêng ra khỏi danh sách này.
Câu hỏi thường gặp
Cổ phiếu nào có hiệu suất tốt nhất năm 2026?
Trong số các mã có khối lượng giao dịch bình quân tối thiểu 100 triệu USD mỗi ngày, mở cửa năm trên mức 10 USD, không thực hiện chia tách cổ phiếu trong năm 2026 và không nằm trong danh sách quỹ đòn bẩy, MRNA là cổ phiếu có hiệu suất tốt nhất năm 2026 tính đến thời điểm hiện tại, tăng 692.8% so với phiên giao dịch đầu tiên của năm. SNDK đứng thứ hai với mức tăng 471%.
Những cổ phiếu nào giảm mạnh nhất năm 2026?
CTVA là cổ phiếu có hiệu suất kém nhất năm 2026 theo tiêu chí sàng lọc này, giảm -80.8%, trước TTD với mức giảm -65.7%. 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, được cập nhật liên tục trong suốt năm.
Lợi suất cổ phiếu tính từ đầu năm được tính như thế nào?
Lợi suất tính 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 và thể hiện mức thay đổi theo phần trăm. Ở đây, mức giá được dùng là giá mở cửa của phiên giao dịch thường lệ đầu tiên năm 2026, đối chiếu với giá đóng cửa của phiên giao dịch gần nhất đã hoàn tất. Những cổ phiếu có thực hiện chia tách trong năm sẽ được loại khỏi danh sách thay vì điều chỉnh số liệu, nên không có hệ số điều chỉnh nào chen giữa người đọc và dữ liệu thị trường.
Danh sách cổ phiếu tăng giá mạnh nhất năm 2026 có bao gồm các quỹ ETF đòn bẩy không?
Không. Một quỹ đòn bẩy hoặc quỹ nghịch đảo nhân mức biến động hàng ngày của một chỉ số hoặc một cổ phiếu đơn lẻ, nên loại quỹ này thường xuyên đứng đầu danh sách biến động mạnh dù không có tin tức doanh nghiệp nào đứng sau. Các quỹ này bị loại theo tên trước khi xếp hạng, và danh sách loại trừ này có thể xem được trong đoạn SQL bên dưới mỗi bảng. Các quỹ ETF chỉ số và ngành thông thường lại là trường hợp khác: chúng phải đáp ứng các ngưỡng tối thiểu 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 ở cả hai bảng.
Mỗi bảng ở đây là một truy vấn lưu trữ kèm theo đoạn SQL tương ứng. Hãy mở rộng bất kỳ bảng nào để kiểm tra lại tiêu chí sàng lọc, hoặc tự xây dựng lại với các ngưỡng của riêng bạn trên nền tảng Strasmore.