독수리 요새
달러인덱스 수익률, 한미 국채 스프레드, 초과 유동성 등 시각화 본문
KRW/USD 환율의 수익률과 DXY (Dollar Index) 수익률의 상관관계 추이 (Claude 활용)


# 필요한 패키지 설치 및 로드
if(!require(quantmod)) install.packages("quantmod")
if(!require(tidyverse)) install.packages("tidyverse")
if(!require(zoo)) install.packages("zoo")
library(quantmod)
library(tidyverse)
library(zoo)
# 데이터 다운로드
cat("데이터 다운로드 중...\n")
# KRW/USD 환율 (Yahoo Finance에서 다운로드)
getSymbols("KRW=X", src = "yahoo", from = "2010-01-01", auto.assign = TRUE)
krw_usd <- `KRW=X`
# DXY (Dollar Index) 다운로드
getSymbols("DX-Y.NYB", src = "yahoo", from = "2010-01-01", auto.assign = TRUE)
dxy <- `DX-Y.NYB`
# 종가 추출
krw_close <- Cl(krw_usd)
dxy_close <- Cl(dxy)
# 데이터 병합
data <- merge(krw_close, dxy_close)
colnames(data) <- c("KRW_USD", "DXY")
# 결측치 제거
data <- na.omit(data)
# 일일 수익률 계산
returns <- data.frame(
Date = index(data),
KRW_Return = as.numeric(dailyReturn(data$KRW_USD)),
DXY_Return = as.numeric(dailyReturn(data$DXY))
)
# 결측치 제거
returns <- na.omit(returns)
cat("데이터 수집 완료!\n")
cat(sprintf("분석 기간: %s ~ %s\n",
format(min(returns$Date), "%Y-%m-%d"),
format(max(returns$Date), "%Y-%m-%d")))
cat(sprintf("총 관측치: %d\n\n", nrow(returns)))
# 1. 전체 기간 상관계수
overall_cor <- cor(returns$KRW_Return, returns$DXY_Return)
cat(sprintf("전체 기간 상관계수: %.4f\n\n", overall_cor))
# 2. 롤링 윈도우 상관계수 계산 (252일 = 약 1년)
window_size <- 252
rolling_cor <- rollapply(
returns[, c("KRW_Return", "DXY_Return")],
width = window_size,
FUN = function(x) cor(x[,1], x[,2]),
by.column = FALSE,
align = "right"
)
rolling_data <- data.frame(
Date = returns$Date[(window_size):nrow(returns)],
Correlation = as.numeric(rolling_cor)
)
# 3. 시각화
par(mfrow = c(2, 2), mar = c(4, 4, 3, 2))
# 그래프 1: 산점도
plot(returns$DXY_Return, returns$KRW_Return,
xlab = "DXY 수익률", ylab = "KRW/USD 수익률",
main = "수익률 산점도",
pch = 16, col = rgb(0, 0, 1, 0.3), cex = 0.5)
abline(lm(KRW_Return ~ DXY_Return, data = returns), col = "red", lwd = 2)
legend("topleft", legend = sprintf("상관계수: %.4f", overall_cor), bty = "n")
# 그래프 2: 롤링 상관계수
plot(rolling_data$Date, rolling_data$Correlation,
type = "l", col = "blue", lwd = 2,
xlab = "날짜", ylab = "상관계수",
main = sprintf("롤링 상관계수 (%d일 윈도우)", window_size),
ylim = c(-1, 1))
abline(h = 0, col = "gray", lty = 2)
abline(h = overall_cor, col = "red", lty = 2)
legend("topright",
legend = c("롤링 상관계수", "전체 평균"),
col = c("blue", "red"), lty = c(1, 2), lwd = 2, bty = "n")
# 그래프 3: 수익률 시계열
plot(returns$Date, returns$KRW_Return,
type = "l", col = "darkgreen",
xlab = "날짜", ylab = "수익률",
main = "KRW/USD 일일 수익률")
# 그래프 4: DXY 수익률 시계열
plot(returns$Date, returns$DXY_Return,
type = "l", col = "purple",
xlab = "날짜", ylab = "수익률",
main = "DXY 일일 수익률")
# 4. 연도별 상관계수
returns$Year <- format(returns$Date, "%Y")
yearly_cor <- returns %>%
group_by(Year) %>%
summarise(
Correlation = cor(KRW_Return, DXY_Return),
N = n()
) %>%
filter(N > 50) # 충분한 관측치가 있는 연도만
cat("\n연도별 상관계수:\n")
print(yearly_cor, n = Inf)
# 5. 추가 시각화: 연도별 상관계수 막대그래프
dev.new()
par(mar = c(5, 4, 3, 2))
barplot(yearly_cor$Correlation,
names.arg = yearly_cor$Year,
col = ifelse(yearly_cor$Correlation > 0, "steelblue", "coral"),
main = "연도별 상관계수",
ylab = "상관계수",
xlab = "연도",
ylim = c(-1, 1),
las = 2)
abline(h = 0, col = "black", lwd = 2)
abline(h = overall_cor, col = "red", lty = 2, lwd = 2)
legend("topright",
legend = c("전체 평균"),
col = "red", lty = 2, lwd = 2, bty = "n")
1. 전체 상관계수 (0.2707)
약한 양의 상관관계를 보입니다. 이는 DXY(달러인덱스)가 상승할 때 KRW/USD 환율도 상승(원화 약세)하는 경향이 있지만, 그 관계가 매우 강하지는 않다는 의미입니다.
- 상관계수 0.27은 통계적으로 유의미하지만, 설명력은 약 7% (0.27²) 정도입니다
- DXY 외에 다른 요인들(한국 경제 펀더멘털, 지정학적 리스크, 자본 흐름 등)이 원화 환율에 더 큰 영향을 미친다는 것을 시사합니다
2. 롤링 상관계수 추이
2015년경 급격한 하락이 눈에 띕니다:
- 2015년 이전: 상관계수가 대체로 0.3~0.5 수준으로 안정적
- 2015년 중반: 급격히 하락하여 거의 0에 근접하거나 음수로 전환
- 이후: 점진적으로 회복되어 0.3~0.5 수준으로 복귀
2015년 상관관계 붕괴 원인 추정:
- 중국 경제 둔화 및 위안화 평가절하 (2015년 8월)
- 한국이 중국 경제와 밀접하게 연동되어 있어, 이 시기 원화는 달러보다 중국 요인에 더 크게 반응
- 미국의 금리 인상 기대와 실제 인상 시점의 괴리
최근(2020년 이후):
- 상관관계가 0.4~0.5 수준으로 상승하여 역사적 평균보다 높은 수준 유지
- 코로나19 이후 글로벌 금융시장의 동조화 현상 강화
- 미 연준의 공격적 통화정책이 주도적 역할을 하면서 달러 강세가 원화를 포함한 대부분의 통화에 영향
3. 수익률 그래프
이건 매일매일 환율이 얼마나 오르락내리락했는지 보여줍니다.
- 초록색(원화): 매일 -4%에서 +4% 정도 움직여요
- 보라색(달러): 매일 -2%에서 +2% 정도 움직여요
- 원화가 달러보다 더 많이 움직인다는 걸 알 수 있어요!
DXY (Dollar Index) 수익률과 한미 국채 스프레드 상관관계 (Gemini 활용)

