MACD를 손으로 계산해보기
— 종가 42개를 끝까지 따라가는 워크스루

최종 수정: 2026-07-14 · 작성: Y-Systems · 이 글은 설명이 아니라 실습 기록입니다

먼저 실패부터 보여드리겠습니다. 종가 30개를 준비해 표준 MACD(12·26·9)를 돌리면 MACD선은 5개 나오고, 시그널선은 0개, 히스토그램은 0개 나옵니다. 한 달치 데이터로는 MACD 히스토그램을 단 하나도 만들 수 없습니다. 이 사실을 아는 사람은 의외로 적습니다. MACD를 “12일선과 26일선의 차이” 정도로만 배웠기 때문입니다.

그래서 이 글은 정의부터 시작하지 않습니다. 종가 42개를 실제로 대입해 EMA12 → EMA26 → MACD선 → 시그널선 → 히스토그램 → broodev 부분점수까지 한 봉씩 계산기로 따라갑니다. 계산기 하나만 있으면 이 글의 모든 숫자를 직접 재현할 수 있고, 재현되지 않는다면 저희가 틀린 것입니다.

워크스루에 들어가기 전에, 이 글이 다루는 계산을 실제 BTC 데이터에 적용한 결과를 먼저 봅니다. 아래 42개 종가 실습과 똑같은 식(EMA12−EMA26, 시그널 EMA9)입니다.

차트 데이터를 불러오는 중…
차트 데이터를 불러오는 중…

최근 2년의 BTC 가격(위)과 MACD(12,26,9)(아래). 막대 = 히스토그램(MACD선−시그널선, 초록 양수/빨강 음수). MACD 값의 절대 크기는 가격 규모에 비례합니다 — 본문이 절대값 대신 방향을 보는 이유입니다. 데이터: CoinMetrics Community API, BTC 일봉 종가 — 방문 시점에 받아 브라우저에서 계산한 근사치·참고용입니다.

준비물 — 이 글 전체에서 쓸 종가 42개

가상의 자산입니다. 100에서 시작해 74.3까지 −25.7% 하락한 뒤 반등하는 경로로 만들었습니다. 암호화폐에서 흔한 모양이면서, 계산 결과가 극적으로 갈리는 구간(바닥권)을 포함하도록 설계했습니다.

1~6일   100.0  99.1 100.4  98.6  99.3  97.8
7~14일   96.2  97.1  94.8  93.5  94.2  91.7  90.3  91.1
15~22일  88.6  87.2  88.0  85.4  83.9  84.7  82.1  80.6
23~30일  81.3  79.2  77.8  78.5  76.4  75.1  76.0  74.3   ← 30일차가 최저점(74.3)
31~36일  75.6  74.8  76.9  78.2  77.5  79.8
37~42일  81.4  80.6  83.1  84.7  83.9  86.2
단위는 신경 쓰지 마세요. 뒤에서 증명하겠지만 broodev의 MACD 부분점수는 가격 규모에 완전히 불변(scale-invariant)입니다. 이 42개 종가에 700을 곱해 비트코인 가격대(58,730달러)로 만들어도 부분점수는 소수점 넷째 자리까지 똑같이 나옵니다. 그래서 읽기 쉬운 100 근처 숫자를 씁니다.

STEP 1

SMA 대신 EMA를 쓰는 이유 — “12일 전 봉이 오늘의 신호를 만든다”

교과서는 “EMA가 최근 가격에 더 민감해서 빠르다”고 말하고 끝냅니다. 그 문장은 절반만 맞습니다. 같은 42개 종가로 SMA 버전 MACD(SMA12−SMA26)EMA 버전 MACD(EMA12−EMA26)를 나란히 돌려봤습니다.

일자종가EMA 버전 MACD선SMA 버전 MACD선
2678.5−6.948−6.946
2776.4−6.968−7.054
2875.1−7.008 ← EMA 저점−7.140
2976.0−6.888−7.201 ← SMA 저점
3074.3−6.851−7.192
3175.6−6.640−6.972
3478.2−5.613−6.076
3880.6−3.639−3.756
4084.7−2.411−1.875
4183.9−1.954−1.036
4286.2−1.389−0.006

결과 1 — 저점은 EMA가 한 봉 빨랐다

