Skip to content
Published on

연금저축과 DC형 퇴직연금 ETF 포트폴리오 설계 가이드 2026

Authors
  • Name
    Twitter
연금저축과 DC형 퇴직연금 ETF 포트폴리오 설계 가이드 2026

개요: 왜 연금 계좌에서 ETF 포트폴리오를 직접 설계해야 하는가

한국의 퇴직연금 적립금은 2025년 말 기준 400조 원을 넘어섰다. 그런데 DC형 퇴직연금 가입자의 약 80%가 원리금보장형 상품에 방치하고 있다. 연 2-3%대 예금 이자로 30년을 굴리면, 인플레이션을 감안한 실질 수익률은 사실상 제로에 가깝다. 연금저축펀드도 사정은 비슷하다. 세액공제를 받기 위해 가입만 하고, 정작 운용은 방치하는 경우가 대부분이다.

이 글은 연금저축펀드와 DC형 퇴직연금 계좌에서 ETF를 활용한 포트폴리오를 직접 설계하려는 투자자를 위한 가이드다. TDF(Target Date Fund)에 맡기는 대신 직접 자산배분을 설계하고, 글라이드패스를 구현하고, 세액공제를 최적화하는 방법을 다룬다. 단순한 ETF 종목 추천이 아니라, 구조적으로 견고한 포트폴리오를 설계하는 원칙과 도구를 제공한다.

연금저축펀드 제도 정리

가입 자격과 납입 한도

연금저축펀드는 소득이나 나이에 관계없이 누구나 가입할 수 있다. 가정주부, 학생, 프리랜서 모두 가입 가능하다. 연간 납입 한도는 1,800만 원이며, 이 중 세액공제 대상은 최대 600만 원이다. IRP와 합산하면 세액공제 한도가 900만 원까지 확대된다.

세액공제율

총급여 5,500만 원 이하(또는 종합소득 4,500만 원 이하)인 경우 공제율은 **16.5%**이고, 초과하면 **13.2%**이다. 최대 세액공제액은 다음과 같다.

구분총급여 5,500만 원 이하총급여 5,500만 원 초과
연금저축 600만 원99만 원 환급79.2만 원 환급
연금저축 600 + IRP 300148.5만 원 환급118.8만 원 환급

투자 가능 상품

연금저축펀드 계좌에서는 펀드, ETF, 리츠에 투자할 수 있다. 개별 주식은 불가능하다. 위험자산 투자 비중에 제한이 없다는 점이 IRP와의 가장 큰 차이다. 즉 연금저축펀드에서는 주식형 ETF 100% 포트폴리오 구성이 가능하다.

수령 조건

만 55세 이후 10년 이상 분할 수령하면 연금소득세(3.3-5.5%)가 적용된다. 중도 해지 시 기타소득세 16.5%가 부과되므로 장기 유지가 핵심이다.

DC형 퇴직연금 투자 규정

DC형의 구조

DC형(확정기여형) 퇴직연금은 회사가 매년 연봉의 1/12 이상을 퇴직연금 계좌에 적립하고, 운용 방법은 근로자가 직접 결정하는 구조다. 운용 성과에 따라 퇴직금이 달라진다. 연봉 4,800만 원이면 회사가 매년 약 400만 원을 DC 계좌에 납입하고, 이를 근로자가 ETF, 펀드, 예금 등으로 운용한다.

위험자산 70% 한도 규정

DC형 퇴직연금의 가장 중요한 제약은 위험자산 투자 한도 70% 규정이다. 적립금의 최소 30%는 반드시 안전자산에 투자해야 한다. 이 규정은 2026년 현재까지 유효하며, 금융감독원이 한도 폐지를 추진 중이나 노동부와 의견이 엇갈려 시행 시점은 불확실하다.

안전자산과 위험자산 분류

분류해당 상품비고
안전자산정기예금, ELB, 채권형 펀드/ETF, 채권 비중 50% 이상 혼합형 ETF, 머니마켓 ETF30% 이상 필수
위험자산주식형 펀드/ETF, 리츠 ETF, 해외 주식형 ETF, 섹터/테마 ETF70% 이하 제한
TDF채권 비중에 따라 안전/위험 분류 상이빈티지별 확인 필요

연금저축 vs IRP vs DC형 비교