# 1. 필요 패키지 로드
library(quantmod)
# 2. 데이터 불러오기 (FRED 소스 활용)
# IRLTLT01KRM156N: 한국 10년물 국채 수익률 (월간)
# DGS10: 미국 10년물 국채 수익률 (일간)
symbols <- c("IRLTLT01KRM156N", "DGS10")
getSymbols(symbols, src = "FRED")
# 3. 데이터 정렬 및 스프레드 계산
# 한국 데이터가 월간 단위이므로, 미국 데이터도 월간 평균으로 변환하여 맞춥니다.
us_10y_monthly <- to.monthly(DGS10, OHLC = FALSE)
kr_10y_monthly <- IRLTLT01KRM156N
# 날짜를 맞춰 병합 (NA 제거)
combined_yields <- na.omit(merge(kr_10y_monthly, us_10y_monthly))
colnames(combined_yields) <- c("KR_10Y", "US_10Y")
# 스프레드 계산 (한국 금리 - 미국 금리)
combined_yields$Spread <- combined_yields$KR_10Y - combined_yields$US_10Y
# 4. 시각화
plot(combined_yields$Spread,
main = "KR-US 국채 10년물 금리 스프레드 (위험 프리미엄 대용)",
col = "darkgreen",
lwd = 2,
ylab = "Yield Spread (%)",
xlab = "Time")
abline(h = 0, col = "red", lty = 2) # 0 기준선 (역전 여부 확인)

