Skip to main content

Macro Capital Flow Dynamics

US 5-Asset Class 100% Stacked Allocation (Equity, Treasury, Cash, Gold, Crypto)

Data
Macro
주식 40%, 국채 25%, 현금 20%, 금 13%, 가상자산 2%
Author

gitSAM

Published

September 27, 2026

Keywords

Macro Capital Flow, Asset Allocation, DuckDB, FRED, Z.1, Stacked Area

1 분석 배경 및 목적

전략적 자산배분(Strategic Asset Allocation)은 각 자산군에 거의 고정된 목표 비중을 부여한다. 그런데 얼마가 적절할까? 미국 기준 경험적 휴리스틱(Heuristics)으로 포트폴리오 배분 비율은 주식 40%, 국채 25%, 현금 20%, 금 13%, 가상자산 2% 인듯 하다. 그러나 거시 자본시장은 정체된 구조가 아니며, 경기 국면과 통화 정책 충격에 따라 거대한 자본이 자산군 간을 끊임없이 이동한다.

미국 시장을 닫힌 계(Closed System)로 근사하여 5대 주요 자산군의 총 명목 평가액(Nominal Dollar Valuation, 단위: 10억 달러, Billions USD)을 산출하고, 전체 거시 자본 풀 내에서 각 자산군이 차지하는 100% 누적 상대 비중(100% Stacked Dynamic Allocation)의 시계열 동학을 추적해 봤다.

2 5대 자산군 대리 변수 및 평가 체계

자산군 간 상대 비중을 단일 매트릭스로 결합하기 위해 각 자산의 단순 가격 지수가 아닌 총 평가액 대리 변수(Proxy)를 10억 달러(Billions USD) 단위로 환산한다.

자산군 (Asset Class) 원천 통계 및 심볼 발표 기관 환산 공식 및 대리 변수 규격
US Cash (미국 달러) M2 통화량 (M2SL) St. Louis Fed FRED 원천 단위 10억 달러(Billions USD) 직접 연동
US Treasury Bond (미국 국채) 연방 총 공공부채 (GFDEBTN) FRED 백만 달러 / 1,000 로 나누어 10억 달러 단위로 변환
US Equities (미국 주식) Z.1 비금융법인 주식 시가총액 (NCBEILQ027S) Federal Reserve Z.1 백만 달러 / 1,000 환산 및 Wilshire 5000(W5000) 비율로 최근 결측치 외삽 보간
Gold (실물 금) 전 세계 지상 금 재고량 및 선물 종가 (gold_close) WGC / COMEX 지상 재고 21만 톤 x 32,150.7 트로이온스 x 온스당 가격 / 10억 달러
Crypto (가상자산) 비트코인 유통 공급량 및 종가 (btc_close) Blockchain / Exchange 추정 유통량 1,970만 BTC x BTC 달러 가격 / 10억 달러

임의 분기 시점 \(t\)에서 추적 대상 5대 자산군의 명목 총합 \(V_{\text{Total}, t}\)과 개별 자산군 \(k\)의 상대적 비중 \(W_{k, t}\)는 다음과 같이 정의된다.

\[ V_{\text{Total}, t} = \sum_{k \in A} V_{k, t}, \quad A = \{\text{Cash}, \text{Treasury}, \text{Equities}, \text{Gold}, \text{Crypto}\} \]

\[ W_{k, t} = \frac{V_{k, t}}{V_{\text{Total}, t}} \times 100 \quad \left(\sum_{k \in A} W_{k, t} = 100\%\right) \]

3 데이터 추출 및 정규화 파이프라인

원천 데이터는 capital_flow.duckdb에 적재된 시계열 테이블을 직접 조회하여 분기말(Quarterly End, QE) 주기로 리샘플링 및 결측치 보정을 수행한다.

Code
from pathlib import Path
import duckdb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 플롯 스타일 설정
plt.style.use('seaborn-v0_8-whitegrid' if 'seaborn-v0_8-whitegrid' in plt.style.available else 'default')
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['font.size'] = 10

# DuckDB 파일 경로 탐색
db_candidates = [
    Path('capital_flow.duckdb'),
    Path('posts/capital_flow.duckdb'),
    Path('../posts/capital_flow.duckdb')
]
db_path = next(p for p in db_candidates if p.exists())

con = duckdb.connect(str(db_path), read_only=True)

