금 ETF · 은 ETF · 금은비 · 실측 재현 페이지

금만 들고 있을까,
금은비 80 에 은으로 반 옮길까

금은비는 금 1그램 값으로 은을 몇 그램 살 수 있는지를 센 숫자입니다(미국 금 선물 종가 ÷ 은 선물 종가). 2016년 1월 4일부터 2026년 10월 16일까지 국내 상장 KODEX 골드선물(H) 132030 · KODEX 은선물(H) 144600 의 실제 종가로 1,000만원짜리 계좌 둘을 만들었습니다. ① 금만 — 금 ETF 를 사서 그대로 둔다 ② 금은비 규칙 — 금은비가 80 을 넘으면 금의 절반을 은으로, 65 밑으로 내려오면 은을 팔아 전부 금으로. 그 사이에서는 아무것도 안 한다.

3,519만원금은비 규칙 계좌의 끝 잔고 — 금만 든 계좌는 2,847만원 (연 12.38% 대 10.19%)
-30.49%가장 크게 떨어진 폭 — 두 계좌 같은 날(2026-07-01) 같은 폭
3번10.8년 동안 갈아탄 횟수 — 자주 쓰는 규칙이 아닙니다

오늘 드리는 것 — 기준 두 줄

금은비할 일
80 을 넘으면금의 절반을 은 ETF 로 옮긴다 (은이 금에 비해 싸진 때)
65 밑으로 내려오면은을 팔아 다시 전부 금으로 (은이 금에 비해 비싸진 때)
그 사이아무것도 안 한다 · 은을 들고 있는 동안은 매달 첫 거래일에 금 50 : 은 50 으로 맞춘다
지키는 법금은비는 매일 아침 한 번(전날 미국 종가) · 넘은 날 국내 장 마감에 옮긴다 · 옮긴 금액에 편도 0.1% 를 비용으로 뺐다
지금2026-10-16 금은비 73.4 → 규칙상 금 100%

10.8년 동안 갈아탄 날

2016년 시작 때는 2015년 8월에 이미 80 을 넘은 상태라 처음부터 금 50 : 은 50 이었습니다.

국내 옮긴 날옮긴 뒤금은비판정한 미국 종가
2021-02-03금 100%63.42021-02-01
2021-10-01금 50 : 은 5080.32021-09-29
2025-12-26금 100%63.92025-12-23

그냥 섞어 두면? — 같은 기간 다른 계좌

계좌1,000만원 →가장 크게 떨어진 폭
금만 그대로2,847만원-30.49%
금은비 규칙(절반)3,519만원-30.49%
금 50 : 은 50 고정(매달 맞춤)2,966만원-43.13%
은 43.1% 고정(규칙이 들고 있던 은의 평균 비중)2,973만원-41.41%
절반 대신 전부 옮기기3,957만원-47.44%

미국 상장 GLD·SLV(달러 기준, 같은 규칙): 1,000 → 금만 3,713(최대 -26.40%) · 금은비 규칙 4,763(최대 -26.40%). 국내 상장일(2011-07-18)부터: 금만 1,926만원 · 규칙 2,417만원.

문턱 이웃 — 80·65 근처 다른 숫자 (절반 옮기기 · 국내 2016~)

위 문턱아래 문턱별 끝 잔고(갈아탄 횟수·가장 크게 떨어진 폭)
70L50 3,589만(2번·-32.6%) · L55 3,337만(2번·-32.6%) · L60 3,218만(2번·-32.6%) · L65 3,242만(4번·-30.5%)
75L50 3,666만(1번·-32.6%) · L55 3,408만(1번·-32.6%) · L60 3,287만(1번·-32.6%) · L65 3,411만(3번·-30.5%)
80L50 3,666만(1번·-32.6%) · L55 3,408만(1번·-32.6%) · L60 3,287만(1번·-32.6%) · L65 3,519만(3번·-30.5%)
85L50 3,887만(2번·-32.6%) · L55 3,613만(2번·-32.6%) · L60 3,485만(2번·-32.6%) · L65 3,835만(4번·-30.5%)
90L50 4,001만(2번·-32.6%) · L55 3,719만(2번·-32.6%) · L60 3,587만(2번·-32.6%) · L65 4,109만(4번·-30.5%)