# 1. 필요 패키지 로드
library(quantmod)
library(zoo)
# 2. 데이터 불러오기
symbols <- c("DX-Y.NYB", "IRLTLT01KRM156N", "DGS10")
getSymbols("DX-Y.NYB", src = "yahoo", from = "2010-01-01")
getSymbols(c("IRLTLT01KRM156N", "DGS10"), src = "FRED")
# 3. 데이터 전처리
dxy_monthly <- monthlyReturn(Ad(`DX-Y.NYB`))
index(dxy_monthly) <- as.yearmon(index(dxy_monthly))
us_10y_monthly <- apply.monthly(DGS10, mean)
index(us_10y_monthly) <- as.yearmon(index(us_10y_monthly))
kr_10y_monthly <- IRLTLT01KRM156N
index(kr_10y_monthly) <- as.yearmon(index(kr_10y_monthly))
spread <- kr_10y_monthly - us_10y_monthly
final_df <- na.omit(merge(dxy_monthly, spread))
colnames(final_df) <- c("DXY_Ret", "Yield_Spread")
# 4. 기간 분할
df_2010s <- final_df["2010/2019"]
df_2020s <- final_df["2020/2026"]
# 5. 시각화 설정 (대제목을 위한 외곽 여백 추가)
# mfrow: 1행 2열 배치
# oma: 전체 그래프의 바깥쪽 여백 (하, 좌, 상, 우) - 상단에 3줄 분량 확보
par(mfrow = c(1, 2), oma = c(0, 0, 4, 0), mar = c(5, 4, 4, 2))
# --- 그래프 1: 2010-2019 ---
cor_10s <- cor(as.numeric(df_2010s$DXY_Ret), as.numeric(df_2010s$Yield_Spread))
years_10s <- format(index(df_2010s), "%Y")
plot(as.numeric(df_2010s$DXY_Ret), as.numeric(df_2010s$Yield_Spread),
main = paste0("Period: 2010-2019\n(Correlation: ", round(cor_10s, 2), ")"),
xlab = "DXY Monthly Return", ylab = "KR-US Yield Spread",
pch = 19, col = rainbow(10)[as.factor(years_10s)],
xlim = range(df_2010s$DXY_Ret), ylim = range(df_2010s$Yield_Spread))
abline(lm(Yield_Spread ~ DXY_Ret, data = df_2010s), col = "black", lwd = 2, lty = 2)
grid()
# --- 그래프 2: 2020-현재 ---
cor_20s <- cor(as.numeric(df_2020s$DXY_Ret), as.numeric(df_2020s$Yield_Spread))
years_20s <- format(index(df_2020s), "%Y")
plot(as.numeric(df_2020s$DXY_Ret), as.numeric(df_2020s$Yield_Spread),
main = paste0("Period: 2020-Present\n(Correlation: ", round(cor_20s, 2), ")"),
xlab = "DXY Monthly Return", ylab = "KR-US Yield Spread",
pch = 19, col = rainbow(7)[as.factor(years_20s)],
xlim = range(df_2020s$DXY_Ret), ylim = range(df_2020s$Yield_Spread))
abline(lm(Yield_Spread ~ DXY_Ret, data = df_2020s), col = "black", lwd = 2, lty = 2)
grid()
# 6. 전체 대제목 추가
mtext("DXY 수익률과 KR-US 국채 스프레드 상관관계 비교",
side = 3, line = 1, outer = TRUE, cex = 1.5, font = 2)
mtext("분석 기간: 2010년 ~ 2026년 (Source: Yahoo Finance & FRED)",
side = 3, line = -1, outer = TRUE, cex = 1.0, font = 3)
# 설정 초기화
par(mfrow = c(1, 1), oma = c(0, 0, 0, 0))
📊 분석: "각자도생"에서 "운명공동체"로
1. 2010 ~ 2019년 (r = -0.02): 완벽한 디커플링
- 의미: 상관계수 -0.02는 통계적으로 "아무런 관계가 없다"는 뜻입니다.
- 배경: 이 시기는 글로벌 저금리와 저물가가 지속된 '골디락스' 기간이었습니다. 미국이 금리를 올려도 시장이 놀라지 않았고, 달러 가치와 한국 국채의 상대적 위험(스프레드)이 서로 다른 논리로 움직였습니다. 즉, 달러가 강해진다고 해서 한국 국채가 특별히 더 위험해 보이거나 금리 차이가 벌어지는 상황이 아니었습니다.
2. 2020년 ~ 현재 (r = 0.48): 강력한 동조화 (Coupling)
- 의미: 상관계수가 0.48까지 치솟은 것은 이제 두 지표가 상당히 밀접하게 같은 방향으로 움직이기 시작했다는 뜻입니다.
- 배경: 2022년 이후 '고물가-고금리' 시대가 열리면서 모든 것이 "미국 연준(Fed)"이라는 하나의 변수에 종속되었습니다.
- 메커니즘: 미 연준의 공격적 금리 인상 → 달러 인덱스(DXY) 급등 → 한국 시장에서의 자금 유출 우려 및 한국 국채 리스크 프리미엄 상승 → KR-US 스프레드 확대.
- 결론: 이제 달러가 움직이면 한국의 국채 스프레드도 즉각적으로 반응하는 '매우 민감한 구조'로 시장 체질이 바뀌었습니다.
한국-미국 국채 스프레드가 양수 : 미국 채권 금리가 한국보다 낮다. 일반적으로 신흥국인 한국의 국채는 안전자산인 미국 국채보다 더 높은 금리를 제공해야 자금이 유입되므로, 이것이 정상적 상태. 한국 자산의 금리 매력이 유지되므로, 환율(원화)이 비교적 안정적인 흐름을 보일 가능성이 큼.
한국-미국 국채 스프레드가 음수 : 미국 채권 금리가 한국보다 높다. 미국의 강력한 긴축으로 기준금리가 상승하거나 인플레이션 우려로 미국 국채 금리가 급등했을 때 발생하는 상황. 미국 채권이 한국 채권보다 훨씬 매력적인 상황으로 한국에서 자금이 유출되어 달러인덱스 상승 및 원달러 환율 상승의 요인.
미국 초과 유동성 추이 (Gemini 활용)