EMA 버전은 28일차에 저점(−7.008)을 찍고 돌아섰고, SMA 버전은 29일차(−7.201)에 찍었습니다. 한 봉 차이입니다. 게다가 EMA 쪽 저점이 더 얕습니다(−7.008 vs −7.201). 여기까진 교과서 설명대로입니다.

결과 2 — 그런데 0선 복귀는 SMA가 더 빨랐다

42일차를 보세요. SMA 버전은 −0.006으로 사실상 0선을 뚫었는데, EMA 버전은 아직 −1.389입니다. “EMA가 항상 빠르다”는 말이 여기서 깨집니다. 왜 SMA가 갑자기 튀었을까요?

41일차 → 42일차에 SMA 버전 MACD선은 −1.036에서 −0.006으로 하루 만에 +1.030 움직였습니다. 같은 날 EMA 버전은 +0.565밖에 움직이지 않았습니다. 두 배 가까운 차이입니다. 계산해 보면 원인이 나옵니다.

SMA12(42일차) − SMA12(41일차)
  = (새로 들어온 42일차 86.2 − 창 밖으로 빠진 30일차 74.3) ÷ 12
  = 11.9 ÷ 12
  = +0.9917          ← 오늘 가격이 아니라 "30일차 봉이 사라진 것"의 효과

SMA26 쪽 변화 = (86.2 − 16일차 87.2) ÷ 26 = −0.0385

SMA 버전 MACD 변화 = +0.9917 − (−0.0385) = +1.030   ✅ 표와 일치

이것이 SMA를 쓰면 안 되는 진짜 이유입니다. 42일차 SMA 신호의 대부분은 오늘 가격이 올라서 생긴 게 아니라, 12일 전(30일차)의 최저가 74.3이 이동평균 창 밖으로 툭 떨어져서 생긴 것입니다. 오늘 시장에서는 아무 일도 일어나지 않았는데, 12일 전에 있었던 일이 오늘의 매수 신호를 만듭니다. 업계에서 ‘창 이탈 효과(drop-off effect)’라 부르는 현상입니다.

EMA에는 창이 없습니다. 오래된 가격의 가중치가 (1−α)ⁿ로 지수적으로 서서히 사라질 뿐, 어느 날 갑자기 계산에서 퇴출되지 않습니다. 그래서 EMA 버전은 같은 날 +0.565로 매끄럽게 움직였습니다.

정리하면 — EMA를 쓰는 이유는 “빨라서”가 아니라 “유령 신호를 만들지 않아서”입니다. SMA는 반전 시점에서 한 봉 느린 대신, 엉뚱한 시점에서 12일 전 봉이 만든 가짜 급변을 뿌립니다. 신호의 속도보다 신호의 원인이 중요합니다.

STEP 2

EMA12를 계산기로 두들겨보기

broodev가 쓰는 EMA는 period개의 단순평균을 시드(seed)로 삼고, 그 뒤부터 지수 갱신하는 방식입니다. α = 2 ÷ (기간 + 1)입니다. EMA12라면 α = 2/13 = 0.153846.

// broodev 실제 코드 (apps/btc/index.html)
function ema(values, period) {
  const alpha = 2 / (period + 1)
  let seed = 0
  for (let i = 0; i < period; i++) seed += values[i]
  let prev = seed / period          // ← 시드 = 앞 period개의 단순평균
  out[period - 1] = prev
  for (let i = period; i < values.length; i++) {
    prev = values[i] * alpha + prev * (1 - alpha)
    out[i] = prev
  }
}

이제 위 42개 종가를 넣습니다. 12일차에 시드가 하나 생기고, 13일차부터 갱신이 시작됩니다.

12일차 시드 = (100.0 + 99.1 + 100.4 + ... + 91.7) ÷ 12
            = 1162.7 ÷ 12 = 96.8917

13일차 = 90.3 × 0.153846 + 96.8917 × 0.846154 = 95.8776
14일차 = 91.1 × 0.153846 + 95.8776 × 0.846154 = 95.1426
15일차 = 88.6 × 0.153846 + 95.1426 × 0.846154 = 94.1360
16일차 = 87.2 × 0.153846 + 94.1360 × 0.846154 = 93.0689
17일차 = 88.0 × 0.153846 + 93.0689 × 0.846154 = 92.2891

