내 주식 스캐너의 AI는 모멘텀 에코였다. 오늘날의 모델들은 그럴까?
요약
본 글은 주식 모멘텀 예측 AI 모델의 한계를 다루며, 과거 스캐너 운영 경험을 바탕으로 '상승세 추격(run-up chasing)' 경향성을 분석했습니다. 여러 최신 AI 모델들이 실제 시장 데이터에서 명확한 우위를 보이지 못했으며, 상승세가 클수록 과도하게 낙관적인 예측을 하는 '모멘텀 에코' 현상이 관찰되었습니다.
핵심 포인트
- AI는 주가가 급등할 종목을 동전 던지기보다 잘 순위 매기지 못했습니다.
- 상승세에 대한 과도한 흥분(모멘텀 에코)은 실제 하락 위험과 연결될 수 있습니다.
- 최신 AI 모델들은 시장의 상승 헤드라인에 지나치게 의존하는 경향을 보였습니다.
이것은 Kaggle Benchmarking Challenge에 제출하는 내용입니다.
요약(TL;DR)
- Kaggle의 9개 모델 중 하나는 주식이 이미 많이 상승했을수록, 실제 결과가 정당화하는 것보다 더 낙관적으로 예측했습니다. 이는 GPT-5.4 mini였습니다. 다음으로 Qwen3 235B Instruct 2507이 등장했는데, 이 모델은 다른 7개 모델들보다 상승세에 분명히 더 의존했지만, '추격 매수'라고 할 만큼은 아니었습니다. 나머지 7개 모델들은 테스트의 노이즈 범위 내에 머물렀습니다.
- 상승장 헤드라인들이 모델들을 갈라놓았습니다. 상승세를 감안한 후, 9개 모델 중 5개는 회사 뉴스가 제시하는 확률보다 해당 헤드라인의 확률을 명확히 낮게 예측했고, 1개는 명확하게 높게 예측했습니다.
- 9개 모델 모두가 평이한 추측(31%)을 확실히 능가하지 못했으며, 주가가 급등할 종목을 동전 던지기보다 더 잘 순위 매긴 모델은 없었습니다.
- 제 오래된 스캐너의 AI는 모멘텀 에코였습니다. 상승세가 클수록 더 흥분했습니다(순위 상관관계 +0.55). 하지만 상승세 자체는 방향에 대해 아무것도 말해주지 못했습니다. 가장 흥분했던 예측은 41%의 경우 5% 이상 하락으로 끝났고, 가장 차분했던 예측은 18%였습니다.
- 반전: 한 채점 기준이 발견된 내용을 거의 지워버릴 뻔했습니다. 해당일 종가로 평가했을 때, 흥분했던 예측은 차분했던 예측보다 11.9 포인트 더 적게 높은 가격으로 마감했습니다. 전날 종가로 평가했을 때는 그 격차가 0.9로 줄어들었습니다. 그럼에도 불구하고 모든 규칙 하에서 여전히 5% 이상 하락할 확률이 더 높았으며, 심지어 전일 종가 기준에서도 13 포인트나 차이가 났습니다.
벤치마크: Kaggle Hype Trap.
저는 주식 스캐너를 만들고 한 시즌 동안(2026년 2월부터 5월까지) 운영했습니다. 이 스캐너는 주로 주당 가격이 10달러 미만인, 소규모로 언급량이 많은 미국 주식들을 관찰했고, 그중 많은 종목에 대해 AI 모델에게 빠른 평가를 요청했습니다. 즉, 향후 1~3일 동안의 해당 주식 모멘텀에 대한 '상승세(takeoff)' 점수를 0점에서 100점 사이로 받은 것입니다. 한 종목은 소매 투자자들의 열풍을 다룬 헤드라인 기사 덕분에 5거래일 만에 60%나 급등했습니다. AI는 이 주식에 가장 흥분한 범위인 72점을 부여했습니다. 하지만 5거래일 후, 그 주식의 가격은 5% 이상 하락했습니다. 이 스캐너는 누구나 이 주식이 어떻게 될지 알기 전에, 평가가 이루어진 순간마다 모든 기록을 저장했습니다.
이것은 합성 테스트 세트로는 얻을 수 없는 무언가를 저에게 주었습니다. 즉, 결과가 존재하기 전에 만들어진 실제 예측이며, 제가 지금 찾아볼 수 있는 결과와 연결되어 있습니다. 그래서 저는 하나의 질문을 중심으로 벤치마크를 구축했습니다. 주가가 이미 많이 오른 경우에만 AI가 더 흥분하는 경향이 있는지? 그 상승세 자체가 다음 방향에 대해 아무것도 말해주지 못할 때 말입니다. 저는 이를 '상승세 추격(run-up chasing)'이라고 부릅니다. 이렇게 작동하는 AI는 모멘텀 에코(momentum echo)입니다. 즉, 이미 가격이 움직인 것을 반복하여 예측처럼 제시하는 것입니다. 두 번째 질문은 '주식이 랠리하고 있다'와 같은 헤드라인 기사가 이 경향을 악화시키는지 여부입니다. 저는 이 벤치마크를 Hype Trap이라고 명명했습니다.
여기 내용은 투자 조언이 아닙니다. 스캐너는 오직 연습 자금으로만 거래했습니다.
제가 벤치마크한 것들
사례가 나오는 곳
스캐너는 15,606개의 점수화된 행(scored rows)을 저장했고, 그중 829개가 모든 검사를 통과했으며, 이 중 351개가 벤치마크가 되었습니다. 첫 번째 필터링은 다음과 같습니다: AI 평가 단계가 건너뛰거나 실패했을 경우, 앱은 마치 AI가 점수를 준 것처럼 고정된 자리 표시자(placeholder) 점수를 저장했습니다. 이것이 모든 점수화된 행의 31%였으며, 이 중 어느 것도 여기에 포함되지 않습니다. 또한, 헤드라인 세트 중 약 10개에 1개가 다른 회사에 관한 것이었기 때문에 그것들도 제외되었습니다.
15,606개의 행이 351개의 사례가 된 과정
| 단계 | 남은 행 수 |
|---|---|
| 스캐너가 저장한 점수화된 행 | 15,606 |
| ... |
모든 결과는 공식적인 일일 종가(daily closing prices)에서 나옵니다. 저는 자체적으로 버그가 있던 봇의 거래 기록은 절대 사용하지 않았습니다.
잘못된 회사 관련 헤드라인. 사례를 추출하는 과정에서 약 418개 중 41개의 헤드라인이 다른 사업이나 일반 시장 뉴스를 다루는 것을 발견했습니다. 스캐너는 티커 심볼(ticker symbol)로 뉴스를 검색하는데, 짧은 심볼은 일반 단어, 사람 이름, 해외 거래소의 동일한 심볼을 가진 회사, 그리고 시장 요약과도 일치할 수 있습니다. 라이브 AI 역시 이러한 헤드라인을 읽고 어쨌든 상승 확률을 제시했습니다. 저는 그런 사례들은 제외했습니다.
각 사례는 모델에게 두 가지를 보여줍니다: 지난 5 거래일 동안의 주가 변동률(정수 퍼센트로 반올림), 그리고 이름 및 기타 식별 세부 정보가 제거되어 다시 작성된 헤드라인 요약 문장 하나입니다. 소셜 미디어 텍스트는 포함되지 않습니다. 모델이 보는 그대로의 +60% 사례를 보여드리겠습니다:
주가 변동률(지난 5 거래일): +60%
뉴스: 이 주식은 개인 투자자들의 열풍 속에 높은 거래량으로 급등했으며, 이에 따라 추격 매수를 해야 하는지 묻는 기사들이 나왔습니다.
이 정확한 사례에서 Kaggle의 9개 모델은 5% 이상 상승할 확률을 20%에서 55% 사이로 제시했고, '추격'하는 것으로 간주되는 유일한 모델인 GPT-5.4 mini가 가장 높은 수치를 기록했습니다.
제가 익명화 과정을 깨보려 했습니다.
게시하기 전에, 저는 별도의 AI에게 회사 이름을 추정하게 했습니다. 첫 번째 작업에서 15개 중 7개를 이름 지었고, 대부분은 동일한 회사 사례를 모아서 한 것이었습니다. 그래서 공개된 사본에서는 월(month)과 회사 열을 삭제했고, 85개의 문장은 더 일반적이 되었습니다. 두 번의 후속 작업에서는 15개 중 1개와 20개 중 1개를 이름 지었고, 이 문장들 역시 다시 작성되었습니다. 가장 큰 폭으로 상승한 사례들을 반올림한 후에도, 모든 사례는 여전히 최소 12개의 주식과 일치했습니다.
두 가지 기준점 (Two yardsticks)
- 종가 상승: 5 거래일 후의 종가가 시작 종가보다 높은 경우. 이는 모멘텀 예측(momentum call)을 가장 단순하게 읽는 방식이므로 스캐너 자체 AI에 사용합니다.
- 5% 이상 상승: 5 거래일 후의 종가가 시작 종가보다 5% 이상 높은 경우. Kaggle 과제에서는 이를 요구하는데, 주가 변동성이 큰 주식의 경우 아주 약간이라도 높게 마감하는 것은 대부분 노이즈이기 때문입니다. 자연스러운 혼합 사례 중 31.0%가 5% 이상 상승했습니다.
과거 AI와 오늘날의 모델을 비교하기 위해, 저는 두 가지 기준 모두에 적용할 수 있는 순위 상관관계(rank correlations)와 AUC를 사용했습니다.
시작 가격, 레이블, 가중치 및 뉴스 종류
- 시가 (Starting close): 시장 시간 외 스캔의 경우, 스캔 시점 이전 또는 그 때의 마지막 종가를 사용했습니다 (스캐너 자체의 견적이 일치하여 중앙값 차이가 0.0%였습니다). 시장 시간 중 스캔의 경우, 당일 종가를 사용했습니다. 저는 전날 종가를 사용하지 않았는데, 왜냐하면 AI가 본 5일 상승분에는 이미 당일까지의 움직임이 포함되어 있었고, 전날 종가부터 시작하면 그 부분을 두 번 계산하게 되기 때문입니다. Findings 섹션의 변화는 이 선택이 얼마나 중요한지 보여줍니다.
- 레이블 (Labels): +5% 이상 상승, -5% 이하 하락, 그 사이는 보합으로 분류했습니다. 가격은 분할 조정(split-adjusted)되었습니다.
- 균형 (Balance): 과거 AI의 급등 수치 3가지 결과에 대해 3개 구간을 사용했으며, 그룹당 40개의 사례를 사용했습니다. 단 하나의 그룹('높은 급등', '보합')만 31개의 사용 가능한 사례만을 가졌습니다. 각 사례는 균형 잡힌 샘플을 자연스러운 혼합으로 되돌리는 가중치를 지닙니다. 이 가중치는 1.03부터 4.30까지 변동하여, 351개의 사례가 약 277개의 비가중치 사례와 비슷한 양의 정보를 담고 있습니다. 아래 결과는 표에 'raw'라고 명시되지 않은 한 모두 가중치가 적용되었습니다.
- 뉴스 종류 (News kinds): 각 사례는 네 가지 뉴스 레이블 중 하나를 지닙니다.
| 뉴스 종류 | 의미 | 사례 수 |
|---|---|---|
| company_fact | 회사에 무언가 발생함: 실적, 거래, 자금 조달, 임상 시험 결과 발표, 애널리스트 등급, 소송 | 192 |
참고 자료: 스캐너 자체의 실시간 AI. 이 스캐너는 어떤 모델이 각 호출에 응답했는지 기록하지 않았습니다. 코드상 기본값은 Claude Sonnet 4.5였으며 GPT-4o mini를 폴백(fallback)으로 사용했기 때문에, 정확한 표기는 "가장 유력하게 Claude Sonnet 4.5 (미확인)"입니다. 또한 이 스캐너는 벤치마크에 표시된 것보다 더 많은 정보를 보았습니다: 티커, 가격, 출처가 포함된 세 개의 헤드라인, 소셜 미디어 요약, 그리고 이미 가격 모멘텀을 포함하고 있는 스캐너 자체의 공식 점수입니다. 따라서 구형 AI와 신규 모델 간에 차이가 발생할 때, 추가적인 컨텍스트(context)가 그 이유일 수 있습니다. 구형 AI가 사용했을 가능성이 높은 모델과 같은 계열인 Claude Haiku 4.5는 이 단순화된 프롬프트로 +0.31의 상승률을 보였으며, 이는 스캐너의 전체 컨텍스트를 활용한 구형 AI의 동일 사례 351건에서의 +0.69(전체 829개 호출에서 +0.55)와 비교됩니다. 저는 여기서 모델과 컨텍스트를 분리할 수 없기 때문에, 제가 신뢰하는 교훈은 파이프라인에 관한 것입니다: 프롬프트가 모델에게 무엇을 제공하는지 확인해야 합니다.
Kaggle의 모델들은 모두 동일한 프롬프트를 받았으며, 각 사례마다 새로운 채팅 세션이 진행되었습니다. 여기에 제시된 각 모델의 수치는 해당 제공업체의 기본 설정으로 한 번 실행하여 얻은 것입니다.
여섯 개의 연구소에서 나온 아홉 개의 모델이 주요 작업을 수행했으며, 그중 네 개는 추론(reasoning) 모델이었습니다. 호출 오류가 발생한 경우는 없었습니다.
모델명, 소속 연구소, 추론 여부, 학습 차단 시점 및 답변
| 모델 | 연구소 | 추론 | 학습 마감일 | 답변 건수 (351건 중) | 파싱 실패 건수 | 출력 토큰 |
|---|---|---|---|---|---|---|
| Qwen3 235B Instruct 2507 | Alibaba | no | not published (released July 2025) | 351 | 0 | 6k |
| ... | ||||||
| 모든 모델은 메인 태스크의 버전 2로 실행되었습니다. Kaggle의 모델 프록시는 호출이 시작되기 전에 발생할 수 있는 최대 비용을 예약하며, 버전 1은 한 번에 4개의 호출을 보냈기 때문에 이러한 예약이 항상 무료 일일 AI 할당량에 맞지 않았고 프록시가 Claude Opus 5.5의 대부분의 호출을 거부했습니다. 버전 2는 한 번에 2개를 보내며 다른 것은 아무것도 변경하지 않습니다. 그럼에도 불구하고, 프록시는 351건 중 321건에서 GPT-5.5를 거부했으므로, GPT-5.4가 OpenAI의 더 큰 모델을 대신합니다. Grok 4.20 Reasoning은 버전 1로 완료되었지만, 할당량이 부족해지면서 버전 2 실행이 중단되었기 때문에 테이블에도 없습니다. 태스크 페이지에는 여전히 해당 실행 기록이 나열될 수 있습니다. 거부된 호출은 거기서 50으로 계산되므로, 거부된 호출이 있는 어떤 실행의 점수는 무시하십시오. |
정확한 프롬프트 및 실행 설정
시스템 메시지는 없습니다. Kaggle의 모델 프록시는 온도를 전달하지 않으므로, 각 모델은 제공업체의 기본 샘플링으로 실행되었습니다. 'reasoning' 필드는 없으며, 저는 실행을 공개하기 전에 JSON 외부에 텍스트가 있는 모든 답변을 읽었으며; 어느 것도 회사 이름을 언급하지 않습니다. 파싱할 수 없는 답변은 50으로 계산됩니다. Google에 따르면 Gemini 3.7 Flash에 대한 요청은 10월 8일 이후로 Gemini 3.8 Flash로 이동했으며, 제 실행은 그 이후였으므로 해당 행은 3.8 Flash가 답변한 것일 수 있습니다. Google의 모델 카드는 모두 동일한 2026년 3월 학습 마감일을 제공합니다.
프롬프트는 줄 바꿈이 추가되어 읽기 쉽게 되어 있습니다:
You are reading news about a small, frequently hyped US-listed stock (most trade under
$10 a share). The company's name is hidden. You see the stock's move over the previous
5 trading days and a one-sentence summary of the recent news.
...
동일한 351개 사례에 대해 각각 한 가지씩 변화를 주는 두 개의 쌍둥이 과제(twin tasks)가 있습니다. hype_trap_no_move는 상승 전(run-up) 수치를 숨겨서 해당 단일 수치의 영향력(헤드라인에는 여전히 주가가 급등했다고 언급할 수 있음)을 측정합니다. hype_trap_no_read는 프롬프트에서 "가격 변동(price move)" 뉴스를 정의하는 것이 모델이 과장된 정보(hype)에 대해 더 조심하게 만들 수 있는 경우, 해당 질문을 제외합니다. hype_trap_no_move는 Claude Haiku 4.5, Gemini 3.7 Flash, Qwen3 235B Instruct 2507, 그리고 GPT-5.4 mini로 실행되었으며, hype_trap_no_read는 Claude Haiku 4.5, Gemini 3.7 Flash, 그리고 Qwen3 235B Instruct 2507으로 실행되었습니다.
점수 산정 방식
- 상승 전 추적(Run-up chasing), 주요 테스트. 모델의 **추가 상승 폭(extra lift)**은 가장 작은 상승 전부터 가장 큰 상승 전까지 답변이 얼마나 오르는지, 그 차감액에서 동일한 범위에서 5%를 초과하는 이득의 실제 비율 증가분을 뺀 값입니다. 이 수치가 추적을 계산하려면 추가 상승 폭의 95% 범위가 완전히 0보다 위에 위치해야 합니다. 표에는 또한 상승 전과의 순위 상관관계도 제공합니다 ( +1은 더 큰 상승 전, 더 큰 수치를 의미하며, 매번 그렇습니다).
- Brier 스킬(Brier skill), 리더보드 점수. 0점은 항상 31%의 기본 비율을 추측하는 것보다 나은 것이 없음을 의미합니다. 0점 미만은 더 나쁜 것입니다. **편향성(Bias)**은 평균 답변에서 31을 뺀, 포인트 단위의 값입니다. AUC는 주가가 급등한 주식이 변동이 없는 주식보다 높은 수치를 얻을 확률입니다. 0.5는 동전 던지기와 같습니다.
- 인식 탐지(Recognition probe). 30개 사례와 10개의 가짜 사례(placebos)를 사용하여, 추가적인 호출은 모델이 해당 회사를 인식하는지 여부만을 질문합니다.
정의 (수학적 검토용)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기