shud.log
바이브코딩 기록

촘촘한 체를 만들었더니 아무것도 안 걸렀다

2026-07-26온체인크립토공부기록삽질기록

이 글은 개인 기록이며 투자 조언이 아닙니다. 저는 라이선스 있는 투자 자문가가 아니고, 아래는 제가 제 돈과 시간을 두고 고민한 과정일 뿐입니다. 판단과 책임은 각자에게 있습니다.

체를 들고 있는데 코인이 전부 빠져나가는 도트 로봇

어제 나는 이런 결론을 냈다. 과거 데이터로는 운과 실력이 안 갈린다.

내가 만든 도구로 "이 판에서 돈 번 지갑"을 뽑았는데, 그중 하나를 다시 파보니 사고 안 파는 호구였다. 다섯 번 이긴 게 실력이 아니라 운일 수 있다는 걸 내 코드로 재현한 셈이다.

그래서 오늘은 그 다음을 만들기로 했다. 과거로 판단하지 말고, 미래로 채점하는 장치를 만들자.

페이퍼 트레이딩이 뭐냐면

돈을 안 넣고 하는 흉내내기다.

어떤 지갑을 지켜보다가, 그 지갑이 코인을 사면 "나도 산 셈 친다"고 장부에 적는다. 그 지갑이 팔면 "나도 판 셈 친다"고 적고 손익을 계산한다. 실제로는 한 푼도 안 움직였는데 성적표만 쌓인다.

왜 이게 필요하냐면, 실력을 검증하는 유일한 정직한 방법이기 때문이다. 과거 기록을 보면 이미 답을 알고 보는 거라 어떻게든 그럴듯한 이야기를 만들 수 있다. 미래는 그게 안 된다.

커닝을 못 하게 코드로 막았다

뒤로 문을 잠그고 앞으로 걸어가는 도트 로봇

여기서 제일 중요한 건 "미래만 본다"를 규칙이 아니라 구조로 만드는 것이었다.

지갑을 감시 목록에 넣는 순간, 그 시점의 블록 번호를 박아둔다. 그리고 그 블록 이전은 아예 조회하지 않는다. 마음만 먹으면 과거를 볼 수 있는 상태로 두면, 결국 나중에 "이 지갑 예전엔 잘했으니까" 같은 소리를 하게 된다. 아예 문을 잠갔다.

감시를 시작하기 전에 산 물량을 파는 경우도 손익에서 뺐다. 얼마에 샀는지 모르는 걸 벌었다 잃었다 말할 수 없으니까. 이건 어제 겪은 함정이기도 하다. 창밖에서 사서 창 안에서만 판 지갑이 "낸 돈 0원, 받은 돈 2 ETH"로 잡혀서 가짜 승자가 됐었다.

그리고 완결된 매매가 20건이 안 되면 성적이 좋든 나쁘든 "이 숫자로 판단하지 마세요"를 띄우게 했다. 도구가 나 대신 그 교훈을 기억하게 만든 것이다.

만드는 도중에 발견한 것들

여기까지가 계획이었고, 실제로는 만드는 내내 내가 틀린 걸 발견하는 시간이었다.

첫째, 배관을 사람으로 착각했다.

코인을 사고팔면 블록체인에 기록이 남는데, 이걸 읽어서 "누가 얼마에 몇 개 샀다"를 복원해야 한다. 처음엔 돈이 오간 흔적만 보고 역추정했다. 그랬더니 이런 값이 나왔다.

SELL AERO  1.576개 → 83 ETH

AERO 한 개가 천 원쯤 하는 코인인데, 1.5개를 팔아서 83 ETH를 받았다는 건 말이 안 된다. 원인은 라우터였다. 코인을 살 때 우리 돈은 여러 창구를 거쳐 가는데, 그 중간 창구를 거래 상대로 착각한 거다. 창구에는 남의 거래도 같이 지나가니까 엉뚱한 숫자끼리 짝지어졌다.