핵심은 “어제 EMA의 84.6%에 오늘 종가의 15.4%를 얹는다”는 것뿐입니다. 가중치는 매일 같고, 과거는 매일 84.6%씩 희석됩니다. 30일 전 종가의 가중치는 0.153846 × 0.846154³⁰ ≈ 0.0009 — 0.1%도 안 됩니다. 하지만 0은 아닙니다. 이 차이가 STEP 1의 결론이었습니다.

STEP 3

EMA26과 MACD선 — 26일차에야 첫 값이 나온다

EMA26은 α = 2/27 = 0.074074. 시드는 1~26일차 단순평균입니다.

26일차 시드 = 2341.4 ÷ 26 = 90.0538
27일차 = 76.4 × 0.074074 + 90.0538 × 0.925926 = 89.0425
28일차 = 75.1 × 0.074074 + 89.0425 × 0.925926 = 88.0097
29일차 = 76.0 × 0.074074 + 88.0097 × 0.925926 = 87.1201
30일차 = 74.3 × 0.074074 + 87.1201 × 0.925926 = 86.1704

EMA26의 시드가 26일차에 처음 생기므로, MACD선(EMA12 − EMA26)의 첫 값도 26일차입니다. 25일차까지는 MACD선 자체가 존재하지 않습니다.

MACD선(26일차) = EMA12(83.106) − EMA26(90.054) = −6.948

여기서 첫 번째 중요한 관찰이 나옵니다. 26일차부터 34일차까지 MACD선을 늘어놓아 보세요.

일자종가MACD선메모
2678.5−6.948
2776.4−6.968
2875.1−7.008MACD선 저점
2976.0−6.888반등 시작
3074.3−6.851가격은 더 낮은 저점, MACD는 더 높은 저점
3175.6−6.640
3274.8−6.463
3376.9−6.084
3478.2−5.613

28일차 종가 75.1 → 30일차 종가 74.3. 가격은 더 낮은 저점을 만들었습니다(−1.1%). 그런데 MACD선은 −7.008 → −6.851, 더 높은 저점을 만들었습니다. 이걸 상승 다이버전스(bullish divergence)라 부릅니다. “가격은 신저가인데 하락 속도는 이미 느려지고 있다”는 뜻입니다.

그리고 이 워크스루에서 가격의 진짜 바닥은 30일차였습니다. MACD선은 28일차에 이미 돌아섰습니다. 지표가 가격보다 두 봉 먼저 방향을 바꿨습니다. 기억해 두세요 — 이게 STEP 6에서 “왜 절대값이 아니라 방향인가”의 근거가 됩니다.

STEP 4

시그널선 — 여기가 30봉으로 안 되는 지점

시그널선은 MACD선의 EMA9입니다. 즉 EMA의 EMA입니다. MACD선이 26일차부터 시작하니, 시그널선의 시드(MACD선 9개의 평균)는 26일차부터 34일차까지가 다 모여야 만들어집니다.

시그널 시드(34일차)
 = MACD선 26~34일차 9개의 평균
 = (−6.9479 −6.9682 −7.0084 −6.8882 −6.8512
    −6.6404 −6.4634 −6.0835 −5.6129) ÷ 9
 = −59.4641 ÷ 9
 = −6.6071

히스토그램(34일차) = MACD선(−5.613) − 시그널선(−6.6071) = +0.994   ← 첫 값!

이제 35일차부터는 α = 0.2로 갱신합니다.

35일차 시그널 = −5.2360 × 0.2 + (−6.6071) × 0.8 = −6.3329
              히스토그램 = −5.2360 − (−6.3329) = +1.0969
36일차 시그널 = −4.6976 × 0.2 + (−6.3329) × 0.8 = −6.0058
              히스토그램 = −4.6976 − (−6.0058) = +1.3083
37일차 시그널 = −4.0946 × 0.2 + (−6.0058) × 0.8 = −5.6236
              히스토그램 = −4.0946 − (−5.6236) = +1.5290
왜 30봉으로는 히스토그램이 0개인가
26(EMA26 시드) + 9(시그널 시드) − 1 = 34. 히스토그램의 첫 값은 아무리 빨라도 34번째 봉입니다. 그런데 broodev는 히스토그램의 직전 대비 변화를 보므로 2개가 필요합니다 → 35봉. 그래서 코드에 이 가드가 있습니다.
if (closes.length >= 35) { ... }   // ← 35봉 미만이면 MACD 부분점수 = null
MACD가 null이면 가중치 재정규화가 작동해 나머지 5개 지표로 점수를 내고 coverage 5/6로 표시합니다. 신규 상장 코인에서 자주 보게 되는 상태입니다.

