적금 · S&P500 ETF · 적립 · 실측 재현 페이지

적금 넣던 돈을 S&P500 ETF로 옮기면,
5년 뒤 그날 꼭 써야 하는 돈이라면?

두 사람이 매달 100만원씩 5년(원금 6,000만원)을 모읍니다. 한 사람은 적금(해마다 1년 정기적금 · 그 달 한국은행 실제 신규 금리 · 만기금은 1년 정기예금 · 이자소득세 15.4%), 다른 사람은 S&P500 ETF(SPY 수정종가 × 원/달러 · 사고팔 때 0.1% · 이익의 15.4%)를 삽니다. 1996-01 ~ 2019-08 에 시작한 284번을 전부 견줬습니다. ① 그날 판다 — 5년 뒤 그 달에 판다 ② 최대 2년 미룬다 — 그날 적금보다 아래면 매달 다시 보고 적금을 앞서는 첫 달에 판다(미루는 동안 적금 쪽도 예금 이자를 받는다)

188 / 2845년 뒤 그날 팔았을 때 적금보다 더 남은 횟수
235 / 284적금보다 아래면 최대 2년 기다렸을 때
49번2년을 기다리고도 적금에 진 횟수 — 기다리기는 약속이 아닙니다

오늘 드리는 것 — 기준 한 줄

돈할 일
쓸 날을 2년 미룰 수 있는 돈S&P500 ETF 적립으로 옮겨도 된다 — 5년 뒤 적금보다 아래면 팔지 말고 적금을 앞서는 첫 달에 판다
쓸 날이 정해진 돈(전세금·결혼 자금 등)적금 — 정해진 날 정해진 돈을 준다

사례 — 2001년 9월에 시작한 사람

날ETF적금차이
2006-09 (5년 뒤 그날)6,303만원6,527만원-224만원
2007-02 (5달 기다림)6,757만원6,632만원+126만원

사례 고르는 법: 기다려서 이긴 47번 중 기다린 달이 가운데 값(5달)이고 적금 대비 차이가 가운데 값(105만원)에 가장 가까운 판 — 가장 좋은 판을 고른 것이 아닙니다. 2년 기다리고도 진 판의 가운데 사례: 1998-10 시작 → 2003-10 ETF 5,177만원 / 적금 6,796만원 → 2005-10 ETF 5,838만원 / 적금 7,230만원(시작 달 적금 금리 연 10.69%).

기다리면 크게 버나 — 아닙니다

그날 적금에 졌던 96번 중 47번이 2년 안에 적금을 앞질렀지만, 그때 적금보다 더 받은 돈은 가운데 값 105만원뿐입니다(그날 이긴 판은 1,741만원). 기다리기는 크게 버는 방법이 아니라, 적금보다 덜 받고 파는 날을 피하는 방법입니다. 2년을 기다리고도 진 49번은 시작 연도가 {'1997': 12, '1998': 12, '1999': 12, '2000': 11, '2003': 2} 이고, 모자란 돈은 가운데 값 -1,393만원 입니다. 그 시작 달 적금 금리는 가운데 값 연 9.53% 였습니다(이긴 판 연 3.51% · 2026년 8월 연 3.72%).

미루기 한도를 바꿔 보면

미루는 한도적금보다 더 남은 것
최대 0달188번 / 284번
최대 3달207번 / 284번
최대 6달214번 / 284번
최대 12달219번 / 284번
최대 18달230번 / 284번
최대 24달235번 / 284번

시작 연도별

시작 연도그날 팔면최대 2년 미루면시작 달 수1월 적금 금리
1996912129.79%
1997001210.12%
1998001210.55%
199900129.63%
200001128.1%
2001012127.35%
20021212125.08%
2003510125.03%
2004012124.32%
2005212123.39%
2006812123.6%
20071212123.92%
20081212124.88%
20091212124.2%
20101212123.44%
20111212123.62%
20121212123.75%
20131212123.4%
20141212122.83%
20151212122.35%
20161212121.84%
20171212121.53%
20181212121.81%
20198882.06%

2007년 이후 시작한 152번은 그날 팔아도 152번 적금보다 더 남았습니다 — 미국 주식이 유난히 좋았던 기간이라 앞으로의 약속으로 읽지 마세요.

한계 — 먼저 읽어 주세요

받아가기

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

그대로 돌린 출력