# 1. 필요 패키지 로드
library(quantmod)
library(zoo)
# 2. 데이터 불러오기
symbols <- c("M2SL", "GDPC1")
getSymbols(symbols, src = "FRED")
# 3. 날짜 형식 통일 및 데이터 병합
# M2를 분기 데이터로 변환 (평균값 사용)
m2_q <- apply.quarterly(M2SL, mean)
# M2와 GDP의 인덱스를 '2024 Q1' 같은 분기 형식으로 통일하여 날짜 어긋남 방지
index(m2_q) <- as.yearqtr(index(m2_q))
index(GDPC1) <- as.yearqtr(index(GDPC1))
# 두 데이터를 날짜 기준으로 병합 (교집합만 유지)
combined_data <- merge(m2_q, GDPC1, all = FALSE)
colnames(combined_data) <- c("M2", "GDP")
# 4. 전년 동기 대비(YoY) 증가율 계산 (%)
# ROC 함수를 사용하고, n=4(4분기 전과 비교)로 설정
m2_growth <- ROC(combined_data$M2, n = 4, type = "discrete") * 100
gdp_growth <- ROC(combined_data$GDP, n = 4, type = "discrete") * 100
# 5. 초과 유동성 계산 (M2 증가율 - GDP 증가율)
excess_liq <- m2_growth - gdp_growth
colnames(excess_liq) <- "Excess_Liquidity"
# 6. 시각화 (NA 제거 후 출력)
plot(na.omit(excess_liq),
main = "미국 초과 유동성 추이\n(M2 YoY% - Real GDP YoY%)",
col = "darkblue",
lwd = 2,
ylab = "Gap (%)",
xlab = "Year")
# 0 기준선 추가
abline(h = 0, col = "red", lty = 2, lwd = 1.5)
# 꽉 찬 그래프를 위해 그리드 추가
grid()
한국의 초과 유동성 추이나 DXY 또는 국채 금리 스프레드와의 상관관계도 시각화를 하고 싶은데 코드가 잘 작동을 안해서 여기까지만 하고 그냥 제미나이한테 값을 바로 구해서 내놓으라고 했다.

미국이 돈줄을 죄면(유동성 마이너스), 미국의 금리 매력도가 한국보다 압도적으로 높아지며, 특히 2020년 이후부터 과거보다 훨씬 더 즉각적이고 뚜렷하게 원/달러 환율을 밀어 올린다. 미국 초과 유동성은 2023-2024년 사이에 음수를 기록하여 강력한 긴축을 시사하였지만, 2025년도 들어서는 양수로 전환되었다. 이처럼 미국 기준 금리가 완만하게 낮아지면서 채권 가격이 상승할 수 있어 특히 중기채 위주로 관찰 및 대응이 필요하다. 이에 따라 현재 음수인 한미 국채 스프레드도 보다 값이 커지면서 한미 환율 압력도 이론적으로는 약간 완화될 수 있다.
그러나 환율을 결정하는 요인은 미국의 기준금리뿐은 아니다. 한국의 국민주권정부가(실제와 기호가 너무 노골적으로 따로 노니까 화가 난다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ) 돈을 쳐 풀어버리는 더더욱 강력한 변수가 있기 때문에, 나는 원화의 중장기 미래에 대해 낙관하지 않는다. 하여튼 2025년도엔 뉴스만 틀면 돈 풀어 제끼는 소식뿐이었서 너무 화가 나서 제목만 보고 안 봤으며, 정치 지형을 보면 이 짓거리는 당분간 계속될 것으로 보이고, 한국은 현재 미국보다도 초과 유동성 증가율이 훨씬 높아서 거의 원 홍수가 났다. 이 모든 것은 원화로 월급 받는 직장인으로서는 절망적이기가 그지없는데, 나는 가능한 한 고국에서 모국어 쓰면서 살다가 죽고 싶으므로 원화 자산만이라도 망명시켜서 각자도생하는 대응을 할 수밖에.
미국 중기채 가격 또는 수익률과 금리의 관계 (Gemini 활용)


