From 047b60fbddb898e119bc2a8b8a6e6621dc936d5a Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Fri, 22 Apr 2016 00:33:14 +0200 Subject: [PATCH] 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 --- R/InsuranceContract.R | 4 ++-- R/InsuranceTarif.R | 30 ++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R index 0a113c2..b2717b9 100644 --- a/R/InsuranceContract.R +++ b/R/InsuranceContract.R @@ -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() { diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R index e6bbbe9..a3f5b89 100644 --- a/R/InsuranceTarif.R +++ b/R/InsuranceTarif.R @@ -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 -- GitLab