항목연금저축펀드IRPDC형 퇴직연금
가입 자격누구나소득자회사 DC형 도입 시 자동
납입 주체본인본인회사 + 본인(추가 납입)
세액공제 한도연 600만 원연금저축 합산 900만 원본인 추가납입분만 공제
위험자산 한도제한 없음70%70%
중도 인출자유(세금 부과)법정 사유만 가능법정 사유만 가능
운용 자유도높음중간중간
계좌 이전IRP로 가능타 금융사 IRP 가능퇴사 시 IRP로 이전

자산배분 원칙: 연금 포트폴리오의 기초

전략적 자산배분(SAA)의 핵심

연금 포트폴리오에서 자산배분은 수익의 90% 이상을 결정한다. Gary Brinson의 유명한 연구가 보여주듯, 종목 선택이나 시장 타이밍보다 자산 클래스 간 배분 비율이 압도적으로 중요하다.

연금 계좌의 자산배분에서 고려해야 할 핵심 자산 클래스는 다음 네 가지다.

  1. 국내 주식: KOSPI200 또는 KRX300 추종 ETF
  2. 해외 주식: S&P500, 선진국(MSCI World), 신흥국 ETF
  3. 국내 채권: 국고채, 종합채권 ETF
  4. 대체자산: 금, 리츠, 물가연동채 ETF

포트폴리오 자산배분 계산기

아래 Python 코드는 연령과 위험 성향에 따라 자산배분 비율을 계산하고, DC형 퇴직연금의 70% 위험자산 한도를 자동으로 반영한다.

from dataclasses import dataclass

@dataclass
class PensionAllocation:
    """연금 포트폴리오 자산배분 계산기"""
    age: int
    retirement_age: int = 60
    risk_tolerance: str = "moderate"  # conservative, moderate, aggressive
    account_type: str = "pension_savings"  # pension_savings, dc, irp

    # 위험 성향별 기본 주식 비중 (30세 기준)
    BASE_EQUITY = {"conservative": 50, "moderate": 70, "aggressive": 85}

    def equity_ratio(self) -> float:
        """연령에 따른 주식 비율 계산 (글라이드패스 반영)"""
        years_to_retire = max(self.retirement_age - self.age, 0)
        base = self.BASE_EQUITY[self.risk_tolerance]
        # 은퇴까지 남은 기간에 비례해 주식 비중 조정
        if years_to_retire >= 30:
            ratio = base
        elif years_to_retire <= 0:
            ratio = max(base * 0.35, 20)  # 은퇴 후 최소 20%
        else:
            decay = (30 - years_to_retire) / 30 * 0.65
            ratio = base * (1 - decay)
        return round(ratio, 1)

    def apply_dc_constraint(self, equity_pct: float) -> dict:
        """DC형/IRP 위험자산 70% 한도 적용"""
        if self.account_type in ("dc", "irp"):
            equity_pct = min(equity_pct, 70.0)
        safe_pct = 100.0 - equity_pct
        return {"equity": equity_pct, "safe": safe_pct}

    def build_allocation(self) -> dict:
        """전체 자산배분 구성"""
        eq = self.equity_ratio()
        constrained = self.apply_dc_constraint(eq)

        equity = constrained["equity"]
        safe = constrained["safe"]

        return {
            "국내주식": round(equity * 0.3, 1),
            "해외주식": round(equity * 0.55, 1),
            "신흥국주식": round(equity * 0.15, 1),
            "국내채권": round(safe * 0.5, 1),
            "해외채권": round(safe * 0.25, 1),
            "대체자산(금/리츠)": round(safe * 0.25, 1),
            "위험자산합계": equity,
            "안전자산합계": safe,
            "계좌유형": self.account_type,
        }


# 사용 예시
for age in [30, 40, 50, 60]:
    alloc = PensionAllocation(
        age=age, account_type="dc", risk_tolerance="moderate"
    )
    result = alloc.build_allocation()
    print(f"\n[{age}세 DC형 moderate]")
    for k, v in result.items():
        if isinstance(v, float):
            print(f"  {k}: {v}%")
        else:
            print(f"  {k}: {v}")

글라이드패스 설계: TDF를 직접 구현한다

글라이드패스란