고치는 방법은 추정을 그만두는 거였다. 거래소 역할을 하는 계약이 직접 남기는 영수증(Swap 이벤트)을 읽으면 된다. 바꾸고 나서 같은 코인의 가격을 여러 건 뽑아 비교해봤다.

고치기 전: 같은 코인인데 가격 편차 46%
고친 후:   편차 0.00 ~ 0.06%

검증도 됐다. USDC 값이 1 ETH당 1,866개로 나왔는데, 마침 내 다른 봇이 보고 있던 이더 시세가 1,864달러였다. 서로 아무 상관 없는 두 출처가 맞아떨어졌으니 이 숫자는 진짜다.

둘째, 실패를 성공으로 착각하고 있었다.

블록체인 데이터를 무료 서버에서 읽는데, 얘가 가끔 "지금 바빠서 못 준다"고 거절한다. 내 코드는 그 거절을 조용히 무시하고 넘어갔다. 그리고 "여기까지 다 읽었음"이라고 기록했다.

읽지도 않은 구간이 읽은 걸로 기록되는 거다. 누적 기록을 쌓는 게 존재 이유인 도구에서 이건 치명적이다. 구멍이 생겼는데 구멍이 있다는 사실조차 안 남는다.

이 버그를 오늘 하루에만 세 군데에서 찾았다. 전부 내가 예전에 편하려고 써놓은 "에러 나면 그냥 넘어가"라는 한 줄 때문이었다. 지금은 실패하면 거기서 멈추고, 다음 실행이 그 지점부터 이어받는다. 그리고 몇 건을 못 읽었는지 화면에 찍는다.

셋째, 돈을 화폐가 아니라 물건으로 세고 있었다.

지갑이 트레이더인지 호구인지 가르는 지표로 청산율을 썼다. 산 코인 중 몇 개를 실제로 팔았나 하는 비율이다. 그런데 4.5배를 번 지갑이 57%로 걸리길래 들여다봤더니 이런 게 있었다.

WETH  받은 횟수 105  판 횟수 0  →  판정: 안 파는 호구

WETH는 이더리움을 코인처럼 다루기 위한 포장지다. 뭘 팔면 이게 들어온다. 즉 활발히 팔수록 WETH가 쌓인다. 그런데 내 코드는 "안 파는 코인"으로 세서 청산율을 깎고 있었다. 트레이더일수록 호구로 찍히는 구조였다.

700배 번 지갑의 정체

가짜 얼굴을 벗기는 도트 로봇

가장 재밌었던 건 이거다.

CLANKER라는 코인에서 후보를 뽑았더니 이런 지갑이 1등으로 올라왔다.

낸 돈    0.0004 ETH
받은 돈  0.2957 ETH

700배다. 순간 "드디어 고수를 찾았나" 싶었는데, 다음 단계에서 이 지갑의 다른 거래 이력을 보려니 아무것도 안 나왔다. 코인을 700배로 불린 지갑이 코인을 만져본 적이 없다는 게 말이 되나.

확인해보니 정말로 없었다. 이 주소는 거래를 명령만 했고, 코인은 별도의 프로그램이 대신 들고 있었다. 사람이 아니라 봇이다. 그것도 새 코인이 나오자마자 남보다 빨리 낚아채는 종류다. 700배는 트레이딩 실력이 아니라 속도 싸움의 결과였고, 애초에 내가 따라 할 수 있는 상대가 아니다.

이건 판별 규칙으로 만들어뒀다. 거래는 일으켰는데 그 코인을 직접 받은 적이 없으면 봇이다. 실제로 걸러지는지 확인해보니, 봇 두 개는 탈락시키고 진짜 트레이더는 통과시켰다.

그래서 결과는 0명

두 코인에 돌렸다.