== S&P500(원화) 적립 대 적금 · 매달 100만원 × 5년 · 시작 달 1996-01 ~ 2019-08 · 284번
5년 뒤 그날 팔면 적금보다 더 남은 것 188번 / 284번
적금보다 아래면 최대 2년 미뤄 앞서는 첫 달에 팔면 235번 / 284번
그날 적금에 졌던 96번 중 2년 안에 앞지른 것 47번 · 기다린 달 가운데 값 5달 · 최대 24달
기다려서 이긴 판의 적금 대비 차이 가운데 값 105만원 · 그날 이긴 판은 1,741만원
2년을 기다리고도 진 것 49번 · 시작 연도 {'1997': 12, '1998': 12, '1999': 12, '2000': 11, '2003': 2} · 모자란 돈 가운데 값 -1,393만원
진 판 시작 달 적금 금리 가운데 값 연 9.53% · 이긴 판 연 3.51% · 지금(2026-08) 연 3.72%
2007년 이후 시작 152번 중 그날 팔아도 더 남은 것 152번
[사례] 2001-09 시작 · 2006-09 ETF 6,303만원 / 적금 6,527만원 (차이 -224만원) → 5달 기다린 2007-02 ETF 6,757만원 / 적금 6,632만원 (차이 126만원)
[진 사례] 1998-10 시작 · 2003-10 ETF 5,177만원 / 적금 6,796만원 → 24달 기다린 2005-10 ETF 5,838만원 / 적금 7,230만원 · 시작 달 적금 금리 연 10.69%

== 미루기 한도를 바꿔 보면(같은 시작 달)
  최대  0달 미룸 → 적금보다 더 남은 것 188번 / 284번
  최대  3달 미룸 → 적금보다 더 남은 것 207번 / 284번
  최대  6달 미룸 → 적금보다 더 남은 것 214번 / 284번
  최대 12달 미룸 → 적금보다 더 남은 것 219번 / 284번
  최대 18달 미룸 → 적금보다 더 남은 것 230번 / 284번
  최대 24달 미룸 → 적금보다 더 남은 것 235번 / 284번

== 시작 연도별 (그날 판다 / 2년 미룬다 / 시작 달 수)
  1996   9 / 12 / 12  · 1월 적금 금리 연 9.79%
  1997   0 /  0 / 12  · 1월 적금 금리 연 10.12%
  1998   0 /  0 / 12  · 1월 적금 금리 연 10.55%
  1999   0 /  0 / 12  · 1월 적금 금리 연 9.63%
  2000   0 /  1 / 12  · 1월 적금 금리 연 8.1%
  2001   0 / 12 / 12  · 1월 적금 금리 연 7.35%
  2002  12 / 12 / 12  · 1월 적금 금리 연 5.08%
  2003   5 / 10 / 12  · 1월 적금 금리 연 5.03%
  2004   0 / 12 / 12  · 1월 적금 금리 연 4.32%
  2005   2 / 12 / 12  · 1월 적금 금리 연 3.39%
  2006   8 / 12 / 12  · 1월 적금 금리 연 3.6%
  2007  12 / 12 / 12  · 1월 적금 금리 연 3.92%
  2008  12 / 12 / 12  · 1월 적금 금리 연 4.88%
  2009  12 / 12 / 12  · 1월 적금 금리 연 4.2%
  2010  12 / 12 / 12  · 1월 적금 금리 연 3.44%
  2011  12 / 12 / 12  · 1월 적금 금리 연 3.62%
  2012  12 / 12 / 12  · 1월 적금 금리 연 3.75%
  2013  12 / 12 / 12  · 1월 적금 금리 연 3.4%
  2014  12 / 12 / 12  · 1월 적금 금리 연 2.83%
  2015  12 / 12 / 12  · 1월 적금 금리 연 2.35%
  2016  12 / 12 / 12  · 1월 적금 금리 연 1.84%
  2017  12 / 12 / 12  · 1월 적금 금리 연 1.53%
  2018  12 / 12 / 12  · 1월 적금 금리 연 1.81%
  2019   8 /  8 /  8  · 1월 적금 금리 연 2.06%
끝.

코드 전문

