From e5c02eed54c565c07310a36ae54db432ad3df0a3 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Tue, 10 Mar 2020 16:35:51 +0100 Subject: [PATCH] properly finish dynamics (and insurance blocks starting at a later time) -) Properly handly blockStart time (only used by parent). The child block will always start from 0, which is then shifted by the parent block's consolidateValues function. This removes a lot of complexity (previously, I though it would make sense to implement in each child block that it starts at a later time and fill all data.frames with 0 until the block start...) -) Properly implement premium waiver with the new calculateContract function => Simplifies code a lot --- R/InsuranceContract.R | 182 +++++++++++------------ R/InsuranceParameters.R | 2 +- R/InsuranceTarif.R | 223 +++++++++++++---------------- inst/Beispiele/Example_Endowment.R | 31 ++-- 4 files changed, 217 insertions(+), 221 deletions(-) diff --git a/R/InsuranceContract.R b/R/InsuranceContract.R index 67f7ee6..7ca48ea 100644 --- a/R/InsuranceContract.R +++ b/R/InsuranceContract.R @@ -70,7 +70,7 @@ InsuranceContract = R6Class( } private$consolidateContractData(tarif = tarif, ...); - self$calculateContract(calculate = calculate, start = self$Parameters$ContractData$blockStart); + self$calculateContract(calculate = calculate); invisible(self) }, @@ -93,13 +93,14 @@ InsuranceContract = R6Class( invisible(self) }, - addBlock = function(blockID = NULL, block = NULL, t = 0, comment = comment, ...) { + addBlock = function(id = NULL, block = NULL, t = block$Values$int$blockStart, comment = comment, ...) { if (missing(block) || is.null(block) || !is(block, "InsuranceContract")) { # Create a block with the same tariff and parameters as the main contract, but allow overriding params with the ... arguments - block = InsuranceContract$new(...) + block = InsuranceContract$new(id = id, ...) } + # declare as child of 'self', store the time offset to the parent contract block$parent = self - block$Values$int$startsAt = t + block$Parameters$ContractData$blockStart = t if (length(self$blocks) == 0) { main = self$clone() @@ -108,12 +109,12 @@ InsuranceContract = R6Class( self$Parameters$ContractData$id = "Gesamt" } - if (missing(blockID) || is.null(blockID)) { - blockID = paste0("block", length(self$blocks) + 1) + if (missing(id) || is.null(id)) { + id = paste0("block", length(self$blocks) + 1) } - self$blocks[[blockID]] = block + self$blocks[[id]] = block # recalculate the whole contract by consolidating values from each block - self$consolidateBlocks(start = t) + self$consolidateBlocks(valuesFrom = t) self$addHistorySnapshot(time = t, comment = comment, type = "Dynamics", params = self$Parameters, values = self$Values); @@ -150,49 +151,50 @@ InsuranceContract = R6Class( } params$t = t - params$blockID = id params$id = id params$comment = sprintf("Dynamic increase at time %d to sum %d", t, NewSumInsured) do.call(self$addBlock, params) }, - calculateContract = function(calculate = "all", start = 0, preservePastPV = TRUE, recalculatePremiums = TRUE, recalculatePremiumSum = TRUE, history_comment = NULL, history_type = "Contract") { + calculateContract = function(calculate = "all", valuesFrom = 0, premiumCalculationTime = 0, preservePastPV = TRUE, recalculatePremiums = TRUE, recalculatePremiumSum = TRUE, history_comment = NULL, history_type = "Contract") { if (!is.null(self$blocks)) { - .args = as.list(match.call()[-1]) for (b in self$blocks) { + .args = as.list(match.call()[-1]) + # correctly shift the valuesFrom by each block's blockStart parameter + .args$valuesFrom = max(0, .args$valuesFrom - b$Parameters$ContractData$blockStart) do.call(b$calculateContract, .args) } } - self$Values$int = private$determineInternalValues(start = start) + self$Values$int = private$determineInternalValues() self$Values$transitionProbabilities = mergeValues( starting = self$Values$transitionProbabilities, - ending = private$determineTransitionProbabilities(start = start), - t = start) + ending = private$determineTransitionProbabilities(), + t = valuesFrom) if (calculate == "probabilities") return(invisible(self)); self$Values$cashFlowsBasic = mergeValues( starting = self$Values$cashFlowsBasic, - ending = private$determineCashFlowsBasic(start = start), - t = start); + ending = private$determineCashFlowsBasic(), + t = valuesFrom); self$Values$cashFlows = mergeValues( starting = self$Values$cashFlows, - ending = private$determineCashFlows(start = start), - t = start); + ending = private$determineCashFlows(), + t = valuesFrom); if (recalculatePremiumSum) { # Premium waiver: Premium sum is not affected by premium waivers, i.e. everything depending on the premium sum uses the original premium sum! - self$Values$unitPremiumSum = private$determinePremiumSum(start = start); + self$Values$unitPremiumSum = private$determinePremiumSum(); } self$Values$cashFlowsCosts = mergeValues3D( starting = self$Values$cashFlowsCosts, - ending = private$determineCashFlowsCosts(start = start), - t = start); + ending = private$determineCashFlowsCosts(), + t = valuesFrom); if (calculate == "cashflows") return(invisible(self)); # Shall we re-calculate PV or preserve the old ones??? - pv = private$calculatePresentValues(start = start) - pvCost = private$calculatePresentValuesCosts(start = start) + pv = private$calculatePresentValues() + pvCost = private$calculatePresentValuesCosts() oldPV = self$Values$presentValues if (preservePastPV) { # Preserve past present values, i.e. the PV represents the PV @@ -206,8 +208,8 @@ InsuranceContract = R6Class( if (!is.null(self$Values$presentValues)) { self$Values$presentValues = self$Values$presentValues[,1:NCOL(pv)] } - self$Values$presentValues = mergeValues(starting = self$Values$presentValues, ending = pv, t = start) - self$Values$presentValuesCosts = mergeValues3D(starting = self$Values$presentValuesCosts, ending = pvCost, t = start) + self$Values$presentValues = mergeValues(starting = self$Values$presentValues, ending = pv, t = valuesFrom) + self$Values$presentValuesCosts = mergeValues3D(starting = self$Values$presentValuesCosts, ending = pvCost, t = valuesFrom) } else { # Recalculate present value for times before start, i.e. make all PV consistent with the current cash flows self$Values$presentValues = pv @@ -217,42 +219,44 @@ InsuranceContract = R6Class( # the premiumCalculation function returns the premiums AND the cofficients, # so we have to extract the coefficients and store them in a separate variable - res = private$calculatePremiums(start = start); - self$Values$premiumCoefficients = res[["coefficients"]]; - # TODO: Store premiums in a data.frame??? - self$Values$premiums = res[["premiums"]] - self$Values$int$premiumCalculationTime = start + if (recalculatePremiums) { + res = private$calculatePremiums(premiumCalculationTime = premiumCalculationTime); + self$Values$premiumCoefficients = res[["coefficients"]]; + # TODO: Store premiums in a data.frame, including the time they are calculated??? + self$Values$premiums = res[["premiums"]] + self$Values$int$premiumCalculationTime = premiumCalculationTime + } if (calculate == "premiums") return(invisible(self)); # Update the cash flows and present values with the values of the premium - pvAllBenefits = private$calculatePresentValuesBenefits(start = start) + pvAllBenefits = private$calculatePresentValuesBenefits() if (preservePastPV) { - self$Values$presentValues = mergeValues(starting = oldPV, ending = cbind(pv, pvAllBenefits), t = start) + self$Values$presentValues = mergeValues(starting = oldPV, ending = cbind(pv, pvAllBenefits), t = valuesFrom) } else { self$Values$presentValues = cbind(pv, pvAllBenefits) } - self$Values$absCashFlows = mergeValues(starting = self$Values$absCashFlows, ending = private$calculateAbsCashFlows(start = start), t = start); - self$Values$absPresentValues = mergeValues(starting = self$Values$absPresentValues, ending = private$calculateAbsPresentValues(start = start), t = start); + self$Values$absCashFlows = mergeValues(starting = self$Values$absCashFlows, ending = private$calculateAbsCashFlows(), t = valuesFrom); + self$Values$absPresentValues = mergeValues(starting = self$Values$absPresentValues, ending = private$calculateAbsPresentValues(), t = valuesFrom); if (calculate == "absvalues") return(invisible(self)); - self$Values$reserves = mergeValues(starting = self$Values$reserves, ending = private$calculateReserves(start = start), t = start); - self$Values$reservesBalanceSheet = mergeValues(starting = self$Values$reservesBalanceSheet,ending = private$calculateReservesBalanceSheet(start = start), t = start); + self$Values$reserves = mergeValues(starting = self$Values$reserves, ending = private$calculateReserves(), t = valuesFrom); + self$Values$reservesBalanceSheet = mergeValues(starting = self$Values$reservesBalanceSheet,ending = private$calculateReservesBalanceSheet(), t = valuesFrom); if (calculate == "reserves") return(invisible(self)); - self$Values$premiumComposition = mergeValues(starting = self$Values$premiumComposition, ending = private$premiumAnalysis(start = start), t = start); - self$Values$premiumCompositionSums = mergeValues(starting = self$Values$premiumCompositionSums, ending = private$premiumCompositionSums(start = start), t = start); - self$Values$premiumCompositionPV = mergeValues(starting = self$Values$premiumCompositionPV, ending = private$premiumCompositionPV(start = start), t = start); - self$Values$basicData = mergeValues(starting = self$Values$basicData, ending = private$getBasicDataTimeseries(start = start), t = start); + self$Values$premiumComposition = mergeValues(starting = self$Values$premiumComposition, ending = private$premiumAnalysis(), t = valuesFrom); + self$Values$premiumCompositionSums = mergeValues(starting = self$Values$premiumCompositionSums, ending = private$premiumCompositionSums(), t = valuesFrom); + self$Values$premiumCompositionPV = mergeValues(starting = self$Values$premiumCompositionPV, ending = private$premiumCompositionPV(), t = valuesFrom); + self$Values$basicData = mergeValues(starting = self$Values$basicData, ending = private$getBasicDataTimeseries(), t = valuesFrom); if (calculate == "premiumcomposition") return(invisible(self)); - private$profitParticipation(start = start); # TODO-start + private$profitParticipation(); if (calculate == "profitparticipation") return(invisible(self)); self$addHistorySnapshot( - time = start, + time = valuesFrom, comment = ifelse(is.null(history_comment), - ifelse(start == 0, "Initial contract values", paste("Contract recalculation at time ", start)), - history_comment),, + ifelse(valuesFrom == 0, "Initial contract values", paste("Contract recalculation at time", premiumCalculationTime)), + history_comment), type = history_type, params = self$Parameters, values = self$Values @@ -261,11 +265,12 @@ InsuranceContract = R6Class( invisible(self) }, - consolidateBlocks = function(start = 0) { + consolidateBlocks = function(valuesFrom = 0) { # First, Re-calculate all children that have children on their own for (b in self$blocks) { if (length(b$blocks) > 0) { - b$consolidateBlocks(start = start) + # correctly shift the valuesFrom by each block's blockStart parameter + b$consolidateBlocks(valuesFrom = max(0, valuesFrom - b$Parameters$ContractData$blockStart)) } } @@ -297,12 +302,12 @@ InsuranceContract = R6Class( consolidateField = function(field) { vals = NULL if (length(self$blocks) == 0) { - vals = padArray(self$Values[[field]], pad = self$Values$int$startsAt) + vals = self$Values[[field]] } for (b in self$blocks) { - vals = sumPaddedArrays(arr1 = vals, arr2 = b$Values[[field]], pad2 = b$Values$int$startsAt) + vals = sumPaddedArrays(arr1 = vals, arr2 = b$Values[[field]], pad2 = b$Parameters$ContractData$blockStart) } - mergeValues(starting = self$Values[[field]], ending = vals, t = start); + mergeValues(starting = self$Values[[field]], ending = vals, t = valuesFrom); } @@ -337,7 +342,7 @@ InsuranceContract = R6Class( # Premium Waiver: Stop all premium payments at time t # the SumInsured is determined from the available - premiumWaiverNew = function(t) { + premiumWaiver = function(t) { newSumInsured = self$Values$reserves[[toString(t), "PremiumFreeSumInsured"]]; self$Parameters$ContractState$premiumWaiver = TRUE; self$Parameters$ContractState$surrenderPenalty = FALSE; # Surrender penalty has already been applied, don't apply a second time @@ -346,7 +351,8 @@ InsuranceContract = R6Class( self$Parameters$ContractData$sumInsured = newSumInsured; self$calculateContract( - start = t, + valuesFrom = t, + premiumCalculationTime = t, preservePastPV = TRUE, recalculatePremiums = TRUE, recalculatePremiumSum = FALSE, history_comment = sprintf("Premium waiver at time %d", t), history_type = "PremiumWaiver") @@ -357,7 +363,7 @@ InsuranceContract = R6Class( # Premium Waiver: Stop all premium payments at time t # the SumInsured is determined from the available - premiumWaiver = function(t) { + premiumWaiverOLD = function(t) { newSumInsured = self$Values$reserves[[toString(t), "PremiumFreeSumInsured"]]; self$Parameters$ContractState$premiumWaiver = TRUE; self$Parameters$ContractState$surrenderPenalty = FALSE; # Surrender penalty has already been applied, don't apply a second time @@ -506,57 +512,57 @@ InsuranceContract = R6Class( self$tarif$getCostValues(costs, params = self$Parameters) }, - determineInternalValues = function(start = 0) { - self$tarif$getInternalValues(params = self$Parameters, start = start); + determineInternalValues = function(...) { + self$tarif$getInternalValues(params = self$Parameters, ...); }, - determineTransitionProbabilities = function(start = 0) { - self$tarif$getTransitionProbabilities(params = self$Parameters, values = self$Values, start = start); + determineTransitionProbabilities = function(...) { + self$tarif$getTransitionProbabilities(params = self$Parameters, values = self$Values, ...); }, - determineCashFlowsBasic = function(start = 0) { - self$tarif$getBasicCashFlows(params = self$Parameters, values = self$Values, start = start); + determineCashFlowsBasic = function(...) { + self$tarif$getBasicCashFlows(params = self$Parameters, values = self$Values, ...); }, - determineCashFlows = function(start = 0) { - self$tarif$getCashFlows(params = self$Parameters, values = self$Values, start = start); + determineCashFlows = function(...) { + self$tarif$getCashFlows(params = self$Parameters, values = self$Values, ...); }, - determinePremiumSum = function(start = 0) { + determinePremiumSum = function(...) { sum(self$Values$cashFlows$premiums_advance + self$Values$cashFlows$premiums_arrears); }, - determineCashFlowsCosts = function(start = 0) { - self$tarif$getCashFlowsCosts(params = self$Parameters, values = self$Values, start = start); + determineCashFlowsCosts = function(...) { + self$tarif$getCashFlowsCosts(params = self$Parameters, values = self$Values, ...); }, - calculatePresentValues = function(start = 0) { - self$tarif$presentValueCashFlows(params = self$Parameters, values = self$Values, start = start); + calculatePresentValues = function(...) { + self$tarif$presentValueCashFlows(params = self$Parameters, values = self$Values, ...); }, - calculatePresentValuesCosts = function(start = 0) { - self$tarif$presentValueCashFlowsCosts(params = self$Parameters, values = self$Values, start = start); + calculatePresentValuesCosts = function(...) { + self$tarif$presentValueCashFlowsCosts(params = self$Parameters, values = self$Values, ...); }, - calculatePremiums = function(start = 0) { - self$tarif$premiumCalculation(params = self$Parameters, values = self$Values, start = start); + calculatePremiums = function(...) { + self$tarif$premiumCalculation(params = self$Parameters, values = self$Values, ...); }, - calculatePresentValuesBenefits = function(start = 0) { - self$tarif$presentValueBenefits(params = self$Parameters, values = self$Values, start = start); + calculatePresentValuesBenefits = function(...) { + self$tarif$presentValueBenefits(params = self$Parameters, values = self$Values, ...); }, - calculateAbsCashFlows = function(start = 0) { - self$tarif$getAbsCashFlows(params = self$Parameters, values = self$Values, start = start); + calculateAbsCashFlows = function(...) { + self$tarif$getAbsCashFlows(params = self$Parameters, values = self$Values, ...); }, - calculateAbsPresentValues = function(start = 0) { - self$tarif$getAbsPresentValues(params = self$Parameters, values = self$Values, start = start); + calculateAbsPresentValues = function(...) { + self$tarif$getAbsPresentValues(params = self$Parameters, values = self$Values, ...); }, - calculateReserves = function(start = 0) { - self$tarif$reserveCalculation(params = self$Parameters, values = self$Values, start = start); + calculateReserves = function(...) { + self$tarif$reserveCalculation(params = self$Parameters, values = self$Values, ...); }, - calculateReservesBalanceSheet = function(start = 0) { - self$tarif$reserveCalculationBalanceSheet(params = self$Parameters, values = self$Values, start = start); + calculateReservesBalanceSheet = function(...) { + self$tarif$reserveCalculationBalanceSheet(params = self$Parameters, values = self$Values, ...); }, - premiumAnalysis = function(start = 0) { - self$tarif$premiumDecomposition(params = self$Parameters, values = self$Values, start = start); + premiumAnalysis = function(...) { + self$tarif$premiumDecomposition(params = self$Parameters, values = self$Values, ...); }, - premiumCompositionSums = function(start = 0) { - self$tarif$calculateFutureSums(self$Values$premiumComposition, start = start); + premiumCompositionSums = function(...) { + self$tarif$calculateFutureSums(self$Values$premiumComposition, ...); }, - premiumCompositionPV = function(start = 0) { - self$tarif$calculatePresentValues(self$Values$premiumComposition, params = self$Parameters, start = start); + premiumCompositionPV = function(...) { + self$tarif$calculatePresentValues(self$Values$premiumComposition, params = self$Parameters, ...); }, profitParticipation = function(...) { @@ -575,11 +581,11 @@ InsuranceContract = R6Class( }, - getBasicDataTimeseries = function(start = 0) { - self$tarif$getBasicDataTimeseries(params = self$Parameters, values = self$Values, start = start); + getBasicDataTimeseries = function(...) { + self$tarif$getBasicDataTimeseries(params = self$Parameters, values = self$Values, ...); }, dummy.private = NULL ) ) -# InsuranceContract$debug("premiumWaiver") + diff --git a/R/InsuranceParameters.R b/R/InsuranceParameters.R index 10cf6c0..9e93bbf 100644 --- a/R/InsuranceParameters.R +++ b/R/InsuranceParameters.R @@ -96,7 +96,7 @@ InsuranceContract.ParameterDefaults = list( deferralPeriod = 0, # Aufschubzeit bei Leibrenten guaranteedPeriod = 0, # Garantiezeit bei Leibrenten contractClosing = NULL, # Contract closing date (day/month is relevant for balance sheet reserves) - blockStart = 0, # When the current tariff block starts (main block starts a 0, dynamic increases start leter!) + blockStart = 0, # When the current tariff block starts (main block starts a 0, dynamic increases start later!), only used by the parent block (i.e. t=0 of child is aligned with t=blockStart of parent) premiumPayments = "in advance", # Prämienzahlungsweise (vor-/nachschüssig) benefitPayments = "in advance", # Leistungszahlungsweise (vor-/nachschüssig) diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R index 844319c..ccd5fd7 100644 --- a/R/InsuranceTarif.R +++ b/R/InsuranceTarif.R @@ -69,14 +69,12 @@ InsuranceTarif = R6Class( }, # Get some internal parameters cached (length of data.frames, policy periods cut at max.age, etc.) - getInternalValues = function(params, start = 0) { - p = c() + getInternalValues = function(params, ...) { age = params$ContractData$technicalAge maxAge = getOmega(params$ActuarialBases$mortalityTable) policyPeriod = params$ContractData$policyPeriod list( l = min(maxAge - age, policyPeriod) + 1, - startsAt = start, policyTerm = min(maxAge - age, policyPeriod), premiumTerm = min(policyPeriod, params$ContractData$premiumPeriod) ) @@ -92,10 +90,9 @@ InsuranceTarif = R6Class( ages }, - getTransitionProbabilities = function(params, values, start = 0) { + getTransitionProbabilities = function(params, values) { age = params$ContractData$technicalAge; ages = self$getAges(params); - # TODO: Use the start parameter to include possible selection tables (i.e. contract/block starts at time 'start' => qx depend on when contract started, e.g. immediate annuities in DAV 2004-R) q = deathProbabilities(params$ActuarialBases$mortalityTable, YOB = params$ContractData$YOB, ageDifferences = params$ContractData$ageDifferences); if (age > 0) { q = q[-age:-1]; @@ -123,19 +120,19 @@ InsuranceTarif = R6Class( # - for single premiums it will be c(1, 0, 0, ...), # - for increasing premiums it will be (1+increase)^(0:(premiumPeriod-1)) # and 0 after the premium period - getPremiumCF = function(len, params, values, start = 0) { + getPremiumCF = function(len, params, values) { premPeriod = min(params$ContractData$premiumPeriod, params$ContractData$policyPeriod, len); if (is.null(params$ContractData$premiumIncrease)) { - pad0(rep(1, premPeriod - 1), len, start = start); + pad0(rep(1, premPeriod - 1), len) } else { inc = valueOrFunction(params$ContractData$premiumIncrease, premiumPeriod = premPeriod, params = params, values = values) if (is.vector(inc) && length(inc) > 1) { # If premiumIncrease is (or returns) a vector, treat it as # relative premium amounts, ie. c(1, 1.1, 1.2) means +10% of # the initial premium for the second and third year - pad0(inc, len, start = start) + pad0(inc, len) } else { - pad0(inc ^ (0:(premPeriod - start - 1)), len, start = start) + pad0(inc ^ (0:(premPeriod - 1)), len) } } }, @@ -144,20 +141,20 @@ InsuranceTarif = R6Class( # - For constant annuity it will be rep(1, annuityPeriod), # - for increasing annuities it will be (1+increase)^(0:(premiumPeriod-1)) # and 0 after the premium period - getAnnuityCF = function(len, params, values, start = 0) { + getAnnuityCF = function(len, params, values) { annuityPeriod = min(params$ContractData$policyPeriod - params$ContractData$deferralPeriod, len); if (is.null(params$ContractData$annuityIncrease)) { - pad0(rep(1, annuityPeriod), len, start = start); + pad0(rep(1, annuityPeriod), len); } else { inc = valueOrFunction(params$ContractData$annuityIncrease, annuityPeriod = annuityPeriod, params = params, values = values) if (is.vector(inc) && length(inc) > 1) { # If annuityIncrease is (or returns) a vector, treat it as # relative annuity amounts, ie. c(1, 1.1, 1.2) means +10% of # the initial annuity for the second and third year - pad0(inc, len, start = start) + pad0(inc, len) } else { # a numeric value means constant yearly increases (multiplicative) - pad0(inc ^ (0:annuityPeriod), len, start = start) + pad0(inc ^ (0:annuityPeriod), len) } } }, @@ -165,25 +162,25 @@ InsuranceTarif = R6Class( # Get the unit death cash flow for the whole protection period (after potential deferral period!) # - For constant death benefit it will be rep(1, policyPeriod), # - for linearly decreasing sum insured it will be (policyPeriod:0)/policyPeriod - getDeathCF = function(len, params, values, start = 0) { + getDeathCF = function(len, params, values) { period = params$ContractData$policyPeriod - params$ContractData$deferralPeriod; if (is.null(params$ContractData$deathBenefit)) { - pad0(rep(1, period), len, start = start) + pad0(rep(1, period), len) } else { benefit = valueOrFunction(params$ContractData$deathBenefit, len = len, params = params, values = values) if (is.vector(benefit) && length(benefit) > 1) { # If deathBenefit is (or returns) a vector, treat it as # relative annuity amounts, ie. c(1, 1.1, 1.2) means +10% of # the initial annuity for the second and third year - pad0(benefit, len, start = start) + pad0(benefit, len) } else { # constant death benefit - pad0(rep(benefit, period), len, start = start) + pad0(rep(benefit, period), len) } } }, - getBasicCashFlows = function(params, values, start = 0) { + getBasicCashFlows = function(params, values) { deferralPeriod = params$ContractData$deferralPeriod; guaranteedPeriod = params$ContractData$guaranteedPeriod; @@ -194,12 +191,11 @@ InsuranceTarif = R6Class( survival = zeroes, death = zeroes, disease = zeroes, - sumInsured = c(rep(0, start), rep(1, values$int$l - start)) + sumInsured = rep(1, values$int$l) ); if (self$tariffType == "annuity") { annuityPeriod = values$int$policyTerm - deferralPeriod; - # getAnnuityCF correctly handles start inside and after deferral period! - annuityCF = self$getAnnuityCF(len = annuityPeriod, params = params, values = values, start = max(0, start - deferralPeriod)) + annuityCF = self$getAnnuityCF(len = annuityPeriod, params = params, values = values) # guaranteed payments exist only with annuities (first n years of the payment) cf$guaranteed = pad0( c( @@ -211,60 +207,47 @@ InsuranceTarif = R6Class( if (guaranteedPeriod > 0) tail(annuityCF, n = -guaranteedPeriod) else annuityCF, 0), values$int$l) - if (start <= deferralPeriod) { - # start current contract block within deferral period - # increases/decreases of annuities happen only after deferral! - cf$sumInsured = c(rep(0, start), rep(1, deferralPeriod - start), annuityCF, 0) - } else { - # start current contract block after deferral period - cf$sumInsured = c(rep(0, deferralPeriod), annuityCF, 0) - } + # start current contract block after deferral period + cf$sumInsured = c(rep(0, deferralPeriod), annuityCF, 0) } else if (self$tariffType == "terme-fix") { # Begin of bock does not have any influence - cf$guaranteed = c(rep(0, values$int$policyTerm), 1); + cf$guaranteed = c(rep(0, values$int$policyTerm), 1) } else if (self$tariffType == "dread-disease") { - # potential Payments start after deferral period and after start of this block + # potential Payments start after deferral period cf$disease = c( - rep(0, max(deferralPeriod, start)), - rep(1, values$int$l - 1 - max(deferralPeriod, start)), - 0); + rep(0, deferralPeriod), + rep(1, values$int$l - 1 - deferralPeriod), + 0) } else { # For endowments, use the death factor here in the basic death CF # to fix the relation of death to survival benefit - deathCF = self$getDeathCF(values$int$l - 1 - deferralPeriod, params = params, values = values, start = max(0, start - deferralPeriod)) + deathCF = self$getDeathCF(values$int$l - 1 - deferralPeriod, params = params, values = values) if (self$tariffType == "endowment" || self$tariffType == "pureendowment" || self$tariffType == "endowment + dread-disease") { - cf$survival = c(rep(0, values$int$policyTerm), 1); # start of block does not have any influence! + cf$survival = c(rep(0, values$int$policyTerm), 1) } if (self$tariffType == "endowment" || self$tariffType == "wholelife" || self$tariffType == "endowment + dread-disease") { - # start of block already properly handled in deathCF - cf$death = c( - rep(0, deferralPeriod), - deathCF, - 0); - cf$sumInsured = c( - rep(0, deferralPeriod), - deathCF, - 1); + cf$death = c(rep(0, deferralPeriod), deathCF, 0) + cf$sumInsured = c(rep(0, deferralPeriod), deathCF, 1); } if (self$tariffType == "endowment + dread-disease") { cf$disease = c( - rep(0, max(deferralPeriod, start)), - rep(1, values$int$l - 1 - max(deferralPeriod, start)), + rep(0, deferralPeriod), + rep(1, values$int$l - 1 - deferralPeriod), 0); } } cf }, - getCashFlows = function(params, values, start = 0) { + getCashFlows = function(params, values) { age = params$ContractData$technicalAge; if (is.null(values$cashFlowsBasic)) { - values$cashFlowsBasic = self$getBasicCashFlows(params, values, start = start); + values$cashFlowsBasic = self$getBasicCashFlows(params, values); } cflen = values$int$l zeroes = pad0(0, cflen) @@ -286,7 +269,7 @@ InsuranceTarif = R6Class( # Premiums: if (!params$ContractState$premiumWaiver) { - premiums = self$getPremiumCF(len = cflen, params = params, values = values, start = start) + premiums = self$getPremiumCF(len = cflen, params = params, values = values) if (params$ContractData$premiumPayments == "in advance") { cf$premiums_advance = premiums; } else { @@ -320,21 +303,20 @@ InsuranceTarif = R6Class( applyHook(params$Hooks$adjustCashFlows, cf, params, values) }, - getCashFlowsCosts = function(params, values, start = 0) { - # Cost cash flows start at block start time (function argument "start" => one-off alpha costs start are charged at that time!) + getCashFlowsCosts = function(params, values) { dm = dim(params$Costs); dmnames = dimnames(params$Costs); cf = array(0, dim = list(values$int$l, dm[1], dm[2]), dimnames = list(0:(values$int$l - 1), dmnames[[1]], dmnames[[2]])); - cf[start + 1,,] = cf[start + 1,,] + params$Costs[,,"once"] - for (i in (start + 1):values$int$premiumTerm) { + cf[1,,] = cf[1,,] + params$Costs[,,"once"] + for (i in 1:values$int$premiumTerm) { cf[i,,] = cf[i,,] + params$Costs[,,"PremiumPeriod"]; } if (values$int$premiumTerm < values$int$policyTerm) { - for (i in (max(start, values$int$premiumTerm) + 1):values$int$policyTerm) { + for (i in (values$int$premiumTerm + 1):values$int$policyTerm) { cf[i,,] = cf[i,,] + params$Costs[,,"PremiumFree"]; } } - for (i in (start + 1):values$int$policyTerm) { + for (i in 1:values$int$policyTerm) { cf[i,,] = cf[i,,] + params$Costs[,,"PolicyPeriod"]; } @@ -350,7 +332,7 @@ InsuranceTarif = R6Class( applyHook(params$Hooks$adjustCashFlowsCosts, cf, params, values) }, - presentValueCashFlows = function(cashFlows, params, values, start = 0) { + presentValueCashFlows = function(cashFlows, params, values) { qq = self$getTransitionProbabilities(params); qx = pad0(qq$q, values$int$l); @@ -366,62 +348,59 @@ InsuranceTarif = R6Class( m = params$ContractData$premiumFrequency, order = params$ActuarialBases$premiumFrequencyOrder); - # TODO: Calculate all present values only from start time of block onwards! - pvRefund = calculatePVDeath( - px, qx, - values$cashFlows$death_GrossPremium, - v = v, start = start); + pvRefund = calculatePVDeath(px, qx, values$cashFlows$death_GrossPremium, v = v); pvRefundPast = calculatePVDeath( px, qx, values$cashFlows$death_Refund_past, - v = v, start = start) * (values$cashFlows[,"death_GrossPremium"] - values$cashFlows[,"premiums_advance"]); + v = v) * + (values$cashFlows[,"death_GrossPremium"] - values$cashFlows[,"premiums_advance"]); pv = cbind( premiums = calculatePVSurvival( px, qx, values$cashFlows$premiums_advance, values$cashFlows$premiums_arrears, m = params$ContractData$premiumFrequency, mCorrection = premiumFreqCorr, - v = v, start = start), + v = v), guaranteed = calculatePVGuaranteed( values$cashFlows$guaranteed_advance, values$cashFlows$guaranteed_arrears, m = params$ContractData$benefitFrequency, mCorrection = benefitFreqCorr, - v = v, start = start), + v = v), survival = calculatePVSurvival( px, qx, values$cashFlows$survival_advance, values$cashFlows$survival_arrears, m = params$ContractData$benefitFrequency, mCorrection = benefitFreqCorr, - v = v, start = start), + v = v), death_SumInsured = calculatePVDeath( px, qx, values$cashFlows$death_SumInsured, - v = v, start = start), + v = v), disease_SumInsured = calculatePVDisease( px, qx, ix, - values$cashFlows$disease_SumInsured, v = v, start = start), + values$cashFlows$disease_SumInsured, v = v), death_GrossPremium = pvRefund, death_Refund_past = pvRefundPast, death_Refund_future = pvRefund - pvRefundPast, death_PremiumFree = calculatePVDeath( px, qx, - values$cashFlows$death_PremiumFree, v = v, start = start) + values$cashFlows$death_PremiumFree, v = v) ); rownames(pv) <- pad0(rownames(qq), values$int$l); pv }, - presentValueCashFlowsCosts = function(params, values, start = 0) { + presentValueCashFlowsCosts = function(params, values) { len = values$int$l; q = self$getTransitionProbabilities(params); qx = pad0(q$q, len); px = pad0(q$p, len); v = 1/(1 + params$ActuarialBases$i) - pvc = calculatePVCosts(px, qx, values$cashFlowsCosts, v = v, start = start); + pvc = calculatePVCosts(px, qx, values$cashFlowsCosts, v = v); pvc }, # Cost values (CF, present values, etc.) are an Tx5x3 matrix => convert to Tx15 matrix (alpha | Zillmer | beta | gamma) - costValuesAsMatrix = function(costValues, start = 0) { + costValuesAsMatrix = function(costValues) { dm = dim(costValues); nm = dimnames(costValues); colnames = t(outer(nm[[2]], nm[[3]], paste, sep = ".")); @@ -432,7 +411,7 @@ InsuranceTarif = R6Class( res }, - getAbsCashFlows = function(params, values, start = 0) { + getAbsCashFlows = function(params, values) { # TODO: Set up a nice list with coefficients for each type of cashflow, # rather than multiplying each item manually (this also mitigates the risk @@ -468,7 +447,7 @@ InsuranceTarif = R6Class( cbind(values$cashFlows, values$cashFlowsCosts) }, - getAbsPresentValues = function(params, values, start = 0) { + getAbsPresentValues = function(params, values) { pv = values$presentValues; #pv[,"age"] = pv[,"premiums"]; @@ -490,7 +469,7 @@ InsuranceTarif = R6Class( }, - presentValueBenefits = function(params, values, start = 0) { + presentValueBenefits = function(params, values) { # 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 = values$presentValues[,"survival"] + values$presentValues[,"guaranteed"] + @@ -514,10 +493,10 @@ InsuranceTarif = R6Class( # When getPremiumCoefficients is called, the values$premiums array has NOT been filled! Instead, # some of the premium fields (all required for the current calculation) have # been set in the passed "premiums" argument. - getPremiumCoefficients = function(type = "gross", coeffBenefits, coeffCosts, premiums, params, values, start = 0) { + getPremiumCoefficients = function(type = "gross", coeffBenefits, coeffCosts, premiums, params, values, premiumCalculationTime = values$int$premiumCalculationTime) { # Merge a possibly passed loadings override with the defaults of this class: securityLoading = valueOrFunction(params$Loadings$security, params = params, values = values); - t = as.character(start) + t = as.character(premiumCalculationTime) coeff = list( "SumInsured" = list("benefits" = coeffBenefits*0, "costs" = coeffCosts*0), @@ -583,7 +562,7 @@ InsuranceTarif = R6Class( coeff }, - premiumCalculation = function(params, values, start = 0) { + premiumCalculation = function(params, values, premiumCalculationTime = values$int$premiumCalculationTime) { loadings = params$Loadings; sumInsured = params$ContractData$sumInsured values$premiums = c( @@ -593,8 +572,8 @@ InsuranceTarif = R6Class( "written_beforetax" = 0, "tax" = 0, "written" = 0); coefficients = list("gross" = c(), "Zillmer" = c(), "net" = c()); - # Get the present values of the premiums, claims and costs at time 'start' (where the premium is to be calculated) - t = as.character(start) + # Get the present values of the premiums, claims and costs at time 'premiumCalculationTime' (where the premium is to be calculated) + t = as.character(premiumCalculationTime) pv = values$presentValues[t,] pvCost = values$presentValuesCosts[t,,] @@ -604,21 +583,21 @@ InsuranceTarif = R6Class( # net, gross and Zillmer premiums are calculated from the present values using the coefficients on each present value as described in the formulas document - coeff = self$getPremiumCoefficients("gross", pv * 0, pvCost * 0, premiums = values$premiums, params = params, values = values, start = start) + coeff = self$getPremiumCoefficients("gross", pv * 0, pvCost * 0, premiums = values$premiums, params = params, values = values, premiumCalculationTime = premiumCalculationTime) enumerator = sum(coeff[["SumInsured"]][["benefits"]] * pv) + sum(coeff[["SumInsured"]][["costs"]] * pvCost); denominator = sum(coeff[["Premium" ]][["benefits"]] * pv) + sum(coeff[["Premium" ]][["costs"]] * pvCost); values$premiums[["unit.gross"]] = enumerator/denominator * (1 + loadings$ongoingAlphaGrossPremium); values$premiums[["gross"]] = values$premiums[["unit.gross"]] * sumInsured; coefficients[["gross"]] = coeff; - coeff = self$getPremiumCoefficients("net", pv*0, pvCost*0, premiums = values$premiums, params = params, values = values, start = start) + coeff = self$getPremiumCoefficients("net", pv*0, pvCost*0, premiums = values$premiums, params = params, values = values, premiumCalculationTime = premiumCalculationTime) enumerator = sum(coeff[["SumInsured"]][["benefits"]] * pv) + sum(coeff[["SumInsured"]][["costs"]] * pvCost); denominator = sum(coeff[["Premium" ]][["benefits"]] * pv) + sum(coeff[["Premium" ]][["costs"]] * pvCost); values$premiums[["unit.net"]] = enumerator/denominator; values$premiums[["net"]] = values$premiums[["unit.net"]] * sumInsured; coefficients[["net"]] = coeff; - coeff = self$getPremiumCoefficients("Zillmer", pv * 0, pvCost * 0, premiums = values$premiums, params = params, values = values, start = start); + coeff = self$getPremiumCoefficients("Zillmer", pv * 0, pvCost * 0, premiums = values$premiums, params = params, values = values, premiumCalculationTime = premiumCalculationTime); enumerator = sum(coeff[["SumInsured"]][["benefits"]] * pv) + sum(coeff[["SumInsured"]][["costs"]] * pvCost); denominator = sum(coeff[["Premium" ]][["benefits"]] * pv) + sum(coeff[["Premium" ]][["costs"]] * pvCost); values$premiums[["unit.Zillmer"]] = enumerator/denominator; @@ -670,8 +649,8 @@ InsuranceTarif = R6Class( list("premiums" = values$premiums, "coefficients" = coefficients) }, - reserveCalculation = function(params, values, start = 0) { - t = as.character(start) + reserveCalculation = function(params, values) { + t = "0" securityFactor = (1 + valueOrFunction(params$Loadings$security, params = params, values = values)); ppScheme = params$ProfitParticipation$profitParticipationScheme; @@ -696,21 +675,21 @@ InsuranceTarif = R6Class( } resConversion = (resZ + resGamma) * (1 - advanceProfitParticipation); - # Alpha refund: Distribute alpha-costs to 5 years (or if shorter, the policy period), always starting at time 'start': + # Alpha refund: Distribute alpha-costs to 5 years (or if shorter, the policy period), always starting at time 0: # If alphaRefunded==TRUE, don't refund a second time! if (params$ContractState$alphaRefunded) { alphaRefund = 0 } else { - r = min(params$ContractData$policyPeriod - start, 5); + r = min(params$ContractData$policyPeriod, 5); ZillmerSoFar = Reduce("+", values$absCashFlows$Zillmer, accumulate = TRUE); ZillmerTotal = sum(values$absCashFlows$Zillmer); len = length(ZillmerSoFar); if (params$Features$alphaRefundLinear) { - ZillmerVerteilungCoeff = pad0((0:r)/r, len, 1, start = start); + ZillmerVerteilungCoeff = pad0((0:r)/r, len, 1); } else { q = self$getTransitionProbabilities(params); # vector of all ä_{x+t, r-t} - pvAlphaTmp = calculatePVSurvival(q = pad0(q$q, len), advance = pad0(rep(1,r), len), v = 1/(1 + params$ActuarialBases$i), start = start); + pvAlphaTmp = calculatePVSurvival(q = pad0(q$q, len), advance = pad0(rep(1,r), len), v = 1/(1 + params$ActuarialBases$i)); ZillmerVerteilungCoeff = (1 - pvAlphaTmp/pvAlphaTmp[[1]]); } alphaRefund = ZillmerSoFar - ZillmerVerteilungCoeff * ZillmerTotal; @@ -721,7 +700,7 @@ InsuranceTarif = R6Class( # Collect all reserves to one large matrix res = cbind( - "SumInsured" = head0(rep(params$ContractData$sumInsured, values$int$l), start = start), + "SumInsured" = head0(rep(params$ContractData$sumInsured, values$int$l)), "net" = resNet, "Zillmer" = resZ, "adequate" = resAdeq, @@ -769,7 +748,7 @@ InsuranceTarif = R6Class( ) }, - getBalanceSheetReserveFactor = function(params, years = 1, start = 0) { + getBalanceSheetReserveFactor = function(params, years = 1) { balanceDate = params$ActuarialBases$balanceSheetDate year(balanceDate) = year(params$ContractData$contractClosing); if (balanceDate < params$ContractData$contractClosing) { @@ -791,7 +770,7 @@ InsuranceTarif = R6Class( baf }, - reserveCalculationBalanceSheet = function(params, values, start = 0) { + reserveCalculationBalanceSheet = function(params, values) { reserves = values$reserves; years = length(reserves[,"Zillmer"]); # Balance sheet reserves: @@ -839,7 +818,7 @@ InsuranceTarif = R6Class( }, - getBasicDataTimeseries = function(params, values, start = 0) { + getBasicDataTimeseries = function(params, values) { res = cbind( "PremiumPayment" = values$premiumComposition[, "charged"] > 0, "SumInsured" = values$reserves[, "SumInsured"], @@ -852,14 +831,14 @@ InsuranceTarif = R6Class( res }, - premiumDecomposition = function(params, values, start = 0) { + premiumDecomposition = function(params, values) { loadings = params$Loadings; sumInsured = params$ContractData$sumInsured; premiums = values$premiums; v = 1/(1 + params$ActuarialBases$i); l = dim(values$reserves)[[1]]; ppScheme = params$ProfitParticipation$profitParticipationScheme; - t = as.character(start) + t = as.character(0) # Time for original premium calculation => TODO: Use values stored in ContractData? # TODO: This assumes all premiums are paid in advance! premium.gross = values$absCashFlows[,"premiums_advance"]; @@ -927,51 +906,58 @@ InsuranceTarif = R6Class( # Gross premium = net + zillmeredAlpha + unzillmeredAlpha + beta + gamma premium - unit.premiumCF = premium.gross / premiums[["gross"]]; - premium.gamma = unit.premiumCF * values$absPresentValues[t, "gamma"] / values$absPresentValues[t, "premiums.unit"]; - premium.beta = unit.premiumCF * values$absPresentValues[t, "beta"] / values$absPresentValues[t, "premiums.unit"]; - premium.alpha = unit.premiumCF * values$absPresentValues[t, "alpha"] / values$absPresentValues[t, "premiums.unit"]; + unit.premiumCF = ifelse(premiums[["gross"]] == 0, premium.gross * 0, premium.gross / premiums[["gross"]]); + if (values$absPresentValues[t, "premiums.unit"] == 0) { + premium.gamma = 0 + premium.beta = 0 + premium.alpha = 0 + premium.alpha.Zillmer = 0 + } else { + premium.gamma = unit.premiumCF * values$absPresentValues[t, "gamma"] / values$absPresentValues[t, "premiums.unit"]; + premium.beta = unit.premiumCF * values$absPresentValues[t, "beta"] / values$absPresentValues[t, "premiums.unit"]; + premium.alpha = unit.premiumCF * values$absPresentValues[t, "alpha"] / values$absPresentValues[t, "premiums.unit"]; + premium.alpha.Zillmer = unit.premiumCF * values$absPresentValues[t, "Zillmer"] / values$absPresentValues[t, "premiums.unit"]; + } premium.Zillmer = unit.premiumCF * premiums[["Zillmer"]]; - premium.alpha.Zillmer = unit.premiumCF * values$absPresentValues[t, "Zillmer"] / values$absPresentValues[t, "premiums.unit"]; premium.alpha.noZ = premium.alpha - premium.alpha.Zillmer; # ungezillmerter Teil der Abschlusskosten premium.net = unit.premiumCF * premiums[["net"]]; securityLoading = valueOrFunction(params$Loadings$security, params = params, values = values); - premium.risk.actual = v * head0(values$absCashFlows[,"death"] - c(values$reserves[,"net"][-1], 0), start = start) * pad0(values$transitionProbabilities$q, l); + premium.risk.actual = v * (values$absCashFlows[,"death"] - c(values$reserves[,"net"][-1], 0)) * pad0(values$transitionProbabilities$q, l); premium.risk.security = v * (values$absCashFlows[,"death"] * securityLoading) * pad0(values$transitionProbabilities$q, l); premium.risk = premium.risk.actual + premium.risk.security; - # TODO-start: Make sure the premium components are 0 before start! - premium.risk.disease.actual = v * head0(values$absCashFlows[,"disease_SumInsured"] - c(values$reserves[,"net"][-1], 0), start = start) * pad0(values$transitionProbabilities$i, l); + + premium.risk.disease.actual = v * (values$absCashFlows[,"disease_SumInsured"] - c(values$reserves[,"net"][-1], 0)) * pad0(values$transitionProbabilities$i, l); premium.risk.disease.security = v * (values$absCashFlows[,"disease_SumInsured"] * securityLoading) * pad0(values$transitionProbabilities$i, l); premium.risk.disease = premium.risk.disease.actual + premium.risk.disease.security; - premium.savings = head0(getSavingsPremium( + premium.savings = getSavingsPremium( values$reserves[,"net"], v = v, survival_advance = values$absCashFlows[,"survival_advance"] + values$absCashFlows[,"guaranteed_advance"], survival_arrears = values$absCashFlows[,"survival_arrears"] + values$absCashFlows[,"guaranteed_arrears"] - ), start = start) + ) - premium.Zillmer.risk.actual = v * head0(values$absCashFlows[,"death"] - c(values$reserves[,"contractual"][-1], 0), start = start) * pad0(values$transitionProbabilities$q, l); + premium.Zillmer.risk.actual = v * (values$absCashFlows[,"death"] - c(values$reserves[,"contractual"][-1], 0)) * pad0(values$transitionProbabilities$q, l); premium.Zillmer.risk.security = v * (values$absCashFlows[,"death"] * securityLoading) * pad0(values$transitionProbabilities$q, l); premium.Zillmer.risk = premium.Zillmer.risk.actual + premium.Zillmer.risk.security; - premium.Zillmer.risk.disease.actual = v * head0(values$absCashFlows[,"disease_SumInsured"] - c(values$reserves[,"contractual"][-1], 0), start = start) * pad0(values$transitionProbabilities$i, l); + premium.Zillmer.risk.disease.actual = v * (values$absCashFlows[,"disease_SumInsured"] - c(values$reserves[,"contractual"][-1], 0)) * pad0(values$transitionProbabilities$i, l); premium.Zillmer.risk.disease.security = v * (values$absCashFlows[,"disease_SumInsured"] * securityLoading) * pad0(values$transitionProbabilities$i, l); premium.Zillmer.risk.disease = premium.Zillmer.risk.disease.actual + premium.Zillmer.risk.disease.security; - premium.Zillmer.savings = head0(getSavingsPremium( + premium.Zillmer.savings = getSavingsPremium( values$reserves[,"contractual"], v = v, survival_advance = values$absCashFlows[,"survival_advance"] + values$absCashFlows[,"guaranteed_advance"], survival_arrears = values$absCashFlows[,"survival_arrears"] + values$absCashFlows[,"guaranteed_arrears"] - ), start = start) - premium.Zillmer.amortization = head0(getSavingsPremium( + ) + premium.Zillmer.amortization = getSavingsPremium( pmin(0, values$reserves[,"contractual"]), v = v - ), start = start) - premium.Zillmer.actsavings = head0(getSavingsPremium( + ) + premium.Zillmer.actsavings = getSavingsPremium( pmax(0, values$reserves[,"contractual"]), v = v, survival_advance = values$absCashFlows[,"survival_advance"] + values$absCashFlows[,"guaranteed_advance"], survival_arrears = values$absCashFlows[,"survival_arrears"] + values$absCashFlows[,"guaranteed_arrears"] - ), start = start) + ) res = cbind( "charged" = premium.charged, @@ -1017,17 +1003,14 @@ InsuranceTarif = R6Class( res }, - calculateFutureSums = function(values, ..., start = 0) { - rcumsum = function(vec) c( - head(vec, start), - rev(cumsum(rev(tail(vec, length(vec) - start)))) - ) + calculateFutureSums = function(values, ...) { + rcumsum = function(vec) rev(cumsum(rev(vec))) apply(values, 2, rcumsum) }, - calculatePresentValues = function(values, params, start = 0) { + calculatePresentValues = function(values, params) { len = dim(values)[1]; q = self$getTransitionProbabilities(params); - pv = function(vec) calculatePVSurvival(px = pad0(q$p, len), advance = vec, v = 1/(1 + params$ActuarialBases$i), start = start); + pv = function(vec) calculatePVSurvival(px = pad0(q$p, len), advance = vec, v = 1/(1 + params$ActuarialBases$i)); apply(values, 2, pv) }, diff --git a/inst/Beispiele/Example_Endowment.R b/inst/Beispiele/Example_Endowment.R index c197325..2de12a6 100644 --- a/inst/Beispiele/Example_Endowment.R +++ b/inst/Beispiele/Example_Endowment.R @@ -69,23 +69,28 @@ contract.Bsp = InsuranceContract$ contractClosing = as.Date("2020-07-01"), id = "Hauptvertrag" )$ - addDynamics(t = 5, NewSumInsured = 200000, id = "Dynamik 1", i = 0.00)$ + addDynamics(t = 5, NewSumInsured = 200000, id = "Dynamik 1", i = 0.05, age = 70)$ addDynamics(t = 10, NewSumInsured = 250000, id = "Dynamik 2", i = 0.01); # exportInsuranceContractExample(contract.Bsp, t = 5); # showVmGlgExamples(contract.Bsp, t = 10) - -exportInsuranceContract.xlsx(contract.Bsp, filename = "BEISPIEL_Contract.xlsx") +# +# exportInsuranceContract.xlsx(contract.Bsp, filename = "BEISPIEL_Contract.xlsx") +# +# +# contract.Bsp$Values$cashFlowsBasic +# contract.Bsp$Values$cashFlows +# contract.Bsp$Values$cashFlowsCosts +# contract.Bsp$Values$presentValues +# # contract.U17_3J$Values$presentValuesCosts +# contract.Bsp$Values$premiumSum +# contract.Bsp$Values$premiums +# contract.Bsp$Values$premiumComposition +# contract.Bsp$Values$reserves -contract.Bsp$Values$cashFlowsBasic -contract.Bsp$Values$cashFlows -contract.Bsp$Values$cashFlowsCosts -contract.Bsp$Values$presentValues -# contract.U17_3J$Values$presentValuesCosts -contract.Bsp$Values$premiumSum -contract.Bsp$Values$premiums -contract.Bsp$Values$premiumComposition -contract.Bsp$Values$reserves +################################################################### # +# Testing premium waivers #### +################################################################### # contract.Bsp.waiver = InsuranceContract$ @@ -97,6 +102,7 @@ contract.Bsp.waiver = InsuranceContract$ contractClosing = as.Date("2020-07-01"), id = "Hauptvertrag" )$premiumWaiver(t = 5) +exportInsuranceContract.xlsx(contract.Bsp.waiver, filename = "BEISPIEL_Contract_PrfALT.xlsx") contract.Bsp.waiverNew = InsuranceContract$ new( @@ -107,6 +113,7 @@ contract.Bsp.waiverNew = InsuranceContract$ contractClosing = as.Date("2020-07-01"), id = "Hauptvertrag" )$premiumWaiverNew(t = 5) +exportInsuranceContract.xlsx(contract.Bsp.waiverNew, filename = "BEISPIEL_Contract_PrfNEU.xlsx") contract.Bsp.waiver$Values$cashFlowsBasic == contract.Bsp.waiverNew$Values$cashFlowsBasic contract.Bsp.waiver$Values$cashFlows == contract.Bsp.waiverNew$Values$cashFlows -- GitLab