지난 글에서 나는 봇으로 사는 얘기를 했다. 이번엔 봇으로 파는 얘기다. 그리고 나는 파는 게 사는 것보다 만드는 게 훨씬 어려웠다.
사는 건 그래도 단순하다. 조건이 맞으면 사면 된다. 그런데 파는 건 봇이 지금 뭘, 얼마나 들고 있는지를 매 순간 정확히 알고 있어야 한다. 그게 하나라도 어긋나면, 팔아야 할 걸 안 팔거나 이미 판 걸 또 들고 있다고 착각한다. 이번 글은 그 착각 때문에 며칠을 날린 이야기다.
목차
목표가로 팔다, 트레일링으로 바꿨다
처음엔 파는 방식을 단순하게 잡았다. 목표가다. 얼마까지 오르면 판다, 코드를 이렇게 정해두는 거다. 만들기도 쉽고 말도 깔끔했다.
그런데 돌려보니 이게 답답했다. 직접 매매할 때와 달리 코드로 딱 정해놓으니, 목표가를 낮게 잡으면 조금 오르고 팔려서 그 뒤에 더 가는 걸 놓쳤고, 높게 잡으면 거기 못 닿고 도로 내려와서 놓쳤다. 오르는 종목을 정해둔 한 지점에서 딱 자르는 게, 생각보다 손해가 컸다.
그래서 트레일링 방식으로 AI를 이용해서 코드를 바꿨다. 오르는 만큼 파는 기준선을 같이 올려두고, 그러다 그 선이 꺾여 내려오면 파는 방식이다. 오를 땐 따라 올라가고, 꺾이면 그때 나온다. 이걸로 바꾸고 나서야 오르는 흐름을 조금이라도 더 태울 수 있었다. 여기까진 좋았다.
봇이 자기 손에 뭘 든지 몰랐다
진짜 문제는 파는 방식이 아니라 다른 데 있었다. 봇이 자기가 지금 뭘 들고 있는지를 제대로 몰랐다.
주문이 체결되면 증권사에서 "이만큼 체결됐다"는 신호가 봇으로 돌아온다. 그런데 이 신호를 받아도, 봇이 이게 산 건지 판 건지를 못 알아보는 경우가 있었다. 로그에는 이렇게 찍혔다.
📩 [체결] side=UNKNOWN 체결량=4 보유수량=0 📩 [체결] side=UNKNOWN 체결량=0 보유수량=4
저 side=UNKNOWN이 문제였다. 산 것도 판 것도 아닌, 봇이 방향을 모르는 상태다. 봇은 체결이 왔다는 건 아는데 이게 매수인지 매도인지를 못 정하니, 자기 보유 수량을 제대로 못 세었다. 분명히 들고 있는데 안 들고 있다고 여기거나, 그 반대이거나.
익절하고 남은 걸 며칠씩 들고 있었다
이게 제일 크게 터진 곳이 매도였다. 나는 한 번에 다 안 팔고 나눠 파는데, 일부를 먼저 익절하고 나면 나머지 물량이 남는다. 그런데 봇이 자기 보유를 제대로 못 세니, 그 남은 물량을 팔아야 하는지조차 몰랐다.
그래서 봇은 남은 걸 안 팔고 그냥 들고 있었다. 하루가 아니라 며칠씩. 파는 조건이 왔는데도, 봇은 자기가 그걸 들고 있다는 자각이 없으니 매도 자체를 시도하지 않았다. 게다가 그 자리를 계속 차지하고 있으니, 새 종목을 사려 해도 자리가 없다고 막혔다. 판 줄 알았던 게 실은 안 팔린 채 슬롯 하나를 죽은 듯이 붙들고 있던 것이다.
처음엔 이걸 몰랐다. 계좌를 열어보고 나서야 "이게 왜 아직도 여기 있지?" 했다. 봇은 아무 불평도 없었다. 에러도 안 났다. 그냥 조용히 안 팔고 있었을 뿐이다.
어떻게 고쳤나
두 가지를 손봤다. 먼저 체결 신호가 방향을 모르는 채(UNKNOWN) 들어와도, 봇이 보유 수량 변화를 보고 이게 산 건지 판 건지를 되짚어 채우게 했다. 방향을 못 받았으면 최소한 수량으로 역산하게 만든 것이다.
그리고 남은 물량에 확실한 매도 트리거를 붙였다. 일부 익절 뒤에 남은 게 있으면, 그걸 트레일링이든 손절이든 어떤 형태로든 반드시 정리하도록 못을 박았다. 어중간하게 남아서 봇이 잊어버리는 물량이 없게 한 것이다.
매도 로직을 만드는 사람에게
혹시 매도까지 코드로 만드는 사람이 있다면 하나 말해두고 싶다. 매수는 "조건이 맞으면 산다"로 끝이지만, 매도는 "지금 내가 뭘 얼마나 들고 있나"를 봇이 항상 정확히 알아야 성립한다. 이 상태 관리가 어긋나면, 파는 로직이 아무리 완벽해도 소용없다. 팔 물건이 있는 줄을 모르니까.
그래서 나는 매도를 만들 때, 파는 조건보다 먼저 "봇이 지금 보유를 제대로 알고 있는가"를 로그로 확인하라고 말하고 싶다. 체결이 올 때마다 봇이 세는 보유 수량과 실제 계좌 잔고가 같은지. 이게 맞지 않으면, 그 위에 올린 매도 로직은 전부 모래 위에 지은 것이다. 나는 이걸 며칠 물량을 방치하고 나서야 배웠다.
여기까지가 파는 이야기의 절반이다. 남은 절반은 손절이다. 트레일링이 꺾여서 파는 것과, 아예 자리가 깨져서 자르는 것은 또 다른 문제였다. 그 이야기는 다음 글에서 하려 한다.
이 글은 내가 직접 만든 프로그램의 개발 기록일 뿐, 특정 종목이나 매매 방식을 권하는 글이 아니다. 투자 판단과 그 결과는 각자의 몫이다.
댓글 쓰기