Skip to content
Snippets Groups Projects
Commit 047b60fb authored by Reinhold Kainhofer's avatar Reinhold Kainhofer
Browse files

Add the cost present values (absolute value, i.e. multiplied by the premiums...

Add the cost present values (absolute value, i.e. multiplied by the premiums and premium sum where applicable) to the present values vector for later use.

This also fixes the net reserves calculation
parent 85ce4eec
No related branches found
No related tags found
No related merge requests found
......@@ -340,7 +340,7 @@ InsuranceContract = R6Class(
# Add total benefits present value to the PV array. This can only be done after premium calculation, because e.g. premium refund depends on gross premium!
calculatePresentValuesAllBenefits = function() {
pvAllBenefits = self$tarif$presentValueBenefits(presentValues = self$presentValues, premiums = self$premiums, sumInsured = self$sumInsured );
pvAllBenefits = self$tarif$presentValueBenefits(presentValues = self$presentValues, presentValuesCosts = self$presentValuesCosts, premiums = self$premiums, sumInsured = self$sumInsured, premiumSum = self$premiumSum );
self$presentValues = cbind(self$presentValues, pvAllBenefits)
self$presentValues
},
......@@ -354,7 +354,7 @@ InsuranceContract = R6Class(
},
calculateReserves = function() {
self$reserves = self$tarif$reserveCalculation(premiums=self$premiums, pvBenefits=self$presentValues, pvCosts=self$presentValuesCosts, sumInsured=self$sumInsured, loadings = self$loadings);
self$reserves = self$tarif$reserveCalculation(premiums=self$premiums, pvBenefits=self$presentValues, pvCosts=self$presentValuesCosts, sumInsured=self$sumInsured, premiumSum = self$premiumSum, loadings = self$loadings);
},
premiumAnalysis = function() {
......
......@@ -248,12 +248,24 @@ InsuranceTarif = R6Class(
dimnames(res) = list(nm[[1]], colnames)
res
},
presentValueBenefits = function(presentValues, premiums, sumInsured=1) {
presentValueBenefits = function(presentValues, presentValuesCosts, premiums, sumInsured=1, premiumSum=0) {
refundAddon = self$premiumRefundLoading;
# TODO: Here we don't use the securityLoading parameter => Shall it be used or are these values to be understood without additional security loading?
benefits.unit = presentValues[,"survival"] + presentValues[,"death_SumInsured"];
benefits = benefits.unit * sumInsured;
allBenefits.unit = presentValues[,"survival"] + presentValues[,"death_SumInsured"] + presentValues[,"death_GrossPremium"] * premiums[["unit.gross"]];
allBenefits.unit = presentValues[,"survival"] + presentValues[,"death_SumInsured"] + presentValues[,"death_GrossPremium"] * premiums[["unit.gross"]] * (1+refundAddon);
allBenefits = allBenefits.unit * sumInsured;
cbind(benefits.unit=benefits.unit, benefits=benefits, allBenefits.unit=allBenefits.unit, allBenefits=allBenefits)
benefitsCosts = presentValuesCosts[,,"SumInsured"]*sumInsured +
presentValuesCosts[,,"SumPremiums"] * premiumSum * premiums[["gross"]] +
presentValuesCosts[,,"GrossPremium"] * premiums[["gross"]];
cbind(
benefits.unit=benefits.unit,
benefits=benefits,
allBenefits.unit=allBenefits.unit,
allBenefits=allBenefits,
benefitsCosts)
},
getPremiumCoefficients = function(type="gross", coeffBenefits, coeffCosts, ...,
......@@ -365,15 +377,21 @@ InsuranceTarif = R6Class(
list("premiums"=premiums, "coefficients"=coefficients)
},
reserveCalculation = function (premiums, pvBenefits, pvCosts, sumInsured=1, ...) {
reserveCalculation = function (premiums, pvBenefits, pvCosts, sumInsured=1, premiumSum=0, ...) {
resNet = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"];
resZ = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["Zillmer"]] * pvBenefits[,"premiums"];
BWLminBWP = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"];
BWZcorr = pvBenefits["0","Zillmer"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"];
# resZ = pvBenefits[,"allBenefits"]*(1+self$loadings$security) - premiums[["net"]] * pvBenefits[,"premiums"] - pvCosts["0", "Zillmer", "SumInsured"]*premiumSum/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"];
resZ=BWLminBWP - BWZcorr;
#premiums[["Zillmer"]] * pvBenefits[,"premiums"];
res.gamma = (pvCosts[,"gamma", "SumInsured"] - pvCosts["0", "gamma", "SumInsured"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"])*sumInsured;
res.gamma.alt = pvBenefits[,"gamma"] - pvBenefits["0", "gamma"]/pvBenefits["0", "premiums"]*pvBenefits[,"premiums"]
# res.premiumfree =
# res.gamma.premiumfree =
res = cbind("net"=resNet, "Zillmer"=resZ, "gamma"=res.gamma#, "Reserve.premiumfree"=res.premiumfree, "Reserve.gamma.premiumfree"=res.gamma.premiumfree);
res = cbind("net"=resNet, "BWLminBWP"=BWLminBWP, "BWZcorr"= BWZcorr, "Zillmer"=resZ, "gamma"=res.gamma, "gamma.alt"=res.gamma.alt#, "Reserve.premiumfree"=res.premiumfree, "Reserve.gamma.premiumfree"=res.gamma.premiumfree);
);
rownames(res) <- rownames(pvBenefits);
res
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment