TT Lab
블로그 시작하기
배우기 러닝패스 코스

은행 현장의 언어

상환 스케줄 계산과 이자 검증

TT Lab 에서 이어서 보기

목표

대출 상환 스케줄을 두 방식으로 직접 계산해 보고, 예금 이자와 세금, 연체이자, 자산건전성 분류와 충당금까지 은행 여수신의 숫자가 어디서 나오는지 손으로 확인합니다.

왜 중요한가

은행 시스템 요구사항의 절반은 "이 숫자가 왜 이렇게 나오느냐" 입니다. 원리금 균등 상환은 매달 내는 돈이 같고, 원금 균등 상환은 매달 갚는 원금이 같습니다. 같은 대출인데 총이자가 다르고, 첫 달 납입액이 다르고, 중도상환 때 남는 원금이 다릅니다. 이 차이를 모르면 상환 스케줄 화면의 버그와 정상 동작을 구별할 수 없습니다.

이자 계산에는 관행이 있습니다. 월 이율은 연이율을 12 로 나눈 값이고, 예금 이자는 날짜를 세어 365 로 나누며, 원 미만은 어느 단계에서 어떻게 버리는지가 회사마다 정해져 있습니다. 이 실습은 그 관행을 이 실습의 규칙 으로 못 박아 둡니다 — 실무에서는 그 규칙이 여러분 회사의 상품 정의서에 있습니다. 규칙이 다르면 숫자가 1원씩 어긋나고, 그 1원이 원장 대사에서 잡힙니다.

연체는 이자의 문제이면서 동시에 분류의 문제입니다. 며칠 늦었는가에 따라 정상·요주의·고정으로 나뉘고, 그 분류가 은행이 쌓아야 하는 충당금을 정합니다. 충당금은 손익에 바로 반영되므로 분류 하나가 그 분기 실적을 바꿉니다.

이 실습의 규칙

단계

  1. 오른쪽 예시의 생성기를 /root/bank/make_loans.py 로 저장하고 python3 make_loans.py 로 실행하세요. loans.csv(대출 6건), payments.csv(납입 32회차), deposits.csv(예금 3건)가 만들어집니다.
  2. L001 의 원리금 균등 상환 스케줄을 /root/bank/schedule_L001.csv 에 n,payment,interest,principal,balance 머리글로 360줄 적으세요.
  3. L002 의 원금 균등 상환 스케줄을 /root/bank/schedule_L002.csv 에 같은 머리글로 36줄 적으세요.
  4. L003 을 두 방식으로 모두 계산해 /root/bank/compare_L003.txt 에 annuity_payment=, annuity_total_interest=, equal_first_payment=, equal_last_payment=, equal_total_interest=, interest_diff= 여섯 줄을 적으세요. interest_diff 는 원리금 균등 총이자에서 원금 균등 총이자를 뺀 값입니다.
  5. 예금 3건의 만기 이자와 세금을 /root/bank/deposit_interest.csv 에 dep_id,principal,days,interest,income_tax,local_tax,net 머리글로 적으세요. net 은 원금에 이자를 더하고 세금 둘을 뺀 값입니다.
  6. payments.csv 에서 늦게 냈거나 아직 못 낸 회차를 /root/bank/overdue.csv 에 loan_id,seq,due_date,days_late,late_interest 머리글로 적고, /root/bank/overdue.txt 에 overdue_rows=, late_interest_total=, max_days_late=, max_loan= 네 줄을 적으세요.
  7. 대출 6건 전부를 /root/bank/provision.csv 에 loan_id,days_overdue,class,outstanding,rate_pct,provision 머리글로 적고, /root/bank/provision.txt 에 total_outstanding=, total_provision=, substandard_count= 세 줄을 적으세요. outstanding 은 loans.csv 의 outstanding_20260831 입니다.
  8. /root/bank/loan_report.md 에 ## Repayment comparison(상환 방식 비교), ## Deposit interest and tax(예금 이자와 세금), ## Overdue and classification(연체와 건전성 분류), ## What the system must keep(시스템에 남겨야 할 것) 네 절로 보고서를 쓰세요.

참고

대출·예금 데이터 만들기

오른쪽 예시의 생성기를 /root/bank/make_loans.py 로 저장하고 python3 make_loans.py 로 실행하세요. loans.csv(대출 6건), payments.csv(납입 32회차), deposits.csv(예금 3건)가 만들어집니다.

실습 안내에 있는 생성기를 /root/bank/make_loans.py 로 저장하고 python3 로 실행하세요. 손으로 고치면 뒤 단계의 숫자가 전부 어긋납니다.

