퀀트 투자 입문 ⑪ — 자산 배분 기초: 주식과 채권을 섞는 이유
“주식과 채권을 섞어라”는 투자 조언 중에서 가장 오래되고 가장 흔한 말입니다. 그런데 왜 섞어야 하는지를 숫자로 본 적은 별로 없었습니다. 채권은 주식보다 덜 오르니까, 섞으면 수익률이 그만큼 깎이고 위험도 그만큼 줄어드는 것 아닌가. 그렇다면 굳이 섞을 이유가 없습니다. 위험을 줄이고 싶으면 그냥 주식을 덜 사면 되니까요.
이 글은 그 의문을 데이터로 확인해 본 기록입니다. 결론부터 말하면, 위험은 비중에 비례해서 줄지 않습니다. 그보다 훨씬 많이 줍니다. 그리고 그 이유가 자산 배분이라는 분야 전체의 출발점입니다. 퀀트 투자 입문에서 던진 세 질문 중 하나에 대한 답입니다.
데이터와 계산 방법
국내 데이터로 하고 싶었지만, 국내 채권의 장기 수익률 자료를 무료로 구하기가 쉽지 않았습니다. 대표적인 국고채 10년물 ETF는 2011년에 상장되어 큰 하락장을 한 번밖에 담지 못합니다. 그래서 이번에는 미국 데이터를 씁니다. 로버트 실러 교수가 공개한 월별 자료에 S&P500 지수, 배당, 10년물 국채 금리가 1871년부터 들어 있고, 이를 CSV로 정리해 둔 공개 저장소가 있어서 한 줄로 읽을 수 있습니다. 1950년부터, 사용한 사본에 금리 값이 들어 있는 마지막 달인 2023년 9월까지 884개월입니다. 이 자료의 주가와 금리는 월말 값이 아니라 그달 일별 값의 평균이라서, 월말 종가로 계산할 때보다 변동성과 낙폭이 작게 나오고 연간 수익률도 조금 다릅니다. 예를 들어 2022년 S&P500 총수익률은 월말 기준으로 약 -18%였지만, 이 자료로 계산하면 -15.0%입니다. 또 사본에는 배당이 2023년 6월까지만 들어 있어서 2023년 7~9월 석 달은 배당 없이 가격 변화만 반영했습니다.
주식 수익률은 지수 변화에 배당을 더한 총수익률입니다. 채권 수익률은 조금 손이 갑니다. 자료에 있는 것은 금리뿐이고, 금리가 오르면 채권 가격은 떨어집니다. 그래서 “지난달 금리로 발행된 10년 만기 채권을 이번 달 금리로 다시 평가한 가격 변화에 한 달치 이자를 더한 값”으로 근사했습니다. 정확한 채권 지수와는 차이가 있지만, 금리 상승기에 채권이 손실을 보는 구조를 그대로 담고 있습니다.
import pandas as pd
import numpy as np
url = "https://raw.githubusercontent.com/datasets/s-and-p-500/main/data/data.csv"
df = pd.read_csv(url, parse_dates=["Date"], index_col="Date")
df = df[["SP500", "Dividend", "Long Interest Rate"]].dropna().loc["1950":]
# 주식: 가격 변화 + 배당 (Dividend 열은 연율이므로 12로 나눔)
stock = (df["SP500"] + df["Dividend"] / 12) / df["SP500"].shift(1) - 1
# 채권: 지난달 금리로 발행된 10년물을 이번 달 금리로 재평가 + 한 달치 이자
y = df["Long Interest Rate"] / 100
c, ynew = y.shift(1), y
price = c * (1 - (1 + ynew) ** -10) / ynew + (1 + ynew) ** -10
bond = price - 1 + c / 12
r = pd.concat({"Stock": stock, "Bond": bond}, axis=1).dropna()
def summary(x):
cum = (1 + x).cumprod()
cagr = cum.iloc[-1] ** (12 / len(x)) - 1
vol = x.std() * np.sqrt(12)
mdd = (cum / cum.cummax() - 1).min()
return pd.Series({"CAGR": cagr, "Vol": vol, "MDD": mdd})
# 주식 비중 100%, 80%, ... 0% — 매월 비중을 원래대로 되돌린다(리밸런싱)
mixes = {f"{int(w*100)}/{100-int(w*100)}": w * r["Stock"] + (1 - w) * r["Bond"]
for w in [1.0, 0.8, 0.6, 0.4, 0.2, 0.0]}
print(pd.DataFrame({k: summary(v) for k, v in mixes.items()}).round(3))
w * stock + (1 - w) * bond로 월별 수익률을 섞는다는 것은 매월 말 비중을 원래대로 맞춘다는 뜻입니다. 이 리밸런싱이 어떤 역할을 하는지는 다음 글에서 따로 다루고, 오늘은 섞는 것 자체의 효과에 집중합니다. 아래 표와 그림을 만드는 전체 코드는 asset_allocation_basics.py에 있습니다. 다른 글의 코드도 코드 페이지에 모아 두었습니다.
결과: 곡선이 휘어진다
| 주식/채권 | CAGR | 연 변동성 | MDD | 샤프비율 | 최장 침체 |
|---|---|---|---|---|---|
| 100/0 | 11.3% | 12.1% | -49.0% | 0.71 | 73개월 |
| 80/20 | 10.2% | 9.8% | -38.9% | 0.75 | 63개월 |
| 60/40 | 9.1% | 7.8% | -27.0% | 0.78 | 41개월 |
| 40/60 | 7.9% | 6.2% | -18.3% | 0.78 | 33개월 |
| 20/80 | 6.6% | 5.6% | -18.1% | 0.64 | 23개월 |
| 0/100 | 5.3% | 6.2% | -23.0% | 0.39 | 40개월 |
샤프비율은 위험 지표 글과 같이 무위험수익률 3%를 가정했습니다.
수익률 열만 보면 예상대로입니다. 채권 비중이 20%p 늘 때마다 CAGR이 1.1~1.3%p씩 거의 일정하게 줄어듭니다. 그런데 변동성 열은 그렇지 않습니다. 주식 100%에서 80/20으로 가면 변동성이 2.3%p 줄고, 60/40에서는 다시 2.0%p 줄어드는데, 20/80은 채권 100%보다 변동성이 낮습니다. 채권만 들고 있는 것보다 주식을 20% 섞은 쪽이 덜 흔들렸다는 뜻입니다.
이걸 그림으로 보면 명확합니다. 가로축이 변동성, 세로축이 수익률입니다.

