1.2 담보와 산출방식 매칭#
이 챕터에서 배우는 것
엔진이 왜 각 담보의 산출방식을 미리 알아야 하는가
산출방식에 따라 어떤 계산 분기로 들어가는지 — 다섯 가지로 단순화
사용자가 지정해주는 자리 (
calculation_methods.csv) 가 왜 별도 파일인가사망 종류 (일반사망 / 질병사망 / 재해사망) 가 모두 같은 산출방식인 이유
한국 상품의 매핑 표, 담보별 산출방식 작성, 등록 누락 시 잡히는 자리
왜 사용자가 산출방식을 지정해야 하나#
엔진이 청구 (cash flow 발생) 를 계산하는 방식은 담보마다 다릅니다. 사망 보장 은 사람이 한 번 죽으면 더 발생하지 않고, 입원 보장 은 같은 사람이 매월 다시 발생할 수 있고, 진단 보장 은 한 번 진단 받으면 다음 달부터 발생하지 않습니다. 같은 수학식 한 줄로 세 경우를 다 풀 수 없어, 엔진이 담보별로 다른 계산 알고리즘 을 골라 적용해야 합니다.
문제는 엔진이 담보의 이름 ('CANCER', 'INPATIENT', 'ADB' 등) 만 보고
어떤 알고리즘을 적용할지 자동 추론할 수 없다는 점 — 한국 시장의 담보
이름은 회사마다, 상품마다 자유 형식입니다. 그래서 사용자가 “이 담보는
이런 식으로 지급된다” 를 미리 알려줘야 합니다. 그 매핑이 담보별 산출방식
(calculation_method) 이고, 새로운 담보가 생길 때 추가로 매칭해주면 됩니다.
다섯 가지 분기로 단순화됩니다:
산출방식 |
어떤 계산 |
한국 상품 예 |
|---|---|---|
DEATH |
사망률 × 보유계약 × 보험금. 보유계약은 별도 사망률로 따로 감쇠 (한 번 죽으면 끝). |
일반사망 / 질병사망 / 재해사망 등 모든 사망형 담보 |
MORBIDITY |
발생률 × 보유계약 × 보험금. 매월 반복 (같은 사람도 다시 발생 가능). |
입원 / 수술 / 통원 |
DIAGNOSIS |
진단율 × 미진단풀 × 보험금. 풀이 매월 감쇠 (한 번 진단 받으면 끝). |
암 / 뇌혈관 / 심혈관 진단보험금 |
ANNUITY |
생존계약 × 정액 (매월 / 매 N 개월). 위험률 없음. |
생존연금 |
MATURITY |
만기 생존계약 × 정액. 만기 시 1 회. |
만기환급금 |
세 가지 위험률 기반 산출방식 (DEATH / MORBIDITY / DIAGNOSIS) 의 차이는 본질 적으로 어떤 풀에서 차감되는가 의 차이입니다 — 자세한 메커니즘은 보장 청구 메커니즘 챕터.
참고
주계약은 상품마다 다른 산출방식 입니다. 정기 / 종신은 DEATH, 암보험은 DIAGNOSIS, 건강 / 실손은 MORBIDITY, 연금은 ANNUITY. 엔진은 “주계약” 자체를 모릅니다 — 담보별 산출방식에 등록된 담보들 중 어느 것이 주계약인지는 회사 / product 단위 결정.
왜 별도 파일인가 — 책임 분리#
회사가 평가 엔진에 넣는 입력은 각자 다른 책임 을 갖습니다.
단위 |
파일 |
무엇 |
|---|---|---|
결산 basis |
|
위험률 / 할인율 / 사업비 / 위험조정 |
Portfolio |
|
어떤 계약이 어떤 담보를 얼마에 |
담보별 산출방식 |
|
어떤 담보가 어떤 산출방식인가 |
세 파일이 각자 자기 책임만 가지면 한 갱신이 다른 파일에 닿지 않습니다. 담보별 산출방식은 신담보 추가 작업의 자리, basis 는 위험률 calibration 의 자리, portfolio 는 정책관리 의 자리 — 그래서 한 작업이 다른 자리를 건드리지 않습니다.
import fastcashflow as fcf
# 패키지 샘플로 시연 -- 자기 데이터를 쓸 때는 이 줄을 빼고
# 그 자리에 자기 파일이 있다고 보면 됩니다.
fcf.samples.export("samples", template="gmm", quiet=True) # basis.xlsx + policies / coverages / calculation_methods (+ inforce)
mp = fcf.read_model_points(
"samples/policies.csv", # 계약 spec 파일
coverages="samples/coverages.csv", # 담보 가입금액 파일
calculation_methods="samples/calculation_methods.csv", # ← 담보별 산출방식
)
한국 상품 → 산출방식 매핑 표#
상품 / 담보 종류 |
CalculationMethod |
비고 |
|---|---|---|
일반사망 (정기 / 종신 주계약) |
DEATH |
rate_table = mortality 류 (all-cause) |
재해사망 (80% 후유장해 의제사망 포함) |
DEATH |
rate_table = 자체 incidence (재해 사고 사망률) |
질병사망 |
DEATH |
rate_table = 질병 사망률 (재해 제외) |
입원 일당 / 수술비 / 통원 / 골절 |
MORBIDITY |
반복 발생, in-force 안 줄임 |
암 / 뇌혈관 / 심혈관 진단비 |
DIAGNOSIS |
1 회 지급, depleting pool. 유사암 등 합성 위험률은 사용자 ETL 에서 미리 합성 |
암진단 생활비 (N 개월 정액) |
(현 v1 미지원) |
진단 후 머문 기간 동안 매월 지급 — Semi-Markov 영역. 별도 phase |
연금 (즉시) / 종신연금 |
ANNUITY |
rate 없음. 생존자에게 지급 |
만기환급금 / 단기납 종신의 환급 |
MATURITY |
생존 시 1 회. rate 없음 |
경고
모든 사망 종류는 DEATH 산출방식입니다 — 한국 시장의 사망 보장 분화
(일반사망 / 질병사망 / 재해사망) 는 같은 mechanic (사건 발생 시
amount 지급). 차이는 rate_table 일 뿐. 담보별 산출방식에 각자 별도
coverage 로 등록하되 산출방식은 모두 DEATH.
담보별 산출방식 작성 — calculation_methods.csv#
필수 두 컬럼 (coverage, calculation_method) — 아래 예시의 가운데
coverage_name 은 사람용 라벨로 선택이며 엔진은 무시합니다 (샘플
데이터에는 넣지 않습니다):
coverage,coverage_name,calculation_method
DEATH,일반사망 (주계약),DEATH
ADB,재해사망 특약,DEATH
DISEASE_DEATH,질병사망 특약,DEATH
CANCER,암진단 특약,DIAGNOSIS
INPATIENT,입원 일당,MORBIDITY
ANNUITY,종신 연금,ANNUITY
MATURITY,만기환급,MATURITY
coverage— 사용자 시스템의 코드 (cross-file join key).coverages.csv와basis.xlsx의coverages시트가 같은 값을 씁니다.coverage_name(선택) — 사람용 라벨. 엔진은 라우팅에coverage코드만 쓰고 이 컬럼은 완전히 무시합니다 (gmm.trace도 코드를 표시). 샘플 데이터에는 넣지 않으며, 자기 워크북에 보기용으로 둘 수는 있습니다.calculation_method— 위 다섯 enum 값 중 하나. 다른 값이면ValueError가 어느 행에서 났는지 알려줍니다.
참고
엔진에는 reserved 코드가 없습니다. 사망 보장은 다른 담보와 똑같이
basis.xlsx 의 coverages 시트 (rate-driven 자리) 에 등록하고, rate_table 에
mortality_tables (또는 incidence_rate_tables) 의 항목을 가리키게
합니다 — 일반사망 / 질병사망 / 재해사망 모두 같은
방식입니다. 엔진의 mortality_annual 입력은 계약 종료 (decrement)
용도로만 쓰입니다 — 사람이 죽으면 in-force 가 종료되는 것은 모든
상품에 항상 일어나는 사건이라 별도 입력으로 두지만, 사망 보장금의
지급 rate 는 담보별 산출방식에 등록된 DEATH 담보의 자체 rate_table 이
결정합니다.
변형 — 담보별 산출방식을 어떻게 짜는가#
회사가 사용하는 모든 담보를 한 번 정리:
사망 보장 — DEATH 로 등록. rate_table 별로 다른 coverage.
입원 / 수술 / 통원 — MORBIDITY.
암 / 뇌 / 심 진단비 — DIAGNOSIS.
연금 / 만기환급 — ANNUITY / MATURITY (이 두 종류는 rate 없음 →
coverages시트에 rate_table 등록 X).생활비 / 재진단 / DI (장해소득) 같은 상태에 머문 기간에 따라 달라지는 산출방식은 v1 미지원 — Semi-Markov 영역. (별도 phase)
담보별 산출방식은 신담보가 추가될 때만 한 줄을 더해줍니다. 분기 결산
때 갱신되는 건 basis.xlsx 입니다 — 담보별 산출방식이 분리되어 있어
결산 워크플로가 이 파일을 건드리지 않습니다.
함정 / 검증 — 등록 누락 시 어디서 에러#
네 단계 검증이 담보별 산출방식 미스를 catch 합니다:
단계 |
어디서 |
무엇 |
|---|---|---|
V1 |
|
|
V2 |
같음 |
|
V3 |
|
|
V4 |
|
담보별 산출방식에 있는 rate-driven 코드의 rate_table 이 basis 에 없음 |
# V1 예시 — 알 수 없는 산출방식
# calculation_methods.csv 의 한 행:
# ADB,재해사망,DEAATH # 오타: DEATH → DEAATH
# 결과:
# ValueError: calculation_methods row 'ADB': calculation_method='DEAATH'
# is not one of {DEATH, MORBIDITY, DIAGNOSIS, ANNUITY, MATURITY}
# V3 예시 — 담보별 산출방식 누락
# basis.xlsx coverages 시트:
# CA_DIAG | CANCER_STD ← rate_table 등록
# 그런데 calculation_methods.csv 에는 CA_DIAG 행 없음.
# 결과:
# ValueError: coverages frame references 1 coverage value(s)
# not in the calculation_methods taxonomy: ['CA_DIAG']
gmm.trace 의 Coverages 섹션이 한 계약의 담보별 산출방식 매핑을 그대로
보여줍니다:
├─ Coverages (rate-driven, n=3)
│ ├─ 'INPATIENT' method=MORBIDITY risk=1 is_diagnosis=False rate -> INPATIENT_STD
│ ├─ 'CANCER' method=DIAGNOSIS risk=1 is_diagnosis=True rate -> CANCER_STD
│ └─ 'ADB' method=DEATH risk=0 is_diagnosis=False rate -> ADB_STD
method 칸이 담보별 산출방식에서 가져온 값, risk / is_diagnosis 는
엔진이 산출방식에서 derive 한 값입니다.
인접 레시피#
보장 청구 메커니즘 — 각 CalculationMethod 이 엔진 안에서 어떤 알고리즘으로 처리되는지 (이 챕터는 담보별 산출방식 선택, 메커니즘 챕터는 실행 알고리즘).
검증 패턴 — gmm.trace — 담보별 산출방식 변경이 어느 계산 단계에 어떻게 들어가는지 추적.
정기보험 — DEATH 만 사용하는 가장 단순한 사례.
사망 + 진단 일시금 (작성 예정) — DIAGNOSIS 추가, depleting pool mechanic.