52주 신고가에 거래량을 더하면, 조사할 종목을 얼마나 줄일 수 있을까?
52주 신고가 근처에서 주식을 매수할 때 가장 걱정되는 건 돌파 직후 되돌림이다. 여기에 거래량이나 상대거래량(RVOL)을 더한다고 해서 어떤 종목이 하락할지 미리 알 수 있는 것은 아니다. 내가 해결하려는 문제는 주문을 내기 훨씬 전 단계에 있다.
어떤 종목은 최근 1년 최고가에 가깝지만 거래가 뜸하고, 다른 종목은 거래량이 급증했어도 최고가와는 거리가 멀다. 전체 차트를 살펴볼 시간이 부족하다면 어떤 종목부터 조사해야 할까?
나는 먼저 가격이 52주 고점에 얼마나 가까운지 확인하고, 그다음 절대 거래량으로 한 번 더 걸러낸다. 살아남은 후보에 대해서만 RVOL, 유동성, 가격 구조를 자세히 본다. 실제 화면에서 함께 적용한 필터는 52W High와 Volume이었다. Relative Volume 열은 다음 단계에서 확인할 수 있었지만, RVOL의 수치 임곗값을 이번에 적용하거나 검증한 것은 아니다.
스크리닝의 목적은 매수 신호를 만드는 것이 아니라 조사 시간을 배분하는 것이다.
두 필터는 서로 다른 문제를 걸러낸다
52주 최고가는 현재 가격을 지난 1년의 가격 범위 안에서 비교할 기준이다. 최고가 근처에 있다는 사실은 상대적으로 강한 가격 구간에 있음을 시사한다. 그렇다고 돌파가 유효하다거나 앞으로 상승이 이어진다는 뜻은 아니다.
여기서 ‘최고가 근처’라는 말부터 정확히 정할 필요가 있다. Finviz 스크리너 도움말은 기간 최고가와 최고가 대비 백분율 거리 같은 조건을 소개한다. ‘고점에서 5% 이내’는 계산 가능한 연구 규칙이다. 하지만 다른 제품의 52W High 입력란에 10을 넣었다고 해서 그 뜻이 ‘고점에서 10% 이내’가 되는 것은 아니다.
거래량은 다른 질문을 다룬다. 최고가에 근접한 주식이라도 거래가 드물다면 매수·매도 호가 차이, 호가창 깊이, 원하는 가격에 실제로 진입하거나 청산할 수 있는지 확인해야 한다. 차트가 좋아 보인다는 이유만으로 체결이 보장되지는 않는다.
나는 이를 일종의 조사 비용으로 생각한다. 거래가 뜸한 후보가 하나 늘 때마다, 그 종목의 유동성을 따로 검토할 일이 하나씩 생긴다. Investor.gov의 유동성 설명도 가격에 큰 충격을 주지 않고 자산을 거래할 수 있는가에 초점을 둔다. 거래량이 높으면 살펴볼 이유가 생길 수는 있어도, 호가창이 충분히 두껍다는 증거는 아니다.
반대로 거래량만 기준으로 삼아도 문제가 생긴다. 큰 하락과 대규모 매도 역시 거래량을 늘릴 수 있기 때문이다. 그래서 내 첫 단계는 두 지표를 더한 점수를 만드는 것이 아니라, 두 조건을 모두 충족하는 교집합을 찾는 것이다. 승률이 높아진다고 주장하려는 것은 아니다.
가상의 여섯 종목이 네 종목, 다시 두 종목이 되는 과정
실제 시세를 이용하지 않고 S1부터 S6까지 존재하지 않는 종목 여섯 개를 만들었다. 각 종목에 가상의 현재가, 52주 최고가, 당일 거래량을 넣는다.
첫 번째 조건은 현재가가 해당 종목의 52주 최고가 대비 95% 이상인 경우다. 두 번째 조건은 가정한 거래량이 100만 주 이상인 경우다. 95%와 100만 주는 예시를 위해 정한 값이며, 실제 스크리너의 필드 정의나 단위를 뜻하지 않는다.
// 모두 가상 데이터이며 거래량 단위도 예시용이다.
const stocks = [
["S1", 96, 100, 600000],
["S2", 49, 50, 1800000],
["S3", 190, 200, 900000],
["S4", 9.8, 10, 2400000],
["S5", 80, 100, 1600000],
["S6", 60, 100, 2200000],
];
// [종목 ID, 가정한 현재가, 가정한 52주 최고가, 가정한 당일 거래량]
const nearHigh = stocks.filter(([, price, high]) => price / high >= 0.95);
const candidates = nearHigh.filter(([, , , volume]) => volume >= 1000000);
console.log(stocks.length, nearHigh.length, candidates.length); // 6 4 2
console.log(candidates.map(([id]) => id)); // ["S2", "S4"]
결과는 6 → 4 → 2다. 최종 후보는 S2와 S4다.
| 단계 | 남는 가상 종목 | 제외 이유 |
|---|---|---|
| 시작: 6개 | S1, S2, S3, S4, S5, S6 | — |
| 52주 고점의 95% 이상: 4개 | S1, S2, S3, S4 | S5, S6는 고점에서 멀다 |
| 거래량 100만 주 이상: 2개 | S2, S4 | S1, S3는 거래량이 부족하다 |
오히려 더 주의 깊게 보고 싶은 사례는 S3다. 가상의 현재가가 190, 최고가가 200이므로 95% 경계에 정확히 걸친다. 거래량은 90만 주로, 두 번째 기준보다 10만 주 부족하다. 코드는 S3를 즉시 제외한다. 그렇다고 S3가 나쁜 종목이거나 연구할 가치가 없다는 뜻은 아니다.
거친 필터는 후보 목록을 줄이지만, 경계 근처의 흥미로운 종목도 놓칠 수 있다. 시간이 극히 부족한 날에는 이런 누락을 받아들일 수 있다. 반대로 유통주식 수가 적은 종목의 비정상적인 가격·거래량 움직임을 조사한다면, S3를 ‘경계값 재검토’ 목록에 따로 두는 편이 나을 수 있다. 임곗값은 주식에 점수를 매기는 것이 아니라 내 시간을 배분하는 도구다.
거래 주식 수에도 맥락이 필요하다. 순전히 단위를 설명하기 위해 주가가 10위안이라고 가정하면 100만 주는 약 1,000만 위안의 거래대금에 대응하고, 100위안이라면 약 1억 위안에 대응한다. 이는 실제 체결 자료가 아닌 가상의 산술 예시다. 어느 쪽도 호가창 깊이를 대체하지 못한다. 거래대금, 회전율, 호가 스프레드가 일률적인 거래 주식 수 기준보다 유용할 수 있다.
실제 스크리너에서는 필터와 정렬을 구분해야 한다
가상 배열의 교집합은 간단하다. 실제 화면에서는 두 번째 필터를 추가했다고 믿었지만, 사실은 표의 정렬 순서만 바꾼 경우가 더 큰 함정이다.
내가 유지·개선 작업에 참여하는 NuvexLens 스크리너로 이 과정을 확인했다. 실제로 볼 수 있었던 것은 두 번째 조건을 추가한 뒤에도 첫 번째 필터 칩이 그대로 남아 있고, 후보 수 요약이 더 작아졌다는 점이다. 두 목록을 내보낸 뒤 수동으로 합칠 필요가 줄어든다는 점은 편리하다. 그러나 이것만으로 특정 백엔드 알고리즘이 증명되지는 않는다.
한 차례 미국(US) 시장 Overview 화면 확인에서는 Volume과 Relative Volume 열이 함께 보였고, 52W High 필터 진입점도 확인했다. 열이 보인다는 사실이 RVOL 수치 필터가 이미 적용되었다는 뜻은 아니다. 화면의 실제 종목별 시세나 가격도 이 글에 싣지 않았다.
실제로 두 필터 칩을 동시에 확인한 것은 별도의 중국(CN) 시장 세션이었다. Add New Filter에서 52W High > 10을 추가하고, 이어 Volume > 1000000을 넣었다. 두 칩이 동시에 보였고 후보 수 요약도 줄었다. 이는 그 순간 UI에 표시된 현상이지, 과거 백테스트나 고정된 동일 종목 집합, 내부 데이터 엔진 검증이 아니다. 두 시장의 관찰을 하나의 시세 스냅샷으로 합쳐서는 안 된다.
이후 복수 필터를 점검할 때 나는 세 가지를 확인한다. 처음의 가격 필터 칩이 남아 있는가? 거래량 조건이 열 정렬 메뉴가 아니라 필터 편집기에서 추가되었는가? 실제로 자격을 갖춘 후보 집합이 바뀌었는가, 아니면 표시 순서만 달라졌는가?
이런 실수는 직접 겪었다. 한 번은 Volume 열의 정렬 메뉴를 눌러 놓고 수치 필터를 보고 있다고 착각했다. 다시 Add New Filter에서 작업한 뒤에야 두 조건이 함께 표시됨을 확인했다. 정렬은 표시 순서를 바꾸고, 필터는 대상 집합을 바꾼다. 또한 시장 범위나 데이터 시점이 달라졌다면 후보 수가 감소했더라도 새 집합이 이전 집합의 부분집합이라고 단정할 수 없다.
숫자의 의미를 섞어서도 안 된다. 가상 코드의 ‘52주 고점에서 5% 이내’는 내가 정의한 규칙이다. 실제 화면에서 입력한 52W High > 10은 별도의 UI 관찰이다. 해당 필드의 단위와 정의가 확인되지 않았으므로 10을 ‘신고가까지 10%‘라고 해석해서는 안 된다.
후보가 줄어든 다음에도 해야 할 일
S2와 S4가 실재하는 종목이라 해도, 필터 두 개를 통과했다는 이유로 매수하지는 않을 것이다. 먼저 오늘의 거래량이 해당 종목의 평소 거래량과 비교해서 활발한 편인지 묻는다. 절대 거래량은 첫 단계의 대략적인 기준이고, RVOL이나 동일한 기준으로 계산한 과거 평균 거래량은 그다음 비교에 가깝다.
일반적으로 RVOL은 현재 거래량을 비교 가능한 과거 평균 거래량에 대한 비율로 본다. TradingView 공식 문서에는 이전 10개 기간의 평균을 이용하는 방법과 장중 같은 시간대를 비교하는 별도의 방법이 소개되어 있다. 이는 TradingView가 사용하는 계산 방식의 설명이지, 앞서 확인한 스크리너의 백엔드 공식을 검증한 자료가 아니다. 이번에 RVOL > 1.5 같은 수치 조건을 적용했다고 주장하지도 않는다.
이후에는 가격 구조를 살펴봐야 한다. 이전 고점에 접근하는 중인가, 막 돌파했는가, 급등했다가 다시 밀리고 있는가? 근처 저항 구간은 어떤가? 거래대금과 호가 깊이, 스프레드, 손절 위치, 포지션 규모까지 고려하면 같은 두 필터를 통과한 종목도 서로 다른 판단이 필요하다.
6 → 4 → 2는 누구나 실행할 수 있는 가상의 예시일 뿐 실전 백테스트가 아니다. 실제 화면 확인은 두 조건 칩과 후보 수 변화까지 확인했으며, 투자 수익이 좋아졌음을 입증하지 않는다.
내가 남기고 싶은 것은 가격 위치로 한 번, 거래 활발함으로 한 번 후보를 줄여서 사람이 직접 판단해야 할 부분에 시간을 쓰는 순서다. 스크리너는 수백 개 차트를 열어보는 수고를 줄여 줄 수 있어도 최종 매매 결정을 대신해 주지는 않는다.
이 글은 연구 및 교육 목적이며 투자 조언이 아니다.