BRETT    거래한 지갑 106명 → 관문 통과 3명 → 최종 0명
CLANKER  거래한 지갑  47명 → 관문 통과 5명 → 최종 0명

CLANKER 통과자 5명 중 4명이 방금 그 봇들이었다. BRETT 3명은 청산율이 각각 57%, 43%, 29%로 내가 정한 기준 60%에 못 미쳤다.

특히 57%짜리가 계속 걸렸다. 3%포인트 차이였고, 이 지갑은 BRETT에서 4.5배를 벌었으니까. 혹시 내 계산이 틀렸나 싶어서 두 번 더 파봤다. 에어드랍으로 받은 잡코인을 빼봤다. 43개 중 4개뿐이었고 빼도 59%였다. 실제로 거래한 코인만 봐도 57%였다.

어떻게 잘라도 60%를 안 넘었다. 체가 옳았던 거다. 4.5배는 습관이 아니라 한 방이었다.

여기서 막혔다

문제는 그래서 뭘 해야 하냐는 거다.

후보가 계속 0명인 게 두 가지 중 어느 쪽인지 알 수가 없었다. 내가 만든 체가 너무 촘촘한 걸까, 아니면 이 판에 원래 따라 할 만한 사람이 없는 걸까. 전자면 기준을 고쳐야 하고 후자면 다른 데를 파야 한다. 정반대의 행동이다.

기준을 60%에서 55%로 낮추면 4.5배 지갑이 들어온다. 근데 그건 특정 한 명을 넣으려고 자를 바꾸는 거다. 그러면 안 된다는 건 알겠는데, 그럼 뭘 해야 하는지는 모르겠더라.

그래서 AI 여러 대한테 토론시키는 도구에 물었다. 지금까지 나온 숫자를 다 넣고, 세 가지를 물었다. 뭘 먼저 할까. 체가 빡센 건지 판이 빈 건지 어떻게 구분하나. 이 프로젝트를 접어야 할 조건은 뭘로 잡아야 하나.

같은 판정을 두 번 하고 있었다

똑같은 서류에 도장을 두 번 찍는 두 로봇 판사

돌아온 답이 아팠다.

내 관문은 네 개였다. 왕복으로 사고팔았나. 실제로 벌었나. 봇은 아닌가. 그리고 청산율이 60% 넘나.

앞의 세 개는 데이터가 쓸 만한지를 보는 것이다. 사기만 하고 안 판 지갑은 손익을 계산할 수가 없고, 봇은 애초에 따라 할 수 없는 상대다. 이건 걸러야 맞다.

그런데 네 번째는 성격이 다르다. 청산율로 거른다는 건 "이 지갑이 앞으로 잘할 것"이라는 예측이다. 그리고 그 예측은 내가 오늘 만든 페이퍼 트레이딩이 하는 일이다. 미래로 채점하겠다고 장치를 만들어놓고, 그 앞에 과거 기준 예측 관문을 세워둔 것이다.

같은 일을 두 번 하니까 통과할 게 남지 않았다. 후보 0명은 판이 비어서가 아니라 내가 문을 두 번 잠가서였다.

처방은 네 번째 관문을 없애는 것이었다. 없애되 버리지는 않고, 청산율을 기록 컬럼으로 옮긴다. 통과 여부는 앞의 세 개로만 정하고, 청산율은 숫자로 저장만 해둔다. 그리고 90일 뒤에 그 값과 실제 성적의 관계를 본다.

그러면 60%라는 자의적인 숫자가 데이터로 뒷받침된 기준이 되거나, 아니면 아무 의미 없는 숫자였다는 게 밝혀진다. 어느 쪽이든 지금보다 낫다.

일부러 못하는 애들도 넣었다

또 하나 지적받은 게 대조군이었다.

잘할 것 같은 지갑만 모아놓고 지켜보면, 나중에 성적이 어떻게 나오든 그게 내 기준 덕분인지 알 수가 없다. 비교할 대상이 없으니까. 그래서 관문에서 떨어진 지갑도 일부러 다섯 개 넣었다. 사기만 하고 안 파는 쪽이다.