두 자산을 잇는 선이 직선이 아니라 왼쪽으로 불룩하게 휘어 있습니다. 만약 위험이 비중에 정비례해서 줄었다면 100/0과 0/100을 잇는 직선 위에 점들이 놓였을 겁니다. 실제로는 그 직선보다 모두 왼쪽에 있고, 곡선의 끝부분은 아예 뒤로 꺾입니다. 이 휘어진 곡선이 이 글에서 가장 중요한 그림입니다.
왜 휘어지는가
60/40의 숫자로 계산해 보겠습니다. 주식 변동성 12.1%, 채권 변동성 6.2%이니 가중평균은 0.6 × 12.1 + 0.4 × 6.2 = 9.7%입니다. 그런데 실제 60/40의 변동성은 7.8%입니다. 가중평균보다 1.9%p 낮습니다.
그 차이를 만드는 것은 두 자산의 상관계수입니다. 884개월 전체로 계산한 주식과 채권 월간 수익률의 상관계수는 0.05, 거의 0입니다. 주식이 떨어지는 달에 채권도 같이 떨어지는 경향이 거의 없었다는 뜻입니다. 한쪽이 흔들릴 때 다른 쪽이 가만히 있거나 반대로 움직이면, 합쳐 놓은 전체의 흔들림은 각각의 흔들림을 더한 것보다 작아집니다. 상관계수가 1이었다면 정확히 가중평균이 됐을 것이고, -1이었다면 변동성이 0에 가까운 조합도 만들 수 있었을 겁니다. 이 관계의 수식은 상관관계와 분산투자의 수학에서 다룹니다. 지금은 “상관계수가 낮을수록 곡선이 더 휜다”까지만 잡아 두면 됩니다.
MDD에서도 같은 효과가 보입니다.

주식 100%의 최대 낙폭은 2009년 -49%였고, 60/40은 -27%였습니다. 비중대로라면 -49% × 0.6 ≈ -29%에 채권 손실이 더해져야 하는데, 오히려 그보다 얕습니다. 그 시기에 채권이 올랐기 때문입니다. 2000~2002년 IT 거품 붕괴 구간에서는 격차가 더 큽니다. 주식이 -42%까지 빠지는 동안 60/40은 -18%에서 멈췄습니다.
예상과 달랐던 것: 2022년
여기까지만 쓰면 자산 배분 교과서의 첫 장과 같습니다. 그런데 이동 상관계수를 그려 보니 교과서에 없는 것이 보였습니다.

