Framework for the implementation of solvency related computations based on standard models for the Swiss Solvency Test (SST), a risk-based capital standard for Swiss insurance companies. Allows Monte Carlo simulation of market risk, some insurance risks and their aggregation. Additional toolbox for preprocessing computations. Convenient 'shiny' GUI combined with a parser for an input 'excel' (.xlsx) template to simplify model configuration, data fill-in and results visualization.
This package implements the Swiss Solvency Test (SST) model.
Download either the source version (sstModel_X.Y.Z.tar.gz
) or the binary version (sstModel_X.Y.Z.zip
, Windows only) by clicking on the file you would like to download.
library(sstModel)
sstModel_check()
.Note that an Excel template provided by FINMA should be used and that another Excel worksheet would cause the simulations to fail.
Execute an SST Simulation in the R console:
library(sstModel)model <- excelToSstModel("path/to/excel/template.xlsm")result <- compute(model, NUM_SIM)
Where path/to/excel/template.xlsm
is the path to the Excel template on your computer and NUM_SIM
is the desired number of simulations. Please note that very large number of simulations (> 1 000 000) will cause very long calculations.
Different solvency figures can be computed using the following methods.
marketValueMargin(result) # SST market value margin.targetCapital(result, with.scenario = F) # SST target capital without scenario aggregationtargetCapital(result, with.scenario = T) # SST target capital with scenario aggregationriskCapital(result, with.scenario = F) # SST one-year risk capital without scenario aggregationriskCapital(result, with.scenario = T) # SST one-year risk capital with scenario aggregationsstRatio(result, with.scenario = F) # SST ratio without scenario aggregationsstRatio(result, with.scenario = T) # SST ratio with scenario aggregation
Simply run the following command in your terminal:
sstModel::launchDashboard()
A graphical user interface will show up. You can then use the Interactive help button to discover the interface.
This package, up to version 1.0.0, was authored by
for the Swiss Financial Market Supervisory Authority FINMA.
The authors agree Michael Schmutz to be the maintainer of this package.
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Note that Semantic Versioning is only used starting from version 1.0.0 The 0.x.y versions are development versions and have been used to keep the changelog clearer, see Semantic Versioning.
When Rtools is missing, it is not possible to download the excel output file. In this case, the error message was "Internal server error". Replaced this error message on GUI and package by a humanly understandable message indicating that Rtools is missing. Note that the results are still available on the GUI or using summary.sstOutput
in the package. Implemented by Adrien Lamit (@alamit) and Melvin Kianmanesh Rad (@melvinkian) for FINMA in #478.
Final description information for authors, maintainer and copyright-holder in DESCRIPTION file. Implemented by Loris Michel (@lorismichel) for FINMA in #473.
Error message when the same MVM is provided more than once as input. Implemented by Loris Michel (@lorismichel) for FINMA in #471.
In standalone
and mappingTable
, replaced rbindlist
from the data.table
package by do.call("rbind", ...)
in order to avoid a unwanted cast to a data.table
object. Indeed, we do not want to cast unecessarly to data.table
as this can introduce unwanted side-effects. Implemented by Loris Michel (@lorismichel) for FINMA in #471.
Forced evaluation of parameters in generateFunction.portfolio
to have a safe closure. Implemented by Loris Michel (@lorismichel) for FINMA in #471.
macro.economic.scenarios
are now provided directly in the constructor sstModel
instead of marketRisk
. Implemented by Loris Michel (@lorismichel) for FINMA in #459.
Updated color scale for sstRatio
box in dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #481:
sstRatio < 33
33 <= sstRatio < 80
80 <= sstRatio < 100
sstRatio >= 100
Changed the color of all highlighted key figures boxes to blue. Implemented by Adrien Lamit (@alamit) for FINMA in #481.
Bug in the reordering step when only market risk is computed. Implemented by Loris Michel (@lorismichel) and Melvin Kianmanesh Rad (@melvinkian) for FINMA in #482.
Unexpected error when only one scenario provided for the stressed Gaussian copula aggregation method (see conditionalReordering
). Implemented by Loris Michel (@lorismichel) for FINMA in #466.
Risk bearing capital box in dashboard now displays sstOutput$rtkg
instead of targetCapital(sstOutput)
. Implemented by Adrien Lamit (@alamit) for FINMA in #481.
generateError
was not exported). Implemented by Loris Michel (@lorismichel) for FINMA in #457.Error message if sensitivities of health and life insurance risks are not all provided in the reference currency. Implemented by Loris Michel (@lorismichel) for FINMA in #429.
Parameters evaluation need to be forced to have safe valFunction
closures in all file *-valuation.R
files for marketItem
objects. Implemented by Loris Michel (@lorismichel) for FINMA in #454.
Allow life insurance sensitivities of different signs, which were all transformed to positive volatilities (in valInfo.life
). This allows to have different signs in the linear combination of life insurance risk factors, allowing gains for some scenarios. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #452.
Participations are comonotonically added to market risk to obtain total market risk by exactly matching the ranks of market and participation simulations (in aggregateRisks
). Before, re-sampling from the empirical distribution of the market risk was used. Implemented by Loris Michel (@lorismichel) for FINMA in #434.
In generatFunction.portfolio
restricted function to generate complete valuation function for all market items. Implemented by Loris Michel (@lorismichel) for FINMA in #429.
Participations are simulated instead of using theoretical quantile approximation (in compute.sstModel
re-introduced compute.participationRisk
). Implemented by Loris Michel (@lorismichel) for FINMA in #427.
Standalone valuation evaluations and valuation terms are now handled one-by-one to optimize memory consumption and avoid reaching maximal string length (in compute.marketRisk
). Implemented by Loris Michel (@lorismichel) for FINMA in #427.
In the excel parser (excelToSstModel
), parsing of macro-economic scenarios to the internal data structure (macroEconomicScenarios
) is now done with exact ordering of the risk factors (same order as in the market risk definition). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #430.
In the excel output (write.sstOutput
), information are now displayed in millions of base currency. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #418.
Naming conventions for market risk and participations in the summary, names of simulations to be saved on the dashboard and excel output (see translate.sstOutput
, summary.sstOutput
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #418.
Market-Value-Margin computation is done using the expected shortfall of the total market risk instead of the expected shortfall of the total market risk without participations (in marketValueMargin
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #413.
Labels of highlighted figures updated: Target capital -> Risk bearing capital, Risk capital -> One-year risk capital. Implemented by Adrien Lamit (@alamit) for FINMA in #453.
README.md to match new installation procedures. Implemented by Adrien Lamit (@alamit) for FINMA in #411.
Results are now displayed in millions of base currency in the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #409.
Key figures boxes are now displayed correctly and resized according to window size. Implemented by Adrien Lamit (@alamit) for FINMA in #409.
Titles of sections (w/ or w/o scenario) are now outside of the boxes for better display with small windows (e.g. default size of Rstudio viewer). Implemented by Adrien Lamit (@alamit) for FINMA in #409.
Restrict sensitivities for health insurance risk to be positive, due to the fact that they are interpreted as standard deviations. Implemented by Loris Michel (@lorismichel) for FINMA in #423.
During excel parsing (excelToSstModel
), an unnecessary participation risk was created in case the exposure was 0
. Now no participation is created in such case. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #418.
During the excel parsing (excelToSstModel
), unexpected error in case no expected financial result input was provided. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #413.
During the excel parsing (excelToSstModel
), unexpected error in case no asset prices input was provided. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #413.
During the excel parsing (excelToSstModel
), unexpected error in case no market item, an error message is displayed instead. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #413.
Bug while creating comments in write.sstOutput
, due to global option stringsAsFactors
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #401.
Bug with filename in Rstudio window mode on windows. Variable name of the shiny output must have the extension, this is a bug from Rstudio 's built in browser. Implemented by Adrien Lamit (@alamit) for FINMA in #401.
Prepared for interactive help to explain the dashboard using an interactive help button, still unstable with Rstudio's viewer. Implemented by Adrien Lamit (@alamit) for FINMA in #371.
Title to display description of each row of the results table when mouse is positioned over the row. Implemented by Adrien Lamit (@alamit) for FINMA in #371.
The excel output now also contains comments in cells for further details. Those comments are generated while taking the summary of the output. The functionality is modular, changing the summary is sufficient for updating the comments (see summary.sstOutput
, write.sstOutput
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #369.
It is now possible to modify nhmr
(non hedgeable market risk scale), alpha
(expected shortfall quantile) and sup
(should the upper expected shortfall be taken?) in any solvency figure function: marketValueMargin
, riskCapital
, targetCapital
, sstRatio
as well as in summary.sstOutput
and write.sstOutput
via the ellipsis ...
arguments. Those argument will recursively be passed on to all marketValueMargin
and expectedShortfall
calls. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #365.
Decorator constructors for initial values of FX and interest rates as well as time mappings that are then used in marketRisk
, this has allowed to remove global options STRINGSASFACTORS
to be set at loading time. Implemented by Loris Michel (@lorismichel) for FINMA in #361.
Comments for MVM parsing and computations as well as for fixed income parsing and initial spreads computations (in excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #356.
Empirical Cumulative Distribution Function parsing is now implemented (see excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #356.
It is now possible to parse an excel file without defining the cost of capital, provided that no MVM life is defined. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #356.
Helper S3 method translate
for class sstOutput
returns understandable names for the columns of sstOutput$simulations
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #353.
Different MVM (life, health, non-life) to the summary of the output and thus to the excel output (see summary.sstOutput
, write.sstOutput
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #347.
SST Ratio is now expressed in percent in the excel output (see write.sstOutput
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #347.
Error message if a risk factor value is defined twice for a macroeconomic scenario (see macroEconomicScenarios
). Implemented by Loris Michel (@lorismichel) for FINMA in #341.
Error handling in the excel parser (excelToSstModel
) is now also implemented for all market and insurance items, as well as for scenarios, macroeconomic scenarios and copula aggregation parameters. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #339.
Errors and warnings during excel parsing are now displayed all at once in the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Customized error message when memory is insufficient to compute the asked number of simulations on the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Possibility to download the full warning log for the excel parsing on the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Credit risk parsing is simplified (in excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #373.
Market-Value-Margin is now computed using same continuous rates as those defined as market risk initial values (see excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #373.
Market-Value-Margin is computed continuous compounded rates inputs (see mvmLife
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #373.
Display of results tables in the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #371.
Signs are now all considered positive for losses and negative for gains in the summary and the output (see summary.sstOutput
), except for scenarios and macro-economic scenarios. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #365.
write
is not a generic S3 method anymore. This was in conflict with other functions (such as write.csv
). write.sstOutput
is now a function. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #360.
Updated the risk aggregation procedure towards a tree-based aggregation involving first a stochastic comonotonic sampling from the market risk simulations and the participations (sum-aggregated) followed by a conditional reordering with the insurances risks. Implemented by Loris Michel (@lorismichel) for FINMA in #358.
In the excel parser (excelToSstModel
): unified warning and error messages for MVM life, health and non-life. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #356.
Error handling for macro-economic scenarios were not implemented at construction but during execution. Now error messages related to macro-economic scenarios will appear directly at construction (in sstModel
, macroEconomicScenarios
). Implemented by Loris Michel (@lorismichel) for FINMA in #341.
Error handling for conditional reordering was not completed at construction. Added missing conditions (in sstModel
). Implemented by Loris Michel (@lorismichel) for FINMA in #341.
Option stringAsFactors = F
is now reset properly in excelToSstModel
using on.exit
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #339.
Shiny does not terminate R session anymore when running with the option "sstModel.execMode". The shiny app still quit. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Updated the logo for target capital in Dashboard to a line chart logo, this is more pertinent. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Progress bar when computing simulations now have three steps: excel parsing, computing simulations and rendering results. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Names of checkboxes to include simulations in the output excel file are now humanly readable. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Global option STRINGSASFACTORS
set at package loading. Implemented by Loris Michel (@lorismichel) for FINMA in #361.
Unnecessary warnings, coercion warning in marketRisk
and zero scale in spread
, which are always there for GOVI ratings. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #360.
Number of simulations has no more upper bound in dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #335.
Participations were aggregated twice (in riskCapital
), removed expected shortfall of participations in the one-year risk capital computation. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #363.
Implementation of Market-Value-Margin for life (in mvmLife
) was wrong and is now correctly implementated. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #370.
In case of Empirical Cumulative Distribution Function (ECDF) input for non-life risk, the constructor (nonLifeRisk
) was asking for the first probability to be 0
. This was wrong due to right-continuity of ECDFs and didn't enforce that the last jump towards probability 1
was computable. This is now corrected along with the simulation procedure (see simulate.nonLifeRisk
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #365.
Error while parsing tables with empty columns. In the excel parser (excelToSstModel
), explicitly casted numerical columns to numeric to avoid casting errors and warnings while using (due to data.table::dcast
or data.table::melt
) occurring while reading empty columns. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #356.
Standalone fixed income valuation term was not appearing in the output excel, dashboard and summary due to a typo in summary.sstOutput
is now solved. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #335.
Bug in the excel parser (excelToSstModel
) in case no initial spreads were provided, data.table
was throwing an unexpected error, now solved. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #345.
Bug in the excel parser (excelToSstModel
) in case of no scenarios (single Gaussian copula) used for the reordering, now solved. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #339.
Updated cached file .Rbuildignore
to keep only relevant folders and files in the bundled package. Implemented by Loris Michel (@lorismichel) for FINMA in #337.
In the excel parser (excelToSstModel
) symmetrisation of the correlation matrix of market risk factors is done using the mean of the matrix and its transposed instead of using the upper triangle of the matrix. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #332.
In the excel parser (excelToSstModel
), a warning is thrown instead of an error in case basic checks for covariance matrix, such as perfect symmetry, do not pass. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #332.
Use argument symmetric = T
in eigen
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #332.
Require exactly symmetric covariance matrix of market risk-factors (in marketRisk
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #332.
Relative tolerance in Newton-Raphson instead of absolute tolerance. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #331.
Warning instead of error in the excel parser (excelToSstModel
) in case of wrong initial spreads, absolute tolerance is now obtained using a relative tolerance of 1e-4
multiplied with the total market value. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #331.
excelToSstModel
if there was no error, now fixed. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #331.In the dashboard, standalone market risk for different valuation terms. (compute.sstModel
is now called with the nested.market.computations = T
parameter). Implemented by Adrien Lamit (@alamit) for FINMA in #329.
Modularization of the excel output generation. The excel output (in write.sstOutput
) now builds up automatically from the summary of the output (summary.sstOutput
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #319.
Complete summary
for sstOutput
with list of key figures, standalone market risks, standalone insurance risks and scenarios. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #319.
Aggregated market risk and participations to the output of compute.sstModel
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #319.
Download results button now has checkboxes add possibility to save simulation vectors (see keep
parameter in write.sstOutput
). Implemented by Adrien Lamit (@alamit) for FINMA in #317.
Function sstModel_check()
. This function checks for any packages potentially used by the sstModel package present in the user's libraries, checks those packages build versions and asks the user if he wants to reinstall those packages. Implemented by Adrien Lamit (@alamit) for FINMA in #303.
Possibility to run the shiny app in execMode
by setting the corresponding option in R. This allows to prevent exposing this explicitly to the package user. Only the executable version uses this option. When execMode
is set to TRUE
, the shiny app and the R session are shutdown when the user closes the browser window to prevent background processes to keep running in the executable version. Implemented by Adrien Lamit (@alamit) for FINMA in #301.
Favicon in the shiny app. Implemented by Adrien Lamit (@alamit) for FINMA in #301.
Initial spread computations for bonds in initialSpread
using Newton-Raphson algorithm implemented in newtonRaphson
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #293.
Keyword based excel parsing in excelToSstModel
. A new set of global variables is defined to simplify maintenance of the parser. Error handling is enhanced, exact position of the errors and warnings on the excel sheet is determined and tracked using an error log. Error messages are enhanced to be understandable by the excel user. Multiple errors and warning displayed at once to simplify input check for the user. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #293.
Initial spreads, MVM life, credit risk, expected insurance results now computed in the excel parser (excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #293.
Management in functions .onLoad
and .onUnload
of the default option parameter stringsAsFactors
so that the option is set to FALSE
when the package is loaded and the old state of the option is recovered when the package is unloaded. Implemented by Loris Michel (@lorismichel) for FINMA in #291.
Constructor of marketRisk
has a new parameter base.currency
specifying to which currency we expect the FX rate in the mapping.table
argument to map to. We also require now directly the covariance matrix cov.mat
as input of the marketRisk
constructor. This matrix should additionally have an attribute named base.currency
specifying the currency in which the covariance matrix is expressed (i.e. to which the FX risk-factor map to). Implemented by Loris Michel (@lorismichel) for FINMA in #279.
A new function changeBaseCurrency
allowing change of base-risk factors covariance matrix and update of mapping.table according to a change of base currency. Implemented by Loris Michel (@lorismichel) for FINMA in #279.
A new function conditionalReordering
implementing the conditional reordering algorithm with stressed multivariate normal copulas. Implemented by Loris Michel (@lorismichel) for FINMA in #279.
A new class macroEconomicScenarios
to allow defining a specific realization of the market risk-factor vector (called macroeconomic scenarios). It is possible to valuate a portfolio and obtain corresponding change in RBC according to these scenarios with a compute
method on macroEconomicScenarios
. Basic S3 methods for this class (print
,summary
,``format`) were also added. Implemented by Loris Michel (@lorismichel) for FINMA in #277 and #279.
The portfolio
class has now two new methods generateExpression
and generateFunction
allowing to generate the total valuation expression or valuation function for a given list of marketItems
in a portfolio. The valFunctions
for classes asset
, cashflow
, liability
, assetForward
, fxForward
and delta
were updated accordingly to integrate with these new methods. Additionally, two helper functions itemListToExpression
and itemListToFunction
were implemented. Implemented by Loris Michel (@lorismichel) for FINMA in #277 and #279.
Possibility to define non-life insurance risk via an Empirical Cumulative Distribution Function. Implemented by Loris Michel (@lorismichel) for FINMA in #276.
Warnings are now triggered when unrealistic volatilities potentially yielding infinite values are provided for the log-normal simulation parameters. Implemented by Loris Michel (@lorismichel) for FINMA in #276.
Message when loading the package linking to the NEWS.md
file. Please note that this functionality does not work when using devtools::load_all()
. Implemented by Loris Michel (@lorismichel) for FINMA in #253.
Copyright Notice is displayed when the package is installed. Implemented by Adrien Lamit (@alamit) for FINMA in #287.
Copyright notices of every libraries are displayed in the "Legal Notices" tab of the dashboard. Implemented by Adrien Lamit (@alamit) for FINMA in #287.
launchDashboard
now launches shiny
quietly. Prevents status messages from shiny from being displayed. Implemented by Adrien Lamit (@alamit) for FINMA in #287.
launchDashboard
now has an option shiny.quitOnSessionEnd
that allows the shiny app to quit when the browser displaying it is closed. Used for the executable version. Implemented by Adrien Lamit (@alamit) for FINMA in #287.
Download and new simulation buttons are now drawn in the sidebar when the simulation results are ready. Implemented by Adrien Lamit (@alamit) for FINMA in #317.
Participations are now evaluated comonotonically with the market risk. Implemented by Loris Michel (@lorismichel) for FINMA in #306.
Market-Value-Margin inputs for life, health and non-life instead of for their sum (see portfolio
). Implemented by Loris Michel (@lorismichel) for FINMA in #291.
Sensitivites in delta
, life
, health
and effects in scenarioRisk
are now required to be explicitely defined in the base currency. Implemented by Loris Michel (@lorismichel) for FINMA in #291.
Some of the parameters in sstModel
that were portfolio specific were moved to a new argument portfolio.parameters
in the constructor of portfolio
. Implemented by Loris Michel (@lorismichel) for FINMA in #279.
Max file size for shiny uploads set to 100MB, was 5MB by default. Implemented by Adrien Lamit (@alamit) and Melvin Kianmanesh Rad (@melvinkian) for FINMA in #267.
The function launchDashboard
does not take parameters anymore, execMode
option has to be used to customize the behaviour of the shiny app for the executable version. Implemented by Adrien Lamit (@alamit) for FINMA in #301.
Warnings on integer casting of variable time
in constructor of class cashflow
and liability
. Implemented by Loris Michel (@lorismichel) for FINMA in #279.
ggplot2
and DT
packages from dependencies for licensing compatibility. Plots are now drawn using the graphics
package which is preinstalled with R and tables are rendered using shiny default table rendering. Implemented by Adrien Lamit (@alamit) for FINMA in #256.
Bug in standalone constructor standalone
when list.arg = T
is now fixed. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #293.
Initial spread values are now provided in the constructor of cashflow
. Implemented by Loris Michel (@lorismichel) for FINMA in #275.
Removed warnings for negative liability
and negative cashflow
and grouped checks in constructor of asset
, cashflow
and liability
. Implemented by Loris Michel (@lorismichel) for FINMA in #272.
Corrected temporary sign patch in implementation of valInfo
, valExpression
and valFunction
for assetForward
and fxForward
Implemented by Loris Michel (@lorismichel) for FINMA in #271.
Incorrect error message when simulation was < 1'000, which was displaying the error message for simulations > 5'000'000. Implemented by Adrien Lamit (@alamit) for FINMA in #255.
Option to save in .xlsx
format additional simulation vectors from sstOutput
, using write
with parameter keep
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #249.
Possibility to save .xslx
files in write
with design and adaptive output depending on the risks defined as input. The excel output will be different based on which risks are defined and the presence or absence of participations. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #249.
Interface getters like getMarketRisk
, getDrbc
, can now be used to compute expected shortfall by reference. This reduces the calls to colnames(sstOutput$simulations)
, increases readability and makes the code more modular. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #249.
Standalone for each life and health insurance risk factor are now saved in the output using the closed form formula for the expected shortfall of normal random variables. Located in sstOutput
, the output of sstModel
under named vectors sstOutput$life.standalones
and sstOutput$health.standalones
. Note that they are present only if, respectively, those risks are defined (in portfolio
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #246.
Logical argument list.arg
in constructors mappingTable
and standalone
to allow passing a list of riskFactor
in those constructors through the ellipsis ...
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #241.
Possibility to compute market risk separately for each valuation term (asset prices, liability cash flows, fixed income cash flows, FX and asset forwards, delta term). This is available as an option in compute.sstModel
through the parameter nested.market.computations
, this has involved a new organization of the core computations in compute.marketRisk
. Implemented by Loris Michel (@lorismichel) for FINMA in #241.
Error handling in the dashboard, now the program won't crash if there is an error during the simulations. Implemented by Adrien Lamit (@alamit) for FINMA in #242.
Checks for semi-positive definite correlation matrices and corresponding error messages (see marketRisk
, lifeRisk
, healthRisk
and sstModel
). Implemented by Loris Michel (@lorismichel) for FINMA in #239.
Principal components can be defined for rates. A new riskFactor
pcRate
can be used to create base components that can be then reference in the riskFactor
rate
. This allows to model yield curves by providing their principal component decomposition. Implemented by Loris Michel (@lorismichel) for FINMA in #239.
Life sensitivities (in life
) are now considered to be values-at-risk instead of expected shortfalls, computations (in valInfo.life
) are modified accordingly. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #246.
All outputs of compute
S3 methods are now harmonized to be named data.table
objects. Implemented by Loris Michel (@lorismichel) for FINMA in #241.
Correction of checks in the constructor of mappingTable
to force all principal components defined in the mappingTable
in a specific currency to be used to define rates in that given currency. Implemented by Loris Michel (@lorismichel) for FINMA in #241.
Unexpected error in format.sstModel
. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #241.
Global variable need to be defined with utils::globalVariable
to pass the CRAN checks due to data.table
API. All variables used in data.table
expression are declared in file globalVar.R
. Implemented by Loris Michel (@lorismichel) for FINMA in #239.
launchDashboard
default browser is now Window mode instead of RStudio's setting. Linked with shiny
's Connection reset by peer
bug in browser and viewer pane modes. (@alamit #238).
sstModel
and can be read from the excel sheet (see sstModel
, compute.sstModel
, marketValueMargin
and excelToSstModel
). Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #231.Negative fixed cash flows are now allowed. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #223.
Positive liability cash flows are now allowed. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #223.
write
generic dispatch not working for write.sstOutput
, added generic definition. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #226.
Liability cash flows were evaluated with the wrong sign convention. Implemented by Melvin Kianmanesh Rad (@melvinkian) for FINMA in #223.
First development release.
The following files were added by Loris Michel (@lorismichel) and Adrien Lamit (@alamit) for FINMA.
README.md
file giving installation instructions and a quick user guide.LICENSE
file specifying that the software is licensed under GPL-3 License.DESCRIPTION
file specifying CRAN
details: authors, version, dependencies and more.NOTICE
file providing the GPL-3 required copyright notice.CONTRIBUTING.md
file specifying how one should behave to contribute to the project.The following features were implemented by Loris Michel (@lorismichel) and Melvin Kianmanesh Rad (@melvinkian) for FINMA.
This version allows computations of market risk, life, health and non-life insurance risks, their aggregation using the reordering algorithm with a Gaussian copula and the computation of solvency figures based on those computations.
Detailed list of features:
asset
, liability
, cashflow
, assetForward
, fxForward
, delta
, participation
, life
, health
; basic S3 methods format
, print
, summary
for those classes.currency
, rate
, spread
, equity
; scaled risk-factors, i.e. constant times another risk-factor can be defined.mappingTable
, standalone
; basic S3 methods format
, print
, summary
.marketRisk
; basic S3 methods format
, print
, summary
.
mappingTable
object.getInitialFX
, getInitialRate
, getInitialSpread
, getMappingTime
, getEquityName
, getEquityId
, getEquityScale
, getCurrencyName
, getCurrencyId
, getCurrencyScale
, getRateName
, getRateId
, getRateScale
, getSpreadName
, getSpreadId
, getSpreadScale
, getDeltaId
.simulate
method for class marketRisk
, returns a data.table
or matrix
of simulations for the base market risk-factors.scenarioRisk
; basic S3 methods format
, print
, summary
.
simulate
and compute
methods for scenarioRisk
, both returning simulations for the scenarios.lifeRisk
; basic S3 methods format
, print
, summary
.
healthRisk
; basic S3 methods format
, print
, summary
.
nonLifeRisk
; basic S3 methods format
, print
, summary
.
mu
and sigma
for negative lognormal distribution.simulate
method returns bootstrap from the user-defined vector of simulations or normal simulations with mean mu
and variance sigma^2
.compute
method for nonLifeRisk
returns i.i.d. with replacement bootstrap samples from the user-defined vector of simulations or negative log-normal simulations with parameters mu
and sigma
.check
boolean method for the coherence of each above-mentioned portfolio item with corresponding risk definition object.valInfo
methods for each item returning necessary information to valuate item with knowledge of corresponding risk-factor realization.compute
methods for lifeRisk
and healthRisk
using valInfo
to valuate output from simulate
.valFunction
method for each item returning a function of the risk-factors, the valuation function.valExpression
method for each market item (asset
, liability
, cashflow
, assetForward
, fxForward
, delta
); returns a data.table
expression for aggregating normal simulations by reference on the table of normal market risk-factors simulations produced using simulate.marketRisk
; those methods also return corresponding restricted expressions if provided S3 object standalone
in addition.compute
method for marketRisk
, taking as parameter a list of market items, and using valExpression
to valuate output from simulate
by reference using data.table
syntax.portfolio
listing different portfolio items and base currency for the portfolio; basic S3 methods format
, print
, summary
.sstModel
containing portfolio, list of risks and parameters necessary for the Monte Carlo simulations; basic S3 methods format
, print
, summary
.excelToSstModel
to parse the excel input template to an sstModel
object.compute
method for S3 class sstModel
returns an sstOutput
S3 object with the aggregated simulations for risk-bearing capital along with the standalone market and insurance risks vectors of simulations. Aggregation is done using helper function aggregateRisks
doing aggregation of market, life, health and non-life risks based on the reordering algorithm for a Gaussian copula; all steps are done by reference using data.table
syntax.expectedShortfall
and valueAtRisk
to compute expected shortfall and value at risk of a vector of simulations.marketValueMargin
, targetCapital
, riskCapital
, sstRatio
S3 methods for class sstOutput
to compute solvency figures by reference.write
S3 method for class sstOutput
to write a csv summary of the sstOutput
containing 0.01-expected shortfalls of standalone risks, means and solvency figures with and without scenario aggregation.The following features were implemented by Adrien Lamit (@alamit) for FINMA.
shiny
and shinydashboard
implementation.