덧붙이면, 35봉은 최소 조건이지 충분 조건이 아닙니다. 34일차 히스토그램은 시그널 시드가 MACD선 9개짜리 단순평균이라 아직 “덜 익은” 값입니다. 실전에서 안정적인 히스토그램을 보려면 최소 60~80봉은 쌓여야 합니다. 이 문제는 이 글 끝의 부록 A에서 숫자로 다시 다룹니다.

STEP 5

전체 계산표 — 26일차부터 42일차까지

여기까지의 모든 값을 한 표에 모았습니다. Δ히스토그램은 “직전 봉 대비 히스토그램 변화”이고, 단기·장기는 broodev가 이 값으로 산출하는 MACD 부분점수(0~100)입니다. 회색 줄은 계산 자체가 불가능한 구간입니다.

일자종가EMA12EMA26MACD선시그널히스토그램Δ히스토그램단기점수장기점수
2678.583.10690.054−6.948
2776.482.07489.042−6.968
2875.181.00188.010−7.008
2976.080.23287.120−6.888
3074.379.31986.170−6.851
3175.678.74785.387−6.640
3274.878.14084.603−6.463
3376.977.94984.033−6.084
3478.277.98883.601−5.613−6.607+0.994
3577.577.91383.149−5.236−6.333+1.097+0.10391.876.5
3679.878.20382.901−4.698−6.006+1.308+0.21194.683.0
3781.478.69582.789−4.095−5.624+1.529+0.22194.683.1
3880.678.98882.627−3.639−5.227+1.587+0.05887.870.2
3983.179.62182.662−3.042−4.790+1.748+0.16193.780.5
4084.780.40282.813−2.411−4.314+1.903+0.15593.580.0
4183.980.94082.894−1.954−3.842+1.888−0.01477.957.4
4286.281.74983.139−1.389−3.351+1.962+0.07488.971.8

표에서 MACD선은 42일차까지도 계속 음수(−1.389)라는 점에 주목하세요. “MACD가 0선 위로 올라가야 매수”라는 규칙을 따랐다면 이 반등 구간에서 단 한 번도 매수 신호를 못 받습니다. 반면 히스토그램은 34일차에 이미 양수(+0.994)입니다. 히스토그램은 MACD선이 시그널선을 추월했는가를 보는 값이라, 0선 돌파보다 훨씬 빠릅니다.

그리고 41일차를 보세요. 이 한 줄이 다음 STEP의 전부입니다.

STEP 6

여기서 broodev가 교과서와 갈라진다 — 절대값이 아니라 방향

지금까지는 표준 MACD였습니다. 어떤 차트 프로그램에서도 같은 값이 나옵니다. 이제부터가 broodev 고유의 부분입니다. 히스토그램(0~무한대 범위의 실수)을 0~100 점수로 바꾸는 함수를 소스 그대로 공개합니다.

// 단기(모멘텀) 매핑 — MACD 가중치 14%
const momMacd = (cur, prev, px) => clamp(
    50
  + 30 * tanh( (cur / px)          * 800 )    // ① 히스토그램의 레벨
  + 15 * tanh( ((cur - prev) / px)  * 800 )    // ② 직전 대비 방향
, 0, 100)

// 장기(역발상) 매핑 — MACD 가중치 18%
const conMacd = (cur, prev, px) => clamp(
    50
  + 25 * tanh( ((cur - prev) / px)  * 600 )    // ② 직전 대비 방향
  + 10 * tanh( (cur / px)          * 600 )    // ① 히스토그램의 레벨
, 0, 100)

두 함수는 구조가 같고 계수가 뒤집혀 있습니다. 이게 전부입니다.

의미단기(모멘텀) 계수장기(역발상) 계수
① 레벨지금 히스토그램이 얼마나 큰가 (절대값)3010
② 방향직전 봉보다 커졌는가 작아졌는가 (Δ)1525
레벨 : 방향 비율2 : 11 : 2.5
tanh 게인클수록 작은 변화에 빨리 포화800600

