왜 여러 개를 만들었나

단일 파일 시대의 답답함은 코드 구조 문제만이 아니었습니다. 더 근본적인 의심이 있었어요. 지금 이 전략이 맞긴 한 건가?

돌파를 노리는 전략 하나를 계속 고치고 있었는데, 파라미터를 아무리 만져도 결과가 크게 안 달라졌습니다. 그러면 문제가 파라미터가 아니라 전략일 수 있잖아요. 그걸 확인하려면 다른 전략을 옆에 놓고 비교해야 했습니다.

같은 증상, 두 가지 해석
  증상: 값을 어느 쪽으로 바꿔도 결과가 비슷하다
  --------------------------------------------------
  해석 A  아직 최적값을 못 찾았다
          → 더 촘촘히 탐색한다
  해석 B  이 전략의 한계가 여기다
          → 다른 전략과 비교해야 안다
  --------------------------------------------------
  A 로만 몇 주를 보냈다. B 를 시험할 방법이 없었기 때문이다
  → 그래서 비교 대상을 직접 만들기로 했다

혼자 만드는 봇의 한계가 여기 있습니다. 비교 대상이 없어요. 성적이 나쁠 때 그게 전략 탓인지, 파라미터 탓인지, 그냥 장이 안 좋았던 건지 구분이 안 됩니다. 같은 기간 다른 전략을 돌려본 적이 없으니까요.

그래서 갈래를 나눴습니다.

동시에 굴린 갈래들
  HY   하이브리드 (36개)     스윙 + 단타 혼합
       느린 흐름과 빠른 매매를 한 봇 안에서 같이 돌린다
  BASE  Bottom Area Support Entry (11개)
       바닥권 지지 구간에서 산다 — 지금 전략의 직계 조상
  MACRO  (56개)
       개별 종목이 아니라 시장 전체 흐름을 먼저 본다
  빗썸 분기 (3개)
       같은 로직을 다른 거래소에서 — 거래소 차이 확인용

버전 개수가 흥미롭습니다. MACRO가 56개로 제일 많고 BASE가 11개로 제일 적어요. 그런데 지금 봇에 남은 건 BASE입니다. 손을 많이 댄 것과 남은 것이 반대였습니다.

각각에서 배운 것

하이브리드 — 자원을 나눠 쓰면 둘 다 나빠집니다

하이브리드는 욕심의 결과였습니다. 스윙으로 큰 걸 먹으면서 단타로 잔돈도 벌자는 발상이었는데, 실제로 돌려보니 두 전략이 서로 방해했습니다.

한 계좌에 두 전략을 넣으면
  공유 자원: 슬롯 · 현금 · 주의력
  --------------------------------------------------
  단타가 슬롯을 채우고 있으면
     → 스윙 기회가 와도 못 들어간다
  스윙 포지션이 며칠 잡혀 있으면
     → 단타 회전이 죽는다
  손절 기준이 서로 다르면
     → 같은 종목을 다른 규칙으로 다루게 된다
  --------------------------------------------------
  결론: 각각 혼자 돌 때보다 나빠질 수 있다

자원(슬롯, 현금)이 유한한데 성격이 다른 두 전략이 그걸 나눠 쓰면, 각각이 혼자 돌 때보다 나빠질 수 있다는 걸 배웠습니다. 이건 전략의 우열 문제가 아니라 자원 배분 구조의 문제예요.

더 골치 아팠던 건 어느 쪽이 잘못했는지 알 수 없다는 겁니다. 성적이 나쁘면 스윙이 문제인지 단타가 문제인지 구분이 안 돼요. 두 전략이 같은 계좌에서 서로 영향을 주니까 각각을 따로 평가할 수 없습니다. 실험 설계 자체가 잘못된 거였죠.

여기서 얻은 원칙이 하나 있습니다. 한 봇은 한 성격만. 지금 봇은 눌림목 하나만 봅니다. 다른 기회가 보여도 안 갑니다. 기회를 놓치는 손해보다 규칙이 흐려지는 손해가 크다고 판단해서예요.

BASE — 이 시대의 진짜 수확

BASE는 이 시대의 진짜 수확입니다. 이름 그대로 바닥권 지지 구간에서 진입하는 전략인데, 지금 봇이 쓰는 과매도 눌림목 전략의 직계 조상이에요.

