주식 자동매매 프로그램 만들기 - 나홀로 급등 종목을 뺀 이유 <매수전략②>

 

새벽 사무실의 듀얼 모니터에 자동매매 프로그램 로그가 흐르는 화면

내가 매매를 시작한 지 얼마 안 된 초반 시절 얘기다. 이런 종목은 지금도 흔하지만, 그 당시 나는 가끔 혼자만 슈팅이 나오는 종목이 보이면 마음이 흔들렸다. 횡보장에서 딱히 이유도 없는데 혼자 강하게 뻗어가는 애들이 있었다. 찾아봐도 오르는 이유를 알 수가 없었다. 무슨 테마로 묶인 것도 아니고, 같이 움직이는 종목도 없었다. 이유야 어딘가 있었겠지만, 적어도 내 눈엔 안 보였다.

그런데 재밌게도, 그 시절엔 그런 종목을 보면 가슴이 뛰었다. 뭔가 남들 모르는 좋은 호재가 있나 보다 하고, 그냥 올라탔다. 그런 종목이 항상 밀렸다고는 못 한다. 근데 확률로 보면, 나한테 손실을 많이 준 게 이런 종목이었다. 그리고 손실보다 더 곤란한 게 있었다. 오르는 이유를 모르니, 정작 밀릴 때 내가 어떻게 대응해야 할지가 모호했다. 이유를 알고 샀으면 그 이유가 깨질 때 팔면 되는데, 이유를 모르고 오른 종목은 밀려도 이게 눌림인지 끝인지 판단할 근거가 없었다. 버틸지 자를지, 뭘 보고 정해야 할지 기준이 안 섰다.

목차

문제는 이런 종목이 지금도 숱하게 나온다는 거다. 그런데 나는 이걸 손으로 대응할 방법이 마땅치 않았다. "이건 혼자 강한 거니까 거르자"를 매번 눈으로 판단하기가 어려웠다. 어떤 지표로 표시해둘 수도 없었다. 그래서 이건 사람이 아니라 기계가 세는 게 낫겠다고 생각했다. 내 자동매매 프로그램에 "혼자 강한 건 거른다"는 조건을 넣은 건 그래서였다.

7편에서 말한 시장 국면 판정을 통과해도, 그 아래에서 이 조건이 또 잡는다. "이 강함이 혼자냐, 여럿이 같이냐"를 보는 조건이다.

혼자 강한 건 왜 걸러야 했나

혼자 튀는 종목이 위험한 건, 오를 때가 아니라 밀릴 때다. 살 때는 강하니까 좋아 보인다. 문제는 그게 꺾이기 시작할 때, 내가 아무 대응도 못 한다는 거였다. 오른 이유를 모르고 샀으니, 빠질 때도 이게 잠깐 눌리는 건지 그냥 끝난 건지 판단할 근거가 없었다.

반대로 여러 종목이 같이 강할 때는 달랐다. 어떤 흐름이 살아나면, 그 안에서 하나둘이 아니라 여럿이 같이 움직였다. 대장이 뛰면 2등도 3등도 따라 올랐다. 이럴 때는 하나가 흔들려도 흐름 전체를 보고 판단할 수 있었다. 같이 가던 종목들이 다 죽으면 흐름이 꺾인 거고, 하나만 흔들리는 거면 눌림일 가능성이 컸다. 판단할 기준이 생기는 것이다. 나는 이 차이를 오래 데이고 나서야 알았다. 하나만 강한 건 대응할 근거가 없고, 여럿이 같이 강한 건 근거가 생긴다는 것.

그래서 봇에 "같이 강할 때만" 조건을 걸었다

이 판단을 프로그램에 넣은 게 이 로그다.

🔥 [CLUSTER_STATUS] window=240s unique_symbols=0 heat=0 need=2 regime=BEAR

여기서 heat가 핵심이다. 봇은 최근 일정 시간(window=240s, 약 4분) 안에 같이 강해진 종목이 몇 개인지를 센다. 그게 heat다. need는 최소 몇 개는 같이 강해야 매수를 여는지 정해둔 값이다. 위 로그는 heat=0, need=2인 상태다. 지금 막 강한 종목이 하나도 없거나, 있어도 혼자라서 need를 못 채운 것이다. 이러면 아무리 좋아 보여도 안 산다.

