Split View: 파이낸스: ISA IRP ETF 자동화 워크플로우 2026
파이낸스: ISA IRP ETF 자동화 워크플로우 2026

- ISA와 IRP를 ETF 투자에 활용하는 이유
- ISA 제도 핵심 정리 (2026년 기준)
- IRP 제도 핵심 정리 (2026년 기준)
- ISA + IRP 통합 자산 배분 전략
- 자동화 워크플로우 설계
- ISA/IRP 리밸런싱 실행 시 주의점
- ISA와 IRP 어디에 먼저 투자할까: 우선순위 결정
- ISA 만기 전환 전략
- 전체 워크플로우 자동화 아키텍처
- 퀴즈
- 참고 자료
ISA와 IRP를 ETF 투자에 활용하는 이유
세금은 투자 수익의 가장 확실한 적이다. 아무리 좋은 수익률을 올려도 세금을 내고 나면 실질 수익이 크게 줄어든다. 한국에서 개인 투자자가 합법적으로 세금을 줄일 수 있는 가장 강력한 두 가지 수단이 **ISA(Individual Savings Account, 개인종합자산관리계좌)**와 **IRP(Individual Retirement Pension, 개인형퇴직연금)**이다.
이 두 계좌를 ETF 자동 리밸런싱 워크플로우에 통합하면 세금 절감과 규칙 기반 투자를 동시에 달성할 수 있다. John Bogle이 The Little Book of Common Sense Investing에서 강조했듯, "비용(세금 포함)을 줄이는 것이 수익을 높이는 가장 확실한 방법"이다.
ISA 제도 핵심 정리 (2026년 기준)
ISA란?
ISA는 하나의 계좌 안에서 예금, 펀드, ETF, 리츠 등 다양한 금융 상품을 담을 수 있는 절세 계좌다. 계좌 내에서 발생하는 수익에 대해 일정 금액까지 비과세 혜택을 받는다.
ISA 유형 비교
| 항목 | 일반형 ISA | 서민형 ISA | 중개형 ISA |
|---|---|---|---|
| 가입 대상 | 19세 이상 거주자 | 총급여 5,000만원 이하 또는 종합소득 3,800만원 이하 | 19세 이상 거주자 |
| 납입 한도 | 연 2,000만원 (총 1억원) | 연 2,000만원 (총 1억원) | 연 2,000만원 (총 1억원) |
| 비과세 한도 | 200만원 | 400만원 | 200만원 |
| 비과세 초과분 | 9.9% 분리과세 | 9.9% 분리과세 | 9.9% 분리과세 |
| 의무 가입 기간 | 3년 | 3년 | 3년 |
| ETF 직접 매매 | 불가 | 불가 | 가능 |
| 해외 ETF | 불가 | 불가 | 불가 (국내 상장 ETF만) |
핵심 포인트: ETF로 직접 투자하려면 중개형 ISA를 선택해야 한다. 일반형/서민형은 증권사가 운용하는 신탁형이므로 개별 ETF 매매가 불가하다.
ISA 절세 효과 시뮬레이션
"""ISA 계좌와 일반 계좌의 세후 수익 비교."""
def compare_tax_effect(
investment: int,
annual_return: float,
years: int,
isa_type: str = "general", # "general" or "disadvantaged"
) -> dict:
"""ISA와 일반 계좌의 세후 수익을 비교한다.
Args:
investment: 연간 투자금 (원)
annual_return: 연간 수익률 (예: 0.08)
years: 투자 기간 (년)
isa_type: ISA 유형 ("general": 일반형/중개형, "disadvantaged": 서민형)
"""
# ISA 비과세 한도
tax_free_limit = 2_000_000 if isa_type == "general" else 4_000_000
isa_excess_tax_rate = 0.099 # 9.9% 분리과세
# 일반 계좌 배당소득세
normal_tax_rate = 0.154 # 15.4%
# ISA 계좌 (비과세 + 분리과세)
isa_total_invested = 0
isa_balance = 0
for year in range(1, years + 1):
isa_total_invested += investment
isa_balance = (isa_balance + investment) * (1 + annual_return)
isa_total_profit = isa_balance - isa_total_invested
if isa_total_profit <= tax_free_limit:
isa_tax = 0
else:
isa_tax = int((isa_total_profit - tax_free_limit) * isa_excess_tax_rate)
isa_after_tax = isa_balance - isa_tax
# 일반 계좌 (매년 수익에 15.4% 과세)
normal_balance = 0
normal_total_tax = 0
for year in range(1, years + 1):
normal_balance += investment
yearly_profit = normal_balance * annual_return
yearly_tax = int(yearly_profit * normal_tax_rate)
normal_total_tax += yearly_tax
normal_balance = normal_balance + yearly_profit - yearly_tax
tax_saving = normal_total_tax - isa_tax
return {
"투자 기간": f"{years}년",
"총 투자금": f"₩{isa_total_invested:,}",
"ISA 만기 금액": f"₩{int(isa_after_tax):,}",
"ISA 납부 세금": f"₩{isa_tax:,}",
"일반 계좌 만기 금액": f"₩{int(normal_balance):,}",
"일반 계좌 납부 세금": f"₩{normal_total_tax:,}",
"절세 효과": f"₩{tax_saving:,}",
"수익 차이": f"₩{int(isa_after_tax - normal_balance):,}",
}
# 시나리오: 매년 2,000만원 투자, 연 8% 수익, 3년
result = compare_tax_effect(
investment=20_000_000,
annual_return=0.08,
years=3,
isa_type="general",
)
print("=== ISA vs 일반 계좌 비교 ===")
for key, value in result.items():
print(f" {key}: {value}")
IRP 제도 핵심 정리 (2026년 기준)
IRP란?
IRP는 퇴직급여와 개인 추가 납입금을 운용하는 퇴직연금 계좌다. 연금저축과 합산하여 연간 최대 900만원까지 세액공제를 받을 수 있으며, 운용 기간 중 발생하는 수익에 대해 과세가 이연된다.
IRP 핵심 수치
| 항목 | 내용 |
|---|---|
| 연간 납입 한도 | 1,800만원 (연금저축 포함) |
| 세액공제 한도 | 900만원 (연금저축 600만원 + IRP 300만원) |
| 세액공제율 | 총급여 5,500만원 이하: 16.5% / 초과: 13.2% |
| 최대 세액공제 | 148.5만원 (급여 5,500만원 이하) / 118.8만원 (초과) |
| 위험자산 한도 | 적립금의 70% (주식형 ETF 포함) |
| 안전자산 의무 | 적립금의 30% 이상 (채권형 ETF, 예금 등) |
| 수령 조건 | 55세 이후 연금 수령 (10년 이상 분할) |
| 연금소득세 | 3.3-5.5% (일시금 수령 시 기타소득세 16.5%) |
IRP에서 ETF 투자 시 제약 사항
IRP는 연금 계좌이므로 자유로운 매매가 제한된다.
투자 가능:
- 국내 상장 ETF (주식형, 채권형, 혼합형)
- TDF(Target Date Fund)
- 채권형/MMF형 ETF (안전자산)
투자 불가:
- 레버리지/인버스 ETF
- 파생상품 비중 40% 초과 ETF
- 해외 직접 상장 ETF (국내 상장 해외지수 ETF는 가능)
위험자산 70% 규칙 예시:
- IRP 잔고 900만원이면 주식형 ETF 최대 630만원, 채권형 ETF 최소 270만원
ISA + IRP 통합 자산 배분 전략
계좌별 역할 분담
세금 효율을 극대화하려면 어떤 자산을 어떤 계좌에 넣을지가 중요하다.
| 자산 유형 | 최적 계좌 | 이유 |
|---|---|---|
| 배당 수익이 높은 ETF | ISA | 배당소득 비과세 200-400만원 적용 |
| 성장주 ETF (매매차익 중심) | ISA | 국내 ETF 매매차익 비과세 + ISA 추가 절세 |
| 채권형 ETF | IRP | IRP 안전자산 30% 의무 충족 + 이자소득 과세이연 |
| 해외지수 추종 ETF | IRP | 배당소득 과세이연 (연금 수령 시 3.3-5.5%) |
| 고위험 테마 ETF | ISA | IRP는 위험자산 70% 한도 제약 |
통합 포트폴리오 예시: 연봉 6,000만원 직장인
# 통합 자산 배분 설정
investor:
name: '김영주'
annual_salary: 60_000_000
tax_deduction_rate: 0.132 # 5,500만원 초과 → 13.2%
accounts:
isa:
type: '중개형'
annual_contribution: 20_000_000 # 연 2,000만원
tax_free_limit: 2_000_000
# ISA에 넣을 자산: 배당 + 성장 + 테마
holdings:
- ticker: 'TIGER 미국S&P500'
weight: 0.35
role: '코어 - 미국 시장'
- ticker: 'KODEX 200'
weight: 0.15
role: '코어 - 한국 시장'
- ticker: 'TIGER 반도체'
weight: 0.15
role: '새틀라이트 - 반도체'
- ticker: 'TIGER 미국배당다우존스'
weight: 0.15
role: '새틀라이트 - 배당'
- ticker: 'KODEX 2차전지산업'
weight: 0.10
role: '새틀라이트 - 2차전지'
- ticker: 'TIGER 금은선물(H)'
weight: 0.10
role: '새틀라이트 - 금'
irp:
annual_contribution: 9_000_000 # 연 900만원 (세액공제 한도)
tax_deduction: 1_188_000 # 900만 x 13.2%
risk_asset_limit: 0.70
# IRP에 넣을 자산: 해외지수 + 채권 (세금이연 최대화)
holdings:
risk_assets: # 70% 이내
- ticker: 'TIGER 미국S&P500'
weight: 0.35
role: '코어 - 미국 시장 (배당 과세이연)'
- ticker: 'TIGER 미국나스닥100'
weight: 0.20
role: '코어 - 기술주 성장'
- ticker: 'KODEX 200'
weight: 0.15
role: '코어 - 한국 시장'
safe_assets: # 30% 이상
- ticker: 'KODEX 종합채권(AA-이상)액티브'
weight: 0.15
role: '안전자산 - 국내 채권'
- ticker: 'TIGER 미국채10년선물'
weight: 0.15
role: '안전자산 - 미국 채권'
general:
# 위 두 계좌에 넣지 못한 추가 투자금
holdings:
- ticker: 'TIGER 미국S&P500'
weight: 0.50
- ticker: 'KODEX 200'
weight: 0.30
- ticker: 'TIGER 미국채10년선물'
weight: 0.20
자동화 워크플로우 설계
연간 캘린더와 자동 알림
ISA와 IRP는 연간 납입 한도와 세액공제 한도가 있으므로, 시기를 놓치면 절세 혜택을 잃는다.
"""ISA/IRP 연간 워크플로우 자동 알림."""
from datetime import date
ANNUAL_TASKS = [
{
"month": 1,
"tasks": [
"ISA 연간 납입 계획 수립 (월 167만원 적립 or 일시납)",
"IRP 연간 납입 계획 수립 (월 75만원 적립 or 일시납)",
"전년도 세액공제 금액 확인 (연말정산 반영 여부)",
"코어 ETF 정기 리밸런싱",
],
},
{
"month": 3,
"tasks": [
"ISA 1분기 납입 확인 (목표: 500만원 누적)",
"IRP 1분기 납입 확인 (목표: 225만원 누적)",
"ISA 포트폴리오 리밸런싱 (편차 5% 초과 시)",
],
},
{
"month": 4,
"tasks": [
"새틀라이트 ETF 분기 성과 검토",
"IRP 위험자산 비율 확인 (70% 이내인지)",
],
},
{
"month": 6,
"tasks": [
"ISA 상반기 누적 납입 확인 (목표: 1,000만원)",
"IRP 상반기 누적 납입 확인 (목표: 450만원)",
"전체 포트폴리오 중간 점검",
],
},
{
"month": 7,
"tasks": [
"코어 ETF 정기 리밸런싱 (반기 1회)",
"새틀라이트 ETF 분기 성과 검토",
],
},
{
"month": 10,
"tasks": [
"ISA 연간 납입 잔여 금액 확인",
"IRP 세액공제 한도 잔여 확인",
"연말까지 납입 완료 계획 수립",
"새틀라이트 ETF 분기 성과 검토 + 내년 전략 수립",
],
},
{
"month": 11,
"tasks": [
"IRP 세액공제 한도 미달 시 추가 납입",
"ISA 연간 한도 미달 시 추가 납입",
"해외 ETF 양도소득 250만원 공제 활용 (연내 매도 검토)",
],
},
{
"month": 12,
"tasks": [
"12/31까지 ISA, IRP 납입 완료 확인",
"연간 투자 성과 정리",
"내년 자산 배분 전략 수립",
"ISA 3년 만기 도래 시 만기 연장/해지 결정",
],
},
]
def get_current_tasks() -> list:
"""현재 월의 할 일 목록을 반환한다."""
current_month = date.today().month
for item in ANNUAL_TASKS:
if item["month"] == current_month:
return item["tasks"]
return ["이번 달은 정기 점검 일정이 없습니다. 편차 모니터링만 수행하세요."]
def get_contribution_status(
isa_ytd: int,
irp_ytd: int,
isa_annual_target: int = 20_000_000,
irp_annual_target: int = 9_000_000,
) -> dict:
"""연간 납입 진행률을 확인한다."""
today = date.today()
year_progress = today.timetuple().tm_yday / 365
return {
"ISA": {
"납입 누계": f"₩{isa_ytd:,}",
"연간 목표": f"₩{isa_annual_target:,}",
"달성률": f"{isa_ytd / isa_annual_target * 100:.1f}%",
"연간 진행률": f"{year_progress * 100:.1f}%",
"상태": "정상" if isa_ytd / isa_annual_target >= year_progress * 0.8 else "납입 부족",
},
"IRP": {
"납입 누계": f"₩{irp_ytd:,}",
"연간 목표": f"₩{irp_annual_target:,}",
"달성률": f"{irp_ytd / irp_annual_target * 100:.1f}%",
"예상 세액공제": f"₩{int(min(irp_ytd, irp_annual_target) * 0.132):,}",
"상태": "정상" if irp_ytd / irp_annual_target >= year_progress * 0.8 else "납입 부족",
},
}
# 실행 예시
print("=== 3월 할 일 ===")
for task in get_current_tasks():
print(f" - {task}")
print("\n=== 납입 현황 ===")
status = get_contribution_status(isa_ytd=4_000_000, irp_ytd=1_500_000)
for account, info in status.items():
print(f"\n{account}:")
for key, value in info.items():
print(f" {key}: {value}")
ISA/IRP 리밸런싱 실행 시 주의점
ISA 계좌 리밸런싱
ISA 계좌 내에서 ETF를 매도하고 다른 ETF를 매수하는 것은 자유롭다. 계좌 내 거래이므로 매매차익에 대한 즉시 과세가 발생하지 않는다 (만기 시 일괄 정산).
"""ISA 계좌 리밸런싱 시 특수 로직."""
def isa_rebalance_check(
holdings: dict,
targets: dict,
total_value: int,
tax_free_used: int,
tax_free_limit: int = 2_000_000,
) -> dict:
"""ISA 계좌의 리밸런싱 가능 여부와 세금 영향을 확인한다.
Args:
holdings: {종목코드: {"value": 현재가치, "cost": 매수원가}}
targets: {종목코드: 목표비중}
total_value: 총 계좌 잔고
tax_free_used: 이미 사용한 비과세 한도 (원)
tax_free_limit: 비과세 한도 (원)
"""
trades = []
total_realized_gain = 0
for code, target_weight in targets.items():
holding = holdings.get(code, {"value": 0, "cost": 0})
current_weight = holding["value"] / total_value if total_value > 0 else 0
diff_weight = target_weight - current_weight
if abs(diff_weight) < 0.02: # 2% 미만 편차는 무시
continue
trade_amount = int(total_value * abs(diff_weight))
action = "BUY" if diff_weight > 0 else "SELL"
# 매도 시 실현 손익 계산
realized_gain = 0
if action == "SELL" and holding["value"] > holding["cost"]:
gain_ratio = (holding["value"] - holding["cost"]) / holding["value"]
realized_gain = int(trade_amount * gain_ratio)
total_realized_gain += realized_gain
trades.append({
"code": code,
"action": action,
"amount": trade_amount,
"realized_gain": realized_gain,
})
# 비과세 한도 확인
remaining_tax_free = tax_free_limit - tax_free_used
taxable_gain = max(0, total_realized_gain - remaining_tax_free)
tax_on_excess = int(taxable_gain * 0.099) # 9.9% 분리과세
return {
"trades": trades,
"total_realized_gain": total_realized_gain,
"remaining_tax_free": remaining_tax_free,
"taxable_gain": taxable_gain,
"estimated_tax": tax_on_excess,
"recommendation": (
"리밸런싱 실행 가능 (비과세 범위 내)"
if taxable_gain == 0
else f"비과세 한도 초과: ₩{taxable_gain:,}에 대해 9.9% 과세 (₩{tax_on_excess:,})"
),
}
# 사용 예시
result = isa_rebalance_check(
holdings={
"360750": {"value": 8_000_000, "cost": 6_500_000},
"069500": {"value": 3_000_000, "cost": 2_800_000},
"091230": {"value": 4_000_000, "cost": 3_200_000},
},
targets={"360750": 0.40, "069500": 0.20, "091230": 0.20},
total_value=15_000_000,
tax_free_used=500_000,
)
print("=== ISA 리밸런싱 점검 ===")
print(f"예상 실현 수익: ₩{result['total_realized_gain']:,}")
print(f"남은 비과세 한도: ₩{result['remaining_tax_free']:,}")
print(f"판정: {result['recommendation']}")
IRP 계좌 리밸런싱
IRP는 위험자산 70% 한도가 있으므로 리밸런싱 후에도 이 비율을 반드시 확인해야 한다.
"""IRP 계좌 리밸런싱 시 위험자산 비율 검증."""
# 자산 분류 기준
RISK_ASSET_CODES = {"360750", "133690", "069500", "091230", "305720"}
SAFE_ASSET_CODES = {"443160", "305080", "304660"}
def irp_risk_check(
holdings: dict,
max_risk_ratio: float = 0.70,
) -> dict:
"""IRP 포트폴리오의 위험자산 비율을 확인한다."""
risk_value = sum(
h["value_krw"] for code, h in holdings.items()
if code in RISK_ASSET_CODES
)
safe_value = sum(
h["value_krw"] for code, h in holdings.items()
if code in SAFE_ASSET_CODES
)
total = risk_value + safe_value
risk_ratio = risk_value / total if total > 0 else 0
safe_ratio = safe_value / total if total > 0 else 0
compliant = risk_ratio <= max_risk_ratio
return {
"total_value": f"₩{total:,}",
"risk_assets": f"₩{risk_value:,} ({risk_ratio*100:.1f}%)",
"safe_assets": f"₩{safe_value:,} ({safe_ratio*100:.1f}%)",
"risk_limit": f"{max_risk_ratio*100:.0f}%",
"compliant": compliant,
"action": (
"위험자산 비율 정상"
if compliant
else f"위험자산 비율 초과: {risk_ratio*100:.1f}% > {max_risk_ratio*100:.0f}%. "
f"₩{int(risk_value - total * max_risk_ratio):,}만큼 안전자산으로 전환 필요."
),
}
# 사용 예시
irp_result = irp_risk_check({
"360750": {"value_krw": 3_500_000}, # S&P500 (위험)
"133690": {"value_krw": 1_800_000}, # 나스닥100 (위험)
"069500": {"value_krw": 1_200_000}, # KODEX200 (위험)
"443160": {"value_krw": 1_500_000}, # 종합채권 (안전)
"305080": {"value_krw": 1_000_000}, # 미국채10년 (안전)
})
print("=== IRP 위험자산 비율 점검 ===")
for key, value in irp_result.items():
print(f" {key}: {value}")
ISA와 IRP 어디에 먼저 투자할까: 우선순위 결정
투자할 수 있는 금액이 한정되어 있을 때, ISA와 IRP 중 어디에 먼저 넣어야 할까?
투자 우선순위 의사결정 트리
1. IRP에 연 300-900만원 납입 (세액공제 최대 활용)
└─ 세액공제 효과: 즉시 13.2-16.5% 확정 수익
└─ 단, 55세까지 인출 불가 (유동성 제약)
2. ISA에 연 최대 2,000만원 납입
└─ 3년 이내에 필요할 수 있는 자금 포함 가능
└─ 비과세 200-400만원 + 9.9% 분리과세
3. 일반 계좌
└─ ISA/IRP 한도 초과분
└─ 유동성이 필요한 자금
급여별 최적 배분 예시
| 연봉 | IRP 납입 | ISA 납입 | 일반 계좌 | 연간 절세 효과 |
|---|---|---|---|---|
| 4,000만원 | 900만원 | 1,100만원 | - | IRP 세액공제 148.5만원 + ISA 비과세 |
| 6,000만원 | 900만원 | 2,000만원 | 여유분 | IRP 세액공제 118.8만원 + ISA 비과세 |
| 8,000만원 | 900만원 | 2,000만원 | 여유분 | IRP 세액공제 118.8만원 + ISA 비과세 |
| 1억원 | 900만원 | 2,000만원 | 여유분 | IRP 세액공제 118.8만원 + ISA 비과세 |
핵심: 연봉과 관계없이 IRP 900만원은 반드시 채운다. 세액공제는 투자와 관계없이 확정 수익(13.2-16.5%)이다. 이보다 확실한 수익률은 없다.
ISA 만기 전환 전략
ISA는 3년 만기 후 두 가지 선택이 있다.
선택 1: 만기 연장
- 계좌를 유지하고 계속 투자한다
- 비과세 한도는 3년마다 리셋되지 않는다 (누적)
- 리밸런싱을 계속 비과세/분리과세 혜택 하에 실행 가능
선택 2: 해지 후 IRP/연금저축 전환
- ISA 만기 해지 금액의 전부 또는 일부를 IRP/연금저축에 이체
- 이체 금액의 10% (최대 300만원)에 대해 추가 세액공제 가능
- 즉, ISA 3,000만원 만기 → IRP 전환 시 300만원 추가 세액공제 → 39.6-49.5만원 절세
"""ISA 만기 전환 시 세제 혜택 계산."""
def isa_to_irp_benefit(
isa_balance: int,
max_additional_deduction: int = 3_000_000,
tax_rate: float = 0.132,
) -> dict:
"""ISA 만기 금액을 IRP로 전환 시 추가 세액공제를 계산한다."""
eligible_amount = min(isa_balance, isa_balance) # 전액 전환 가정
deduction_base = min(int(eligible_amount * 0.1), max_additional_deduction)
additional_tax_saving = int(deduction_base * tax_rate)
return {
"ISA 만기 잔고": f"₩{isa_balance:,}",
"IRP 전환 금액": f"₩{eligible_amount:,}",
"추가 세액공제 대상": f"₩{deduction_base:,}",
"추가 절세 금액": f"₩{additional_tax_saving:,}",
"참고": "IRP 기존 납입 한도(1,800만원)와 별도로 전환 가능",
}
result = isa_to_irp_benefit(isa_balance=30_000_000)
print("=== ISA → IRP 전환 혜택 ===")
for key, value in result.items():
print(f" {key}: {value}")
전체 워크플로우 자동화 아키텍처
┌─────────────────────────────────────────────────────┐
│ GitHub Actions (Scheduler) │
│ 매주 월요일 09:00 KST → 편차 확인 │
│ 매 분기 첫 영업일 → 정기 리밸런싱 │
│ 매월 1일 → 납입 현황 확인 │
└────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Python 리밸런싱 엔진 │
│ 1. 증권사 API로 ISA/IRP/일반 계좌 잔고 조회 │
│ 2. YAML 설정 파일과 현재 비중 비교 │
│ 3. 계좌별 리밸런싱 필요 여부 판단 │
│ - ISA: 비과세 한도 확인 │
│ - IRP: 위험자산 70% 한도 확인 │
│ 4. 매매 주문 생성 (dry-run) │
└────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 알림 (Slack / 카카오톡) │
│ - 리밸런싱 필요 시: 매매 내역 + 비용 추정 │
│ - 납입 부족 시: 잔여 한도 + 권장 납입액 │
│ - 세액공제 마감 임박 시: 11-12월 긴급 알림 │
└─────────────────────────────────────────────────────┘
퀴즈
Q1. ETF로 직접 투자하려면 어떤 유형의 ISA를 선택해야 하는가?
정답: ||중개형 ISA를 선택해야 한다. 일반형/서민형은 신탁형으로 증권사가 운용하므로 개별 ETF 매매가
불가하다.||
Q2. IRP에서 주식형 ETF에 투자할 수 있는 최대 비율은?
정답: ||적립금의 70%까지 위험자산(주식형 ETF 포함)에 투자할 수 있다. 나머지 30% 이상은 채권형 ETF,
예금 등 안전자산으로 구성해야 한다.||
Q3. 연봉 6,000만원 직장인이 IRP에 900만원을 납입하면 받는 세액공제는?
정답: ||총급여 5,500만원 초과이므로 세액공제율 13.2%가 적용된다. 900만원 x 13.2% = 118.8만원의
세액공제를 받는다.||
Q4. ISA 만기(3년) 후 IRP로 전환하면 받을 수 있는 추가 혜택은?
정답: ||전환 금액의 10%(최대 300만원)에 대해 추가 세액공제를 받을 수 있다. 예를 들어 3,000만원
전환 시 300만원에 대해 13.2%(39.6만원) 또는 16.5%(49.5만원)의 추가 절세가 가능하다.||
Q5. 배당 수익이 높은 ETF를 IRP보다 ISA에 넣는 것이 유리한 이유는?
정답: ||ISA에서는 배당소득이 비과세 한도(200-400만원) 이내이면 세금이 0원이다. IRP는 과세이연만
되고 수령 시 3.3-5.5%의 연금소득세가 부과된다. 배당 규모가 비과세 한도 이내라면 ISA가 세금 면에서
절대적으로 유리하다.||
Q6. IRP 세액공제가 "확정 수익"이라고 표현하는 이유는?
정답: ||세액공제는 투자 수익률과 관계없이 납입 즉시 13.2-16.5%의 세금 환급이 확정된다. 주식 투자는
수익이 불확실하지만, 세액공제는 연말정산에서 확정적으로 돌려받는 금액이므로 실질적으로 가장 확실한
수익이다.||
Q7. ISA와 IRP 중 투자 우선순위를 IRP에 두는 이유는?
정답: ||IRP 세액공제(13.2-16.5%)는 즉시 확정 수익이지만, ISA의 비과세 혜택은 수익이 발생해야
의미가 있다. 투자금이 한정적일 때 IRP 세액공제 한도(900만원)를 먼저 채우고 나머지를 ISA에 배분하는
것이 합리적이다.||
참고 자료
- Bogle, John. The Little Book of Common Sense Investing. Wiley, 2017.
- 금융감독원 - ISA 안내: https://www.fss.or.kr/
- 국세청 - 연금저축/IRP 세액공제: https://www.nts.go.kr/
- 한국투자증권 KIS Developers API: https://apiportal.koreainvestment.com/
- 금융투자협회 - 퇴직연금 제도 안내: https://www.kofia.or.kr/
- ETF CHECK: https://www.etfcheck.co.kr/
- 한국거래소 ETF 정보: https://www.krx.co.kr/
Finance: ISA IRP ETF Automation Workflow 2026

