내 계좌에 이런 로그가 하나 찍혀 있다.
🧯 [구조손절] 115180 cur=42250 <= h60_stop=42273
봇이 한 종목을 스스로 잘라낸 기록이다. 현재가가 42,250까지 내려오자, 42,273이라는 선 밑으로 떨어졌다고 판단하고 팔아버렸다. 딱 23원 차이였다. 사람이었으면 "23원인데 좀 더 보지" 했을 그 자리에서, 봇은 군말 없이 잘랐다. 이 주식 손절 선을, 나는 처음엔 그냥 몇 퍼센트로 잡았다가 결국 자리 기준으로 바꿨다.
나는 이 23원짜리 손절선을 어디서 가져왔을까. 사실 이건 새로 만든 게 아니라, 내가 직접 매매할 때 원래 쓰던 방식이었다. 문제는 그걸 코드로 옮기는 게 지독하게 어려웠다는 거다.
목차
직접 매매할 땐 자리마다 손절을 다르게 잡았다
내가 직접 매매할 때 손절을 한 가지로 긋지 않았다. 그 종목이 얼마나 올라온 놈인지, 어떻게 올라왔는지를 봤다. 완만하게 계단 밟고 올라온 놈은 손절도 여유 있게 잡았고, 한 번에 훅 솟구친 놈은 조금만 밀려도 끝이라 손절을 바짝 붙였다. 얕게 눌렀다 가는 놈이랑 깊게 팠다 가는 놈이 다르니까, 손절 깊이도 그때그때 달랐다.
말로 하면 이렇게 간단한데, 다들 그렇겠지만 직접 매매하면 본인 스타일대로 차트를 보면 대충 "여기다" 싶은 자리가 있다. 근거를 다 말로 풀긴 어려워도, 자리마다 손절이 달라야 한다는 것만은 분명했다.
코드로 옮기려니, 그 감각이 안 넘어갔다
문제는 이걸 AI한테 설명하고 코드로 만들자니 막막했다는 거다.
"오름폭 대비 파동 깊이를 보고 손절을 다르게 잡아라." 이걸 내가 어떻게 코드로 적어주나. 나는 코딩을 모르고, 그 판단은 눈으로 차트 보고 감으로 하던 거였다. AI한테 시켜서 봇을 만드는 나로선, 말로 설명도 안 되는 감각을 넘겨줄 재간이 없었다.
그래서 일단 제일 쉬운 걸로 때웠다. 퍼센트 손절. 산 가격에서 몇 프로 빠지면 판다. -3%면 판다. 감각이고 뭐고 없이, 그냥 숫자 하나로 일괄로 그었다. 임시방편인 걸 알면서도, 일단 돌아가게는 해야 하니까.
역시 %는 별로였다
돌려보니 예상대로였다. 이게 계속 애매했다.
어떤 종목은 -3%가 하루에도 몇 번씩 왔다 갔다 하는데, 거기서 잘리면 멀쩡한 걸 던진 거였다. 반대로 어떤 종목은 -3%까지 오는 동안 이미 자리가 다 무너져 있었다. 같은 -3%인데 어떤 건 너무 빨랐고 어떤 건 너무 늦었다. 내가 직접 매매할 때 굳이 자리마다 손절을 다르게 잡던 이유가, 딱 이거 때문이었는데. 그걸 퍼센트가 다 뭉개버린 거다.
결국 나는 임시방편을 걷어내고, 원래 하던 방식으로 돌아가기로 했다. 감으로 하던 걸 그대로는 못 옮기더라도, 그 핵심만이라도 코드로 옮겨보자고.
그래서 "자리가 깨졌냐"로 바꿨다
내가 하던 걸 뜯어보니, 결국 핵심은 하나였다. 얼마가 빠졌냐가 아니라, 살 이유가 아직 살아 있냐를 본다는 것.
나는 아무 데서나 사는 게 아니었다. 어떤 자리를 넘어설 때 샀다. 그 자리를 넘으니까 강하다고 본 거고, 그래서 올라탄 거다. 그러면 손절도 거기서 나와야 맞았다. 넘었던 그 자리 밑으로 다시 내려오면, 애초에 살 이유가 사라진 거니까.
이거라면 코드로 옮길 수 있었다. 파동이 어떻고 깊이가 어떻고 하는 감각 전부는 아니어도, "네가 넘어서 산 자리, 그 밑으로 내려오면 자른다"는 한 문장은 봇도 알아들을 수 있는 규칙이었다. 퍼센트처럼 내 매수가에서 몇 프로냐를 보는 게 아니라, 종목이 실제로 만들어둔 선을 본다. 내가 얼마에 샀든 상관없이, 그 선이 깨지면 흐름이 꺾인 거다.
그 손절선을, 살 때 봤던 60일 고점에서 가져왔다
여기서 앞 글이랑 이어진다.
매수를 다룰 때, 봇은 종목을 받으면 자리부터 봤다. 60일 고점이 어디인지, 지금이 그 자리를 넘는 자리인지. 데이터가 없어서 그 고점을 못 구하면 아예 안 샀다. 매수를 막던 그 60일 고점 말이다.
그 선을, 이번엔 손절선으로 다시 썼다. 살 때 "이 자리를 넘어야 산다"고 봤으면, 팔 때는 "이 자리 밑으로 내려오면 자른다"가 되는 거다. 하나의 선이 살 때는 진입 근거였다가, 산 다음엔 버티는 바닥이 된다. 위 로그의 h60_stop이 그거다. 60일 고점 자리에서 가져온 손절선.
직접 할 때만큼 종목마다 섬세하게 다르진 못해도, 최소한 -3% 일괄보다는 훨씬 나았다. 자리 자체가 종목마다 다른 높이에 있으니까, 손절선도 자연히 종목마다 달라졌다. 내가 감으로 하던 "자리마다 다르게"가, 어설프게나마 코드 안에서 살아난 거다.
그런데 손절이 한 번에 안 끝났다
관점은 정리됐는데, 코드는 또 딴 데서 터졌다.
로그를 다시 열어보니, 같은 종목 손절이 한 번이 아니었다.
🧯 [구조손절] 115180 cur=42250 <= h60_stop=42273 🧯 [구조손절] 115180 cur=42250 <= h60_stop=42273 🧯 [구조손절] 115180 cur=42250 <= h60_stop=42273
13시 54분에 두 번, 또 14시 6분에 한 번. 자를 종목은 하나인데 손절 신호가 계속 다시 튀었다. 처음엔 봇이 미쳤나 했다.
이건 앞서 매도편에서 데었던 그 문제랑 뿌리가 같았다. 봇이 자기 손에 물량이 얼마 남았는지를 제대로 몰랐던 거다. 한 번에 다 못 털고 일부가 남으면, 봇은 그걸 여전히 "손절해야 할 포지션"으로 보고 또 신호를 냈다. 자를 결정은 맞았는데, 다 자르질 못하고 있었다.
다른 종목에선 아예 손절 주문이 튕기기도 했다.
🧯 [구조손절] 089030 cur=69000 <= h60_stop=70785 ❌ [매도실패:STRUCT_STOP] 089030 ret=-301
자르라고 신호는 나갔는데 주문 자체가 실패로 돌아온 거다. 결국 다시 시도해서 털긴 했지만, 그날 나는 손절이라는 게 "자를지 말지 정하는 것"만이 아니라 "정한 걸 끝까지 실행되게 만드는 것"까지라는 걸 알았다. 판단은 반이었고, 나머지 반은 그 판단이 진짜 계좌에 반영되는지였다.
손절을 코드로 만드는 사람에게
혹시 손절을 봇에 넣으려는 사람이 있다면, 두 가지만 말해두고 싶다.
하나. 직접 매매할 때 하던 손절 감각을 통째로 코드로 옮기려다 나처럼 막히면, 그 감각의 핵심 한 줄만 뽑아봐라. 나는 파동이니 깊이니 다 못 옮겼지만, "산 이유가 깨지는 자리에서 자른다"는 한 줄은 옮길 수 있었다. 넘어서 산 자리면 그 자리 밑, 눌림에서 산 거면 그 눌림 바닥. 매수 근거가 명확하면 손절선은 저절로 따라 나온다. 근거 없이 산 거라면, 사실 손절선도 그을 수가 없다.
둘. 손절 신호가 뜬 걸로 안심하지 마라. 신호가 나가는 것과 물량이 다 털리는 건 다른 일이다. 나처럼 남은 수량 때문에 같은 손절이 계속 재발화하거나, 주문이 튕겨서 안 잘리는 날이 온다. 손절 로직을 넣었으면, 진짜로 보유수량이 0이 됐는지를 로그로 눈으로 확인해라. AI가 짜준 코드가 "손절 완료"라고 찍는다고 다 팔린 게 아니다.
자를 줄 알아야 다음이 있다
돌아보면 웃긴 게, 나는 직접 매매할 땐 손절을 그렇게 섬세하게 하면서 봇한텐 처음에 -3% 하나로 퉁쳤다. 코드로 옮기기 귀찮으니까 내 방식을 스스로 버렸던 거다. 봇한테 손을 넘긴 이유가 감정 빼고 원칙대로 하려던 건데, 정작 내 원칙부터 대충 넘겼으니 앞뒤가 안 맞았다.
결국 돌아온 자리가, 원래 내가 쓰던 그 방식이었다. 언제 사느냐를 그렇게 오래 고민했으면서, 언제 자르느냐는 늘 뒤로 미뤄뒀던 습관도 그제야 조금 고쳐졌다. 봇이 23원 차이에서 눈 하나 깜짝 안 하고 잘라주는 걸 보면서, 나는 내가 원래 알던 걸 다시 배웠다.
그런데 이 자리 손절도, 애초에 그 자리 데이터를 봇이 제대로 받아왔을 때 얘기다. 어떤 날은 그 60일 고점을 구하는 조회 자체가 먹통이었다. 그 얘기는 다음에.
이 글은 내가 직접 만든 프로그램의 개발 기록일 뿐, 특정 종목이나 매매 방식을 권하는 글이 아니다. 투자 판단과 그 결과는 각자의 몫이다.
댓글 쓰기