# -*- coding: utf-8 -*-
"""적금 넣던 돈을 S&P500 ETF로 옮기면 — 5년 뒤 그날 팔 돈과 2년 미룰 수 있는 돈 (AlgoLab 재현 코드 · 표준 라이브러리만)

판
  · 두 사람 모두 매달 100만원 × 5년(원금 6,000만원)
  · 적금 = 해마다 1년 정기적금(그 달 한국은행 ECOS 121Y002 「정기적금」 신규 금리 · 단리 78/12)
           만기금은 1년 정기예금(그 달 「정기예금」 금리)으로 굴림 · 이자소득세 15.4%
  · ETF  = 매달 첫 거래일 S&P500(SPY 수정종가 = 배당 재투자) × 원/달러(FRED DEXKOUS)로 산다
           사고팔 때 0.1% · 팔 때 이익의 15.4%
  · 그날 판다   = 5년 뒤 그 달 첫 거래일에 판다
  · 2년 미룬다  = 그날 ETF(세후)가 적금보다 아래면 매달 다시 보고, 적금을 앞서는 첫 달에 판다(최대 24달)
                  미루는 동안 적금 쪽 돈도 정기예금 이자(세후)를 받는다. 24달 끝에도 못 앞서면 그날 판다(진 것)
  · 시작 달 = 5년 + 24달이 금리 자료 안에 들어가는 모든 달(같은 시작 달로 '그날'과 '2년 미룸'을 견준다)
자료(data/ · 2026-10-23 까지 얼림 · 금리는 2026-08 까지)
  · SPY.csv(야후 일봉 · close = 수정종가) · DEXKOUS.csv(FRED 원/달러) · 수신금리_ECOS121Y002.csv(한국은행)
돌리는 법: python run_savingsetf.py
"""
import csv
import os
import statistics
import sys
from collections import Counter

sys.stdout.reconfigure(encoding="utf-8", errors="replace")
HERE = os.path.dirname(os.path.abspath(__file__))
D = os.path.join(HERE, "data")
ASOF = "2026-10-23"
COST, TAX, MON = 0.001, 0.154, 100.0  # 만원
Y, KMAX = 5, 24


def won(x):
    return f"{x:,.0f}만원"


# ── 자료 ──
fx = []
with open(os.path.join(D, "DEXKOUS.csv"), encoding="utf-8") as f:
    for r in csv.reader(f):
        try:
            fx.append((r[0], float(r[1])))
        except (ValueError, IndexError):
            pass
fx.sort()
spy = []
with open(os.path.join(D, "SPY.csv"), encoding="utf-8") as f:
    for r in csv.DictReader(f):
        v = float(r["close"])
        if v > 0 and r["date"] <= ASOF:
            spy.append((r["date"], v))
R = {}
with open(os.path.join(D, "수신금리_ECOS121Y002.csv"), encoding="utf-8") as f:
    for r in csv.DictReader(f):
        t = r["time"]
        R[f"{t[:4]}-{t[4:6]}"] = (float(r["정기적금"]), float(r["정기예금"]))

# SPY 각 날에 그날(없으면 직전) 원/달러를 곱하고, 달마다 첫 거래일 값을 쓴다
j, last, krw = 0, None, []
for d, v in spy:
    while j < len(fx) and fx[j][0] <= d:
        last = fx[j][1]
        j += 1
    if last is not None:
        krw.append((d, v * last))
mon = {}
for d, v in krw:
    mon.setdefault(d[:7], v)
per = sorted(mon)
px = [mon[k] for k in per]
for a, b in zip(per, per[1:]):
    assert int(a[:4]) * 12 + int(a[5:]) + 1 == int(b[:4]) * 12 + int(b[5:]), ("월 구멍", a, b)