글라이드패스(Glide Path)는 투자자의 나이가 들수록 위험자산(주식) 비중을 줄이고 안전자산(채권) 비중을 늘리는 자산배분 경로다. TDF(Target Date Fund)의 핵심 메커니즘이며, 직접 ETF 포트폴리오를 운용할 때도 이 개념을 적용해야 한다.

한국의 주요 자산운용사(미래에셋, KB, 삼성, NH-Amundi)들은 각각 한국인의 기대수명, GDP 성장률, 급여인상률을 반영한 한국형 글라이드패스를 설계하고 있다. NH-Amundi 하나로 TDF는 글로벌 운용사 올스프링과 공동 연구로 개발한 글라이드패스를 사용한다.

TDF vs DIY ETF 포트폴리오 비교

항목TDF (예: RISE TDF2045)DIY ETF 포트폴리오
운용 편의성매우 높음 (올인원)낮음 (직접 관리)
총보수0.3-0.8%/년0.03-0.15%/년 (ETF 개별)
글라이드패스자동 조정수동 또는 스크립트
자산 구성 커스터마이징불가자유
투명성낮음 (펀드 내부 구조)높음 (보유 ETF 직접 확인)
30년 누적 보수 차이 (1억 기준)약 900만-2,400만 원약 90만-450만 원

30년간 보수 차이가 최대 2,000만 원에 달할 수 있다. 이것이 DIY ETF 포트폴리오를 고려해야 하는 가장 강력한 이유다.

글라이드패스 시뮬레이션 코드

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

def simulate_glide_path(
    start_age: int = 25,
    retire_age: int = 60,
    end_age: int = 85,
    initial_equity: float = 85.0,
    retire_equity: float = 40.0,
    final_equity: float = 25.0,
) -> dict:
    """
    글라이드패스 시뮬레이션
    - 축적기(start_age ~ retire_age): 주식 비중 점진 감소
    - 인출기(retire_age ~ end_age): 주식 비중 추가 감소
    """
    ages = list(range(start_age, end_age + 1))
    equity_ratios = []

    for age in ages:
        if age <= retire_age:
            # 축적기: 선형 감소
            progress = (age - start_age) / (retire_age - start_age)
            eq = initial_equity - (initial_equity - retire_equity) * progress
        else:
            # 인출기: 완만한 감소
            progress = (age - retire_age) / (end_age - retire_age)
            eq = retire_equity - (retire_equity - final_equity) * progress
        equity_ratios.append(round(eq, 1))

    bond_ratios = [round(100 - eq, 1) for eq in equity_ratios]

    # 시각화
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.stackplot(
        ages,
        equity_ratios,
        bond_ratios,
        labels=["Equity (주식)", "Bond/Alt (채권/대체)"],
        colors=["#2563eb", "#94a3b8"],
        alpha=0.85,
    )
    ax.axvline(x=retire_age, color="red", linestyle="--", label="은퇴 시점")
    ax.set_xlabel("나이")
    ax.set_ylabel("비중 (%)")
    ax.set_title("연금 포트폴리오 글라이드패스")
    ax.legend(loc="upper right")
    ax.set_xlim(start_age, end_age)
    ax.set_ylim(0, 100)
    plt.tight_layout()
    plt.savefig("glide_path.png", dpi=150)
    plt.close()

    # 5년 단위 요약
    summary = {}
    for age, eq in zip(ages, equity_ratios):
        if age % 5 == 0 or age == retire_age:
            summary[age] = {"equity": eq, "bond": round(100 - eq, 1)}

    return summary


result = simulate_glide_path()
for age, alloc in result.items():
    phase = "인출기" if age >= 60 else "축적기"
    print(f"  {age}세 [{phase}]: 주식 {alloc['equity']}% / 채권 {alloc['bond']}%")

출력 예시:

  25[축적기]: 주식 85.0% / 채권 15.0%
  30[축적기]: 주식 78.6% / 채권 21.4%
  35[축적기]: 주식 72.1% / 채권 27.9%
  40[축적기]: 주식 65.7% / 채권 34.3%
  45[축적기]: 주식 59.3% / 채권 40.7%
  50[축적기]: 주식 52.9% / 채권 47.1%
  55[축적기]: 주식 46.4% / 채권 53.6%
  60[인출기]: 주식 40.0% / 채권 60.0%
  65[인출기]: 주식 37.0% / 채권 63.0%
  70[인출기]: 주식 34.0% / 채권 66.0%
  75[인출기]: 주식 31.0% / 채권 69.0%
  80[인출기]: 주식 28.0% / 채권 72.0%
  85[인출기]: 주식 25.0% / 채권 75.0%