- Why Use ISA and IRP for ETF Investing
- ISA System Key Summary (as of 2026)
- IRP System Key Summary (as of 2026)
- ISA + IRP Integrated Asset Allocation Strategy
- Automation Workflow Design
- ISA/IRP Rebalancing Execution Considerations
- ISA vs IRP: Which to Invest in First -- Priority Decision
- ISA Maturity Conversion Strategy
- Full Workflow Automation Architecture
- Quiz
- References
Why Use ISA and IRP for ETF Investing
Taxes are the most certain enemy of investment returns. No matter how good your returns are, after-tax real returns shrink significantly. The two most powerful tools that individual investors in Korea can legally use to reduce taxes are the ISA (Individual Savings Account) and the IRP (Individual Retirement Pension).
Integrating these two accounts into an ETF automated rebalancing workflow allows you to achieve both tax savings and rule-based investing simultaneously. As John Bogle emphasized in The Little Book of Common Sense Investing, "Reducing costs (including taxes) is the most reliable way to increase returns."
ISA System Key Summary (as of 2026)
What is ISA?
ISA is a tax-advantaged account that can hold various financial products such as deposits, funds, ETFs, and REITs within a single account. Income generated within the account receives tax-free benefits up to a certain amount.
ISA Type Comparison
| Item | General ISA | Low-Income ISA | Brokerage ISA |
|---|---|---|---|
| Eligibility | Residents aged 19+ | Gross salary under 50M KRW or total income under 38M KRW | Residents aged 19+ |
| Annual contribution | 20M KRW/year (100M KRW total) | 20M KRW/year (100M KRW total) | 20M KRW/year (100M KRW total) |
| Tax-free limit | 2M KRW | 4M KRW | 2M KRW |
| Tax on excess | 9.9% flat rate | 9.9% flat rate | 9.9% flat rate |
| Mandatory holding | 3 years | 3 years | 3 years |
| Direct ETF trading | Not available | Not available | Available |
| Overseas ETF | Not available | Not available | Not available (domestic listed only) |
Key Point: To invest directly in ETFs, you must choose a Brokerage ISA. General/Low-Income types are trust-based and managed by the securities firm, making individual ETF trading impossible.
ISA Tax Savings Simulation
"""Compare after-tax returns between ISA and regular accounts."""
def compare_tax_effect(
investment: int,
annual_return: float,
years: int,
isa_type: str = "general", # "general" or "disadvantaged"
) -> dict:
"""Compare after-tax returns between ISA and regular accounts.
Args:
investment: Annual investment amount (KRW)
annual_return: Annual return rate (e.g., 0.08)
years: Investment period (years)
isa_type: ISA type ("general": General/Brokerage, "disadvantaged": Low-Income)
"""
# ISA tax-free limit
tax_free_limit = 2_000_000 if isa_type == "general" else 4_000_000
isa_excess_tax_rate = 0.099 # 9.9% flat rate
# Regular account dividend income tax
normal_tax_rate = 0.154 # 15.4%
# ISA account (tax-free + flat rate)
isa_total_invested = 0
isa_balance = 0
for year in range(1, years + 1):
isa_total_invested += investment
isa_balance = (isa_balance + investment) * (1 + annual_return)
isa_total_profit = isa_balance - isa_total_invested
if isa_total_profit <= tax_free_limit:
isa_tax = 0
else:
isa_tax = int((isa_total_profit - tax_free_limit) * isa_excess_tax_rate)
isa_after_tax = isa_balance - isa_tax
# Regular account (15.4% tax on annual profits)
normal_balance = 0
normal_total_tax = 0
for year in range(1, years + 1):
normal_balance += investment
yearly_profit = normal_balance * annual_return
yearly_tax = int(yearly_profit * normal_tax_rate)
normal_total_tax += yearly_tax
normal_balance = normal_balance + yearly_profit - yearly_tax
tax_saving = normal_total_tax - isa_tax
return {
"Investment Period": f"{years} years",
"Total Invested": f"₩{isa_total_invested:,}",
"ISA Maturity Amount": f"₩{int(isa_after_tax):,}",
"ISA Tax Paid": f"₩{isa_tax:,}",
"Regular Account Maturity": f"₩{int(normal_balance):,}",
"Regular Account Tax Paid": f"₩{normal_total_tax:,}",
"Tax Savings": f"₩{tax_saving:,}",
"Return Difference": f"₩{int(isa_after_tax - normal_balance):,}",
}
# Scenario: 20M KRW annual investment, 8% annual return, 3 years
result = compare_tax_effect(
investment=20_000_000,
annual_return=0.08,
years=3,
isa_type="general",
)
print("=== ISA vs Regular Account Comparison ===")
for key, value in result.items():
print(f" {key}: {value}")
IRP System Key Summary (as of 2026)
What is IRP?
IRP is a retirement pension account that manages both severance pay and personal additional contributions. Combined with pension savings, you can receive tax deductions of up to 9 million KRW annually, and returns generated during the management period are tax-deferred.
IRP Key Figures
| Item | Details |
|---|---|
| Annual contribution | 18M KRW (including pension savings) |
| Tax deduction limit | 9M KRW (pension savings 6M + IRP 3M) |
| Tax deduction rate | Gross salary 55M or under: 16.5% / Over: 13.2% |
| Maximum tax deduction | 1.485M KRW (salary 55M or under) / 1.188M KRW (over) |
| Risky asset limit | 70% of accumulated funds (including equity ETFs) |
| Safe asset requirement | At least 30% (bond ETFs, deposits, etc.) |
| Withdrawal condition | Pension payments after age 55 (10+ year installments) |
| Pension income tax | 3.3-5.5% (16.5% other income tax for lump sum) |
Constraints When Investing in ETFs Through IRP
IRP is a pension account, so free trading is restricted.
Investable:
- Domestically listed ETFs (equity, bond, hybrid)
- TDF (Target Date Fund)
- Bond/MMF ETFs (safe assets)
Not investable:
- Leveraged/Inverse ETFs
- ETFs with over 40% derivatives exposure
- Overseas-listed ETFs (domestically listed overseas index ETFs are allowed)
70% Risky Asset Rule Example:
- If IRP balance is 9M KRW: max 6.3M KRW in equity ETFs, min 2.7M KRW in bond ETFs
ISA + IRP Integrated Asset Allocation Strategy
Role Assignment by Account
To maximize tax efficiency, it's important to decide which assets go into which accounts.
| Asset Type | Optimal Account | Reason |
|---|---|---|
| High-dividend ETFs | ISA | Dividend income tax-free up to 2-4M KRW |
| Growth stock ETFs (capital gains) | ISA | Domestic ETF capital gains tax-free + ISA additional savings |
| Bond ETFs | IRP | Meets IRP 30% safe asset requirement + interest tax deferral |
| Overseas index tracking ETFs | IRP | Dividend income tax-deferred (3.3-5.5% at pension receipt) |
| High-risk theme ETFs | ISA | IRP has 70% risky asset limit constraint |
Integrated Portfolio Example: Employee with 60M KRW Annual Salary
# Integrated asset allocation settings
investor:
name: 'Kim Youngju'
annual_salary: 60_000_000
tax_deduction_rate: 0.132 # Over 55M KRW -> 13.2%
accounts:
isa:
type: 'Brokerage'
annual_contribution: 20_000_000 # 20M KRW/year
tax_free_limit: 2_000_000
# Assets for ISA: dividend + growth + theme
holdings:
- ticker: 'TIGER US S&P500'
weight: 0.35
role: 'Core - US market'
- ticker: 'KODEX 200'
weight: 0.15
role: 'Core - Korean market'
- ticker: 'TIGER Semiconductor'
weight: 0.15
role: 'Satellite - Semiconductor'
- ticker: 'TIGER US Dividend Dow Jones'
weight: 0.15
role: 'Satellite - Dividend'
- ticker: 'KODEX Secondary Battery Industry'
weight: 0.10
role: 'Satellite - Secondary battery'
- ticker: 'TIGER Gold & Silver Futures (H)'
weight: 0.10
role: 'Satellite - Gold'
irp:
annual_contribution: 9_000_000 # 9M KRW/year (tax deduction limit)
tax_deduction: 1_188_000 # 9M x 13.2%
risk_asset_limit: 0.70
# Assets for IRP: overseas index + bonds (maximize tax deferral)
holdings:
risk_assets: # Within 70%
- ticker: 'TIGER US S&P500'
weight: 0.35
role: 'Core - US market (dividend tax deferral)'
- ticker: 'TIGER US NASDAQ100'
weight: 0.20
role: 'Core - Tech stock growth'
- ticker: 'KODEX 200'
weight: 0.15
role: 'Core - Korean market'
safe_assets: # At least 30%
- ticker: 'KODEX Composite Bond (AA- and above) Active'
weight: 0.15
role: 'Safe asset - Domestic bonds'
- ticker: 'TIGER US Treasury 10Y Futures'
weight: 0.15
role: 'Safe asset - US bonds'
general:
# Additional investments beyond the two accounts above
holdings:
- ticker: 'TIGER US S&P500'
weight: 0.50
- ticker: 'KODEX 200'
weight: 0.30
- ticker: 'TIGER US Treasury 10Y Futures'
weight: 0.20
Automation Workflow Design
Annual Calendar and Automated Alerts
ISA and IRP have annual contribution limits and tax deduction caps, so missing deadlines means losing tax benefits.
"""ISA/IRP annual workflow automated alerts."""
from datetime import date
ANNUAL_TASKS = [
{
"month": 1,
"tasks": [
"Establish ISA annual contribution plan (1.67M KRW/month or lump sum)",
"Establish IRP annual contribution plan (750K KRW/month or lump sum)",
"Verify previous year tax deduction amount (year-end settlement reflection)",
"Core ETF scheduled rebalancing",
],
},
{
"month": 3,
"tasks": [
"Verify ISA Q1 contributions (target: 5M KRW cumulative)",
"Verify IRP Q1 contributions (target: 2.25M KRW cumulative)",
"ISA portfolio rebalancing (if drift exceeds 5%)",
],
},
{
"month": 4,
"tasks": [
"Satellite ETF quarterly performance review",
"Verify IRP risky asset ratio (within 70%)",
],
},
{
"month": 6,
"tasks": [
"Verify ISA H1 cumulative contributions (target: 10M KRW)",
"Verify IRP H1 cumulative contributions (target: 4.5M KRW)",
"Full portfolio mid-year review",
],
},
{
"month": 7,
"tasks": [
"Core ETF scheduled rebalancing (semi-annual)",
"Satellite ETF quarterly performance review",
],
},
{
"month": 10,
"tasks": [
"Check ISA annual contribution remaining amount",
"Check IRP tax deduction limit remaining",
"Plan contribution completion by year-end",
"Satellite ETF quarterly review + next year strategy development",
],
},
{
"month": 11,
"tasks": [
"Additional IRP contribution if below tax deduction limit",
"Additional ISA contribution if below annual limit",
"Utilize overseas ETF capital gains 2.5M KRW deduction (review year-end sales)",
],
},
{
"month": 12,
"tasks": [
"Confirm ISA, IRP contributions completed by 12/31",
"Summarize annual investment performance",
"Develop next year asset allocation strategy",
"If ISA 3-year maturity is approaching, decide on extension/termination",
],
},
]
def get_current_tasks() -> list:
"""Return the task list for the current month."""
current_month = date.today().month
for item in ANNUAL_TASKS:
if item["month"] == current_month:
return item["tasks"]
return ["No scheduled tasks this month. Perform drift monitoring only."]
def get_contribution_status(
isa_ytd: int,
irp_ytd: int,
isa_annual_target: int = 20_000_000,
irp_annual_target: int = 9_000_000,
) -> dict:
"""Check annual contribution progress."""
today = date.today()
year_progress = today.timetuple().tm_yday / 365
return {
"ISA": {
"YTD Contributions": f"₩{isa_ytd:,}",
"Annual Target": f"₩{isa_annual_target:,}",
"Achievement Rate": f"{isa_ytd / isa_annual_target * 100:.1f}%",
"Year Progress": f"{year_progress * 100:.1f}%",
"Status": "On Track" if isa_ytd / isa_annual_target >= year_progress * 0.8 else "Behind Schedule",
},
"IRP": {
"YTD Contributions": f"₩{irp_ytd:,}",
"Annual Target": f"₩{irp_annual_target:,}",
"Achievement Rate": f"{irp_ytd / irp_annual_target * 100:.1f}%",
"Expected Tax Deduction": f"₩{int(min(irp_ytd, irp_annual_target) * 0.132):,}",
"Status": "On Track" if irp_ytd / irp_annual_target >= year_progress * 0.8 else "Behind Schedule",
},
}
# Execution example
print("=== March Tasks ===")
for task in get_current_tasks():
print(f" - {task}")
print("\n=== Contribution Status ===")
status = get_contribution_status(isa_ytd=4_000_000, irp_ytd=1_500_000)
for account, info in status.items():
print(f"\n{account}:")
for key, value in info.items():
print(f" {key}: {value}")
ISA/IRP Rebalancing Execution Considerations
ISA Account Rebalancing
Selling and buying ETFs within an ISA account is free. Since these are intra-account transactions, no immediate taxation on capital gains occurs (settled in bulk at maturity).
"""Special logic for ISA account rebalancing."""
def isa_rebalance_check(
holdings: dict,
targets: dict,
total_value: int,
tax_free_used: int,
tax_free_limit: int = 2_000_000,
) -> dict:
"""Check ISA account rebalancing feasibility and tax impact.
Args:
holdings: {code: {"value": current_value, "cost": purchase_cost}}
targets: {code: target_weight}
total_value: Total account balance
tax_free_used: Tax-free limit already used (KRW)
tax_free_limit: Tax-free limit (KRW)
"""
trades = []
total_realized_gain = 0
for code, target_weight in targets.items():
holding = holdings.get(code, {"value": 0, "cost": 0})
current_weight = holding["value"] / total_value if total_value > 0 else 0
diff_weight = target_weight - current_weight
if abs(diff_weight) < 0.02: # Ignore deviation under 2%
continue
trade_amount = int(total_value * abs(diff_weight))
action = "BUY" if diff_weight > 0 else "SELL"
# Calculate realized gains on sell
realized_gain = 0
if action == "SELL" and holding["value"] > holding["cost"]:
gain_ratio = (holding["value"] - holding["cost"]) / holding["value"]
realized_gain = int(trade_amount * gain_ratio)
total_realized_gain += realized_gain
trades.append({
"code": code,
"action": action,
"amount": trade_amount,
"realized_gain": realized_gain,
})
# Check tax-free limit
remaining_tax_free = tax_free_limit - tax_free_used
taxable_gain = max(0, total_realized_gain - remaining_tax_free)
tax_on_excess = int(taxable_gain * 0.099) # 9.9% flat rate
return {
"trades": trades,
"total_realized_gain": total_realized_gain,
"remaining_tax_free": remaining_tax_free,
"taxable_gain": taxable_gain,
"estimated_tax": tax_on_excess,
"recommendation": (
"Rebalancing executable (within tax-free limit)"
if taxable_gain == 0
else f"Tax-free limit exceeded: 9.9% tax on ₩{taxable_gain:,} (₩{tax_on_excess:,})"
),
}
# Usage example
result = isa_rebalance_check(
holdings={
"360750": {"value": 8_000_000, "cost": 6_500_000},
"069500": {"value": 3_000_000, "cost": 2_800_000},
"091230": {"value": 4_000_000, "cost": 3_200_000},
},
targets={"360750": 0.40, "069500": 0.20, "091230": 0.20},
total_value=15_000_000,
tax_free_used=500_000,
)
print("=== ISA Rebalancing Check ===")
print(f"Expected realized gains: ₩{result['total_realized_gain']:,}")
print(f"Remaining tax-free limit: ₩{result['remaining_tax_free']:,}")
print(f"Verdict: {result['recommendation']}")
IRP Account Rebalancing
IRP has a 70% risky asset limit, so this ratio must be verified after rebalancing.
"""IRP account rebalancing with risky asset ratio verification."""
# Asset classification criteria
RISK_ASSET_CODES = {"360750", "133690", "069500", "091230", "305720"}
SAFE_ASSET_CODES = {"443160", "305080", "304660"}
def irp_risk_check(
holdings: dict,
max_risk_ratio: float = 0.70,
) -> dict:
"""Check the risky asset ratio of the IRP portfolio."""
risk_value = sum(
h["value_krw"] for code, h in holdings.items()
if code in RISK_ASSET_CODES
)
safe_value = sum(
h["value_krw"] for code, h in holdings.items()
if code in SAFE_ASSET_CODES
)
total = risk_value + safe_value
risk_ratio = risk_value / total if total > 0 else 0
safe_ratio = safe_value / total if total > 0 else 0
compliant = risk_ratio <= max_risk_ratio
return {
"total_value": f"₩{total:,}",
"risk_assets": f"₩{risk_value:,} ({risk_ratio*100:.1f}%)",
"safe_assets": f"₩{safe_value:,} ({safe_ratio*100:.1f}%)",
"risk_limit": f"{max_risk_ratio*100:.0f}%",
"compliant": compliant,
"action": (
"Risky asset ratio within limits"
if compliant
else f"Risky asset ratio exceeded: {risk_ratio*100:.1f}% > {max_risk_ratio*100:.0f}%. "
f"Need to convert ₩{int(risk_value - total * max_risk_ratio):,} to safe assets."
),
}
# Usage example
irp_result = irp_risk_check({
"360750": {"value_krw": 3_500_000}, # S&P500 (risky)
"133690": {"value_krw": 1_800_000}, # NASDAQ100 (risky)
"069500": {"value_krw": 1_200_000}, # KODEX200 (risky)
"443160": {"value_krw": 1_500_000}, # Composite Bond (safe)
"305080": {"value_krw": 1_000_000}, # US Treasury 10Y (safe)
})
print("=== IRP Risky Asset Ratio Check ===")
for key, value in irp_result.items():
print(f" {key}: {value}")
ISA vs IRP: Which to Invest in First -- Priority Decision
When you have limited investment funds, should you contribute to ISA or IRP first?
Investment Priority Decision Tree
1. Contribute 3-9M KRW annually to IRP (maximize tax deduction)
- Tax deduction effect: Immediate 13.2-16.5% guaranteed return
- Note: Cannot withdraw until age 55 (liquidity constraint)
2. Contribute up to 20M KRW annually to ISA
- Can include funds needed within 3 years
- Tax-free 2-4M KRW + 9.9% flat rate on excess
3. Regular account
- Amounts exceeding ISA/IRP limits
- Funds requiring liquidity
Optimal Allocation by Salary Level
| Annual Salary | IRP Contribution | ISA Contribution | Regular Account | Annual Tax Savings |
|---|---|---|---|---|
| 40M KRW | 9M KRW | 11M KRW | - | IRP deduction 1.485M + ISA tax-free |
| 60M KRW | 9M KRW | 20M KRW | Surplus | IRP deduction 1.188M + ISA tax-free |
| 80M KRW | 9M KRW | 20M KRW | Surplus | IRP deduction 1.188M + ISA tax-free |
| 100M KRW | 9M KRW | 20M KRW | Surplus | IRP deduction 1.188M + ISA tax-free |
Key: Regardless of salary, always fill the IRP 9M KRW. Tax deductions are a guaranteed return (13.2-16.5%) independent of investment performance. No return is more certain.
ISA Maturity Conversion Strategy
After the ISA 3-year maturity, there are two options.
Option 1: Extend Maturity
- Keep the account and continue investing
- Tax-free limit does not reset every 3 years (cumulative)
- Can continue rebalancing under tax-free/flat-rate benefits
Option 2: Terminate and Transfer to IRP/Pension Savings
- Transfer all or part of ISA maturity proceeds to IRP/Pension Savings
- 10% of the transferred amount (up to 3M KRW) is eligible for additional tax deduction
- Example: ISA 30M KRW maturity transferred to IRP = 3M KRW additional tax deduction = 396K-495K KRW tax savings
"""Calculate tax benefits when transferring ISA maturity to IRP."""
def isa_to_irp_benefit(
isa_balance: int,
max_additional_deduction: int = 3_000_000,
tax_rate: float = 0.132,
) -> dict:
"""Calculate additional tax deduction when transferring ISA maturity to IRP."""
eligible_amount = min(isa_balance, isa_balance) # Assume full transfer
deduction_base = min(int(eligible_amount * 0.1), max_additional_deduction)
additional_tax_saving = int(deduction_base * tax_rate)
return {
"ISA Maturity Balance": f"₩{isa_balance:,}",
"IRP Transfer Amount": f"₩{eligible_amount:,}",
"Additional Deduction Base": f"₩{deduction_base:,}",
"Additional Tax Savings": f"₩{additional_tax_saving:,}",
"Note": "Transfer is separate from the existing IRP annual contribution limit (18M KRW)",
}
result = isa_to_irp_benefit(isa_balance=30_000_000)
print("=== ISA to IRP Transfer Benefits ===")
for key, value in result.items():
print(f" {key}: {value}")
Full Workflow Automation Architecture
┌─────────────────────────────────────────────────────┐
│ GitHub Actions (Scheduler) │
│ Every Monday 09:00 KST -> Drift check │
│ First business day of quarter -> Scheduled rebalance │
│ 1st of each month -> Contribution status check │
└────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Python Rebalancing Engine │
│ 1. Query ISA/IRP/general account balances via API │
│ 2. Compare YAML config with current weights │
│ 3. Determine rebalancing needs per account │
│ - ISA: Check tax-free limit │
│ - IRP: Check 70% risky asset limit │
│ 4. Generate trade orders (dry-run) │
└────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Notifications (Slack / KakaoTalk) │
│ - When rebalancing needed: trade details + cost est │
│ - When contributions behind: remaining + recommended │
│ - Tax deduction deadline approaching: Nov-Dec alert │
└─────────────────────────────────────────────────────┘
Quiz
Q1. Which type of ISA should you choose to invest directly in ETFs?
Answer: You must choose a Brokerage ISA. General/Low-Income types are trust-based and managed by
the securities firm, making individual ETF trading impossible.
Q2. What is the maximum percentage of equity ETFs you can invest in through IRP?
Answer: Up to 70% of accumulated funds can be invested in risky assets (including equity ETFs). The remaining 30% or more must consist of safe assets such as bond ETFs and deposits.
Q3. How much tax deduction does an employee with a 60M KRW salary receive by contributing 9M KRW
to IRP?
Answer: Since the gross salary exceeds 55M KRW, a 13.2% deduction rate applies. 9M KRW x 13.2% = 1.188M KRW tax deduction.
Q4. What additional benefit can you receive by transferring ISA maturity (3 years) to IRP?
Answer: You can receive additional tax deductions on 10% of the transferred amount (up to 3M KRW). For example, transferring 30M KRW gives a 3M KRW deduction base, resulting in 13.2% (396K KRW) or 16.5% (495K KRW) additional tax savings.
Q5. Why is it advantageous to put high-dividend ETFs in ISA rather than IRP?
Answer: In ISA, dividend income is tax-free if within the tax-free limit (2-4M KRW). IRP only
defers taxes and charges pension income tax of 3.3-5.5% upon receipt. If dividend amounts are
within the tax-free limit, ISA has an absolute tax advantage.
Q6. Why is the IRP tax deduction described as a "guaranteed return"?
Answer: Tax deductions are a confirmed 13.2-16.5% tax refund immediately upon contribution,
regardless of investment performance. While stock investment returns are uncertain, tax deductions
are definitively returned through year-end settlement, making them effectively the most certain
return.
Q7. Why should investment priority be given to IRP over ISA?
Answer: The IRP tax deduction (13.2-16.5%) is an immediately confirmed return, while ISA's
tax-free benefit only has value when profits are generated. When investment funds are limited,
it's rational to fill the IRP tax deduction limit (9M KRW) first and allocate the remainder to
ISA.
References
- Bogle, John. The Little Book of Common Sense Investing. Wiley, 2017.
- Financial Supervisory Service - ISA Guide: https://www.fss.or.kr/
- National Tax Service - Pension Savings/IRP Tax Deductions: https://www.nts.go.kr/
- Korea Investment & Securities KIS Developers API: https://apiportal.koreainvestment.com/
- Korea Financial Investment Association - Retirement Pension System Guide: https://www.kofia.or.kr/
- ETF CHECK: https://www.etfcheck.co.kr/
- Korea Exchange ETF Information: https://www.krx.co.kr/