From 6132444231dd10a0a62b5f3f77ed2a12cf849cde Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Fri, 21 Jul 2023 00:00:58 +0300 Subject: [PATCH] Implement some more hooks to customize the behavior --- Auswertungen/2019-02-27_Bestimmung_Datum.xlsx | Bin 15172 -> 0 bytes R/InsuranceParameters.R | 10 ++++- R/InsuranceTarif.R | 35 ++++++++++++++---- man/InsuranceContract.ParameterDefaults.Rd | 3 ++ 4 files changed, 39 insertions(+), 9 deletions(-) delete mode 100644 Auswertungen/2019-02-27_Bestimmung_Datum.xlsx diff --git a/Auswertungen/2019-02-27_Bestimmung_Datum.xlsx b/Auswertungen/2019-02-27_Bestimmung_Datum.xlsx deleted file mode 100644 index 98f294c02b38517e8c41e5e81d06805aa4093286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15172 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 diff --git a/R/InsuranceParameters.R b/R/InsuranceParameters.R index bdacecd..337ff57 100644 --- a/R/InsuranceParameters.R +++ b/R/InsuranceParameters.R @@ -475,6 +475,9 @@ InsuranceContract.Values = list( #' ## Elements of sublist \code{InsuranceContract.ParameterDefault$Features} #' #' \describe{ +#' \item{\code{$zillmering}}{Whether the contract uses Zillmering (and bases +#' reserves on the Zillmer reserve as opposed to the adequate +#' reserve) (default: TRUE)} #' \item{\code{$betaGammaInZillmer}}{Whether beta and gamma-costs should be #' included in the Zillmer premium calculation} #' \item{\code{$alphaRefundLinear}}{Whether the refund of alpha-costs on @@ -548,6 +551,7 @@ InsuranceContract.Values = list( #' \item{\code{$adjustPresentValues}}{Adjust the present value vectors that are later used to derive premiums and reserves. \code{function(presentValues, params, values)}} #' \item{\code{$adjustPresentValuesCosts}}{Adjust the present value cost vectors used to derive premiums and reserves. \code{function(presentValuesCosts, params, values)}} #' \item{\code{$adjustPremiumCoefficients}}{Function with signature \code{function(coeff, type, premiums, params, values, premiumCalculationTime)} to adjust the coefficients for premium calculation after their default setup. Use cases are e.g. term-fix tariffs where the Zillmer premium term contains the administration cost over the whole contract, but not other gamma- or beta-costs.} +#' \item{\code{$adjustPremiums}}{Adjust the resulting premiums. \code{function(premiums = list(premiums, coefficients, sumInsured), params, values)}} #' \item{\code{$adjustPVForReserves}}{Adjust the absolute present value vectors used to derive reserves (e.g. when a sum rebate is subtracted from the gamma-cost reserves without influencing the premium calculation). \code{function(absPV, params, values)}} #' \item{\code{$premiumRebateCalculation}}{Calculate the actual premium rebate from the rebate rate (e.g. when the premium rate is given as a yearly cost reduction applied to a single-premium contract). \code{function(premiumRebateRate, params = params, values = values)}} #' } @@ -630,6 +634,7 @@ InsuranceContract.ParameterDefaults = list( commissionPeriod = 5 ), Features = list( # Special cases for the calculations + zillmering = TRUE, # Whether the contract uses Zillmering (and bases reserves on the Zillmer reserve as opposed to the adequate reserve) betaGammaInZillmer = FALSE, # Whether beta and gamma-costs should be included in the Zillmer premium calculation alphaRefundLinear = TRUE, # Whether the refund of alpha-costs on surrender is linear in t or follows the NPV of an annuity useUnearnedPremiums = isRegularPremiumContract, # Whether unearned premiums should be calculated in the balance sheet reserves. Otherwise, a premium paid at the beginning of the period is added to the reserve for balance-sheet purposes. @@ -669,10 +674,11 @@ InsuranceContract.ParameterDefaults = list( adjustCosts = NULL, adjustMinCosts = NULL, adjustPresentValues = NULL, # function(presentValues, params, values) - adjustPresentValuesCosts = NULL, # function(presentValuesCosts, params, values) + adjustPresentValuesCosts = NULL, # function(presentValuesCosts, params, values) adjustPremiumCoefficients = NULL, # function(coeff, type = type, premiums = premiums, params = params, values = values, premiumCalculationTime = premiumCalculationTime) + adjustPremiums = NULL, # function(premiums = list(premiums, coefficients, sumInsured), params, values) adjustPVForReserves = NULL, # function(absPresentValues, params, values) - premiumRebateCalculation = NULL # function(premiumRebateRate, params = params, values = values) + premiumRebateCalculation = NULL # function(premiumRebateRate, params = params, values = values) ) ); diff --git a/R/InsuranceTarif.R b/R/InsuranceTarif.R index 010c523..6585874 100644 --- a/R/InsuranceTarif.R +++ b/R/InsuranceTarif.R @@ -838,6 +838,7 @@ InsuranceTarif = R6Class( values$cashFlowsCosts[,,"SumPremiums",] * values$unitPremiumSum * values$premiums[["gross"]] + values$cashFlowsCosts[,,"GrossPremium",] * values$premiums[["gross"]] + values$cashFlowsCosts[,,"NetPremium",] * values$premiums[["net"]] + + # values$cashFlowsCosts[,,"Benefits",] * TODO!!! values$cashFlowsCosts[,,"Constant",]; # Handle survival CF differently, because we don't want ".survival" in the column names! @@ -975,6 +976,7 @@ InsuranceTarif = R6Class( affected = c(affected, "unitcosts") } coeff[["SumInsured"]][["costs"]][affected, "SumInsured", ] = 1; + coeff[["SumInsured"]][["costs"]][affected, "Benefits", ] = 1; # TODO: How to handle beta costs proportional to Sum Insured coeff[["Premium"]] [["costs"]][affected, "SumPremiums", ] = -values$unitPremiumSum; coeff[["Premium"]] [["costs"]][affected, "GrossPremium",] = -1; @@ -1230,7 +1232,11 @@ InsuranceTarif = R6Class( values$premiums[["tax"]] = premiumBeforeTax * tax; values$premiums[["written"]] = premiumBeforeTax * (1 + tax); - list("premiums" = values$premiums, "coefficients" = coefficients, "sumInsured" = params$ContractData$sumInsured) + applyHook( + params$Hooks$adjustPremiums, + list("premiums" = values$premiums, "coefficients" = coefficients, "sumInsured" = params$ContractData$sumInsured), + params = params, values = values + ) }, #' @description Calculate the reserves of the InsuranceContract given the @@ -1257,17 +1263,19 @@ InsuranceTarif = R6Class( resAdeq = absPV[,"benefitsAndRefund"] * securityFactor + absPV[,"alpha"] + absPV[,"beta"] + absPV[,"gamma"] - values$premiums[["gross"]] * absPV[,"premiums.unit"]; + if (params$Features$unitcostsInGross) { + resAdeq = resAdeq + absPV[, "unitcosts"] + } - #values$premiums[["Zillmer"]] * absPV[,"premiums"]; resGamma = absPV[,"gamma"] - ifelse(absPV[t, "premiums"] == 0, 0, absPV[t, "gamma"] / absPV[t, "premiums"]) * absPV[,"premiums"] + advanceProfitParticipation = 0; if (!is.null(ppScheme)) { advanceProfitParticipation = ppScheme$getAdvanceProfitParticipation(params = params, values = values) } - resConversion = (resZ + resGamma) * (1 - advanceProfitParticipation); # 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! @@ -1291,11 +1299,18 @@ InsuranceTarif = R6Class( } # Reduction Reserve: Reserve used for contract modifications: - resReduction = resZ + alphaRefund; + if (params$Features$zillmering) { + resContractual = resZ + resGamma + resReduction = resZ + alphaRefund; + } else { + resContractual = resAdeq + resGamma + resReduction = resAdeq + alphaRefund; + } + resConversion = resContractual * (1 - advanceProfitParticipation); if (params$Features$surrenderIncludesCostsReserves) { resReduction = resReduction + resGamma; } - resReduction = pmax(0,resReduction) # V_{x,n}^{Rkf} + resReduction = pmax(0, resReduction) # V_{x,n}^{Rkf} # Collect all reserves to one large matrix res = cbind( @@ -1304,7 +1319,7 @@ InsuranceTarif = R6Class( "Zillmer" = resZ, "adequate" = resAdeq, "gamma" = resGamma, - "contractual" = resZ + resGamma, + "contractual" = resContractual, "conversion" = resConversion, "alphaRefund" = alphaRefund, "reduction" = resReduction @@ -1406,7 +1421,12 @@ InsuranceTarif = R6Class( resN_BS = (1 - baf) * (reserves[,"net"] + if (!useUnearnedPremiums) values$premiumComposition[,"net"] else 0) + baf * c(reserves[-1, "net"], 0) resZ_BS = (1 - baf) * (reserves[,"Zillmer"] + if (!useUnearnedPremiums) values$premiumComposition[,"Zillmer"] else 0) + baf * c(reserves[-1, "Zillmer"], 0) resGamma_BS = (1 - baf) * (reserves[,"gamma"] + if (!useUnearnedPremiums) values$premiumComposition[,"gamma"] else 0) + baf * c(reserves[-1, "gamma"], 0) - res_BS = resZ_BS + resGamma_BS; + resGross_BS = (1 - baf) * (reserves[,"adequate"] + if (!useUnearnedPremiums) sum(values$premiumComposition[,c("alpha", "beta", "gamma")]) else 0) + baf * c(reserves[-1, "adequate"], 0) + if (params$Features$zillmering) { + res_BS = resZ_BS + resGamma_BS; + } else { + res_BS = resGross_BS; + } # Premium transfer / unearned premium: if (useUnearnedPremiums) { @@ -1438,6 +1458,7 @@ InsuranceTarif = R6Class( "net" = pmax(resN_BS,0), "Zillmer" = pmax(resZ_BS,0), "gamma" = pmax(resGamma_BS,0), + "gross" = pmax(resGross_BS,0), "Balance Sheet Reserve" = pmax(res_BS,0), "unearned Premiums" = unearnedPremiums ); diff --git a/man/InsuranceContract.ParameterDefaults.Rd b/man/InsuranceContract.ParameterDefaults.Rd index ac7bfb5..6f30bfc 100644 --- a/man/InsuranceContract.ParameterDefaults.Rd +++ b/man/InsuranceContract.ParameterDefaults.Rd @@ -238,6 +238,9 @@ with duration "CommissionPeriod". Default is 5 years.} \subsection{Elements of sublist \code{InsuranceContract.ParameterDefault$Features}}{ \describe{ +\item{\code{$zillmering}}{Whether the contract uses Zillmering (and bases +reserves on the Zillmer reserve as opposed to the adequate +reserve) (default: TRUE)} \item{\code{$betaGammaInZillmer}}{Whether beta and gamma-costs should be included in the Zillmer premium calculation} \item{\code{$alphaRefundLinear}}{Whether the refund of alpha-costs on -- GitLab