한계 — 먼저 읽어 주세요

받아가기

돌리는 법: zip 을 풀고 python run_goldsilver.py

그대로 돌린 출력

금은비 절반 갈아타기 — 알고랩 재현 (기준일 2026-10-16)
규칙: 금은비 80 위 → 은 50% · 65 밑 → 금 100% · 사이 그대로

[본편] 국내 KODEX 골드선물(H)·은선물(H) 2016-01-04 ~ 2026-10-16 (10.8년)
  금만 그대로                 1,000만원 → 2,847만원  (연 10.19% · 가장 크게 떨어졌을 때 -30.49% 2026-07-01)
  금은비 규칙(절반)             1,000만원 → 3,519만원  (연 12.38% · 가장 크게 떨어졌을 때 -30.49% 2026-07-01)
  반반 고정(매달 맞춤)           1,000만원 → 2,966만원  (연 10.61% · 가장 크게 떨어졌을 때 -43.13% 2026-07-20)
  은 43.1% 고정             1,000만원 → 2,973만원  (연 10.64% · 가장 크게 떨어졌을 때 -41.41% 2026-07-20)
  갈아탄 날 3번:
    2021-02-03  은 0% 로 (금은비 63.4 · 미국 2021-02-01 종가)
    2021-10-01  은 50% 로 (금은비 80.3 · 미국 2021-09-29 종가)
    2025-12-26  은 0% 로 (금은비 63.9 · 미국 2025-12-23 종가)
  시작 때 상태: 은 50%

[연말 잔고] 금은비 규칙 · 금만 (만원)
  2016 1,098/1,064 · 2017 1,159/1,174 · 2018 1,074/1,133 · 2019 1,232/1,310 · 2020 1,617/1,567 · 2021 1,608/1,471 · 2022 1,615/1,447 · 2023 1,681/1,600 · 2024 1,999/1,929 · 2025 3,799/3,074 · 2026 3,519/2,847

[반론] 큰 두 번을 빼면 (그 기간 수익을 모든 계좌에서 0 으로)
  2020-02-15~2020-08-31 빼기   금만 2,347만원 · 규칙 2,547만원
  2025년 빼기                   금만 1,787만원 · 규칙 1,849만원
  둘 다 빼기                     금만 1,473만원 · 규칙 1,339만원

[다른 판] 절반 대신 전부 옮기기: 1,000만원 → 3,957만원  (연 13.61% · 가장 크게 떨어졌을 때 -47.44% 2020-03-19)
[다른 판] 국내 상장일부터: 2011-07-18~ 금만 1,926만원 · 규칙 2,417만원

[미국 판] GLD·SLV 2016-01-04 ~ 2026-10-16 (달러 기준 · 1,000 → )
  금(GLD)만 3,713 (최대 -26.40%) · 금은비 규칙 4,763 (최대 -26.40%) · 갈아타기 4번
  반반 고정(매달 맞춤) 4,010 (최대 -41.04%)

[문턱 이웃] 위 문턱 H · 아래 문턱 L 을 바꿔 같은 계산 (금만 그대로 2,847만원)
  H70: L50 3,589만(2번·-32.6%) · L55 3,337만(2번·-32.6%) · L60 3,218만(2번·-32.6%) · L65 3,242만(4번·-30.5%)
  H75: L50 3,666만(1번·-32.6%) · L55 3,408만(1번·-32.6%) · L60 3,287만(1번·-32.6%) · L65 3,411만(3번·-30.5%)
  H80: L50 3,666만(1번·-32.6%) · L55 3,408만(1번·-32.6%) · L60 3,287만(1번·-32.6%) · L65 3,519만(3번·-30.5%)
  H85: L50 3,887만(2번·-32.6%) · L55 3,613만(2번·-32.6%) · L60 3,485만(2번·-32.6%) · L65 3,835만(4번·-30.5%)
  H90: L50 4,001만(2번·-32.6%) · L55 3,719만(2번·-32.6%) · L60 3,587만(2번·-32.6%) · L65 4,109만(4번·-30.5%)
  20개 중 금만 그대로보다 더 남은 것 20개