m2_df = con.execute("SELECT date, M2SL FROM m2sl ORDER BY date").fetchdf().set_index('date')
debt_df = con.execute("SELECT date, GFDEBTN FROM gfdebtn ORDER BY date").fetchdf().set_index('date')
z1_eq_df = con.execute("SELECT date, NCBEILQ027S FROM ncbeilq027s ORDER BY date").fetchdf().set_index('date')
w5000_df = con.execute("SELECT date, W5000 FROM w5000 ORDER BY date").fetchdf().set_index('date')
gold_df = con.execute("SELECT date, gold_close FROM gold ORDER BY date").fetchdf().set_index('date')
btc_df = con.execute("SELECT date, btc_close FROM btc ORDER BY date").fetchdf().set_index('date')

con.close()

# 명목 가치 환산 ($ Billions)
cash_val = m2_df['M2SL']
bonds_val = debt_df['GFDEBTN'] / 1000.0
eq_val = z1_eq_df['NCBEILQ027S'] / 1000.0
w5000_idx = w5000_df['W5000']
gold_val = 210000.0 * 32150.7 * gold_df['gold_close'] / 1e9
btc_val = 19.7e6 * btc_df['btc_close'] / 1e9

# 분기말(QE) 리샘플링 및 결측치 외삽 정합
macro_df = pd.DataFrame({
    'Cash': cash_val,
    'Treasury': bonds_val,
    'Equities': eq_val,
    'W5000': w5000_idx,
    'Gold': gold_val,
    'Crypto': btc_val
}).resample('QE').last()

# 최근 Z.1 주식 결측치는 직전 분기 W5000 대비 비율로 외삽 보완
ratio = (macro_df['Equities'] / macro_df['W5000']).dropna().iloc[-1]
macro_df['Equities'] = macro_df['Equities'].fillna(macro_df['W5000'] * ratio)
macro_df['Treasury'] = macro_df['Treasury'].ffill()
macro_df['Crypto'] = macro_df['Crypto'].fillna(0.0)

# 최종 5대 자산 명목 평가액 매트릭스 (2000년 이후)
asset_cols = ['Cash', 'Treasury', 'Equities', 'Gold', 'Crypto']
nominal_matrix = macro_df[asset_cols].loc['2000':].dropna()

# 100% 상대 비중 매트릭스 (%)
pct_matrix = nominal_matrix.divide(nominal_matrix.sum(axis=1), axis=0) * 100
pct_matrix.tail(5).round(2)
Cash Treasury Equities Gold Crypto
date
2025-09-30 13.98 23.73 44.38 16.49 1.42
2025-12-31 13.64 23.50 43.93 17.88 1.05
2026-03-31 13.77 23.76 42.58 19.08 0.82
2026-06-30 13.31 22.50 47.83 15.70 0.66
2026-09-30 13.10 21.92 47.67 16.37 0.94

4 거시 자본흐름 시계열 동학 시각화

2000년 1분기부터 최근까지 5대 자산군의 100% 누적 면적 그래프(Stacked Area Plot)를 통해 거시 충격 시점별 자본 재배분 양상을 시각화한다.

Code
palette = ['#4A90E2', '#50E3C2', '#F5A623', '#F8E71C', '#BD10E0']

fig, ax = plt.subplots()

ax.stackplot(
    pct_matrix.index,
    pct_matrix['Cash'],
    pct_matrix['Treasury'],
    pct_matrix['Equities'],
    pct_matrix['Gold'],
    pct_matrix['Crypto'],
    labels=['Cash (M2)', 'Bonds (Treasury)', 'Equities (US Stocks)', 'Gold (Above-ground)', 'Crypto (Bitcoin)'],
    colors=palette,
    alpha=0.88
)

ax.set_title('US Macro Capital Flow Dynamics: 100% Stacked Asset Allocation (2000 ~ Present)', fontsize=13, pad=15)
ax.set_ylabel('Aggregate Share of Total Capital Stock (%)', fontsize=11)
ax.set_ylim(0, 100)
ax.set_xlim(pct_matrix.index.min(), pct_matrix.index.max())

# 주요 거시 경제 이벤트 마커 표시
events = {
    '2008-09-15': '2008 Lehman GFC',
    '2020-03-15': '2020 COVID QE',
    '2022-03-16': '2022 Fed Tightening'
}
for dt_str, label in events.items():
    dt = pd.to_datetime(dt_str)
    if dt >= pct_matrix.index.min():
        ax.axvline(x=dt, color='#333333', linestyle='--', linewidth=1, alpha=0.7)
        ax.text(dt, 96, f' {label}', rotation=90, verticalalignment='top', fontsize=9, color='#111111')

ax.legend(loc='lower left', frameon=True, framealpha=0.9, facecolor='white', edgecolor='#cccccc', fontsize=9.5)
plt.tight_layout()
plt.show()