def savings_end(s, H):
    pile = 0.0
    for y in range(H // 12):
        a_, d_ = R[per[s + 12 * y]]
        pile *= 1.0 + d_ / 100.0 * (1 - TAX)
        pile += MON * 12 + MON * (a_ / 100.0) * 78.0 / 12.0 * (1 - TAX)
    return pile


def etf_val(sh, i, H):
    v = sh * px[i] * (1 - COST)
    return v - max(v - MON * H, 0) * TAX


def play(s, kmax):
    H = 12 * Y
    sh = sum(MON * (1 - COST) / px[s + j_] for j_ in range(H))
    sav = savings_end(s, H)
    e0, s0 = etf_val(sh, s + H, H), sav
    for k in range(kmax + 1):
        i = s + H + k
        if k > 0:
            sav *= 1 + R[per[i - 1]][1] / 100 / 12 * (1 - TAX)
        e = etf_val(sh, i, H)
        if e > sav or k == kmax:
            break
    return dict(start=per[s], plan=per[s + H], sell=per[i], wait=k, etf0=e0, sav0=s0, etf=e, sav=sav,
                rate=R[per[s]][0], won0=e0 > s0, won=e > sav)


H = 12 * Y
S = [s for s in range(len(per) - H - KMAX) if all(per[s + H + k] in R for k in range(KMAX + 1))
     and all(per[s + 12 * y] in R for y in range(Y))]
rows = [play(s, KMAX) for s in S]
n = len(rows)
med = lambda xs: sorted(xs)[len(xs) // 2]
w0 = [r for r in rows if r["won0"]]
w2 = [r for r in rows if r["won"]]
dl = [r for r in rows if r["won"] and not r["won0"]]
lost = [r for r in rows if not r["won"]]

print(f"== S&P500(원화) 적립 대 적금 · 매달 100만원 × 5년 · 시작 달 {rows[0]['start']} ~ {rows[-1]['start']} · {n}번")
print(f"5년 뒤 그날 팔면 적금보다 더 남은 것 {len(w0)}번 / {n}번")
print(f"적금보다 아래면 최대 2년 미뤄 앞서는 첫 달에 팔면 {len(w2)}번 / {n}번")
print(f"그날 적금에 졌던 {n - len(w0)}번 중 2년 안에 앞지른 것 {len(dl)}번 · 기다린 달 가운데 값 {med([r['wait'] for r in dl])}달 · 최대 {max(r['wait'] for r in dl)}달")
print(f"기다려서 이긴 판의 적금 대비 차이 가운데 값 {won(med([r['etf'] - r['sav'] for r in dl]))} · 그날 이긴 판은 {won(med([r['etf0'] - r['sav0'] for r in w0]))}")
print(f"2년을 기다리고도 진 것 {len(lost)}번 · 시작 연도 {dict(sorted(Counter(r['start'][:4] for r in lost).items()))} · 모자란 돈 가운데 값 {won(med([r['etf'] - r['sav'] for r in lost]))}")
print(f"진 판 시작 달 적금 금리 가운데 값 연 {med([r['rate'] for r in lost])}% · 이긴 판 연 {med([r['rate'] for r in w2])}% · 지금(2026-08) 연 {R['2026-08'][0]}%")
r07 = [r for r in rows if r["start"] >= "2007"]
print(f"2007년 이후 시작 {len(r07)}번 중 그날 팔아도 더 남은 것 {sum(r['won0'] for r in r07)}번")

# 사례 = 기다려서 이긴 판 중 기다린 달이 가운데 값이고, 금액 차가 가운데 값에 가장 가까운 판(좋은 판을 고르지 않는다)
mw, mg = med([r["wait"] for r in dl]), med([r["etf"] - r["sav"] for r in dl])
c = min([r for r in dl if r["wait"] == mw], key=lambda r: abs((r["etf"] - r["sav"]) - mg))
print(f"[사례] {c['start']} 시작 · {c['plan']} ETF {won(c['etf0'])} / 적금 {won(c['sav0'])} (차이 {won(c['etf0'] - c['sav0'])})"
      f" → {c['wait']}달 기다린 {c['sell']} ETF {won(c['etf'])} / 적금 {won(c['sav'])} (차이 {won(c['etf'] - c['sav'])})")
ml = med([r["etf"] - r["sav"] for r in lost])
lc = min(lost, key=lambda r: abs((r["etf"] - r["sav"]) - ml))
print(f"[진 사례] {lc['start']} 시작 · {lc['plan']} ETF {won(lc['etf0'])} / 적금 {won(lc['sav0'])}"
      f" → 24달 기다린 {lc['sell']} ETF {won(lc['etf'])} / 적금 {won(lc['sav'])} · 시작 달 적금 금리 연 {lc['rate']}%")

print("\n== 미루기 한도를 바꿔 보면(같은 시작 달)")
for K in (0, 3, 6, 12, 18, 24):
    w = sum(play(s, K)["won"] for s in S)
    print(f"  최대 {K:2d}달 미룸 → 적금보다 더 남은 것 {w}번 / {n}번")

print("\n== 시작 연도별 (그날 판다 / 2년 미룬다 / 시작 달 수)")
for yy in sorted({r["start"][:4] for r in rows}):
    g = [r for r in rows if r["start"][:4] == yy]
    print(f"  {yy}  {sum(r['won0'] for r in g):2d} / {sum(r['won'] for r in g):2d} / {len(g):2d}  · 1월 적금 금리 연 {R[yy + '-01'][0]}%")
print("끝.")

알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. 정한 날 적금보다 위인지 매달 확인하고 그 조건대로 파는 일은 사람보다 규칙이 잘합니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기

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