# 1. 필수 패키지 로드
library(quantmod)
# 2. 데이터 불러오기 (2002~2025)
getSymbols("IEF", src = "yahoo", from = "2002-01-01", to = "2026-01-01")
getSymbols("DGS10", src = "FRED", from = "2002-01-01", to = "2026-01-01")
# 3. 데이터 전처리
ief_price <- to.monthly(Ad(IEF))[,4] # 수정 주가
dgs10_rate <- to.monthly(DGS10)[,4]
final_data <- na.omit(merge(ief_price, dgs10_rate))
colnames(final_data) <- c("Price", "Yield")
# 4. 시각화 (이중 축, 정방향)
par(mar = c(5, 4, 4, 5) + 0.1)
# --- 왼쪽 축: IEF 가격 (Blue) ---
plot(index(final_data), final_data$Price, type = "l", col = "blue", lwd = 2,
main = "미국 중기채(IEF) 가격 vs 10년물 금리 추이\n(2002 - 2025)",
ylab = "IEF Price ($)", xlab = "Year", ylim = c(70, 130))
grid()
# --- 오른쪽 축: 10년물 금리 (Red, 정방향) ---
par(new = TRUE)
plot(index(final_data), final_data$Yield, type = "l", col = "firebrick", lwd = 2,
axes = FALSE, xlab = "", ylab = "", ylim = c(0, 6))
axis(side = 4, at = seq(0, 6, 1))
mtext("US 10-Year Treasury Yield (%)", side = 4, line = 3, col = "firebrick")
# 범례
legend("topleft", legend = c("IEF Price (Left)", "10Y Yield (Right)"),
col = c("blue", "firebrick"), lwd = 2, bty = "n")
IEF 1년 수익률과 Fed 기준금리 변화량 간 상관관계 분석

IEF 1년 수익률과 Fed 기준금리 변화량 간 인과관계 분석

결론: 연준의 기준금리 결정 시점보다 채권 시장의 가격 반응이 먼저 나타난다
가장 주목해야 할 부분은 가설 2(IEF → Fed)의 결과입니다.
- 가설 2 (IEF 수익률 → 금리 변화): p-value가 0.003996으로 매우 낮습니다. (별 두 개 **)
- 해석: 통계적으로 "IEF 수익률의 움직임이 기준금리 변화를 예측하는 유의미한 정보가 된다"는 뜻입니다. 즉, 채권 시장은 연준이 금리를 올리거나 내리기 훨씬 전부터 이미 그 방향을 읽고 가격에 먼저 반영합니다.
- 가설 1 (금리 변화 → IEF 수익률): p-value가 0.07287입니다. (점 . 수준)
- 해석: 유의수준 0.05를 기준으로 하면 통계적으로 기각되지만, 0.1 수준에서는 어느 정도 관계가 있습니다. 즉, 연준이 금리를 실제로 바꾼 뒤에 채권 수익률이 따라가는 현상은 상대적으로 약하다는 것입니다.
즉, 채권 수익률은 연준의 금리 결정과 동조적이지만, 시간상으로는 앞서 움직이는 경향이 있으며 이는 예측 변수로서 유의미합니다. 다만 정책을 ‘선도한다’고 단정할 수준의 증거까지는 아닙니다.


'미분류' 카테고리의 다른 글
| 방송통신대 졸업 기념 전공 후기 (0) | 2026.01.06 |
|---|---|
| 원 홍수 관련 시각화: 초과 유동성, 국가부채, 인구 구조 (0) | 2026.01.03 |
| R 시각화, 한국 거시경제 파악, 투자 대응 (0) | 2025.12.27 |
| KPI: 과학인가 종교인가 (0) | 2025.12.03 |
| 차이코프스키 교향곡 5번 연습 기록 (0) | 2025.10.22 |