Code
labels = ['Cash (M2)', 'Treasury (Bonds)', 'Equities (US Stocks)', 'Gold (Above-ground)', 'Crypto (Bitcoin)']

fig, ax = plt.subplots()

for col, color, label in zip(asset_cols, palette, labels):
    ax.plot(pct_matrix.index, pct_matrix[col], label=label, color=color, linewidth=1.8)

ax.set_title('US Macro Capital Flow Dynamics: Individual Asset Allocation Share (2000 ~ Present)', fontsize=13, pad=15)
ax.set_ylabel('Aggregate Share of Total Capital Stock (%)', fontsize=11)
ax.set_ylim(0, 60)
ax.set_xlim(pct_matrix.index.min(), pct_matrix.index.max())

for dt_str, label in events.items():
    dt = pd.to_datetime(dt_str)
    if dt >= pct_matrix.index.min():
        ax.axvline(x=dt, color='#333333', linestyle='--', linewidth=1, alpha=0.7)
        ax.text(dt, 57, f' {label}', rotation=90, verticalalignment='top', fontsize=9, color='#111111')

ax.legend(loc='upper right', frameon=True, framealpha=0.9, facecolor='white', edgecolor='#cccccc', fontsize=9.5)
plt.tight_layout()
plt.show()

5 통계량 분석 및 경험적 배분과의 비교

5.1 최근 분기 자본 비중 및 1년 전 대비 변동폭

Code
latest_pct = pct_matrix.iloc[-1].round(2)
yoy_chg = (pct_matrix.iloc[-1] - pct_matrix.iloc[-5]).round(2)

summary_df = pd.DataFrame({
    '최근비중 (%)': latest_pct,
    '전년동기대비 변동 (%p)': yoy_chg,
    '명목평가액 ($B)': nominal_matrix.iloc[-1].round(1)
})
summary_df
최근비중 (%) 전년동기대비 변동 (%p) 명목평가액 ($B)
Cash 13.10 -0.88 23342.8
Treasury 21.92 -1.81 39065.4
Equities 47.67 3.29 84957.2
Gold 16.37 -0.12 29175.2
Crypto 0.94 -0.48 1672.3

5.2 장기 상대 비중 기초 통계량 (2000년 ~ 현재)

Code
stats_summary = pct_matrix.describe().T[['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']]
stats_summary = stats_summary.rename(columns={'50%': 'median'}).round(2)
stats_summary
count mean std min 25% median 75% max
Cash 105.0 19.32 2.26 13.10 18.43 19.24 20.41 24.90
Treasury 105.0 27.02 2.46 20.53 25.01 27.87 29.04 31.17
Equities 105.0 40.31 5.21 27.90 38.10 40.85 44.03 55.22
Gold 105.0 13.14 3.62 6.68 10.77 12.16 15.54 22.11
Crypto 105.0 0.21 0.37 0.00 0.00 0.00 0.22 1.43

5.3 실증적 시사점

  1. 경험적 휴리스틱의 실증적 정합성
  • 시장에서 통용되는 40:25:20:13:2 (주식:국채:현금:금:가상자산) 배분 비율은 2000년 이후 실제 거시 자본 장기 평균과 놀라울 정도로 일치한다.
  • 105개 분기 실증 데이터상 평균 비중은 주식 40.31%, 국채 27.02%, 현금(M2) 19.32%, 금 13.14%, 가상자산 0.21%를 기록했다.
  • 임의로 설정된 포트폴리오 가중치가 아니라, 미국 거시 경제 시스템 내 실물 자본 총량의 장기 구조적 균형점이 40:27:19:13의 질서로 형성되어 있음을 시사한다.
  1. 경기 국면별 안전 자산 쏠림 (Flight to Safety)
  • 2008년 글로벌 금융위기 당시 주식 비중은 27.9%까지 급락한 반면, 현금과 국채의 합산 비중은 50%를 상회하며 유동성 풀로 자본이 급격히 피신했다.
  • 2020년 팬데믹 직후 대규모 양적완화(QE) 국면에서는 M2 통화량 급증으로 현금 비중이 일시 팽창한 뒤, 위험 자산 랠리가 전개되며 주식 비중이 55.2%까지 사상 최대치로 확대되었다.
  1. 대체 자산의 완충 기능
  • 금은 위기 구간마다 20%를 상회하는 비중으로 급등하여 화폐 가치 하락과 신용 위험에 대한 전통적 헤지 역할을 수행했다.
  • 비트코인 등 가상자산은 2020년 이후 독립적인 자본 풀을 형성하기 시작했으며, 최근 분기 기준 전체 거시 자본의 약 1% 수준까지 점유율을 넓히며 신규 자산군으로 정착하고 있다.