어닝시즌이란? 미국 실적 발표 시즌 정리
어닝시즌이 무엇이고 왜 대형 은행부터 네 번의 파도로 몰리는지, EPS와 매출, 가이던스, 어닝 서프라이즈를 숫자로 설명합니다. 장전과 장마감 후 발표 시각은 한국시간으로 환산했습니다.
미국 어닝시즌(실적 발표 시즌)은 상장 기업 대부분이 직전 분기 성적표를 몇 주 안에 몰아서 공개하는 기간입니다. 1월, 4월, 7월, 10월 중순에 열려 6주쯤 이어지고, 관행적으로 대형 은행이 가장 먼저 숫자를 내놓습니다. 한국에서 미국 주식을 보유한 투자자에게 중요한 사실이 하나 더 붙습니다. 발표 시각이 한국시간으로는 늦은 밤이나 이른 새벽이라는 점입니다.
실적 발표에서 실제로 공개되는 숫자
분기 실적(실적 발표, quarterly earnings)은 보도자료 한 장과 컨퍼런스콜로 전달되고, 같은 날 SEC에 8-K 양식으로 접수됩니다. 읽어야 하는 항목은 크게 셋입니다.
- 매출(Revenue): 그 분기에 들어온 돈의 총액입니다. 회사가 얼마나 커졌는지를 보는 선입니다.
- EPS(주당순이익): 순이익을 발행주식수로 나눈 값입니다. 보통 희석 EPS(diluted EPS)를 기준으로 비교합니다. 자사주 매입으로 주식수가 줄면 순이익이 그대로여도 EPS는 올라갑니다.
- 가이던스(Guidance): 다음 분기나 올해 전체에 대한 회사 자신의 전망치입니다. 지난 분기 숫자는 이미 지나간 사실이고, 가이던스는 아직 확정되지 않은 범위입니다. 이 둘을 섞어 읽으면 발표를 잘못 해석하게 됩니다.
여기에 컨센서스(consensus)가 비교 기준으로 붙습니다. 애널리스트 추정치의 평균값이고, 회사가 발표하는 숫자가 아니라 시장이 모아 만든 숫자입니다. "예상치"라는 말이 기사에 나오면 거의 이 컨센서스를 뜻합니다.
어닝시즌은 왜 네 번의 파도로 몰리나
기업은 분기마다 보고하고, 대다수 미국 기업의 회계분기는 3월, 6월, 9월, 12월 말에 끝납니다. 분기가 끝나고 2주에서 6주 사이에 결산을 마치고 발표하기 때문에 발표가 특정 몇 주에 겹겹이 쌓입니다. 아래 패널은 최근 1년치 분기 보고를 분기 종료월로 묶어 센 것입니다.
| label | company_count |
|---|---|
| 9월 | 3814 |
| 12월 | 2567 |
| 10월 | 190 |
| 7월 | 172 |
| 8월 | 170 |
| 11월 | 160 |
| 1월 | 148 |
| 5월 | 50 |
| 4월 | 11 |
| 6월 | 7 |
| 2월 | 6 |
| 3월 | 2 |
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
concat(toString(toMonth(period_end)), '월') AS label,
countDistinct(cik) AS company_count
FROM global_markets.stocks_income_statements
WHERE timeframe = 'quarterly'
AND period_end >= '2025-07-01'
AND period_end < '2026-07-01'
GROUP BY label
ORDER BY company_count DESC가장 많은 기업이 분기를 마감하는 달은 9월이고 3814개 기업이 그 달을 쓰고 있습니다. 상위 네 칸이 3월, 6월, 9월, 12월로 채워지는 모습이 어닝시즌이라는 말의 근거 전부입니다. 반대로 가장 한가한 달에는 2개 기업만 남습니다. 1월이나 7월에 결산하는 회사도 있습니다. 엔비디아처럼 회계연도가 1월에 끝나는 기업은 다른 종목이 다 끝난 뒤 혼자 늦게 발표합니다.
시즌의 순서: 누가 먼저 열고 누가 늦게 오나
시즌의 문은 대형 은행이 엽니다. 은행은 결산 구조가 단순해 분기 종료 후 2주 안에 숫자를 낼 수 있고, 그래서 7월 중순이면 이미 발표가 시작됩니다. 그다음 소비와 미디어, 산업재가 오고, 월말에 대형 기술주가 몰리며, 마지막 파도로 유통과 일부 반도체 기업이 8월 중순까지 이어집니다. 아래는 2026년 7월 시즌에 각 종목의 8-K 공시가 처음 접수된 날짜입니다.
| ticker | filed_label | calendar_offset |
|---|---|---|
| TSLA | 7월 2일 | 1 |
| AMZN | 7월 9일 | 8 |
| BAC | 7월 14일 | 13 |
| GS | 7월 14일 | 13 |
| WFC | 7월 14일 | 13 |
| MS | 7월 15일 | 14 |
| NFLX | 7월 16일 | 15 |
| MSFT | 7월 29일 | 28 |
| AAPL | 7월 30일 | 29 |
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
ticker,
concat(toString(toMonth(min(filing_date))), '월 ',
toString(toDayOfMonth(min(filing_date))), '일') AS filed_label,
dateDiff('day', toDate('2026-07-01'), toDate(min(filing_date))) AS calendar_offset
FROM global_markets.stocks_sec_edgar_index
WHERE form_type = '8-K'
AND ticker IN ('JPM', 'WFC', 'BAC', 'GS', 'MS', 'NFLX', 'TSLA', 'MSFT', 'AAPL', 'AMZN')
AND filing_date >= '2026-07-01'
AND filing_date < '2026-08-16'
GROUP BY ticker
ORDER BY calendar_offset9개 종목 가운데 가장 먼저 접수한 곳은 TSLA이고 날짜는 7월 2일, 7월 1일 기준 1일째였습니다. 가장 늦은 AAPL은 7월 30일, 29일째에 들어왔습니다. 같은 분기를 두고도 접수일이 수 주 벌어집니다. 한 종목의 발표가 끝났다고 시즌이 끝난 것이 아니라는 뜻이고, 보유 종목이 여럿이면 같은 시즌 안에서 변동이 큰 날이 여러 번 나뉘어 옵니다.
어닝 서프라이즈와 어닝 쇼크는 숫자로 무엇인가
어닝 서프라이즈(earnings surprise)는 실제 발표치와 컨센서스의 차이입니다. 발표 EPS가 컨센서스보다 높으면 "비트(beat)", 낮으면 "미스(miss)"라고 부르고, 차이를 컨센서스로 나눈 비율이 서프라이즈율입니다. 어닝 쇼크는 공식 용어가 아니라 미스 폭이 유난히 컸을 때 기사에서 쓰는 표현입니다.
주의할 지점이 두 개 있습니다. 첫째, 비트와 미스는 컨센서스 대비 상대값입니다. 컨센서스가 미리 낮아져 있었다면 이익이 작년보다 줄어든 분기에도 비트가 나옵니다. 둘째, 헤드라인은 거의 EPS 하나만 다루는데 발표에는 매출과 가이던스가 같이 들어 있습니다. EPS는 컨센서스를 넘겼고 가이던스는 낮춘 분기도, 셋이 다 좋았던 분기와 나란히 "비트"로 제목이 뽑힙니다. 숫자 세 개를 따로 확인하는 편이 헤드라인 하나보다 정확합니다.
장전(BMO)과 장마감 후(AMC) 발표는 한국시간 몇 시인가
발표 시각은 두 갈래뿐입니다. 장전 발표(BMO, before market open)는 미국 동부시간 오전 6시에서 9시 사이, 장마감 후 발표(AMC, after market close)는 동부시간 오후 4시 5분 이후에 나옵니다. 미국 정규장은 동부시간 9시 30분부터 16시까지이고, 한국은 서머타임이 없어 환산이 단순합니다.
- 미국 서머타임 기간(3월 둘째 일요일부터 11월 첫째 일요일까지)에는 한국시간이 동부시간보다 13시간 빠릅니다. 정규장은 한국시간 22시 30분부터 다음날 5시까지입니다. BMO 발표는 한국시간 19시에서 22시 사이, AMC 발표는 한국시간 5시 5분 전후입니다.
- 서머타임이 끝난 겨울에는 14시간 차이가 됩니다. 정규장은 한국시간 23시 30분부터 다음날 6시까지, BMO는 20시에서 23시 사이, AMC는 6시 5분 전후입니다.
은행과 산업재는 BMO가 많고 기술주는 AMC가 많습니다. 즉 한국 투자자 기준으로 대형 기술주의 실적 숫자는 대부분 출근 직전 새벽에 공개되고, 그 숫자에 대한 정규장의 첫 반응은 그날 밤에 열립니다. 보유 종목의 발표 시각이 BMO인지 AMC인지는 보도자료에 적혀 있으니 날짜만큼 같이 적어두는 편이 낫습니다.
발표 날짜는 어디서 확인하나
개별 종목의 확정 발표일은 회사가 2주에서 3주 전에 공지하고, 그 전까지는 과거 발표 패턴을 바탕으로 한 추정일이 돌아다닙니다. 추정일과 확정일을 구분하는 방법, 그리고 티커 하나의 다음 발표일을 찾는 절차는 주식 실적 발표일 찾는 방법에서 단계별로 다룹니다. 이 글에서는 날짜를 찾았다고 가정하고 그다음 질문으로 넘어갑니다.
발표 전에 들고 갈지 판단하기 전에 보는 숫자
"발표 전에 들고 갈까, 피할까"는 어닝시즌에 가장 많이 나오는 질문입니다. 답을 의견으로 말하는 대신, 발표가 포함된 2년 동안 하루 변동폭이 실제로 어떻게 분포했는지를 먼저 보겠습니다. 아래는 종목별로 종가 대비 하루 변동폭의 중앙값과 같은 기간 최대값입니다.
| ticker | median_move_pct | max_move_pct |
|---|---|---|
| TSLA | 2.17 | 22.69 |
| AAPL | 0.72 | 15.33 |
| NFLX | 1.09 | 13.77 |
| WFC | 1.04 | 13.11 |
| GS | 1.08 | 13.1 |
| AMZN | 1.2 | 11.98 |
| MS | 1 | 11.61 |
| JPM | 0.83 | 11.54 |
| BAC | 0.78 | 11.06 |
| MSFT | 0.78 | 10.13 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH moves AS
(
SELECT
ticker,
date,
abs(toFloat64(close)
/ lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date) - 1) * 100 AS move_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('JPM', 'WFC', 'BAC', 'GS', 'MS', 'NFLX', 'TSLA', 'MSFT', 'AAPL', 'AMZN')
AND date >= '2024-07-01'
AND date < '2026-07-01'
)
SELECT
ticker,
round(quantileDeterministic(0.5)(move_pct, toUInt32(toYYYYMMDD(date))), 2) AS median_move_pct,
round(max(move_pct), 2) AS max_move_pct
FROM moves
WHERE isFinite(move_pct)
GROUP BY ticker
ORDER BY max_move_pct DESC맨 위 칸은 TSLA입니다. 보통 하루는 2.17% 움직였고, 2년 중 가장 큰 하루는 22.69%였습니다. 같은 표의 맨 아래 MSFT은 중앙값 0.78%, 최대 10.13%입니다. 중앙값과 최대값의 간격이 요점입니다. 평상시 하루와 가장 컸던 하루는 한 자리 숫자 안에서 비교되지 않습니다.
그 큰 하루들이 얼마나 드문지를 구간으로 나눠 세면 이렇게 됩니다.
| label | hit_count | share_pct |
|---|---|---|
| 0~1% | 2441 | 49 |
| 1~2% | 1414 | 28.4 |
| 2~3% | 566 | 11.4 |
| 3~5% | 413 | 8.3 |
| 5~8% | 100 | 2 |
| 8% 이상 | 52 | 1 |
모든 수치 뒤에 숨겨진 정확한 SQL
WITH moves AS
(
SELECT
ticker,
date,
abs(toFloat64(close)
/ lagInFrame(toFloat64(close)) OVER (PARTITION BY ticker ORDER BY date) - 1) * 100 AS move_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('JPM', 'WFC', 'BAC', 'GS', 'MS', 'NFLX', 'TSLA', 'MSFT', 'AAPL', 'AMZN')
AND date >= '2024-07-01'
AND date < '2026-07-01'
)
SELECT
multiIf(move_pct < 1, '0~1%',
move_pct < 2, '1~2%',
move_pct < 3, '2~3%',
move_pct < 5, '3~5%',
move_pct < 8, '5~8%',
'8% 이상') AS label,
count() AS hit_count,
round(count() * 100.0 / sum(count()) OVER (), 1) AS share_pct
FROM moves
WHERE isFinite(move_pct)
AND move_pct > 0
GROUP BY label
ORDER BY indexOf(['0~1%', '1~2%', '2~3%', '3~5%', '5~8%', '8% 이상'], label)0~1% 구간에 들어간 세션이 2441회로 전체의 49%입니다. 반대편 꼬리인 8% 이상 구간은 전체의 1%에 불과합니다. 한 종목이 1년에 네 번 발표하므로 2년이면 여덟 번이고, 보유 기간 대비 비중으로 치면 발표일은 전체 세션의 3%쯤 됩니다. 꼬리 구간의 비중과 발표일의 비중이 비슷한 크기라는 점이 이 표가 말하는 전부입니다. 발표일은 드물고, 그 드문 날에 큰 변동이 몰려 있습니다.
옵션으로 이 날을 다루려는 경우에는 숫자 하나가 더 필요합니다. 발표 전에는 내재변동성(IV)이 올라가 있고 발표 직후 빠르게 내려앉습니다. 방향을 맞혀도 옵션 가격이 내려가는 구조이며, 이 현상은 IV 크러시가 무엇인지에서 따로 다룹니다. 옵션 가격에 들어 있는 예상 변동폭이 실제 변동폭과 얼마나 맞았는지는 주가가 옵션이 예상한 만큼 움직이는지를, 예상 변동폭 자체를 계산하는 방법은 내재변동성으로 예상 변동폭 구하기를 보면 됩니다. 어느 쪽이든 결론은 의견이 아니라 본인의 보유 기간과 구간 분포에서 나옵니다.
FAQ
어닝시즌은 1년에 몇 번, 언제 열리나요
분기마다 한 번씩 1년에 네 번입니다. 1월, 4월, 7월, 10월 중순에 대형 은행 발표로 시작해 약 6주간 이어집니다. 대다수 기업의 회계분기가 3월, 6월, 9월, 12월에 끝나기 때문에 발표가 그 다음 달 중순부터 몰립니다.
어닝 서프라이즈는 어떻게 계산하나요
실제 발표 EPS에서 애널리스트 컨센서스를 뺀 뒤 컨센서스로 나눈 비율입니다. 양수면 비트, 음수면 미스입니다. 컨센서스 자체가 발표 전에 조정되므로, 작년 같은 분기와 비교한 증감과는 다른 숫자라는 점을 같이 봐야 합니다.
장마감 후(AMC) 발표는 한국시간 몇 시인가요
미국 동부시간 오후 4시 5분 이후이므로, 서머타임 기간에는 한국시간 새벽 5시 5분 전후, 겨울에는 새벽 6시 5분 전후입니다. 장전(BMO) 발표는 각각 한국시간 저녁 7시에서 10시, 겨울에는 저녁 8시에서 11시 사이에 나옵니다.
EPS와 가이던스 중 무엇이 더 중요한가요
둘은 다른 성격의 숫자입니다. EPS는 이미 끝난 분기의 확정 실적이고, 가이던스는 회사가 제시하는 앞 분기 전망 범위입니다. 헤드라인은 EPS만 다루는 경우가 많으므로, 매출과 가이던스를 따로 확인하면 같은 "비트" 안에서도 내용이 꽤 다릅니다.
모든 기업이 같은 시즌에 발표하나요
아닙니다. 회계연도가 1월이나 7월에 끝나는 기업은 주요 네 파도와 어긋난 시점에 혼자 발표합니다. 위의 분기 결산 패널에서 3월, 6월, 9월, 12월이 아닌 달에도 기업 수가 남아 있는 이유가 이것입니다.
데이터 노트
발표 시점 패널은 SEC 접수 기록의 8-K 양식 접수일을 씁니다. 분기 실적 보도자료가 접수되는 양식이 8-K이며, 같은 기간에 다른 사유의 8-K가 접수될 수 있으므로 패널은 "7월 시즌 중 첫 8-K 접수일"로 읽는 것이 정확합니다. 확정 발표일 자체는 회사 공지가 기준입니다.
분기 결산 패널은 분기 보고(timeframe = 'quarterly')의 period_end 기준이며 기업 수는 CIK 단위 중복 제거 값입니다.
변동폭은 일봉 종가를 직전 거래일 종가와 비교한 절대값이고, 중앙값은 재계산 시 값이 흔들리지 않는 결정적 분위수 함수로 구했습니다. 가격 컬럼은 비교 전에 부동소수로 변환했습니다. 배당락이나 분할이 있던 날의 종가 비교는 보정하지 않았으므로, 해당 날짜의 변동폭은 실제 손익과 다를 수 있습니다.
모든 숫자는 각 패널 아래의 SQL 그대로 계산된 값입니다.
보유 종목의 발표 전후 변동폭을 직접 같은 방식으로 세어보고 싶다면, 위 패널의 티커와 기간만 바꿔 Strasmore 터미널에서 질문하면 됩니다.