[금은비 2016~] 가장 높을 때 125.9 (2020-03-18) · 가장 낮을 때 44.2 (2026-01-26)

[지금] 2026-10-16 금은비 73.4 → 규칙상 금 100%
끝.

코드 전문

# -*- coding: utf-8 -*-
"""금만 들고 있을까, 금은비 80 에 은으로 반 옮길까 — 알고랩 재현 코드 (2026-10-20 영상).

규칙  : 금은비(미국 금 선물 종가 ÷ 은 선물 종가)가 80 을 넘으면 은 50% · 65 밑으로 내려오면 은 0%(금 100%) ·
        그 사이에서는 그대로. (2016년 1월 시작 때는 2015년 8월에 이미 80 을 넘은 상태라 은 50%)
상품  : KODEX 골드선물(H) 132030 · KODEX 은선물(H) 144600 (둘 다 분배 없음 · 종가)
시점  : 국내 날짜 D 의 장 마감에 'D 보다 앞선 마지막 미국 종가' 로 판정해 옮기고, D+1 수익부터 적용.
        목표가 바뀌는 날 + 매달 첫 거래일에 목표 비중으로 맞춤. 옮긴 금액 × 편도 0.1% × 2(팔고 사기).
자료  : data_goldsilver/*.csv — 야후 종가(2026-10-16 까지 얼림). GC_F·SI_F = 금·은 선물 · GLD·SLV = 미국 상장 ETF.
돌리는 법: python run_goldsilver.py   (표준 라이브러리만 씁니다)
"""
import csv
import datetime
import os

HERE = os.path.dirname(os.path.abspath(__file__))
D = os.path.join(HERE, "data_goldsilver")
ASOF = "2026-10-16"          # 기준일 고정 — 영상과 같은 숫자가 나온다
FEE = 0.001
HIGH, LOW, HALF = 80, 65, 0.5
START = "2016-01-01"


def load(name):
    with open(os.path.join(D, name + ".csv"), encoding="utf-8") as f:
        return {r["date"]: float(r["close"]) for r in csv.DictReader(f) if r["close"] and r["date"] <= ASOF}


def inner(*series):
    ds = sorted(set.intersection(*[set(s) for s in series]))
    return ds, [[s[d] for d in ds] for s in series]


def rets(c):
    return [0.0] + [c[i] / c[i - 1] - 1 for i in range(1, len(c))]


def fdate(s):
    return datetime.date.fromisoformat(s)


def stats(eq, dates):
    yrs = (fdate(dates[-1]) - fdate(dates[0])).days / 365.25
    cagr = eq[-1] ** (1 / yrs) - 1
    peak, mdd, mday = eq[0], 0.0, dates[0]
    for e, d in zip(eq, dates):
        peak = max(peak, e)
        if e / peak - 1 < mdd:
            mdd, mday = e / peak - 1, d
    return cagr * 100, mdd * 100, mday


def run_target(tgt, rg, rs, dates):
    a, b = 1 - tgt[0], tgt[0]
    prev, lastm = tgt[0], dates[0][5:7]
    eq, moves = [], []
    for i in range(len(rg)):
        m = dates[i][5:7]
        if tgt[i] != prev or m != lastm:
            tot = a + b
            p = tgt[i]
            moved = abs(b - tot * p)
            if tgt[i] != prev:
                moves.append(i)
            tot -= moved * FEE * 2
            a, b = tot * (1 - p), tot * p
            prev, lastm = tgt[i], m
        a *= 1 + rg[i]
        b *= 1 + rs[i]
        eq.append(a + b)
    return eq, moves


def cumprod(r):
    out, x = [], 1.0
    for v in r:
        x *= 1 + v
        out.append(x)
    return out


# ── 금은비 신호(미국 날짜 기준) ──
fd, (gc, si) = inner(load("GC_F"), load("SI_F"))
ratio = [g / s for g, s in zip(gc, si)]
state, cur = [], 0.0
for x in ratio:
    if x > HIGH:
        cur = 1.0
    elif x < LOW:
        cur = 0.0
    state.append(cur)