돌파 ↔ 바닥권, 정반대의 전제
  [ 돌파 ]   저항선을 뚫으면 계속 간다
            전제: 추세가 이어진다
            추세장에서 강함
            박스권에서 → 뚫고 다시 내려온다 (가짜 돌파)

[ 바닥권 ] 많이 빠진 건 되돌아온다 전제: 평균으로 회귀한다 박스권에서 강함 하락 추세에서 → 계속 빠진다 (칼날 잡기) ————————————————– 둘 다 맞고 둘 다 틀리다 — 어떤 장이냐에 달렸다

돌파를 쫓는 것과 빠진 걸 줍는 것은 방향이 정반대인데, 박스권에서는 후자가 확실히 나았습니다. 돌파는 박스권에서 대부분 가짜였거든요. 저항선을 살짝 뚫고 바로 되돌아옵니다. 그 살짝 뚫는 순간에 사면 고점에 사는 겁니다.

다만 바닥권 전략에도 명확한 약점이 있습니다. 하락 추세에서는 바닥이 계속 갱신돼요. “많이 빠졌다"고 산 자리가 다음 날 더 빠집니다. 이 약점을 막는 방법이 결국 시장 상황 판단인데, 그게 다음 갈래의 주제였습니다.

MACRO — 완성 못 했지만 문제의식은 남았습니다

MACRO는 시야를 한 단계 위로 올린 실험입니다. 개별 종목의 조건이 아무리 좋아도 시장 전체가 흘러내리면 소용없다는 문제의식이었어요.

판단의 층위
  3층  시장 전체     지금 살 때인가?
       → 아니면 아무것도 안 한다
  2층  종목 선택     무엇을 살까?
       → 게이트와 랭킹
  1층  진입 타이밍   얼마에 살까?
       → 눌림목 대기
  --------------------------------------------------
  이때까지 봇은 1·2층만 있었다
  3층이 없으면 하락장에서 열심히 잘 산다

이 발상은 당시엔 완성 못 했습니다. 시장 전체를 어떤 지표로 볼지, 어느 주기로 볼지, 판단이 뒤집힐 때 어떻게 할지 — 정할 게 너무 많았어요. 56개 버전을 만들고도 결론이 안 났습니다.

그런데 문제의식 자체는 정확했습니다. 나중에 BTC 4시간봉으로 시장 상황을 판단해서 하락장에는 아예 안 사는 규칙으로 돌아옵니다. 56개 버전이 만든 건 코드가 아니라 “3층이 필요하다"는 확신이었어요.

MACRO에서 정하기 어려웠던 것들을 구체적으로 적어두면 이렇습니다.

"지금이 어떤 장인가" 를 코드로 옮기려면
  무엇으로 보나   BTC? 시가총액 상위 평균? 전체 지수?
  어느 주기로     15분? 1시간? 4시간? 일봉?
  어떤 기준으로   이동평균 대비? 최근 고점 대비? 변동성?
  판정이 뒤집히면 보유 중인 포지션은 어떻게 하나?
  경계에 걸리면   상승/하락 사이에 중립 구간을 둘 것인가?
  --------------------------------------------------
  질문 다섯 개가 곱해지면 조합이 수십 가지
  검증 수단이 없는 상태에서 56개 버전으로도 못 좁혔다

네 번째 질문이 특히 까다로웠습니다. 하락장으로 판정됐을 때 신규 진입만 막을 건지, 보유분도 정리할 건지요. 정리하면 반등을 놓치고, 안 하면 하락을 그대로 맞습니다.

지금은 신규 진입만 막습니다. 보유분은 원래 규칙대로 관리해요. 이유는 앞서 말한 것과 같습니다 — 판정이 틀렸을 때 대가가 작은 쪽이니까요. 잘못 막으면 기회를 놓치고, 잘못 정리하면 실제 손실이 확정됩니다.

다섯 번째 질문도 나중에야 답이 나왔습니다. 완성된 4시간봉만 쓰기로 한 것이요. 진행 중인 봉으로 판단하면 몇 분마다 판정이 뒤집히는데, 그러면 봇이 진입을 열었다 닫았다만 반복합니다. 판단의 주기가 행동의 주기보다 짧으면 아무것도 못 합니다.

빗썸 분기 — 거래소는 변수입니다

