보험 도메인 심화 · 보험료 일할계산과 환급 정합성 · 실습
349원이 어디서 갈라졌는지 규칙 단위로 짚기
목표
중도 해지 계약의 미경과보험료를 다시 계산하고, 일수 기준과 반올림 방식과 구간 분리가 만드는 차이를 계약 단위로 지목해 정정 목록까지 낸다.
왜 중요한가
환급액은 "연보험료 곱하기 미경과일수 나누기 총일수" 한 줄처럼 보이지만, 그 한 줄 안에 정책으로 정해야 하는 값이 세 개 숨어 있다. 일수를 어떻게 세는가, 어디서 끊는가, 기중 변경을 반영하는가.
세 값을 다르게 잡은 두 시스템은 각자 맞는 계산을 하면서도 다른 답을 낸다. 그때 필요한 것은 "차이가 납니다" 가 아니라 "이 계약의 차이는 일수 기준 때문이고 저 계약은 구간 때문" 이라는 설명이다.
채점기는 여러분이 적은 숫자끼리 견주지 않는다. 1단계 자료에서 기준값을 다시 계산해 대조하니, 안내의 규칙을 그대로 따라야 한다.
단계
1. /root/prem/gen_prem.py 를 만들어 실행해 /root/prem/policies.csv(60건)와 /root/prem/changes.csv(15건)를 만든다.
2. 계약마다 실제 일수와 30/360 두 기준의 총일수·경과일수·미경과일수를 /root/prem/daycount.json 에 적는다.
3. 실제 일수 기준으로 미경과보험료를 계산해 /root/prem/refund_actual.json 에 적는다.
4. 같은 계약을 30/360 기준으로 계산해 /root/prem/refund_30360.json 에 적고 3단계와의 차이를 함께 남긴다.
5. 보장 변경이 있는 계약을 변경일 앞뒤로 쪼개 /root/prem/segments.json 에 구간별 환급액을 적는다.
6. 구간마다 끊은 합과 끝에서 한 번만 끊은 값의 차이, 그리고 월납 12분할을 /root/prem/rounding.json 에 적는다.
7. 청구 시스템과 회계 시스템의 계산을 나란히 돌려 /root/prem/diff.json 에 계약별 차이와 원인을 적는다.
8. 정정 목록과 결론을 /root/prem/report.json 하나로 묶고 policies.csv 의 sha256 을 함께 적는다.
참고
- 1단계 계약 규칙(i 는 0 부터 59): policy_id 는
P0001부터 네 자리, 시작일은 2024-01-01 에(i * 59) % 730일을 더한 날, 만기일은 시작일의 1년 뒤 같은 날에서 하루 전(그 날이 없으면 그 달 말일로 당긴 뒤 하루 전), pay_mode 는 i 가 홀수면 monthly 짝수면 annual, 연보험료는120000 + (i * 7777) % 880001, 해지일은 시작일에37 + (i * 29) % 300일을 더한 날이다. - 1단계 변경 규칙: i 를 4로 나눈 나머지가 2 인 계약만 변경이 있다. 변경일은 시작일에
30 + (i * 47) % 260일을 더한 날, 새 연보험료는연보험료 + 60000 + (i * 3331) % 200000이다. - 일수 정의: 총일수는 시작일과 만기일을 모두 포함해 세고, 경과일수는 해지일에서 시작일을 뺀 날수(해지일 당일은 보장하지 않는다), 미경과일수는 총일수에서 경과일수를 뺀 값이다.
- 30/360(US) 규칙: 앞 날짜의 일이 31 이면 30 으로 당기고, 뒤 날짜의 일이 31 이면서 앞이 30 이상이면 30 으로 당긴 뒤
360 * 연차 + 30 * 월차 + 일차로 센다. 총일수와 미경과일수는 여기에 실제 일수와 같은 방식으로 1 을 더해 양끝을 포함시킨다. - 환급액:
연보험료 * 미경과일수 / 총일수를 1원 단위로 끊는다. 3 · 4 · 5단계의 정책은 ROUND_HALF_UP 이다. - 구간 미경과일수: 구간이 해지일부터 만기일까지와 겹치는 날만 센다. 겹치지 않으면 0 이다.
- 7단계 두 경로: 청구 시스템은 실제 일수 · ROUND_HALF_UP · 구간 반영이고, 회계 시스템은 30/360 · 원 미만 절사(ROUND_DOWN) · 구간 무시(원래 연보험료로 전체 기간)다. 원인은 회계 계산에서 규칙 하나만 청구 쪽으로 바꿨을 때 값이 달라지는 것만
daycount,rounding,segment순서로 적는다. - 흔한 실수: 미경과일수에 해지일 당일을 넣기, 30/360 에서 양끝 포함을 빼먹기, 구간이 미경과 구간과 겹치지 않는데 1일로 세기, 월납 분할에서 나머지 버리기.
- 확인:
python3 -c "import json;print(json.load(open('/root/prem/diff.json'))['by_cause'])"
단계 8개
- 계약과 보장 변경 자료 만들기
- 일수 기준 두 가지를 갈라 놓기
- 실제 일수로 미경과보험료 계산하기
- 분모를 30/360 으로 바꿔 보기
- 기중 보장 변경을 구간으로 쪼개기
- 끊는 자리를 어디에 둘 것인가
- 두 시스템의 차이를 규칙 단위로 지목하기
- 정정 목록과 결론을 한 장으로