Joyuno's Dev Blog

2026-06-15 (월) 개발일지

dev-blog

오늘은 GitHub 프로필 페이지에 README가 보이지 않는 문제와 bit-scalp 전략에 3분봉 RSI 게이트를 추가하면서 평균회귀와 리버스 매매의 본질적 동일성을 확인한 일을 정리했다.

GitHub 프로필 README 미노출 — server-side indexer 라는 우리 손 밖의 영역

github.com/joyuno 메인 페이지에 프로필 README가 뜨지 않는다는 보고를 받았다. 분명 joyuno/joyuno 레포지토리에 README.md는 존재하고, 다른 계정(kwakseongjae)은 정상적으로 표시되고 있었다. 처음엔 repository 이름이나 브랜치 문제일 거라 생각했지만, main 브랜치에 README.md가 있는 건 확인됐다. 바로 페이지 소스를 비교하기 시작했다.

가장 먼저 "readme" 문자열을 검색했는데, kwakseongjae는 7건이 나온 반면 joyuno는 0건. <article markdown-body> 요소 자체가 아예 없었다. 페이지 크기도 kwakseongjae가 228KB, joyuno가 200KB로 28KB 차이가 났다 — 정확히 README 내용만큼 빠져 있었다. 이 시점에서 첫 가설은 세웠다: GitHub가 프로필 README를 파싱하지 않고 있다.

visibility private ↔ public 토글, 빈 커밋(--allow-empty), README 첫 줄에 H1 헤딩 추가 등 일반적인 트리거를 모두 시도했지만, indexer는 전혀 반응하지 않았다. curl로 직접 API를 찔러봐도 README raw는 정상 반환됐지만, 프로필 페이지에는 반영되지 않았다. kwakseongjae가 동일한 구조로 정상 동작 중인 점이 결정적 단서였다 — 내 저장소만 GitHub server-side indexer가 동작하지 않는 상태였다.

원인이 우리 통제 범위 밖임을 확정: 코드·설정·커밋으로 더 할 수 있는 게 없었다.

해결책은 없었다. GitHub 지원팀에 문의하거나 시간이 지나길 기다리는 수밖에. 당장 취할 수 있는 조치는 트리거 실패를 기록하고 넘어가는 것뿐. 다만 이 경험으로 얻은 건 “문제의 성격을 명확히 구분하자”는 교훈 — 내가 바꿀 수 있는 것과 없는 것을 빠르게 가르는 판단이 중요하다.

bit-scalp 전략 — 3분봉 RSI 게이트 추가와 리버스의 본질적 동일성

요청은 명확했다: V2 추세매매(리버스 모드)와 V5 평균회귀 전략에 각각 3분봉 RSI를 반영해 진입 정밀도를 높이는 것. 기존에는 15분봉만 사용하고 있었고, 3분봉은 별도의 scalp_3m path로 분리되어 있었다. 처음엔 그냥 3분봉 RSI 게이트를 두 전략에 각각 추가하는 단순 작업일 거라 생각했다.

하지만 데이터를 보기 시작하면서 생각이 달라졌다. V2 리버스 모드의 로직을 다시 보니 K≥80 → SHORT, K≤20 → LONG — 이건 추세 추종이 아니라 정확히 평균회귀였다. 사용자가 “V2 리버스가 V5 평균회귀와 본질적으로 같지 않냐”는 직감을 던졌고, 실제 2.5일 운영 데이터를 긁어 비교해봤다.

전략 N 승률 누적 PnL
mean_reversion (V5) 5 80% +$11.67
rsi_trend (V2 리버스) 8 62% +$2.35

V5가 압도적으로 우수했고, V2 리버스는 사실상 같은 전략의 열등한 복제품이었다. 이 시점에서 방향을 완전히 틀었다. 별도의 scalp_3m path를 제거하고, V2 리버스를 V5 평균회귀로 통합하는 쪽이 맞았다. 사용자가 말한 “동시 작동경로로 나누지 말라”는 의도도 여기서 이해됐다.

채택한 구조는 3중 확인 게이트다.

  • V2 (추세매매, 리버스 모드): 리버스 swap 후 진입 직전 3분봉 RSI로 함정 방어. LONG 진입 시 3분 RSI ≥ 75면 차단(추격매수 방지), SHORT 진입 시 3분 RSI ≤ 25면 차단(추격매도 방지).
  • V5 (평균회귀): 일봉 K + 15분 RSI + 3분 RSI 모두 극단값일 때만 진입. LONG = 일봉 K ≤ 20 + 15m RSI ≤ 30 + 3분 RSI ≤ 35. SHORT는 반대 방향.

추가로 스캔 주기를 15분에서 3분으로 줄였다. 매분 :00, :03, :06, ..., :57에 3분봉 close를 정렬하고, close + 5초에 1회 스캔. API 호출은 5배 증가했지만 Binance weight 한도 내에 안전했다. orchestrator.py와 mean_reversion.py 두 파일만 수정했고, 적용 후 빌드 통과와 함께 로직 검증을 마쳤다.

시행착오의 핵심: 처음엔 “각각 추가”라는 단순 접근이었지만, 데이터가 리버스와 평균회귀의 동일성을 증명하면서 통합 방향으로 전환. “별도 path”라는 복잡성을 없애고 3중 확인으로 정밀도를 높인 게 이번 수확이다.

오늘의 한줄

내가 바꿀 수 있는 문제와 바꿀 수 없는 문제를 가르는 기준을 명확히 하고, 전략 개선에서는 데이터가 이론을 대체할 때까지 의심을 멈추지 말자.