Danh sách cổ phiếu tăng và giảm năm 2026
Bảng xếp hạng các mã cổ phiếu tăng trưởng và sụt giảm mạnh nhất năm 2026 dựa trên thanh khoản thực tế, không bao gồm các quỹ đòn bẩy và cổ phiếu chia tách.
Các cổ phiếu tăng trưởng tốt nhất trong năm 2026 tính đến thời điểm hiện tại đang được dẫn dắt bởi SNDK, tăng 550.2% kể từ phiên mở cửa đầu năm cho đến phiên giao dịch gần nhất. Trang này xếp hạng các mã tăng và giảm mạnh nhất trong năm 2026 dựa trên các cổ phiếu có thanh khoản thực tế, được đo lường trực tiếp từ dữ liệu sàn giao dịch thay vì bản tóm tắt từ nhà cung cấp, và dữ liệu sẽ được cập nhật liên tục trong năm. Các trường hợp chia tách cổ phiếu và các quỹ đòn bẩy được loại bỏ trước khi xếp hạng, đây là điểm mà hầu hết các danh sách tính từ đầu năm đến nay thường mắc lỗi.
Những cổ phiếu tăng trưởng mạnh nhất năm 2026
Tất cả các mã dưới đây đều phải vượt qua ngưỡng thanh khoản trước khi được xếp hạng: trung bình có ít nhất 100 triệu USD cổ phiếu được giao dịch trong mỗi phiên hoàn tất trong tháng qua. Một mức tăng lớn ở một cổ phiếu không có người giao dịch chỉ là con số trên báo giá, không phải kết quả thực tế.
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 năm với mức tăng 550.2%, tiếp theo là MXL với 382.4% và AEHR đứng thứ ba với 370.6%. Ở vị trí thứ mười, SYRE vẫn tăng 213.2%, do đó toàn bộ bảng xếp hạng này đang bứt phá xa so với bất kỳ chỉ số thị trường chung nào.
Cột giá trị bằng USD bên cạnh mỗi mức biến động cũng mang lại nhiều thông tin tương đương với tỷ lệ phần trăm. SYRE đạt mức doanh số trung bình khoảng 100 triệu USD mỗi ngày. SNDK ở đầu bảng xếp hạng đạt trung bình 18782 triệu USD. Mọi mã trong danh sách này đều đạt mức giao dịch 100 triệu USD mỗi ngày, và khoảng cách so với ngưỡng đó là đủ lớn để cùng một tỷ lệ phần trăm tiêu đề mang ý nghĩa khác nhau ở hai đầu của nó. Một cổ phiếu có thanh khoản mỏng sẽ dễ bị đẩy giá lên nhưng cũng khó để thoát lệnh ở mức giá hiển thị trên màn hình.
Những cổ phiếu giảm giá mạnh nhất năm 2026
Một thước đo tương tự nhưng ngược lại: những mức giảm mạnh nhất kể từ đầu năm trong số các mã vượt qua cùng một ngưỡng thanh khoản.
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 mạnh nhất kể từ đầu năm thuộc về EOSE tại -63.6%, tiếp theo là CSGP tại -57.5%. Đứng thứ mười trong danh sách là HUBS với mức giảm -45.2%. Một số mã trong danh sách này là các công ty lớn, được nắm giữ rộng rãi thay vì là các cổ phiếu vốn hóa siêu nhỏ mang tính đầu cơ, đây là điểm gây bất ngờ trong danh sách các cổ phiếu giảm giá. Thanh khoản và sự theo dõi của các nhà phân tích không thể đảm bảo mức giá sàn cho một cổ phiếu. Bất kỳ ai nắm giữ một trong số các cổ phiếu này với tỷ trọng lớn trong danh mục đầu tư đều phải chịu toàn bộ mức biến động, điều mà trang rủi ro khi nắm giữ một cổ phiếu đo lường bằng các con số về biến động và mức sụt giảm.
Thị trường tăng trưởng bao nhiêu trong năm 2026
Bảng xếp hạng chỉ cho thấy hai thái cực. Độ rộng thị trường (breadth) cho thấy bản chất thực sự: cách toàn bộ danh mục được sàng lọc, bao gồm cả các quỹ chỉ số (index funds), phân chia giữa các mã tăng và giảm, được phân loại theo mức độ biến động.
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 ord61.8% mã trong danh mục được sàng lọc có mức tăng trưởng trong năm và 38.2% mã có mức giảm. Sự phân bổ này cho thấy điều mà bảng top-ten đã che giấu. 25 mã nằm trong nhóm Down 40%+ ở một đầu và 132 mã nằm trong nhóm Up 50%+ ở đầu kia, so với 144 mã ở nhóm Down 0-10% và 173 mã ở nhóm Up 0-10% ở hai bên của nhóm không đổi. Hầu hết thị trường đều có những biến động bình thường trong bất kỳ năm nào, và các mã trong hai bảng trên chỉ là những trường hợp ngoại lệ tạo nên các con số trung bình.
Vị thế của thị trường
Biến động của một cổ phiếu riêng lẻ sẽ khác biệt so với diễn biến chung của thị trường. Dưới đây là kết quả của bốn ETF chỉ số chính trong cùng một khoảng thời gian:
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ả bảng điện tử và bảng trên đều được đo lường trong cùng một giai đoạn: 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-07-21). Trong giai đoạn này, Russell 2000 (IWM) đạt lợi nhuận 19.7% và Dow (DIA) đạt lợi nhuận 8.2%. Tất cả các mã trong danh sách cổ phiếu tăng giá đều vượt xa cả bốn chỉ số này, đây là kết quả tất yếu của việc tính toán chỉ số: hàng trăm cổ phiếu được tính trung bình thành một đường biểu diễn, nơi các biến động riêng lẻ có thể triệt tiêu lẫn nhau một phần. Độ lệch spread dưới đường biểu diễn đó rộng hơn nhiều so với chính đường biểu diễn, và bảng điểm ngành cho nửa đầu năm sẽ xếp hạng cả mười một nhóm ngành với nhau.
Việc chia tách cổ phiếu làm sai lệch biến động từ đầu năm đến nay
Việc chia tách cổ phiếu làm thay đổi số lượng cổ phiếu lưu hành và giá mỗi cổ phiếu nhưng không làm thay đổi giá trị thực 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 tách, và các tính toán chưa điều chỉnh từ đầu năm đến nay sẽ coi sự thay đổi giá mỗi cổ phiếu là hiệu suất đầu tư. Các mã dưới đây đều có đợt chia tách hoặc trả cổ tức bằng cổ phiếu vào năm 2026 đủ lớn để làm thay đổi giá ít nhất một phần năm, và mỗi mã đều vượt qua mức thanh khoản tối thiểu tương tự, do đó mỗi mã đều đủ điều kiện xuất hiện trong các bảng trên trước khi bộ lọc chia tách loại bỏ chúng.
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.7% trên màn hình chưa điều chỉnh sau khi một đợt forward split làm thay đổi giá mỗi cổ phiếu -96%, và VGT sẽ hiển thị -84.8% sau khi một đợt forward split làm thay đổi giá -87.5%. Không cổ đông nào của cả hai mã bị mất mát gì vào ngày việc chia tách 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 hiệu ứng chia tách tách biệt phần thay đổi giá chỉ do việc chia tách gây ra, vốn là phần mà màn hình chưa điều chỉnh đọc là hiệu suất.
Dòng cuối cùng của bảng hoạt động theo chiều ngược lại: DD cho thấy 243.4% sau khi một đợt reverse split đẩy giá mỗi cổ phiếu lên 200%, tức là tăng giá thay vì giảm giá. Bất kỳ danh sách nào bỏ qua bước này đều sẽ công bố dữ liệu sai lệch ở cả phần đầu và phần cuối, đó là lý do tại sao màn hình tách riêng các ticker có chia tách thay vì cố gắng điều chỉnh giá của chúng. Một quỹ có thể xuất hiện trong bảng này tương tự như một công ty: các quỹ chỉ số cũng chia tách cổ phiếu của họ, và màn hình này bao quát cả hai.
Cách tính toán chỉ số này
Mỗi giai đoạn của bộ lọc, cùng với số lượng mã còn trụ lại sau đó:
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 tính toán chi tiết:
- Khung thời gian. Từ phiên giao dịch đầy đủ đầu tiên của năm 2026 đến phiên giao dịch đầy đủ gần nhất trên bảng điện. Cả hai điểm đầu và cuối đều được đọc từ các nến phút (minute bars). Một phiên chỉ được tính khi có đầy đủ số lượng nến trong giờ giao dịch chính thức, do đó một ngày đang diễn ra sẽ không bao giờ được coi là đã kết thúc.
- Tỷ suất sinh lời. So sánh giá mở cửa của phiên chính thức đầu tiên trong năm với giá đóng cửa của phiên chính thức gần nhất, được tính từ các nến phút. Các mức giá khớp lệnh trước và sau giờ giao dịch chính thức (premarket và after-hours) đều bị loại bỏ. Đây là tỷ suất sinh lời theo giá; cổ tức không được cộng vào, vì vậy một mã cổ phiếu có tỷ suất cổ tức cao sẽ có kết quả thấp hơn một chút so với con số tính theo tổng tỷ suất sinh lời (total-return).
- Ngưỡng thanh khoản. Trung bình đạt ít nhất 100 triệu USD giá trị giao dịch trong giờ chính thức mỗi phiên trong 20 ngày lịch gần nhất, chỉ tính các phiên giao dịch trọn vẹn từ đầu đến cuối. Nếu không, một phiên giao dịch không trọn vẹn sẽ lấy một phần giá trị của một ngày chia cho cả một ngày, làm giảm mức thanh khoản của mọi mã. Bộ lọc duy nhất này giúp thu hẹp danh sách từ 4516 ticker xuống còn 1039.
- Ngưỡng giá. Cổ phiếu phải có giá mở cửa đầu năm trên 10 USD mỗi cổ phiếu. Các mã dưới 10 USD thường tạo ra tỷ lệ phần trăm lớn chỉ từ những biến động 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 biên soạn sẵn, được liệt kê đầy đủ trong SQL dưới mỗi bảng. Danh sách này bao gồm các quỹ mô phỏng chỉ số và các quỹ cổ phiếu đơn lẻ nhân bội biến động 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 các mã biến động mạnh nào mà không cần bất kỳ tin tức nào về doanh nghiệp. Danh sách này được duy trì thủ công, đây cũng là điểm yếu của nó: một quỹ mới ra mắt trong tháng này chỉ bị loại sau khi có người thêm nó vào danh sách.
- Các quỹ thông thường không bị loại bỏ. Một ETF chỉ số hoặc ETF ngành không sử dụng đòn bẩy, nếu vượt qua các ngưỡng thanh khoản và giá, sẽ được xếp hạng tại đây cùng với các công ty đang hoạt động, và nó cũng nằm trong các số liệu về độ rộng thị trường (breadth counts). Một quỹ là một rổ gồm các mã đã được tính trong cùng một phạm vi, vì vậy hãy hiểu các dòng đó là kết quả của cả rổ thay vì kết quả của một công ty riêng lẻ.
- Chia tách cổ phiếu. Bất kỳ ticker nào có sự kiện 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, bất kể tỷ lệ chia tách lớn hay nhỏ. Đây là lựa chọn thận trọng: nó khiến một số ít các mã tăng trưởng thực sự mất vị trí trên bảng xếp hạng, nhưng nó đảm bảo không bao giờ tính sự thay đổi số lượng cổ phiếu thành tỷ suất sinh lời. Bảng trên hiển thị các mã bị loại trừ có tỷ lệ 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á của tháng Một và không xuất hiện trong các bảng này, đây là một thiếu sót thực tế trong một năm có nhiều đợt niêm yết mới.
- Kết quả. 956 mã được xếp hạng, và mười mã đứng đầu cùng mười mã đứng cuối là hai bảng dữ liệu trên trang này.
Cùng một câu hỏi qua ba khung thời gian
Số liệu lũy kế từ đầu năm giống như một nấc thang, và mỗi bước di chuyển sẽ có đặc điểm khác nhau tùy theo độ dài thời gian. Khung tuần hiển thị những cổ phiếu tăng và giảm mạnh nhất tuần này, khung tháng hiển thị những cổ phiếu biến động mạnh nhất tháng này, và trang này hiển thị dữ liệu của cả năm. Các tiêu chí lọc khác nhau tùy theo từng nấc: trang này lọc dựa trên mức trung bình 100 triệu USD mỗi ngày trong tháng qua, trong khi các trang tuần và tháng lọc dựa trên tổng giá trị giao dịch trong khung thời gian của chúng, do đó một mã cổ phiếu có thể đứng đầu danh sách này nhưng lại không có tên trong danh sách kia. Một mã cổ phiếu đứng đầu bảng tuần do phản ứng sau báo cáo thu nhập thường chỉ nằm ở giữa bảng xếp hạng cả năm. Để hiểu rõ hơn về bối cảnh thị trường từ đầu năm đến nay, bản tóm tắt thị trường nửa đầu năm cung cấp 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 sẽ giải thích lý do tại sao các quỹ đòn bẩy được tách riêng tại đây.
FAQ
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 trung bình í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ó chia tách cổ phiếu trong năm 2026 và không nằm trong danh sách các quỹ đòn bẩy, SNDK 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 550.2% so với phiên giao dịch đầu tiên của năm. MXL đứng thứ hai với mức tăng 382.4%.
Những cổ phiếu nào giảm mạnh nhất trong năm 2026?
EOSE là cổ phiếu có hiệu suất kém nhất năm 2026 trong danh sách lọc này với mức giảm -63.6%, đứng trước CSGP ở mức -57.5%. Danh sách đầy đủ các cổ phiếu giảm mạnh nhất năm 2026 nằm ở bảng thứ hai phía trên, được cập nhật liên tục trong năm.
Tỷ suất sinh lời từ đầu năm đến nay (year-to-date) của cổ phiếu được tính như thế nào?
Tỷ suất sinh lời year-to-date so sánh mức giá mới nhất với mức giá tại thời điểm bắt đầu năm dương lịch và thể hiện sự thay đổi dưới dạng phần trăm. Ở đây, mức giá mở cửa của phiên giao dịch thông thường đầu tiên của năm 2026 được so sánh với giá đóng cửa của phiên giao dịch gần nhất đã hoàn tất. Các cổ phiếu thực hiện chia tách trong năm sẽ được loại ra thay vì điều chỉnh, do đó không có hệ số điều chỉnh nào nằm giữa người đọc và dữ liệu thị trường.
Các quỹ ETF đòn bẩy có nằm trong danh sách các cổ phiếu tăng trưởng năm 2026 không?
Không. Một quỹ đòn bẩy hoặc quỹ nghịch đảo (inverse fund) nhân bội biến động hàng ngày của một chỉ số hoặc một cổ phiếu riêng lẻ, vì vậy chúng thường xuyên đứng đầu danh sách các mã biến động mạnh mà không có tin tức doanh nghiệp nào đi kèm. Các quỹ đó được loại bỏ theo tên trước khi xếp hạng, và danh sách này có thể thấy trong SQL dưới mỗi bảng. Các ETF chỉ số và ngành thông thường là một trường hợp khác: chúng vượt qua các ngưỡng tương tự như bất kỳ cổ phiếu nào và được xếp hạng tại đây, vì vậy 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ữ kèm theo mã SQL. Bạn có thể mở rộng bất kỳ bảng nào để kiểm tra dữ liệu, hoặc xây dựng lại bảng với các ngưỡng riêng của bạn trên terminal Strasmore.