一个精算模型是许许多多变量的组合,而这些变量根据其承担的功能大致可以分为以下4类(见图5.1.1):
①保单信息变量;
②假设或参数变量;
③中间计算变量;
④结果输出变量。
图5.1.1 精算模型变量分组及案例
(1)保单信息变量从保单模型点文件中直接读取结果。这类变量一般在整个保险期间的计算过程中取值保持不变。从模型运行效率的角度考虑,建议确保这些变量在每条保单模型点运行过程中仅执行一次读取保单模型点文件的操作。
(2)假设或参数变量是指从各类假设表或参数表读取数值的变量。假设或参数一般存在以下3种类型:
①全局型假设/参数。这类假设或参数一般仅与特定的运行任务相关。这类假设或参数在整个运行过程中适用于所有产品、所有保单模型点。定义这类变量时,应避免每条保单模型点运行过程中都进行重复读取动作。这类假设中典型的例子是内含价值的风险贴现率假设。
②产品层级的假设/参数。这类假设或参数指的是与产品相关的假设,一般包括定价利率、评估利率、法定准备金评估方法等。有的精算模型为了减少各类假设表的行数,往往从每类假设角度出发,对产品予以分门别类。这种产品类别标示变量也属于产品层级参数。在有些精算软件中,每个产品对应一个模型,同一产品的保单模型点在同一段时间内集中运行。在这种情况下,这类假设/参数应尽量在每个产品运行第一条保单模型点的时候进行读取,在后续模型点运行中不必读取。
③复杂假设/参数。这类假设或参数往往与多个因素相关。这些因素可能与保单模型点信息相关,也可能与保单所处的时间点相关。对于与这类假设相关的变量,建模时需格外注意其相关因素。例如,如果其取值与保单所处时间点不相关,则应尽量确保运行每个保单模型点时,该假设仅读取一遍;反之,则需在不同的时间点重复读取。
(3)中间计算变量是指在保单信息变量和假设变量以外,同时不需在结果文件中保留结果的变量。这类变量往往是引用各种变量通过计算公式进行定义。根据计算公式的复杂程度,这类变量可以分成简单变量和复杂变量两类:
①简单变量指的是计算逻辑相对简单,其公式中仅包含简单的文本运算、数值运算和判断语句等;
②复杂变量往往包含各类循环语句,其计算功能强大,类似于一般程序语言中的自定义函数或过程。
中间变量的存在可以让代码的计算逻辑更加清晰,如对于分红产品的保单现金流预测,最终的输出结果只需要每年年末的红利,但为了理顺红利的计算逻辑,可以增加红利的利差部分、死差部分、费差部分等若干中间变量。中间变量的存在还有一种原因是精简单个变量的代码复杂程度。在精算模型设计时,我们建议一般情况下单个变量的代码长度不超过100行,否则建议拆分该变量,以确保代码具有较好的可读性。(www.xing528.com)
(4)结果输出变量是指在结果文件中需要保留结果的变量,可以用于生成各种报告。这类变量既可以直接引用中间计算变量,也可以是各种复杂的计算公式。对结果输出变量,应格外关注两类变量属性的设置:
①时点值(资产负债表Balance Sheet类型变量)还是时期值(利润表P&L类型变量)。从会计属性角度看,类似准备金余额这样的变量应设置为时点值,类似于保费收入这样的收支类变量应设置为时期值。
②可累加性。指的是不同模型点之间的结果是否可以累加。一般来说,结果输出变量应为可累加变量,而中间计算变量则不必。各类准备金因子、附加费用率因子等一般作为不可累加变量。
为增加模型的可读性及模型使用者的直观性考虑,变量命名应遵从一定的规则。常用的变量命名规则包括如下:
①变量命名总体上应遵从简洁、直观的原则;
②使用下划线“_”做分隔符,例如PREM_INC_PP;
③变量名中的前缀后缀应有一定的规范,比如将用途作为名称前缀:用“CLM_”代表与产品责任给付相关的变量,“AOC_”代表与变动分析过程中的保单变动相关的变量,用“VAL_”代表与法定准备金计算相关的变量等;后缀则可以表示变量的特征:用“_PP”代表基于每张有效保单数值的变量,“_IF”代表基于有效业务数的变量,“_M”或者“_MTH”代表月数变量等。当建立新变量时,需查看已有变量是否已含有合适的前缀或后缀,以保持变量命名的一致性;
④变量名称长度不宜过长。
变量代码的编写也应遵从一些约定的规则,例如:
①除零的安全性:当公式内含有除法时,需要检查分母是否为0,并进行合理处理。如果该值是需要多步计算并且不为负的结果,但是有可能存在四舍五入的错误,建议用MAX函数确保该值等于或大于0;
②使用“IF”语句时,为及时发现潜在错误,建议列举所有的可能性之后使用“ELSE”显示遇到无法处理情景时的错误信息;
③在模型处理中,简单的四则运算(加、减、乘、除)比处理复杂运算(乘方、开方、累加、累乘、指数运算和对数运算等)的效率高,同时简单的运算易于使用者理解,在代码编写中,应尽量采用简单运算,避免复杂运算;
④在建模过程中应尽量避免死代码(Hard-coding),比如,将某些假设或参数的值直接写死在变量代码中,产品名称直接出现在变量代码中等;
⑤避免在同一简单计算变量中同时执行读表与计算的操作;
⑥尽量减少读表次数;
⑦避免重复相同的计算。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。