원리금 균등 스케줄 뽑기

L001 의 원리금 균등 상환 스케줄을 /root/bank/schedule_L001.csv 에 n,payment,interest,principal,balance 머리글로 360줄 적으세요.

월 이율 r = 4.50 ÷ 100 ÷ 12. 납입액 = P × r ÷ (1 − (1 + r)^−360) 을 원 미만 반올림. 매달 이자 = 직전 잔액 × r 반올림, 원금 = 납입액 − 이자, 마지막 달은 남은 잔액 전부. int(x + 0.5) 로 반올림하세요.

원금 균등 스케줄 뽑기

L002 의 원금 균등 상환 스케줄을 /root/bank/schedule_L002.csv 에 같은 머리글로 36줄 적으세요.

월 원금 = 30,000,000 // 36 (내림). 매달 이자 = 직전 잔액 × (7.50 ÷ 100 ÷ 12) 반올림. 납입액 = 이자 + 원금. 마지막 달 원금은 남은 잔액 전부라 나머지 12원이 거기 붙습니다.

같은 대출을 두 방식으로 비교하기

L003 을 두 방식으로 모두 계산해 /root/bank/compare_L003.txt 에 annuity_payment=, annuity_total_interest=, equal_first_payment=, equal_last_payment=, equal_total_interest=, interest_diff= 여섯 줄을 적으세요. interest_diff 는 원리금 균등 총이자에서 원금 균등 총이자를 뺀 값입니다.

2·3단계의 계산기를 L003(50,000,000 · 3.75% · 36개월)에 그대로 적용하고 두 스케줄의 이자 열을 각각 합치세요. 원리금 균등 쪽이 더 큽니다.

예금 이자와 원천징수 세금 계산하기

예금 3건의 만기 이자와 세금을 /root/bank/deposit_interest.csv 에 dep_id,principal,days,interest,income_tax,local_tax,net 머리글로 적으세요. net 은 원금에 이자를 더하고 세금 둘을 뺀 값입니다.

days = 만기일 − 가입일 (datetime.date 끼리 빼면 .days). interest = int(P × rate/100 × days/365). income_tax = int(interest × 0.14) 을 10원 미만 버림, local_tax = 그 10% 를 10원 미만 버림.

연체 회차와 연체이자 계산하기

payments.csv 에서 늦게 냈거나 아직 못 낸 회차를 /root/bank/overdue.csv 에 loan_id,seq,due_date,days_late,late_interest 머리글로 적고, /root/bank/overdue.txt 에 overdue_rows=, late_interest_total=, max_days_late=, max_loan= 네 줄을 적으세요.

paid_date 가 있으면 paid_date − due_date, 없으면 2026-08-31 − due_date 가 연체일수입니다. 0 이하는 연체가 아닙니다. 연체이자 = int(amount_due × (rate + 3.0)/100 × days/365). 약정금리는 loans.csv 에서 대출별로 가져오세요.

건전성 분류와 충당금 산출하기

대출 6건 전부를 /root/bank/provision.csv 에 loan_id,days_overdue,class,outstanding,rate_pct,provision 머리글로 적고, /root/bank/provision.txt 에 total_outstanding=, total_provision=, substandard_count= 세 줄을 적으세요. outstanding 은 loans.csv 의 outstanding_20260831 입니다.

대출별로 paid_date 가 빈 회차 중 가장 이른 due_date 를 찾아 2026-08-31 에서 빼세요. 미납이 없으면 0 일입니다. 0~29 NORMAL, 30~89 PRECAUTIONARY, 90 이상 SUBSTANDARD. 충당금 = int(outstanding × 비율/100).

여수신 검증 보고서 쓰기

/root/bank/loan_report.md 에 ## Repayment comparison(상환 방식 비교), ## Deposit interest and tax(예금 이자와 세금), ## Overdue and classification(연체와 건전성 분류), ## What the system must keep(시스템에 남겨야 할 것) 네 절로 보고서를 쓰세요.

task 의 절 제목 네 개(백틱 안의 영어 제목, 또는 괄호 안의 한국어 제목이나 같은 뜻의 일본어·중국어 제목)를 각각 ## 로 시작하는 한 줄로 쓰세요. 상환 방식 비교에는 L003 의 총이자 차이(interest_diff)를, 예금 절에는 세율(tax rate)을, 연체 절에는 SUBSTANDARD 로 떨어진 대출 번호 전부와 충당금(provision) 합계를 숫자로 적으세요.