W tym zadaniu zbudujesz prosty model aktuarialny służący do wyznaczenia bieżącej wartości aktuarialnej renty terminowej.
Renta terminowa to umowa, w której ubezpieczyciel zobowiązuje się wypłacać cykliczne świadczenia przez określony czas – pod warunkiem, że ubezpieczony żyje.
W modelu zakładamy:
brak kosztów, prowizji i reasekuracji (czyli liczymy wartość netto),
stałą stopę procentową (oprocentowanie techniczne),
stałe miesięczne prawdopodobieństwo zgonu (dla uproszczenia modelu),
miesięczne wypłaty świadczenia.
Twoim pierwszym krokiem jest utworzenie nowego modelu.
W tym celu:
Otwórz powłokę Python.
Skorzystaj z poniższej komendy, aby utworzyć model o nazwie zadanie_2
:
from cashflower import create_model
create_model("zadanie_2")
W tej części przygotujesz dane wejściowe: dane ubezpieczeniowe (tzw. model point set) oraz założenie dotyczące stopy procentowej.
W pliku input.py
przygotuj dane dotyczące ubezpieczonych. Skorzystaj z klasy ModelPointSet
i przygotuj dane w formie tabeli (DataFrame
). Nazwij swój model point set policy
.
Dodaj dane dla dwóch osób:
osoba 1: świadczenie 2 000 zł, miesięczne prawdopodobieństwo zgonu 0.004, pozostała długość renty 120 miesięcy,
osoba 2: świadczenie 3 000 zł, miesięczne prawdopodobieństwo zgonu 0.005, pozostała długość renty 48 miesięcy.
Uzupełnij kod:
x# input.py
from cashflower import ModelPointSet
import pandas as pd
policy = ModelPointSet(data=pd.DataFrame({
"id": [1, 2],
"benefit": [_____, _____],
"mortality_rate": [_____, _____],
"remaining_term": [_____, _____],
}))
Zadanie: Uzupełnij brakujące wartości zgodnie z danymi ubezpieczonych.
Załóż, że miesięczna stopa procentowa wynosi 0.3%. Zapisz ją jako zmienną skalarną interest_rate
. Umieść ją w tym samym pliku input.py
.
xxxxxxxxxx
# input.py
interest_rate = _____
Zadanie: Uzupełnij wartość stopy procentowej jako ułamek dziesiętny.
W tej części utworzysz zmienne potrzebne do obliczenia bieżącej wartości aktuarialnej renty.
Na początek zaimportuj dane wejściowe z pliku input.py
. Otwórz plik model.py
.
Znajdziesz tam przykładową zmienną, możesz ją zakomentować lub usunąć, aby mieć czysty plik.
Zaimportuj dane:
policy
– dane polisowe,
interest_rate
– stopa procentowa.
Uzupełnij poniższy kod:
xxxxxxxxxx
# model.py
from input import _____, _____
Zadanie:
Wstaw odpowiednie nazwy zmiennych, które przygotowałeś/aś w input.py
.
t
miesięcyUtwórz zmienną survival_rate(t)
, która będzie wyznaczać prawdopodobieństwo przeżycia t
miesięcy od początku trwania renty.
Skorzystaj ze wzoru rekurencyjnego:
Załóż, że:
dla t=0
przeżywalność wynosi 1,
prawdopodobieństwo zgonu miesięczne jest stałe i równe policy.get("mortality_rate")
.
Uzupełnij funkcję poniżej:
xxxxxxxxxx
# model.py
()
def survival_rate(t):
if t == 0:
return 1
else:
q = policy.get("_____")
return survival_rate(t - 1) * (1 - _____)
Zadanie:
Uzupełnij nazwę atrybutu zawierającego miesięczne prawdopodobieństwo zgonu.
Zastanów się, jak wyrazić prawdopodobieństwo przeżycia t
miesięcy.
Zdefiniuj zmiennąexpected_benefit(t)
– oczekiwaną wartość świadczenia wypłacanego w miesiącu t
.
Skorzystaj ze wzoru:
Pamiętaj, że:
dla t = 0
oraz po zakończeniu okresu renty świadczenie wynosi 0,
policy.get("benefit")
,
długość trwania renty to policy.get("remaining_term")
.
Uzupełnij poniższy kod:
xxxxxxxxxx
# model.py
()
def expected_benefit(t):
if t == 0 or t > policy.get("_____"):
return 0
else:
B = policy.get("_____")
return B * _____
Zadanie:
Uzupełnij nazwę atrybutu remaining_term
i benefit
,
Wstaw odpowiednią zmienną dla przeżywalności t
okresów.
Oblicz bieżącą wartość aktuarialną renty, czyli sumę zdyskontowanych oczekiwanych świadczeń.
Zastosuj podejście rekurencyjne:
gdzie:
interest_rate
),
dla maksymalnego t
wartość równa się expected_benefit(t)
.
Uzupełnij kod poniżej:
xxxxxxxxxx
# model.py
from settings import settings
()
def actuarial_present_value(t):
if t == settings["_____"]:
return _____
else:
v = 1 / (1 + _____)
return _____ + v * _____
Zadanie:
Uzupełnij nazwę parametru T_MAX_CALCULATION
z pliku settings.py
,
Wstaw odpowiednie zmienne: expected_benefit
, interest_rate
, actuarial_present_value
.
Aby uzyskać wyniki osobno dla każdego ubezpieczonego, w pliku settings.py
ustaw:
xxxxxxxxxx
# setting.py
settings = {
"GROUP_BY": "id",
# ...
}