빗썸 분기는 짧게 끝났습니다. 같은 로직도 거래소가 다르면 호가 단위와 유동성 때문에 결과가 꽤 달라진다는 것만 확인하고 접었어요.

확인한 것 자체는 값집니다. 파라미터는 거래소에 종속된다는 뜻이니까요. 한쪽에서 최적인 손절 폭이 다른 쪽에서는 너무 좁을 수 있습니다. 유동성이 얕으면 같은 뉴스에도 더 크게 흔들리거든요. 값을 거래소와 함께 기록해둬야 한다는 걸 이때 배웠습니다.

예상과 달랐던 결론

여러 개를 돌리면 승자가 나올 줄 알았습니다. 실제로는 그렇게 안 됐어요.

병렬 실험이 실제로 준 것
  기대했던 것   "네 개 중 제일 좋은 하나를 고른다"
  실제 결과     어느 것도 압도적이지 않았다 — 장세에 따라 순위가 바뀜
  진짜 수확 1   전략마다 잘 되는 장이 다르다는 걸 몸으로 확인
  진짜 수확 2   그래서 "지금이 어떤 장인가" 를 판단하는 게 먼저다
  진짜 수확 3   여러 봇을 동시 관리하는 건 혼자서 감당이 안 된다

순위가 장세에 따라 바뀐다는 게 처음엔 실망스러웠습니다. 답이 없다는 뜻처럼 들렸거든요. 그런데 이게 오히려 답이었어요. 전략을 고르는 문제가 아니라 장을 판단하는 문제였던 겁니다.

여기서 갈림길이 하나 있었습니다. 장에 따라 전략을 갈아 끼우는 봇을 만들 수도 있었어요. 추세장이면 돌파, 박스권이면 바닥권. 매력적인 설계입니다.

전략 자동 전환을 안 한 이유
  [ 전략 전환형 ]
    장세 판정 → 그에 맞는 전략 실행
    문제 1 장세 판정이 틀리면 두 배로 틀린다
    문제 2 판정이 자주 뒤집히면 전략이 계속 바뀐다
    문제 3 검증할 조합이 폭발한다 (전략 × 판정 기준)

[ 채택한 방식 ] 전략은 하나 · 장세는 진입 차단에만 사용 틀려도 최악이 “안 사는 것” ————————————————– 틀렸을 때의 대가가 작은 쪽을 골랐다

지금 봇이 하락장에 전략을 바꾸는 대신 아예 안 사는 이유가 이겁니다. 판정이 틀렸을 때 대가가 다릅니다. 전환형은 틀리면 잘못된 전략으로 매매하고, 차단형은 틀리면 기회를 놓칠 뿐이에요. 놓친 기회는 아프지만 계좌를 깎지는 않습니다.

실험을 제대로 하려면 필요했던 것들

이 시기에 실험이 결론을 못 낸 이유를 지금 시점에서 정리해보면, 방법론이 없었습니다.

당시 실험에 없었던 것
  ✘ 같은 기간·같은 자금 조건
      갈래마다 시작 시점과 배분이 달랐다
  ✘ 표본 수 기준
      몇 건이 쌓여야 판단할지 정하지 않았다
  ✘ 평가 지표 합의
      수익률? 승률? 손익비? 그날그날 다른 걸 봤다
  ✘ 코드 동기화
      갈래마다 다른 수정이 들어감
  --------------------------------------------------
  → 네 개를 돌렸지만 "비교" 는 못 했다. 관찰만 했다

세 번째가 특히 문제였습니다. 평가 지표를 미리 안 정해두면 결과를 보고 나서 유리한 지표를 고르게 됩니다. A가 승률이 높고 B가 수익률이 높으면, 그날 기분에 따라 승자가 바뀌어요. 이건 실험이 아니라 해석입니다.

지금은 지표를 먼저 정합니다. 건당 기대값과 손익비를 봅니다. 승률만 보면 안 되는 이유는, 승률은 익절 폭을 좁히기만 해도 올라가기 때문이에요. 작은 이익을 자주 확정하고 큰 손실을 가끔 맞으면 승률은 높은데 계좌는 줍니다. 지표를 하나만 보면 그 지표를 속이는 방향으로 최적화됩니다.

