本书致力于将这三个方面联系起来,形成一个统一的论述:(1)对VBA编程和协议的充分解释,或者是(2)金融知识应用的广度,或者是(3)对相关金融概念的解释,又或者是这三者的结合。
本书的前半部分以大量的应用为主,后半部分解释了VBA代码的用法(以作参考)。已经熟悉其他编程语言的读者可以通过本书前半部分的示例(第一和第二部分)来学习VBA编程。对于这类读者,本书的后半部分(即第三至六部分)可以当作过渡编程语言差异的参考,因为后半部分详细阐释了VBA的协议和语法。对于初学者来说,本书后半部分也是必不可少的,因为它提供了对VBA代码的解释。
对于金融领域工作的人来说,运用VBA进行金融建模的技巧非常重要。本书在金融概念、金融建模和VBA编程三个方面都提供了坚实的基础。本书还介绍了大量详实的应用案例。本书的特色之一是,提供了书中全部示例的完整模型,并配有相应的Excel文件。这些文件不仅有助于金融从业者扩展模型,还在教学中有利于学生构建新模型。相较于市面上的其他书籍,本书的优势是:在提供Excel VBA在金融建模中的应用指导的同时,详细解释了相关金融概念。
本书适用于金融专业的本科生和研究生,也能够帮助金融从业者获得工具和技能,以增强其应对新挑战的能力。
第一部分 VBA介绍
第1章 VBA概览3
1.1 VBA的结构4
1.2 入门设置5
1.2.1 开发工具选项卡5
1.2.2 VisualBasic选项5
1.3 VBE环境6
1.3.1 项目资源管理器6
1.3.2 VBA的模块6
1.3.3 属性窗口7
1.4 注释;代码行的组合与延长7
1.4.1 撇号:注释7
1.4.2 冒号:将可执行的代码行并置8
1.4.3 下划线:代码行的延续8
第2章 一个例子:债券久期的计算9
2.1 麦考利久期,修正久期和凸度9
2.1.1 麦考利久期和修正久期9
2.1.2 凸度11
2.1.3 债券价格-收益率的近似曲线11
2.2 一个例子:债券收益率,久期,凸度12
2.3 VBA代码:债券收益率,久期,凸度15
第二部分 VBA的应用举例
第3章 关于NPV、IRR的VBA子程序31
3.1 净现值,内部收益率32
3.2 Excel工作表:项目NPV和IRR 33
3.3 VBA代码:现金流,现值,NPV和IRR 37
3.4 VBA代码:关于NPV的模拟运算表42
3.5 VBA代码:关于IRR的单变量求解48
3.6 Excel工作表:两个IRR 52
3.7 规划求解的VBA代码:存在两个IRR的情形55
第4章 VBA中的数组函数与被调用函数63
4.1 NPV:作为5项输入信息的函数63
4.2 VBA代码:NPV函数65
4.3 数组函数:NPV和IRR 66
4.4 调用其他程序的VBA程序:BSM 69
4.4.1 看涨期权溢价:Black-Scholes-Merton模型70
4.4.2 看跌期权溢价:Black-Scholes-Merton模型71
4.5 BSM函数与被调用函数72
4.6 VBA代码:BSM函数73
第5章 VBA程序中的数值分析方法76
5.1 牛顿-拉夫逊方法76
5.2 二分法79
5.2.1 第一阶段80
5.2.2 第二阶段80
5.3 通过数值分析方法计算项目IRR 82
5.3.1 VBA代码:牛顿-拉夫逊方法83
5.3.2 VBA代码:二分法87
5.4 另一个“自制的”NPV函数88
5.5 调用二分法函数的函数:隐含波动率89
5.5.1 二分法的再讨论89
5.5.2 隐含波动率90
5.6 Excel与VBA:隐含波动率91
第6章 有效投资组合;用于VBA循环内部的规划求解96
6.1 多资产的均值-方差投资组合96
6.2 均值-方差有效投资组合的权重98
6.3 VBA:均值-方差有效投资组合98
6.4 VBA代码:有效投资组合102
第7章 模拟时间序列股价路径106
7.1 股价的对数正态分布106
7.2 均值,方差,协方差,相关系数107
7.3 VBA代码:模拟股价路径108
第8章 二叉树模型;美式期权113
8.1 二项式股票定价模型113
8.2 风险中性二项式模型参数115
8.3 多期二叉树期权定价模型117
8.4 美式期权价值118
8.5 举例:美式期权价值119
8.6 VBA代码:美式期权价值121
第9章 蒙特卡洛分析,中心极限定理125
9.1 蒙特卡洛分析125
9.2 估计圆周率Pi;中心极限定理127
9.3 工作表:估计圆周率Pi;中心极限定理128
9.4 VBA代码:估计圆周率Pi;中心极限定理129
第10章 路径依赖期权135
10.1 路径依赖期权的收益135
10.2 蒙特卡洛分析下的收益13
10.3 示例:路径依赖期权138
10.4 VBA代码:路径依赖期权140
第11章 即期利率,利率二叉树,嵌入期权146
11.1 到期收益率,ytm 146
11.2 即期利率148
11.3 远期利率和贴现因子150
11.4 短期利率二叉树153
11.5 债券价值二叉树155
11.6 模型:ytm,即期利率,远期利率,二叉树156
11.6.1 模型:到期收益率,ytm 157
11.6.2 模型:即期利率157
11.6.3 模型:远期利率157
11.6.4 模型:利率二叉树158
11.6.5 模型:债券价值二叉树159
11.7 VBA代码:ytm,即期利率,远期利率,二叉树162
11.8 零波动率利差,Z-spread 167
11.9 期权调整价差,OAS 168
11.10 总结:Z-spread,OAS,期权价值169
11.11 模型:债券价值计算170
11.12 债券价值总结176
11.13 VBA代码:债券价值计量178
11.14 二叉树模型的条件概率183
第12章 数组和矩阵函数:即期利率和远期利率185
12.1 即期利率的数组函数185
12.2 VBA代码:即期利率的数组函数187
12.3 远期利率的数组函数191
12.4 VBA代码:远期利率的数组函数192
12.5 矩阵函数:即期利率和远期利率193
12.6 VBA代码:即期利率和远期利率的矩阵函数194
第三部分 附注:工作簿;数组;VBA程序
第13章 启用宏的工作簿199
13.1 打开启用宏的工作簿199
13.2 运行VBA编码的程序199
13.3 分配运行按钮给子程序200
13.4 保存启用宏的工作簿201
第14章 数组;声明;传递变量202
14.1 数组变量202
14.1.1 通过范围对象分配的二维数组变量203
14.1.2 动态数组204
14.1.3 数组边界205
14.2 变量及函数数据类型205
14.3 可变范围206
14.3.1 声明语句Dim 207
14.3.2 声明语句Static 207
14.3.3 声明语句Public 207
14.4 总结:变量声明语句208
14.5 函数范围209
14.6 将参数传入和传出程序209
14.6.1 变量的内存地址210
14.6.2 重新回顾公共变量211
14.6.3 按照值传递:共享内存地址的变量212
14.6.4 传递变量总结:Default,Public,ByVal 212
14.6.5 可选参数212
第15章 VBA程序;子程序214
15.1 子程序和函数共有的特征214
15.2 退出声明215
15.3 运行并调用子程序216
15.3.1 运行子程序216
15.3.2 在程序间传递变量217
15.3.3 调用子程序217
第16章 函数220
16.1 函数的一般结构221
16.2 函数的附加特征223
16.3 添加函数描述224
16.4 访问用户定义的函数224
16.5 比较子程序和函数225
16.6 数组函数225
16.7 灵活的数组函数227
第17章 宏232
17.1 录制宏233
17.1.1 个人宏工作簿233
17.1.2 自定义录制的宏234
17.1.3 录制宏的无效性:格式化,绘图234
17.2 在VBA代码中禁止弹出框239
第四部分 参考:调试;VBA环境
第18章 工具栏和调试工具243
18.1 标准工具栏243
18.2 编辑工具栏244
18.3 调试工具栏245
18.3.1 进入245
18.3.2 越过(“通过”) 246
18.3.3 退出(“完成”) 246
18.3.4 从主菜单的调试上运行至光标247
18.4 执行:暂停与完成247
18.5 暂停:停止与断点249
18.6 进行调试的窗口250
18.6.1 本地窗口250
18.6.2 即时窗口250
18.6.3 监视窗口251
18.7 消息框252
18.8 编辑替换252
第19章 InputBox,MsgBox,数据验证253
19.1 VBA消息框函数:MsgBox 253
19.2 VBA预定义常量254
19.2.1 用于设计消息框的常见输入常量255
19.2.2 消息框的常用输出常量257
19.3 VBA输入框函数:InputBox 259
19.4 MsgBox和InputBox的对比261
第20章 引用样式与引用模式262
20.1 引用样式:A1引用与R1C1引用262
20.2 引用模式:绝对引用与相对引用263
20.3 引用模式:混合引用264
20.4 R1C1样式的再讨论266
20.4.1 在R1C1引用样式下的相对引用模式266
20.4.2 在R1C1引用样式下的绝对引用模式267
20.4.3 在R1C1引用样式下,绝对引用与相对引用的比较267
20.4.4 在R1C1引用样式下的混合引用模式267
20.5 在Excel工作表中练习引用样式和引用模式268
第五部分 参考:VBA中的分支和循环
第21章 条件编程:分支273
21.1 “If”语句274
21.2 “If”模块275
21.2.1 “ElseIf”语句与“Else”语句276
21.2.2 附加“If”模块例子276
21.3 嵌套“If”语句279
21.4 SelectCase 280
21.5 比较:“If”模块和SelectCase 282
21.6 举例:比较“If”模块和SelectCase 283
21.7 “GoTo”语句284
第22章 “For循环”和“With循环” 286
22.1 “For循环” 286
22.2 连续和嵌套“For循环” 288
22.3 “With循环” 289
第23章 “Do循环” 292
23.1 “Do循环”的构建293
23.2 退出条件“If”,“While”,“Until” 293
23.2.1 通过“If”语句退出“Do循环” 293
23.2.2 通过“While语句退出“Do循环” 295
23.2.2.1 “Do”代码行上的“While”语句295
23.2.2.2 “Loop”代码行上的“While”语句296
23.2.3 通过“Until”语句退出“Do循环” 296
23.2.3.1 “Do”语句行上的“Until”语句297
23.2.3.2 “Loop”语句行上的“Until”语句297
23.3 拓展示例:“For循环”和“Do循环” 298
23.4 总结:“Do”Vs.“Loop”语句行;“While”Vs.“Until”语句303
第24章 范围对象305
24.1 范围对象属性306
24.2 范围对象方法307
24.3 命名区域309
24.4 将范围赋给变量:二维数组变量310
24.5 通过“Set”语句定义“设定”变量310
24.6 “Cells”属性并非对象311
第25章 ForEach循环313
25.1 简单举例314
25.2 范围对象集合和数组变量集合316
25.3 示例:“设定”变量(范围对象)集合319
25.4 总结“范围”集合320
25.4.1 范围对象集合321
25.4.2 “设定”数组变量集合321
25.4.3 直接将范围赋值为集合产生(二维)数组变量321
25.5 其他举例322
25.6 嵌套ForEach循环323
25.7 提高循环效率325
第六部分 参考:VBA编码和功能
第26章 数据表、单变量求解及规划求解331
26.1 将公式放入单元格331
26.2 数据表332
26.2.1 一维数据表333
26.2.2 二维数据表334
26.3 VBA的单变量求解335
26.4 VBA规划求解335
第27章 其他Excel和VBA功能338
27.1 运算符338
27.2 文本及文本属性339
27.3 其他功能339
第28章 VBA代码协议341
28.1 常见错误摘要:Excel&VBA 341
28.2 常见VBA对象、属性和方法341
参考文献和相关阅读345
术语表349