Skip to content
Published on

ファイナンス:ISA IRP ETF自動化ワークフロー 2026

Authors
  • Name
    Twitter
ファイナンス:ISA IRP ETF自動化ワークフロー 2026

ISAとIRPをETF投資に活用する理由

税金は投資収益の最も確実な敵だ。どんなに良い収益率を上げても、税金を払えば実質的なリターンは大幅に縮小する。韓国で個人投資家が合法的に税金を減らせる最も強力な2つの手段が、**ISA(Individual Savings Account、個人総合資産管理口座)IRP(Individual Retirement Pension、個人型退職年金)**だ。

この2つの口座を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(ターゲットデートファンド)
  • 債券型/MMF型ETF(安全資産)

投資不可:

  • レバレッジ/インバースETF
  • デリバティブ比率40%超過ETF
  • 海外直接上場ETF(国内上場の海外指数ETFは可能)

リスク資産70%ルールの例:

  • IRP残高900万ウォンの場合:株式型ETF最大630万ウォン、債券型ETF最低270万ウォン

ISA+IRP統合資産配分戦略

口座別の役割分担

税効率を最大化するには、どの資産をどの口座に入れるかが重要だ。

資産タイプ最適口座理由
配当収益が高いETFISA配当所得非課税200-400万ウォン適用
成長株ETF(売買差益中心)ISA国内ETF売買差益非課税+ISA追加節税
債券型ETFIRPIRP安全資産30%義務充足+利息所得課税繰延
海外指数追従ETFIRP配当所得課税繰延(年金受給時3.3-5.5%)
高リスクテーマETFISAIRPはリスク資産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 二次電池産業'
        weight: 0.10
        role: 'サテライト - 二次電池'
      - 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:
    # 上記2口座に入れられない追加投資金
    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年満期後に2つの選択肢がある。

選択肢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. 証券会社APIISA/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に配分するのが合理的。

参考資料