연령대별 포트폴리오 모델

20-30대: 공격적 성장형

은퇴까지 30년 이상 남았다면 시간이 최대의 무기다. 주식 비중을 극대화한다.

자산 클래스연금저축 비중DC형 비중ETF 예시
해외주식 (미국)45%40%TIGER 미국S&P500, KODEX 미국S&P500TR
해외주식 (선진국/신흥국)15%10%TIGER 선진국MSCI World, KODEX MSCI EM
국내주식25%20%KODEX 200, RISE KRX300
국내채권10%20%KODEX 종합채권(AA-이상)액티브
금/대체자산5%10%KODEX 골드선물(H)

DC형에서 안전자산(채권+금) 비중을 30%로 맞춘 점에 유의하라. 연금저축에서는 이 제약이 없으므로 주식 비중을 85%까지 올릴 수 있다.

40대: 균형 성장형

은퇴까지 15-20년. 성장과 안정의 균형점을 찾는 시기다.

자산 클래스연금저축 비중DC형 비중ETF 예시
해외주식 (미국)30%30%TIGER 미국S&P500
해외주식 (배당)10%10%TIGER 미국배당다우존스
국내주식15%15%KODEX 200
국내채권25%25%RISE 국고채10년
해외채권10%10%KODEX 미국채10년선물
금/리츠10%10%KODEX 골드선물(H), TIGER 리츠부동산인프라

50대: 안정 수익형

은퇴 5-10년 전. 원금 보전이 최우선이며, 인출 시점에 맞춘 안전자산 비중 확대가 필수다.

자산 클래스연금저축 비중DC형 비중ETF 예시
해외주식 (미국)20%20%TIGER 미국S&P500
국내주식 (배당)10%10%TIGER 배당성장
국내채권 (단기)30%30%KODEX 단기채권PLUS
국내채권 (중장기)20%20%RISE 국고채10년
머니마켓/KOFR10%10%TIGER KOFR금리액티브
10%10%KODEX 골드선물(H)

연령대별 자산배분 모델 요약

연령대주식 비중채권 비중대체자산핵심 전략
20-30대70-85%10-20%5-10%해외주식 중심 공격적 성장
40대50-65%25-35%10-15%성장+배당 균형
50대30-45%40-55%10-15%채권 중심 안정 전환
60대+20-30%50-65%10-15%인출 대비 유동성 확보

ETF 선택 기준: 무엇을 기준으로 고르는가

5대 선정 기준

연금 계좌에서 ETF를 고를 때 가장 중요한 기준 다섯 가지를 우선순위 순으로 정리한다.

  1. 총보수율(TER): 0.1% 차이가 30년이면 수백만 원이다. 같은 지수를 추종하는 ETF라면 반드시 가장 낮은 보수 상품을 선택한다.
  2. 추적오차(Tracking Error): 지수 대비 수익률 괴리가 작을수록 좋다. 추적오차가 큰 ETF는 장기 운용 시 복리 손실이 누적된다.
  3. 순자산총액(AUM): 최소 500억 원 이상. AUM이 작으면 상장폐지 위험이 있고, 매매 시 스프레드가 벌어진다.
  4. 거래량: 일평균 거래량이 10만 주 이상이면 유동성 문제가 없다. 연금 계좌에서는 시장가 주문보다 지정가 주문을 사용하라.
  5. 분배금 정책: 연금 계좌 내에서는 분배금이 과세 이연되므로 분배금 재투자형(TR)이 유리하다.

주요 국내 ETF 비교

