방법론
이 사이트의 모든 판정과 확률이 어떻게 계산되는지 전부 적었다. 숨긴 파라미터는 없다. 규칙을 모르면 그 숫자가 맞는지 틀린지 독자가 판단할 수 없기 때문이다.
데이터
국내 상장 종목의 일봉(시가·고가·저가·종가·거래량)을 쓴다. 현재 152거래일 분량의 브리핑이 있다. 지수 칸의 코스피·코스닥은 실제 지수(네이버 증권 공개 시세)다. 국면 판정과 전망은 KODEX 200(069500) ETF 일봉으로 계산한다. 자동매매 시스템이 이 봉을 확정 종가로 보관하고 있어 과거 전 기간을 같은 기준으로 다시 계산할 수 있어서다. 그래서 국면 칸의 20일 등락·변동성은 지수 칸 숫자와 조금 다르다.
시장 폭은 두 가지다. 그날 장 마감 뒤에 받은 날은 코스피·코스닥 전 종목의 상승·하락 수(네이버 증권)를 싣는다. 이 값은 과거로 거슬러 받을 수 없어서 수집을 시작한 뒤 날짜에만 있다. 그 전 날짜는 시스템이 그날 들여다본 종목(날마다 수백 개)으로 센 값이고, 화면에 "봇 관찰"이라고 적는다. 시장 전체의 무작위 표본이 아니고 표본 수가 날짜마다 달라서, 상승 비율을 날짜 간 시계열로 그리지 않는다.
장중에 저장된 봉은 쓰지 않는다. 종가가 아니라 그 시각의 가격이기 때문이다. 종목마다 봉이 빠진 날도 있어서, 등락과 표본은 거래일 달력으로 이어진 봉에서만 잰다.
왜 퍼센트가 아니라 σ인가
같은 3% 하락도 평소 하루 0.5%씩 움직이던 지수와 5%씩 움직이던 지수에서 의미가 완전히 다르다. 앞은 사건이고 뒤는 평범한 하루다. 그래서 이 사이트는 임계값을 절대 퍼센트로 박지 않고, 그 지수 자신의 변동성 배수로 잰다.
일간 변동성 σ는 최근 20거래일 로그수익률의 표본표준편차다. 20거래일 등락은 ret20 / (σ × √20)으로 정규화한다. 이 값이 +0.75면 지난 한 달 움직임이 그 지수의 평소 한 달 노이즈보다 0.75배 크게 위로 갔다는 뜻이다.
국면 판정
방향과 변동성은 서로 다른 축이라 한 라벨에 섞지 않는다. 방향은 아래 네 가지 중 하나로 정하고, 변동성이 높은 날은 고변동 표시를 따로 붙인다. 위에서부터 순서대로 검사해 처음 걸리는 것으로 확정한다.
- 강세 추세 · 이평선 정배열 + 20일 등락 +0.75σ 이상
- 완만한 흐름 · 방향은 있으나 강세·약세 조건에 미달
- 횡보 · 20일 등락 ±0.75σ 이내 + 밴드폭 하위 40%
- 약세 추세 · 이평선 역배열 + 20일 등락 -0.75σ 이하
정배열은 EMA5 > EMA20 > EMA60, 역배열은 그 반대다. 밴드폭은 20일 볼린저 밴드의 (상단 - 하단) / 중심선이고, 하위 40%는 그 지수 자신의 최근 100거래일 밴드폭과 비교한 순위다. 고변동 표시는 현재 20일 변동성이 자기 이력 상위 20%에 들 때 붙는다.
앞으로 10거래일 확률
예측 모델이 아니다. 학습된 파라미터도 없다. 하는 일은 세는 것 하나다.
- 오늘 지수의 국면을 세 축으로 요약한다. 20일 등락 구간(σ 기준 5구간), 밴드폭 순위 구간(4구간), 이평 배열(정배열·역배열·혼조).
- 전 종목 전 날짜에서 같은 세 축 조합에 있던 과거 사례를 모은다. 개별 종목까지 포함하는 이유는 지수만으로는 표본이 수십 건에 그치기 때문이다.
- 각 사례의 10거래일 뒤 등락을 그 종목 자신의
σ × √10으로 나눈다. 지수의 3%와 소형주의 3%를 같은 자로 재기 위한 정규화다. - 그 값이
+0.75이상이면 상승,-0.75이하면 하락, 사이면 횡보로 분류하고 비율을 낸다.
표본이 30건 미만이면 확률을 내지 않고 비워 둔다. 그리고 그 날짜 장 마감까지 결과(10거래일 뒤 종가)가 확정된 사례만 쓴다. 과거 브리핑을 다시 만들 때도 그날 알 수 없었던 미래는 표본에 넣지 않는다. 이걸 지키지 않으면 과거 적중률이 저절로 좋아진다.
2026-09-24 전 기간 재계산. 그전에는 사례를 시작일로만 걸렀다. 시작은 기준일 전인데 결과는 기준일 뒤에 나오는 사례(직전 10거래일)가 섞였고, 브리핑이 전부 나중에 한꺼번에 만들어져 모든 날짜에 이 누수가 들어 있었다. 결과 확정일로 거르도록 고치고 봉이 빠진 구간도 빼서 전 기간을 다시 만들었다. 당시 채점판에 걸려 있던 적중률 74%(31건)는 누수가 들어간 값이다.
이 확률은 조건부 빈도이지 확신이 아니다. 표본이 나온 기간이 특정 시장 국면에 치우쳐 있으면 그 편향이 그대로 숫자에 들어간다. 그래서 결과를 채점해 공개한다.
해설 문장은 누가 쓰나
첫 화면의 세 문장은 이 맥에서 도는 로컬 LLM(qwen3.6:27b)이 쓴다. 외부 서비스로 나가는 데이터는 없다. 다만 모델에게 시장을 해석하게 두지는 않는다. 판단은 코드가 하고 모델은 표현만 맡는다.
원본 수치만 던져 주면 모델이 "어느 축이 오늘의 이야기인가"를 스스로 정하다가 틀린다. 실제로 지수가 +6.32% 오른 날 "시장이 가라앉았다"고 쓴 출력이 나왔다. 그래서 지금은 코드가 먼저 오늘의 중심축 하나(지수와 시장 폭의 괴리, 밴드 압축, 제자리인데 시끄러움 등)와 그것을 잡아당기는 반대 사실 하나를 확정하고, 모델에게는 그 내용을 3문장으로 옮기는 일만 시킨다. 시장 폭 이야기는 전 종목 등락 수가 있는 날에만 한다. 봇이 들여다본 종목만으로 "실제로 오른 종목은 몇 %뿐"이라고 쓰면 근거 없는 말이 되기 때문이다.
나온 문장은 다시 기계가 검사한다. 아래 중 하나라도 걸리면 반려하고 다시 쓰게 한다.
- 주어진 목록에 없는 숫자가 등장하면 반려한다. 지어낸 통계를 막는 장치다.
- 미래 단정(~할 것이다, 예상된다, 가능성이 크다)이 섞이면 반려한다.
- 매수, 매도, 추천 같은 권유 표현이 있으면 반려한다.
- 3문장을 넘거나, 한 문장이 125자를 넘거나 28자에 못 미치면 반려한다.
- 한자나 지수·지표 이름이 아닌 영어 단어가 섞이면 반려한다.
- 숫자를 한글로 풀어써도("하위 영", "백 거래일") 반려한다. 숫자 검사를 우회하려는 시도를 실제로 잡아냈다.
두 번 다시 써도 통과하지 못하면 모델 문장을 버리고 코드가 만든 규칙 문장을 싣는다. Ollama가 꺼져 있는 날에도 마찬가지다. 화면에는 그 문장이 어디서 왔는지 항상 적어 둔다.
오늘 하루 해부
분봉 데이터가 없다. 그래서 몇 시에 무슨 일이 있었는지는 그리지 않는다. 대신 일봉의 네 값(시가·고가·저가·종가)이 남긴 흔적으로 장중에 어디서 힘이 실렸는지를 읽는다.
- 아래꼬리가 길고 종가가 위쪽에서 끝났다면, 장중에 눌렸지만 받아 올린 매수세가 있었다는 뜻이다.
- 위꼬리가 길고 종가가 아래쪽이면, 올렸다가 되밀렸다는 뜻이다.
- 몸통이 범위의 대부분을 차지하면 한 방향으로 밀어붙인 하루다.
- 몸통이 작고 양쪽 꼬리가 길면 위아래로 흔들리다 제자리로 온 하루다.
고가와 저가 중 어느 쪽이 먼저 나왔는지는 일봉만으로 알 수 없다. 그래서 순서는 그리지 않는다. 시가 갭은 전일 종가 대비 시가의 차이이고, 장 마감 후에 들어온 정보의 크기로 읽는다.
채점
전망일로부터 10거래일이 지나면 기준 지수의 실제 등락을 그날 계산했던 ±0.75σ 구간과 대조한다. 위로 벗어나면 상승, 아래로 벗어나면 하락, 안이면 횡보다. 이 결과는 자동으로 채점판에 쌓이고 수정하지 않는다. 현재까지 129건이 채점됐고 적중률은 58%다.
세 갈래 중 하나를 고르는 문제라 무작위 적중률이 33%이고, 실제 시장은 횡보로 끝나는 경우가 많아서 횡보만 계속 외쳐도 점수가 나온다. 그래서 채점판에 매번 "횡보"라고만 했을 때의 적중률을 비교 기준으로 같이 싣는다. 전망이 이 기준을 넘지 못하면 확률표가 한 일이 없다는 뜻이다. 어떤 전망을 냈을 때 얼마나 맞았는지도 갈라서 싣는다.
후보는 어떻게 고르나
추천이 아니다. 자동매매 시스템이 그날 점수를 매긴 종목을, 왜 집었는지와 함께 공개하는 기록이다. 매수·매도 시점이나 목표가는 제시하지 않는다.
- 그날 기록된 신호 중 그날의 실효 임계값을 넘은 것만 고른다. 임계값은 국면과 게이트에 따라 날마다 달라서 상수로 박지 않는다.
- 같은 종목이 하루에 수십 번 기록되므로 최고 점수 행 하나만 대표로 남긴다.
- 그 종목의
(점수 10점 구간 × 시장 국면)조합으로 과거 신호를 모아 5일 성과를 낸다. 이게 기저율이다. 5일 결과가 그날 장 마감까지 확정된 신호, 즉 5거래일 전까지의 신호만 쓴다. - 기저율 표본이 30건 미만이면 후보에서 뺀다. 근거 없이 종목만 내보이지 않는다.
기저율이 이 페이지의 본론이다. 실험실에 이미 "점수는 성과를 줄 세우지 못했다"를 실측으로 실었으니, 같은 엔진이 뽑은 종목을 낼 때도 그 조건의 실제 과거 성적을 나란히 붙인다. 숨기면 두 페이지가 서로를 무너뜨린다.
점수 항목의 합은 총점과 맞지 않는다. 실측으로 총점 77.8에 기록된 항목 합이 61.8이었다. 분봉 점수처럼 DB에 남지 않는 항목이 있어서다. 차액을 지우지 않고 막대에 회색 구간으로 남긴다. 호가 항목은 언제나 0인데, 체결강도를 뽑을 응답 필드가 존재하지 않아 역사상 한 번도 값이 들어간 적이 없다.
걸러진 후보도 사유와 함께 싣는다. 시스템이 무엇을 통과시키지 않았는지가 통과시킨 것만큼 정보다. 실제 매수 여부, 수량, 손익은 싣지 않는다.
후보의 성격은 어떻게 붙이나
점수 항목 숫자만 늘어놓으면 왜 후보인지 알 수 없다. 그래서 그 종목의 일봉으로 기술적 상태를 직접 계산해 성격을 하나 붙인다. 고점 돌파 시도, 추세 중 눌림, 과열·급등 직후, 낙폭 과대, 하락 추세 중 반등 같은 것들이다.
봇이 남기는 진입 사유 기록을 쓰려 했으나 실제 진입을 시도한 건만 저장돼 후보 커버리지가 9%(271쌍 중 24)에 그쳤다. 일봉은 99% 후보가 60봉 이상 갖고 있어 직접 계산하는 편이 낫고, 모든 후보에 같은 방식이 적용된다는 이점도 있다.
여기서도 임계값은 σ다. 20일선 이격을 절대 %로 판정하면 이 시장에서 무너진다. 후보 211건의 실측 분포에서 이격 p75가 +21%였다. "20일선 +20% = 과열"로 잡으면 3사분위수가 통째로 과열이 된다. 그래서 이격을 그 종목 자신의 20일 노이즈로 나눠 판정한다. 실측 분포는 p50 0.23σ · p75 0.72σ · p90 1.09σ · p95 1.33σ이고, 임계값은 이 분포에서 잡았다.
지표를 뽑은 일봉 날짜가 후보 날짜와 다르면 화면에 그대로 적는다. 이틀 전 상태를 "오늘"로 보여주면 거짓이 된다.
저평가·고평가는 판정하지 않는다
후보 페이지에 재무와 기술적 상태를 다 싣지만 싸다·비싸다는 말하지 않는다. 이유는 둘이다.
- 확정 재무는 지난 사업연도이고 가격은 현재다. 기준일이 어긋난 두 값으로 배수를 내면 숫자가 그럴듯해 보이면서 틀린다. 그래서 PER·PBR 자체를 내지 않는다.
- "저평가다"는 사실상 "사라"다. 매매 판단을 제시하지 않기로 한 설계와 어긋난다.
대신 판단에 필요한 재료를 다 준다. 성격 분류, 기술 지표, 그 조건의 과거 성적, 재무 3년 추이의 방향, 걸러진 이유까지. 어느 쪽으로 읽을지는 보는 사람 몫이다.
후보 채점
낸 후보는 후보일 종가와 정확히 10거래일 뒤 종가를 비교한다. 둘 중 하나라도 확정 봉이 없으면(거래정지, 미수집) 채점하지 않는다. 방향을 단정한 게 아니므로 적중·실패가 아니라 실현 수익률의 분포로 낸다. 평균만 내지 않고 중앙값을 같이 낸다. 폭등이나 폭락한 소수가 평균을 끌고 가는 일이 흔해서, 보통의 후보가 어땠는지는 중앙값이 더 정확하다.
점수 구간별 성적도 갈라 두되, 표본 30건 미만 구간은 숫자를 내지 않는다. 표본이 적으면 같은 종목이 며칠 연달아 폭등한 결과 몇 건이 구간 평균을 통째로 바꾼다. 재계산 전에는 한 구간이 7건에 평균 +99%였다.
재무와 보유자
재무는 DART 사업보고서 원문에서 계산한다. 계정명이 회사마다 달라("영업이익" vs "영업이익(손실)", "매출액" vs "수익(매출액)") 별칭표로 잇고, 연결재무제표가 없으면 별도로 넘어간다. 우선주는 DART에 고유번호가 없어 보통주로 접는다. 실측 커버리지는 86%다.
PER·PBR은 내지 않는다. 최신 확정 재무는 지난 사업연도이고 가격은 현재다. 기준일이 어긋난 두 값으로 배수를 내면 숫자가 그럴듯해 보이면서 틀린다. 대신 가격과 무관한 값만 낸다. ROE, 부채비율, 영업이익률, 매출·영업이익 3년 추이.
보유자는 DART 대량보유상황보고(5% 룰)다. 같은 보고자의 최신 건만 남긴다. 해외 13F는 미국 종목이라 국내 종목의 근거로 쓰지 않는다.
기사는 어떻게 고르나
수집기가 포털에 종목명을 넣어 검색하고 돌아온 기사 전부에 그 종목을 태깅한다. 실측(2026-08, 6,000건)으로 제목에 종목명이 실제로 든 것은 27.8%뿐이었다. 그래서 제목에 종목명이 든 기사만 싣는다. 재현율을 포기하고 정밀도를 택했다.
개별 기사에 수익률을 붙이지 않는다. 저장된 수익률은 기사 내용과 무관하게 그 종목의 등락을 붙인 값이라, 무관한 기사 셋이 같은 종목·같은 수익률을 달고 있는 경우가 실제로 있었다. 그걸 그대로 실으면 없는 인과를 주장하게 된다. 뉴스 수익률은 실험실에서 시장 전체 통계로만 다룬다.
이 사이트가 하지 않는 것
- 종목을 추천하지 않는다. 후보와 그 조건의 과거 성적을 공개하되 매매 판단은 제시하지 않는다.
- 매수·매도 시점을 제시하지 않는다.
- 계좌 잔고, 보유 종목, 손익 금액, 실제 매수 여부를 싣지 않는다.
- 기준일이 어긋난 배수(PER·PBR)나 표본 30건 미만의 통계를 내지 않는다.
- 지나간 전망을 유리하게 고쳐 쓰지 않는다.