달러 환전 · 원달러 환율 · 실측 재현 페이지
1,000만원을 달러로 바꾸는 두 방법을 견줬습니다. 하나는 첫날 전부, 다른 하나는 1년 동안 매달 12번 같은 금액으로 바꿉니다. 아직 안 바꾼 원화에는 한국 3개월 금리, 먼저 바꾼 달러에는 미국 3개월 국채 금리만큼 이자를 붙이고, 1년 뒤 손에 쥔 달러를 비교했습니다. 시작 날을 하루씩 옮겨 가며, 시작한 달의 미국 금리가 한국보다 높았던 1,628번을 셌습니다.
| 상황 | 기준 |
|---|---|
| 미국 금리가 한국보다 높을 때 · 1년 뒤에 쓸 달러 | 나누지 말고 한 번에 바꾼다 — 1,628번 중 1,137번은 한 번에가 더 받았습니다 |
| 한국 금리가 같거나 더 높을 때 | 나눠 바꿔도 손해가 아니었습니다 — 3,556번 중 1,987번은 매달 나눈 쪽이 더 받았습니다 |
| 꼭대기가 무서우면 | 3달 간격 4번까지 — 미국이 높은 때 한 번에가 4번보다 더 받은 경우 1,152번(1,628번 중) |
| 가장 최근 금리 | 미국 3개월 2026-09 3.94% · 한국 3개월 2026-08 2.97% |
돌리는 법: zip 을 풀고 pip install numpy 뒤 python run_dollarsplit.py (1분 안팎).
[자료] 원달러 2004-12-31 ~ 2026-09-24 · 나쁜 프린트 보정 0건 · 1년 창 시작일 5,184개 (2005-10-09 ~ 2025-10-05)
[금리] 가장 최근 — 미국 3개월 2026-09 3.94% · 한국 3개월 2026-08 2.97%
[미국 금리가 한국보다 높았던 날에 시작] 시기: 2006-01~2007-02 · 2018-03~2020-02 · 2022-09~2025-10
1년 뒤 한 번에가 더 받음 1,137번 · 매달이 더 받음 491번 (모두 1,628번)
한 번에가 3달 간격 4번보다 더 받음 1,152번
가운데쯤(한 번에−매달 차이 순서 한가운데): 2019-12-18 시작 → 2020-12-03 · 한 번에 8,637달러 · 매달 8,505달러 · 차 132달러 (첫날 환율 1,162.78원 · 끝날 1,099.38원 · 그 달 3개월 금리 미국 1.54% · 한국 1.53%)
1년 사이 달러가 오른 시작일 1,077번 (66.2%) — 그중 한 번에가 더 받음 87.8% · 달러가 내린 해엔 34.7%
해별 (달러가 오른 시작일 / 매달이 더 받은 시작일 / 시작일):
2006: 38 / 202 / 260
2007: 42 / 33 / 43
2018: 218 / 0 / 218
2019: 157 / 53 / 260
2020: 0 / 23 / 43
2022: 16 / 67 / 86
2023: 235 / 25 / 260
2024: 226 / 17 / 262
2025: 145 / 71 / 196
2019-01-01 시작: 한 번에 9,177달러 · 매달 8,799달러 · 4번 8,883달러
2023-01-02 시작: 한 번에 8,341달러 · 매달 8,016달러 · 4번 8,039달러
2025-01-02 시작: 한 번에 7,068달러 · 매달 7,260달러 · 4번 7,275달러
[한국 금리가 같거나 더 높았던 날에 시작]
1년 뒤 한 번에가 더 받음 1,569번 · 매달이 더 받음 1,987번 (모두 3,556번)
1년 사이 달러가 오른 시작일 49.5%
[이자 몫만 — 환율이 1년 내내 그대로였다고 치면]
미국이 높은 때 한 번에가 더 받음 85.8% · 한국이 높은 때 5.5%
[환율 몫만 — 이자를 빼면]
미국이 높은 때 한 번에가 더 받음 67.4% · 한국이 높은 때 50.1%
[두 몫의 크기 — 미국이 높은 때, 한 번에 − 매달 차이]
이자 몫 한가운데 25달러 (크기만 26달러) · 환율 몫 한가운데 105달러 (크기만 171달러)
가운데쯤 경우의 1년 경로: 가장 높았던 날 2020-03-24 1,262.93원 · 가장 낮았던 값 1,099.38원
가운데쯤 경우의 환율 경로(5거래일마다 · 꼭대기·바닥 포함): 2019-12-18=1162.78 2019-12-25=1162.23 2020-01-01=1153.75 2020-01-08=1166.46 2020-01-15=1157.05 2020-01-22=1168.74 2020-01-29=1174.28 2020-02-05=1182.48 2020-02-12=1180.72 2020-02-19=1189.93 2020-02-26=1214.55 2020-03-04=1186.34 2020-03-11=1184.70 2020-03-18=1237.99 2020-03-24=1262.93 2020-03-25=1228.60 2020-03-31=1216.66 2020-04-07=1215.31 2020-04-14=1212.38 2020-04-21=1230.85 2020-04-28=1220.40 2020-05-05=1221.25 2020-05-12=1225.65 2020-05-19=1224.32 2020-05-26=1230.87 2020-06-02=1219.14 2020-06-09=1197.30 2020-06-16=1211.15 2020-06-23=1207.95 2020-06-30=1198.39 2020-07-07=1195.70 2020-07-14=1203.98 2020-07-21=1192.74 2020-07-28=1199.37 2020-08-04=1192.25 2020-08-11=1184.98 2020-08-18=1183.64 2020-08-25=1186.46 2020-09-01=1184.92 2020-09-08=1189.24 2020-09-15=1179.25 2020-09-22=1162.50 2020-09-29=1167.86 2020-10-06=1163.89 2020-10-13=1147.89 2020-10-20=1136.00 2020-10-28=1128.23 2020-11-04=1130.33 2020-11-11=1116.08 2020-11-18=1104.95 2020-11-25=1109.71 2020-12-02=1106.28 2020-12-03=1099.38
[판정 시점 점검 — 지난달 금리로 '미국이 높은 때'를 가르면]
미국이 높은 때 1,608번 · 한 번에가 더 받음 1,119번 (69.6%) · 그 달 값 판정과 갈린 시작일 110개
끝.
# -*- coding: utf-8 -*-
"""알고랩 재현 코드 — 1,000만원을 달러로: 한 번에 바꿀까, 1년 동안 매달 나눠 바꿀까.
돌리는 법: 이 파일 옆에 data_dollarsplit/ 폴더를 두고
pip install numpy
python run_dollarsplit.py
자료(2026-10-09 에 얼림):
data_dollarsplit/KRW_X_1d.csv 야후 KRW=X 일봉(원/달러 종가)
data_dollarsplit/fred_TB3MS.csv 미국 3개월 국채 금리(월평균, 연%) — FRED TB3MS
data_dollarsplit/fred_IR3TIB01KRM156N.csv 한국 3개월 금리(월, 연%) — FRED/OECD IR3TIB01KRM156N
규칙:
- 1년 = 252거래일. 한 번에 = 첫날 1,000만원을 그날 종가로 전부 달러로 바꾼다.
- 매달 = 21거래일 간격으로 12번, 같은 금액(83만 3,333원)을 그날 종가로 바꾼다.
- 아직 안 바꾼 원화는 한국 3개월 금리, 이미 바꾼 달러는 미국 3개월 금리로 하루 (연%/252) 씩 불어난다.
- 1년 끝에 손에 쥔 달러를 비교한다.
- 시작 날을 하루씩 옮긴다(2005-10 ~ 2025-10 시작). 시작한 달의 미국 금리가 한국보다 높으면 '미국이 높은 때'.
- 환전 수수료·스프레드·세금은 넣지 않았다. 종가에 바꾼 것으로 친다. 달러는 사기만 하고 1년 안에 되팔지 않는다.
"""
import csv
import os
import numpy as np
HERE = os.path.dirname(os.path.abspath(__file__))
D = os.path.join(HERE, "data_dollarsplit")
ASOF = "2026-10-09"
PIN = ("2004-12-31", "2026-09-26")
WON = 10_000_000
L = 252
def load_fx():
d = {}
with open(os.path.join(D, "KRW_X_1d.csv"), encoding="utf-8") as f:
for r in csv.DictReader(f):
try:
c = float(r["close"])
except (ValueError, TypeError):
continue
if c > 0 and r["date"][:10] <= ASOF:
d[r["date"][:10]] = c
ks = sorted(d)
x = np.array([d[k] for k in ks])
# 하루 ±8% 넘게 튀고 다음 날 되돌아오는 나쁜 프린트는 앞뒤 평균으로(이 구간에서는 0건)
r = np.diff(np.log(x))
bad = [i + 1 for i in range(len(r) - 1) if abs(r[i]) > 0.08 and abs(r[i + 1]) > 0.08 and r[i] * r[i + 1] < 0]
for i in bad:
x[i] = (x[i - 1] + x[i + 1]) / 2
return ks, x, len(bad)
def load_fred(name, col):
d = {}
with open(os.path.join(D, name), encoding="utf-8") as f:
for r in csv.DictReader(f):
try:
d[r["observation_date"][:7]] = float(r[col])
except ValueError:
pass
return d
def daily(ks, m):
out, last = [], None
for k in ks:
v = m.get(k[:7], last) # 아직 안 나온 달은 직전 달 값
out.append(v)
last = v
return np.array(out, float)
def weights(k):
w = np.zeros(L)
for i in range(k):
w[int(round(i * L / k))] += 1.0 / k
return w
def comma(v):
return f"{v:,.0f}"
ks_all, x_all, nbad = load_fx()
sel = [i for i, k in enumerate(ks_all) if PIN[0] <= k <= PIN[1]]
ks, x = [ks_all[i] for i in sel], x_all[sel]
N = len(x)
US = load_fred("fred_TB3MS.csv", "TB3MS")
KR = load_fred("fred_IR3TIB01KRM156N.csv", "IR3TIB01KRM156N")
ru, rk = daily(ks, US), daily(ks, KR)
CU = np.concatenate([[1.0], np.cumprod(1 + ru / 100 / 252)])[:N]
CK = np.concatenate([[1.0], np.cumprod(1 + rk / 100 / 252)])[:N]
starts = np.arange(200, N - L)
def run(wk, cu, ck, fx):
v = []
for s in starts:
e = s + L - 1
if wk is None:
v.append(WON / fx[s] * cu[e] / cu[s])
else:
j = np.arange(s, s + L)
v.append(WON * (wk * (ck[j] / ck[s]) / fx[j] * (cu[e] / cu[j])).sum())
return np.array(v)
one, mon, four = run(None, CU, CK, x), run(weights(12), CU, CK, x), run(weights(4), CU, CK, x)
gap = (ru - rk)[starts]
us = gap > 0
kr = ~us
up = np.array([x[s + L - 1] > x[s] for s in starts])
win = one > mon
print(f"[자료] 원달러 {ks[0]} ~ {ks[-1]} · 나쁜 프린트 보정 {nbad}건 · 1년 창 시작일 {len(starts):,}개 "
f"({ks[starts[0]]} ~ {ks[starts[-1]]})")
print(f"[금리] 가장 최근 — 미국 3개월 {max(US)} {US[max(US)]}% · 한국 3개월 {max(KR)} {KR[max(KR)]}%")
print()
# 미국이 높은 때가 이어진 시기
runs_, cur = [], None
for i in np.where(us)[0]:
m = ks[starts[i]][:7]
if cur and i == cur[2] + 1:
cur[1], cur[2] = m, i
else:
if cur:
runs_.append(cur[:2])
cur = [m, m, i]
runs_.append(cur[:2])
print("[미국 금리가 한국보다 높았던 날에 시작] 시기: " + " · ".join(f"{a}~{b}" for a, b in runs_))
n = int(us.sum())
w = int(win[us].sum())
print(f" 1년 뒤 한 번에가 더 받음 {w:,}번 · 매달이 더 받음 {n - w:,}번 (모두 {n:,}번)")
print(f" 한 번에가 3달 간격 4번보다 더 받음 {int((one[us] > four[us]).sum()):,}번")
d = one - mon
mi = np.where(us)[0]
mid = mi[np.argsort(d[mi])][len(mi) // 2]
s = starts[mid]
print(f" 가운데쯤(한 번에−매달 차이 순서 한가운데): {ks[s]} 시작 → {ks[s + L - 1]} · "
f"한 번에 {comma(one[mid])}달러 · 매달 {comma(mon[mid])}달러 · 차 {comma(one[mid] - mon[mid])}달러 "
f"(첫날 환율 {x[s]:,.2f}원 · 끝날 {x[s + L - 1]:,.2f}원 · 그 달 3개월 금리 미국 {ru[s]:.2f}% · 한국 {rk[s]:.2f}%)")
print(f" 1년 사이 달러가 오른 시작일 {int(up[us].sum()):,}번 ({up[us].mean() * 100:.1f}%) — "
f"그중 한 번에가 더 받음 {win[us & up].mean() * 100:.1f}% · 달러가 내린 해엔 {win[us & ~up].mean() * 100:.1f}%")
print(" 해별 (달러가 오른 시작일 / 매달이 더 받은 시작일 / 시작일):")
for y in sorted({ks[starts[i]][:4] for i in mi}):
m = np.array([ks[starts[i]].startswith(y) for i in range(len(starts))]) & us
print(f" {y}: {int(up[m].sum())} / {int((~win[m]).sum())} / {int(m.sum())}")
for y in ("2019-01", "2023-01", "2025-01"):
c = [i for i in mi if ks[starts[i]].startswith(y)]
if c:
i = c[0]
print(f" {ks[starts[i]]} 시작: 한 번에 {comma(one[i])}달러 · 매달 {comma(mon[i])}달러 · 4번 {comma(four[i])}달러")
print()
n2 = int(kr.sum())
w2 = int(win[kr].sum())
print("[한국 금리가 같거나 더 높았던 날에 시작]")
print(f" 1년 뒤 한 번에가 더 받음 {w2:,}번 · 매달이 더 받음 {n2 - w2:,}번 (모두 {n2:,}번)")
print(f" 1년 사이 달러가 오른 시작일 {up[kr].mean() * 100:.1f}%")
print()
# 이자만 떼어 보기 — 환율이 1년 내내 그대로였다면
flat = np.ones(N)
one_f, mon_f = run(None, CU, CK, flat), run(weights(12), CU, CK, flat)
print("[이자 몫만 — 환율이 1년 내내 그대로였다고 치면]")
print(f" 미국이 높은 때 한 번에가 더 받음 {(one_f[us] > mon_f[us]).mean() * 100:.1f}% · "
f"한국이 높은 때 {(one_f[kr] > mon_f[kr]).mean() * 100:.1f}%")
# 환율 몫만 — 이자를 빼면
ONE = np.ones(N)
one_n, mon_n = run(None, ONE, ONE, x), run(weights(12), ONE, ONE, x)
print("[환율 몫만 — 이자를 빼면]")
print(f" 미국이 높은 때 한 번에가 더 받음 {(one_n[us] > mon_n[us]).mean() * 100:.1f}% · "
f"한국이 높은 때 {(one_n[kr] > mon_n[kr]).mean() * 100:.1f}%")
# 두 몫의 크기(달러) — 한 번에 − 매달 차이를 이자로 생긴 몫과 환율로 생긴 몫으로 가른다
int_part = ((one - one_n) - (mon - mon_n))[us]
fx_part = (one_n - mon_n)[us]
print("[두 몫의 크기 — 미국이 높은 때, 한 번에 − 매달 차이]")
print(f" 이자 몫 한가운데 {np.median(int_part):,.0f}달러 (크기만 {np.median(np.abs(int_part)):,.0f}달러) · "
f"환율 몫 한가운데 {np.median(fx_part):,.0f}달러 (크기만 {np.median(np.abs(fx_part)):,.0f}달러)")
seg = x[starts[mid]:starts[mid] + L]
print(f" 가운데쯤 경우의 1년 경로: 가장 높았던 날 {ks[starts[mid] + int(np.argmax(seg))]} {seg.max():,.2f}원 · "
f"가장 낮았던 값 {seg.min():,.2f}원")
_j = sorted(set(list(range(0, L, 5)) + [L - 1, int(np.argmax(seg)), int(np.argmin(seg))]))
print(" 가운데쯤 경우의 환율 경로(5거래일마다 · 꼭대기·바닥 포함): "
+ " ".join(f"{ks[starts[mid] + j]}={seg[j]:.2f}" for j in _j))
# 판정 시점 점검 — 시작한 달의 월평균은 그날엔 다 안 나온 값이다. 지난달 값으로 다시 가른다
def prev_month(m):
y, mo = int(m[:4]), int(m[5:7])
y, mo = (y - 1, 12) if mo == 1 else (y, mo - 1)
return f"{y:04d}-{mo:02d}"
lag = np.array([US.get(prev_month(ks[s][:7]), np.nan) - KR.get(prev_month(ks[s][:7]), np.nan) for s in starts])
ul = lag > 0
print("[판정 시점 점검 — 지난달 금리로 '미국이 높은 때'를 가르면]")
print(f" 미국이 높은 때 {int(ul.sum()):,}번 · 한 번에가 더 받음 {int(win[ul].sum()):,}번 ({win[ul].mean() * 100:.1f}%) · "
f"그 달 값 판정과 갈린 시작일 {int((ul != us).sum()):,}개")
print()
print("끝.")
알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. "조금만 더 기다려 볼까" 싶을 때 정한 규칙을 지키는 일은 사람보다 봇이 잘합니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기
과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.