은행 업무의 구조 · 여신·수신과 이자 · 실습
상환 스케줄 계산과 이자 검증
목표
대출 상환 스케줄을 두 방식으로 직접 계산해 보고, 예금 이자와 세금, 연체이자, 자산건전성 분류와 충당금까지 은행 여수신의 숫자가 어디서 나오는지 손으로 확인합니다.
왜 중요한가
은행 시스템 요구사항의 절반은 "이 숫자가 왜 이렇게 나오느냐" 입니다. 원리금 균등 상환은 매달 내는 돈이 같고, 원금 균등 상환은 매달 갚는 원금이 같습니다. 같은 대출인데 총이자가 다르고, 첫 달 납입액이 다르고, 중도상환 때 남는 원금이 다릅니다. 이 차이를 모르면 상환 스케줄 화면의 버그와 정상 동작을 구별할 수 없습니다.
이자 계산에는 관행이 있습니다. 월 이율은 연이율을 12 로 나눈 값이고, 예금 이자는 날짜를 세어 365 로 나누며, 원 미만은 어느 단계에서 어떻게 버리는지가 회사마다 정해져 있습니다. 이 실습은 그 관행을 이 실습의 규칙 으로 못 박아 둡니다 — 실무에서는 그 규칙이 여러분 회사의 상품 정의서에 있습니다. 규칙이 다르면 숫자가 1원씩 어긋나고, 그 1원이 원장 대사에서 잡힙니다.
연체는 이자의 문제이면서 동시에 분류의 문제입니다. 며칠 늦었는가에 따라 정상·요주의·고정으로 나뉘고, 그 분류가 은행이 쌓아야 하는 충당금을 정합니다. 충당금은 손익에 바로 반영되므로 분류 하나가 그 분기 실적을 바꿉니다.
이 실습의 규칙
- 월 이율 = 연이율 ÷ 12 (반올림하지 않고 그대로 씁니다). 매달 이자 = 직전 잔액 × 월 이율, 원 미만 반올림.
- 원리금 균등의 월 납입액은
P × r ÷ (1 − (1 + r)^−n)을 원 미만 반올림한 값이고, 마지막 달은 남은 원금을 전부 갚습니다. - 원금 균등의 월 원금은
P ÷ n의 몫(내림)이고, 나누어떨어지지 않는 나머지는 마지막 달에 붙습니다. - 예금 이자 = 원금 × 연이율 × 일수 ÷ 365, 원 미만 버림. 일수는 만기일에서 가입일을 뺀 날수입니다. 소득세는 이자의 14%, 지방소득세는 소득세의 10%, 둘 다 10원 미만 버림.
- 연체이자 = 연체한 회차의 약정 납입액 × (약정금리 + 3.0)% × 연체일수 ÷ 365, 원 미만 버림. 기준일은
2026-08-31이고, 미납 회차의 연체일수는 기준일에서 납입일을 뺀 날수입니다. - 건전성 분류는 가장 오래된 미납 회차 기준으로 0~29일
NORMAL, 30~89일PRECAUTIONARY, 90일 이상SUBSTANDARD. 충당금 비율은 각각 1.0%, 10.0%, 20.0% 이고, 충당금 = 잔액 × 비율, 원 미만 버림.
단계
1. 오른쪽 예시의 생성기를 /root/bank/make_loans.py 로 저장하고 python3 make_loans.py 로 실행하세요. loans.csv(대출 6건), payments.csv(납입 23회차), 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 에 ## 상환 방식 비교, ## 예금 이자와 세금, ## 연체와 건전성 분류, ## 시스템에 남겨야 할 것 네 절로 보고서를 쓰세요.
참고
- 파이썬으로 계산하는 편이 빠릅니다.
csv모듈로 읽고datetime.date.fromisoformat으로 날짜를 빼면 일수가 나옵니다. - 파이썬
round()는 .5 를 짝수 쪽으로 보냅니다. 원 미만 반올림은int(x + 0.5)로, 버림은int(x)로 하세요. - 흔한 실수 1: 월 이율을 소수 넷째 자리에서 반올림하고 시작하는 것. 360개월이면 마지막 잔액이 수만 원 어긋납니다.
- 흔한 실수 2: 연체일수를 기준일이 아니라 오늘 날짜로 세는 것. 채점기는
2026-08-31기준입니다. - 흔한 실수 3: 세금을 이자 합계에 한 번 매기는 것. 예금 건마다 따로 계산하고 따로 버립니다.
단계 8개
- 대출·예금 데이터 만들기
- 원리금 균등 스케줄 뽑기
- 원금 균등 스케줄 뽑기
- 같은 대출을 두 방식으로 비교하기
- 예금 이자와 원천징수 세금 계산하기
- 연체 회차와 연체이자 계산하기
- 건전성 분류와 충당금 산출하기
- 여수신 검증 보고서 쓰기