ETF 이름추종 지수총보수AUM (억원)DC형 분류용도
KODEX 200KOSPI2000.05%50,000+위험자산국내주식 코어
TIGER 미국S&P500S&P5000.07%40,000+위험자산해외주식 코어
KODEX 미국S&P500TRS&P500 (총수익)0.09%15,000+위험자산해외주식 (분배금 재투자)
KODEX 종합채권(AA-이상)액티브KIS 종합채권0.05%20,000+안전자산채권 코어
RISE 국고채10년KTB 10Y0.05%8,000+안전자산중장기 채권
TIGER KOFR금리액티브KOFR0.03%60,000+안전자산파킹/안전자산
KODEX 골드선물(H)금 선물0.07%5,000+위험자산인플레이션 헤지
TIGER 리츠부동산인프라국내 리츠0.08%3,000+위험자산대체자산/배당

세액공제 최적화: 납입 순서와 계좌 배분 전략

세액공제 극대화 납입 순서

세액공제를 최대로 받기 위한 최적 납입 순서는 다음과 같다.

  1. 연금저축펀드 600만 원 납입 (세액공제율 13.2% 또는 16.5%)
  2. IRP 300만 원 추가 납입 (합산 900만 원 한도 채움)
  3. ISA 만기 자금을 IRP로 이전 (추가 300만 원 10% 세액공제)
  4. 연금저축 추가 납입 (세액공제 초과분은 과세이연 효과만)

세액공제 최적화 계산기

def optimize_tax_deduction(
    total_annual_saving: int,
    gross_salary: int,
    has_isa_maturity: bool = False,
    isa_transfer_amount: int = 0,
) -> dict:
    """
    연금저축/IRP 세액공제 최적화 계산기
    - total_annual_saving: 연간 연금 납입 가능 총액 (원)
    - gross_salary: 총급여 (원)
    - has_isa_maturity: ISA 만기 이전 여부
    - isa_transfer_amount: ISA에서 IRP로 이전하는 금액 (원)
    """
    # 세액공제율 결정
    if gross_salary <= 55_000_000:
        deduction_rate = 0.165
        bracket = "16.5%"
    else:
        deduction_rate = 0.132
        bracket = "13.2%"

    remaining = total_annual_saving

    # 1단계: 연금저축 600만 원
    pension_saving = min(remaining, 6_000_000)
    remaining -= pension_saving

    # 2단계: IRP 추가 납입 (합산 900만 원 한도)
    irp_limit = 9_000_000 - pension_saving
    irp_deposit = min(remaining, irp_limit)
    remaining -= irp_deposit

    # 3단계: ISA 만기 이전 추가 공제
    isa_extra_deduction = 0
    if has_isa_maturity:
        isa_eligible = min(isa_transfer_amount, 3_000_000)
        isa_extra_deduction = int(isa_eligible * 0.10)

    # 4단계: 세액공제 초과 납입 (과세이연만)
    excess_deposit = remaining  # 세액공제는 안 되지만 과세이연 효과

    # 결과 계산
    deductible_total = pension_saving + irp_deposit
    tax_refund = int(deductible_total * deduction_rate) + isa_extra_deduction

    return {
        "세액공제율": bracket,
        "연금저축_납입": f"{pension_saving:,}원",
        "IRP_납입": f"{irp_deposit:,}원",
        "세액공제_대상_합계": f"{deductible_total:,}원",
        "연말정산_환급액": f"{tax_refund:,}원",
        "ISA_추가공제": f"{isa_extra_deduction:,}원",
        "과세이연_추가납입": f"{excess_deposit:,}원",
    }


# 시나리오 비교
scenarios = [
    {"total_annual_saving": 9_000_000, "gross_salary": 40_000_000},
    {"total_annual_saving": 12_000_000, "gross_salary": 70_000_000},
    {"total_annual_saving": 18_000_000, "gross_salary": 50_000_000,
     "has_isa_maturity": True, "isa_transfer_amount": 3_000_000},
]

for i, s in enumerate(scenarios, 1):
    print(f"\n=== 시나리오 {i} ===")
    result = optimize_tax_deduction(**s)
    for k, v in result.items():
        print(f"  {k}: {v}")

계좌별 자산 배치 전략

세금 효율을 극대화하려면 자산 종류에 따라 어떤 계좌에 담을지도 전략적으로 결정해야 한다.

자산 유형최적 계좌이유
해외주식 ETF연금저축위험자산 한도 없음, 해외 배당 과세이연
국내주식 ETFDC형/IRP국내주식 매매차익 비과세(일반계좌)이므로 연금 혜택 작음
채권 ETFDC형/IRP안전자산 30% 의무 충족용
금/리츠 ETF연금저축일반계좌 대비 과세이연 효과 극대화