def known_before(d):
    """국내 날짜 d 에 알 수 있는 상태 = d 보다 앞선 마지막 미국 날짜의 상태."""
    lo, hi = 0, len(fd)
    while lo < hi:
        mid = (lo + hi) // 2
        if fd[mid] < d:
            lo = mid + 1
        else:
            hi = mid
    return (state[lo - 1], ratio[lo - 1], fd[lo - 1]) if lo > 0 else (0.0, None, None)


# ── 국내 판 ──
kd, (kg, ks) = inner(load("132030_KS"), load("144600_KS"))
rg_all, rs_all = rets(kg), rets(ks)
known = [known_before(d) for d in kd]
lag = [0.0] + [k[0] for k in known[:-1]]          # D 종가에 옮기고 D+1 수익부터


def man(x):
    return f"{round(x * 1000):,}만원"


def domestic(start, half=HALF, zero=()):
    idx = [i for i, d in enumerate(kd) if d >= start]
    dates = [kd[i] for i in idx]
    rg = [rg_all[i] for i in idx]
    rs = [rs_all[i] for i in idx]
    for a, b in zero:
        for j, d in enumerate(dates):
            if a <= d <= b:
                rg[j] = rs[j] = 0.0
    t = [half if lag[i] > 0.5 else 0.0 for i in idx]
    eq, mv = run_target(t, rg, rs, dates)
    gold = cumprod(rg)
    hh, _ = run_target([0.5] * len(t), rg, rs, dates)
    p = sum(t) / len(t)
    mix, _ = run_target([p] * len(t), rg, rs, dates)
    sw = [(dates[j], t[j], known[idx[j] - 1][1], known[idx[j] - 1][2]) for j in mv]
    return dict(dates=dates, eq=eq, gold=gold, hh=hh, mix=mix, p=p, sw=sw)


def line(name, eq, dates):
    c, m, md = stats(eq, dates)
    return f"  {name:<22s} 1,000만원 → {man(eq[-1])}  (연 {c:.2f}% · 가장 크게 떨어졌을 때 {m:.2f}% {md})"


print("금은비 절반 갈아타기 — 알고랩 재현 (기준일 %s)" % ASOF)
print("규칙: 금은비 %d 위 → 은 %d%% · %d 밑 → 금 100%% · 사이 그대로\n" % (HIGH, HALF * 100, LOW))

R = domestic(START)
d = R["dates"]
print(f"[본편] 국내 KODEX 골드선물(H)·은선물(H) {d[0]} ~ {d[-1]} ({(fdate(d[-1]) - fdate(d[0])).days / 365.25:.1f}년)")
print(line("금만 그대로", R["gold"], d))
print(line("금은비 규칙(절반)", R["eq"], d))
print(line("반반 고정(매달 맞춤)", R["hh"], d))
print(line(f"은 {R['p'] * 100:.1f}% 고정", R["mix"], d))
print(f"  갈아탄 날 {len(R['sw'])}번:")
for day, w, r, us in R["sw"]:
    print(f"    {day}  은 {w * 100:.0f}% 로 (금은비 {r:.1f} · 미국 {us} 종가)")
print(f"  시작 때 상태: 은 {HALF * 100 if lag[kd.index(d[0])] > 0.5 else 0:.0f}%")

print("\n[연말 잔고] 금은비 규칙 · 금만 (만원)")
yr = {}
for dd, e, g in zip(d, R["eq"], R["gold"]):
    yr[dd[:4]] = (e, g)
print("  " + " · ".join(f"{y} {round(e * 1000):,}/{round(g * 1000):,}" for y, (e, g) in yr.items()))

print("\n[반론] 큰 두 번을 빼면 (그 기간 수익을 모든 계좌에서 0 으로)")
for nm, z in (("2020-02-15~2020-08-31 빼기", [("2020-02-15", "2020-08-31")]),
              ("2025년 빼기", [("2025-01-01", "2025-12-31")]),
              ("둘 다 빼기", [("2020-02-15", "2020-08-31"), ("2025-01-01", "2025-12-31")])):
    X = domestic(START, zero=z)
    print(f"  {nm:<26s} 금만 {man(X['gold'][-1])} · 규칙 {man(X['eq'][-1])}")