단기 모드는 레벨을 2배 무겁게 봅니다. 추세가 얼마나 강한지가 중요하니까요.
장기 모드는 방향을 2.5배 무겁게 봅니다. 히스토그램이 아직 깊은 음수여도, “어제보다 나아졌는가”가 점수를 지배합니다.

같은 히스토그램, 다른 방향 — 점수는 얼마나 갈리나

가격 100 기준으로, 히스토그램 값은 같은데 직전 대비 방향만 다른 네 가지 상황을 넣어봤습니다.

상황히스토그램직전 값단기점수장기점수
깊은 음수인데 강하게 상향 전환−0.30−0.4533.058.4
깊은 음수이고 계속 하락−0.30−0.158.022.6
얕은 양수인데 꺾이는 중+0.10+0.2557.437.5
얕은 양수이고 상승 중+0.10+0.0278.466.5

1행과 2행을 비교하세요. 히스토그램 값은 −0.30으로 똑같습니다. 방향만 다릅니다. 그런데 장기 부분점수는 22.6 → 58.4로 35.8점 벌어집니다. 절대값만 보는 모델이라면 두 상황은 구별되지 않습니다. 둘 다 “나쁨”입니다.

그런데 1행은 STEP 3에서 본 28일차 그 자리입니다. 가격이 신저가를 만들던 순간, 하락 압력이 줄어들기 시작한 바로 그 봉. 절대값만 봤다면 그 봉을 “최악”으로 채점했을 겁니다. 실제로는 바닥에서 두 봉 전이었습니다.

3행과 4행은 반대 방향의 같은 이야기입니다. 히스토그램이 양수(+0.10)라 절대값 모델에겐 둘 다 “좋음”이지만, 하나는 꺾이는 중이고 하나는 오르는 중입니다. 장기점수는 37.5 vs 66.5로 갈립니다.

한 문장으로 — 히스토그램의 절대값은 “지금 얼마나 좋은가”를 말하고, 직전 대비 변화는 “앞으로 좋아지는 중인가”를 말합니다. 장기 매집 관점에서 우리가 사고 싶은 건 이미 좋아진 자산이 아니라 나빠지길 멈춘 자산입니다. 그래서 장기 매핑에서 방향 계수(25)가 레벨 계수(10)를 압도합니다.

대가: tanh가 빨리 포화한다 (41일차의 교훈)

공짜는 없습니다. 방향을 무겁게 보면 미세한 잡음에도 점수가 크게 흔들립니다. STEP 5 표의 41일차가 그 증거입니다.

40일차: Δ히스토그램 = +0.155  (가격 84.7 대비 +0.183%)  → 장기점수 80.0
41일차: Δ히스토그램 = −0.014  (가격 83.9 대비 −0.017%)  → 장기점수 57.4

방향 항 계산:
  40일차 → 25 × tanh(600 × 0.00183)  = 25 × tanh( 1.098) = +20.0
  41일차 → 25 × tanh(600 × (−0.00017)) = 25 × tanh(−0.100) = −2.5
  차이 −22.5점   ← 장기 부분점수 하락폭(−22.6)과 일치

가격의 0.017%에 해당하는 히스토그램 미세 하락 하나로 장기 부분점수가 22.6점 빠졌습니다. 원인은 tanh의 포화입니다. tanh(1.098) ≈ 0.80 — 즉 Δ가 가격의 0.18%만 돼도 방향 항은 이미 최대치(25점)의 80%를 먹습니다. 그 뒤로는 아무리 커져도 더 안 오릅니다. 반대로 부호가 바뀌면 그 20점이 즉시 사라집니다.

이 포화 곡선을 표로 보면 명확합니다.

Δ히스토그램 ÷ 가격단기 방향 항 (최대 15)장기 방향 항 (최대 25)
0.010%1.201.50
0.025%2.963.72
0.050%5.707.28
0.100%9.9613.43
0.200%13.8320.84
0.400%14.9524.59
0.800%15.00 (포화)25.00 (포화)

0.4%를 넘어가면 두 항 모두 사실상 최대치입니다. 그 이상은 아무 정보도 추가하지 않습니다. 즉 “히스토그램이 어마어마하게 크다”는 정보는 broodev 점수에 거의 반영되지 않습니다. 폭등장에서도 MACD 부분점수는 100 근처에 붙어 더 이상 올라가지 않습니다. 이건 의도된 설계(극단값이 종합 점수를 지배하지 못하게)이지만, 동시에 명백한 정보 손실입니다. 솔직히 적어둡니다.