석 달 뒤에 이 다섯이 통과자들만큼 벌었다면, 내 관문은 아무 일도 안 한 것이다. 그것도 알아야 할 결과다.

이 다섯 중 하나가 어제 3편에서 "승자"라고 뽑았다가 프로파일 까보니 호구였던 그 지갑이다. 대조군으로 다시 만나니 기분이 묘하다.

접을 조건을 먼저 적었다

마지막 답이 제일 중요했다. 중단 조건을 결과 보기 전에 정하라는 것이었다.

나는 이 프로젝트를 "PnL이 0이어도 스킬과 글이 남으면 성공"이라는 틀로 시작했다. 좋은 틀이지만 위험도 있다. 뭘 해도 사후에 "그래도 배운 게 있다"고 말할 수 있으니까. 그건 매몰비용에 빠지는 지름길이다.

그래서 검증할 내용을 반증 가능한 한 문장으로 바꿨다.

청산율이 미래 수익을 예측한다.

이게 틀렸다고 밝혀지는 것도 성공이다. 그리고 세 가지 중단 조건을 날짜까지 박아서 적어뒀다. 9월 20일까지 표본 20건을 못 모으면 깔때기가 고장난 것이니 중단한다. 표본이 모였는데 청산율과 성적 사이에 관계가 없고 대조군과 구분도 안 되면 지표가 무효인 것이니 실제 돈은 넣지 않고 중단한다. 추적한 지갑들이 그냥 이더 들고 있는 것보다 못 벌었으면 따라 할 이유가 없으니 중단한다.

이 문서는 숫자를 보기 전에 썼다는 게 유일한 존재 이유다. 나중에 결과를 보고 기준을 고치면 무효다.

지금 상태

감시 목록에 아홉 개가 들어갔다. 후보 넷과 대조군 다섯이다. 집에 있는 맥미니가 매일 아침 9시 10분과 밤 9시 10분에 이들의 새 거래를 읽어서 장부에 적는다. 나는 아무것도 안 해도 된다.

청산율은 0%, 29%, 43%, 57%로 흩어져 있다. 오늘 아침 기준이었으면 넷 다 탈락이었을 것이다.

그리고 글을 쓰는 도중에 하나 더 알게 됐다. 같은 지갑을 조금 다른 구간에서 다시 재보니 청산율이 이렇게 달라졌다.

지갑 A   57%  →  68%
지갑 B   43%  →  14%
지갑 C   29%  →  25%

B는 43%가 14%가 됐다. 어디서부터 어디까지 보느냐에 따라 이렇게 흔들리는 값이다. 이런 걸 합격 커트라인으로 쓰고 있었던 것이다. 오늘 아침이었다면 68%짜리를 통과시켰다가 다음 실행에서는 떨어뜨렸을 것이다.

관문에서 빼길 잘했다.

오늘 남은 것

돈은 여전히 한 푼도 안 넣었다. 실제 매수는 표본 20건이 쌓이고 지표에 의미가 있다고 확인된 다음이다.

대신 도구가 다섯 개 늘었고, 내가 틀렸던 지점을 다섯 개 찾았다. 배관을 사람으로 착각한 것, 실패를 성공으로 기록한 것, 화폐를 물건으로 센 것, 봇을 고수로 본 것, 그리고 같은 판정을 두 번 한 것.

시작할 때 세운 목적이 "돈을 버는 게 아니라 내 읽는 눈이 진짜인지 검증하는 것"이었는데, 오늘은 그 눈이 다섯 번 틀렸다는 걸 확인한 날이다. 목적에는 맞게 굴러가고 있는 것 같다.

석 달 뒤에 결과를 쓰겠다. 잘 됐든 안 됐든.

이어서 읽기
← 목록으로