只需选择要计算的寿险或年金,就能自动输出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
2
3
4
5
6
7
8
Function aduex(x, table)
Dim rg As Range
Set rg = ThisWorkbook.Worksheets(table + "-EPV").Range("A:G")
'我们把所有的死亡率表放到了命名为xxx-EPV的工作表中

aduex = Application.WorksheetFunction.VLookup(x, rg, 5, 0)

End Function

这里其实可以看到,为了简化代码,有规律地命名工作簿非常重要。

VBA 列表框 (ListBox) 介绍;选择寿险和年金类别

Tool里面的如下红框框住的部分,就是VBA用户窗体中的列表框,当我们选择不同选项的时候(年金或者寿险),列表框会相应出现不同的选项,那么这个是如何实现的呢?

首先要从Tool Box里面选择ListBox,拖动到用户窗体中;

单击这个Listbox后,查看属性窗口,可以看到这个ListBox的名字叫做ListBox1

双击第一个OptionButton进入代码编辑页面:

代码框会自动出现如下代码

1
2
3
Private Sub OptionButton1_Click()

End Sub

这个代码代表的就是我们单击"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文件,按以下步骤操作即可:

  1. 无分组转发推文到朋友圈,集赞58个
  2. 添加 Jackie 微信号:AGJackie
  3. 发送集赞截图后,等待 Jackie 回复即可

交流区

交流请移步至精算后花园论坛 https://actuaryunion.com