STEP 7

횡보장 실험 — 아무 일도 안 일어났는데 점수는 21~83을 왕복한다

이제 최악의 상황을 숫자로 보겠습니다. 새 데이터셋을 만듭니다: 60봉 동안 98.4 ~ 101.5 사이를 오가는 완전한 횡보장. 전체 변동폭이 ±1.5%입니다. 60일 동안 시장에서 사실상 아무 일도 일어나지 않았습니다.

여기에 같은 MACD(12·26·9)를 돌리고, 같은 broodev 매핑을 태웠습니다.

일자종가히스토그램부호뒤집힘단기점수장기점수
34100.1+0.117+83.071.2
3598.9+0.015+43.537.2
3699.6−0.004FLIP46.846.9
37100.8+0.062+FLIP70.862.8
38101.3+0.132+81.066.4
39100.0+0.087+62.848.2
4098.7−0.029FLIP32.133.1
4199.4−0.05534.542.9
42100.6+0.009+FLIP59.159.6
43101.0+0.074+72.963.4
4499.9+0.041+55.647.5
4598.8−0.052FLIP28.534.2
4699.9−0.03743.250.1
47101.1+0.051+FLIP70.665.0
48100.4+0.059+64.254.6
4999.2−0.015FLIP38.338.5
5098.6−0.09921.132.8
5199.9−0.06440.151.6
52100.9+0.027+FLIP65.463.8
53100.2+0.037+60.053.8
5499.1−0.028FLIP36.239.0
5598.9−0.07927.137.9
56100.2−0.02450.556.5
57101.0+0.063+FLIP72.965.5
58100.3+0.071+66.255.1
5999.3+0.008+45.041.5
6099.8+0.001+49.348.9

집계하면 이렇습니다.

항목
히스토그램이 나온 봉27봉 (34~60일차)
히스토그램 부호가 뒤집힌 횟수10회 — 평균 2.7봉마다 한 번
히스토그램 최대 절대값0.132 (가격의 0.13%)
단기 부분점수 범위21.1 ~ 83.0 → 폭 61.9
장기 부분점수 범위32.8 ~ 71.2 → 폭 38.4
단기 부분점수 평균52.6 (중립)
장기 부분점수 평균50.7 (중립)

27봉 동안 매수/매도 신호가 10번 뒤집혔습니다. 이게 whipsaw(휩쏘)입니다. 고전적인 “히스토그램이 0선을 위로 돌파하면 매수, 아래로 뚫으면 매도” 규칙을 그대로 따랐다면 이 27일 동안 10번 사고팔았을 것이고, 가격은 제자리인데 수수료만 10번 냈을 것입니다.

더 무서운 건 점수의 진폭입니다. 시장은 ±1.5%밖에 안 움직였는데 단기 부분점수는 21.1(강한 회피)에서 83.0(강한 매수)까지 왕복했습니다. 50일차의 21.1과 38일차의 81.0 사이에 실질적인 시장 차이는 거의 없습니다. 종가로 2.6% 차이입니다.

그래서 최종 점수는 얼마나 흔들리는가

MACD는 6개 지표 중 하나일 뿐입니다. 가중치를 곱해 종합 점수(0~100)에 미치는 실제 영향을 계산하면.

단기 모드: 부분점수 폭 61.9 × 가중치 0.14 = 8.67점
장기 모드: 부분점수 폭 38.4 × 가중치 0.18 = 6.91점

여기서 반직관적인 결과가 나옵니다. 단기는 가중치가 더 가벼운데(14% < 18%), 최종 점수는 더 크게 흔들립니다(8.67 > 6.91). 레벨 계수 30과 게인 800이 단기 매핑을 훨씬 예민하게 만들기 때문입니다. 가중치만 보고 “단기는 MACD를 덜 본다”고 결론 내리면 틀립니다. 매핑 함수까지 봐야 합니다.

참고로 두 모드 모두 평균은 50 근처(52.6 / 50.7)입니다. 횡보장에서 MACD 부분점수는 평균적으로는 중립을 유지합니다. 문제는 평균이 아니라 그날그날의 값으로 매매한다는 것입니다.

STEP 8

가중치 14% vs 18% — 계산으로 답하기

