BCS / LRS — 나만의 비트코인 핵심 지표 및 전략
Bitcoin Magazine Pro의 사이클 타이밍 지표 12개에서 핵심을 뽑아, 서로 독립적인 3개 계열 + 1개 거시 축 + 4개 바닥선으로 재구성한 판단 시스템과 그 실행 엔진.
🔗 라이브 사이트 — won-topiaa.github.io/Bitcoin-Core-Strategies
매일 자동 갱신되는 대시보드(한/영·라이트/다크). 지금 위치·16년 이력·거시 배경을 한 화면에서 본다. → 지금 위치 · 믿어도 되나 · 규칙과 한계
이 시스템은 "지금 사라 / 지금 팔아라"를 말하는 도구가 아니다.
하는 일은 하나다 — 지금 가격이 과거 16년 데이터에 비교해 저점 부근인지 고점 부근인지를, 오늘 기준으로 다시 세워 보여주는 것. BCS 는 예측값이 아니라 위치값이다. −64.2 는 "떨어질 것이다"가 아니라 "자기 4년 범위에서 저평가 쪽 극단에 있다"는 뜻이다.
그래서 평가 기준도 수익률이 아니다. 네 번의 사이클 고점에서 실제로 고점 쪽을 가리켰는가, 네 번의 저점에서 저점 쪽을 가리켰는가가 이 지표의 성적표다 (07 실측 검증, 15 교차자산 검증).
사다리·DCA·히스테리시스가 붙어 있는 것은 그 위치값을 행동으로 옮길 때 한 번에 다 하지 않게 만들려는 안전장치다. 위치 판정이 본체이고 실행 규칙은 그 위에 얹힌 껍데기다. 위치가 틀리면 껍데기는 의미가 없고, 위치가 맞아도 껍데기는 언제든 각자의 사정에 맞게 바꿔도 된다.
정규화가 퍼센타일 전용인 것도 이 목적 때문이다. 고정 임계는 "절대적으로 비싸다"를 말하려 하고, 퍼센타일은 늘 "자기 4년 범위 안 어디쯤" 만 말한다. 후자가 이 지표가 하려는 말이다.
원문 12개 지표를 계산 재료 기준으로 다시 세면 실제 정보원은 4가지뿐이다. 가격 계열 4종(Pi Cycle, Golden Ratio, 200주 MA, 2년 MA)은 전부 "가격 ÷ 이동평균"의 변형이고, MVRV Z와 NUPL은 분자가 같다. 이 중복을 걷어내고 계열별 가중치를 매겨 BCS(사이클 위치, −100 ~ +100) 하나로 압축했다. 거시 지표는 여기에 더하지 않고 **LRS(유동성 레짐)**라는 별도 축으로 분리해 실행의 방향이 아니라 크기만 조절하게 했다. 그리고 어떤 극단값이 나와도 한 번에 전부 사고팔지 않도록, 14일 간격의 5단 분할 사다리와 되돌림 방지 장치를 붙였다.
원문 6.1이 이렇게 경고한다.
MVRV Z-Score와 NUPL처럼 계산 재료가 거의 같은 지표 두 개가 같은 신호를 낸다고 해서 그것을 "두 번의 확인"으로 세면 안 됩니다.
이 경고를 끝까지 밀어붙이면 12개 목록이 이렇게 접힌다.
| 계열 | 실제로 재는 것 | 원문 지표 | BCS 지분 |
|---|---|---|---|
| 원가 대비 | 시가총액을 무엇으로 나누는가 | MVRV Z-Score, NUPL, 서멀캡 배수 | 40% |
| 평균가 대비 | 가격 ÷ 어떤 기간의 평균가 | Pi Cycle, Golden Ratio, 200주 MA, 2년 MA | 33% |
| 채굴 상황 | 코인을 만들어 내는 쪽 사정 | Puell Multiple, Hash Ribbons | 27% |
원문의 '코인 나이 분포'(RHODL / Reserve Risk / LTH 배수)는 뺐다. 공개 데이터로 재현이 안 되고, 그래서 16년 백테스트에 한 번도 들어간 적이 없었다 — 검증된 전략은 처음부터 3계열이었다. 근거: 10 보유자 계열 제거.
'원가 대비' 계열은 집계가 max_abs 라 그때그때 가장 극단인 지표 하나가
40% 를 혼자 끌고 간다. MVRV Z 하나만 0 → +1 로 가면 나머지가 전부 중립이어도
BCS 가 +40 이 되어 구간이 '중간'에서 '비싼 편'으로 넘어간다.
즉 지표 하나로 밴드와 DCA 는 바뀔 수 있다. 바뀌지 않는 것은 사다리 실행이다 — 분배·매집 계단은 아래 합의 게이트를 통과해야만 열리고, 계열 하나로는 절대 통과하지 못한다.
거기에 원문 6.1을 기계적으로 강제하는 합의 게이트를 걸었다.
3계열 중 2개 이상이 같은 방향, 그중 최소 1개는 '평균가 대비'가 아닐 것
가격 이동평균 4종이 강세장 후반에 한꺼번에 붉어지는 착시 — 실전에서 가장 흔한 오판 — 를 구조적으로 차단한다. 가격은 한 계열뿐이라 혼자서는 2를 채울 수 없고, 따라서 단독 통과가 산술적으로 불가능하다.
pip install -r requirements.txt
pip install -e . # btc-core 명령 등록 (선택)설치 없이 바로 돌려보려면 동봉된 합성 데이터를 쓴다.
python3 -m btc_core.cli score \
--csv data/sample_synthetic.csv \
--manual data/manual_input.example.yaml \
--as-of 2025-02-12
data/sample_synthetic.csv는 합성 데이터다. 실제 비트코인 시세가 아니다. 엔진이 어떻게 동작하는지 보기 위한 것이고 그 이상의 의미는 없다.
실전 데이터로 돌리려면:
python3 tools/probe_sources.py # 이 환경에서 무엇이 열려 있는지 먼저 확인
btc-core fetch --save data/market.csv # CoinMetrics 커뮤니티 API (키 불필요)
btc-core init # 수동 입력 템플릿 생성
# data/manual_input.yaml 을 BM Pro 차트 보고 채운다
btc-core score --csv data/market.csv두 번째부터는 refresh_data.py 로 증분 갱신한다. fetch 는 파일을 통째로
갈아 끼우지만, 이쪽은 검증을 통과한 뒤에만 쓰고 이미 있는 값을 빈 값으로
덮지 않는다.
python3 tools/refresh_data.py --check # 지금 데이터가 며칠 전 것인가
python3 tools/refresh_data.py --dry-run # 무엇이 바뀌는지만
python3 tools/refresh_data.py --build # 받아서 병합하고 사이트까지겹치는 구간의 가격이 2% 넘게 다르면 다른 자산·다른 단위를 받은 것으로 보고
아무것도 쓰지 않고 멈춘다. .github/workflows/refresh-data.yml 이 매일
02:20 UTC 에 이 과정을 돌리고, 테스트를 통과한 뒤에만 페이지를 다시 굽는다
(22).
지표 9개에 쓰는 시계열은 7개인데, 4개는 API 없이 계산된다. 비트코인의 발행 스케줄이 합의 규칙에 박혀 있기 때문이다.
price 외부 필수 대체 불가
realized_cap 외부 필수 체인 전체를 훑어야 나온다 — 계산 불가
supply 계산 반감기 스케줄
market_cap 계산 price × supply
issuance_btc 계산 supply 의 일간 차분
issuance_usd 계산 issuance_btc × price
hashrate 선택 없으면 Hash Ribbons 하나만 결측
active_addr 선택 없으면 mcap_per_active 하나만 결측
가격과 실현시총만 담은 CSV 로 돌리면 커버리지 33% → 100%, BCS −59.0 →
−64.4 가 된다. 실측 전체로 계산한 값은 −64.2 다. 파생을 끄면(--no-derive)
밸류에이션·공급 계열이 통째로 빠지고 가격 이동평균만으로 사이클 위치를
판정하는 상태가 되므로, 파생은 그 상태 자체를 없애는 장치다.
파생 정확도는 2015년 이후 평균 0.079%, 2020년 이후 0.011% 다. 사이클 전환점 8곳에서 실측 BCS 와의 평균 절대차가 1.16점이고 부호가 뒤집히는 곳은 없다. 자세한 내용과 소스별 대안 목록: 18 무료 데이터 경로.
══════════════════════════════════════════════════════════════════════════════
BCS / LRS 스냅샷 기준일 2025-02-12
══════════════════════════════════════════════════════════════════════════════
현재가 $55,271 커버리지 100%
BCS 사이클 위치 -76 ~ -55 ──├●━┤────┼──────────
바닥권 ~ 저점 부근 — 두 국면 사이 (점 -74.3)
실행은 바닥권 기준 — 예비 현금 집중 투입
폭 21점 — 하단은 '2년 MA 배수' 제외 시, 상단은 'MVRV Z-Score' 제외 시
LRS 유동성 레짐 +39.7 ──────────┼───●──────
완만한 완화
──────────────────────────────────────────────────────────────────────────────
계열별 점수
──────────────────────────────────────────────────────────────────────────────
원가 대비 -1.00 가중 40% ●─────────┼──────────
MVRV Z-Score -0.9598 → -1.00
NUPL -0.7508 → -0.51
서멀캡 배수 — → — ✗ 결측
평균가 대비 -0.59 가중 33% ────●─────┼──────────
Pi Cycle 근접도 0.3296 → -0.67
Golden Ratio 배수 0.5201 → -0.78
200주 MA 배수 0.8284 → -0.45
2년 MA 배수 0.5034 → -0.45
채굴 상황 -0.55 가중 27% ────●─────┼──────────
Puell Multiple 0.5014 → -0.56
Hash Ribbons 상태 capitulation → -0.55
──────────────────────────────────────────────────────────────────────────────
합의 게이트 ✔ 통과
계열 3개 합의(비가격 2개) — 실행 조건 충족
──────────────────────────────────────────────────────────────────────────────
실행 계획
──────────────────────────────────────────────────────────────────────────────
▶ 정기 DCA — 평소 적립액 × 2.5
⏸ 매집 1단 (BCS -30 돌파) — 예비 현금의 15.0%
보류: 확정 대기 — 임계 유지 1/3일 (기록이 더 필요합니다)
BCS 가 점이 아니라 구간이다. -76 ~ -55 는 지표를 하나씩 빼고 다시 계산한
값들의 범위이고, 마지막 줄이 어느 지표가 그 양 끝을 만드는지 알려준다.
구간이 밴드 경계를 걸치면 "두 국면 사이"로 쓰고, 실행은 점수 기준임을
따로 적는다 — 표시와 실행을 섞지 않는다.
--format markdown으로 저널에 붙일 문서를, --format json으로 다른 도구에
넘길 데이터를 뽑을 수 있다.
python3 tools/build_viz.py --csv data/market.csv # viz/site/ 에 네 장
python3 tools/build_viz.py --csv data/market.csv \
--index-url https://... --verify-url https://... \
--rules-url https://... --liquidity-url https://... \
--relation-url https://...| 페이지 | 내용 | 높이 |
|---|---|---|
index.html |
계기판 · 변화량 · 지표 9개 요약 · 16년 이력 | 3,483px |
verify.html |
전환점 성적표 · 계산 방법 · 범위가 나오는 이유 | 4,788px |
rules.html |
실행 규칙 · 한계 · 데이터 출처 · 자동 갱신 | 4,306px |
liquidity.html |
04 유동성 — 중국 M2 선행 겹쳐보기 · 왜 크기에만 쓰나 | 1,900px |
relationship.html |
05 관련성 — 국면별 상관 차트 · 23종 순위 · MSTR 상대성과 부록 · 왜 점수에 안 넣나 | 2,988px |
news.html |
06 뉴스 — 공개 RSS 에서 핵심 기사만 걸러 요약+링크. 하루 4번 갱신 | — |
한 장에 다 넣지 않는다. 처음에 한 장이었을 때 7,500px 였고, 그러니까 "무엇을 봐야 하는가"가 사라졌다. 여섯 장으로 나누고 각 장 맨 위에 이동 막대를 뒀다.
06 뉴스는 이 사이트에서 유일하게 남의 문장을 싣는 장이다. 그래서 다르게 다룬다 —
기사를 고르는 것은 사람이 아니라 공개된 점수 규칙(tools/fetch_news.py: 키워드·최신성·
중복 제거)이고, 제목·요약은 태그를 벗긴 평문으로만 구워지며(</script> 탈출 이스케이프
포함), 갱신은 전체 재빌드 없이 tools/inject_news.py 가 마커 구간만 바꾼다 — 뉴스 하나
때문에 여섯 장이 전부 재배포되는 것을 막기 위해서다. 점수(BCS)는 뉴스를 전혀 읽지
않는다.
05 관련성 장의 숫자는 손으로 적지 않는다. 빌드 시점에
relationship_map.payload() 를 다시 돌려 페이지 안에 굽는다 — 데이터가 갱신될 때
docs/33 과 화면이 갈라지는 것을 구조적으로 막는다.
첫 화면의 큰 숫자(−63 ~ −60) 바로 밑에 사람 말로 옮긴 한 줄이 붙는다 —
"지난 16년을 통틀어 아래에서 14% 지점입니다. 5,856일 가운데 오늘보다 싼
쪽이었던 날이 14% 뿐이라는 뜻입니다." 새로 정한 숫자는 없고, 오늘 점수보다
낮았던 날을 일 단위 전체에서 센 비율일 뿐이다(추린 시계열로 세면 최근 400일이
과대 대표돼 조용히 틀린다 — 테스트로 막아 뒀다).
16년 그림에는 오늘 수준에 가로 점선이 그어져 있다. 선이 지나가는 곳이 전부 지금과 같은 자리였던 때라서, "과거에 이런 적이 몇 번 있었고 그 뒤에 어떻게 됐나"가 그림 하나로 읽힌다.
차트는 키보드로도 짚을 수 있다. 탭으로 잡고 ← → 로 하루씩, Shift·
PageUp/Down 으로 크게, Home·End 로 처음·끝, Esc 로 해제한다. 처음
들어오면 오늘부터 시작한다 — 왼쪽 끝에서 시작하면 지금에 닿는 데 5,000번을
눌러야 한다. 툴팁은 낭독기가 읽지 않으므로 같은 내용을 aria-live 로 따로 준다.
지표 9개 요약이 첫 장의 핵심이다. 아홉 개를 싼 쪽부터 정렬해 각각의 현재값, "최근 4년 중 몇 %", 직전에 이만큼 극단이었던 시기를 보여준다. 점수 하나가 어디서 왔는지가 이 하나로 보인다. 720px 아래에서는 표 대신 카드로 바뀐다 — 가로로 잘린 표는 핵심을 못 보는 화면이 된다.
@media print 가 있어서 인쇄하면 접힌 설명이 전부 펴지고 이동 막대가 사라진다.
머리띠에 버튼이 두 개 있다 — 한국어/English 와 밝게/어둡게. 선택은
기억되고, 처음 오는 사람에게는 브라우저·OS 설정을 따른다. 테마는 <style> 바로
뒤 인라인 스크립트가 첫 페인트 전에 적용한다 — 본 스크립트에서 하면 흰 화면이
한 번 번쩍인다.
viz/_head.html 스타일 (네 장 공용)
viz/_nav.html 머리띠 — 페이지 이동 + 언어·테마 버튼
viz/_script.html 차트 엔진 (네 장 공용, 없는 요소는 건너뛴다)
viz/_i18n.html 본문 산문의 영어 판 (data-t 키와 1:1)
viz/*.body.html 페이지별 본문 넷
CSS·JS·데이터를 한 파일에 굽는 자기완결 HTML 이다. 외부 요청이 하나도 없다 —
요청이 막힌 환경에서 빈 화면이 나오면 공개 데이터로 돌아가는 시스템에서 그건
"안 보인다"와 같다. tests/test_viz.py 가 그것을 포함해 지킨다:
node 파서로 구문, 정적 검사로 가드 누락, 빌드 결과로 자리표시자와 외부 의존.
두 언어의 유일한 위험은 어긋남이다. 지표를 추가하고 영어를 잊으면 영어 화면
한가운데에 한국어가 남고, 그건 번역하지 않은 화면보다 나쁘다. tests/test_i18n.py
가 세 곳의 키 집합을 양방향으로 대조한다 — 본문 data-t ↔ _i18n.html,
TX.ko ↔ TX.en, strategy.yaml ↔ strings.en.yaml. 빠진 것도 남는 것도
실패다 (22).
설명 문구는 config/strategy.yaml 의 explain / explain_long 이 소유한다 —
페이지에 따로 적어 두면 지표를 고칠 때 둘이 어긋나고, 어긋난 설명은 없는
설명보다 나쁘다. 같은 문구가 btc-core explain <지표> 로도 나온다.
자산을 세 통으로 나눈다. 코어 40%(어떤 신호에도 팔지 않음) / 트레이딩 60% / 예비 현금(정기 DCA와 별개 예산).
| BCS | 구간 | 태도 | DCA 배수 |
|---|---|---|---|
| +70 ~ +100 | 천장권 | 나눠 팔기 가속 | 0.0 |
| +45 ~ +70 | 고점 부근 | 나눠 팔기 시작 | 0.0 |
| +20 ~ +45 | 비싼 편 | 새로 사지 않고 적립만 | 0.5 |
| −20 ~ +20 | 중간 | 평소대로 적립 | 1.0 |
| −45 ~ −20 | 싼 편 | 적립액 늘리기 | 1.5 |
| −70 ~ −45 | 저점 부근 | 예비 현금 넣기 시작 | 2.0 |
| −100 ~ −70 | 바닥권 | 예비 현금 집중 투입 | 2.5 |
구간 이름에 '항복'·'도취' 같은 심리 용어를 쓰지 않는다. 이 지표는 사람들의 감정을 재는 게 아니라 지금 가격이 과거 대비 어디쯤인지를 잰다. 화면에 뜨는 이름이 그 사실과 어긋나면 읽는 사람이 다른 것을 기대하게 된다.
분배 사다리 +45 / +55 / +65 / +75 / +85 에서 각 10 / 10 / 10 / 15 / 15% (누적 60% — 코어 40%와 정확히 맞물린다)
매집 사다리 −30 / −45 / −58 / −70 / −82 에서 예비현금의 15 / 20 / 20 / 20 / 25%
히스테리시스 3일 연속 확정 · 계단 간 14일 · 반대편 구간(∓20)을 방문해야 재무장. BCS가 +90으로 튀어도 5계단이 한꺼번에 실행되지 않는다. 사다리를 다 오르는 데 최소 8주가 걸린다. 재무장되더라도 한 사이클 누적은 60%를 못 넘는다.
LRS 조정 트랜치 크기를 0.75 ~ 1.25배 사이에서만 조절한다. 매수를 매도로 바꾸지 못한다.
저점 프로파일 과거 사이클 저점 네 곳의 공통 조건 6가지와 현재 상태를 대조해 보여준다. 점수에는 들어가지 않는다 — 임계값이 그 저점들을 보고 정해진 것이라 순환논리 위험이 있고, 절반은 이미 다른 지표가 세고 있기 때문이다. BCS가 "싸다"고 할 때 "역사적 바닥과 같은 상태인가"는 다른 질문이라 함께 본다 — 09 저점 프로파일.
| 00. 원문 12개 지표 요약 | 참조용 압축본 |
| 01. 핵심 추출 | 12개를 계열로 접은 근거 |
| 02. 핵심지표 정의서 | 지표별 앵커와 배신 지점 |
| 03. 스코어 엔진 | 왜 거시를 분리했나, 합의 게이트 |
| 04. 실행 전략 | 사다리, 히스테리시스, 바닥선 |
| 05. 운영 루틴 | 주 1회 15분 / 월 1회 40분 |
| 06. 한계와 반증 조건 | 언제 이 전략을 폐기하나 |
| 07. 실측 검증 | 16년 데이터가 설계를 반박한 지점 |
| 08. 지표 선별 | 무엇을 넣고 무엇을 버렸나 (후보 6개 중 1개 편입) |
| 09. 저점 프로파일 | 사이클 저점의 공통점 (표시 전용) |
| 10. 보유자 계열 제거 | 4계열 → 3계열, 그 근거와 대가 |
| 11. 지표 발굴 2차 | 후보 8개 검정, 채택 0개, 고점 프로파일 신설 |
| 12. 외부 사이트 검토 | 파워로우·SSR 기각, 실현가격 바닥선 편입 |
| 13. 계열 독립성 점검 | Puell 이 가격 지표였다 — 합의 게이트 전제 복구 |
| 14. 과적합 노출도 | 조정 숫자 269개 대 사이클 4개 — 어디가 위험한지 측정 |
| 15. 교차자산 검증 | BTC 설정을 LTC·ETH 에 적용 — 전환점 21곳 표본 외 검증 |
| 16. 지표 전수조사 | 466개 열거·분류, 채택 0개, 구독 피드 우선순위 |
| 17. 미심사 후보 검정 | 13건 검정, 채택 0개, 관문 자체의 결함 발견 |
| 18. 무료 데이터 경로 | 외부 필수 시계열을 7개 → 2개로, 나머지는 계산 |
| 19. BCS 구간 표시 | 점 하나 대신 범위 — 파라미터 0개로 불확실성 표시, 시각화 |
| 20. LPPLS 검정 | 가장 유망하던 미심사 후보 — 표시 전용으로도 기각 |
| 21. 전수 코드 점검 | --as-of 가 거짓말하고 있었다 · 전환점을 고르지 않고 재게 바꿈 |
| 22. 자동 갱신과 두 언어 | 매일 자동 갱신 — 문제는 잇기가 아니라 잘못 잇지 않기 · 한국어/영어 · 밝게/어둡게 |
| 23. Reserve Risk 근사 검정 | 구독형 지표를 코인나이 없이 근사 — 네 변형 셋이 서멀캡·MVRV 로 무너짐 |
| 24. 자본화 모형 근사 검정 | Delta Cap·Average Cap·S2F — 서멀캡/모멘텀/달력 세 방식으로 전부 기각 |
| 25. 거시 연관성 (나스닥·M2) | 실측(FRED+GitHub+PBoC): 나스닥 주간 +0.02→+0.34(2020후)·VIX −0.34·M2 는 중국만 |
| 26. 엔캐리 연관성 검정 | 실측: 엔캐리는 BTC 와 무상관 — 주간 −0.05·월간 −0.05·선행/후행 |ρ|≤0.02, 부호도 가설과 반대. 엔 급등 주를 공포로 쪼개면 둘 다 플러스 → 엔이 아니라 위험회피가 원인. ΔVIX 통제 후 −0.08 → 기각(점수·사이트 미반영) |
| 27. 거시 후보 4종 검정 | 실측(DXY·10년 실질금리·연준 순유동성·코스피): 부호는 가설과 맞지만 |ρ|<0.1, 국면 좁혀도 −0.27~+0.36. 나스닥 통제하면 넷 다 0 근처(부호마저 뒤집힘) = 고유 정보가 아니라 위험자산 베타. 코스피는 '김치 프리미엄' 서사에도 나스닥 통제 시 −0.02, 최근 18개월 코스피 +239% vs BTC −43%. '코스피−나스닥 초과수익'(2022+ −0.59)은 숨은 나스닥 숏이라 직교화하면 −0.02. 넷 다 기각 → 이름 안 바꿈 |
| 28. 자산군 32종 검정 | 공개 리서치 서사에서 출발해 자산군별로 실측 — 심층 7종(신용스프레드·기대인플레·수익률곡선·원유·구리·신흥국통화·중국주식) + 광역 스윕 25종(부동산·식품·주식·금융여건·실물경기·원자재·통화·금리) → 32종 전부 기각. 부동산은 국면(침체·활황)으로도 검정(p=0.48). 개별 종목은 데이터 차단이라 나스닥100·다우로 대체 — 둘 다 나스닥 통제 시 0. 정정: 기각 사유를 '전부 나스닥 베타'로 뭉뚱그린 것은 과일반화 — 실질금리·순유동성·수익률곡선은 나스닥과 직교하며 크기 부족으로 탈락 |
| 29. 온체인·파생·네트워크 검정 | 온체인 7종 + NVT·수수료·주소수 5종 + 펀딩비 → 통과 0/13. 새 함정: 'ΔVIX·나스닥 통제 통과'는 충분조건이 아니다 — 실현시총 유입·MVRV·Puell·펀딩비가 통제를 통과하지만 전부 Δ가격과 0.47 |
| 30. 인물 사건 검정 | 머스크·세일러·트럼프·래리핑크·SBF·겐슬러 사건일 ↔ BTC → 기각. 세 번째 함정 '사후편향' 발견 — 처음엔 13개 사건일 평균 5.01% vs 무작위 2.75%(p=0.035)로 유의해 보였으나, 일정이 사전 공표된 '예정' 사건만 추리면 2.77% vs 2.10%(p=0.23)로 무작위와 동일(정정: 귀무 풀을 사건이 놓인 2020년 이후로 맞춤 — 이전 p=0.38 은 변동성이 훨씬 컸던 2010년대 초반까지 섞은 값). 유의성은 내가 사건을 고르는 과정의 산물이었다. 현대 구간 변동 상위 20일 중 겹침은 1일(테슬라 매입)뿐. 근본적으로 트윗은 미리 알 수 없어 신호가 될 수 없다 |
| 31. 반감기·계절성 외 7종 | 비트코인 최대 서사 '반감기 4년 사이클'을 처음으로 검정 → 기각. 리브-원-사이클-아웃 표본외 ρ=+0.303 으로 통과처럼 보였으나, 반감기 날짜를 ±20개월 옮겨도 같은 값(+0.300, p=0.47) — 잡히는 건 반감기가 아니라 '4년쯤 되는 무언가'였다(네 번째 함정: 오귀인). 귀무가설을 셔플→순환이동으로 바꾸니 p가 0.004→0.065. 계절성은 다중검정 보정 시 유의한 달·요일 없음. 스테이블코인·ETH/BTC 는 비순환이지만 국면마다 부호 뒤집힘. FOMC 금리변경일도 무작위와 동일(p=0.41). 드로다운은 뒤집혔다 — 깊은 하락(−76%) 후 6개월 +32.5% vs 고점 부근 +45.7% |
| 32. 구조적 검정 — 질문을 바꾸다 | 새 데이터가 아니라 새 질문 셋. (1) '수익률' 대신 '변동성'을 예측하나 → 10개 중 6개가 기준선 돌파해 보였으나 전부 수준끼리 잰 추세 착시(시간→변동성 −0.42). 변화율로 재니 DXY·나스닥·해시레이트가 0 으로 소멸. 내가 이 저장소 제1원칙을 스스로 어겼다. (2) 다변량 결합 → 학습 +0.42 / 검증 −0.015 (교과서적 과적합). (3) 임계효과 → 거래소잔고만 눈에 띄나 다중검정 수준 |
| 33. 관련성 지도 | "모델에 넣을 수 있나"가 아니라 "무엇과 관련 있나"를 따로 잰 지도. 전 구간으로 뭉개면 나스닥이 +0.25 라 '조금 관련 있음'으로 잘못 읽히는데, 국면을 나누면 +0.23(2013 |
btc-core fetch --save data/market.csv # 시계열 받아 저장
btc-core init # 수동 입력 템플릿 생성
btc-core score --csv data/market.csv # 점수와 실행 계획
btc-core commit --ladder distribute # 실행한 계단 기록
btc-core history # 지금까지 밟은 계단
btc-core explain mvrv_z # 지표의 앵커 표
python3 tools/backtest.py --csv data/market.csv # 전체 이력 백테스트주요 옵션:
| 옵션 | 설명 |
|---|---|
--format console|markdown|json |
출력 형식 |
--out <경로> |
파일로 저장 |
--as-of YYYY-MM-DD |
과거 시점으로 평가 |
--adaptive-weight 0.0 |
퍼센타일 혼합 끄기 (고정 앵커만) |
--config <경로> |
다른 전략 설정 사용 |
config/strategy.yaml ← 전략의 단일 진실 공급원. 임계값은 코드에 없다
src/btc_core/
normalize.py 원시값 → [-1,+1] (꺾은선 + 퍼센타일 혼합)
series.py 이동평균·표준편차 (표준 라이브러리만)
indicators.py 지표 계산
score.py 계열 집계 → BCS / LRS / 합의 게이트
strategy.py 밴드 → 사다리 → 히스테리시스 → 바닥선
engine.py 조립
report.py 콘솔 / 마크다운 / JSON
cli.py
datasources/ CoinMetrics · CSV · 수동입력
derive.py 반감기 스케줄로 유통량·발행량·시총 계산 (API 불필요)
docs/ 설계 문서 22편
journal/TEMPLATE.md 판단 기록 템플릿 (원문 6.4)
tests/ 337개
tools/backtest.py 16년 이력 백테스트
tools/screen_candidate.py 신규 지표 6관문 검정
tools/screen_indicator.py 신규 지표 선별 검정 (1세대)
tools/bottom_study.py 사이클 저점 공통점 연구
tools/robustness.py 자유도 계수 · 교란 실험 · 정규화 일반화
tools/cross_asset.py BTC 설정을 LTC·ETH 에 적용 (표본 외)
tools/probe_sources.py 공개 데이터 경로 진단
tools/lppls.py LPPLS 거품 모형 적합 (표준 라이브러리만)
tools/export_viz.py 하루씩 구간·계열 계산 → JSON
tools/build_viz.py 자기완결 시각화 페이지 굽기
tools/refresh_data.py CSV 증분 갱신 (검증 후에만 쓴다)
tools/audit_config.py 기준 간 상호 모순 감사
viz/_head.html 스타일 (네 장 공용)
viz/_nav.html 머리띠 (페이지 이동 + 언어·테마)
viz/_script.html 차트 엔진 (네 장 공용)
viz/_i18n.html 본문 산문의 영어 판
viz/*.body.html 페이지별 본문 넷
viz/site/ 생성된 페이지 네 장
config/strings.en.yaml 지표·갈래·구간 이름의 영어 판
의존성은 PyYAML 하나뿐이다. 나머지는 표준 라이브러리로 구현했다.
python3 -m pytest tests/ -q # 337 passed네트워크 없이 전부 통과한다. 합성 시계열로 사이클 전 구간을 훑는 회귀 테스트가 포함돼 있다.
여기에 더해 16년 실제 데이터(2010-07 ~ 2026-07, 5,854일)로 전략 전체를 하루씩 돌린 백테스트가 있다. 이 검증으로 설계 결함 세 개를 찾아 고쳤다 — 상단 앵커의 노후화, 사다리 무한 재발동, 코어 지분 미보호. 자세한 내용은 07 실측 검증, 결과 보고서는 reports/backtest-2026-07.md.
python3 tools/backtest.py --csv data/market.csv --out reports/backtest.md
python3 tools/screen_indicator.py --csv data/market.csv --out reports/screen.md
python3 tools/bottom_study.py --csv data/market.csv --out reports/bottoms.md
python3 tools/audit_config.py # 기준 간 모순 감사지표를 새로 넣으려면 먼저 screen_indicator.py 를 통과해야 한다. 선행 수익률과의
순위상관, 사분위 분리도, 기존 지표와의 중복도, 절대 수준의 안정성 네 가지를 본다.
이 관문으로 후보 6개 중 5개를 걸러냈다 —
자세한 내용은 08 지표 선별.
임계값은 코드가 아니라 config/strategy.yaml에 있다. 가중치, 앵커, 사다리 계단,
히스테리시스 파라미터를 전부 거기서 고친다.
설정을 읽을 때마다 아홉 가지를 검사한다 — 가중치 합 100, 밴드가 −100~100을 빈틈 없이 덮는지, 매도 사다리 누적이 코어 지분을 침범하지 않는지 등. 하나라도 어긋나면 프로그램이 시작하지 않는다. 가중치를 손으로 고치다 합이 97이 되는 실수는 언젠가 반드시 일어나고, 그때 조용히 잘못된 점수가 나오는 것보다 멈추는 편이 낫다.
그 검사는 한 항목 안의 형식만 본다. 항목들 사이의 관계는 별도 도구가 본다.
python3 tools/audit_config.py커버리지 하한 때문에 도달 불가능한 계열 조합이 있는지, 저점 프로파일 조건 중 수학적으로 같은 것이 있는지, 합의 게이트가 데이터가 적을수록 오히려 엄해지지는 않는지를 확인한다. 값을 하나 고칠 때 조용히 깨지는 것들이라 설정을 손볼 때마다 돌리는 편이 좋다.
- BCS 점수 지표는 전부 자동 계산된다. 거시 축(LRS)도 M2 임펄스는 중국 M2에서
자동 계산되고(
fetch_macro.py), 수동 입력에 남은 것은 LRS 3종(DXY·연준·ETF)과 바닥선 2개(LTH 실현가격, CVDD)뿐이다 — 바닥선 4개 중 2개(200주 MA, 실현가격)는 자동 계산된다. 어느 쪽도 방향 판단을 바꾸지 않는다 — LRS 는 실행 '크기'만 조절하고, 바닥선은 점수가 아니라 참고 가격이다. 수동 3종은 45일 지나면 경고, 120일 지나면 자동 결측 처리된다. - BCS 는 점이 아니라 구간으로 표시된다. 지표를 하나씩 빼고 다시 계산한 값들의 범위이고, 새 파라미터가 하나도 없다 — 폭은 데이터가 정한다. 16년 중위 폭이 16.6점이고, 구간이 한 밴드 안에 온전히 들어오는 날은 45.8% 뿐이다. 절반이 조금 안 되는 날만 국면을 하나로 말할 수 있다는 뜻이다. 앵커를 ±50% 왜곡하는 전혀 다른 실험도 ±16점을 냈다 — 두 방법이 같은 크기를 가리키면 그게 이 시스템의 실제 해상도다 (19 BCS 구간 표시, 14 과적합 노출도).
- 구간은 표시 전용이다. 밴드·사다리·DCA 는 점수 하나로만 결정된다. 구간으로 게이트를 걸면 "구간이 걸치면 보류" 같은 새 규칙이 생기고 그건 자유도를 늘리는 일이다. 테스트로 못 박아 뒀다.
- 조정 가능한 숫자가 269개인데 유효 표본은 사이클 4개다. 비율로는 67:1 로
변명할 수 없다. 그래서
tools/robustness.py로 "그 숫자들이 실제로 결론을 떠받치는가"를 따로 재고, 못 믿을 숫자(프로파일 임계)는 점수 밖으로 뺐다. 고정 앵커는 실제로 사이클을 넘지 못한다. 그래서 기본 정규화를 퍼센타일 전용으로 바꿨다 — 근거는 비트코인 백테스트가 아니라 라이트코인·이더리움 전환점 21곳의 표본 외 검증이다(포착률 76.2% vs 앵커 66.7%, 15 교차자산 검증). - 앵커는 2025 사이클 실측에 맞춰져 있다. 16년치로 검증하면서 상단 앵커를 전면 재조정했다(07 실측 검증). 다음 사이클의 고점이 더 낮으면 또 못 잡는다. 감쇠가 계속된다는 데 베팅하지 않고 관측된 마지막 사이클에 맞췄을 뿐이다.
- 가중치와 사다리 트리거 자체는 여전히 백테스트로 최적화하지 않았다. 표본 사이클이 네 번뿐인 상황에서 최적화하면 과적합이 된다. 논리로 정하고 반증 조건을 붙이는 쪽을 택했다.
- '코인 나이 분포'라는 독립 축이 없다. 보유자 행동 계열을 뺀 대가다. 남은 3계열은 원가·가격·채굴을 보는데, 코인이 얼마나 오래 잠들어 있는지는 아무도 보지 않는다. CoinMetrics 커뮤니티 티어에는 HODL 웨이브도 휴면일수도 SOPR 도 없다(BTC 지표 31개 전수 확인). 자동화하려면 구독 데이터가 필요하다 — 10 보유자 계열 제거.
- 밸류에이션 하나가 40%다.
max_abs집계라 그 안의 지표 하나가 40% 를 혼자 끌고 간다. 16년 백테스트 내내 실효 가중치가 이미 40 이었으므로 새로 생긴 위험은 아니지만, 이제는 설정에도 그렇게 적혀 있다. - 계열이 생각만큼 독립이 아니다. 합의 게이트는 '계산 원리가 다른 계열
2개가 같은 방향'을 요구하는데, 실제로 재보니 밸류에이션↔가격 ρ +0.83
이다. Puell 은 더 심해서 GRM 과 +0.89 였다 — 반감기 사이 발행량이 약분돼
사실상
가격 ÷ MA365(가격)이었다. 기준선을 반감기 너머(1460일)로 옮겨 +0.495 로 낮췄지만 밸류에이션↔가격은 그대로다. INV-5 로 못 박았다 — 13 계열 독립성 점검. - 고점 탐지력이 사이클마다 약해지고 있다. 네 고점에서의 4년 퍼센타일이 Puell +0.99 → +1.00 → +0.46 → −0.00, Pi Cycle +0.47 → +0.86 → −0.02 → −0.00 으로 무너졌다. 대체 후보 8개를 검정했지만 점수 지표로 채택할 만한 것은 없었고, 대신 표시 전용 고점 프로파일을 만들었다 — 11 지표 발굴 2차.
- 지표 사이트 466개를 전수 조사했고 새로 채택한 것은 없다. 59%는 공개 데이터로 원천 시계열을 만들 수 없고(UTXO 나이 분포·CDD·SOPR 계열), 계산 가능한 것 중 심사한 9개는 전부 기각됐다 — Top Cap, Delta Top, Delta Cap, RSI-14, MACD, 볼린저 %B 같은 유명한 것들이 여기 포함된다. 구독을 하나만 산다면 온체인이다(168건, 61% 해제) — 16 지표 전수조사.
- 유명한 지표는 대개 이미 들어 있다. 미심사 후보 13건을 추가로 검정했더니 8건이 상관으로 걸렸다 — Ahr999(+0.92), Bitcoin Profitable Days(+0.97), Mayer(+0.91), Pi Cycle Bottom(+0.90), Sharpe(+0.92), AASI(+0.88), Investor Price(+0.94). 공개적으로 구할 수 있는 재료가 6개뿐이라 조합만 다를 뿐 같은 정보를 본다. 새 지표를 찾는 일의 기대수익은 낮다 — 17 미심사 후보 검정.
- 내 검정 관문에도 구멍이 있었다. MVRV 모멘텀이 전환점 8곳을 깨끗하게 통과했는데 십분위가 단조 증가(ρ +0.23)였다 — 사이클 위치가 아니라 모멘텀을 재고 있었다. 전환점 8곳은 표본이 8이다. 전 표본을 보는 검사와 어긋날 때 그것 자체를 실패로 세는 게이트를 추가했다.
- 실현시총이 유일한 단일 장애점이다. 나머지는 전부 계산되거나 대안이 있는데, 실현시총만 체인 전체를 훑어야 나오고 공개 경로가 2개뿐이다 (CoinMetrics 역산 / BGeometrics). 둘 다 막히면 밸류에이션 계열 40 중 서멀캡만 남는다 — 18 무료 데이터 경로.
- 고점 탐지 실패는 지표 선택의 문제가 아니다. 가장 유망하던 미검정 후보 LPPLS 를 실제로 적합시켜 봤다. 방향은 8/8 맞았지만 "최근 1년 수익률 부호"라는 한 줄짜리 기준선도 8/8 이었다. 그리고 네 고점에서 달성 가능한 최소 오차가 0.09 ~ 0.31 로 3.4배 차이라 한 임계로 네 사이클을 다룰 수 없었다. 2013년 고점과 2025년 고점은 구조 자체가 다르다 — 지표를 바꿔서 해결할 문제가 아니라는 뜻이다 (20 LPPLS 검정).
- 거래소 API 연동이 없다. 의도적이다. 실행 버튼은 사람이 누른다.
코드는 MIT, 데이터는 각 제공처 조건을 따른다. 둘은 별개다.
⚠️ 핵심 주의:data/market.csv는 Coin Metrics 커뮤니티 데이터 파생물이고 CC BY-NC 4.0(출처표시 + 비상업적 사용만) 이다. BCS 점수의 뿌리(price·realized_cap)가 여기서 나오므로, 이 저장소를 상업적으로 쓰려면 그 데이터와 파생물(사이트 차트·점수 포함)을 그대로 쓸 수 없다. 개인 연구·공개 공유는 해당 없다.
이 프로젝트는 다음 공개 데이터에 기대고 있다.
| 데이터 | 제공처 | 라이선스 | 상업적 이용 |
|---|---|---|---|
| 가격·실현시총·해시레이트·주소수·거래소 흐름 | Coin Metrics 커뮤니티 | CC BY-NC 4.0 | ❌ 불가 |
| 나스닥·M2·DXY·실질금리·연준 유동성·국채·원자재 | FRED (세인트루이스 연준) | 미국 정부 저작물(퍼블릭 도메인) | ✅ 가능 |
| S&P500·금(LBMA) | GitHub 공개 데이터셋(VIX 는 FRED) | 데이터셋별 상이 | |
| 중국 M2 | 중국인민은행 货币供应量 (예비: 国家统计局 · OECD) | 공식 통계 · 출처 표기 시 전재 허용 · CC BY 4.0 | ✅ 출처 표기 |
기각된 거시 열(dxy·realyield·net_liq·kospi·hy_spread 등)은 전부 FRED라 퍼블릭 도메인이고, 점수·사이트에는 들어가지 않는다. 자세한 내용과 상업적 이용 시 대안은 DATA-SOURCES.md 참고.
(선의의 요약이며 법률 자문이 아니다. 상업적 이용을 계획한다면 원문을 직접 확인할 것.)
이 저장소는 정보 제공과 개인 기록을 목적으로 하며 투자 자문이 아닙니다. 모든 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있습니다.