표본 수 기준도 마찬가지입니다. 며칠 성적으로 순위를 매기면 그날 장세에 맞았던 전략이 이깁니다. 그런데 우리가 알고 싶은 건 “이 전략이 여러 장세에 걸쳐 어떤가"예요. 이 둘을 구분하려면 최소 몇 건, 최소 몇 주 같은 기준이 필요한데 그때는 없었습니다.

관리 비용이 실험을 끝냈습니다

세 번째 수확이 이 시대를 끝냈습니다. 봇 네 개를 동시에 돌리면 배포도 네 번, 모니터링도 네 번, 사고도 네 배입니다.

갈래 N개를 동시에 굴리는 비용
  갈래 하나가 늘 때마다
  · 배포 절차 × N
  · 모니터링 대상 × N
  · 버그 수정을 손으로 복사 × N
  · 계좌·자금 배분 관리 × N
  --------------------------------------------------
  게다가 갈래마다 코드가 조금씩 달라진다
  → 어느 갈래에 어떤 수정이 들어갔는지 헷갈린다
  → 비교 실험의 전제(같은 조건)가 무너진다

마지막 줄이 치명적이었습니다. 실험을 하려면 조건이 같아야 하는데, 갈래마다 손을 대다 보니 어느새 서로 다른 봇이 돼 있었어요. A에서 버그를 고치고 B에는 안 옮기면, 두 갈래의 성적 차이가 전략 차이인지 버그 차이인지 알 수 없습니다. 실험이 실험이 아니게 된 겁니다.

이걸 제대로 하려면 공통 코드를 라이브러리로 빼고 전략만 갈아 끼우는 구조가 필요합니다. 그런데 그건 이 시대에는 불가능했어요. 아직 모놀리스였으니까요. 병렬 실험이 제대로 되려면 먼저 모듈화가 됐어야 했다는 게 순서상의 아이러니입니다.

실험의 가치보다 관리 비용이 커지는 지점이 왔습니다.

무엇을 남기고 무엇을 버렸나

그래서 정리하기로 합니다.

정리의 결과
  BASE      접근법을 본류로 가져온다
            → 과매도 눌림목 전략의 뿌리
  MACRO     문제의식을 규칙 하나로 압축한다
            → 하락장 신규 진입 차단
  하이브리드 접는다
            → "한 봇은 한 성격" 원칙만 남김
  빗썸 분기  접는다
            → "값은 거래소에 종속" 이라는 사실만 남김
  --------------------------------------------------
  106개 버전 → 살아남은 것: 접근법 1개 + 규칙 1개 + 원칙 2개

여러 개를 만들어본 덕에 무엇을 버릴지 알게 된 셈입니다. 실험의 목적은 승자를 뽑는 게 아니라 선택지를 줄이는 것이었더군요.

그리고 버린 것들도 빈손은 아니었습니다. 하이브리드는 “한 봇은 한 성격"을 남겼고, 빗썸 분기는 “값은 거래소에 속한다"를 남겼습니다. 코드는 안 남았지만 규칙은 남았어요. 아카이브를 정리하면서 제일 자주 확인하는 게 이겁니다. 버려진 시도가 남긴 문장이 살아남은 코드보다 오래갑니다.

BASE라는 이름에 대해

지금 봇의 전략을 설명할 때 “과매도 눌림목 반등"이라고 부르는데, 이 이름의 절반은 첫 시대의 v1.09에서, 나머지 절반은 이 시대의 BASE에서 왔습니다.

전략 이름의 계보
  v1.09 (1시대)
    "조건이 서도 -0.5% 더 빠지면 산다"
    → 눌림목 = 진입 가격을 낮추는 장치

BASE (4시대) “바닥권 지지 구간에서 산다” → 과매도 = 어떤 상태의 종목을 볼 것인가

현행 과매도 상태 종목을 고르고 · 눌림목에서 진입한다 두 개는 다른 층위의 개념이라 합칠 수 있었다

이 둘이 합쳐질 수 있었던 건 층위가 달랐기 때문입니다. 하나는 종목 선택 기준이고 다른 하나는 진입 가격 기준이에요. 같은 층위의 아이디어였다면 하나를 버려야 했을 겁니다.

