只需选择要计算的寿险或年金,就能自动输出EPV期望现值的运算过程和结果。
自从 IFoA 英国精算师考试改为全面在线开卷考试后,在 Word 上输入符号成为一大难题。按照协会的要求,数学公式需要用类似 LaTex
代码的形式写在word上,详见《IFoA 考试符号输入标准写法》。可以看到,敲符号最繁琐的科目是 CM1: Actuarial Mathematics 利息理论与寿险精算。
查表计算 EPV 的例子
例如,当你做题时需要用到保险金额为1,50岁购买保险,死亡年度末给付的20年期的定期寿险的期望现值 \(\Ax{}{}{}{\term{50}{20}}\), 定价假设为:Mortality AM92 和 Rate of interest 4% per annum. 因为 \(x+n\neq 60\) 并且 \(x+n\neq 65\), 无法直接查 Formulae and Tables, 所以首先我们写出计算过程(寿险和年金如何查表计算将在下期的《寿险精算知识点串讲(II)》中详细讲解): \[ \begin{aligned} \Ax{}{}{}{\term{50}{20}}&=A_{50} - \actsymb{20|}{}{A}{}{50}\\ &=A_{50} - v^{20}\cdot \px{20}{50}\cdot A_{70}\\ &=A_{50} - v^{20}\cdot \frac{l_{70}}{l_{50}}\cdot A_{70}\\ &=0.32907 - 1.04^{-20}\times \frac{8054.0544}{9712.0728}\times 0.60097\\ &=0.10162 \end{aligned} \]
然后我们需要把这段计算过程写成 IFoA 要求的 Word 输入格式规范:
Using the following equation:
TA:x :< n> = A:x - n|A:x = A:x - v^n * npx * A:x+n = A:x - v^n * Lx+n/Lx * A:x+n
Then:
TA:50 :< 20> = A:50 - 20|A:50 = A:50 - v^20 * 20p50 * A:70 = A:50 - v^20 * L70/L50 * A:70
= .32907- 1.04^(-20) * 8054.0544/ 9712.0728* .60097= .10162
在分秒必争的考试中,如此输入符号非常消耗时间。
如果只需选择要计算的符号,就能自动输出运算过程和结果,那该多好呀!
经过 Jackie 和珂珂的努力,这款自动生成 EPV 符号计算过程的计算器诞生啦!
效果展示
这个工具的操作步骤非常简单:
- Step 1: 点击计算器图标 Click the Calculator icon
- Step 2:
- Step 2-1: 选择产品类型 Choose Product type,
- Step 2-2: 输入产品特征 Enter Policy feature,
- Step 2-3: 选择定价假设 Choose Pricing basis,
- Step 3: 点击计算按钮 Click the Calculate button
就可以直接输出我们想要的运算过程和结果啦!我们以上文提过的 \(\Ax{}{}{}{\term{50}{20}}\) 为例,直接在我们的 EPV 计算器里操作:
是不是非常方便!
VBA 技术要点总结
那么这样一款 EPV 计算器的功能是如何实现的?核心是要梳理查表计算的精算逻辑,用到的 VBA 其实并不复杂。用 Excel VBA 实现该功能的技术要点为:
- VBA用户界面介绍
- 在 VBA 中实现查表
- VBA列表框 (ListBox) 介绍;选择寿险和年金类别
- VBA用户界面生成可复制的文本
下面我们对技术要点进行详细介绍。
VBA 用户界面介绍
我们点击按钮后会出现下面这个用户窗体。那么这个用户窗体是怎样创建的呢?
首先打开我们的VBE(VBA Editor),这里可以新建一个用户窗体。(Userform)
建好用户窗体后,它就会出现在Forms的下面。我们可以在下面的属性窗口给它改个名字,
注意这里(Name)和Caption的区别,Name是从代码中调用此用户窗体时用到的名字,而Caption是用户会看到的窗体的名称。
所有用户窗体上的元素都可以通过ToolBox来设计
可以在这里设计各种各样的用户可以进行交互的界面
双击里面的任意元素,就可以进入代码编辑界面。这里可以编辑所有事件,包括点击,双击,拖动元素。
事件可以在这里选择
选择好之后,就可以用代码编辑每个事件发生后会有怎样的效果。用得最多的是Click事件,可以设定单击一个元素后会发生什么。
在 VBA 中实现查表
VBA里面有很多种实现查表的方法,比如利用字典/数组等。
不过因为在制作这个工具的时候,不需要很大的数据量,速度不会成为一个约束条件。所以我们就用了最简单的Vlookup方法。
这里涉及到的一个知识点是很多工作表中可以使用的函数,放到VBA中不能直接使用,需要的调用方法是
1 | Application.WorksheetFunction.<Function Name> |
比如
1 | Application.WorksheetFunction.vlookup() |
这个工具使用了查表的方式来查到想要的Ax, ax的值,比如
1 | Function aduex(x, table) |
这里其实可以看到,为了简化代码,有规律地命名工作簿非常重要。
VBA 列表框 (ListBox) 介绍;选择寿险和年金类别
Tool里面的如下红框框住的部分,就是VBA用户窗体中的列表框,当我们选择不同选项的时候(年金或者寿险),列表框会相应出现不同的选项,那么这个是如何实现的呢?
首先要从Tool Box里面选择ListBox,拖动到用户窗体中;
单击这个Listbox后,查看属性窗口,可以看到这个ListBox的名字叫做ListBox1
双击第一个OptionButton进入代码编辑页面:
代码框会自动出现如下代码
1 | Private Sub OptionButton1_Click() |
这个代码代表的就是我们单击"Assurance"后会发生什么。
插入下面这段代码(注意,ListBox1是我们插入的ListBox的名字)
1 | ListBox1.List = Array("Endowment","Life Assurance") |
单击"Assurance"后,我们插入的列表框内就会出现Endowment和Life Assurance两个选项。
生成可复制的文本
最后生成的Output是用"TextBox"来实现的。
我们既可以用TextBox生成可复制粘贴出来,可修改的文字,也可以生成只读的文字。只需要修改”Enabled"这个属性即可。"True"代表这个文本框是可复制粘贴出来,可修改的;"False"就是只读的形式。
后续更新计划
- 支持更多生命表:如ELT15 PMA92C20 PFA92C20
- 支持保额单利递增和复利递增的寿险和年金的计算
- 支持双生命寿险和年金的计算
- 支持连续型寿险的计算,每年支付m次的年金的计算
- 增加更多题型的自动计算功能,如非整数年龄的生命表函数(UDD和CFM假设)
获取方式
注意,此工具仅供技术交流,不得以任何形式用于 IFoA 考试。
如需获取本工具的Excel文件,按以下步骤操作即可:
- 无分组转发推文到朋友圈,集赞58个
- 添加 Jackie 微信号:AGJackie
- 发送集赞截图后,等待 Jackie 回复即可
正在检查 Disqus 能否访问...