2026년 최대 상승 종목과 최대 하락 종목 순위
2026년 최고 상승 종목과 최대 하락 종목을 실제 유동성에 기반한 거래소 시세(테이프)로 순위화했으며, 주식분할 종목과 레버리지 펀드는 제외했다.
2026년 현재까지 최고의 상승률을 기록한 종목은 MRNA가 이끌고 있으며, 연초 첫 거래일부터 가장 최근 마감된 거래일까지 692.8% 상승했다. 이 페이지는 실제로 거래되는 종목을 대상으로 2026년 최대 상승 종목과 최대 하락 종목의 순위를 매기며, 벤더 요약 자료가 아니라 거래소 시세(테이프) 기준으로 측정하고, 한 해가 진행되는 동안 계속 갱신된다. 순위를 매기기 전에 주식분할 종목과 레버리지 펀드는 먼저 제외하는데, 대부분의 연초 대비 상승률 목록이 은근슬쩍 오류를 일으키는 지점이 바로 여기다.
2026년 최대 상승 종목
아래에 나열된 모든 종목은 순위에 오르기 전 유동성 기준을 통과했다. 지난 한 달간 매 거래일마다 평균 최소 1억 달러 규모의 주식이 거래되었다는 뜻이다. 아무도 거래하지 않는 종목의 큰 상승률은 결과가 아니라 호가에 불과하다.
| 티커 | YTD 수익률(연초 대비, %) | 일평균 거래대금(백만 달러) |
|---|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS ytd_return_pct,
round(u.adv / 1e6, 0) AS avg_daily_dollar_m
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
ORDER BY (e.latest_close / e.year_open) DESC
LIMIT 10MRNA가 692.8%로 올해 1위를 차지했고, SNDK가 471%로 뒤를 이었으며, TWST는 355.2%로 3위에 올랐다. 순위표 10위인 KOD조차 215.7% 상승을 기록하고 있어, 전체 순위표가 어떤 광범위한 지수보다도 훨씬 앞서 나갔다.
각 상승률 옆에 표시된 달러 항목은 퍼센트 수치만큼이나 많은 정보를 담고 있다. KOD의 하루 평균 거래대금은 약 389백만 달러다. 순위표 최상단에 있는 MRNA는 하루 평균 3002백만 달러의 거래대금을 기록한다. 여기 나열된 모든 종목은 하루 거래대금이 1억 달러를 넘지만, 그 기준선 위로 범위가 워낙 넓어서 같은 헤드라인 상승률이라도 양 극단에서는 서로 다른 의미를 갖는다. 거래량이 적은 종목일수록 주가를 밀어 올리기는 쉽지만, 화면에 뜬 가격으로 빠져나오기는 더 어렵다.
2026년 최대 하락 종목
동일한 기준을 반대 방향으로 적용한 것으로, 동일한 유동성 기준을 충족하는 종목 중 연초 이후 하락폭이 가장 큰 종목들을 집계한 것이다.
| 티커 | YTD 수익률(연초 대비, %) | 일평균 거래대금(백만 달러) |
|---|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS ytd_return_pct,
round(u.adv / 1e6, 0) AS avg_daily_dollar_m
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
ORDER BY (e.latest_close / e.year_open) ASC
LIMIT 10연초 이후 하락폭이 가장 큰 종목은 CTVA로, -80.8%를 기록했다. 이어 TTD가 -65.7%로 뒤를 이었다. 순위 10위인 Z는 -54.1%를 나타냈다. 이 목록에 포함된 종목 중 상당수는 투기적인 소형주가 아니라 널리 보유되는 대형주라는 점이 하락 종목 목록에서 사람들을 놀라게 하는 대목이다. 유동성이나 애널리스트 커버리지가 있다고 해서 주가 하락에 하한선이 생기는 것은 아니다. 포트폴리오에서 이러한 종목 중 하나를 지나치게 큰 비중으로 보유한 투자자는 그 변동폭을 고스란히 떠안았으며, 이는 한 종목 보유의 위험 페이지에서 변동성과 낙폭 수치로 측정된다.
2026년 시장에서 상승한 종목의 비중은 얼마나 될까
순위표는 양 끝단만 보여준다. 시장 폭은 몸통을 보여준다. 즉, 인덱스펀드까지 포함한 전체 스크리닝 대상 종목군이 상승 종목과 하락 종목으로 어떻게 나뉘는지를 변동폭 크기별 구간으로 나눠 보여주는 것이다.
| 구간 | 종목명 | 방향별 비중(%) |
|---|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING adv >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today())
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
rets AS (
SELECT e.ticker AS ticker, (e.latest_close / e.year_open - 1) * 100 AS ret
FROM edges AS e
INNER JOIN universe AS u ON e.ticker = u.ticker
WHERE e.year_open >= 10
)
SELECT bucket,
names,
round(100 * sum(names) OVER (PARTITION BY side) / sum(names) OVER (), 1) AS side_share_pct
FROM (
SELECT tup.1 AS bucket, tup.2 AS names, tup.3 AS ord, tup.4 AS side
FROM (
SELECT arrayJoin([
('Down 40%+', countIf(ret < -40), 1, 'down'),
('Down 20-40%', countIf(ret >= -40 AND ret < -20), 2, 'down'),
('Down 10-20%', countIf(ret >= -20 AND ret < -10), 3, 'down'),
('Down 0-10%', countIf(ret >= -10 AND ret < 0), 4, 'down'),
('Up 0-10%', countIf(ret >= 0 AND ret < 10), 5, 'up'),
('Up 10-25%', countIf(ret >= 10 AND ret < 25), 6, 'up'),
('Up 25-50%', countIf(ret >= 25 AND ret < 50), 7, 'up'),
('Up 50%+', countIf(ret >= 50), 8, 'up')
]) AS tup
FROM rets
)
)
ORDER BY ord스크리닝 대상 종목 중 58.8%는 연중 상승했고 41.2%는 하락했다. 이러한 분포는 상위 10개 종목 표에서는 드러나지 않는 부분이다. 한쪽 끝에서는 37개 종목이 Down 40%+ 구간에 속하고, 다른 쪽 끝에서는 116개 종목이 Up 50%+ 구간에 속한다. 이에 비해 보합 부근 양쪽에는 187개 종목이 Down 0-10% 구간에, 162개 종목이 Up 0-10% 구간에 자리한다. 어느 해든 시장 대부분은 평범한 움직임을 보이며, 위의 두 표에 오른 종목들은 바로 그 평균을 만들어내는 예외적 사례다.
시장 자체의 위치
개별 종목의 한 해 성과는 시장 전체와 비교할 때 다르게 읽힌다. 4대 주요 지수 ETF는 정확히 같은 기간 동안 다음과 같은 흐름을 보였다.
| 라벨 | YTD 수익률(연초 대비, %) | 측정 시작일 | 측정 종료일 |
|---|---|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
)
SELECT multiIf(ticker = 'SPY', 'S&P 500 (SPY)', ticker = 'QQQ', 'Nasdaq 100 (QQQ)',
ticker = 'DIA', 'Dow (DIA)', ticker = 'IWM', 'Russell 2000 (IWM)', ticker) AS label,
round((latest_close / year_open - 1) * 100, 1) AS ytd_return_pct,
(SELECT toString(min(d)) FROM complete) AS measured_from_date,
(SELECT toString(max(d)) FROM complete) AS measured_through_date
FROM edges
ORDER BY ytd_return_pct DESC위의 두 표와 패널은 모두 동일한 기간, 즉 2026년 첫 정규 거래일(2026-01-02)부터 가장 최근 마감된 거래일(2026-10-15)까지를 기준으로 측정한 것이다. 이 기간 동안 Nasdaq 100 (QQQ)는 17.4%의 수익률을, Dow (DIA)는 8.2%의 수익률을 기록했다. 상승 종목 표에 오른 모든 종목은 이 네 지수를 큰 폭으로 웃돌았는데, 이는 지수 특유의 산술 구조에서 비롯된 결과다. 수백 개 보유 종목의 움직임이 하나의 수치로 평균화되면서 개별 종목의 등락이 서로 상쇄되기 때문이다. 그 지수 아래에 깔린 종목별 편차는 지수 자체의 움직임보다 훨씬 컸으며, 상반기 섹터 스코어카드는 11개 섹터 전체의 순위를 서로 비교해 보여준다.
연초 대비 상승률을 왜곡하는 액면분할
액면분할은 보유 지분의 가치를 바꾸지 않으면서 주식 수와 주당 가격만 바꾼다. 이만큼 긴 기간 동안에는 여러 기업이 액면분할을 실시하며, 조정하지 않은 연초 대비 수익률 계산은 주당 가격의 변화를 실적으로 잘못 읽어낸다. 아래 종목들은 각각 2026년에 주당 가격을 최소 5분의 1 이상 움직일 만큼 큰 액면분할이나 주식배당을 실시했으며, 모두 동일한 유동성 기준을 통과했다. 따라서 분할 필터가 걸러내기 전까지는 위의 순위표에 오를 자격이 있었다.
| 티커 | 미조정 YTD 수익률(%) | 분할 주가 영향(%) | 분할 유형 | 분할일 |
|---|---|---|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
universe AS (
SELECT ticker,
sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS adv
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING adv >= 100000000
),
split_terms AS (
SELECT ticker,
argMax(split_to, execution_date) AS new_shares,
argMax(split_from, execution_date) AS old_shares,
round((old_shares / new_shares - 1) * 100, 1) AS split_price_effect_pct,
replaceAll(argMax(adjustment_type, execution_date), '_', ' ') AS split_type,
toString(max(execution_date)) AS split_date
FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today()
GROUP BY ticker
HAVING new_shares > 0 AND old_shares > 0
AND greatest(new_shares / old_shares, old_shares / new_shares) >= 1.25
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
AND ticker NOT IN ('KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL')
AND ticker IN (SELECT ticker FROM split_terms)
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
ranked AS (
SELECT e.ticker AS ticker,
round((e.latest_close / e.year_open - 1) * 100, 1) AS unadjusted_ytd_pct,
s.split_price_effect_pct AS split_price_effect_pct,
s.split_type AS split_type,
s.split_date AS split_date
FROM edges AS e
INNER JOIN split_terms AS s ON e.ticker = s.ticker
WHERE e.year_open >= 10 AND e.ticker IN (SELECT ticker FROM universe)
)
SELECT ticker, unadjusted_ytd_pct, split_price_effect_pct, split_type, split_date
FROM (
SELECT ticker, unadjusted_ytd_pct, split_price_effect_pct, split_type, split_date,
row_number() OVER (ORDER BY unadjusted_ytd_pct ASC) AS rn_low,
row_number() OVER (ORDER BY unadjusted_ytd_pct DESC) AS rn_high
FROM ranked
)
WHERE rn_low <= 14 OR rn_high = 1
ORDER BY unadjusted_ytd_pct ASCBKNG은 forward split에 따라 주당 가격이 -96% 움직인 뒤, 조정을 거치지 않은 화면에서는 -96.9%로 표시된다. 또한 KLAC은 forward split에 따라 가격이 -90% 움직인 뒤 -86.2%로 표시된다. 액면분할이 발효된 당일 두 종목 중 어느 쪽 주주도 손실을 입지 않았다. 주당 가격은 특정 배수로 나뉘었고 주식 수는 같은 배수만큼 늘었다. 분할효과(split effect) 열은 오직 분할만으로 설명되는 가격 변화를 분리해 보여주는데, 이 부분이 바로 조정하지 않은 화면에서 실적으로 오독되는 부분이다.
표의 마지막 행은 그 반대 방향으로 작동한다. ETHA는 reverse split에 따라 주당 가격이 오히려 200% 상승한 뒤 141.8%로 표시되는데, 이는 가격을 깎는 대신 끌어올린 경우다. 이 조정 단계를 생략하는 순위표는 상단과 하단에서 동시에 허구를 게재하는 셈이며, 이 때문에 본 화면은 분할이 있었던 종목의 가격을 어설프게 손보는 대신 아예 대상에서 제외한다. 기업뿐 아니라 펀드도 이 패널에 오를 수 있다. 인덱스펀드 역시 자체적으로 액면분할을 실시하므로, 이 화면은 기업과 펀드 양쪽을 모두 다룬다.
이 스크리닝의 측정 방식
스크리닝의 각 단계와 그 단계를 통과한 뒤 남은 종목 수는 다음과 같다:
| 선별 단계 | 종목명 |
|---|---|
| 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 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH complete AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2026-01-01 00:00:00')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY d
HAVING count() >= 380
),
universe AS (
SELECT ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 21 DAY
AND toDate(toTimeZone(window_start, 'America/New_York')) >= today() - 20
AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM complete)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING sum(toFloat64(close) * toFloat64(volume)) / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) >= 100000000
),
edges AS (
SELECT ticker,
argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,
argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,
countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))
OR (window_start >= now() - INTERVAL 8 DAY))
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
GROUP BY ticker
HAVING bars_open >= 100 AND bars_close >= 100
),
flagged AS (
SELECT ticker,
year_open,
ticker IN (SELECT ticker FROM universe) AS liquid,
ticker NOT IN ('SPCX','KORU','SOXL','SOXS','SOXY','TQQQ','SQQQ','QQQU','SPXL','SPXS','UPRO','SPXU','SPYU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','GDXU','GDXD','FNGU','FNGD','DUST','JNUG','JDST','NUGT','BITX','BITU','SBIT','ETHU','ETHT','NVDL','NVDS','NVD','NVDX','NVDU','NVDD','NVDQ','TSLL','TSLQ','TSLZ','TSLR','TSLT','TSLS','TSDD','AAPU','AAPD','MSFU','MSFD','GGLL','GGLS','AMZU','AMZD','METU','METD','PLTU','PLTD','SMCX','SMCZ','CONL','CONI','MSTX','MSTU','MSTZ','BRKU','AMDL','AMUU','AMDD','ELIL','ELIS','HOOX','AVGX','AVGU','TSMX','TSMZ','MULL') AS not_geared,
ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN toDate('2026-01-01') AND today()) AS no_split
FROM edges
)
SELECT tup.1 AS screen_step, tup.2 AS names
FROM (
SELECT arrayJoin([
('Traded the first and the last full session', count()),
('Averaging $100m+ a day over the past month', countIf(liquid)),
('Opened 2026 above $10 a share', countIf(liquid AND year_open >= 10)),
('Not on the excluded-fund list', countIf(liquid AND year_open >= 10 AND not_geared)),
('No split or stock dividend in 2026', countIf(liquid AND year_open >= 10 AND not_geared AND no_split))
]) AS tup
FROM flagged
)방법론 전체를 설명하면 다음과 같다:
- 기간. 2026년의 첫 번째 완전한 거래일부터 데이터에 기록된 가장 최근의 완전한 거래일까지다. 시작일과 종료일 모두 분봉 데이터에서 읽어오며, 정규장 시간에 해당하는 분봉이 빠짐없이 존재하는 거래일만 집계 대상으로 인정한다. 따라서 아직 진행 중인 거래일은 마감된 것으로 처리되지 않는다.
- 수익률. 분봉 데이터를 기준으로 연초 첫 정규장 시가와 가장 최근 정규장 종가를 비교해 산출한다. 프리마켓과 애프터마켓 체결은 제외한다. 이는 가격 수익률이며, 배당을 재투자분으로 가산하지 않으므로 고배당 종목은 총수익률 지표보다 다소 낮게 나타난다.
- 유동성 하한선. 최근 20일(달력일 기준) 동안 세션당 정규장 거래대금이 평균 1억 달러 이상이어야 하며, 이때 처음부터 끝까지 정상적으로 진행된 거래일만 집계한다. 그렇지 않으면 반쪽짜리 거래일의 거래대금 일부를 온전한 하루치 기준으로 나누게 되어, 모든 종목의 거래대금이 실제보다 낮게 산출된다. 이 기준 하나만으로 대상 종목 수는 4543개 티커에서 1082개로 줄어든다.
- 가격 하한선. 연초 시가가 주당 10달러를 넘는 종목만 대상으로 한다. 10달러 미만 종목은 작은 가격 변동에도 퍼센트 변화가 크게 나타나기 때문이다.
- 레버리지·인버스 펀드는 별도로 관리하는 목록을 통해 제외하며, 이 목록은 모든 표 하단의 SQL에 전체 공개되어 있다. 여기에는 지수 연동형 레버리지 펀드와 개별 종목의 일일 수익률을 배수로 추종하는 펀드가 포함된다. 이런 레버리지 펀드는 해당 기업에 관한 뉴스가 전혀 없어도 단순 변동률 순위표 최상단을 차지할 수 있다. 이 목록은 수동으로 관리되는데, 바로 이 점이 약점이다. 이번 달 상장된 펀드는 누군가 목록에 추가하기 전까지는 제외되지 않는다.
- 일반 펀드는 걸러내지 않는다. 유동성과 가격 하한선을 통과한 무레버리지 지수 ETF나 섹터 ETF는 일반 기업들과 나란히 순위에 오르며, 단계별 종목 수 집계에도 포함된다. 펀드는 이미 같은 대상군 안에 집계되어 있는 종목들을 담은 바스켓이므로, 이런 행은 개별 기업의 한 해 실적이 아니라 그 바스켓이 어떻게 움직였는지로 읽어야 한다.
- 주식분할. 2026년 중 주식분할이나 주식배당이 발생한 종목은 그 비율이 아무리 작더라도 모두 제외한다. 이는 보수적인 선택이다. 실제로 좋은 성과를 낸 종목 몇 개가 순위표에서 빠지는 대가를 치르지만, 그 대신 주식 수 변경을 수익률로 잘못 발표하는 일은 결코 없다. 위 패널에는 분할 비율이 커서 실제 움직임처럼 보일 뻔했던 제외 종목들이 표시되어 있다.
- 늦은 상장. 연초 첫 거래일 이후에 상장한 기업은 1월 가격 자체가 없으므로 이 표에서 제외된다. 신규 상장이 많았던 해에는 이것이 실질적인 공백으로 남는다.
- 결과. 총 1000개 종목이 순위에 올랐으며, 그중 상위 열 개와 하위 열 개가 이 페이지의 두 순위표를 구성한다.
세 가지 기간에서 던지는 같은 질문
연초 대비(Year to date) 수익률은 사다리의 한 단에 불과하며, 같은 움직임도 기간에 따라 다르게 보인다. 주간 화면은 이번 주 주가 상승률·하락률 상위 종목이고, 월간 화면은 이번 달 주가 변동률 상위 종목이며, 이 페이지는 연간 화면이다. 각 단의 기준선은 서로 다르다. 이 페이지는 최근 한 달간 하루 평균 거래대금 1억 달러를 기준으로 종목을 걸러내는 반면, 주간·월간 페이지는 각자의 기간 내 총 거래대금을 기준으로 걸러낸다. 따라서 한 화면은 통과해도 다른 화면은 통과하지 못하는 종목이 나올 수 있다. 특정 실적 발표에 대한 반응으로 주간 화면 상위에 오른 종목이 연간으로 보면 중위권에 머무르는 경우도 흔하다. 올해 들어 지금까지의 흐름을 더 폭넓게 다룬 내용을 보려면, 상반기 시장 리뷰에서 지수, 금리, 섹터별 세부 내용을 확인할 수 있고, 레버리지 ETF의 작동 원리에서는 레버리지 펀드를 이 화면에서 제외한 이유를 설명한다.
자주 묻는 질문
2026년 최고 수익률 종목은 무엇인가?
일일 평균 거래대금 1억 달러 이상, 연초 시가 10달러 초과, 2026년 액면분할 이력 없음, 레버리지 펀드 목록 미포함이라는 조건을 적용하면 MRNA이(가) 현재까지 2026년 최고 수익률 종목이며, 연초 첫 거래일 대비 692.8% 상승했다. SNDK이(가) 471%로 2위를 차지했다.
2026년 낙폭이 가장 큰 종목은 무엇인가?
이 스크리닝 기준으로 CTVA이(가) -80.8%로 2026년 최악의 수익률을 기록한 종목이며, TTD이(가) -65.7%로 그 뒤를 이었다. 2026년 낙폭 상위 종목의 전체 목록은 위 두 번째 표에서 확인할 수 있으며, 연중 계속 갱신된다.
연초 대비 주가 수익률은 어떻게 계산하는가?
연초 대비(year-to-date) 수익률은 최근 가격을 해당 연도 시작 시점 가격과 비교해 백분율로 나타낸 값이다. 여기서는 2026년 첫 정규 거래세션 시가를 가장 최근 완료된 세션의 종가와 비교한다. 연중 액면분할이 있었던 종목은 조정하지 않고 제외하므로, 독자와 실제 시세 사이에 별도의 조정계수가 끼어들지 않는다.
2026년 상승률 상위 목록에 레버리지 ETF도 포함되는가?
포함되지 않는다. 레버리지 또는 인버스 펀드는 지수나 개별 종목의 일일 등락폭을 배수로 확대하므로, 별다른 기업 뉴스 없이도 단순 등락률 상위 목록을 자주 차지하게 된다. 이러한 펀드는 순위 산정 전에 이름으로 제외되며, 해당 목록은 각 표 하단의 SQL에서 확인할 수 있다. 반면 일반 지수 ETF와 섹터 ETF는 다른 경우로, 개별 종목과 동일한 조건을 통과하면 이 목록의 순위에 포함되므로 두 목록 어디에나 등장할 수 있다.
이곳의 모든 표는 해당 SQL이 첨부된 저장 쿼리다. 패널을 펼쳐 스크리닝 조건을 확인하거나, Strasmore 터미널에서 직접 조건을 설정해 재구성할 수 있다.