방법론 문서에 공개된 가중치에서 MACD는 단기 14%, 장기 18%입니다. “모멘텀 지표인 MACD가 왜 모멘텀 모드(단기)에서 더 가벼운가?” — 자주 받는 질문이고, 정당한 질문입니다. 답은 중복(redundancy)입니다.

모드모멘텀·추세 성격역발상 성격MACD의 역할
단기 RSI 28% + F&G 28% + 낙폭 18% + MACD 14% + 크로스 8% = 96%
단기 모드에서는 RSI·F&G·낙폭이 모두 모멘텀 방향으로 매핑됨
마이어 4% 중복. 이미 96%가 추세를 보고 있음
장기 MACD 18% + 크로스 14% = 32% F&G 18% + 마이어 18% + 낙폭 14% = 50%
(RSI 18%는 역발상 매핑)
유일한 제동 장치. 68%가 “사라”고 외칠 때 막는 32% 중 절반 이상

단기 모드의 6개 지표는 사실상 5개가 이미 모멘텀 방향으로 매핑되어 있습니다. RSI는 50 + (RSI−50) × 1.6으로 높을수록 고득점이고(과매수 = 좋음), F&G도 탐욕일수록 고득점이며, 낙폭도 얕을수록 고득점입니다. 여기에 MACD를 무겁게 실으면 같은 정보를 네 번 세는 꼴입니다. 게다가 STEP 7에서 봤듯 MACD는 이 세트에서 가장 시끄러운 지표입니다(27봉에 10번 뒤집힘). 시끄러운 중복 지표에 가중치를 얹을 이유가 없습니다. 그래서 14%입니다.

장기 모드는 정반대입니다. F&G(18%) · 마이어(18%) · 낙폭(14%) — 합쳐서 50%가 역발상 지표이고, 이 셋은 하락장에서 다 같이 틀립니다. 셋 다 “싸다, 사라”고 외치는데 가격은 계속 빠집니다. 이때 “아직 아니다”라고 말해줄 수 있는 지표는 MACD(18%)와 골든/데드 크로스(14%)뿐입니다. 그런데 크로스는 200일 이동평균을 쓰는 가장 느린 신호라, 바닥 근처에서는 몇 주씩 늦습니다.

결론 — 장기 모드에서 MACD 18%는 “모멘텀을 더 믿어서”가 아니라 “브레이크가 부족해서”입니다. 역발상 3인방이 50%를 먹고 있는 구조에서, 추세가 실제로 돌아섰는지 확인해주는 유일하게 빠른 지표가 MACD입니다. 그리고 그 확인은 히스토그램이 양수가 됐는가(느림)가 아니라 히스토그램이 어제보다 커졌는가(빠름)로 이뤄집니다 — 그래서 장기 매핑의 방향 계수가 25입니다. 가중치 18%와 방향 계수 25는 같은 결정의 두 얼굴입니다.

부록 A

당신의 차트와 우리 히스토그램이 다를 수 있다

이건 대부분의 MACD 글이 절대 말하지 않는 사실입니다. MACD는 표준 규격이 아닙니다. “12·26·9”는 정해져 있지만, EMA의 첫 값을 무엇으로 시작할지(시딩)는 정해져 있지 않습니다.

똑같은 42개 종가, 똑같은 12·26·9인데 히스토그램이 이렇게 갈립니다.

일자종가히스토그램
(broodev · SMA 시드)
히스토그램
(첫 종가 시드)
차이차이 ÷ 가격
3376.9값 없음+0.056 ← 매수 신호!
3478.2+0.994+0.3520.6420.821%
3577.5+1.097+0.5190.5780.746%
3781.4+1.529+1.0550.4740.582%
3983.1+1.748+1.3560.3920.472%
4286.2+1.962+1.6620.3010.349%

33일차를 보세요. 첫-종가-시드 방식은 히스토그램이 +0.056으로 이미 양수입니다 — 즉 “히스토그램 0선 상향 돌파, 매수” 신호가 떴습니다. 같은 날 broodev는 값 자체가 없습니다(시그널 시드가 34일차에 만들어지므로). 같은 데이터, 같은 파라미터인데 신호 발생일이 다릅니다.