핵심 원칙은 **"일반 계좌에서 세금을 가장 많이 내는 자산을 연금 계좌에 담는다"**이다. 해외주식 ETF는 일반 계좌에서 양도세 22%가 부과되지만, 연금 계좌에서는 인출 시 연금소득세 3.3-5.5%만 부과된다.

리밸런싱 전략: 연금 계좌 특화 방식

연금 계좌에서 리밸런싱이 유리한 이유

일반 계좌에서 리밸런싱하면 매도 시 양도세가 발생한다. 그러나 연금 계좌 내에서는 매매 차익에 대한 과세가 이연되므로, 리밸런싱 비용이 사실상 매매 수수료만 존재한다. 이것이 연금 계좌에서 ETF 포트폴리오를 운용하는 또 하나의 구조적 이점이다.

리밸런싱 트리거 판단 스크립트

아래 코드는 현재 포트폴리오 비중과 목표 비중의 편차를 확인하고, 리밸런싱이 필요한지 판단한다.

from datetime import datetime, timedelta

def check_rebalance_trigger(
    current_weights: dict,
    target_weights: dict,
    threshold_pct: float = 5.0,
    last_rebalance_date: str = "2025-09-15",
    min_interval_days: int = 90,
) -> dict:
    """
    리밸런싱 트리거 판단
    - threshold_pct: 편차 기준 (기본 5%)
    - min_interval_days: 최소 리밸런싱 간격 (기본 90일)
    """
    today = datetime.now()
    last_date = datetime.strptime(last_rebalance_date, "%Y-%m-%d")
    days_since = (today - last_date).days
    time_ok = days_since >= min_interval_days

    deviations = {}
    trigger_assets = []

    for asset in target_weights:
        current = current_weights.get(asset, 0)
        target = target_weights[asset]
        deviation = current - target
        deviations[asset] = round(deviation, 2)
        if abs(deviation) >= threshold_pct:
            trigger_assets.append(asset)

    needs_rebalance = len(trigger_assets) > 0 and time_ok

    actions = {}
    if needs_rebalance:
        for asset in target_weights:
            diff = target_weights[asset] - current_weights.get(asset, 0)
            if abs(diff) >= 1.0:
                action = "매수" if diff > 0 else "매도"
                actions[asset] = f"{action} {abs(diff):.1f}%p"

    return {
        "날짜": today.strftime("%Y-%m-%d"),
        "마지막_리밸런싱": last_rebalance_date,
        "경과일": days_since,
        "최소간격_충족": time_ok,
        "편차": deviations,
        "기준초과_자산": trigger_assets,
        "리밸런싱_필요": needs_rebalance,
        "조정_액션": actions,
    }


# 예시: 40대 DC형 포트폴리오
target = {
    "해외주식": 40.0, "국내주식": 15.0, "배당ETF": 10.0,
    "국내채권": 25.0, "해외채권": 5.0, "금": 5.0,
}
current = {
    "해외주식": 47.2, "국내주식": 13.8, "배당ETF": 11.5,
    "국내채권": 20.1, "해외채권": 4.2, "금": 3.2,
}

result = check_rebalance_trigger(current, target)
for k, v in result.items():
    print(f"  {k}: {v}")

연금 계좌 리밸런싱의 실전 팁

  • 캐시플로우 리밸런싱: 매달 납입금으로 비중이 낮은 자산을 매수해 매도 없이 비중을 조정한다. 거래 비용이 0이다.
  • 연 1회 대규모 리밸런싱: 12월 세액공제 납입과 함께 포트폴리오 전체를 정비한다.
  • 비중 편차 5%p 이상 시만 매매: 1-2%p 차이로 매매하면 수수료만 소모된다.

몬테카를로 은퇴 시뮬레이션

포트폴리오의 장기 성과를 예측하고, 은퇴 시 목표 자금 달성 확률을 추정하기 위한 몬테카를로 시뮬레이션이다.

import numpy as np