상관계수 0.05는 전체 기간의 평균일 뿐이었습니다. 1970년대부터 1990년대까지는 +0.2에서 +0.6 사이의 플러스였습니다. 주식과 채권이 같은 방향으로 움직이던 시절입니다. 2000년 이후에야 다시 마이너스로 내려갔고, 2010년대 초에는 -0.75까지 갔습니다. 우리가 “주식 떨어지면 채권 오른다”고 상식처럼 알고 있는 관계는 사실 2000년부터 2021년까지 20여 년의 특징이었습니다.
그리고 2022년에 그 관계가 깨졌습니다.
| 기간 | 상관계수 | 주식 | 채권 | 60/40 |
|---|---|---|---|---|
| 1950~1999 | +0.21 | |||
| 2000~2021 | -0.32 | +393% | +197% | +332% |
| 2022 | +0.50 | -15.0% | -14.9% | -14.8% |
2022년에는 인플레이션과 금리 인상으로 주식과 채권이 나란히 15%씩 떨어졌습니다. 60/40도 똑같이 -14.8%입니다. 섞은 효과가 그해에는 전혀 없었습니다. 60/40의 역대 낙폭을 보면 1974년 -25%, 2009년 -27%에 이어 2022년이 -18.6%로 세 번째로 깊습니다. 채권이 주식의 방패가 되어 주지 못한 해였습니다.
이것이 자산 배분의 정직한 한계입니다. 분산 효과는 상관계수가 낮을 때 나오는 것이고, 상관계수는 고정된 상수가 아니라 시기에 따라 움직이는 값입니다. 특히 인플레이션이 문제가 되는 시기에는 주식과 채권이 같이 맞습니다. 1970년대가 그랬고 2022년이 그랬습니다.
그래도 섞는 이유
그렇다면 2022년 같은 해가 있는데 왜 섞어야 할까요. 표를 다시 보면 답이 있습니다. 74년 동안 60/40의 최장 침체 기간은 41개월, 주식 100%는 73개월입니다. 최악의 낙폭은 -27% 대 -49%입니다. 2022년에 방패가 되지 못했다는 것은 사실이지만, 1974년, 1987년, 2002년, 2009년에는 방패가 됐습니다. 상관계수가 플러스였던 1970~90년대에도 곡선은 여전히 휘어 있었습니다. 상관계수가 1이 아닌 한 휘어지기 때문입니다.
연 수익률 2.2%p를 내주고 최악의 순간의 손실을 절반으로 줄이는 거래. 앞서 절대 모멘텀 글에서 “수익의 일부를 내주고 최악의 낙폭을 사는 보험”이라고 표현했는데, 자산 배분은 그보다 훨씬 단순한 보험입니다. 신호도, 매매 타이밍도, 파라미터도 없습니다. 비중 하나를 정하고 유지하는 것이 전부입니다.
다만 이 실험에서 채권은 매월 새로 발행된 10년물로 갈아타는 것을 가정했고, 매월 리밸런싱을 했고, 세금과 비용은 없었습니다. 그중 리밸런싱은 생각보다 큰 변수입니다. 안 하면 어떻게 되는지, 매월 대신 매년 하면 어떤지, 다음 글에서 같은 데이터로 확인하겠습니다.
2026-09-28 수정: 다시 계산한 값에 맞춰 표의 40/60 연 변동성을 6.3%에서 6.2%로, 2000~2021년 주식·채권 상관계수를 -0.33에서 -0.32로 고쳤습니다.
2026-10-22 수정: 데이터 기간의 끝(2023년 9월)을 “자료가 끝나는 달”이 아니라 사본에 금리 값이 있는 마지막 달로 바로잡고, 실러 자료의 주가·금리가 그달의 평균값이라는 점과 2023년 7~9월에는 배당이 빠져 있다는 점을 밝혔으며, 자산 배분이 절대 모멘텀보다 “훨씬 싼” 보험이라는 비교를 절대 모멘텀 글의 보험료(연 1.8%p 안팎)에 맞춰 비용이 아니라 단순함의 비교로 고쳤습니다.
이 글은 학습과 정보 공유 목적으로 작성되었으며, 특정 종목이나 상품에 대한 투자 권유가 아닙니다. 투자의 판단과 책임은 투자자 본인에게 있습니다.