차이는 시간이 지나며 줄어듭니다(0.82% → 0.35%). 이론적으로 EMA는 시드의 영향이 지수적으로 소멸하므로 충분한 데이터가 쌓이면 두 방식은 수렴합니다. 하지만 42봉 시점에도 여전히 가격의 0.35%만큼 차이가 남습니다.

그렇다면 이 차이가 broodev 부분점수까지 얼마나 옮겨붙을까요? 이것도 그냥 계산해봤습니다. 결과는 제 예상과 달랐고, 그래서 더 흥미롭습니다.

일자히스토그램 차이단기점수
(우리 / 대안)
Δ장기점수
(우리 / 대안)
Δ
350.578 (0.75%)91.8 / 94.1−2.376.6 / 81.5−4.9
370.474 (0.58%)94.6 / 94.8−0.283.1 / 84.1−0.9
390.392 (0.47%)93.7 / 94.4−0.780.5 / 82.3−1.8
420.300 (0.35%)88.9 / 91.1−2.171.8 / 75.3−3.4

부분점수 차이는 0.2 ~ 4.9점에 불과합니다. 히스토그램은 0.82%나 벌어졌는데 점수는 거의 안 갈립니다. 이유는 STEP 6에서 “정보 손실”이라며 비판했던 바로 그 tanh 포화입니다. 이 구간에서는 히스토그램이 이미 충분히 커서 레벨 항이 최대치에 붙어 있고, 둘 다 포화 상태라 차이가 점수로 옮겨붙지 못합니다.

같은 성질이 약점이자 강점이다
tanh 포화는 극단값의 크기 정보를 버립니다(STEP 6의 단점). 그런데 바로 그 성질 덕분에 시딩 방식·데이터 소스 차이 같은 구현 잡음에도 점수가 잘 안 흔들립니다(부록 A의 장점). 하나를 얻으면 하나를 잃습니다. 저희는 강건함 쪽을 택했습니다. 그게 옳은 선택이었는지는 모릅니다.

다만 안심하기엔 이릅니다. 위 결과는 히스토그램이 이미 큰 추세 구간의 이야기입니다. 히스토그램이 0 근처일 때(= 포화 전) 같은 0.30% 차이를 넣으면 이렇게 됩니다.

히스토그램 (가격 100 기준)단기점수장기점수
+0.05 vs +0.3563.8 → 82.2 (+18.4)55.9 → 62.7 (+6.8)
0.00 vs +0.3052.4 → 81.9 (+29.5)53.0 → 62.5 (+9.5)
−0.15 vs +0.15 (0선을 사이에 둠)27.4 → 77.4 (+50.0)45.8 → 60.1 (+14.3)

히스토그램이 0선을 사이에 두고 갈리면 단기 부분점수가 50점 벌어집니다. 그리고 0 근처는 정확히 사람들이 신호를 찾는 자리입니다 — 전환점, 횡보장, 크로스 직전. 시딩 차이가 가장 크게 문제되는 구간이, 하필 가장 중요한 구간입니다. (여기서도 장기 매핑이 단기보다 훨씬 덜 흔들립니다: +14.3 vs +50.0. 레벨 계수가 10밖에 안 되기 때문입니다.)

실전 함의 세 가지

부록 B

이 워크스루가 증명하지 못한 것 (그리고 못하는 것)

지금까지 42봉·60봉짜리 가상 데이터로 계산 과정을 재현했습니다. 이 글이 증명한 것과 증명하지 않은 것을 분명히 구분하겠습니다.

증명한 것

증명하지 않은 것 (중요)

MACD 부분점수는 broodev 종합 점수의 14~18%일 뿐입니다. 나머지 82~86%는 다른 다섯 지표가 채우고, 그 합성 방식은 방법론 문서에 전부 공개되어 있습니다. 어떤 단일 지표도 혼자서는 아무것도 결정하지 않습니다. 그게 설계 의도입니다.

⚠ 투자 유의
이 문서는 계산 방법을 공개한 기술 문서이며 투자 자문이 아닙니다. 본문의 종가·점수는 계산 과정을 보여주기 위한 가상 데이터이며, 어떤 자산의 미래 가격도 예측하지 않습니다. 암호화폐는 원금 전액 손실이 가능한 고위험 자산입니다. 모든 투자 판단과 그 결과(손익)에 대한 책임은 전적으로 이용자 본인에게 있습니다. 반드시 스스로 조사하세요(DYOR).

이어서 읽기