나는 어느 날 저녁 봇을 하루 돌리고 로그를 열어봤다. 프로그램은 그날 하루 동안 매수 조건을 검사하면서 24만 150번의 차단 로그를 남겼다. 24만 번이라니, 처음엔 나도 숫자가 너무 커서 뭔가 잘못된 줄 알았다. 그런데 내가 짜둔 봇은 실시간으로 쏟아지는 틱마다 감시 종목 수십 개를 일일이 대본다. 그러니 장이 열려 있는 하루면 이 검사 횟수가 수십만 번으로 쌓인다. 살 만해 보이는 자리를 만날 때마다 조건을 하나씩 대보고 "이래서 안 산다"를 기록한 흔적이, 그날 24만 150번이었던 것이다. 나는 이 프로그램을 내 손으로 만들어 놓고도, 대체 뭘 그렇게까지 막았나 싶어서 차단 사유별로 정리된 걸 봤다.
나는 1위를 보고 좀 의외였다. 1위는 앞에서 얘기한 '혼자 급등' 거르는 것도 아니고, 시장 국면 보는 것도 아니었다. 1위는 no_h60이었고, 7만 번이 넘었다. no_h60은 "이 종목이 아직 최근 60일 고점을 못 넘었다"는 뜻이다. 봇이 그날 거른 종목 대부분은 위험한 것도 급등한 것도 아니었다. 그냥 전고점 아래에 있는 종목이었다.
목차
종목을 받으면 자리부터 보게 만들었다
나는 이 프로그램을 이렇게 짜뒀다. 조건검색에서 신호가 뜬 종목이 감시망에 올라오면, 봇이 그 종목을 사기 전에 먼저 지금 살 만한 자리에 있는지부터 확인하게 했다. 최근 60일 고점 위로 올라온 자리냐, 아니냐. 내가 정해준 이 선을 못 넘은 종목은, 그게 뭐가 됐든 봇이 사지 않게 만들었다. no_h60은 여기서 걸린 것이다.
이건 내가 봇한테 넣어준 기준이다. 나는 최근 고점을 못 넘은 종목은 사지 않는다.
이유는 주식 해본 사람은 많이들 경험해 봤을 거라 생각한다. 나도 예전에 전고점을 넘지 못하는 종목을 매매하면서 답답했던 적이 많다. 가격이 조금만 올라오면 어디선가 매물이 나오면서 다시 밀리는 경우가 잦았다. 그땐 싸 보인다고 바닥에서 주워 담았다가 안 올라 속이 탄 적이 많았다. 그래서 지금 나한테는 그게 싼 종목이 아니라 좀처럼 위로 못 가는 종목이다. 나는 그 경험을 60일 고점이라는 선 하나로 프로그램에 박아뒀다.
사람들은 매매 규칙을 이렇게 숫자로 바꿔 자동화하는 걸 퀀트투자나 프로그램매매라고 부른다. 거창하게 들린다. 그런데 내가 한 건 "전고점 넘었나"라는 오래된 기준 하나를 봇이 대신 보게 만든 것뿐이다.
로그를 보니, 자리에 온 종목이 그날 몇 안 됐다
나는 그날 차단 사유 상위를 이렇게 봤다.
total_blocks=240150 no_h60 : 72877 ← 1위 cluster_block : 23205 daily_closed : 20371 chase_ban : 19389
no_h60 하나가 2위의 세 배가 넘는다. 내가 걸어둔 자리 기준 때문에, 프로그램은 감시하던 종목 대부분을 "아직 전고점 아래"라는 이유 하나로 돌려보내고 있었다. 그날 실제로 고점 위 자리에 올라온 종목은 몇 개 없었다는 뜻이다. 감시망에는 종목이 계속 들어왔지만, 내 기준으로 보면 대부분은 아직 살 자리가 아니었다.
나는 처음 이 숫자를 봤을 때 내가 너무 깐깐하게 걸어둔 건가 싶었다. 그런데 다시 보고 생각을 바꿨다. 봇은 종일 훑어서 대부분을 걸러내고 자리가 맞는 극소수만 남기고 있었다. 나는 원래 그러라고 이 기준을 넣은 것이었다.
자리 말고도 허들은 여러 겹이었다
로그를 더 내려보니 자리(no_h60) 말고도 내가 종목을 돌려보내게 해둔 이유가 줄줄이 있었다. 그날 이미 한 번 정리한 종목은 다시 안 사게 했다(daily_closed). 이미 튀어 올라버린 걸 뒤늦게 쫓지 않게 했다(chase_ban). 거래가 너무 얇아서 못 빠져나올 것 같은 종목도 거르게 해뒀다(low_liquidity). 장 초반이나 마감 뒤처럼 안 사기로 정한 시간대도 넣어뒀다.
봇은 이 허들을 다 넘긴 종목만 산다. 내가 그렇게 겹겹이 걸어놨으니, 프로그램은 하루 24만 번을 막고도 실제로는 극소수만 샀다. 나는 매수 조건이라는 게 결국 "사도 되는 이유"를 찾는 게 아니라, "사면 안 되는 자리를 다 걸러내는 것"에 가깝다고 본다.
60이라는 숫자를 정하기까지
나는 코딩 초보다. AI가 다 해준다고 하지만, 정작 이 60일 고점을 어떻게 구해오냐가 문제였다. 나는 프로그램이 종목마다 일봉 데이터를 불러와서 최근 60개를 훑어 최고가를 뽑게 만들었다. 그런데 감시 종목이 수십 개다 보니 봇은 이 데이터를 계속 받아와야 했다. 데이터가 제때 안 들어온 종목은 고점을 계산할 수가 없었다. 그런 종목은 그대로 no_h60로 빠졌다. 그러니까 저 7만 번 중 일부는 "고점을 못 넘어서"가 아니라 "아직 데이터를 못 받아서"이기도 했다. 나는 이 얘기를 뒤에서 따로 풀 생각이다.
나는 기준을 20일로 할지 60일로 할지 120일로 할지도 한참 고민했다. 기간이 너무 짧으면 잠깐 튄 고점에 속는다. 너무 길면 이미 다 오른 뒤에 들어간다. 나는 이게 뭐라고 며칠을 재봤는지 모르겠다. 결국 나는 최근 흐름은 보되 하루이틀 노이즈엔 안 흔들리는 60일로 정했다. 요즘 AI 주식투자라는 말이 흔하다. 그런데 만들어보니 그런 거창한 AI가 아니라 숫자 하나하나 손으로 정해 넣은 규칙 기반 봇에 가깝다.
자리를 본다는 게 돌파를 산다는 뜻은 아니다
나는 봇이 사기 전에 세 가지를 순서대로 보게 짜뒀다. 먼저 시장 국면을 보게 했고, 그다음 그 종목이 혼자가 아니라 여럿이 같이 강한지 보게 했고, 마지막으로 그 종목이 지금 자리에 왔는지, 최근 고점을 넘었는지 보게 했다. 이 셋이 다 맞아야 봇이 사도록 만든 것이다.
하나만 짚어두고 싶다. 자리를 본다는 게 "고점 돌파에서 산다"는 뜻은 아니다. 이건 어느 자리에 온 종목을 후보에 올릴지 정하는 허들이다. 그 종목에서 돌파에 올라탈지 눌림을 기다릴지는 그다음에 정하는 다른 얘기다. 그건 뒤에서 풀 생각이다.
이 글은 내가 직접 만든 프로그램의 개발 기록일 뿐, 특정 종목이나 매매 방식을 권하는 글이 아니다. 투자 판단과 그 결과는 각자의 몫이다.
댓글 쓰기