X = domestic(START, half=1.0)
print("\n[다른 판] 절반 대신 전부 옮기기: " + line("", X["eq"], X["dates"]).strip())
X = domestic("2011-07-18")
print("[다른 판] 국내 상장일부터: " + f"{X['dates'][0]}~ 금만 {man(X['gold'][-1])} · 규칙 {man(X['eq'][-1])}")

# ── 미국 판(달러 · t 종가 판정 → t+1 수익) ──
ud, (ugc, usi, gld, slv) = inner(load("GC_F"), load("SI_F"), load("GLD"), load("SLV"))
keep = [i for i, x in enumerate(ud) if x >= START]
ud = [ud[i] for i in keep]
rg, rs = rets([gld[i] for i in keep]), rets([slv[i] for i in keep])
st = {x: s for x, s in zip(fd, state)}
t = [0.0] + [HALF if st[x] > 0.5 else 0.0 for x in ud[:-1]]
eq, mv = run_target(t, rg, rs, ud)
g = cumprod(rg)
c1, m1, _ = stats(eq, ud)
c2, m2, _ = stats(g, ud)
uh, _ = run_target([0.5] * len(t), rg, rs, ud)
c3, m3, _ = stats(uh, ud)
print(f"\n[미국 판] GLD·SLV {ud[0]} ~ {ud[-1]} (달러 기준 · 1,000 → )")
print(f"  금(GLD)만 {round(g[-1] * 1000):,} (최대 {m2:.2f}%) · 금은비 규칙 {round(eq[-1] * 1000):,} (최대 {m1:.2f}%) · 갈아타기 {len(mv)}번")
print(f"  반반 고정(매달 맞춤) {round(uh[-1] * 1000):,} (최대 {m3:.2f}%)")

# ── 문턱 이웃: 80·65 근처 다른 숫자(절반 옮기기 · 국내 2016~) ──
print(f"\n[문턱 이웃] 위 문턱 H · 아래 문턱 L 을 바꿔 같은 계산 (금만 그대로 {man(R['gold'][-1])})")
win = n = 0
idx = [i for i, d in enumerate(kd) if d >= START]
dd = [kd[i] for i in idx]
for H in (70, 75, 80, 85, 90):
    row = []
    for L in (50, 55, 60, 65):
        st2, c2 = [], 0.0
        for x in ratio:
            if x > H:
                c2 = 1.0
            elif x < L:
                c2 = 0.0
            st2.append(c2)
        stmap = dict(zip(fd, st2))
        k2 = [stmap[kn[2]] if kn[2] else 0.0 for kn in known]
        lag2 = [0.0] + k2[:-1]
        t2 = [HALF if lag2[i] > 0.5 else 0.0 for i in idx]
        e2, m2 = run_target(t2, [rg_all[i] for i in idx], [rs_all[i] for i in idx], dd)
        n += 1
        win += e2[-1] > R["gold"][-1]
        row.append(f"L{L} {round(e2[-1] * 1000):,}만({len(m2)}번·{stats(e2, dd)[1]:.1f}%)")
    print(f"  H{H}: " + " · ".join(row))
print(f"  {n}개 중 금만 그대로보다 더 남은 것 {win}개")

r16 = [(r, d) for r, d in zip(ratio, fd) if d >= START]
hi, lo = max(r16), min(r16)
print(f"\n[금은비 2016~] 가장 높을 때 {hi[0]:.1f} ({hi[1]}) · 가장 낮을 때 {lo[0]:.1f} ({lo[1]})")
print(f"\n[지금] {fd[-1]} 금은비 {ratio[-1]:.1f} → 규칙상 {'은 50%' if state[-1] > 0.5 else '금 100%'}")
print("끝.")

알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. 몇 년에 한 번 오는 80 을 기다렸다가 그날 옮기는 일은 사람보다 봇이 잘합니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기

과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.