아카이브를 정리하면서 이런 게 자주 보입니다. 서로 다른 시대에 나온 아이디어가 나중에 결합되는 경우요. 당시에는 각각 독립적인 시도였는데, 층위가 다르니 충돌하지 않고 겹쳐진 겁니다. 좋은 아이디어를 버리지 않고 쌓아두면 나중에 조합됩니다. 그래서 접은 갈래의 코드도 안 지웠어요.

여러 개를 만들어본 것 자체의 값

이 시대를 실패로 분류할 수도 있습니다. 106개 버전을 만들고 세 갈래를 접었으니까요. 그런데 저는 이 시기를 가장 잘 쓴 시간 중 하나로 봅니다.

병렬 실험이 없었다면
  돌파 전략 하나만 계속 고쳤을 경우
  --------------------------------------------------
  · 파라미터 탐색을 몇 달 더 했을 것
  · "전략 자체가 문제" 라는 가설을 못 세웠을 것
  · 바닥권 접근을 시도할 계기가 없었을 것
  · 시장 판단 층의 필요성을 몰랐을 것
  --------------------------------------------------
  106개는 비쌌지만, 안 만들었으면 더 비쌌다

특히 “전략 자체가 문제일 수 있다"는 가설을 세운 게 컸습니다. 하나만 붙들고 있으면 이 가설이 잘 안 떠올라요. 내가 만든 것이니 애착도 있고, 조금만 더 만지면 될 것 같거든요. 옆에 다른 게 돌아가고 있으면 비교가 되니까 그 애착이 깨집니다.

혼자 개발할 때 제일 부족한 게 반대 의견입니다. 병렬 실험은 반대 의견을 코드로 만들어 옆에 놓는 일이었어요. 지금은 그 역할을 매매기록 시뮬레이션이 합니다. 내가 좋다고 생각한 값을 데이터가 반박해주니까요.

이 시대에서 가져갈 것

첫째, 비교 대상이 없으면 판단할 수 없습니다. 성적이 나쁠 때 전략 탓인지 장 탓인지 구분하려면 같은 기간에 돌아간 다른 것이 있어야 합니다. 봇이 하나뿐이면 그 봇의 성적은 절대 평가할 수 없어요. 지금은 매매기록 시뮬레이션이 그 역할을 합니다 — 같은 데이터에 다른 값을 넣어 비교하니까요. 병렬 실험의 목적을 훨씬 싸게 달성하는 방법입니다.

둘째, 실험에는 인프라가 먼저 필요합니다. 전략을 비교하려면 나머지 조건이 같아야 하는데, 모놀리스에서는 그게 유지되지 않습니다. 이 시대의 실험이 결론에 도달하지 못한 건 아이디어가 나빠서가 아니라 실험 환경이 없어서였어요. 비교하고 싶으면 먼저 공통 부분을 고정할 수 있어야 합니다.

셋째, 틀렸을 때의 대가가 작은 쪽을 고르세요. 장세 판정으로 전략을 바꾸는 설계와 진입만 차단하는 설계 중에 후자를 골랐는데, 이유는 정확도가 아니라 실패 비용이었습니다. 자동매매에서 설계 선택의 기준은 대개 “맞을 확률"보다 “틀렸을 때 얼마나 아픈가"입니다.

넷째, 한 봇은 한 성격만. 하이브리드에서 배운 겁니다. 좋은 아이디어 두 개를 한 계좌에 넣으면 자원을 나눠 쓰면서 둘 다 나빠질 수 있어요. 그리고 성적이 나빠도 어느 쪽 탓인지 알 수 없게 됩니다. 기회를 놓치는 손해보다 판단의 근거가 흐려지는 손해가 큽니다.

106개 버전, 네 갈래. 답을 하나 고르려고 시작해서 질문을 바꾸게 된 시기였습니다.

“어떤 전략이 제일 좋은가"로 시작해서 “지금이 무엇을 할 때인가"로 끝났어요. 그리고 그 질문은 전략보다 상위에 있습니다. 아무리 좋은 전략도 안 맞는 장에서는 지고, 그럭저럭인 전략도 맞는 장에서는 버팁니다. 지금 봇에 레짐 차단이 들어 있는 건 이 시대가 남긴 유일하지만 가장 큰 결론입니다.

다음 시대에는 이름이 하나 붙습니다. 지금까지 이어지는 VV라는 이름이요. 그리고 시장 판단이 처음으로 실제 코드가 됩니다.