본문으로 건너뛰기
🛠️ToolsShed

부채 스노우볼 계산기

스노우볼 또는 아발란체 전략으로 부채 상환 계획을 세웁니다.

이 도구 소개

부채 눈덩이 계산기는 눈덩이 또는 아발란체 전략을 사용하여 여러 부채의 전략적 상환 계획을 수립할 수 있도록 도와줍니다. 많은 사람들이 여러 부채를 안고 있으며 큰 총 잔액 앞에서 동기를 유지하기 어려워합니다. 이 도구는 각 부채가 언제 갚아질 것인지, 그리고 최소 상환금 이상으로 추가 상환하여 얼마나 많은 이자를 절약할 수 있는지 보여주는 월별 로드맵을 제공합니다.

계산기를 사용하려면 모든 부채를 현재 잔액, 월 최소 상환금, 금리와 함께 나열하고 월간 총 상환 예산을 설정합니다. 계산기는 선택한 전략에 따라 부채를 재정렬합니다. 눈덩이 방식은 심리적 모멘텀을 위해 가장 작은 잔액을 먼저 우선하고, 아발란체는 총 이자 지급을 최소화하기 위해 가장 높은 금리를 목표로 합니다. 몇 초 내에 완전한 상환 일정, 총 이자, 그리고 갚아진 부채가 다음 대상 부채에 자금을 해제하는 눈덩이 효과의 월별 표시를 얻을 수 있습니다.

눈덩이 방식은 초기 성공이 감정적 모멘텀을 구축하기 때문에 일반적으로 완료율이 높고, 아발란체는 수학적으로 가장 많은 돈을 절약합니다. 동기 부여가 문제라면 눈덩이를 선택하고, 재정에 규율이 있다면 아발란체를 선택하세요. 계산기는 고정 금리와 상환 계획의 엄격한 준수를 가정한다는 점을 기억하세요. 실제로는 새로운 청구나 인생 변화에 맞게 조정해야 할 수 있습니다. 정확한 계약이 아닌 동기 부여 로드맵으로 사용하고, 부채 상황이 압도적이라고 느껴진다면 신용 상담사와의 상담을 고려하세요.

자주 묻는 질문

코드 구현

from dataclasses import dataclass, field
from typing import List, Optional

@dataclass
class Debt:
    name: str
    balance: float
    min_payment: float
    apr: float  # Annual Percentage Rate e.g. 0.20 for 20%

    @property
    def monthly_rate(self) -> float:
        return self.apr / 12

@dataclass
class PayoffResult:
    name: str
    months_to_payoff: int
    total_paid: float
    total_interest: float

def debt_snowball(debts: List[Debt], monthly_budget: float) -> List[PayoffResult]:
    """
    Simulate the debt snowball method.
    Debts are sorted by balance (smallest first).
    Extra budget is applied to the current target debt.
    """
    # Sort by balance ascending (snowball)
    queue  = sorted(debts, key=lambda d: d.balance)
    paid   = [False] * len(queue)
    bals   = [d.balance for d in queue]
    totals = [0.0] * len(queue)  # total paid per debt
    month  = 0
    results = []

    while any(not p for p in paid):
        month += 1
        # Find current target: first unpaid debt
        target_idx = next(i for i, p in enumerate(paid) if not p)

        # Calculate total minimums for non-target debts
        minimums_used = sum(
            queue[i].min_payment for i in range(len(queue))
            if not paid[i] and i != target_idx
        )
        extra = monthly_budget - minimums_used

        # Apply payments
        for i, debt in enumerate(queue):
            if paid[i]:
                continue
            payment = extra if i == target_idx else debt.min_payment
            interest = bals[i] * debt.monthly_rate
            principal = min(payment - interest, bals[i])
            bals[i] -= principal
            totals[i] += payment
            if bals[i] <= 0.01:
                paid[i] = True
                results.append(PayoffResult(
                    name=debt.name,
                    months_to_payoff=month,
                    total_paid=totals[i] + bals[i],  # adjust overpayment
                    total_interest=totals[i] - debt.balance
                ))

    return results

# Example
debts = [
    Debt("Credit Card A", balance=2500,  min_payment=75,  apr=0.22),
    Debt("Credit Card B", balance=5000,  min_payment=100, apr=0.18),
    Debt("Car Loan",      balance=8000,  min_payment=200, apr=0.06),
    Debt("Student Loan",  balance=15000, min_payment=150, apr=0.05),
]

results = debt_snowball(debts, monthly_budget=700)

total_interest = sum(r.total_interest for r in results)
print("Debt Snowball Payoff Plan:")
print(f"{'Debt':<20} {'Months':>7} {'Interest Paid':>14}")
for r in results:
    yrs = r.months_to_payoff // 12
    mos = r.months_to_payoff % 12
    print(f"{r.name:<20} {yrs}y {mos:02d}m  ${r.total_interest:>12,.2f}")
print(f"{'Total interest:':<20}        ${total_interest:>12,.2f}")

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.