혼자 강한 종목 하나는 heat를 1밖에 못 올린다. need가 2라면, 그 종목 말고 다른 종목도 비슷한 시간대에 같이 강해져야 비로소 문이 열린다. 내가 손으로 못 참고 올라타던 그 "혼자 강한 놈"을, 봇은 이 숫자 하나로 걸러낸다. 사람이 매번 눈으로 못 하던 걸, 기계는 4분 안에 몇 개가 같이 강한지 세는 걸로 대신한다.

하락장이면 이 조건마저 더 빡세진다

여기서 7편과 이어진다. 7편에서 시장이 약세장으로 판정되면 매수 조건이 조여진다고 했는데, 그중 하나가 바로 이 need였다.

✅ BEAR min_cluster_heat=2

평소보다 하락장에선 이 문턱이 올라간다. 강세장이라면 몇 개만 같이 강해도 흐름으로 볼 수 있지만, 약세장에선 그 정도로는 안 된다. 시장 전체가 약한데 몇 종목 반짝하는 건 진짜 흐름일 가능성이 낮으니까. 그래서 하락장에선 "더 여럿이, 더 확실하게 같이 강할 때"만 산다. 시장 국면 판정과 이 조건이 겹쳐서, 약한 장에서 혼자 튀는 종목은 이중으로 막힌다.

실제로 어느 날 하루치 차단 기록을 열어봤더니, 이 "같이 강하지 않아서 막음"이 그날 가장 많이 걸린 사유 중 하나였다. 수만 번을 막고 있었다. 후보는 계속 들어오는데, 대부분 혼자 강한 것들이라 번번이 여기서 걸린 것이다.

정작 "같이 강하다"를 세는 건 만들기 어려웠다

관점은 분명했는데, 이걸 코드로 옮기는 건 또 달랐다. "여럿이 같이 강하다"를 사람은 눈으로 그냥 아는데, 기계한테는 그 "같이"를 정의해줘야 했다. 몇 분 안에 강해져야 "같이"인가. 몇 개부터 "여럿"인가. 나는 window를 몇 초로 잡을지, need를 몇으로 둘지 한참 만졌다.

문제가 하나 더 있었다. 이 조건에 걸려 막히는 종목이 워낙 많다 보니, 차단 기록이 폭발했다. 봇이 매 순간 수많은 종목을 "얘는 혼자라 안 돼" 하고 돌려보내면서, 그때마다 그 아래 계산까지 다 하고 있었던 것이다. 그래서 아예 같이 강한 게 부족하면 그 밑의 계산은 건너뛰도록 고쳤다. 어차피 살 수 없는 종목을 붙잡고 힘 빼지 않게.

혼자 강한 건 도박, 여럿이 강한 건 흐름

결국 이 조건은 내 오랜 습관 하나를 겨냥한 것이다. 이유도 모르면서 혼자 불기둥 세우는 종목에 홀려 올라타던 습관. 그건 흐름을 타는 게 아니라, 대응할 근거도 없이 뛰어드는 도박에 가까웠다.

무엇을 사느냐를 따지기 전에, 그 강함이 혼자인지 여럿인지부터 본다. 시장 국면이 "지금이 살 장이냐"를 봤다면, 이 조건은 "이 강함에 올라탈 근거가 있느냐"를 본다. 두 겹을 다 통과해야 그날의 진짜 기회만 남는다. 혼자 강한 걸 걸러내고 나면 살 게 확 줄지만, 돌아보면 그렇게 걸러진 것들 대부분이 안 사길 잘한 것들이었다.

혹시 혼자 튀는 종목에 자꾸 데인다면, 그 종목 하나만 볼 게 아니라 비슷한 종목들이 같이 움직이는지를 함께 보는 걸 생각해봐도 좋을 듯하다. 하나만 강한 날과, 여럿이 같이 강한 날은 대응할 수 있느냐부터 다르다.

시장도 통과, 흐름도 통과. 그런데 아직 남았다

시장 국면을 통과하고, 여럿이 같이 강한 것까지 확인해도, 봇은 아직 안 산다. 그 아래에 조건이 하나 더 남아 있다. 그날 그렇게 많이 막던 차단 사유 중, 사실 이 "같이 강함"보다 더 많이 막은 게 따로 있었다. 그 이야기는 다음 글에서 하려 한다.

이 글은 내가 직접 만든 프로그램의 개발 기록일 뿐, 특정 종목이나 매매 방식을 권하는 글이 아니다. 투자 판단과 그 결과는 각자의 몫이다.

Post a Comment

다음 이전