def monte_carlo_retirement(
    current_age: int = 35,
    retire_age: int = 60,
    monthly_contribution: int = 750_000,  # 월 납입액 (원)
    initial_balance: int = 20_000_000,    # 현재 잔액 (원)
    equity_ratio_start: float = 0.70,     # 초기 주식 비중
    equity_ratio_end: float = 0.40,       # 은퇴 시 주식 비중
    equity_return: float = 0.08,          # 주식 기대수익률 (연)
    equity_vol: float = 0.18,             # 주식 변동성 (연)
    bond_return: float = 0.035,           # 채권 기대수익률 (연)
    bond_vol: float = 0.04,              # 채권 변동성 (연)
    inflation: float = 0.025,             # 기대 인플레이션
    n_simulations: int = 5000,
    target_amount: int = 500_000_000,     # 목표 은퇴자금 (원)
) -> dict:
    """몬테카를로 은퇴 자금 시뮬레이션"""
    years = retire_age - current_age
    months = years * 12

    np.random.seed(42)
    final_balances = []

    for _ in range(n_simulations):
        balance = initial_balance

        for month in range(months):
            year_progress = month / months
            # 글라이드패스 적용
            eq_ratio = equity_ratio_start - (
                equity_ratio_start - equity_ratio_end
            ) * year_progress
            bond_ratio = 1 - eq_ratio

            # 월간 수익률 시뮬레이션 (정규분포)
            eq_monthly_r = np.random.normal(
                equity_return / 12, equity_vol / np.sqrt(12)
            )
            bond_monthly_r = np.random.normal(
                bond_return / 12, bond_vol / np.sqrt(12)
            )

            portfolio_return = eq_ratio * eq_monthly_r + bond_ratio * bond_monthly_r
            balance = balance * (1 + portfolio_return) + monthly_contribution

        # 인플레이션 조정 (실질 가치)
        real_balance = balance / ((1 + inflation) ** years)
        final_balances.append(real_balance)

    final_balances = np.array(final_balances)
    success_rate = np.mean(final_balances >= target_amount) * 100

    return {
        "시뮬레이션_횟수": n_simulations,
        "투자_기간": f"{years}년",
        "월_납입액": f"{monthly_contribution:,}원",
        "목표_금액": f"{target_amount:,}원",
        "중위값(실질)": f"{int(np.median(final_balances)):,}원",
        "하위_10%(실질)": f"{int(np.percentile(final_balances, 10)):,}원",
        "상위_10%(실질)": f"{int(np.percentile(final_balances, 90)):,}원",
        "목표달성_확률": f"{success_rate:.1f}%",
        "최악_시나리오(실질)": f"{int(np.percentile(final_balances, 5)):,}원",
    }


# 35세, 월 75만 원 납입, 은퇴 목표 5억
result = monte_carlo_retirement()
print("=== 몬테카를로 은퇴 시뮬레이션 결과 ===")
for k, v in result.items():
    print(f"  {k}: {v}")

이 시뮬레이션으로 납입액, 은퇴 시점, 자산배분 비율을 조정하며 목표 달성 확률의 변화를 확인할 수 있다. 목표 달성 확률이 70% 이상이면 합리적인 계획으로 볼 수 있으며, 50% 미만이면 납입액 증액이나 은퇴 시점 연기를 검토해야 한다.

트러블슈팅: 수수료와 세금의 함정

함정 1: 총보수와 실비용(TER)의 차이

ETF 상품 설명서에 적힌 "총보수"와 실제로 투자자가 부담하는 비용은 다르다. 매매중개수수료, 기타비용 등이 추가되어 실비용은 총보수의 1.5-3배에 달할 수 있다. 반드시 금융투자협회 전자공시 시스템에서 "총비용비율(TER)"을 확인하라.

함정 2: 연금 수령 방식에 따른 세금 차이

  • 연금 수령 (10년 이상 분할): 연금소득세 3.3-5.5% (나이에 따라 차등)
  • 일시 수령: 기타소득세 16.5%
  • 연간 연금 수령액 1,500만 원 초과 시: 종합소득세 합산 과세 (최대 49.5%)

연간 수령액을 1,500만 원 이하로 관리하는 것이 세금 최적화의 핵심이다.

함정 3: DC형에서 퇴사 시 방치

퇴사 후 DC형 적립금을 IRP로 이전하지 않고 방치하면, 운용이 중단되어 원리금보장형으로 자동 전환되는 경우가 많다. 퇴사 후 60일 이내에 IRP 개설 후 이전을 완료하라.

함정 4: 해외 ETF 이중과세

2025년부터 연금 계좌 내 해외 투자 펀드/ETF의 배당에 대해 이중과세 논란이 있었다. 국내 상장 해외지수 ETF를 사용하면 이 문제를 피할 수 있다. 해외 직접 상장 ETF(예: 미국 시장의 VOO, VTI)는 연금 계좌에서 매수 자체가 불가능하므로 국내 상장 해외지수 ETF가 유일한 선택지다.

함정 5: 환헤지 비용

환헤지(H) 상품은 환율 변동 위험을 제거하지만, 연간 1-2%의 헤지 비용이 발생한다. 투자 기간이 10년 이상이면 환율 변동이 평균회귀하는 경향이 있으므로, 장기 투자 시 환노출(UH) 상품이 유리할 수 있다. 단, 채권 ETF는 환헤지가 합리적이다.

운영 체크리스트

연금 ETF 포트폴리오를 연간 단위로 운영할 때 빠짐없이 점검해야 할 항목이다.

매월 점검

  • DC형 회사 납입금 입금 확인
  • 납입금으로 비중이 낮은 자산 매수 (캐시플로우 리밸런싱)
  • ETF 상장폐지 공시 확인

분기 점검

  • 각 자산 클래스 비중 편차 확인 (5%p 이상 이탈 시 리밸런싱)
  • 보유 ETF의 추적오차 확인
  • DC형 위험자산 70% 한도 준수 확인

연말 (11-12월) 점검

  • 세액공제 한도 소진 여부 확인 (연금저축 600만 원 + IRP 300만 원)
  • ISA 만기 도래 시 IRP 이전 검토
  • 글라이드패스에 따른 연간 자산배분 비율 조정
  • 보유 ETF 총보수 변동 확인 (더 저렴한 신규 상품 출시 여부)
  • 연금 수령 계획 점검 (50대 이상)

라이프이벤트 점검

  • 이직/퇴사 시 DC형 적립금 IRP 이전 (60일 이내)
  • 연봉 변동에 따른 세액공제율 구간 변경 확인
  • 결혼/출산 등 재무 목표 변경 시 글라이드패스 재설계

실패 사례: 이렇게 하면 안 된다

사례 1: 원리금보장형 30년 방치

A씨(58세)는 2000년부터 DC형 퇴직연금에 매년 400만 원이 적립되었지만, 26년간 원리금보장형(연 2.5%)에 방치했다. 누적 적립금은 약 1억 3,700만 원. 동일 금액을 주식 60% / 채권 40% 포트폴리오(연 평균 6%)로 운용했다면 약 2억 4,800만 원이었을 것이다. 1억 1,000만 원의 기회비용을 날린 셈이다.

사례 2: DC형에서 테마 ETF 올인

B씨(35세)는 2024년 AI 열풍에 DC형 적립금 전액을 반도체/AI 테마 ETF에 투자했다. 2025년 조정장에서 -35% 하락을 겪고 패닉 매도 후 원리금보장형으로 전환했다. 테마 ETF는 새틀라이트(전체의 10-20%)로만 편입하고, 코어는 반드시 시장 전체 지수 ETF로 구성해야 한다.

사례 3: 세액공제 한도를 채우지 않음

C씨(40세, 연봉 6,000만 원)는 연금저축에 연 200만 원만 납입했다. 600만 원을 납입했다면 추가로 52.8만 원(400만 원 x 13.2%)을 환급받을 수 있었다. 10년이면 528만 원, 이 돈을 다시 연금 계좌에 납입하면 복리 효과까지 더해진다. 세액공제 한도를 채우는 것은 "확정 수익률 13.2-16.5%"와 같다.

사례 4: 연금 수령 시 1,500만 원 초과

D씨(63세)는 연금저축과 IRP에서 연간 2,400만 원을 수령했다. 1,500만 원까지는 저율(5.5%) 분리과세였지만, 초과분 900만 원은 종합소득에 합산되어 다른 소득과 합쳐 35% 세율이 적용되었다. 수령액을 연 1,500만 원 이하로 나누어 받거나, 연금저축과 IRP의 수령 시기를 분산했어야 한다.

참고자료