金融财务建模与计算 - 文曲经典数字图书馆

320
财经信息化教材系列 金融财务建模与计算 ——基于 VBA MATLAB 实现 朱顺泉 编著 本书主编:王海林 续慧泓 北京 · BEIJING Publishing House of Electronics Industry

Transcript of 金融财务建模与计算 - 文曲经典数字图书馆

财经信息化教材系列

金融财务建模与计算 ——基于 VBA 与 MATLAB 实现

朱顺泉 编著

本书主编:王海林 续慧泓

北京·BEIJING Publishing House of Electronics Industry

内 容 简 介

本书向读者介绍投资组合、资产定价、期权定价、固定收益证券、信用评级等金融财务模型的建

立及其在 VBA 和 MATLAB 中的计算方法。主要内容包括:现代金融财务理论与模型概述;投资组合

收益率和方差计算及其 VBA 实现;投资组合有效边界模型及其 VBA 实现;投资组合风险优化决策模

型及其 VBA 实现;投资组合风险价值模型及其 VBA 实现;资本资产定价模型的建立及其 VBA 实现;

Black-Scholes 期权定价模型及其 VBA 实现;二叉树(二项式)期权定价模型及其 VBA 实现;期货套

期保值计算的 VBA 实现;投资项目决策与理财模型的建立及其 VBA 实现;固定收益证券计算的

MATLAB 实现;投资组合计算的 MATLAB 实现;金融衍生品计算的 MATLAB 实现;期权定价有限

差分计算的 MATLAB 实现;期权定价蒙特卡罗模拟计算的 MATLAB 实现;上市公司信用度量模型及

其 MATLAB 应用。 本书是一本供金融工程、金融学、财务管理、会计学、统计学、数量经济学、管理科学与工程、

应用数学、信息管理与信息系统等各专业的本科生与研究生学习的教材或参考书。同时,也可供从事

金融财务业务的在职人员及从事金融财务业务的信息技术人员参考。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。 图书在版编目(CIP)数据 金融财务建模与计算:基于 VBA 与 MATLAB 实现/朱顺泉编著.—北京:电子工业出版社,2009.1 ISBN 978-7-121-07697-8 I. 金… Ⅱ. 朱… Ⅲ. ①BASIC 语言-应用-金融-经济模型 ②BASIC 语言-应用-企业管理: 财务管理-经济模型 ③金融-计算机辅助计算-软件包,MATLAB ④企业管理:财务管理- 计算机辅助计算-软件包,MATLAB Ⅳ. F830-39 F275-39 中国版本图书馆 CIP 数据核字(2008)第 172097 号

策划编辑:张 毅 责任编辑:侯丽平 印 刷: 装 订: 出版发行:电子工业出版社

北京市海淀区万寿路 173 信箱 邮编 100036 开 本:787×1092 1/16 印张:20.25 字数:518.4 千字 印 次:2009 年 1 月第 1 次印刷 印 数:4000 册 定价:35.00 元

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联

系,联系及邮购电话:(010)88254888。 质量投诉请发邮件至 [email protected],盗版侵权举报请发邮件至 [email protected]。 服务热线:(010)88258888。

前 言

现代金融财务建模与计算是金融经济学、数学、统计学和计算机科学等学科的交叉课

程。例如,投资组合要涉及很复杂的矩阵计算和数理统计知识;最优投资组合、期货的套

期保值策略等要涉及方差、协方差、优化的计算;资本资产定价模型要涉及方差、协方差

和回归分析的知识;期权定价计算要用到随机过程、偏微分方程和数值分析,期权定价的

二项式模型要进行一系列的递推计算。因此,应用计算机技术(VBA、MATLAB 工具)进

行金融建模与计算,不断提高广大经济、管理、信息类大学生(尤其是金融类、财务类大

学生)与金融信息从业人员的素质,是新时期金融工作的需要。本书试图在现代金融理论

(投资组合、资产定价、期权定价、固定收益证券、信用评级等理论)的基础上,建立各种

实用的金融计算模型,如投资组合的有效前沿(边界)、最优投资组合决策、风险价值模型、

期权定价模型,应用 Excel VBA、数学软件 MATLAB 7 等工具编制金融计算程序,并进行

计算机求解。

本书的主要特色是:将金融财务与计算机技术有机地结合起来,强调以现代金融财务

实际问题(投资组合、资产定价、期权定价、固定收益证券、信用评级等)为导向,应用

计算机软件工具解决实际问题,实现计算机技术与投资组合、资产定价、期权定价、固定

收益证券、信用评级等问题的有机融合,让掌握金融财务知识的人员来学习计算机应用知

识,让掌握计算机知识的人员来学习金融财务知识。通过学习本书的内容,读者既可以熟

悉并巩固现代金融财务领域的大部分理论,又可以学习计算机及编程等知识,读者能轻松

使用 VBA 和 MATLAB 来实现有关金融财务的计算。本书内容包括:现代金融财务理论与

模型概述;投资组合收益率和方差计算及其 VBA 实现;投资组合有效边界模型及其 VBA

实现;投资组合风险优化决策模型及其 VBA 实现;投资组合风险价值模型及其 VBA 实现;

资本资产定价模型的建立及其 VBA 实现;Black-Scholes 期权定价模型及其 VBA 实现;二

叉树(二项式)期权定价模型及其 VBA 实现;期货套期保值计算的 VBA 实现;投资项目

决策与理财模型的建立及其 VBA 实现;固定收益证券计算的 MATLAB 实现;投资组合计

算的 MATLAB 实现;金融衍生品计算的 MATLAB 实现;期权定价有限差分计算的 MATLAB

实现;期权定价蒙特卡罗模拟计算的 MATLAB 实现;上市公司信用度量模型及其 MATLAB

应用。

IV

本书是一本供金融工程、金融学、财务管理、会计学、统计学、数量经济学、管理科

学、应用数学、信息管理与信息系统等各专业的本科生与研究生学习的教材和参考书。同

时,也可供从事金融财务业务的在职人员及从事金融财务业务的信息技术人员参考。

限于作者的水平,书中不当甚至错误之处在所难免,诚恳期待广大读者提出宝贵意见。

作 者 2008 年 12 月

V

目 录

第 1 章 现代金融财务理论与模型概述................................................................................................... 1

1.1 现代金融财务理论的发展历史 .................................................................................................. 1 1.2 现代投资组合模型 ......................................................................................................................... 3 1.3 资本资产定价模型 ......................................................................................................................... 4 1.4 套利定价模型 .................................................................................................................................. 5 1.5 布莱克-舒尔斯的期权定价模型 ................................................................................................ 5 1.6 代理理论 ........................................................................................................................................... 6 1.7 资本结构理论 ................................................................................................................................. 6 1.8 法玛的有效市场假说 .................................................................................................................... 6 1.9 久期、凸度和利率期限结构 ...................................................................................................... 7 本章小结 ..................................................................................................................................................... 8

第 2 章 投资组合收益率和方差计算及其 VBA 实现 ......................................................................... 9

2.1 单个证券连续复利收益率的计算模型 ................................................................................... 9 2.2 协方差的计算模型 ...................................................................................................................... 10 2.3 投资组合收益率和标准差的计算模型 ................................................................................. 10 2.4 投资组合收益率和方差计算的 VBA 实现 .......................................................................... 12 2.5 模型的应用举例 ........................................................................................................................... 15 本章小结 ................................................................................................................................................... 17

第 3 章 投资组合有效边界模型及其 VBA 实现 ................................................................................ 18

3.1 投资组合最小方差集合与有效边界 ...................................................................................... 18 3.2 投资组合有效边界模型的 VBA 实现 ................................................................................... 22 3.3 模型的应用举例 ........................................................................................................................... 26 本章小结 ................................................................................................................................................... 28

第 4 章 投资组合风险优化决策模型及其 VBA 实现 ....................................................................... 29

4.1 单项投资的期望回报率与风险 ............................................................................................... 29 4.2 一组投资(即多项投资)的期望回报与风险 .................................................................... 30

VI

4.3 用电子表格计算期望值、方差、标准方差和相关系数 ................................................. 31 4.4 投资组合优化的非线性规划模型及其 VBA 实现 ............................................................ 35 4.5 通用投资组合优化决策模型及其 VBA 实现 ..................................................................... 41

4.5.1 最优投资组合的确定 ............................................................................................................ 41 4.5.2 通用投资组合风险的最优化模型的 VBA 实现 .................................................................. 42 4.5.3 通用投资组合风险的最优化模型的应用举例 .................................................................... 45

4.6 通用投资组合优化决策信息系统及其 VBA 实现 ............................................................ 46

4.6.1 设计自定义菜单 .................................................................................................................... 46 4.6.2 设计基本数据输入窗体 ........................................................................................................ 47 4.6.3 基本数据输入窗体的程序代码设计 .................................................................................... 48 4.6.4 为自定义菜单指定宏 ............................................................................................................ 51 4.6.5 最优投资组合决策信息系统应用举例 ................................................................................ 53

本章小结 ................................................................................................................................................... 54

第 5 章 投资组合风险价值模型及其 VBA 实现 ................................................................................ 55

5.1 投资组合风险价值概述 ............................................................................................................. 55

5.1.1 投资组合风险价值的一般公式 ............................................................................................ 55 5.1.2 分散风险价值和非分散风险价值 ........................................................................................ 56 5.1.3 风险价值的估计方法 ............................................................................................................ 57 5.1.4 风险价值估计时需要注意的几个问题 ................................................................................ 57

5.2 风险价值的基本计算模型及其 VBA 实现 .......................................................................... 58

5.2.1 模型结构设计 ........................................................................................................................ 58 5.2.2 模型应用举例 ........................................................................................................................ 59

5.3 风险价值的方差-协方差计算模型及其 VBA 实现 .......................................................... 59

5.3.1 模型结构设计 ........................................................................................................................ 59 5.3.2 程序代码设计 ........................................................................................................................ 60 5.3.3 模型应用举例 ........................................................................................................................ 62

5.4 风险价值的历史数据模拟计算模型及其 VBA 实现........................................................ 64

5.4.1 模型结构设计 ........................................................................................................................ 64 5.4.2 程序代码设计 ........................................................................................................................ 65 5.4.3 模型应用举例 ........................................................................................................................ 67

5.5 风险价值的蒙特卡罗模拟计算模型及其 VBA 实现........................................................ 68

5.5.1 投资组合风险价值的蒙特卡罗模拟的原理 ........................................................................ 68 5.5.2 模型结构设计 ........................................................................................................................ 69 5.5.3 计算过程进度条设计 ............................................................................................................ 69

VII

5.5.4 程序代码设计 ........................................................................................................................ 70 5.5.5 蒙特卡罗的黑箱计算模型 .................................................................................................... 73 5.5.6 模型应用举例 ........................................................................................................................ 75

5.6 股票价格的蒙特卡罗模拟计算模型及其 VBA 实现........................................................ 77

5.6.1 股票价格的随机模拟方法 .................................................................................................... 77

5.6.2 股票价格的随机模拟模型设计 ............................................................................................ 78

5.6.3 模型应用举例 ........................................................................................................................ 79 本章小结 ................................................................................................................................................... 80

第 6 章 资本资产定价模型的建立及其 VBA 实现 ............................................................................ 81

6.1 资本资产定价模型的假设条件 ............................................................................................... 81

6.2 夏普资本资产定价模型的推导 ............................................................................................... 84

6.3 投资组合收益与风险之间的关系 ........................................................................................... 86

6.4 资本资产定价模型的 VBA 实现 ............................................................................................ 87

6.5 模型应用举例 ............................................................................................................................... 92

本章小结 ................................................................................................................................................... 94

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现 .................................................................... 95

7.1 Black-Scholes 期权定价模型 .................................................................................................... 95

7.1.1 Black-Scholes 期权定价模型的 Excel 实现过程 ................................................................. 96

7.1.2 期权价格和内在价值随时间变化的比较分析 .................................................................... 96 7.2 运用 VBA 程序计算看涨、看跌期权价格 .......................................................................... 97

7.3 运用单变量求解计算股票收益率的波动率 ........................................................................ 99

7.4 运用二分法 VBA 函数计算隐含波动率 ............................................................................. 101

7.5 运用牛顿法计算隐含波动率 .................................................................................................. 103

7.6 运用科拉多-米勒公式计算隐含波动率 ............................................................................. 104

7.7 隐含波动率计算模型 ................................................................................................................ 105

7.7.1 模型结构设计 ...................................................................................................................... 105

7.7.2 模型应用举例 ...................................................................................................................... 107 7.8 期权定价的蒙特卡罗模拟模型 ............................................................................................. 107

7.8.1 期权价格的随机模拟方法 .................................................................................................. 107

7.8.2 模型结构设计 ...................................................................................................................... 108

7.8.3 模型应用举例 ...................................................................................................................... 109 7.9 期权定价信息系统设计 ........................................................................................................... 110

7.9.1 设计窗体 ............................................................................................................................. 110

VIII

7.9.2 设计程序代码 ...................................................................................................................... 111 本章小结 ................................................................................................................................................. 113

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现 ............................................................ 114

8.1 单期的二叉树(二项式)期权定价模型 ........................................................................... 115 8.2 购买选择权价格与套利过程 .................................................................................................. 117 8.3 两期与多期的二项式模型 ...................................................................................................... 118 8.4 二项式期权定价模型应用实例 ............................................................................................. 119 8.5 二项式期权定价模型与 Black-Scholes 模型的比较 ....................................................... 122 8.6 二项式期权定价模型的计算程序及应用 ........................................................................... 122 本章小结 ................................................................................................................................................. 125

第 9 章 期货套期保值计算的 VBA 实现 ............................................................................................ 126

9.1 套期保值的基本概念 ................................................................................................................ 126

9.1.1 套期保值的概念和种类 ...................................................................................................... 126 9.1.2 套期保值的基差和基差风险 .............................................................................................. 127 9.1.3 套期保值的利润和有效价格 .............................................................................................. 127

9.2 套期保值的套头比 .................................................................................................................... 128

9.2.1 套头比的概念及计算方法 .................................................................................................. 128 9.2.2 直接套期保值套头比的计算模型 ...................................................................................... 129 9.2.3 交叉套期保值套头比的计算模型 ...................................................................................... 132

9.3 现货与期货方差和协方差计算模型 .................................................................................... 134 9.4 不考虑费用的最优套期保值策略模型 ............................................................................... 137

9.4.1 最优套期保值利润和方差的计算 ...................................................................................... 137 9.4.2 最低风险情况下的最优套期保值策略模型 ...................................................................... 137 9.4.3 给定最低收益情况下的最优套期保值策略模型 .............................................................. 139 9.4.4 给定最高风险情况下的最优套期保值策略模型 .............................................................. 140

9.5 考虑费用的最优套期保值策略模型 .................................................................................... 142

9.5.1 考虑费用的最优套期保值利润和方差的计算 .................................................................. 142 9.5.2 考虑费用的最低风险情况下的最优套期保值模型 .......................................................... 142 9.5.3 考虑费用的给定最低收益情况下的最优套期保值模型 .................................................. 144 9.5.4 考虑费用的给定最高风险情况下的最优套期保值模型 .................................................. 145

9.6 多品种情况下的最优套期保值模型 .................................................................................... 147 本章小结 ................................................................................................................................................. 153

IX

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现 ......................................................... 154

10.1 投资项目组合收益优化模型的建立及其 VBA 实现 ................................................... 154 10.2 投资项目决策模型的建立及其 VBA 实现 ...................................................................... 157 10.3 个人理财模型的建立及其 VBA 实现 ............................................................................... 162 本章小结 ................................................................................................................................................. 167

第 11 章 固定收益证券计算的 MATLAB 实现 ................................................................................. 168

11.1 久期计算的 MATLAB 实现 ................................................................................................. 168 11.2 凸度计算的 MATLAB 实现 ................................................................................................. 169 11.3 利率期限结构的 MATLAB 实现 ........................................................................................ 171 本章小结 ................................................................................................................................................. 176

第 12 章 投资组合计算的 MATLAB 实现 .......................................................................................... 177

12.1 将价格序列转换为收益率序列的 MATLAB 实现 ........................................................ 177 12.2 协方差矩阵与相关系数矩阵之间转换的 MATLAB 实现 .......................................... 178 12.3 投资组合收益与风险计算的 MATLAB 实现 ................................................................. 179 12.4 投资组合有效前沿(边界)计算的 MATLAB 实现 ................................................... 180 12.5 带约束条件的投资组合有效前沿(边界)计算的 MATLAB 实现 ........................ 182 12.6 考虑无风险资产及借贷情况下的资产配置计算的 MATLAB 实现 ........................ 184 12.7 投资组合收益最大计算的 MATLAB 实现 ...................................................................... 187 12.8 投资组合风险最小计算的 MATLAB 实现 ...................................................................... 189 12.9 基于遗传算法投资组合风险最小计算的 MATLAB 实现 .......................................... 192

12.9.1 有投资数量约束的投资组合优化决策模型的建立 ........................................................ 192 12.9.2 用遗传算法求解有限制的投资组合决策模型的过程 .................................................... 193 12.9.3 用遗传算法求最优投资组合风险实例及其结果分析 .................................................... 194

12.10 投资组合的风险价值计算的 MATLAB 实现 ............................................................... 196 本章小结 ................................................................................................................................................. 197

第 13 章 金融衍生品计算的 MATLAB 实现 ..................................................................................... 198

13.1 金融衍生品的种类 .................................................................................................................. 198 13.2 欧式期权 Black-Scholes 方程计算的 MATLAB 实现 .................................................. 199

13.2.1 Black-Scholes 方程 ............................................................................................................ 199 13.2.2 Black-Scholes 欧式看涨期权定价公式的推导 ................................................................ 201 13.2.3 Black-Scholes 欧式期权价格的计算函数 ........................................................................ 204 13.2.4 Black-Scholes 欧式期权隐含波动率的计算函数 ............................................................ 205 13.2.5 期货期权定价计算函数 .................................................................................................... 205

X

13.3 衍生品定价二叉树计算的 MATLAB 实现 ...................................................................... 206

13.3.1 CRR 二叉树模型 ............................................................................................................... 206 13.3.2 EQP 二叉树模型 ............................................................................................................... 209 13.3.3 二叉树定价函数 ................................................................................................................ 209

13.4 利率衍生品定价模型计算 .................................................................................................... 210 本章小结 ................................................................................................................................................. 213

第 14 章 期权定价有限差分计算的 MATLAB 实现 ........................................................................ 214

14.1 有限差分方法计算的基本原理 ........................................................................................... 214 14.2 显式有限差分计算法求解欧式看跌期权 ........................................................................ 215 14.3 显式有限差分计算法求解美式看跌期权 ........................................................................ 218 14.4 隐式有限差分计算法求解欧式看跌期权 ........................................................................ 220 14.5 隐式有限差分计算法求解美式看跌期权 ........................................................................ 222 14.6 Crank-Nicolson 方法求解欧式障碍期权 .......................................................................... 223 本章小结 ................................................................................................................................................. 226

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现 .............................................................. 227

15.1 蒙特卡罗模拟方差削减技术 ............................................................................................... 227 15.2 随机模拟控制变量技术 ......................................................................................................... 228 15.3 蒙特卡罗方法模拟欧式期权定价 ...................................................................................... 229 15.4 蒙特卡罗方法模拟障碍期权定价 ...................................................................................... 231 15.5 蒙特卡罗方法模拟亚式期权定价 ...................................................................................... 234 15.6 蒙特卡罗方法模拟经验等价鞅测度 .................................................................................. 236 本章小结 ................................................................................................................................................. 238

第 16 章 上市公司信用度量模型及其 MATLAB 应用 ................................................................... 239

16.1 上市公司信用风险度量模型的意义与国内外现状 ...................................................... 239 16.2 基于财务数据的上市公司信用风险度量模型研究 ...................................................... 242

16.2.1 信用风险的界定及样本的选取 ........................................................................................ 242 16.2.2 财务比率的选取 ................................................................................................................ 244 16.2.3 上市公司信用风险度量模型的因子分析建模及其实证研究 ......................................... 249 16.2.4 上市公司信用风险度量模型的神经网络建模及其实证研究 ......................................... 254

16.3 基于市场数据的上市公司动态信用风险度量模型研究 ............................................. 258

16.3.1 KMV 模型的理论基础 ..................................................................................................... 258 16.3.2 KMV 模型的框架 ............................................................................................................. 260 16.3.3 KMV 模型的修正、参数设计及计算方法 ...................................................................... 262

XI

16.3.4 实证研究 ........................................................................................................................... 265 本章小结 ................................................................................................................................................. 269

附录 1 建模样本(训练样本) ............................................................................................................. 270

附录 2 预测样本 ......................................................................................................................................... 273

附录 3 BP 神经网络 MATLAB 程序 .................................................................................................... 275

附录 4 样本截面数据 ................................................................................................................................ 276

附录 5 样本时间序列数据(限于篇幅,仅以股票代码 000040 的公司为例) .................. 280

附录 6 迭代法求资产价值波动率A和违约距离 DD 的 MATLAB 程序 ................................. 283

附录 7 违约距离 DD(t2)与预期违约率 EDF 数据 ........................................................................ 286

附录 8 公司(000801)在 t2 年违约距离 DD 与预期违约率 EDF 数据 ............................ 290

附录 9 VBA 宏工具录制使用简介 ........................................................................................................ 297

附录 10 MATLAB 工具软件使用简介 ................................................................................................. 301

参考文献 ........................................................................................................................................................... 309

第 1 章 现代金融财务理论与模型概述

本章要点

金融市场与机构体系。

金融财务理论的发展历史。

现代金融财务的主要内容。

1.1 现代金融财务理论的发展历史 金融财务是经济系统的心脏,现在人们普遍认识到,股票、债券、基金、期货、期权

等证券金融产品不再是发达资本主义国家的专利。随着经济全球一体化,发展中国家的人

们同样可以选择各种金融产品来发展本国的经济。整个金融市场与机构体系我们可以用 图 1-1 来描述。

图 1-1 金融市场与机构体系

其中,金融中介机构(包括各种商业银行存款机构、保险公司、投资公司和金融公司

等)主要是为金融市场提供间接融资服务;而资本市场(包括投资银行、经纪公司和交易

金融中介机构

货币市场

资本 市场

贷款人(储蓄者) 1.个人和家庭 2.企业 3.政府 4.外国投资者

借款人(发行者) 1.个人和家庭 2.企业 3.政府 4.外国政府、投资者

证券

资金

证券

资金

资金 证

贷款

资金

资金

2

金融财务建模与计算——基于 VBA 与 MATLAB 实现

商、有组织的交易所等)主要是为金融市场提供直接融资服务。 为了让读者对整个现代金融财务理论有一个基本的理解,下面我们对现代金融财务理

论的发展及其基本理论进行介绍。 首先,20 世纪 50 年代,哈利·马柯维茨(H.Markowitz)借助于统计与优化方法创立

了均值-方差模型,并被广泛应用于实际的投资组合决策。哈利·马柯维茨的思路可以追溯

到伯努利(Bernoulli)和费雪(Fisher)等人,前者考察了概率与博彩问题,也就是不确定

条件下的决策,后者考察了利息理论。这些早期的理论为后来的金融产品估价技术及金融

工程学科的开拓打下了坚实的基础。哈利·马柯维茨第一次系统地用数理统计和优化的语

言描述了金融市场上投资者的可能行为,尽管当时他的研究并没有成为金融经济学的模型

基础,但在华尔街却广为流行,成为众多投资者投资决策的技术依据。 其次,20 世纪 50 年代,一些代表性的学者从理论上和经验上分别注意到了投资者理

性决策的重要性。阿罗(Arrow)通过对保险和风险的研究,特别是通过对一般均衡框架中

或有证券的研究发现:只要针对未来的每种潜在的可能性设计出相应的应对条款,那么就

能构造出一种“阿罗证券”来确保总体经济的一般均衡。不过,阿罗也注意到,投资者的

理性决策依赖于一定的信息条件,如果该条件得不到满足,金融产品的合同安排就可能不

完全,比如,在保险业会出现“道德风险”问题。这些观点对后来的金融理论的发展产生

了巨大影响。 再次,莫迪利亚尼(Modigliani)和米勒(Miller)也在 20 世纪 50 年代开始关注金融

市场上的证券供给问题,他们采取了标准的微观经济学的均衡分析方法,在假定金融市场

完全竞争的前提下,试图通过公司的融资成本-收益决策来推导出证券供给曲线。不过,现

在人们已经很少关心证券供给曲线了,主要原因是他们的结论因为“MM 定理”闻名于世,

其背后的证券供给曲线反而被忽视了。MM 定理说明:在给定若干假定条件下,公司的资

本结构选择并不能给公司创造价值。这一结论奠定了现代公司金融理论的框架,因为该定

理为复杂的公司金融活动分析创造了一个基本构架。 在继承前面哈利·马柯维茨均值-方差模型等成果的基础上,夏普(Sharpe)、林特纳

(Lintner)等人于 20 世纪 60 年代发展出了资本资产定价模型,罗斯(Ross)等人又进一步

发展出了套利定价模型,奠定了研究资本市场价格的理论框架。法玛(Fama)等人在 20世纪 70 年代提出了有效市场假说,并给出了金融市场价格运动规律的经验实证研究思路。

布莱克(Black)、舒尔斯(Scholes)和莫顿(Merton)等人于 20 世纪 70 年代在 MM 定理

和资本资产定价模型的基础上发展出了金融产品的定价模型,并被广泛应用于实践中,从

而导致了金融产品的大量创新。 另外,阿罗早期的研究重新受到重视,20 世纪 70 年代,大量的博弈论和信息经济学

模型被用于分析金融市场,如罗斯(Ross)、格罗斯曼(Grossman)、普雷思克特(Presctt)、斯蒂格利茨(Stuglitz)、利兰(Leland)、布雷纳(Brennan)、杰森(Jensen)、哈特(Hart)、哈里森(Harrison)、克瑞普斯(Kreps)、布哈塔斯瑞(Bhattacherya)等人把金融产品看做

是契约,如果当事人的信息不对称,就可能导致契约的不完全,从而出现逆向选择和道德

风险问题,此即金融市场资源配置的低效率。如果要提高资源配置效率,就必须采取有效

的治理机制、恰当的证券设计及充分的信息披露,这些正成为金融系统中日益重要的制度

架构。

3

第 1 章 现代金融财务理论与模型概述

经过近 40 年的开拓,现代西方金融财务理论才真正成型,它不仅形成了以契约为基础

的金融经济学,而且在公司和各种金融中介的金融活动、金融市场的价格运动、市场微观

结构、金融系统的演变及金融监管等诸多方面都有专门的理论,从而构成了一个比较完善

的理论体系和研究方法体系。 不过,随着金融产品的多样化和金融系统的复杂化,学者们逐步发现,20 世纪 80 年

代以前的金融理论仅仅考虑定价、套利、均衡、合同等问题,这是不够的。例如,有效市

场假说的核心是完美套利,但现实世界中套利是不完美的,这就预示着作为理论基础的有

效市场假说缺乏理论预见力;资本资产定价模型、代理理论模型等虽然比较精致,但缺乏

足够的数据支持;以现值为基础的证券估价模型缺乏理论意义;当事人的风险偏好假定不

现实,越来越多的实验经济学研究结果证明了这一点;股权溢价之谜、市场效率异常等得

不到合理解释,期限结构、波动理论等也是如此;金融市场的制度基础没有得到充分重视,

制度如何影响价格还不清楚等等。 正因为过去的理论有诸多局限,从 20 世纪 80 年代开始,金融学家进行了广泛的新探

索,这一探索分两条线展开:一方面,在过去的金融理论模型中嵌入制度等因素,着重研

究金融契约的性质和边界、金融契约选择与产品设计、金融契约的治理与金融系统演化、

法律和习俗等制度因素对金融活动的影响等;另一方面,一些金融学家基于卡尼曼

(Kahneman)等人发展的非线性效用理论,开始引入心理学中关于人的行为的一些观点,

来解释金融产品交易的异常现象,如有限套利、噪声交易、从众心理等。这些理论形成了

现代金融理论中的行为学派,又称为“行为金融”。 从目前的理论发展来看,两条线索互相竞争,互相促进,共同发展。基于信息不完全、

不对称和一般均衡理论的模型在解释金融市场异常方面有明显不足;但行为金融还不能有

效地应用于金融产品定价,并且现有理论模型本身缺乏更广泛的经验证据支持。双方正处

于争论阶段,构成了现代金融理论发展过程的主旋律。 很明显,现代金融理论从 20 世纪 50 年代开始逐步摆脱了过去那种纯货币理论的状态,

确立了资本定价在金融学中的核心地位,如同一般均衡理论在经济学中的地位一样。所谓

现代金融理论,其实就是用标准的主流经济学的原理和方法精确刻画金融活动的产物。而

20 世纪 80 年代以后,经过经济学家的不懈努力,金融产品和金融系统的复杂性日益受到

关注,金融理论开始走出资产定价技术这一狭窄范畴,越来越多的人开始从金融活动参与

者的行为本身来解释纷繁复杂的金融现象。行为的多元化导致金融产品和金融系统的多元

化,也导致金融理论的多元化。现代金融理论的核心从资产定价转向参与者行为,这可以

看做是向经济学本来面目的复归。 下面我们对重要的金融财务理论进行介绍。

1.2 现代投资组合模型 1952 年马柯维茨提出的投资组合理论通常被认为是现代金融学的发端。马柯维茨在他

的划时代论文《投资组合选择》中假设投资者均为风险厌恶者,也即理性投资者的目标在

于:在风险给定的条件下,追求预期收益的 大化;而在收益给定的条件下,追求风险的

小化。若用 μ 代表投资组合的预期收益率,σ 代表预期收益率的标准差(即投资组合的

风险),马柯维茨断言,投资者的目标是追求(μ,σ)空间中效用的 大化。他给出了如何

4

金融财务建模与计算——基于 VBA 与 MATLAB 实现

在众多的证券中建立起一个具有较高收益和较低风险的 佳证券组合。1958 年托宾证明了

风险规避型投资者在(μ,σ)空间中的无差异曲线必定具有一定曲率,且呈凸状。而在不

存在无风险投资机会的条件下,投资有效界面(即马柯维茨有效边界)呈凹形。因此在(μ,

σ)空间中,投资者的无差异曲线与投资有效界面将有且仅有一个切点,该切点所代表的证

券组合便是投资者的 优投资组合。 由于 优投资组合的确定需要计算大量的证券收益率、标准差和证券间的协方差,且

是一个二次规划,不适应于实际应用。因此,1963 年夏普提出了简化形式的计算方法,即

现在所称的单指数模型。这一简化模型,使组合投资理论在大量的证券经营中更实用了。

在这个模型中,夏普把证券的风险分为系统性(不可分散)风险和非系统性(可分散)风

险两部分。系统性风险就是市场风险,指证券价格的变动是由整个市场价格变动造成的。

它反映了各种证券的价格对市场价格变化的敏感性或反应性的强弱。每种证券的系统风险

是不同的,可用 β 值表示证券价格受市场影响的程度。非系统风险是指证券价格的变动是

由具体证券本身特点造成的。而证券本身的特点是指发行单位的营利能力、管理效率等因

素的不稳定而产生的风险。单指数模型还指出,投资者因承担较大风险而获得较高收益,

但收益只与系统风险相联系,与非系统风险无关。因此,投资者不可能因承担可分散风险

而得到报酬。

1.3 资本资产定价模型 资本资产定价模型(Capital Asset Pricing Model,CAPM)以马柯维茨的投资组合理论

为基础,完整地回答了在资本市场均衡时,证券收益的决定机制问题。资本资产定价模型

为使用现代组合投资理论的投资者提供了: (1)组合投资风险与收益关系; (2)单个证券资产风险的度量; (3)单个证券资产风险与收益的关系。 这个模型的主要特点是:一种证券资产的预期收益率可以用这种证券资产的风险的相

对测度 β 因子测定;在不存在套利机会下,则存在一种均衡,即如果证券的风险相同,则

它们的预期收益率应该相同。该模型可以表述为:

( ) ( ( ) )j f j m fE r r E r r

式中,E(rj)为证券 j 的期望收益率;rf 为无风险利率;βj 为证券 j 的系统风险系数;E(rm)

为市场组合投资的期望收益率。 这个模型的主要框架为:首先运用马柯维茨均值-方差模型,投资者能够估计出所有证

券组合中每种证券的预期收益率、标准差和协方差。根据这些估计值,投资者就能推导出

马柯维茨有效集合;然后给定无风险资产收益率,投资者就能识别出切点处证券组合和线

性有效集合的位置; 后,投资者对切点处证券组合进行投资,并按无风险收益率进行借

或贷,具体借或贷数量依赖于投资者对风险-收益的偏好。 资本资产定价模型由夏普于 1964 年、林特纳于 1965 年和莫森(Mossion)于 1966 年

从不同角度独立发现的,是马柯维茨模型的具体运用,其简单直观的特点使之从诞生之日

起就备受投资者的青睐,得到了广泛的应用。为了提高资本资产定价模型的实用性,20 世

5

第 1 章 现代金融财务理论与模型概述

纪 70 年代上半期,经济学家在简化 初构成模型的众多苛刻条件方面取得了巨大的进展。

布莱克(Black)于 1972 年和布鲁南(Bulunan)于 1970 年简化了模型无税收和无风险利

率不变的假设;莫顿于 1973 年成功地将模型单周期的局限进行了拓展,建立了时标资本资

产定价模型(ICAPM)。 20 世纪 80 年代开始,一些金融经济学家应用心理学中有关人的行为建立了行为资本

资产定价模型来解释金融投资中的一些异常现象,如噪声交易、从众心理等。这些理论形

成了现代金融投资理论中的行为学派,又称为“行为金融”。

1.4 套利定价模型 在资本市场达到均衡时,在一定的假设下,一方面,CAPM 给出了资产收益率的决定

机制,但是由于难以得到真正的市场组合,致使 CAPM 不易被检验;另一方面,当以公司

的规模为基础形成资产组合时,考虑到估计 β 的差异,小公司的年平均收益率比大公司的

年平均收益率高出将近 20%,这种现象不能用 CAPM 解释。罗斯(Ross)于 1976 年提出

了一个旨在替代 CAPM 的套利定价(或称零投资组合)模型。套利定价模型也是一个均衡

资产定价模型,其不同于 CAPM 之处在于该模型并不要求投资者是风险规避者,即 APT并不依据预期收益率和标准差来寻找 优投资组合,它更加强调资产收益率的生成结构,

指出资产的收益率取决于一系列影响资产收益率的因素。而套利活动则能确保资本市场均

衡的实现。套利定价模型的理论基础是一价定律,即两种风险-收益性质相同的资产不能按

不同的价格出售。APT 模型一经提出,经济学家便围绕 CAPM 模型与 APT 模型孰优孰劣

的问题各执一端,争论不休。但对 APT 模型的研究已成为金融投资当中的重要内容。

1.5 布莱克-舒尔斯的期权定价模型 期权是 20 世纪国际金融市场创新实践的一个成功典范。它的诞生对金融理论和实践产

生了巨大的影响。1973 年,布莱克(Black)与舒尔斯(Scholes)的著名论文《期权定价

与公司负债》及同年莫顿的论文《期权的理性定价理论》奠定了期权定价模型的理论基础,

并推导出第一个完整精确的期权定价公式,即 Black-Scholes 模型,为金融财务学开创了一

个崭新的领域。舒尔斯和莫顿因其在建立期权定价模型方面所做出的开拓性贡献被授予

1997 年诺贝尔经济学奖,布莱克虽然因为在 1995 年 8 月逝世而未能享此殊荣,但其英名

也将永载经济学史册。现在,关于期权理论与应用的研究已成为金融学领域 活跃的分支

之一。 按照 一般的定义,期权是在将来某一时刻按一定价格买卖某种资产的权利。而在期

权交易中,如何给买卖双方确定公平的期权费(即期权定价),自然是一个非常重要的问题。

期权定价模型(Black-Scholes 模型)给出了依赖于标的资产的执行价格 E、现货价格 S0、

到期时间 t、波动率 σ和无风险利率 r 的欧式看涨期权价格 C0的定价公式:

0 0 1 2( ) e ( )rtC S N d E N d

20

1

1ln( / ) ( )2

S E r td

t

6

金融财务建模与计算——基于 VBA 与 MATLAB 实现

20

2 1

1ln( / ) ( )2

S E r td d t

t

其中,N(.)是标准正态分布函数。 上述公式是建立在一系列严格基础之上的,包括: (1)标的资产收益率服从正态分布; (2)标的资产可以自由买卖,且可以卖空; (3)标的资产到期前不支付红利; (4)投资者可以以无风险利率进行借贷; (5)没有税收、交易成本等额外费用; (6)标的资产价格具有连续性,服从几何布朗运动,其波动率为常数。 Black-Scholes 公式是现代金融理论的重大突破,但其只能用于欧式期权定价,而实际

场内交易的期权美式比欧式多。科克斯(Cox)、罗斯和鲁宾斯坦(Rubinstern)于 1979 年

提出了二叉树(二项式)期权定价模型,使得标准期权有了定价基础。之后,许多专家、

学者都试图通过放松 Black-Scholes 模型假设来修正期权定价公式。布莱克、舒尔斯和莫顿

在期权方面的贡献远远超出了衍生工具定价的范畴,他们所提出的方法可以广泛运用于经

济活动的各个方面,为资产定价在许多领域中的应用铺平了道路。

1.6 代理理论 现代公司的参与者有:股东、债权人、经营者、雇员等。在以往的研究中,经济学家

曾认为这几种参与者以共同利益为其行为准则。但近年来的理论研究和实践证明,其中存

在委托代理关系,如股东与经营者、企业与债权人,并且他们存在利益冲突和矛盾。研究

这些冲突,以及如何解决这些矛盾的理论统称为代理理论。

1.7 资本结构理论 在不存在税收的完美市场条件下,公司的价值只依赖于其产品的 EBIT(息税前收益),

而与其负债比例的大小(即资本结构)无关。这是莫迪利亚尼和米勒著名定理的基本思想。 当然,MM 定理并没有完全回答资本结构问题。现实中存在所得税和市场不完美。但

MM 的思想告诉了人们资本结构在哪里起作用。后来这种分析方法得到推广,形成了 优

资本结构理论。

1.8 法玛的有效市场假说 在关于风险与收益的理论中, 为基础的理论是有效市场假说(Efficient Market

Hypothesis,EMH)。有效市场假说研究的是投资者的预期如何传递到证券价格的变化中去。

如果市场是完全有效的,那么,所有证券的价格都将等于它们的内在价值。换句话说,既

没有价格被高估的证券,也没有价格被低估的证券。投资的收益率必然是由系统性风险决

定的正常收益率。所以,市场是否有效,以及有效的程度,对投资者来说非常重要。因为,

在一个完全有效的市场中,证券分析的基础分析法和技术分析法都是徒劳无益的;反之,

7

第 1 章 现代金融财务理论与模型概述

如果市场并非完全有效,那么借助证券分析寻找价格被高估和低估的证券,将可以为投资

者赢得超常的收益。 有效市场的概念, 初是由法玛在 1970 年提出的。法玛认为,当证券价格能够充分地

反映投资者可以获得的信息时,证券市场就是有效市场;在有效市场中,无论随机选择何

种证券,投资者都只能获得与投资风险相当的正常收益率。法玛根据投资者可以获得的信

息种类,将有效市场分成了三个层次:弱形式有效市场(weak-form EMH)、半强形式有效

市场(semi-strong-form EMH)和强形式有效市场(strong-form EMH)。

1.弱形式有效市场(weak-form EMH) 弱形式有效市场假设所涉及的信息,仅仅是证券以往的价格信息。当弱形式有效市场

假设成立时,投资者单纯依靠以往的价格信息,不可能持续获得非正常收益。换言之,同

一证券不同时间的价格变化是不相关的,所以投资者无法根据证券的历史价格预测未来的

走势。在弱形式有效市场假设中,包含以往价格的所有信息已经反映在当前的价格之中,

所以利用移动平均线和 K 线图等手段分析历史价格信息的技术分析方法是无效的。

2.半强形式有效市场(semi-strong-form EMH) 除了证券以往的价格信息之外,半强形式有效市场假设中包含的信息还有发行证券

的企业的年度报告、季度报告、股息分配方案等在新闻媒体中可以获得的所有信息,即

半强形式有效市场假设中涉及的信息囊括了所有的公开信息。如果半强形式有效市场假

设成立,所有公开可获得的信息都已经完全反映在当前的价格之中,所以投资者根据这

些公开信息无法持续获取非正常收益。那么,依靠企业的财务报表等公开信息进行的基

础分析是无效的。

3.强形式有效市场(strong-form EMH) 强形式有效市场假设中的信息既包括所有的公开信息,也包括所有的内幕信息。例如,

企业内部高级管理人员所掌握的内部信息。如果强形式有效市场假设成立,上述所有的信

息都已经完全反映在当前的价格之中,所以,即便是掌握内幕信息的投资者也无法持续获

取非正常收益。 包括有效市场假说在内的传统金融理论都是以市场参与者完全理性为前提的。事实上,

市场参与者仅仅拥有在认知能力、行为能力、利己心均受到一定约束下的有限理性。外部

世界的复杂性与其自身有限的信息收集、处理能力,决定了市场参与者只能实现过程理性,

而无法达到实质理性。完全理性这一前提的动摇,对传统金融理论的分析形成了巨大的挑

战。无论是有效市场假说,还是以之为基础的资产定价理论与模型都有待修正。 根据投资者对市场有效性的判断,可以把投资策略分为主动投资策略和被动投资策略

两种。如果认为市场是有效的,那么投资者应选择被动投资策略。例如,指数基金管理公

司可以简单地投资于指数期货,或者按照市场指数中各种证券所占的比重建立组合。如果

认为市场是无效的,即相信通过证券分析可以发现价格被低估或高估的证券,从而获得超

常的投资收益率,那么投资者应选择主动投资策略。

1.9 久期、凸度和利率期限结构 固定收益证券中有三个重要的度量,即债券的久期、凸度和利率期限结构。久期是衡

8

金融财务建模与计算——基于 VBA 与 MATLAB 实现

量债券价格对收益率变化的敏感度,它本质上是价值曲线在当前利率和债券价格点的斜率;

凸度则是斜率的变化量;利率期限结构可以为债券定价,它确定了各到期日货币的价格,

可以为市场发行新金融工具寻找合适的价格。利率期限结构是未来利率水平的重要指标,

代表着市场未来的利率预期,投资者通过利率期限曲线形状推测未来利率走势。债券投资

者、基金经理、企业财务人员都会认真研究利率期限结构,中央银行、财政部也需要解读

利率期限结构,结合通货膨胀率等其他信息来制定国家利率政策。利率期限结构主要是讨

论金融资产到期时收益与到期期限之间的关系。 由于金融财务模型是相当复杂的,因此,从第 2 章开始,我们将向读者介绍一些常见

的金融财务模型的建立及其 VBA 与 MATLAB 的计算。

本章小结 本章在介绍金融市场与机构体系和金融财务理论的发展历史的基础上,重点介绍了现

代金融财务的主要内容,使我们对现代金融财务理论有一个清晰的了解。

第 2 章 投资组合收益率和方差

计算及其 VBA 实现 本章要点

单个证券连续复利收益率的计算模型。

协方差的计算模型。

投资组合收益率和标准差的计算模型。

投资组合收益率和方差计算的 VBA 实现。

收益率和方差的计算是投资组合分析的基石。因此,本章首先向读者介绍证券投资组

合的收益率和方差的计算方法。

2.1 单个证券连续复利收益率的计算模型 在证券分析和计算中,我们常常要使用连续复利收益率。连续复利收益率是指证券期

末价格与上期末价格之比的对数,即:

1ln[( ) / ]t t t tr P D P

式中 tr ——证券第 t 期连续复利收益率; tP ——证券第 t 期末的价格; 1tP ——证券第 t-1 期末的价格; tD ——证券在第 t 期的红利。

从而连续复利收益率分布的期望值(均值)的计算公式为:

1

1 n

tt

r rn

式中 r ——证券连续复利收益率分布的期望值(均值); n ——已知证券收益率分布的总数。

10

金融财务建模与计算——基于 VBA 与 MATLAB 实现

2.2 协方差的计算模型 所谓连续概率,是指证券收益率可能发生的概率是连续的。在连续概率情况下,证券

i 与证券 j 的协方差计算公式如下:

1

1Cov( , ) ( ) ( )m

it i jt jt

i j r r r rm

(i,j=1,2,…,n)

式中 m——证券收益率样本中收益率的个数; itr ——证券 i 在第 t 种情况下的预期收益率;

ir ——证券 i 的预期收益率; jtr ——证券 j 在第 t 种情况下的预期收益率;

jr ——证券 j 的预期收益率。 而连续概率情况下证券的预期收益率计算公式为:

1

1 m

tt

r rm

2.3 投资组合收益率和标准差的计算模型 所谓投资组合 X,是指将全部投入资金按某种比例分散投资于两种或两种以上资产而

构成的一个组合。假设投资组合 X 是由 n 种不同证券构成的,其中第 i 种证券上投资的资

金比例为 xi,i=1,…,n,简称第 i 种证券的投资权重。则投资组合可记为如下的形式:

X={(x1,…,xn)|1

1n

ii

x

}

在投资组合 X 中,权重 xi>0 时表示买入证券 i;xi<0 时表示卖出证券 i,将其所得资

金投资于组合内其他证券;当 xi>1 时,表示投资在证券 i 上的资金有卖空其他证券收入

的资金。 设证券 i 的收益率为 ri,其概率分布为:

pj=P{ri=rij},j=1,2,…,N,i=1,2,…,n

则证券 i 的预期收益率(期望收益率)为:

1( ) , 1,2, ,

N

i ij jj

E r r p i n

证券 i 的收益率的方差为:

2 2 2

1( ) [ ( )] [ ( )]

N

i i i i ij i jj

D r E r E r r E r p

标准差为 i ,而证券 i 和证券 k(收益率)的协方差为:

1[( ( ))( ( ))] [( ( ))( ( ))]

N

ik i i k k ij i kj k jj

E r E r r E r r E r r E r p

11

第 2 章 投资组合收益率和方差计算及其 VBA 实现

对于投资组合 X,其收益率为:

1

n

X i ii

r x r

X 的预期收益率为:

1( ) ( )

n

X i ii

E r x E r

X 的方差为:

2 2 2 2

1 1

2

1 1 1

2 2 T

1 1 1,

( ) [ ( )] [ ( )]

[ ( ( ))] [ ( ( ))( ( ))]

n n

X X X X i i i ii i

n n n

i i i i k i i k ki i k

n n n

i i i k iki i k k i

r E r E r E x r x E r

E x r E r E x x r E r r E r

x x x

X VX

其中 1

n

x

x

X , ( )ik n n V , 2,ii i ik ki

ri 与 rk的相关系数定义为:

ikik

i k

所以又有:

2 2 2 2 2

1 1 1, 1 1 1,

n n n n n n

X i i i k ik i k i i i k iki i k k i i i k k i

x x x x x x

特别地,我们看一下等比例组合的情况,此时1

ixn

1

1( ) ( )n

X ii

E r E rn

2 2 2 22

1 1 1,

1 1 1 1 1 1 ( )n n n

X i ik i ik i ik iki i k k i

n

n n n n nn

式中, 2i 、 ik 分别表示 n 个证券的方差和它们协方差的平均值。显然

2 ( )X ik n

如果我们仍用方差表示风险,则上式表明,如果按等比例做投资组合,当组合中证券

数量达到一定程度时,单个证券的风险将不发生作用,而投资组合的风险主要取决于证券

之间的协方差,即证券收益率之间的相互关系。

12

金融财务建模与计算——基于 VBA 与 MATLAB 实现

对于非等比例组合,上述结论仍然成立。 当 n→∞, ik =0 时,有:

2 2 22 2

1 1 1, 1

1 1 1 1n n n n

X i ik ii i k k i in nn n

→0

上式表明,如果协方差等于 0,则组合风险趋向于 0。 在不允许卖空时,注意到 1ii ,有:

2 T

1 1 1 1 1 12 2 2

1 1 1( ... ) max{ ,..., }

n n n n n n

X i k ik i k ik i k i k i ki k i k i k

n n n

x x x x x x

x x

X VX

即投资组合的风险,总是小于等于单一证券的最大风险,这是一个非常重要的结论,

是现代证券理论的基础。 因此,投资组合 X 的预期收益率就等于各个证券的预期收益率与各自投资比例的加权

总和,而投资组合的方差则与各个证券之间的协方差有关。投资组合 X 的预期收益率、方

差、标准差的计算公式如下:

1( )

n

X i ii

E r w r

2

1 1( ) Cov( , )

n n

X i ji j

r w w i j

1 1( ) Cov( , )

n n

X i ji j

r w w i j

式中 ( )XE r ——投资组合的预期收益率; 2 ( )Xr ——投资组合的方差; ( )Xr ——投资组合的标准差;

ir ——证券 i 的预期收益率; iw ——证券 i 在投资组合中所占的权重; n——投资组合中证券的个数;

Cov( , )i j ——证券 i 和证券 j 的预计收益率之间的协方差。

2.4 投资组合收益率和方差计算的 VBA 实现 投资组合收益率和方差计算的 VBA 实现的设计步骤如下。 (1)首先建立一个名字为“投资组合收益率与方差计算模型.xls”的工作簿,在当前的

Sheet1 上设计模型的结构,如图 2-1 所示。 (2)模型由以下三部分组成:已知数据区域、命令按钮区域(包括一个【准备数据】

按钮、一个【开始计算】按钮、一个【清除表格】按钮)和计算结果区域(在单击【开始

计算】按钮后计算结果的输出区域)。

13

第 2 章 投资组合收益率和方差计算及其 VBA 实现

图 2-1 投资组合收益率与方差计算模型

注:在图 2-1 中的【准备数据】、【开始计算】、【清除表格】三个按钮设计的详细步骤,

读者可参见附录 9,后面章节凡是遇到这样的按钮都是这样操作,不再赘述。 (3)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程

序代码:

Sub 准备数据() Dim n, m, i As Integer n = Cells(3, 2) m = Cells(4, 2) Cells(10, 1) = "输入各个证券在某个时期的连续收益率及投资比重" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(11, 1) = "时间" Cells(11, 1).HorizontalAlignment = xlCenter For i = 1 To n Cells(11, i + 1) = "证券" & i Cells(11, i + 1).HorizontalAlignment = xlCenter Next i For i = 1 To m Cells(11 + i, 1) = i Cells(11 + i, 1).HorizontalAlignment = xlCenter Next i Cells(12 + m, 1) = "各证券的投资比重" Range(Cells(12 + m, 1), Cells(12 + m, 1)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(4)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程

序代码:

Sub 开始计算() Dim n, m, i, j As Integer

14

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Dim myrange0, myrange As String Dim xy, x1, x2, y1, y2 As String Dim cr, cp As Double n = Cells(3, 2) m = Cells(4, 2) ReDim r(n), C(n) As Double Cells(13 + m, 1) = "各证券的期望收益率" Cells(14 + m, 1) = "各证券的标准差" For i = 1 To n For j = 1 To n Cells(15 + j, 1 + i) = Cells(15 + i, 1 + j) Next j Next i Cells(17 + n, 1) = "单位向量" For i = 1 To n myrange = Chr(65 + i) & 12 & ":" & Chr(65 + i) & 11 + m Cells(13 + m, i + 1) = "=average(" & myrange & ")" Cells(14 + m, i + 1) = "=stdevp(" & myrange & ")" r(i) = Cells(13 + m, i + 1) Cells(13 + m, i + 1).NumberFormat = "0.00%" C(i) = Cells(14 + m, i + 1) Cells(14 + m, i + 1).NumberFormat = "0.00%" Next i Range(Cells(20 + n, 4), Cells(20 + n, 5)).Select Selection.HorizontalAlignment = xlCenter Range(Cells(14 + m, 1), Cells(14 + m, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(15 + m, 1) = "各证券间的协方差" Cells(15 + m, 1).HorizontalAlignment = xlCenter Range(Cells(15 + m, 1), Cells(15 + m, 1 + n)).Merge For i = 1 To n Cells(16 + m + i, 1) = "证券" & i Cells(16 + m + i, 1).HorizontalAlignment = xlCenter Cells(16 + m, i + 1) = "证券" & i Cells(16 + m, i + 1).HorizontalAlignment = xlCenter Next i For i = 1 To n myrange0 = Chr(65 + i) & 12 & ":" & Chr(65 + i) & 11 + m For j = 1 To n myrange = Chr(65 + j) & 12 & ":" & Chr(65 + j) & 11 + m Cells(16 + m + i, 1 + j) = "=covar(" & myrange0 & "," & myrange & ")" Cells(16 + m + i, 1 + j).NumberFormat = "0.00%" Next j Next i Range(Cells(16 + m + n, 1), Cells(16 + m + n, n + 1)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(11 + m + 2 * n, 1) = "投资组合收益率"

15

第 2 章 投资组合收益率和方差计算及其 VBA 实现

Cells(12 + m + 2 * n, 1).HorizontalAlignment = xlCenter Cells(12 + m + 2 * n, 1) = "投资组合标准差" Cells(12 + m + 2 * n, 1).HorizontalAlignment = xlCenter cp = 0 cr = 0 For i = 1 To n cr = cr + Cells(12 + m, 1 + i) * r(i) For j = 1 To n cp = cp + Cells(12 + m, 1 + i) * Cells(12 + m, 1 + j) * Cells(16 + m

+ i, 1 + j) Next j Next i Cells(11 + m + 2 * n, 2) = cr Cells(12 + m + 2 * n, 2) = Sqr(cp) Cells(11 + m + 2 * n, 2).NumberFormat = "0.00%" Cells(12 + m + 2 * n, 2).NumberFormat = "0.00%" Range(Cells(12 + m + 2 * n, 1), Cells(12 + m + 2 * n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(5)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Cells(3, 2) = "" Rows("10:10000").Delete Shift:=xlUp End Sub

这样,投资组合的收益率和标准差计算的 VBA 实现就完成了。该模型可对证券间的协

方差矩阵进行计算,以便投资者进行分析。在使用该模型进行计算时,应先单击【清除表

格】按钮,将工作表的数据清除干净。

2.5 模型的应用举例 例 2-1 6 种证券在 10 个月的月收益率和投资比重如表 2-1 所示,试计算投资组合的

预期收益率和标准差。

表 2-1 6 种证券在 10 个月的月收益率和投资比重

时 间 证 券 1 证 券 2 证 券 3 证 券 4 证 券 5 证 券 6

1 65% 10% 40% 25% 3% 40%

2 34% 9% 42% 19% 1% 26%

3 21% 45% 5% 10% 8% 27%

4 64% 46% 28% 61% 15% 9%

5 26% 5% 7% 26% 17% 10%

6 15% 2% 10% 9% 3% 23%

16

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 时 间 证 券 1 证 券 2 证 券 3 证 券 4 证 券 5 证 券 6

7 2% 48% 9% 18% 23% 38%

8 11% 22% 3% 68% 8% 6%

9 96% 15% 70% 26% 27% 7%

10 20% 40% 32% 175% 30% 30%

各证券的投资比重 10% 20% 30% 20% 10% 10%

计算步骤如下。 (1)在单元格 B3 中输入证券数量“6”,在单元格 B4 中输入时间“10”。 (2)单击【准备数据】按钮,该模型自动对工作表进行格式化,格式化后的工作表如

图 2-2 所示。

图 2-2 格式化后的工作表

(3)在图 2-2 所示的单元格区域 B12:G22 中输入表 2-1 中各个证券的有关已知数据。

由于协方差矩阵的对称性,只需要在浅黄色的单元格中输入协方差数据即可。 (4)单击【开始计算】按钮,则模型自动计算,并输出各个证券的预期收益率、标准

差和各个证券之间的协方差,以及投资组合的预期收益率和标准差,如图 2-3 所示。

图 2-3 模型计算结果

17

第 2 章 投资组合收益率和方差计算及其 VBA 实现

本章小结 本章在介绍单个证券收益率计算模型的基础上,重点介绍了投资组合的收益率和风险

的计算模型,并编制了计算机程序,用具体实例进行了计算。这为后续章节投资组合有效

边界和最优投资组合计算奠定了扎实的基础。

第 3 章 投资组合有效边界模型

及其 VBA 实现 本章要点

建立投资组合最小方差集合与有效边界的模型。

编制投资组合有效边界模型的 VBA 程序。

假定由 n 个证券构成的投资组合,由于权重不同而有无穷多个投资组合,所有这些证

券组合构成了一个可行集(feasible set)。投资者不需要评估可行集中的所有投资组合,只

需分析任意给定风险水平有最大的预期回报或任意给定预期回报有最小风险的投资组合,

满足这两个条件的投资组合集合叫做投资组合的有效边界(集合)(efficient frontier(set))。

3.1 投资组合最小方差集合与有效边界 给定一个证券投资组合 X,它的预期收益率 ( )XE r 和标准差 ( )Xr 确定了一个点

( ( ), ( ))X XE r r ,当这个证券组合的权重发生变化时,得到一条曲线: 1

T 2

1 1{( ( ), ( )) | ( ) ( ), ( ) ( ) , 1}

n n

X X X i i X ii i

E r r E r x E r r x

X VX

我们将其称为组合线。组合线上的每一点,表示一个权重不同的证券组合。因此,组合线

告诉我们预期收益率与风险怎样随着证券组合权重的变化而变化。 在第 2 章里,我们给出了单个证券和证券组合的预期收益率及投资组合风险的度量。

上面我们又分析了在给定证券的条件下,如何决定其证券投资组合。然而当投资者用一定

资本进行证券投资时,他追求的投资目标是高收益、低风险,那么如何在众多的证券中建

立起一个高收益、低风险的证券组合呢?下面我们讨论这个问题。 给定一组不同的单个证券,我们可以用它们构造不同的证券组合。这样,每个证券或

证券组合我们称为一个投资机会,全部投资机会的集合,称为机会集合。对机会集合中的

每个元素 X,我们用其预期收益率 ( )XE r 和风险 2 ( )Xr 来描述它的图形。因此,每个机会 X

19

第 3 章 投资组合有效边界模型及其 VBA 实现

都对应一个( ( )XE r , ( )Xr )或( ( )XE r , 2 ( )Xr ),这样机会集合可以用预期收益率-

标准差(方差)二维空间的一个集合表示。 对于一个聪明理智的投资者来说,如果给定风险水平或标准差,他喜欢预期收益率高

的投资机会;如果给定预期收益率水平,他喜欢风险低的投资机会。于是我们定义最小方

差集合:机会集合中的一个证券投资组合,如果具有不存在其他的证券组合在与之相同的

预期收益率水平下能达到更小的风险(标准差)的性质,则我们称它为最小方差证券组合。

最小方差证券组合的全体,我们称为最小方差集合。 显然,最小方差集合是机会集合的子集,由证券组合的组合线上具有最小风险的证券

组合的包络线组成。 由于投资者所面临的投资条件不同,受到的投资约束不同,最小方差集合的形状也不

同,因此最小方差集合的确定依赖于不同的约束条件。 下面我们来寻求最小方差集合。为此考虑一个组合 X,它由 n 个证券组成,每个证券

的预期收益率为 ( )iE r ,方差记为 2i ,证券之间的协方差记为 ( )ij i j ,i, j=1,2,…,n。于

是证券组合的收益率 Xr 和风险 2 ( )Xr 可以表示成: 2 T( )Xr X VX

在给定预期收益率 ( )XE r 的条件下,如何选择证券组合的权重 1,..., nx x ,使证券组合 X

具有最小方差呢? 记 T

1 2( ( ), ( ),..., ( ))nE r E r E re ,为确定最小方差集合,我们考虑如下优化模型,即一般

的马柯维茨模型:

T1min( )2

X VX , 1T

1s.t.

( )

n

ii

X

x

E r

X e

这是一个等式约束的极值问题,我们可以构造 Lagrange 函数:

T T T1( , , ) ( ( ) ) (12 XL E r X X VX X e X 1)

其中,1 是分量均为 1 的列向量,即: T(1,1,...,1) , , 为 Lagrange 乘数。根据 Lagrange乘数法应存在 0 0, 使在 X0 处有:

L

VX e

X1=0 (3-1)

T( )XL

E r

X e =0 (3-2)

T1L

X 1=0 (3-3)

式(3-1)左乘 XT得: 2 ( ) ( )X Xr E r (3-4)

20

金融财务建模与计算——基于 VBA 与 MATLAB 实现

又由式(3-1)得: 1 1 X V e V 1 (3-5)

式(3-5)分别左乘 1T和 eT得:

1= 1TV 1e+ 1T V

11 (3-6)

E(rX)= eTV 1 e + eT V

11 (3-7)

T 1 T 1

T 1

T 1

2 0

A

B

C

B AD BC A

A C

1 V e e V 1

e V e

1 V 1

于是解 , 方程组得:

( )

( )

X

X

CE r A

DB AE r

D

将 , 代入式(3-5)得:

( )XE r X f h (3-8)

其中

1 1

1 1

1 [ ]

1 [ ]

B AD

C AD

f V 1 V e

h V e V 1

再将 , 代入式(3-4)得:

2 21( ) ( ( ) )X XC A

r E rC D C

或 2

2

2 22

( ( ) )( ) 11( ) ( )

XX

AE rr C

D

C C

(3-9)

式(3-8)给出了证券组合权重与预期收益率的关系。式(3-9)给出了证券组合预期

收益率与方差的关系,且说明在 ( )XE r ~ ( )Xr 平面上可有双曲线形式,而在 ( )XE r ~

2 ( )Xr 平面上可有抛物线形式。在 ( )XE r ~ ( )Xr 平面上双曲线的两条渐进线的斜率

为D

C ,顶点为(

1 , A

C C),如图 3-1(a)所示。在 ( )XE r ~ 2 ( )Xr 平面上,其顶点在(

1 , A

C C),

如图 3-1(b)所示。

21

第 3 章 投资组合有效边界模型及其 VBA 实现

错误!

(a)双曲线与顶点图

(b)抛物线与顶点图

图 3-1 双曲线、抛物线与顶点图

通过上面的讨论,在 ( )XE r ~ ( )Xr 平面上最小方差集合是双曲线型,它能分成两部分:

上半部和下半部。两部分以顶点为分界点,分界点代表了一个具有最小标准差的证券组合。

显然我们希望持有的证券组合是在顶点的上半部,而不是在顶点的下半部。 最小方差集合在顶点上半部的证券组合集合称为有效集合(或有效边界)。 有效集合中所有证券组合符合如下准则:给定某一标准差,有效集合中的证券组合可

获得最大预期收益率。 显然最小方差集合在顶点的下半部分对应的预期收益率低。

在上面确定最小方差集合的过程中,权重约束为1

1n

ii

x

,求得的结果 xi 中可能有正

也有负,它反映了允许卖空的情形。 在有些情形下,投资者把不进行卖空作为一种投资策略,因此,讨论在不允许卖空的

约束下如何确定最小方差集合是必要的。这时在约束条件中需要加入 xi0,i=1,…,n。相应

的模型为:

, 1T

1

( )0

n

ii

X

x

E r

X e

X

T1min( )2

X VX

这是二次规划模型。利用 Kuhn-Tucker 条件,可得类似结论。 对于上面的二次规划模型,我们在 3.2 节用程序进行求解。

A/C

( )Xr

A/C

2 ( )Xr O

E(rX)

E(rX)

O1/ C

1/C

22

金融财务建模与计算——基于 VBA 与 MATLAB 实现

这里假定投资组合中有 n 种风险资产,它们的预期收益率和标准差为有限值,且预期

收益率彼此不等,并设这些收益率的协方差矩阵 V 为正定矩阵。

3.2 投资组合有效边界模型的 VBA 实现 多个风险资产投资组合的有效边界模型的设计步骤如下。 (1)首先建立一个名字为“投资组合的有效边界模型.xls”的工作簿,在当前的 Sheet1

上设计模型的结构,如图 3-2 所示。

图 3-2 投资组合的有效边界模型

(2)模型由以下三部分组成:已知数据区域、命令按钮区域(包括一个【准备数据】

按钮、一个【开始计算】按钮、一个【清除表格】按钮)和计算结果区域(在单击【开始

计算】按钮后计算结果的输出区域)。 (3)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程

序代码:

Sub 准备数据() Dim n, i, j As Integer n = Cells(3, 2) Cells(10, 1) = "输入各个证券的预期收益率" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(11, i + 1) = "证券" & i Cells(11, i + 1).HorizontalAlignment = xlCenter Next i Cells(12, 1) = "预期收益率" Cells(13, 1) = "标准差" Range(Cells(12, 1), Cells(13, 1)).HorizontalAlignment = xlCenter Range(Cells(13, 1), Cells(13, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(14, 1) = "输入各个证券间的协方差矩阵" Cells(14, 1).HorizontalAlignment = xlCenter

23

第 3 章 投资组合有效边界模型及其 VBA 实现

Range(Cells(14, 1), Cells(14, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(15, i + 1) = "证券" & i Cells(15, i + 1).HorizontalAlignment = xlCenter For j = 1 To n Cells(15 + j, 1) = "证券" & j Cells(15 + j, 1).HorizontalAlignment = xlCenter Next j Next i For i = 1 To n For j = i To n Cells(15 + i, 1 + j).Select With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid End With With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin End With Next j Next i Range(Cells(15 + n, 1), Cells(15 + n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(4)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程

序代码:

24

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Sub 开始计算() Dim n, nm, nt, i, j As Integer Dim myrange1, myrange2, myrange3 As String Dim xy, x1, x2, y1, y2 As String Dim A, B, C, D, maxrp, maxsi As Double n = Cells(3, 2) For i = 1 To n For j = 1 To n Cells(15 + j, 1 + i) = Cells(15 + i, 1 + j) Next j Next i Cells(17 + n, 1) = "单位向量" For i = 1 To n Cells(17 + n, 1 + i) = 1 Next i Range(Cells(17 + n, 1), Cells(17 + n, 1 + n)).Select With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With '计算 myrange1 = Chr(66) & 12 & ":" & Chr(65 + n) & 12 '收益率向量 myrange2 = Chr(66) & 16 & ":" & Chr(65 + n) & 15 + n '协方差矩阵 myrange3 = Chr(66) & 17 + n & ":" & Chr(65 + n) & 17 + n '单位向量 Cells(19 + n, 1) = "计算过程" Range(Cells(19 + n, 1), Cells(19 + n, 1 + n)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter Range(Cells(19 + n, 1), Cells(19 + n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(20 + n, 1) = "参数 A" Cells(21 + n, 1) = "参数 B" Cells(22 + n, 1) = "参数 C" Cells(23 + n, 1) = "参数 D" Cells(20 + n, 2).FormulaArray = "=mmult(mmult(" & myrange1 & ",minverse("

& myrange2 & ")),transpose(" & myrange3 & "))" '计算参数 A A = Cells(20 + n, 2) Cells(21 + n, 2).FormulaArray = "=mmult(mmult(" & myrange1 & ",minverse("

& myrange2 & ")),transpose(" & myrange1 & "))" '计算参数 B B = Cells(21 + n, 2) Cells(22 + n, 2).FormulaArray = "=mmult(mmult(" & myrange3 & ",minverse("

& myrange2 & ")),transpose(" & myrange3 & "))" '计算参数 C C = Cells(22 + n, 2) Cells(23 + n, 2) = "=B" & 21 + n & "*" & "B" & 22 + n & "-B" & 20 + n & "^2" D = Cells(23 + n, 2) Cells(20 + n, 4) = "绘图需要的数据"

25

第 3 章 投资组合有效边界模型及其 VBA 实现

Range(Cells(20 + n, 4), Cells(20 + n, 5)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter Cells(21 + n, 4) = "预期收益率" Cells(21 + n, 5) = "标准差" Range(Cells(21 + n, 4), Cells(21 + n, 5)).HorizontalAlignment = xlCenter j = 0 nm = 40 nt = nm / 2 maxrp = nm / 100 + 0.1 maxsi = 0 For i = 1 To nm Step 2 j = j + 1 Cells(21 + n + j, 4) = i / 100 Cells(21 + n + j, 5) = Sqr(C / D * (Cells(21 + n + j, 4) - A / C) ^ 2 +

1 / C) Range(Cells(21 + n + j, 5), Cells(21 + n + j, 5)).Select Selection.HorizontalAlignment = xlCenter Selection.NumberFormat = "0.00%" If maxsi < Cells(21 + n + j, 5) Then maxsi = Cells(21 + n + j, 5) End If Next i '开始绘图 xy = Chr(68) & 22 + n & ":" & Chr(69) & 22 + n + nt x1 = "=sheet1!R" & 22 + n & "C5:R" & 22 + n + nt & "C5" ' 投资组合的标准差区域 y1 = "=sheet1!R" & 22 + n & "C4:R" & 22 + n + nt & "C4" ' 投资组合的收益率区域 x2 = "=sheet1!R" & 13 & "C2:R" & 13 & "C" & 1 + n ' 各个证券的标准差区域 y2 = "=sheet1!R" & 12 & "C2:R" & 12 & "C" & 1 + n ' 各个证券的收益率区域 Range(xy).Select Charts.Add ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SeriesCollection(1).XValues = x1 ActiveChart.SeriesCollection(1).Values = y1 ActiveChart.SeriesCollection(2).XValues = x2 ActiveChart.SeriesCollection(2).Values = y2 ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "标准差" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "预期收益率" End With ActiveChart.SeriesCollection(2).Select With Selection .MarkerBackgroundColorIndex = 9 .MarkerForegroundColorIndex = 9 .MarkerStyle = xlCircle .Smooth = False

26

金融财务建模与计算——基于 VBA 与 MATLAB 实现

.MarkerSize = 8 .Shadow = False End With ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = 0 .MaximumScale = Round(maxsi, 1) + 0.2 .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With ActiveChart.Axes(xlValue).Select With ActiveChart.Axes(xlValue) .MinimumScale = 0 .MaximumScale = Round(maxrp, 1) .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With ActiveChart.Legend.Delete ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "0%" ActiveChart.Axes(xlValue).TickLabels.NumberFormatLocal = "0%" ActiveChart.SeriesCollection(2).Select With Selection.Border .Weight = xlHairline .LineStyle = xlNone End With End Sub

(5)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Cells(3, 2) = "" Rows("10:10000").Delete Shift:=xlp Sheet1.ChartObjects.Delete End Sub

这样,就得到多个风险资产投资组合的有效边界模型。只要输入各个资产的预期收益

率、标准差和资产之间的协方差矩阵,单击【开始计算】按钮,模型就自动进行计算,并

自动绘制有效边界图形。

3.3 模型的应用举例 例 3-1 某 4 个证券的投资组合,各个证券的预期收益率、标准差和证券之间的协方

差矩阵如表 3-1 和表 3-2 所示,试计算并绘制该投资组合的有效边界。

27

第 3 章 投资组合有效边界模型及其 VBA 实现

表 3-1 各证券的预期收益率和标准差

证 券 1 证 券 2 证 券 3 证 券 4 预期收益率 8% 12% 6% 18% 标 准 差 32% 26% 45% 36%

表 3-2 各证券间的协方差矩阵

证 券 1 证 券 2 证 券 3 证 券 4 证 券 1 0.1024 0.0328 0.0655 0.0022

证 券 2 0.0328 0.0676 0.0058 0.0184 证 券 3 0.0655 0.0058 0.2025 0.0823 证 券 4 0.0022 0.0184 0.0823 0.1296

计算步骤如下。 (1)在单元格 B3 中输入证券数量“4”。 (2)单击【准备数据】按钮,该模型自动对工作表进行格式化,格式化后的工作表如

图 3-3 所示。 (3)按照格式化后的工作表输入表 3-1 和表 3-2 所示的有关数据。由于协方差矩阵的

对称性,只需要在浅黄色的单元格中输入协方差数据即可。 (4)单击【开始计算】按钮,则模型自动计算,并输出“参数 A”、“参数 B”、“参数

C”、“参数 D”的数值,以及不同预期收益率下投资组合的标准差,如图 3-4 所示。同时,

绘制出投资组合的预期收益率和标准差的曲线图形(有效边界),如图 3-5 所示。

图 3-3 格式化后的工作表 图 3-4 模型计算结果

28

金融财务建模与计算——基于 VBA 与 MATLAB 实现

0%

5%

10%

15%

20%

25%

30%

35%

40%

45%

50%

0% 20% 40% 60% 80% 100%

标准差

预期收

益率

图 3-5 投资组合的预期收益率和标准差的曲线图形(有效边界)

本章小结 本章以投资组合收益和方差为基础,重点建立投资组合最小方差集合与有效边界的模

型,编制了投资组合有效边界模型的 VBA 程序,并用具体实例进行了计算。下一步的目的

是在这个有效边界上寻找最优投资组合。

第 4 章 投资组合风险优化决策

模型及其 VBA 实现 本章要点

建立投资组合最优决策模型。

编制计算最优投资组合的 VBA 程序。

建立最优投资组合决策信息系统。

投资组合优化,就是确定一组投资项目的最优投资比例。这里所说的“最优”,可以是

指在一定期望投资回报水平下使得风险最小,或者是指在一定风险水平下使得投资回报最

大,本章只讨论前者,后者放在第 10 章再讨论。在 20 世纪 50 年代,Harry Markowitz 研

究了一定期望投资回报水平下使得方差最小的最优投资比例问题。Harry Markowitz 在该问

题上取得的研究成果及关于投资的其他研究成果,使他荣获 1991 年诺贝尔经济奖。下面通

过例子说明投资组合优化问题的建模与 VBA 求解方法。

4.1 单项投资的期望回报率与风险 如果投资对象只有一个,则该投资的回报可以用期望回报率来描述,该投资的风险可

以用方差或均方差来描述。下面介绍期望值、方差与均方差的概念。 如果某人要对某项目投资,例如购买某一种股票,他如何估计该项目的平均回报和风

险呢?设该项目的投资回报率为 ri,该回报率是一个随机数,它表明在第 i 年每元钱投资的

年回报率。例如 ri=0.15,说明在年初投资 1 元,在年末就增值到 1+1×0.15=1.15 元;当

ri=0.15 时,说明在年初投资 1 元,在年末就变为 1+1×(-0.15)=0.85 元。该项目在前 n

年的回报率是由 n 个数组成的向量(r1,r2,…,rn)。由于无法确切地知道该项目未来的回报率,

所以通常只能用该项目的历史业绩来近似地估计未来的回报率,即用前 n 年的回报 率(r1,r2,…,rn)的期望值来估计本年的期望回报率。这 n 个数的期望值的计算公式如下:

1 2 1...

n

in i

rr r r

rn n

30

金融财务建模与计算——基于 VBA 与 MATLAB 实现

式中,ri 为第 i 年的回报率; r 为期望回报率;n 为数据的个数。 期望回报率 r 描述了投资的平均回报水平。不过,仅仅用期望回报率来描述投资效果

是不够的。例如,有一组回报率由(0.10,0.30,0.70)组成,其期望回报率是 0.30,另

一组回报率由(0.25,0.30,0.35)组成,其期望回报率也是 0.30。两组数的期望回报率相

同,但前一组中的数据比较分散,反映出前一项投资回报率的起落较大,或者说风险较大;

而后一组中的数据则比较接近,反映出后一项投资回报率较平稳,或者说风险较小。所以,

还需用离散趋势的量度来描述数据的起落,也就是风险的大小。描述一组回报率(r1,r2,…,rn)

离散趋势的常用测度是方差和标准方差。方差的计算公式如下:

2

2 1( )

n

ii

r r

n

式中, 2 为回报率的方差; ir 为第 i 年的回报率; r 为期望回报率;n 为数据的个数。 将方差开平方,得到的即为回报率的标准方差(也称标准差,或平均方差)。标准方差

的计算公式如下:

2

1( )

n

ii

r r

n

式中, 为回报率的标准方差。 综上所述,一个投资项目的投资效果可以用投资回报率的期望值和方差(或标准方差)

描述,前者反映了该项投资的回报水平,后者反映了该项投资的风险状况。

4.2 一组投资(即多项投资)的期望回报与风险 如果投资对象不止一个,则该组投资的回报率不仅与各投资项目的单项期望回报率有

关,而且与各项目的投资比例有关。设一组投资由 m 个投资项目组成,它们的单项期望回

报率为( 1 2, ,..., m ),该 m 个项目的投资比例为( 1 2, ,..., mx x x ),则该组投资的总回报率

R 的期望值为单项期望回报率与相应的投资比例的乘积之和。其估算公式如下:

R 的期望值= 1 1 2 2 ... m mx x x (4-1)

式中,R 为投资组合的总回报率; 1 2, ,..., m 为第 1 个至第 m 个项目的单项期望回报率;

1 2, ,..., mx x x 为第 1 个至第 m 个项目的投资比例。 投资组合的总回报率的期望值描述了多项投资的总体平均回报水平。同样地,仅仅用

总回报率期望值来描述投资组合的效果是不够的,还需描述总回报率的离散趋势,也就是

整个投资组合风险的大小。一组投资的总回报率的风险(或离散趋势)的常用测度是总回

报率的方差和标准方差。总回报率的方差与下面几个因素有关。 (1)与单项回报率的方差有关。因为单项回报率的方差越大(即单项投资的风险越大),

总回报率的方差也越大(即投资组合的风险越大)。 (2)与各项目的投资比例有关。投资比例大的项目,对投资组合的风险影响也大。

31

第 4 章 投资组合风险优化决策模型及其 VBA 实现

(3)与各投资项目之间的相关性有关。一个投资项目的风险,可能影响另一个投资项

目的风险,从而影响整个投资组合的风险。 总回报率 R 的方差的估算公式如下:

R 的方差= 2 2 2 2 2 21 1 2 2 ... m m i j ij i j

i j

x x x x x

(4-2)

式中,R 为投资组合的总回报率; 1 2, ,..., mx x x 为第 1 个至第 m 个项目的投资比例;2 2 21 2, ,..., m 为第 1 个至第 m 个项目的单项回报率的方差; 1 2, ,..., m 为第 1 个至第 m 个

项目的单项回报率的标准方差; ij 为第 i个投资项目与第 j个投资项目的相关系数。1≤ ij≤1, ij = ji , ii =1。

式(4-2)的右边包含了两个部分,第一部分是 2 2 2 2 2 21 1 2 2 ... m mx x x ,它是各投资

项目的单项回报率的方差与该项目投资比例的平方的乘积之和,它反映出总方差取决于

各项目的单项方差与投资比例。第二部分是 i j ij i ji j

x x ,它反映出总方差还取决于各

投资项目的相关性,当相关系数 ij =0 时,第 i 个投资项目与第 j 个投资项目之间无相关

性,第二部分的值等于零;当相关系数 0ij 时,由于项目之间的相关性,第 i 个投资项

目的风险将影响第 j 个投资项目的风险,从而进一步影响整个投资组合的风险。其中,当

0ij 时,说明第 i 个投资项目的投资风险的增加将使得第 j 个投资项目的风险增加(称

为正相关),从而使得整个投资组合的风险增加;当 0ij 时,说明第 i 个投资项目的投

资风险的增加将使得第 j 个投资项目的风险减小(称为负相关),从而使得整个投资组合

的风险减小。 综上所述,一组投资项目的投资效果可以用投资组合的总回报率的期望值和方差(或

者标准方差)描述,前者反映了该组投资的总体回报水平,后者反映了该组投资的总体风

险状况。

4.3 用电子表格计算期望值、方差、标准方差和相关系数 前面介绍的期望值、方差、标准方差、相关系数等,均可以用 Excel 计算公式求得,

如表 4-1 所示。

表 4-1 Excel 计算公式表

计算内容 期 望 值 方 差 标准方差 相关系数

Excel 的相应公式符号 AVERAGE VAR STDEV CORREL

下面通过一个例子来说明用 Excel 公式计算投资回报率的期望值、方差、标准方差和

相关系数的方法。 例 4-1 求投资回报率的期望值、方差、标准方差和相关系数。 现有三个可投资的项目:股票 1,股票 2 和债券。它们自 1981 年至 2000 年来 20 年的

投资回报率如表 4-2 所示。分别计算这三个单项投资回报率的期望值、方差、标准方差,

以及三个项目之间的相关系数矩阵。

32

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 4-2 三个投资项目的单项回报率历史数据

例 投资组合优化模型

1 历史数据

2 时期 股票 1 股票 2 债券

3 1 0 0.07 0.06

4 2 0.04 0.13 0.07

5 3 0.13 0.14 0.05

6 4 0.19 0.43 0.04

7 5 0.15 0.67 0.07

8 6 0.27 0.64 0.08

9 7 0.37 0 0.06

10 8 0.24 0.22 0.04

11 9 0.07 0.18 0.05

12 10 0.07 0.31 0.07

13 11 0.19 0.59 0.1

14 12 0.33 0.99 0.11

15 13 0.05 0.25 0.15

16 14 0.22 0.04 0.11

17 15 0.23 0.11 0.09

18 16 0.06 0.15 0.1

19 17 0.32 0.12 0.08

20 18 0.19 0.16 0.06

21 19 0.05 0.22 0.05

22 20 0.17 0.02 0.07

解:用 Excel 计算公式(如表 4-1 所示)计算这三个投资项目的单项回报率的期望值、

方差、标准方差和相关系数,如表 4-3 所示。

表 4-3 三个投资项目的期望值、方差、标准方差和相关系数计算公式表

A B C D

1 例 投资组合优化模型

2 历史数据

3 时期 股票 1 股票 2 债券

4 1 0 0.07 0.06

5 2 0.04 0.13 0.07

6 3 0.13 0.14 0.05

7 4 0.19 0.43 0.04

8 5 0.15 0.67 0.07

9 6 0.27 0.64 0.08

10 7 0.37 0 0.06

11 8 0.24 0.22 0.04

33

第 4 章 投资组合风险优化决策模型及其 VBA 实现

续表 A B C D

12 9 0.07 0.18 0.05

13 10 0.07 0.31 0.07

14 11 0.19 0.59 0.1

15 12 0.33 0.99 0.11

16 13 0.05 0.25 0.15

17 14 0.22 0.04 0.11

18 15 0.23 0.11 0.09

19 16 0.06 0.15 0.1

20 17 0.32 0.12 0.08

21 18 0.19 0.16 0.06

22 19 0.05 0.22 0.05

23 20 0.17 0.02 0.07

24

25 统计量计算

26 期望值 =AVERAGE(B4:B23) =AVERAGE(C4:C23) =AVERAGE(D4:D23)

27 方差 =VAR(B4:B23) =VAR(C4:C23) =VAR(C4:C23)

28 标准方差 =STDEV(B4:B23) =STDEV(B4:B23) =STDEV(B4:B23)

29

30 相关系数

31 股票 1 股票 2 债券

32 股票 1 1 =CORREL(B4:B23,C4:C23) =CORREL(B4:B23,D4:D23)

33 股票 2 =C32 1 =CORREL(C4:C23,D4:D23)

34 债券 =D32 =D33 1

由表 4-3 可知,计算期望值时只需输入公式:

=AVERAGE(数据组所在的地址)

计算方差时只需输入公式:

=VAR(数据组所在的地址)

计算标准方差时只需输入公式:

=STDEV(数据组所在的地址)

计算三个项目的相关系数时,要分别计算项目 1 和 2 的相关系数、项目 1 和 3 的相

关系数,以及项目 2 和 3 的相关系数。在计算项目 1 和 2 的相关系数时,在单元格中输

入公式:

=CORREL(项目 1 的数据地址,项目 2 的数据地址)

同理可以计算出项目 1 和 3 的相关系数,以及项目 2 和 3 的相关系数。 计算相关系数的另一个方法是打开 Excel 中的“工具”菜单,选择“数据分析”,就会

出现“数据分析”窗口,如图 4-1 所示。

34

金融财务建模与计算——基于 VBA 与 MATLAB 实现

在图 4-1“数据分析”窗口中选择“相关系数”,打开“相关系数”窗口,如图 4-2 所

示。在图 4-2 中填入三个项目的历史数据所在地址区域及输出区域(只需填入输出区域左

上角的单元格地址),就可得到三个项目的相关系数矩阵。

图 4-1 “数据分析”窗口 图 4-2 “相关系数”窗口

在图 4-2 中单击【确定】按钮,即可得到表 4-4 中的计算结果。

表 4-4 三个投资项目的期望值、方差、标准方差和相关系数计算结果

A B C D

1 例 投资组合优化模型

2 历史数据

3 时期 股票 1 股票 2 债券

4 1 0 0.07 0.06

5 2 0.04 0.13 0.07

6 3 0.13 0.14 0.05

7 4 0.19 0.43 0.04

8 5 0.15 0.67 0.07

9 6 0.27 0.64 0.08

10 7 0.37 0 0.06

11 8 0.24 0.22 0.04

12 9 0.07 0.18 0.05

13 10 0.07 0.31 0.07

14 11 0.19 0.59 0.1

15 12 0.33 0.99 0.11

16 13 0.05 0.25 0.15

17 14 0.22 0.04 0.11

18 15 0.23 0.11 0.09

19 16 0.06 0.15 0.1

20 17 0.32 0.12 0.08

21 18 0.19 0.16 0.06

22 19 0.05 0.22 0.05

23 20 0.17 0.02 0.07

24

25 统计量计算

35

第 4 章 投资组合风险优化决策模型及其 VBA 实现

续表 A B C D

26 期望值 0.1130 0.1850 0.0755

27 方差 0.0274 0.1102 0.0008

28 标准方差 0.1656 0.3319 0.0278

29

30 相关系数

31 股票 1 股票 2 债券

32 股票 1 1.0000 0.1959 0.0289

33 股票 2 0.1959 1.0000 0.0134

34 债券 0.0289 0.0134 1.0000

4.4 投资组合优化的非线性规划模型及其 VBA 实现 大部分投资者的目标是获得大的投资回报和承担小的投资风险。投资组合优化模型就

是确定一组投资项目的最优投资比例(或者各项目的最优投资额),在该投资组合的总回报

率的方差不超过某个可接受的值的约束下(即在可接受的风险水平下),使得总回报率的期

望值最大(即投资回报水平最高);或者在投资组合的总回报率的期望值不低于某个所要求

的值的约束下(即在所要求的投资回报水平下),使得总回报率的方差最小(即投资风险最

小)。由于总回报率的方差通常总是投资比例的非线性函数,所以该规划是一个非线性规划。 例如,对于目标函数为风险最小的投资组合优化模型,由式(4-2)可得到投资总回报

率 R 的方差估计量,又由式(4-1)可以得到投资总回报率 R 的期望值。该模型的形式如下:

o.b. min R 的方差= 2 2 2 2 2 21 1 2 2 ... m m i j ij i j

i j

x x x x x

(4-3)

s.t. R 的期望值= 1 1 2 2 ... m mx x x ≥P

1 2 ... 1mx x x

1 2, ,..., mx x x ≥0

式(4-3)中,R 为投资组合的总回报率; 1 2, ,..., mx x x 为第 1 个至第 m 个项目的投资比

例(决策变量); 2 2 21 2, ,..., m 为第 1 个至第 m 个项目的单项回报率的方差; 1 2, ,..., m 为

第 1 个至第 m 个项目的单项回报率的标准方差; ij 为第 i 个投资项目与第 j 个投资项目的

相关系数; 1 2, ,..., m 为第 1 个至第 m 个项目的单项期望回报率;P 为投资者所要求的回

报率水平。 下面通过例 4-2 说明投资组合优化问题的建模与求解方法。 例 4-2 投资组合优化问题。 计算例 4-1 中对三个投资项目的最优投资比例,要求在总投资回报率不低于 0.13 的前

提下,使得投资的风险最小。 解:这是以投资总风险最小为目标,以总回报率不低于要求值为约束条件的优化问

题,该问题可以用式(4-3)建立非线性规划模型来求解。该问题的 Spreadsheet 如表 4-5所示。

36

金融财务建模与计算——基于 VBA 与 MATLAB 实现

第一步:输入已知数据。 首先在 Spreadsheet 上输入已知数据。在 A4:D23 输入三个投资项目在各历史年份的回

报率,以及所要求的总回报率的期望值。

表 4-5 已知数据表

A B C D E F G

1 例 投资组合优化模型

2 历史数据

3 时期 股票 1 股票 2 债券

4 1 0 0.07 0.06

5 2 0.04 0.13 0.07

6 3 0.13 0.14 0.05

7 4 0.19 0.43 0.04

8 5 0.15 0.67 0.07

9 6 0.27 0.64 0.08

10 7 0.37 0 0.06

11 8 0.24 0.22 0.04

12 9 0.07 0.18 0.05

13 10 0.07 0.31 0.07

14 11 0.19 0.59 0.1

15 12 0.33 0.99 0.11

16 13 0.05 0.25 0.15

17 14 0.22 0.04 0.11

18 15 0.23 0.11 0.09

19 16 0.06 0.15 0.1

20 17 0.32 0.12 0.08

21 18 0.19 0.16 0.06

22 19 0.05 0.22 0.05

23 20 0.17 0.02 0.07

24

25 统计量计算

26 期望值 0.1130 0.1850 0.0755

27 方差 0.0274 0.1102 0.0008

28 标准方差 0.1656 0.3319 0.0278

29

30 相关系数

31 股票 1 股票 2 债券

32 股票 1 1.0000 0.1959 0.0289

33 股票 2 0.1959 1.0000 0.0134

34 债券 0.0289 0.0134 1.0000

37

第 4 章 投资组合风险优化决策模型及其 VBA 实现

续表 A B C D E F G

35

36 模型

37

38 决策变量

39 股票 1 股票 2 债券 投资比例之和

40 投资比例 0.5063 0.3243 0.1693 1 = 1

41 投资比例的平方 0.2564 0.1052 0.0287

42

43 总回报率期望值

44 实际值 要求值

45 0.1300 >= 0.13

46

47

48 总回报率方差 0.0151

49

50 总回报率标准方差 0.1228

第二步:计算各投资项目的单项回报率期望值、单项回报率方差,及各投资项目之间

的相关系数。 根据前面介绍的 Excel 计算公式,可计算出各投资项目的各个统计量。其计算方法与

例 4-1 相同,这里不再重复。计算公式如表 4-6 所示。

表 4-6 投资组合优化模型中统计量的计算公式

25 统计量计算

26 期望值 =AVERAGE(B4:B23) =AVERAGE(C4:C23) =AVERAGE(D4:D23)

27 方差 =VAR(B4:B23) =VAR(C4:C23) =VAR(C4:C23)

28 标准方差 =STDEV(B4:B23) =STDEV(B4:B23) =STDEV(B4:B23)

29

30 相关系数

31 股票 1 股票 2 债券

32 股票 1 1 =CORREL(B4:B23,C4:C23) =CORREL(B4:B23,D4:D23)

33 股票 2 =C32 1 =CORREL(C4:C23,D4:D23)

34 债券 =D32 =D33 1

第三步:建立非线性规划模型。 本题的决策变量是各投资项目的投资比例。用单元格 B40:D40 分别表示股票 1、股票

2 和债券的投资比例,如表 4-5 所示。 本题的目标函数是投资组合的风险最小,即投资组合总回报率的方差最小。由式(4-2)

可知,投资组合总回报率 R 的方差的计算公式如下:

38

金融财务建模与计算——基于 VBA 与 MATLAB 实现

R 的方差= 2 2 2 2 2 21 1 2 2 ... m m i j ij i j

i j

x x x x x

本题中有三个投资项目,所以上式变为:

R 的方差= 2 2 2 2 2 21 1 2 2 3 3 1 2 12 1 2 2 1 21 2 1 1 3 13 1 3x x x x x x x x x

3 1 31 3 1 2 3 23 2 3 3 2 32 3 2x x x x x x

= 2 2 2 2 2 21 1 2 2 3 3x x x

1 2 12 1 2 1 3 13 1 3 2 3 23 2 32 2 2x x x x x x (4-4) 用单元格 C48 表示投资组合总回报率 R 的方差(即目标函数)。根据式(4-3),在单元

格 C48 中输入: =SUMPRODUCT(B41:D41,B27:D27)+2*B40*C40*C32*B28*C28+2*B40*D40*D32*

B28*D28+2*C40*D40*D33*C28*D28 上式中,单元格 B41:D41 中的三个值分别为三个项目投资比例的平方;单元格 B27:

D27 中的三个值分别为三个项目的单项回报率的方差;单元格 B28:D28 中的三个值分别为

三个项目的单项回报率的标准方差;单元格 C32、D32、D33 中的值分别为股票 1 与股票 2、股票 1 与债券、股票 2 与债券之间的相关系数。

如果我们建立表 4-7 的协方差矩阵,则上述表达式可大大简化。

表 4-7 协方差矩阵

A B C D

30 协方差矩阵

31 股票 1 股票 2 债券

32 股票 1 =B27 =COVAR(B4:B23,C4:C23) =COVAR(B4:B23,D4:D23)

33 股票 2 =C32 =C27 =COVAR(C4:C23,D4:D23)

34 债券 =D32 =D33 =D27

这时,投资组合总回报率 R 的方差(即目标函数)可以用如下更简单的方法表示: =SUMPRODUCT(MMULT(B40:D40,B32:D34),B40:D40) 本题有三个约束条件。第一个约束条件是投资组合总回报率的期望值约束。由式(4-1)

可知,投资组合总回报率 R 的期望值的计算公式如下:

R 的期望值= 1 1 2 2 ... m mx x x

本题中有三个投资项目,所以上式变为:

R 的期望值= 1 1 2 2 3 3x x x (4-5)

用单元格 B45 表示实际投资组合总回报率 R 的期望值。根据上式,在单元格 B45 输入:

=SUMPRODUCT (B26:D26,B40:D40)

上式中,单元格 B26:D26 中的三个值分别为三个项目的单项投资回报率期望值,单元

格 B40:D40 中的值分别是三个项目的投资比例。式(4-5)计算得到的投资组合总回报率

的期望值必须不小于要求达到的值,本题中要求达到的期望值为 0.13,用单元格 D45 表示。 第二个约束条件是投资比例之和应等于 1。用单元格 E40 表示投资比例之和,可用下

39

第 4 章 投资组合风险优化决策模型及其 VBA 实现

式计算:

=SUM(B40:D40)

它应等于 1。 第三个约束条件是非负约束。 第四步:利用“规划求解”功能求出非线性规划的解。 在“规划求解参数”对话框中输入目标单元格(目标函数地址)、可变单元格(可变变

量地址)和约束条件,如图 4-3 所示。

图 4-3 “规划求解参数”对话框

然后单击【选项】按钮,在弹出的对话框中选择“假定非负”(注意:本题是非线性规

划问题,所以不选择“采用线性模型”),最后在“规划求解参数”对话框中单击【求解】

按钮得到本题的解。 第五步:判断用“规划求解”功能求出的解是否是本题的最优解。 本题的模型如式(4-3)所示:

o.b. min R 的方差= 2 2 2 2 2 21 1 2 2 ... m m i j ij i j

i j

x x x x x

s.t. R 的期望值= 1 1 2 2 ... m mx x x ≥P

1 2... 1mx x x 1 2, ,..., mx x x ≥0

本题为最小化问题,其目标函数是总风险(总方差)最小。由式(4-3)可知,总风险

是决策变量的幂函数。 由凸函数的定义可知,幂函数 Y=cxa,a≥1,c≥0,x≥0 是凸函数。

可见式(4-3)的目标函数是若干个凸函数之和,因此,本题的目标函数是一个凸函数。

此外,本题的约束条件均为线性,所以本题满足运用“规划求解”功能求解非线性规划问

题的条件,所求得的解是整体最优解。 模型运行结果如表 4-5 所示。由该表可得本题的最优解如下:股票 1、股票 2、债券的

投资比例为 0.5063:0.3243:0.1693。这时,投资组合的总回报率期望值达到所要求的 0.13,而投资组合的总回报率的方差最小,为 0.0151。

第六步:置信区间分析。 当投资组合总回报率服从正态分布时,根据正态分析的统计理论,总回报率的置信区

间如下:

40

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(1)总回报率的值落在区间[总回报率期望值总回报率标准方差,总回报率期望值+总回报率标准方差]的概率是 68%;

(2)总回报率的值落在区间[总回报率期望值2总回报率标准方差,总回报率期望值+ 2总回报率标准方差]的概率是 95%;

(3)总回报率的值落在区间[总回报率期望值3总回报率标准方差,总回报率期望值+ 3总回报率标准方差]的概率是 99.7%。

本题中,总回报率期望值=0.13,总回报率标准方差= 方 差 差总回报率方差= 0.0151 =0.1228。

所以当总回报率服从正态分布时,总回报率以 68%的概率落在区间[0.0072,0.2528](即

[0.130.1228,0.13+0.1228]);以 95%的概率落在区间[0.1156,0.3756](即[0.1320.1228,0.13+20.1228]);以 99.7%的概率落在区间[0.2384,0.4984](即[0.1330.1228,0.13+ 30.1228])。

上面的计算是通过对单元格的操作来实现的,这是很麻烦的,稍不小心,就很容易出

错,为避免出错,我们编制了一个 VBA 程序,来简化上述的操作。VBA 程序如下:

Sub js() Range("b26") = Application.Average(Range("b4:b23")) Range("c26") = Application.Average(Range("c4:c23")) Range("d26") = Application.Average(Range("d4:d23")) Range("b27") = Application.Var(Range("b4:b23")) Range("c27") = Application.Var(Range("c4:c23")) Range("d27") = Application.Var(Range("d4:d23")) Range("b28") = Application.StDev(Range("b4:b23")) Range("c28") = Application.StDev(Range("c4:c23")) Range("d28") = Application.StDev(Range("d4:d23")) Range("b32") = 1 Range("c32") = Application.Correl(Range("b4:b23"), Range("c4:c23")) Range("d32") = Application.Correl(Range("b4:b23"), Range("d4:d23")) Range("b33") = Range("c32") Range("c33") = 1 Range("d33") = Application.Correl(Range("c4:c23"), Range("d4:d23")) Range("b34") = Range("d32") Range("c34") = Range("d33") Range("d34") = 1 Cells(40, 5) = "=SUM(B40:D40)" Cells(41, 2) = "=B40^2" Cells(41, 3) = "=c40^2" Cells(41, 4) = "=d40^2" Cells(45, 2) = "=SUMPRODUCT(B26:D26,B40:D40)" Cells(48, 3) = "=SUMPRODUCT(B41:D41,B27:D27)+2*B40*C40*C32*B28*C28+2*B40*

D40*D32*B28*D28+2*C40*D40*D33*C28*D28" Cells(50, 3) = "=SQRT(C48)" SolverReset SolverOk setcell:="$c$50", MaxminVal:=2, ValueOf:="0", byChange:=

41

第 4 章 投资组合风险优化决策模型及其 VBA 实现

"$b$40:$d$40" SolverAdd CellRef:="$e$40", Relation:=2, FormulaText:="100%" SolverAdd CellRef:="$b$45", Relation:=3, FormulaText:="13%" SolverSolve (True) End Sub

需要注意的是:在使用规划求解函数如 SolverOk()、SolverAdd()等编制程序进行

求解之前,首先必须建立对规划求解加载宏的引用。方法是:在 Visual Basic 编辑器窗口,

执行【工具】菜单中的【引用】命令,如图 4-4 所示,打开“引用-VBAProject”窗口,如

图 4-5 所示,然后选中“可使用的引用”列表框中的“SOLVER ”复选框。

图 4-4 执行【引用】命令 图 4-5 “引用-VBAProject”窗口

如果“SOLVER ”未出现在“可使用的引用”列表框中,则需要单击【浏览】按钮,

并打开“\Office\Library\ SOLVER”子文件夹中的“Solver.xla”。

4.5 通用投资组合优化决策模型及其 VBA 实现

4.5.1 最优投资组合的确定 考虑一个投资组合 X,它由 n 个证券组成,每个证券的预期收益率为 ( )iE r ,方差记为

2i ,证券之间的协方差记为 ( )ij i j ,i, j=1,2,…,n。于是证券投资组合的收益率 Xr 和风险

2 ( )Xr 可以表示成: 2 T( )Xr X VX

在给定预期收益率 ( )XE r 之下,如何选择证券组合的权重 1,..., nx x ,使证券组合 X 具有

最小方差呢? 记 T

1 2( ( ), ( ),..., ( ))nE r E r E re ,为确定最小方差集合,我们考虑如下优化模型,即一般

的马柯维茨模型:

T1min( )2

X VX , 1T

1s.t.

( )

n

ii

X

x

E r

X e

42

金融财务建模与计算——基于 VBA 与 MATLAB 实现

这是一个等式约束的极值问题。 在有些情形下,投资者把不进行卖空作为一种投资策略,因此,讨论在不允许卖空的

约束下如何确定最小(或最优)方差集合是必要的。这时在约束条件中需要加入 xi 大于 0,i=1,…,n。相应的模型为:

T1min( )2

X VX ,

1T

1

( )0

n

ii

X

x

E r

X e

X

这是二次规划模型。对于上面的二次规划模型,我们可以通过如下的 VBA 程序来进行

求解。

4.5.2 通用投资组合风险的最优化模型的 VBA 实现 (1)首先建立一个名字为“通用投资组合风险的最优化模型.xls”的工作簿,在当前的

Sheet1 上设计模型的结构,如图 4-6 所示。

图 4-6 通用投资组合风险的最优化模型

是否允许卖空的下拉列表框控件插入在单元格 B5 的位置,此下拉列表框控件的单元

格链接为“$B$5”,数据区域为“$C$5:$C$6”,并在单元格 C5 和 C6 中分别输入“允许卖

空”和“不允许卖空”,且此两个单元格的字体颜色设置为白色,以便使模型界面美观。 (2)模型由以下三部分组成: 已知数据区域、命令按钮区域(包括一个【准备数据】

按钮、一个【开始计算】按钮、一个【清除表格】按钮)和计算结果区域(在单击【开始

计算】按钮后计算结果的输出区域)。 (3)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程

序代码:

Sub 准备数据() Dim n, i, j As Integer n = Cells(3, 2) Cells(10, 1) = "输入各个证券的预期收益率" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom)

43

第 4 章 投资组合风险优化决策模型及其 VBA 实现

.LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(11, i + 1) = "证券" & i Cells(11, i + 1).HorizontalAlignment = xlCenter Next i Cells(12, 1) = "预期收益率" Range(Cells(12, 1), Cells(13, 1)).HorizontalAlignment = xlCenter Range(Cells(12, 1), Cells(12, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(14, 1) = "输入各个证券间的协方差矩阵" Cells(14, 1).HorizontalAlignment = xlCenter Range(Cells(14, 1), Cells(14, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(15, i + 1) = "证券" & i Cells(15, i + 1).HorizontalAlignment = xlCenter For j = 1 To n Cells(15 + j, 1) = "证券" & j Cells(15 + j, 1).HorizontalAlignment = xlCenter Next j Next i For i = 1 To n For j = i To n Cells(15 + i, 1 + j).Select With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid End With With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin End With Next j

44

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Next i Range(Cells(15 + n, 1), Cells(15 + n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(4)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程

序代码:

Sub 开始计算() Dim n, i, j As Integer Dim myrange1, myrange2, myrange3 As String Dim x1, x2, x3 As String n = Cells(3, 2) For i = 1 To n For j = 1 To n Cells(15 + j, 1 + i) = Cells(15 + i, 1 + j) Next j Next i If Cells(5, 2) = 1 Then Cells(17 + n, 1) = "优化计算结果——允许卖空" Else Cells(17 + n, 1) = "优化计算结果——不允许卖空" End If For i = 1 To n Cells(18 + n, i + 1) = "证券" & i Next i Cells(18 + n, n + 2) = "合计" Cells(19 + n, 1) = "比重(%)" Cells(20 + n, 1) = "预期收益率" Cells(21 + n, 1) = "标准差" myrange1 = "b" & 12 & ":" & Chr(65 + n) & 12 '各个证券收益率数据区域 myrange2 = "b16" & ":" & Chr(65 + n) & 15 + n '协方差矩阵数据区域 myrange3 = "b" & 19 + n & ":" & Chr(65 + n) & 19 + n '投资比例计算结果数据

区域 Cells(20 + n, 2) = "=sumproduct(" & myrange1 & "," & myrange3 & ")" Cells(21 + n, 2) = "=sqrt(sumproduct(" & myrange3 & ",mmult(" & myrange3

& "," & myrange2 & ")))" Cells(19 + n, n + 2) = "=sum(" & myrange3 & ")" x1 = Chr(66 + n) & 19 + n '投资组合比重合计率数据区域 x2 = "b" & 21 + n '投资组合标准差数据区域 x3 = "b" & 20 + n '投资组合预期收益率数据区域 Range(myrange3).NumberFormat = "0.00%" Range(x1).NumberFormat = "0.00%"

45

第 4 章 投资组合风险优化决策模型及其 VBA 实现

Range(x2).NumberFormat = "0.00%" Range(x3).NumberFormat = "0.00%" '开始利用规划求解工具计算 SolverReset SolverOk setcell:=x2, MaxminVal:=2, ValueOf:="0", byChange:=myrange3 SolverAdd CellRef:=x1, Relation:=2, FormulaText:="100%" SolverAdd CellRef:=x3, Relation:=3, FormulaText:="$b$7" If Cells(5, 2) = 2 Then SolverAdd CellRef:=myrange3, Relation:=3, FormulaText:="0" End If SolverSolve (True) End Sub

(5)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Cells(3, 2) = "" Rows("10:10000").Delete Shift:=xlUp End Sub

4.5.3 通用投资组合风险的最优化模型的应用举例

例 4-3 某 4 个证券的投资组合,各个证券的预期收益率和证券之间的协方差矩阵如

表 4-8 和表 4-9 所示,要求的最低期望收益率为 15%,试计算不允许卖空情况下的最优投

资组合。

表 4-8 各证券的预期收益率

证 券 1 证 券 2 证 券 3 证 券 4 预期收益率 8% 12% 6% 18%

表 4-9 各证券间的协方差矩阵

证 券 1 证 券 2 证 券 3 证 券 4 证 券 1 0.1024 0.0328 0.0655 0.0022 证 券 2 0.0328 0.0676 0.0058 0.0184 证 券 3 0.0655 0.0058 0.2025 0.0823 证 券 4 0.0022 0.0184 0.0823 0.1296

计算步骤如下。 (1)在单元格 B3 中输入证券数量“4”。 (2)单击【准备数据】按钮,该模型自动对工作表进行格式化,格式化后的工作表如

图 4-7 所示。 (3)按照格式化后的工作表输入表 4-8 和表 4-9 所示的有关数据。由于协方差矩阵的

对称性,只需要在浅黄色的单元格中输入协方差数据即可。

46

金融财务建模与计算——基于 VBA 与 MATLAB 实现

图 4-7 格式化后的工作表

(4)单击是否允许卖空下拉列表框的下拉三角按钮,选择“不允许卖空”,单击【开始

计算】按钮,则模型自动计算最优投资比例,如图 4-8 所示。

图 4-8 最优投资比例计算结果

4.6 通用投资组合优化决策信息系统及其 VBA 实现 下面以最优投资组合模型为例,来说明投资组合优化决策信息系统的实现方法。

4.6.1 设计自定义菜单 为了方便用户使用信息系统,可以在 Excel 系统菜单上增加自定义菜单,此自定义菜

47

第 4 章 投资组合风险优化决策模型及其 VBA 实现

单有 3 个命令,分别为【准备数据】、【优化计算】和【删除数据】,并把增加自定义菜单的

宏设计为自动宏。 建立一个名字为“最优投资组合决策信息系统.xls”的工作簿,在 Visual Basic 编辑器

窗口中,执行【插入】菜单中的【模块】命令,插入一个“模块 1”,在此模块中编写如下

的自动宏代码:

Sub auto_open() MenuBars(xlWorksheet).Menus.Add "最优投资组合决策信息系统" MenuBars(xlWorksheet).Menus("最优投资组合决策信息系统").MenuItems.Add "准备

数据", "准备" MenuBars(xlWorksheet).Menus("最优投资组合决策信息系统").MenuItems.Add "优化

计算", "计算" MenuBars(xlWorksheet).Menus("最优投资组合决策信息系统").MenuItems.Add "删除

数据", "删除" End Sub Sub auto_close() MenuBars(xlWorksheet).Reset MenuBars(xlWorksheet).Activate End Sub

这样,在每次打开工作簿“最优投资组合决策信息系统.xls”时,就自动在 Excel 系统

菜单上加载【最优投资组合决策信息系统】的自定义菜单,如图 4-9 所示。而关闭此工作

簿时,该自定义菜单自动卸载。

图 4-9 【最优投资组合决策信息系统】的自定义菜单

4.6.2 设计基本数据输入窗体 证券最优投资组合的类型一般分为三大类型,即: (1)直接求最低风险下的最优投资组合,此时的目标函数是风险(标准差或方差)最小; (2)给定最低预期收益率下的最低风险的最优投资组合,此时的目标函数是风险(标

准差或方差)最小,但有一个最低预期收益率的约束条件; (3)给定最高风险下的最大预期收益率的最优投资组合,此时的目标函数是预期收益

率最大,但有一个最高风险的约束条件。 因此,需要设计一个输入已知数据(包括投资组合的证券数量、最低预期收益率或最

高风险、是否允许卖空)的窗体。 在 Visual Basic 编辑器窗口下,执行【插入】菜单中的【用户窗体】命令,插入一个用

户窗体“UserForm1”,将其 Caption 属性设置为“最优投资组合决策(输入基本数据)”,

如图 4-10 所示。

48

金融财务建模与计算——基于 VBA 与 MATLAB 实现

图 4-10 插入用户窗体

窗体的设计步骤如下。 (1)在此窗体上插入 3 个框架 Frame1~Frame3,各框架说明如下。 ① 框架 Frame1 的 Caption 属性设置为“投资组合决策的证券数量”,在此内插入 1 个

标签 Label1,其 Caption 属性设置为“证券数量”,插入 1 个文本框 TextBox1,其 Value 属

性设置为空值。

② 框架 Frame2 的 Caption 属性设置为“是否允许卖空”,在此内插入 2 个单选按钮

OptionButton1 和 OptionButton2,其 Caption 属性分别设置为“允许卖空”和“不允许卖空”,

其中单选按钮 OptionButton1 的 Value 属性设置为 True。 ③ 框架 Frame3 的 Caption 属性设置为“优化模型选择”,在此内插入 3 个单选按钮

OptionButton3、OptionButton4 和 OptionButton5,其 Caption 属性分别设置为“最低风险”、

“给定最低收益率”和“给定最高风险(标准差)”,其中单选按钮 OptionButton3 的 Value属性设置为 True。在此框架内插入两个文本框 TextBox2 和 TextBox3,其 Value 属性设置为

空值。框架 Frame3 的 5 个控件 OptionButton3、OptionButton4、OptionButton5、TextBox2和 TextBox3 的 TabIndex 属性分别设置为 0、1、2、3、4,以便控制光标的依次移动。

(2)在用户窗体上插入 2 个命令按钮 CommandButton1 和 CommandButton2,它们的

Caption 属性分别设置为“确定”、“取消”,其中命令按钮 CommandButton2 的 Cancel 属性

设置为 True。

4.6.3 基本数据输入窗体的程序代码设计 (1)对窗体上的【确定】、【取消】按钮分别编写如下的程序代码:

Private Sub CommandButton1_Click() Dim n, i, j, r, c As Double Dim mystr1, mystr2 As String n = Val(TextBox1.Value) r = Val(TextBox2.Value)

49

第 4 章 投资组合风险优化决策模型及其 VBA 实现

c = Val(TextBox3.Value) If OptionButton1.Value = True Then mystr1 = OptionButton1.Caption ElseIf OptionButton2.Value = True Then mystr1 = OptionButton2.Caption End If If OptionButton3.Value = True Then mystr2 = OptionButton3.Caption ElseIf OptionButton4.Value = True Then mystr2 = OptionButton4.Caption ElseIf OptionButton5.Value = True Then mystr2 = OptionButton5.Caption End If Cells(2, 1) = "最优投资组合——" & mystr2 Cells(4, 1) = "证券数量" Cells(4, 2) = n Cells(5, 1) = mystr2 If OptionButton3.Value = True Then Cells(5, 2) = "" ElseIf OptionButton4.Value = True Then Cells(5, 2) = r ElseIf OptionButton5.Value = True Then Cells(5, 2) = c End If Cells(5, 2).NumberFormat = "0.00%" Cells(6, 1) = "是否允许卖空" Cells(6, 2) = mystr1 Cells(10, 1) = "输入各个证券的预期收益率" Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge For i = 1 To n Cells(11, i + 1) = "证券" & i Next i Cells(12, 1) = "预期收益率" Cells(14, 1) = "输入各个证券之间的协方差矩阵" Range(Cells(14, 1), Cells(14, 1 + n)).Select Selection.Merge For i = 1 To n Cells(15, i + 1) = "证券" & i Cells(15, 1 + i).HorizontalAlignment = xlCenter For j = 1 To n Cells(15 + j, 1) = "证券" & j Cells(15, 1 + i).HorizontalAlignment = xlCenter Next j Next i For i = 1 To n Cells(15, i + 1) = "证券" & i Cells(15, 1 + i).HorizontalAlignment = xlCenter For j = i To n Cells(15 + i, 1 + j).Select With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid

50

金融财务建模与计算——基于 VBA 与 MATLAB 实现

End With With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin End With Cells(15, 1 + i).HorizontalAlignment = xlCenter Next j Next i Range(Cells(15 + n, 1), Cells(15 + n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin End With End End Sub Private Sub CommandButton2_Click() End End Sub

(2)为 5 个单选按钮编写如下的程序代码:

Private Sub OptionButton1_Enter() OptionButton1.Value = True OptionButton2.Value = False End Sub Private Sub OptionButton2_Enter() OptionButton2.Value = True OptionButton1.Value = False End Sub Private Sub OptionButton3_Enter() OptionButton3.Value = True OptionButton4.Value = False OptionButton5.Value = False TextBox2.Enabled = False TextBox3.Enabled = False End Sub Private Sub OptionButton4_Enter() OptionButton4.Value = True OptionButton3.Value = False OptionButton5.Value = False TextBox2.Enabled = True TextBox3.Enabled = False

51

第 4 章 投资组合风险优化决策模型及其 VBA 实现

End Sub Private Sub OptionButton5_Enter() OptionButton5.Value = True OptionButton3.Value = False OptionButton4.Value = False TextBox2.Enabled = False TextBox3.Enabled = True End Sub

4.6.4 为自定义菜单指定宏

为自定义菜单中的【准备数据】命令指定一个名字为“准备”的宏,为【优化计算】

命令指定一个名字为“计算”的宏,为【删除数据】命令指定一个名字为“删除”的宏,

它们均保存在“模块 2”中,宏代码分别如下:

Public Sub 准备() UserForm1.Show End Sub Public Sub 计算() Dim n, i, j As Integer Dim myrange1, myrange2, myrange3 As String Dim x1, x2, x3, x4 As String n = Cells(4, 2) For i = 1 To n For j = 1 To n Cells(15 + j, 1 + i) = Cells(15 + i, 1 + j) Next j Next i Cells(17 + n, 1) = "优化计算结果" Range(Cells(17 + n, 1), Cells(17 + n, 2 + n)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With For i = 1 To n Cells(18 + n, i + 1) = "证券" & i Cells(18 + n, i + 1).HorizontalAlignment = xlCenter Next i Cells(18 + n, n + 2) = "合计" Cells(18 + n, i + 1).HorizontalAlignment = xlCenter Cells(19 + n, 1) = "比重(%)" Range(Cells(19 + n, 1), Cells(19 + n, 2 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Cells(20 + n, 1) = "预期收益率(%)" Cells(21 + n, 1) = "标准差(%)" Range(Cells(19 + n, 1), Cells(21 + n, 1)).Select

52

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Selection.HorizontalAlignment = xlCenter Range(Cells(21 + n, 1), Cells(21 + n, 2 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With myrange1 = "B" & 12 & ":" & Chr(65 + n) & 12 '各个证券收益率数据区域 myrange2 = "B16" & ":" & Chr(65 + n) & 15 + n '协方差矩阵数据区域 myrange3 = "B" & 19 + n & ":" & Chr(65 + n) & 19 + n '投资比例计算结果数据

区域 Cells(20 + n, 2) = "=sumproduct(" & myrange1 & "," & myrange3 & ")" Cells(21 + n, 2) = "=sqrt(sumproduct(" & myrange3 & ",mmult(" & myrange3

& "," & myrange2 & ")))" Cells(19 + n, n + 2) = "=sum(" & myrange3 & ")" x1 = Chr(66 + n) & 19 + n '投资组合比重合计率数据区域 x2 = "B" & 21 + n '投资组合标准差数据区域 x3 = "B" & 20 + n '投资组合预期收益率数据区域 x4 = "B5" Range(myrange3).NumberFormat = "0.00%" Range(x1).NumberFormat = "0.00%" Range(x2).NumberFormat = "0.00%" Range(x3).NumberFormat = "0.00%" Cells(20 + n, 2).NumberFormat = "0.00%" '开始利用规划求解工具计算 If Cells(5, 1) = UserForm1.OptionButton3.Caption Then SolverReset SolverOk Setcell:=x2, MaxMinVal:=2, ValueOf:="0", byChange:=myrange3 SolverAdd CellRef:=x1, Relation:=2, FormulaText:="100%" SolverOk Setcell:=x2, MaxMinVal:=2, ValueOf:="0", byChange:=myrange3 If Cells(6, 2) = UserForm1.OptionButton2.Caption Then SolverAdd CellRef:=myrange3, Relation:=3, FormulaText:="0" '不允许卖空 End If ElseIf Cells(5, 1) = UserForm1.OptionButton4.Caption Then SolverReset SolverOk Setcell:=x2, MaxMinVal:=2, ValueOf:="0", byChange:=myrange3 SolverAdd CellRef:=x1, Relation:=2, FormulaText:="100%" SolverAdd CellRef:=x3, Relation:=3, FormulaText:=x4 If Cells(6, 2) = UserForm1.OptionButton2.Caption Then SolverAdd CellRef:=myrange3, Relation:=3, FormulaText:="0" End If SolverOk Setcell:=x2, MaxMinVal:=2, ValueOf:="0", byChange:=myrange3 ElseIf Cells(5, 1) = UserForm1.OptionButton5.Caption Then SolverReset SolverOk Setcell:=x3, MaxMinVal:=1, ValueOf:="0", byChange:=myrange3 SolverAdd CellRef:=x1, Relation:=2, FormulaText:="100%" SolverAdd CellRef:=x2, Relation:=1, FormulaText:=x4 If Cells(6, 2) = UserForm1.OptionButton2.Caption Then SolverAdd CellRef:=myrange3, Relation:=3, FormulaText:="0" End If SolverOk Setcell:=x3, MaxMinVal:=1, ValueOf:="0", byChange:=myrange3 End If SolverSolve (True)

53

第 4 章 投资组合风险优化决策模型及其 VBA 实现

Range(myrange3).NumberFormat = "0.00%" End Sub Public Sub 删除() Rows("1:10000").Select Selection.Delete Shift:=xlUp End Sub

这样,最优投资组合决策信息系统就建立起来了。用户只要打开工作簿“最优投资组

合决策信息系统.xls”,执行【最优投资组合决策信息系统】菜单中的有关命令,即可进行

证券最优投资组合的计算。

4.6.5 最优投资组合决策信息系统应用举例 例 4-4 某 4 个证券的投资组合,各个证券的预期收益率和证券之间的协方差矩阵如

表 4-10 和表 4-11 所示,要求的最低期望收益率为 15%,试计算不允许卖空情况下的最优

投资组合。

表 4-10 各证券的预期收益率

证 券 1 证 券 2 证 券 3 证 券 4 预期收益率 12% 15% 10% 20%

表 4-11 各证券间的协方差矩阵

证 券 1 证 券 2 证 券 3 证 券 4 证 券 1 0.1254 0.0005 0.0765 0.0213 证 券 2 0.0005 0.0986 0.0432 0.0232 证 券 3 0.0765 0.0432 0.1244 0.0654 证 券 4 0.0213 0.0232 0.0654 0.2145

计算步骤如下。 (1)打开工作簿“最优投资组合决策信息系统.xls”。

(2)执行【最优投资组合决策信息系统】菜单中的【准备数据】命令,打开“最优投

资组合决策(输入基本数据)”窗口,如图 4-11 所示。

图 4-11 “最优投资组合决策(输入基本数据)”窗口

54

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(3)在“最优投资组合决策(输入基本数据)”窗口中输入有关数据,然后单击【确定】

按钮,则模型自动对工作表进行格式化,如图 4-12 所示。 (4)在格式化后的工作表中,输入各个证券的预期收益率及它们之间的协方差数据,

如图 4-13 所示。

图 4-12 格式化后的工作表 图 4-13 输入已知数据

(5)执行【最优投资组合决策信息系统】菜单中的【优化计算】命令,则模型自动进

行优化计算,并输出计算结果,如图 4-14 所示。

图 4-14 优化计算结果

本章小结 本章以投资组合的收益和方差为基础,应用数理统计学和运筹优化等理论与方法,重

点建立了投资组合最优决策模型,编制了计算最优投资组合的 VBA 程序。初步建立了最优

投资组合决策信息系统,这样,大大提高了我们计算资本市场最优投资组合的效率。

第 5 章 投资组合风险价值模型

及其 VBA 实现 本章要点

建立投资组合风险价值模型。

编制计算各类投资组合风险价值的 VBA 程序。

所谓风险价值,是指在正常的市场条件下,一项投资或投资组合在给定的置信水平下

和确定的持有期内的预期的最大损失。例如,某项投资在 96%的置信水平下的日风险价值

为 10 万元;其意义就是,在正常市场条件下,该项投资每天损失超过 10 万元的概率只有

4%(196%);换句话说,该项投资在 1 天中的损失有 96%的可能性不会超过 10 万元。又

如,某银行在 99%的置信水平下,每日经营业务的风险价值为 100 万元;其意义就是,在

正常的市场条件下,该银行日经营业务的损失超过 100 万元的概率只有 1%(199%);或

者说,在正常的市场条件下,对于 100 次交易,只存在 1 次日损失超过 100 万元的可能性。

再如,某投资组合的投资额为 500 万元,投资期为 30 天,该投资组合在 95%的置信水平下

收益的风险价值为 12%;其意义就是,在正常的市场条件下,该投资组合损失超过 60 万元

(500 万元12%)的可能性为 5%。 本章介绍投资组合风险价值的计算方法,并建立不同情况下的投资组合风险价值模型

及其计算机实现方法。

5.1 投资组合风险价值概述

5.1.1 投资组合风险价值的一般公式 风险价值的计算公式为:

0VaR ( )w Z

式中 VaR——风险价值; 0w ——初始投资额; ——投资收益率的标准差;

56

金融财务建模与计算——基于 VBA 与 MATLAB 实现

——投资收益率的均值; Z ——标准正态分布的抽样分位数,由下式确定。

2

211 e d2

yZ

y

式中, 为置信水平。 假设投资组合中各个风险资产的收益率均服从正态分布,那么投资组合的收益率也服

从正态分布,则投资组合的风险价值为:

0VaR ( )X X Xw Z

式中 VaR X ——投资组合的风险价值; X = ( )Xr ——投资组合收益率的标准差;

X = ( )XE r ——投资组合收益率的均值(预期收益率)。 计算标准正态分布的抽样分位数可使用Excel软件中的NORMSINV函数。NORMSINV

函数的功能是返回标准正态累积分布函数的反函数,该分布的平均值为 0,标准偏差为 1。语法为:

NORMSINV(probability)

式中,probability 为正态分布的概率值。 例如,要计算置信水平为 95%的情况下标准正态分布的抽样分位数,其计算公式为:

NORMSINV(195%)=1.64485

5.1.2 分散风险价值和非分散风险价值 在实践中,常常计算投资组合的分散风险价值和非分散风险价值。 分散风险价值就是投资组合中各个风险资产收益率之间的相关系数小于 1,从而投资

组合的风险要比投资单个风险资产的风险小得多。计算分散风险价值的目的是为了确定投

资比例,以便在分配投资资源时在最大化收益的同时使承受的风险最小化。 非分散风险价值就是投资组合中各个风险资产收益率之间的相关系数接近于 1(即正

相关),从而投资组合并不能分散单个风险资产的风险。计算非分散风险价值的目的是量化

市场出现的极端情况。例如,一旦股市出现崩盘,所有的股票价格都会大幅下跌,这时的

投资组合的收益损失将会达到最大。 假定组成投资组合的各风险资产的收益率均服从正态分布,从而投资组合的收益率也

服从正态分布,同时假定投资组合收益率分布的均值为 0,则在给定置信水平为 的情况

下,可得投资组合的非分散风险价值的计算公式为:

undx 0 undx 01

VaRn

i ii

w Z w Z x

投资组合的分散风险价值的计算公式为:

dx 0 dx 01 1

VaRn n

i ij ji j

w Z w Z x x

57

第 5 章 投资组合风险价值模型及其 VBA 实现

式中 undxVaR ——投资组合的非分散风险价值; dxVaR ——投资组合的分散风险价值;

undx ——投资组合的非分散风险价值的标准差; dx ——投资组合的分散风险价值的标准差;

0w ——投资的总资本; Z ——标准正态分布的抽样分位数;

ix ——资产 i 的投资比例; ij ——资产 i 与资产 j 的协方差;

i ——资产 i 的标准差; n ——投资组合中资产的个数。

5.1.3 风险价值的估计方法 目前常用的风险价值估计方法主要有三种:历史数据模拟法、方差-协方差法和蒙特卡

罗模拟法。

1.历史数据模拟法 历史数据模拟法的核心在于根据市场因子的历史样本变化模拟证券组合的未来损益分

布,利用分位数给出一定置信水平下的 VaR 估计。历史数据模拟法是一种非参数方法,它

不需要假定市场因子的统计分布,因而可以较好地处理非正态分布。该方法是一种全值模

拟,可有效地处理非线性组合(如包括期权的组合)。此外,该方法是监管者衡量资本充足

性的基本方法。

2.方差-协方差法 方差-协方差法是 VaR 计算中最为常用的方法。在观察期间内资产损益的概率密度函

数已知的情况下,就可以直接计算 VaR 值。如果概率密度函数是正态分布的,所需的计算

就比较简单,因为每个正态分布都可以标准化为人们熟知的 Z 分布。正态分布假设大大简

化了 VaR 繁重的运算负担,为风险管理者提供了一套功能强大的统计工具。采用正态分布

是因为几乎所有已知的推论性统计方法的出发点都是正态假设,它在理论上已经过中心极

限定理的证明。

3.蒙特卡罗模拟法 蒙特卡罗模拟法的核心是利用资产价格的随机模拟模型来估计在未来某一时期内资产

的价格,然后利用得到的未来资产价格来估计投资或投资组合的风险价值。蒙特卡罗模拟

法具有更为广泛的应用。

5.1.4 风险价值估计时需要注意的几个问题 要确定一个投资或投资组合的 VaR 值,必须首先确定以下三个参数:一是持有期间;

二是置信度;三是观察期间。

1.持有期间 持有期间就是确定在哪一段时间内计算持有资产的最大损失值,也就是明确风险管理

者关心资产在一天内、一周内,还是一个月内的风险价值。

58

金融财务建模与计算——基于 VBA 与 MATLAB 实现

从银行总体的风险管理看,持有期长短的选择取决于资产组合调整的频度及进行相应

头寸清算的可能速率。例如,商业银行由于头寸要求,其投资组合交易频繁决定了持有期

要取得比较短;与此相反,开放式基金在长线投资的理念指导下,投资组合更换周期很长,

这决定了持有期可以取得相对较长。巴塞尔委员会在这方面采取了比较保守和稳健的姿态,

要求银行以两周(即 10 个营业日)为持有期限。

2.置信度 置信度越大,VaR 越大;置信度越小,VaR 越小。一般来说,对置信区间的选择在一

定程度上反映了金融机构对风险的不同偏好。选择较大的置信水平意味着其对风险比较厌

恶,希望能得到把握性较大的预测结果,希望模型对于极端事件的预测准确性较高。根据

各自的风险偏好不同,选择的置信区间也各不相同。比如,J.P. Morgan 与美洲银行选择 95%,

花旗银行选择 95.4%,大通曼哈顿选择 97.5%,Bankers Trust 选择 99%。作为金融监管部门

的巴塞尔委员会则要求采用 99%置信区间,这与其稳健的风格是一致的。 置信水平的确定还对事后检验的判断有较大的影响。较高的置信水平要有比较长的观

察时间才能判断出超过 VaR 的观测值数量是否过多。如果置信水平确定为 95%,则至少要

进行 20 次试验才能判断模型在事后检验中超过 VaR 的观测值个数是否过多;而如果置信

水平确定为 99%,则至少要进行 100 次试验才能判断模型是否符合实际情况。

3.观察期间 观察期间是对给定持有期限的回报率的波动性和关联性考察的整体时间长度,是整个

数据选取的时间范围,有时又称为数据窗口。例如,选择对某个资产组合在未来 6 个月或

1 年的观察期间内,考察其每周回报率的波动性(风险)。这种选择要在历史数据的可能性

和市场发生结构性变化的危险之间进行权衡。为克服商业循环等周期性变化的影响,历史

数据越长越好,但是时间越长,收购兼并等市场结构性变化的可能性越大,历史数据因而

越难以反映现实和未来的情况。巴塞尔委员会目前要求的观察期间为 1 年。

5.2 风险价值的基本计算模型及其 VBA 实现

5.2.1 模型结构设计 模型采用将计算公式输入到工作表的方法,在运行模型后,工作表的有关单元格内得

到计算公式,就像直接在单元格人工输入公式一样。这种处理方法的好处是:即使不小心

删除了单元格的计算公式,运行模型后仍可以得到该公式,而且当运行一次模型后,只要

不删除单元格的公式,在已知数据单元格内输入不同的数据,可立即得到计算结果,不必

再重新运行模型。 首先建立一个名字为“风险价值的基本计算模型.xls”的工作簿,在当前的 Sheet1 上设

计模型的结构,如图 5-1 所示。 在工作表的适当位置插入一个名字为【导入公式】的命令按钮和一个名字为【清除表

格】的命令按钮,对它们分别指定一个名字为“Sub 导入公式()”的宏和一个名字为“Sub 清除表格()”的宏,它们均存放于同一个模块中,并编写如下的程序代码:

Sub 导入公式() Cells(2, 6) = "=b2*(b4*normsinv(1-b5)+b3)"

59

第 5 章 投资组合风险价值模型及其 VBA 实现

Cells(2, 6).NumberFormat = "0.00" End Sub Sub 清除表格() Range("b2:b5") = "" Range("f2") = "" End Sub

图 5-1 风险价值的基本计算模型

这样,就建立了风险价值的基本计算模型。在输入有关已知数据后,单击【导入公式】

按钮,就在单元格 F2 中出现计算结果。

5.2.2 模型应用举例 例 5-1 某投资者用 1 万元购买某股票,期限 1 年,经测算,该股票的年收益率符合均

值为 12%、标准差为 5%的正态分布,试确定在 98%的置信水平下 1 年内的最大可能损失。 如图 5-2 所示,输入已知数据,单击【导入公式】按钮,即得该投资者在 98%的置信

水平下 1 年内的最大可能损失为 173.13 元。

图 5-2 风险价值的计算结果

5.3 风险价值的方差-协方差计算模型及其 VBA 实现

5.3.1 模型结构设计 首先建立一个名字为“投资组合风险价值的方差-协方差法计算模型.xls”的工作簿,

在当前的 Sheet1 上设计模型的结构,如图 5-3 所示。 模型由下述三部分组成。 (1)已知数据区域。要求用户输入投资组合的投资额、证券数量和置信水平。此外,

在单击【准备数据】按钮后,模型将对工作表进行格式化,生成一个输入各证券预期收益

率和投资比例,以及证券间协方差矩阵的已知数据区域。

60

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(2)命令按钮区域。包括一个【准备数据】按钮、一个【开始计算】按钮和一个【清

除表格】按钮。【准备数据】按钮的功能是在用户输入证券数量后,模型自动对工作表进行

格式化,以方便用户输入这些数据。【开始计算】按钮则完成计算功能,并输出投资组合预

期收益率、标准差和风险价值的计算结果。【清除表格】按钮则完成数据清除的功能,使工

作表返回到如图 5-3 所示的界面。

图 5-3 投资组合风险价值的方差-协方差法计算模型

(3)计算结果区域。在单击【开始计算】按钮后,模型计算结果输出到此区域。

5.3.2 程序代码设计 (1)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程序

代码:

Sub 准备数据() Dim n, i, j As Integer n = Cells(4, 2) Cells(10, 1) = "输入各个证券的预期收益率和投资比例" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(11, 1 + i) = "证券" & i Cells(11, 1 + i).HorizontalAlignment = xlCenter Next i Cells(12, 1) = "预期收益率" Cells(13, 1) = "标准差" Cells(14, 1) = "投资比例" Range(Cells(12, 1), Cells(14, 1)).HorizontalAlignment = xlCenter Range(Cells(12, 1), Cells(14, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(15, 1) = "输入各个证券间的协方差矩阵" Cells(15, 1).HorizontalAlignment = xlCenter Range(Cells(15, 1), Cells(15, 1 + n)).Select Selection.Merge

61

第 5 章 投资组合风险价值模型及其 VBA 实现

With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(16, i + 1) = "证券" & i Cells(16, i + 1).HorizontalAlignment = xlCenter For j = 1 To n Cells(16 + j, 1) = "证券" & j Cells(16 + j, 1).HorizontalAlignment = xlCenter Next j Next i For i = 1 To n For j = i To n Cells(16 + i, 1 + j).Select With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid End With With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlMedium .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlMedium .Weight = xlThin End With Next j Next i Range(Cells(16 + n, 1), Cells(16 + n, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(2)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程序

代码:

Sub 开始计算() Dim a, i, j As Integer Dim myrange1, myrange2, myrange3, myrange4 As String

62

金融财务建模与计算——基于 VBA 与 MATLAB 实现

n = Cells(4, 2) For i = 1 To n For j = 1 + i To n Cells(16 + j, 1 + i) = "=" & Chr(65 + j) & 16 + i Next j Next i myrange1 = Chr(66) & 12 & ":" & Chr(65 + n) & 12 '收益率向量 myrange2 = Chr(66) & 13 & ":" & Chr(65 + n) & 13 '收益率向量 myrange3 = Chr(66) & 14 & ":" & Chr(65 + n) & 14 '收益率向量 myrange4 = Chr(66) & 17 & ":" & Chr(65 + n) & 16 + n '收益率向量 Cells(2, 7) = "=sumproduct(" & myrange1 & "," & myrange3 & ")" Cells(3, 7) = "=sqrt(sumproduct(" & myrange3 & ",mmult(" & myrange3 & ","

& myrange4 & ")))" Cells(4, 7) = "=b3*(normsinv(1-b7)*g3+g2)" Cells(5, 7) = "=g3" Cells(6, 7) = "=b3*abs(normsinv(1-b7)*g5)" Cells(7, 7) = "=sumproduct(" & myrange2 & "," & myrange3 & ")" Cells(8, 7) = "=b3*abs(normsinv(1-b7)*g7)" Range("g2:g3").NumberFormat = "0.00%" Range("g4").NumberFormat = "0.00" Range("g5").NumberFormat = "0.00%" Range("g6").NumberFormat = "0.00" Range("g7").NumberFormat = "0.00%" Range("g8").NumberFormat = "0.00" End Sub

(3)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程序

代码:

Sub 清除表格() Range(Cells(3, 2), Cells(4, 2)) = "" Cells(7, 2) = "" Range("g2:g8") = "" Rows("10:10000").Select Selection.Delete shift:=xlUp End Sub

5.3.3 模型应用举例 例 5-2 某投资者用 5 万元投资了一个由 5 只股票构成的投资组合,期限 1 年,经测

算,各股票的年收益率符合正态分布,有关数据如表 5-1 和表 5-2 所示,试确定在 95%的

置信水平下该投资组合在 1 年内的最大可能损失。

表 5-1 各证券的预期收益率、标准差和投资比例

证 券 1 证 券 2 证 券 3 证 券 4 证 券 5

预期收益率 8% 6% 12% 15% 9%

标 准 差 13.67% 4.10% 5.50% 5.34% 5.83%

投资比例 10% 15% 40% 25% 10%

63

第 5 章 投资组合风险价值模型及其 VBA 实现

表 5-2 各证券间的协方差数据

证 券 1 证 券 2 证 券 3 证 券 4 证 券 5

证 券 1 1.87% 0.80% 2.18% 1.55% 1.95%

证 券 2 0.17% 0.29% 0.10% 12.87%

证 券 3 0.30% 2.76% 5.40%

证 券 4 0.29% 4.30%

证 券 5 0.34%

计算步骤如下。 (1)在单元格 B3 中输入投资额“50000”,在单元格 B4 输入投资组合的证券数量“5”,

在单元格 B7 中输入置信水平“95%”。 (2)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 5-4 所示。

图 5-4 格式化后的工作表

(3)按照格式化后的工作表输入各个证券的预期收益率、标准差、投资比例和证券间

的协方差数据。 (4)单击【开始计算】按钮,则可得到有关的计算结果,如图 5-5 所示。

图 5-5 模型计算结果

64

金融财务建模与计算——基于 VBA 与 MATLAB 实现

可见,该投资组合的预期收益率为 11.15%,标准差为 3.98%。在 95%的置信水平下 1年内的基本风险价值为 2304.37 元,而分散风险价值为 3270.63 元,非分散风险价值为

5016.80 元。

5.4 风险价值的历史数据模拟计算模型及其 VBA 实现 在实际中,证券投资组合收益率的概率分布并不是完全符合正态分布的,因而利用前

面的计算方法所计算的风险价值与实际有较大的偏差。历史数据模拟法提供了一种最简单

的计算投资组合风险价值的方法,它适合于任何收益率分布的投资组合。 历史数据模拟法的原理是对所采集到的证券的历史数据进行统计计算,计算各个证券

的每期的收益率或收益,并计算投资组合的各期的收益率或收益。假若要确定置信水平为

5%,而历史数据的个数为 100 个,则第 5 个最坏的收益率或收益就是风险价值的估计值;

假若要确定置信水平为 5%,而历史数据的个数为 200 个,则第 10 个最坏的收益率或收益

就用来估计风险价值。

5.4.1 模型结构设计 首先建立一个名字为“投资组合风险价值的历史数据模拟计算模型.xls”的工作簿,在

当前的 Sheet1 上设计模型的结构,如图 5-6 所示。

图 5-6 投资组合风险价值的历史数据模拟计算模型

模型由下述三部分组成。 (1)已知数据区域。要求用户输入投资组合的投资额、证券数量、历史数据个数和置

信水平。此外,在单击【准备数据】按钮后,模型将对工作表进行格式化,生成一个输入

各证券的投资比例及历史数据的已知数据区域。 (2)命令按钮区域。包括一个【准备数据】按钮、一个【开始计算】按钮和一个【清

除表格】按钮。【准备数据】按钮的功能是在用户输入证券数量后,模型自动对工作表进行

格式化,以方便用户输入这些数据。【开始计算】按钮则完成计算功能,并输出投资组合中

各证券的价格均值、期收益均值、投资组合单位、投资组合收益,以及投资组合的风险价

值的计算结果。【清除表格】按钮则完成数据清除的功能,使工作表返回到如图 5-6 所示的

界面。 (3)计算结果区域。在单击【开始计算】按钮后,模型计算结果输出到此区域,包括

最终计算结果区域和中间计算过程区域(在单击【开始计算】按钮后才会出现)。

65

第 5 章 投资组合风险价值模型及其 VBA 实现

5.4.2 程序代码设计 (1)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程序

代码:

Sub 准备数据() Dim n, m, i As Integer n = Cells(4, 2) m = Cells(5, 2) Cells(10, 1) = "输入各个证券的投资比例" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(11, 1) = "证券" For i = 1 To n Cells(11, 1 + i) = "证券" & i Cells(11, 1 + i).HorizontalAlignment = xlCenter Next i Cells(12, 1) = "投资比例" Range(Cells(12, 1), Cells(12, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(14, 1) = "输入各个证券间的历史数据" Cells(14, 1).HorizontalAlignment = xlCenter Range(Cells(14, 1), Cells(14, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(15, 1) = "日期" Cells(15, 1).HorizontalAlignment = xlCenter For i = 0 To m Cells(16 + i, 1) = i Cells(16 + i, 1).HorizontalAlignment = xlCenter Next i For i = 1 To n Cells(15, i + 1) = "证券" & i Cells(15, i + 1).HorizontalAlignment = xlCenter Next i Range(Cells(16 + m, 1), Cells(16 + m, 1 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

66

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(2)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程序

代码:

Sub 开始计算() Dim n, m, nm, i, j As Integer Dim myrange1, myrange2, myrange3 As String n = Cells(4, 2) m = Cells(5, 2) Cells(14, 2 + n) = "计算过程" Cells(14, 2 + n).HorizontalAlignment = xlCenter Range(Cells(14, 2 + n), Cells(14, 3 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(15, 2 + n) = "投资组合价格" Cells(15, 3 + n) = "每期收益" Range(Cells(15, 2 + n), Cells(15, 3 + n)).HorizontalAlignment = xlCenter For i = 1 To m + 1 sumt = 0 For j = 1 To n sumt = sumt + Cells(12, 1 + j) * Cells(15 + i, 1 + j) Cells(15 + i, 2 + n) = sumt Next j Next i For i = 1 To m Cells(16 + i, 3 + n) = Cells(16 + i, 2 + n) - Cells(15 + i, 2 + n) Next i Range(Cells(16 + m, 2 + n), Cells(16 + m, 3 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With myrange1 = Chr(66 + n) & 17 & ":" & Chr(66 + n) & 16 + m '投资组合价格数据区域 myrange2 = Chr(67 + n) & 17 & ":" & Chr(67 + n) & 16 + m '投资组合期收益数据区域 myrange3 = Chr(66 + n) & 16 + m '期末投资组合价格数据区域 Range("f3") = "=average(" & myrange1 & ")" Range("f4") = "=average(" & myrange2 & ")" Range("f5") = "=b3/" & myrange3 Range("f6") = "=f4*f5" Range("f3:f6").NumberFormat = "0.00" nm = Int(Cells(5, 2) * (1 - Cells(6, 2))) Range("g3") = "第" & nm & "个最坏收益" Range("h3") = "=small(" & myrange2 & "," & nm & ")" Range("h4") = "=f5*abs(h3)" Range("h3:h4").NumberFormat = "0.00" End Sub

(3)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程序

代码:

Sub 清除表格() Range("b3:b6").ClearContents

67

第 5 章 投资组合风险价值模型及其 VBA 实现

Range("f3:f6").ClearContents Range("h3:h4").ClearContents Range("g3") = "第(X)个最坏收益" Rows("10:10000").Delete shift:=xlUp End Sub

5.4.3 模型应用举例 例 5-3 某投资者用 5 万元投资了一个由 4 只股票构成的投资组合,各只股票的投资

比例均为 25%。已经得到这 4 只股票在过去 1 年内(52 周)的周收益率如表 5-3 所示(数

据太多,只列出部分数据),试确定在 95%的置信水平下该投资组合的风险价值。

表 5-3 4 只股票的 52 周收盘价历史数据

日 期 证 券 1 证 券 2 证 券 3 证 券 4 0 10.86 10.92 9.48 7.05 1 10.92 10.88 9.51 7.12 2 10.84 10.96 9.21 7.12 3 11.16 10.72 9.38 6.96 4 11.16 10.72 9.38 6.96 5 11.16 10.72 9.38 6.96 6 11.16 10.72 9.38 6.96 … … … … …

50 11.16 10.72 9.38 6.96 51 9.12 10.72 9.38 6.96 52 8.99 10.72 9.38 6.96

计算步骤如下。 (1)在单元格 B3 中输入投资额“50000”,在单元格 B4 输入投资组合中的证券数量“4”,

在单元格 B5 输入证券历史数据个数“52”,在单元格 B6 中输入置信水平“95%”。 (2)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 5-7 所示。

图 5-7 格式化后的工作表

68

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(3)按照格式化后的工作表输入各个证券的投资比例和历史数据。 (4)单击【开始计算】按钮,则可得到有关的计算结果,如图 5-8 所示。

图 5-8 模型计算结果

可见,该投资组合的周价格均值为 9.54 元,周收益均值为0.01 元,1 年的投资组合收

益为60.28 元。在 95%的置信水平下,该投资组合第 2 个最坏收益为0.07,该投资组合 1年内的风险价值为 416.09 元。

5.5 风险价值的蒙特卡罗模拟计算模型及其 VBA 实现

5.5.1 投资组合风险价值的蒙特卡罗模拟的原理 5.4 节介绍了投资组合风险价值的历史数据模拟计算模型,它是以股票价格的历史数据

为基础,直接计算股票价格的变动量来得到每期的绝对收益,并以历史数据的最坏收益情

况来确定投资组合的风险价值。尽管这种方法简单易行,但由于证券市场上股票价格是千

变万化的,过去的股票价格并不能代表未来的股票价格,而对投资组合的未来一段时间内

的风险价值,对任何投资者来说都是非常重要的。因此,这就需要对股票价格的未来变化

进行估计,以便对投资组合未来的风险价值进行估计。 利用蒙特卡罗模拟法对投资组合风险价值进行估计的方法和步骤如下。 (1)首先利用下面的股票价格的模拟模型来估计未来某一时期内股票的价格:

1 exp( )t tS S t z t

式中 tS ——t 时刻的股票价格; 1tS ——t+1 时刻的股票价格; ——股票价格对数均值; ——股票价格对数标准差; t ——要计算的时间间隔(以年为单位); z ——服从标准正态分布的随机数。

69

第 5 章 投资组合风险价值模型及其 VBA 实现

(2)根据得到的未来股票价格,利用 5.4 节介绍的投资组合风险价值的历史数据模拟

计算模型估计投资组合的风险价值。 需要注意的是,股票价格对数均值和标准差必须与计算的时间间隔对应起来,如果计

算的时间间隔为 1 天,那么股票价格对数均值和标准差必须以日股票价格为基准;如果计

算的时间间隔为 7 天(1 周),那么股票价格对数均值和标准差必须以周股票价格为基准。

5.5.2 模型结构设计 首先建立一个名字为“投资组合风险价值的蒙特卡罗计算模型.xls”的工作簿,在当前

的 Sheet1 上设计模型的结构,如图 5-9 所示。

图 5-9 投资组合风险价值的蒙特卡罗计算模型

模型由下述三部分组成。 (1)已知数据区域。要求用户输入投资组合的投资额、证券数量、未来计算总期数、

计算时间间隔、置信水平和总模拟计算次数。此外,在单击【准备数据】按钮后,模型将

对工作表进行格式化,生成一个要求输入各证券的投资比例、股票价格对数均值、股票价

格对数标准差,以及目前股票价格的已知数据区域。 (2)命令按钮区域。包括一个【准备数据】按钮、一个【开始计算】按钮和一个【清

除表格】按钮。【准备数据】按钮的功能是在用户输入证券数量后,模型自动对工作表进行

格式化,以方便用户输入各证券的投资比例、股票价格对数均值、股票价格对数标准差,

以及目前股票价格。【开始计算】按钮则完成计算功能,并输出投资组合中各证券的价格均

值、期收益均值、投资组合单位、投资组合收益,以及投资组合的风险价值的计算结果。

【清除表格】按钮则完成数据清除的功能,使工作表返回到如图 5-9 所示的界面。 (3)计算结果区域。在单击【开始计算】按钮后,模型计算结果输出到此区域,包括

最终计算结果区域和中间计算过程区域(在单击【开始计算】按钮后才会出现。)

5.5.3 计算过程进度条设计 利用蒙特卡罗方法计算投资组合的风险价值,一般要进行很多次的循环计算,计算时

间的长短取决于总模拟次数。总模拟次数越多,模拟计算时间就越长。为了便于观察模拟

计算的进程,不妨设计一个显示模拟计算进程的进度条。 设计计算过程进度条的步骤如下。 (1)插入一个用户窗体 User1Form1,将其 Caption 属性设置为“正在进行模拟计算”,

Height(高度)属性设置为“90”,Width(宽度)属性设置为“300”。 (2)在用户窗体 User1Form1 上插入 2 个文本框 TextBox1 和 TextBox2,其 Caption 属

70

金融财务建模与计算——基于 VBA 与 MATLAB 实现

性分别设置为空值,Height(高度)属性设置为“15”,Width(宽度)属性设置为“225”。 (3)在用户窗体 User1Form1 上插入 6 个标签 Label1~Label6,各标签的属性分别设置

如下: ① 标签 Label1 和 Label4 的 Caption 属性分别设置为“总进度”和“模拟计算”。 ② 标签 Label2 和 Label5 的 Caption 属性分别设置为空值,BackColor 属性设置为“蓝

色”,Height(高度)属性设置为“15”,Width(宽度)属性设置为“20”。 ③ 标签 Label3 和 Label6 的 Caption 属性分别设置为“0%”,BackColor 属性设置为“红

色”,Height(高度)属性设置为“15”,Width(宽度)属性设置为“15”。 (4)将标签 Label1 放置在文本框 Text1Box1 的外部左边,将标签 Label2 放置在文本框

TextBox1 的内部左边,将标签 Label3 放置在文本框 TextBox1 的内部中间。 (5)将标签 Label4 放置在文本框 Text1Box2 的外部左边,将标签 Label5 放置在文本框

TextBox2 的内部左边,将标签 Label6 放置在文本框 TextBox2 的内部中间。 则设计好的计算过程的进度条如图 5-10 所示。

图 5-10 计算过程的进度条

5.5.4 程序代码设计 (1)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程序

代码:

Sub 准备数据() Dim n, m, i As Integer n = Cells(4, 2) m = Cells(5, 2) Cells(10, 1) = "输入各个证券的投资比例、股票价格、对数均值和对数标准差" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(11, 1) = "证券" For i = 1 To n Cells(11, 1 + i) = "证券" & i Cells(11, 1 + i).HorizontalAlignment = xlCenter Next i Cells(12, 1) = "投资比例" Cells(13, 1) = "股票价格对数均值" Cells(14, 1) = "股票价格对数标准差" Cells(15, 1) = "目前股票价格" Range(Cells(15, 1), Cells(15, 1 + n)).Select

71

第 5 章 投资组合风险价值模型及其 VBA 实现

With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

(2)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程序

代码:

Sub 开始计算() Dim i, j, n, m, nm, nt As Integer Dim dt, rd, z, sumt As Single Dim x1, x2, x3, x4, y1, y2 As Single Dim myrange1, myrange2, myrange3 As String n = Cells(4, 2) m = Cells(5, 2) nt = Cells(8, 2) Cells(17, 1) = "计算过程" Cells(17, 1).HorizontalAlignment = xlCenter Range(Cells(17, 1), Cells(17, 4 + n)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells(18, 1) = "时间" Cells(18, 2) = "随机数" Range(Cells(18, 1), Cells(18, 2)).HorizontalAlignment = xlCenter For i = 1 To n Cells(18, 2 + i) = "证券" & i Cells(18, 2 + i).HorizontalAlignment = xlCenter Next i Cells(18, 3 + n) = "投资组合价格" Cells(18, 4 + n) = "每期收益" Range(Cells(18, 3 + n), Cells(18, 5 + n)).HorizontalAlignment = xlCenter dt = Cells(6, 2) / 250 Cells(19, 1) = 0 Cells(19, 1).HorizontalAlignment = xlCenter For i = 1 To n Cells(19, 2 + i) = Cells(15, 1 + i) Next i For j = 1 To n sumt = sumt + Cells(12, 1 + j) * Cells(19, 2 + j) Cells(19, 3 + n) = sumt Cells(19, 3 + n).NumberFormat = "0.00" Next j x1 = 0 x2 = 0 x3 = 0 x4 = 0 y1 = 0 y2 = 0 UserForm1.Show

72

金融财务建模与计算——基于 VBA 与 MATLAB 实现

UserForm1.Label2.Width = 0 For t = 1 To nt For i = 1 To m '显示计算进度条(模拟计算过程) UserForm1.Label5.Width = Int(i / m * 225) UserForm1.Label6.Caption = CStr(Int(i / m * 100)) + "%" DoEvents Cells(19 + i, 1) = i Cells(19 + i, 1).HorizontalAlignment = xlCenter rd = Rnd() z = Worksheets.Application.WorksheetFunction.NormSInv(rd) Cells(19 + i, 2) = rd Cells(19 + i, 2).Select Selection.HorizontalAlignment = xlCenter Selection.NumberFormat = "0.0000" For j = 1 To n Cells(19 + i, 2 + j) = Cells(18 + i, 2 + j) * Exp(Cells(13, 1 + j) *

dt + Cells(14, 1 + j) * z * Sqr(dt)) Cells(19 + i, 2 + j).NumberFormat = "0.00" Next j sumt = 0 For j = 1 To n sumt = sumt + Cells(12, 1 + j) * Cells(19 + i, 2 + j) Cells(19 + i, 3 + n) = sumt Cells(19 + i, 3 + n).NumberFormat = "0.00" Next j Cells(19 + i, 4 + n) = Cells(19 + i, 3 + n) - Cells(18 + i, 3 + n) Cells(19 + i, 4 + n).NumberFormat = "0.00" Next i Range(Cells(19 + m, 1), Cells(19 + m, 4 + n)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With myrange1 = Chr(67 + n) & 20 & ":" & Chr(67 + n) & 19 + m '投资组合价格数据区域 myrange2 = Chr(68 + n) & 20 & ":" & Chr(68 + n) & 19 + m '投资组合期收益数据区域 myrange3 = Chr(67 + n) & 19 '期末投资组合价格数据区域 Range("f3") = "=average(" & myrange1 & ")" Range("f4") = "=average(" & myrange2 & ")" Range("f5") = "=b3/" & myrange3 Range("f6") = "=f4*f5" Range("f3:f6").NumberFormat = "0.00" nm = Int(Cells(5, 2) * (1 - Cells(7, 2))) Range("g3") = "第" & nm & "个最坏收益" Range("h3") = "=small(" & myrange2 & "," & nm & ")" Range("h4") = "=f5*abs(h3)" Range("h3:h4").NumberFormat = "0.00" x1 = x1 + Range("f3").Value x2 = x2 + Range("f4").Value x1 = x3 + Range("f5").Value x1 = x4 + Range("f6").Value

73

第 5 章 投资组合风险价值模型及其 VBA 实现

y1 = y1 + Range("h3").Value y2 = y2 + Range("h4").Value '显示计算进度条(总进度) UserForm1.Label2.Width = Int(t / nt * 225) UserForm1.Label3.Caption = CStr(Int(t / nt * 100)) + "%" DoEvents Next t Unload UserForm1 Range("f3").Value = x1 / nt Range("f4").Value = x2 / nt Range("f5").Value = x3 / nt Range("f6").Value = x4 / nt Range("h3").Value = y1 / nt Range("h4").Value = y2 / nt End Sub

(3)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程序

代码:

Sub 清除表格() Range("b3:b8").ClearContents Range("f3:f6").ClearContents Range("h3:h4").ClearContents Range("g3") = "第(X)个最坏收益" Rows("10:10000").Delete Shift:=xlUp End Sub

这样,就建立了投资组合风险价值的蒙特卡罗模拟计算模型。 模型采用了将计算公式输入到工作表单元格的方法,故每模拟计算一次,就在工作表

上显示每次的模拟计算结果。如果需要查看某次模拟的计算结果,可以在模型运行过程中,

按【Ctrl+Pause】组合键,则 Excel 就弹出如图 5-11 所示的对话框。若需要继续运行模型,

单击此对话框的【继续】按钮即可;若不需要继续运行,单击【结束】按钮。

图 5-11 对话框

为了得到比较精确的模拟计算结果,可以将模拟次数取更大的数值。一般情况下,模

拟计算次数不应小于 100 次。

5.5.5 蒙特卡罗的黑箱计算模型

上面建立的模型的方便之处在于可以随时观察某次的模型计算结果,但由于不断将计

算公式输入单元格且要不断刷屏,导致运算速度较慢。在不需要了解中间过程的情况下,

可以将宏“Sub 开始计算()”的程序代码编写为:

74

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Sub 开始计算() Dim i, j, n, m, nm, nt As Integer Dim dt, rd, z, sumt, sum1, sum2 As Single Dim x1, x2, x3, x4, y1, y2 As Single Dim myrange1, myrange2, myrange3 As String n = Cells(4, 2) m = Cells(5, 2) nt = Cells(8, 2) dt = Cells(6, 2) / 250 ReDim w(n), p0(n), p1n(n), pcn(n), p(n, m), pp(m), rp(m) As Single For i = 1 To n w(i) = Cells(12, i + 1) '各股票的投资比例 p1n(i) = Cells(13, i + 1) '各股票价格对数均值 pcn(i) = Cells(14, i + 1) '各股票价格对数标准差 p(i, 0) = Cells(15, i + 1) '各股票的目前价格 Next i sumt = 0 For i = 1 To n sumt = sumt + w(i) * p(i, 0) Next i pp(0) = sumt '目前的投资组合价格 Rem UserForm1.Show Rem UserForm1.Label2.Width = 0 For j = 1 To m sum1 = 0 sum2 = 0 For t = 1 To nt sumt = 0 rd = Rnd() z = Worksheets.Application.WorksheetFunction.NormSInv(rd) For i = 1 To n p(i, j) = p(i, j - 1) * Exp(p1n(i) * dt + pcn(i) * z * Sqr(dt)) '各股票价格模拟 sumt = sumt + w(i) * p(i, j) Next i sum1 = sum1 + sumt '显示计算进度条(模拟过程) Rem UserForm1.Label5.Width = Int(t / nt * 225) Rem UserForm1.Label6.Caption = CStr(Int(t / nt * 100)) + "%" Rem DoEvents Next t pp(j) = sum1 / nt '各投资组合价格的模拟显示计算进度条(总进度) Rem UserForm1.Label2.Width = Int(j / m * 225) Rem UserForm1.Label3.Caption = CStr(Int(j / m * 100)) + "%" Rem DoEvents Next j Rem Unload UserForms1 For j = 1 To m rp(j) = pp(j) - pp(j - 1) '各期投资组合收益的模拟 Next j Cells(17, 1) = "计算过程--(模拟计算)" & nt & "次的平均值" Cells(17, 1).HorizontalAlignment = xlCenter

75

第 5 章 投资组合风险价值模型及其 VBA 实现

Range(Cells(17, 1), Cells(17, 3)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With For j = 1 To m Cells(17 + j, 1) = j Cells(17 + j, 1).HorizontalAlignment = xlCenter Cells(17 + j, 2) = pp(j) Cells(17 + j, 3) = rp(j) Range(Cells(17 + j, 2), Cells(17 + j, 3)).NumberFormat = "0.00" Next j myrange1 = "b18" & ":" & "b" & 17 + m '投资组合价格数据区域 myrange2 = "c18" & ":" & "c" & 17 + m '投资组合各期收益数据区域 myrange3 = "b18" '期初投资组合价格数据区域 Range("F3") = "=average(" & myrange1 & " ) " Range("F4") = "=average(" & myrange2 & " ) " Range("F5") = "=b3/" & myrange3 Range("F6") = "=f4*f5" Range("F3:F6").Select Selection.NumberFormat = "0.00" nm = Int(Cells(5, 2) * (1 - Cells(7, 2))) Range("G3") = "第" & nm & "个最坏收益" Range("H3") = "=small(" & myrange2 & "," & nm & ")" Range("H4") = "=F5*ABS(H3)" Range("H3:H4").Select Selection.NumberFormat = "0.00" MsgBox ("模拟计算结束") End Sub

这个模型以名字“投资组合风险价值的蒙特卡罗计算模型黑箱.xls”保存。

5.5.6 模型应用举例 例 5-4 某投资者用 10 万元投资了一个由 3 只股票构成的投资组合,股票的有关数据

如表 5-4 所示,若以周为单位,试确定在 95%的置信水平下该投资组合的风险价值。

表 5-4 3 只股票的有关数据

证 券 证 券 1 证 券 2 证 券 3

投资比例 20% 50% 30%

股票价格对数均值 8% 6% 10%

股票价格对数标准差 22% 26% 35%

目前股票价格 20 16 9

利用“投资组合风险价值的蒙特卡罗计算模型”计算的过程如下。

(1)在单元格 B3 中输入投资额“100000”,在单元格 B4 输入投资组合的证券数量“3”,在单元格 B5 输入未来计算总期数(周)“52”,在单元格 B6 中输入需要的计算时间间隔(以

76

金融财务建模与计算——基于 VBA 与 MATLAB 实现

天计算)“7”,在单元格 B7 中输入置信水平“95%”,在单元格 B8 中输入需要的总模拟计

算次数(比如 1000 次)。 (2)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 5-12 所示。

图 5-12 格式化后的工作表

(3)按照格式化后的工作表输入各个证券的有关数据。 (4)单击【开始计算】按钮,则显示计算过程的进度条,如图 5-13 所示。计算结束后,

模型弹出“模拟计算结束”对话框,如图 5-14 所示,并将计算结果输出到工作表的有关单

元格中,如图 5-15 所示。其中价格均值及期收益均值等为最后一次的模拟计算结果。

图 5-13 计算过程的进度条 图 5-14 “模拟计算结束”对话框

图 5-15 模型计算结果

77

第 5 章 投资组合风险价值模型及其 VBA 实现

可见,该投资组合的周价格均值为 13.36 元,周收益均值为 0.09 元,1 年的投资组合

收益为 623.19 元。在 95%的置信水平下,该投资组合第 2 个最坏的周收益为0.70,该投资

组合 1 年内的风险价值为 4771.56 元。 由于随机数的原因,每次运行模型所计算的结果是不一样的。当进行足够多次模拟运

算时,则每次运行模型所计算的结果差别应该不很大。 若利用“投资组合风险价值的蒙特卡罗计算模型黑箱”进行计算,同样进行 1000 次模

拟计算,则计算时间只需 20 秒左右,其计算结果如图 5-16 所示。

图 5-16 模型计算结果

5.6 股票价格的蒙特卡罗模拟计算模型及其 VBA 实现

5.6.1 股票价格的随机模拟方法 在前面,我们介绍了投资组合风险价值的蒙特卡罗模拟计算模型,实际上,它也可以

给出股票价格的蒙特卡罗模拟计算模型。下面我们介绍用于股票价格的蒙特卡罗模拟计算

模型。 假设股票价格满足下面的方程:

1 exp( )t tS S t z t

式中 tS ——t 时刻的股票价格; 1tS ——t+1 时刻的股票价格; ——股票价格对数均值; ——股票价格对数标准差; t ——要计算的时间间隔(以年为单位,若 1 年内股票交易天数按 250 天计算,则

1/ 250t ); z —— 服从标准正态分布的随机数。

78

金融财务建模与计算——基于 VBA 与 MATLAB 实现

则我们可以根据这个方程建立股票价格的蒙特卡罗模拟计算模型。股票价格的蒙特卡

罗模拟过程如下: (1)首先根据股票价格的历史数据进行统计分析,得出股票价格对数均值和标准差。 (2)利用上述方程对不同的随机数计算股票价格。 (3)进行足够多次数的模拟计算,将这些模拟计算结果的平均值作为股票价格的估计。

5.6.2 股票价格的随机模拟模型设计 1.模型的设计 首先建立一个名字为“股票价格的随机模拟模型.xls”的工作簿,在当前的工作表上设

计模型的结构,如图 5-17 所示。

图 5-17 股票价格的随机模拟模型

模型由以下三部分组成。 (1)已知数据区域。要求用户输入股票的有关数据,包括股票价格对数均值、股票价

格对数标准差、目前股票价格、计算总周期、计算时间间隔和总模拟计算次数。需要注意

的是,股票价格对数均值和标准差必须与计算的时间间隔对应起来,如果计算的时间间隔

为 1 天,那么股票价格对数均值和标准差必须是以日股票价格为基准;如果计算的时间间

隔为 7 天(1 周),那么股票价格对数均值和标准差必须是以周股票价格为基准。 (2)命令按钮区域。包括一个【计算】按钮和一个【清除表格】按钮。单击【计算】

按钮则完成模拟计算过程,输出股票价格的模拟计算结果。单击【清除表格】按钮则完成

数据的清除功能,使工作表返回图 5-17 所示的界面。 (3)计算结果区域。输出股票价格的最终模拟计算结果,以及中间计算结果。

2.程序代码设计 (1)对【计算】按钮指定一个名字为“Sub 计算()”的宏,并编写如下的程序代码:

Sub js() Dim i, j, n, nt As Long Dim dt, rd, z, sumt, pln, pcn As Single Dim myrange As String Dim mymin, mymax As Single pln = Range("b3") pcn = Range("b4") n = Range("b7")

79

第 5 章 投资组合风险价值模型及其 VBA 实现

ReDim pj(n), p(n) As Single p(0) = Range("b5") nt = Range("b9") dt = Range("b8") / 250 Range("a11") = "模拟的中间计算结果" Range("a12") = "时间" Range("b12") = "股票价格" For t = 1 To n sumt = 0 For i = 1 To nt rd = Rnd() z = Application.WorksheetFunction.NormSInv(rd) p(t) = p(t - 1) * Exp(pln * dt + pcn * z * Sqr(dt)) sumt = sumt + p(t) Next i Cells(12 + t, 1) = t pj(t) = Round(sumt / nt, 2) Cells(12 + t, 2) = pj(t) Cells(12 + t, 2).NumberFormat = "0.00" Next t Range("f3") = pj(n) Range("f3").NumberFormat = "0.00" End Sub

(2)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Range("b3:b5").ClearContents Range("b7:b9").ClearContents Range("f3:f4") = "" Rows("11:10000").Select Selection.Delete shift:=xlUp Selection.Delete End Sub

这样,就建立了股票价格的随机模拟模型。

5.6.3 模型应用举例

例 5-5 经统计分析,某公司股票的日价格的对数均值为 15%,对数标准差为 35%,

目前股票价格为 12 元。试估计 1 年后(250 天计算)的股票价格。 计算步骤如下。 (1)在单元格 B3 中输入股票价格对数均值“15%”,在单元格 B4 中输入股票价格对

数标准差“35%”,在单元格 B5 中输入目前股票价格“12”。 (2)在单元格 B7 中输入计算总周期“250”,在单元格 B8 中输入计算时间间隔“1”,

在单元格 B9 中输入总模拟计算次数“1000”(这里模拟计算的次数为 1000 次)。 (3)单击【计算】按钮,该模型自动计算,如图 5-18 所示。

80

金融财务建模与计算——基于 VBA 与 MATLAB 实现

图 5-18 模型计算结果

本章小结 本章应用数理统计学等理论与方法,重点建立了不同类型的投资组合风险价值的计算

模型,编制了计算各类风险价值的 VBA 程序,并应用具体数据进行了验证,从而使投资组

合的风险更加直观,易于被投资者理解。

第 6 章 资本资产定价模型的

建立及其 VBA 实现 本章要点

建立资本资产定价模型。

编制计算资本资产定价的 VBA 程序。

第 3 章与第 4 章我们介绍了投资组合的有效边界和投资组合风险优化决策模型及其

计算,本章我们介绍资本资产定价模型(Capital Asset Pricing Model,CAPM)的推导及

其计算。

6.1 资本资产定价模型的假设条件 在证券投资组合理论的讨论中,我们做了如下假设。 (1)投资者希望获得 大收益而不喜欢风险。其收益用证券的预期收益率描述,风险

用收益率的标准差(或方差)度量。 (2)投资者按照他们在一定时期内的预期收益率和标准差来选择证券组合。 (3)投资者总是选择具有较高预期收益率和较小风险的证券组合。 资本资产定价模型综合了证券组合理论和资本市场理论,它以证券组合理论为基础,

因此关于证券组合的假设适用于资本资产定价模型。同时由于资本资产定价模型来自资本

市场,所以对于资本市场也需要提出一些假设。概括这两方面的因素,在下面的讨论中,

我们做出如下三个假设。 假设 1:投资者能在预期收益率和标准差或方差的基础上选择证券组合。 这个假设是说,如果必须在两种证券组合之间选择其中之一进行投资的话,你就必须

知道证券组合的预期收益率和标准差或方差。 通常,只要下述两个条件中的一个得到满足,投资者就能根据预期收益率和标准差或

方差做出选择。 条件 1:证券组合收益率的概率分布是正态分布。 由于正态分布完全由均值和方差决定,所以对投资者而言,给定两种具有同样方差的

82

金融财务建模与计算——基于 VBA 与 MATLAB 实现

证券组合,他将选择具有较高预期收益率的证券组合,而给定两种具有同样预期收益率的

证券组合,他将选择具有较低方差的证券组合。 这个条件的合理性在于当观察一个较长时间内(如年或月)收益率的时间序列时,单

个证券的收益率分布可能有向左或向右的倾斜。 这里是指证券组合,而不是指单个证券,当我们把这些证券组合成足够多样化的证券

组合时,由概率论的中心极限定理,证券组合收益率本身的分布将是渐进正态的。 条件 2:投资者关于证券组合价值 V 的效用是二次函数形式。

20 1 2u a a V a V

其中, 1 20, 0a a ,二次效用函数如图 6-1 所示。

效应

价值O

图 6-1 二次效用函数

这样,与证券组合的第 i 种价值 Vi 有关的效用 ui满足关系: 2

0 1 2i i iu a a V a V 因为投资者选择证券组合的标准差是使其预期效用 大化,即 maxE(u)。若用 Pi 表示

效用 ui 出现的概率,则

20 1 2

1 1

20 1 2

1 1 12

0 1 2

2 20 1 2 2

( ) ( )

( ) ( )

( ) ( ( )) ( )

N N

i i i i ii i

N N N

i i i i ii i i

E u p u p a a V a V

a p a p V a p V

a a E V a E V

a a E V a E V a V

所以根据效用 大化原则,给定两种同样方差的证券组合,投资者将更喜欢具有较高

预期收益率的一种(因为 a2<0);而给定两种具有同样预期收益率的证券组合,投资者将选

择具有较低风险的一种。 综上所述,只要证券组合的收益率是正态分布或效用函数是二次函数,则投资者就可

以根据其预期收益率和方差进行投资选择。 假设 2:针对一个时期,所有投资者的预期都是一样的。 这个假设是说,所有投资者在一个共同的时期内计划他们的投资,他们对证券收益率

的概率分布的考虑是一致的。这样,他们将有一致的证券预期收益率、方差和证券之间的

协方差。同时,在证券组合中,他们将选择同样的证券和同样的证券数目。

83

第 6 章 资本资产定价模型的建立及其 VBA 实现

假设 3:资本市场上没有摩擦。 摩擦是对资本流动和信息传播的障碍。因此,这个假设是说,不存在证券交易成本,

没有加在红利和利息收入或者在资本收益上的税收。信息可以畅行无阻地传播给资本市场

中的每个投资者。 我们做这些假设的目的是为了使模型的推导更方便,并使其结果在收益-风险平面上有

一个清晰的图形。要注意的是,资本资产定价模型的一些假设与现实有些差距,降低假设,

模型是否仍能被推导出来呢?这方面人们做了很多工作。例如,存在交易成本、税收,以

及关于概率分布不同的情形下的资本资产定价模型,但每一种情形下模型的 终形式都与

在我们假设条件下得到的形式基本类似。 在资本资产定价模型的假设之下,保证了所有投资者在不存在无风险资产时的有效边

界曲线相同;而当存在无风险资产时,如果其收益率为 fr ,每个投资者便可获得同样的风

险资产的 优投资组合 Mr ,即点 T,如图 6-2 所示。

收益

标准差

rf

T

N

O

图 6-2 有效边界曲线

定理 6.1:如果存在无风险资产,对于一个投资者来讲,在决定 优风险组合时,不需

要这个投资者对风险和收益有任何偏好。 换言之, 优风险资产组合的决定,独立于对投资者的无差异曲线形状的决定。 命题 6.1:若投资者可以以无风险利率 rf 借或贷,则 (1 ) f Mr r 描述了风险资产组

合与无风险资产的所有各种组合。 直线 fr TN 称为线性有效集,又称为资本市场线(Capital Market Line),简记为 CML,

它的方程为:

( )( ) M f

P f PM

E r rE r r

在无约束借贷假设下,由于投资者面临同样的线性有效集,他们选择不同证券组合的

唯一理由是他们有不同的无差异曲线。因此,面对同样的线性有效集,由于投资者对收益-

风险有不同的偏好,从而选择不同的证券组合。尽管投资者对证券组合的选择不同,但对

风险资产组合的选择是相同的。因此,投资者个人的无差异曲线仅在决定投资者购买(接

受)无风险资产(贷款)比例时起作用,利用无差异曲线进行分析仅在无风险资产组合的

佳比例已经确定之后,并用来确定无差异曲线与 rfTN 的切点,它不改变线性有效集与切

点 T 本身,正是这一特性,才使我们可以汇集单个投资者的证券需求以形成市场需求。 分离性定理:每个投资者均可通过对所有投资者都相同的某个风险资产组合和无风险

84

金融财务建模与计算——基于 VBA 与 MATLAB 实现

资产的组合来得到他的 优资产组合,他们选择的差异仅反映在组合 rM与无风险资产的比

例不同上。

6.2 夏普资本资产定价模型的推导 设:

Mr = 优风险证券组合的收益率; 1

1

n

jj

y

=风险证券组合的投资份额;

M = 优风险证券组合的标准差; cov( , )jk j kr r ,证券 j 与证券 k 之间收益率的协方差;

nr =无风险证券收益率。

定理 6.2:单个证券风险与收益满足 2( )( ) cov( , )M n

j n j MM

E r rE r r r r

证明:根据分离性定理,所有投资者持有相同的风险证券组合 M,他们仅在由这种风

险证券组合和无风险证券的组合上有所不同,所以我们构造风险证券组合 M 与无风险证券

的证券投资组合 P,它的预期收益率和标准差为:

( ) (1 ) ( )P n M

P M

E r r E r

则 d d d

d ( ) d d ( ) ( )P P M

P P M nE r E r E r r

均衡图如图 6-3 所示。 收益

标准差

M

O

j'

j

图 6-3 均衡图

设 j 是任意风险证券,M 是切点处的证券组合, jMj上任一证券组合,可以通过切点

投资组合 M 的投资比例 v 和投资在风险证券 j 的比例 1v 做一个线性组合,设 ( )cE r 是在

85

第 6 章 资本资产定价模型的建立及其 VBA 实现

jMj上一个证券组合的收益率,则

( ) (1 ) ( ) ( )c j ME r v E r vE r (6-1)

当 v=1 时,曲线 jMj与市场线在 M 点相切,市场处于均衡,这也是夏普模型均衡所需

要的,即每个证券属于市场线上的一个组合,且满足均衡条件:

1d d

d ( ) d ( )c P

vc PE r E r

由于 2 2 2 2(1 ) 2 (1 )cov( , )c jj j M Mv v v r r v

所以 2

2d 2(1 ) 2(1 2 )cov( , ) 2d

cjj j M Mv v r r v

v

注意到 2d d2

d dc c

cv v

得到 22(1 ) 2(1 2 )cov( , ) 2d

d 2jj j M Mc

c

v v r r v

v

又由式(6-1)得 d 1

d ( ) ( ) ( )c M j

v

E r E r E r

于是 2[ 2(1 ) 2(1 2 )cov( , ) 2 ] 2d d d

d ( ) d d ( ) ( ) ( )jj j M M cc c

c c M j

v v r r vv

E r v E r E r E r

故 2

1cov( , )d

d ( ) ( ( ) ( ))j M Mc

vc c M j

r r

E r E r E r

又由于 1c v M ,所以

2cov( , ) d( ( ) ( )) d ( ) ( )

j M M P M

M M j P M n

r r

E r E r E r E r r

2( )( ) ( ) cov( , ) ( ( ) )M n

j M j M M nM

E r rE r E r r r E r r

2( )( ) cov( , )M n

j n j MM

E r rE r r r r

86

金融财务建模与计算——基于 VBA 与 MATLAB 实现

2( )( ) cov( , )M n

j n j MM

E r rE r r r r

(6-2)

式(6-2)称为标准的资本资产定价模型,它指出了证券的风险-收益关系。

记 , 1,2,..., 1ii

yh i n

1

1

n

ii

y

)是在风险证券上的投资份额,则

1

1( ) ( )

n

M i ii

E r h E r

1 1 1

1 1 1cov( , ) cov( , ) cov( , )

n n n

j M j k k j k k jk kk k k

r r r h r r r h h

所以式(6-2)又可表示为: 1

21

( )( )n

M nj n jk k

M k

E r rE r r h

(6-3)

在标准的资本资产定价模型假设下,投资者持有的风险证券以组合 M 的形式出现,故

可把关心这个组合的风险化为关心这个组合的标准差。因此,单个证券的风险的评价可以

按它在组合标准差中所占的份额来计量。因为: 1

2

1cov( , )

n

M j j Mj

h r r

故可用jM

M

计量单个证券 j 的风险,记为j 。

就对组合的风险的贡献而言,具有较大标准差的证券的贡献不一定比具有较小标准差

的证券贡献大,所以风险不能以 2j 来度量。又因为 M 对所有证券都是一样的,故也可用

2jM

jM

来度量证券 j 的相对风险,这时可将式(6-2)写成:

( ) ( ( ) )j n j M nE r r E r r (6-4)

这是标准 CAPM 的另一形式。

6.3 投资组合收益与风险之间的关系 从 6.2 节可知,资本资产定价模型给出了单个证券的收益与风险之间的关系,其模型为:

( ) ( ( ) )j f j M fE r r E r r

式中 ( )jE r ——证券 j 的预期收益率;

fr ——无风险利率; ( )ME r ——证券市场投资组合的平均收益率;

j ——证券 j 风险系数。

87

第 6 章 资本资产定价模型的建立及其 VBA 实现

无风险利率由短期国库券的利率代替,证券市场投资组合的平均收益率反映了平均风

险程度证券的期望收益率,可根据证券市场上所有证券构成的投资组合来计算,也可选一

些代表性的证券构成的投资组合近似计算。 对于投资组合的收益与风险之间的关系而言,其模型为:

( ) ( ( ) )X f M fE r r E r r

式中 ( )XE r ——投资组合的预期收益率;

fr ——无风险利率; ( )ME r ——证券市场投资组合的平均收益率;

——投资组合的风险系数,其计算公式如下。

1

n

i ii

w

式中 n——投资组合中证券的个数; iw ——各个证券的投资比例。

上面的投资组合的资本资产定价模型还可以表示为:

( ) ( ( ) )X f M fE r r E r r

这个公式表明,不论无风险利率如何变化, 系数总是不变的。因此,不妨设 fr 等于

零,这样,证券投资组合的 系数就可以由证券投资组合收益率分布与证券市场投资组合

收益率分布的历史数据进行线性回归得到。

6.4 资本资产定价模型的 VBA 实现 当给定一个投资组合中各个证券的投资比例及 Beta 系数时,可以很方便地利用上面的

公式直接计算出投资组合的 Beta 系数。下面建立根据投资组合中各个证券的历史数据来计

算投资组合 Beta 系数的模型。 (1)首先建立一个名字为“投资组合 Beta 系数计算模型.xls”的工作簿,在当前的 Sheet1

上设计有关的窗体和数据结构,如图 6-4 所示。

图 6-4 投资组合 Beta 系数计算模型

(2)模型由以下三部分组成:已知数据区域、命令按钮区域(包括一个【准备数据】

按钮、一个【开始计算】按钮、一个【清除表格】按钮)和计算结果区域(在单击【开始

计算】按钮后计算结果的输出区域)。

88

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(3)对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,并编写如下的程序

代码:

Sub 准备数据() Dim m, n, i As Integer m = Cells(3, 2) n = Cells(4, 2) Cells(10, 1) = "输入各个证券的投资比例" Cells(10, 1).HorizontalAlignment = xlCenter Range(Cells(10, 1), Cells(10, 1 + m)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(11, 1) = "证券" Cells(11, 2) = "投资比例" For i = 1 To m Cells(11, 1 + i) = "证券" & i Cells(11, 1 + i).HorizontalAlignment = xlCenter Next i Range(Cells(12, 1), Cells(12, 1 + m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(14, 1) = "输入证券价格及市场组合价格的历史数据" Cells(14, 1).HorizontalAlignment = xlCenter Range(Cells(14, 1), Cells(14, 2 + m)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(15, 1) = "日期" Range(Cells(15, 1), Cells(16, 1)).Merge Cells(15, 2) = "市场组合价格" Range(Cells(15, 2), Cells(16, 2)).Merge Cells(15, 3) = "证券价格" Range(Cells(15, 3), Cells(15, 2 + m)).Merge For i = 1 To m Cells(16, 2 + i) = "证券" & i Next i Range(Cells(15, 1), Cells(16, 2 + m)).HorizontalAlignment = xlCenter For i = 1 To n Cells(16 + i, 1) = i Cells(16 + i, 1).HorizontalAlignment = xlCenter Next i Range(Cells(16 + n, 1), Cells(16 + n, 2 + m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub

89

第 6 章 资本资产定价模型的建立及其 VBA 实现

(4)对【开始计算】按钮指定一个名字为“Sub 开始计算()”的宏,并编写如下的程序

代码:

Sub 开始计算() Dim m, n, i, j As Integer Dim myrange0, myrange1, myrange2, myrange3 As String m = Cells(3, 2) ReDim myrange01(m + 1) As String n = Cells(4, 2) Cells(19 + n, 1) = "收益率分布计算结果" Cells(19 + n, 1).HorizontalAlignment = xlCenter Range(Cells(19 + n, 1), Cells(19 + n, 3 + m)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(20 + n, 1) = "日期" Range(Cells(20 + n, 1), Cells(21 + n, 1)).Merge Cells(20 + n, 2) = "市场组合" & Chr(10) & "收益率分布" Range(Cells(20 + n, 2), Cells(21 + n, 2)).Merge Cells(20 + n, 3) = "各证券收益率分布" Range(Cells(20 + n, 3), Cells(20 + n, 2 + m)).Merge For i = 1 To m Cells(21 + n, 2 + i) = "证券" & i Next i Cells(20 + n, 3 + m) = "投资组合" & Chr(10) & "收益率分布" Range(Cells(20 + n, 3 + m), Cells(21 + n, 3 + m)).Merge Range(Cells(20 + n, 3 + m), Cells(21 + n, 3 + m)).HorizontalAlignment =

xlCenter For i = 2 To n Cells(21 + n + i, 1) = i Cells(21 + n + i, 1).HorizontalAlignment = xlCenter If Cells(6, 2) = 1 Then '对数收益率 Cells(21 + n + i, 2) = Log(Cells(16 + i, 2) / Cells(15 + i, 2)) For j = 1 To m Cells(21 + n + i, 2 + j) = Log(Cells(16 + i, 2 + j) / Cells(15 + i,

2 + j)) Next j Else '离散收益率 Cells(21 + n + i, 2) = (Cells(16 + i, 2) - Cells(15 + i, 2)) / Cells

(15 + i, 2) For j = 1 To m Cells(21 + n + i, 2 + j) = (Cells(16 + i, 2 + j) - Cells(15 + i, 2 +

j)) / Cells(15 + i, 2 + j) Next j End If sumt = 0 For j = 1 To m

90

金融财务建模与计算——基于 VBA 与 MATLAB 实现

sumt = sumt + Cells(12, 1 + j) * Cells(21 + n + i, 2 + j) Next j Cells(21 + n + i, 3 + m) = sumt Range(Cells(21 + n + i, 2), Cells(21 + n + i, 3 + m)).NumberFormat = "0.00%" Next i Range(Cells(21 + 2 * n, 1), Cells(21 + 2 * n, 3 + m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(22 + 2 * n, 1) = "有关参数计算结果" Range(Cells(22 + 2 * n, 1), Cells(22 + 2 * n, 3 + m)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter Cells(23 + 2 * n, 1) = "证券" Range(Cells(23 + 2 * n, 1), Cells(23 + 2 * n, 2)).Merge For i = 1 To m Cells(23 + 2 * n, 2 + i) = "证券" & i Next i Cells(23 + 2 * n, 3 + m) = "投资组合" Range(Cells(23 + 2 * n, 3), Cells(23 + 2 * n, 3 + m)).HorizontalAlignment

= xlCenter Cells(24 + 2 * n, 1) = "a" & "系数" Range(Cells(24 + 2 * n, 1), Cells(24 + 2 * n, 2)).Merge Cells(25 + 2 * n, 1) = "b" & "系数" Range(Cells(25 + 2 * n, 1), Cells(25 + 2 * n, 2)).Merge Range(Cells(24 + 2 * n, 1), Cells(25 + 2 * n, 1)).Select Selection.Characters(Start:=1, Length:=1).Font.Name = "Symbol" Selection.Characters(Start:=2, Length:=2).Font.Name = "宋体" Cells(26 + 2 * n, 1) = "预期收益率" Range(Cells(26 + 2 * n, 1), Cells(26 + 2 * n, 2)).HorizontalAlignment =

xlCenter Range(Cells(26 + 2 * n, 1), Cells(26 + 2 * n, 3 + m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With myrange0 = Chr(66) & 23 + n & ":" & Chr(66) & 21 + 2 * n For i = 1 To m + 1 myrange01(i) = Chr(66 + i) & 23 + n & ":" & Chr(66 + i) & 21 + 2 * n Cells(24 + 2 * n, 2 + i) = "=intercept(" & myrange01(i) & "," & myrange0 & ")" Cells(25 + 2 * n, 2 + i) = "=slope(" & myrange01(i) & "," & myrange0 & ")" Cells(26 + 2 * n, 2 + i) = "=average(" & myrange01(i) & ")" Range(Cells(24 + 2 * n, 2 + i), Cells(25 + 2 * n, 2 + i)).Select Selection.NumberFormat = "0.0000" Selection.HorizontalAlignment = xlCenter Cells(26 + 2 * n, 2 + i).Select Selection.NumberFormat = "0.00%" Selection.HorizontalAlignment = xlCenter

91

第 6 章 资本资产定价模型的建立及其 VBA 实现

Next i '开始绘图 myrange1 = "=sheet1!R" & 23 + n & "C2" & ":R" & 21 + 2 * n & "C2" myrange2 = "=sheet1!R" & 23 + n & "C" & 3 + m & ":R" & 21 + 2 * n & "C" &

3 + m Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("sheet1").Range("k1") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = myrange1 ActiveChart.SeriesCollection(1).Values = myrange2 ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "投资组合收益率与市场组合收益率曲线 " .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "市场组合收益率" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "投资组合预期收益率" End With ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "0%" ActiveChart.Axes(xlValue).TickLabels.NumberFormatLocal = "0%" ActiveChart.Legend.Delete ActiveChart.SeriesCollection(1).Select With Selection.Border .Weight = xlHairline .LineStyle = xlNone End With With Selection .MarkerStyle = xlCircle .MarkerSize = 7 .MarkerBackgroundColorIndex = 9 .MarkerForegroundColorIndex = 9 End With ActiveChart.SeriesCollection(1).Trendlines.Add(Type:=xlLinear, Forward:=0,

Backward:=0, DisplayEquation:=True, DisplayRSquared: = False).Select ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Select Selection.Left = 215 Selection.Top = 37 ActiveChart.ChartTitle.Select With Selection.Font .Name = "华文新魏" .FontStyle = "常规" .Size = 15 .Underline = xlUnderlineStyleDouble .ColorIndex = 49 End With ActiveChart.PlotArea.Select

92

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Selection.Top = 30 Selection.Height = 140 Sheet1.Cells(26 + 2 * n, 1).Select End Sub

(5)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程序

代码:

Sub 清除表格() Cells(3, 2) = "" Rows("10:10000").Delete Shift:=xlp Sheet1.ChartObjects.Delete End Sub

这样,就建立了投资组合 Beta 系数计算模型。在输入有关已知数据后,单击【开始计

算】按钮,即可得到计算结果。

6.5 模型应用举例 例 6-1 已知某投资组合有 4 只股票,投资比例均为 25%,在过去 1 年内股票价格

和市场指数的月收盘价如表 6-1 所示,试确定各只股票的 Beta 系数和投资组合的 Beta系数。

表 6-1 股票价格和市场指数的月收盘价

日期 市场组合价格 证券价格

证券 1 证券 2 证券 3 证券 4

1 3543 9.12 5.45 12.34 6.54

2 3587 9.23 5.58 12.59 6.58

3 3423 8.89 5.46 12.46 6.51

4 3545 8.94 5.51 12.78 6.65

5 3519 8.87 5.48 12.64 6.46

6 3488 8.65 5.14 12.46 5.99

7 3494 8.73 5.16 11.54 6.03

8 3567 9.37 5.59 12.23 6.67

9 3549 9.21 5.56 12.15 6.52

10 3456 8.65 5.13 10.87 6.01

11 3488 8.76 5.18 11.05 5.86

12 3502 8.95 5.27 11.39 5.95

计算步骤如下。 (1)在单元格 B3 中输入投资组合证券数量“4”。 (2)在单元格 B4 中输入证券历史数据个数“12”。 (3)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 6-5 所示。 (4)在有关的单元格中输入已知数据,并选择收益率形式,如图 6-6 所示。

93

第 6 章 资本资产定价模型的建立及其 VBA 实现

图 6-5 格式化后的工作表

图 6-6 输入已知数据

(5)单击【开始计算】按钮,则模型自动计算,即得计算结果,并绘制出投资组合收

益率与市场组合收益率曲线,如图 6-7 和图 6-8 所示。

图 6-7 模型计算结果

94

金融财务建模与计算——基于 VBA 与 MATLAB 实现

投资组合收益率与市场组合收益率曲线y = 1.23x - 0.0039

-10%

-5%

0%

5%

10%

-6% -4% -2% 0% 2% 4%

市场组合收益率

投资

组合

预期

收益

图 6-8 投资组合收益率与市场组合收益率曲线

本章小结 本章应用数理统计等理论与方法,重点建立了资本资产定价模型,提出了系统风险的

概念,用 Beta 系数对单个资产的系统风险进行衡量,并编制了计算资本资产定价的 VBA程序,应用具体数据进行了验证。

第 7 章 Black-Scholes 期权定价

模型及其 VBA 实现 本章要点

介绍 Black-Scholes 期权定价模型。

给出计算 Black-Scholes 期权定价模型的具体计算步骤。

编制计算 Black-Scholes 期权定价模型期权价格的 VBA 程序。

运用不同方法计算波动率,并编制 VBA 程序。

本章我们讨论 Black-Scholes(B-S)期权定价模型的计算过程,运用 VBA 简化其计算

过程。另外,进一步研究 B-S 公式在股票风险度量中的应用,即根据期权的定价反过来对

股票价格的波动性进行度量。

7.1 Black-Scholes 期权定价模型 假设对于一个收益率呈正态分布的股票,S 表示股票的当前价格,X 表示期权执行价

格,T 表示(看涨或看跌)期权的到期期限,r 表示无风险利率(与期权执行期限相同的

无风险资产的连续复利的年收益率), 表示股票连续复利的年收益率的标准差,N(d)

表示标准正态分布值(即标准正态分布 d 的概率),e 为自然对数的底,ln 为自然对数函

数。假定股票在到期日之前不支付股息,则 B-S 公式的欧式看涨和看跌期权的价格 C 和

P 分别为:

1 2( ) e ( )rTC SN d X N d

2 1e ( ) ( )rTP X N d SN d

式中,2

1 2 1ln( / ) ( / 2) ;S X r T

d d d TT

下面通过实例来解释 B-S 公式的 Excel 计算过程,以及用 VBA 自定义函数来计算期权

定价。

96

金融财务建模与计算——基于 VBA 与 MATLAB 实现

7.1.1 Black-Scholes 期权定价模型的 Excel 实现过程 在 Excel 中很容易运用 B-S 期权定价模型求出看涨和看跌期权的价格。 例 7-1 股票的当前价格 S=25 元,执行价格 X=25 元,无风险年利率 r=8%,股票的波

动率 =30%,期权到期期限 T=0.5 年,计算对应的欧式看涨期权和看跌期权的价格。 具体操作步骤如下。 (1)求出 1 2,d d 对应的值。单击 B9 单元格,在编辑栏输入“=(LN(B3/B4)

+(B5+0.5*B7^2)*B6)/(B7*SQRT(B6))”;单击 B10 单元格,在编辑栏输入“=B9-SQRT(B6)*B7”。

(2)确定出 1 2( ), ( )N d N d 对应的值。单击 B12 单元格,在编辑栏输入“=NORMSDIST(B9)”;单击 B13 单元格,在编辑栏输入“=NORMSDIST(B10)”。

(3)根据 B-S 公式的欧式看涨期权定价公式求出看涨期权的价格。单击 B15 单元格,

在编辑栏输入“=B3*B12-B4*EXP(-B5*B6)*B13”。 (4)运用平价公式 P C S XerT,根据看涨期权的价格求出对应的看跌期权的价格。

单击 B16 单元格,在编辑栏输入“=B15-B3+B4*EXP(-B5*B6)”。 (5)根据 B-S 公式的欧式看跌期权定价公式求出看跌期权的价格。单击 B17 单元格,

在编辑栏输入“=B4*EXP(-B5*B6)* NORMSDIST(-B10)-B3* NORMSDIST(-B9)”。 运用 B-S 公式求看涨、看跌期权价格的结果如图 7-1 所示。

图 7-1 运用 B-S 公式求看涨、看跌期权价格的结果

注意: 在此计算了两次看跌期权的价格,一次使用看跌期权-看涨期权平价公式,另一次使

用 B-S 公式,可以看出对应的结果相同。

7.1.2 期权价格和内在价值随时间变化的比较分析 由于 B-S 公式是关于期权定价的连续型公式,因此,容易使用 Excel 分析期权价格的

灵敏性。即可用 B-S 公式求出的看涨期权的价格同看涨期权的内在价值进行比较分析,分

析两者随着股票价格的变化差异。 在例 7-1 的基础上,可以用模拟运算表求出不同股票价格下的看涨期权的价格和内在

97

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

价值,具体操作步骤如下。 (1)此处采用 10~35 元区间的股价,每次增加 2.5 元。单击 A22 单元格输入 10,单

击 A23 单元格,在编辑栏输入“=A22+2.5”,运用自动填充单元格命令填充到 A32。 (2)在现在股价下,求看涨期权对应的价格,单击 B21 单元格,在编辑栏输入“=B15”;

求看涨期权的内在价值,单击 C21 单元格,在编辑栏输入“=MAX(B3-B4,0)”。 (3)选择 A21:C32 单元格区域,执行【数据】→【模拟运算表】命令,在出现的“模

拟运算表”对话框中,在“输入所引用列的单元格”栏中选择股价对应的 B3 单元格,完

成后单击【确定】按钮。结果如图 7-2 所示。

图 7-2 使用模拟运算表计算的结果

(4)在模拟运算表的基础上运用 Excel 的【图表】即可画出对应的不同股价下的看涨

期权的价格和内在价值图,如图 7-3 所示。

图 7-3 看涨期权的价格与内在价值图

从图 7-3 中可以看出,开始时看涨期权的价格和内在价值相等,随着股价的上涨,二

者之差逐渐增大,当股价超过 30 元后,两者差额逐渐稳定。由此,可以看出看涨期权的价

格大于其内在价值,两者对应的差额即为看涨期权的时间价值。

7.2 运用 VBA 程序计算看涨、看跌期权价格 在 Excel 中可以按 7.1 节介绍的方法运用 B-S 公式进行期权定价,还可以运用 VBA 定

义 B-S 期权定价函数,从而更简便地给出期权定价。 B-S 期权定价公式的 VBA 程序如下。

98

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Function dOne(Stock, Exercise, Time, Interest, sigma) dOne = (Log(Stock / Exercise) + Interest * Time) / (sigma * Sqr(Time)) +

0.5 * sigma * Sqr(Time) End Function Function CallOption(Stock, Exercise, Time, Interest, sigma) CallOption = Stock * Application.NormSDist(dOne(Stock, Exercise, Time,

Interest, sigma)) - Exercise * Exp(-Time * Interest) * Application.NormSDist (dOne(Stock, Exercise, Time, Interest, sigma) - sigma * Sqr(Time))

End Function Function PutOption(Stock, Exercise, Time, Interest, sigma) PutOption = CallOption(Stock, Exercise, Time, Interest, sigma) + Exercise

* Exp(-Time * Interest) - Stock End Function

第一段程序定义了 1d ,第 2、3 段程序分别定义了看涨期权定价函数 CallOption 和看跌

期权定价函数 PutOption。

注意: Excel 中的 MormSdist 函数表示标准正态分布,而在 VBA 中要运用此功能,对应的

是 Application.NormSDist。

例 7-2 股票当前价格 S=25 元,执行价格 X=25 元,无风险年利率 r=8%,股票的波动

率 =30%,期权到期期限 T=0.5 年,运用 CallOption 和 PutOption 求出对应的欧式看涨期

权的价格、看跌期权的价格。 具体步骤如下。 (1)建立一个 Excel 工作表,输入已知数据,如图 7-4 所示。

图 7-4 输入已知数据

(2)求看涨期权的价格:选定 B9 单元格,执行【工具】菜单中的【宏】命令。 (3)在弹出的菜单中单击【Visual Basic 编辑器】或按【Alt+F11】键,进入“Microsoft

Visual Basic”窗口。执行【插入】→【模块】命令,系统出现一个空白编辑框,在窗口左

下角“属性-模块 1”对话框下的名称后输入将要编辑的模块的名称,然后输入上面的程序,

如图 7-5 所示。 (4)执行【调试】→【编译 VBAproject(L)】命令,查找程序是否有错误。 (5)若编译通过,则单击工具栏中的 Excel 图标,返回 Excel 工作表。 (6)执行【插入】菜单中的【函数】命令,系统弹出“插入函数”对话框。 (7)在“插入函数”对话框中的“选择类别”中选择“用户定义”,在“选择函数”中

选择刚刚编辑的“CallOption”函数,如图 7-6 所示,单击【确定】按钮即可。

99

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

图 7-5 “Microsoft Visual Basic”窗口 图 7-6 “插入函数”对话框

(8)弹出“函数参数”对话框,输入如图 7-7 所示的参数,单击【确定】按钮。 (9)计算结果如图 7-8 所示。

图 7-7 CallOption 函数参数设置 图 7-8 计算结果

看跌期权的计算方法与看涨期权的方法一样,从图 7-8 中可以看出,这个结果与例 7-1中的结果一样。

7.3 运用单变量求解计算股票收益率的波动率 前面介绍了通过股票和债券的给定指标,如当前股票价格 S、利率 r、股票收益率的波

动率 等,用 B-S 公式计算任意到期时间 T 和执行价格 X 下的看涨期权和看跌期权的价格;

反过来,在已知看涨期权价格 C、当前股票价格 S、利率 r,期权到期时间 T 和执行价格 X

的情况下应用 B-S 公式可以求出股票收益率的波动率 ,股票收益率的波动率表示股票的

风险。下面通过具体实例分析应用 B-S 公式估计股票收益率的波动率。 例 7-3 某股票的看涨期权价格 C=3 元,当前股价 S=35 元,期权执行价格 X=40 元,

无风险利率为 r=6%,到期时间 T=1 年,试推断由期权定价公式决定的隐含的股票收益率

的波动率 。 计算隐含波动率 可以应用 Excel 的单变量求解命令,具体步骤如下。 (1)任意给定一波动率 ,此处采用 20%(并非实际值,在该波动率下求出对应的看

100

金融财务建模与计算——基于 VBA 与 MATLAB 实现

涨期权的价格)。 (2)求出 1 2,d d 对应的值。单击 B9 单元格,在编辑栏输入“=(LN(B3/B4)+(B5+0.5*B7^2)*

B6)/(B7*SQRT(B6))”;单击 B10,在编辑栏输入“=B9-SQRT(B6)*B7”。 (3)确定 1 2( ), ( )N d N d 对应的值。单击 B12 单元格,在编辑栏输入“=NORMSDIST(B9)”;

单击 B13 单元格,在编辑栏输入“= NORMSDIST(B10)”。 (4)根据 B-S 公式,求对应的看涨期权的价格。单击 B15 单元格,在编辑栏输入

“=B3*B12-B4*EXP (-B5*B6)*B13”。 (5)求出看涨期权的价格为 1.75 元,而已知的看涨期权的价格为 3 元。执行【工具】→

【单变量求解】命令,在出现的“单变量求解”对话框中选择“目标单元格”为“B15”,“目

标值”为“3”,“可变单元格”为“$B$7”,如图 7-9 所示。 (6)完成后单击【确定】按钮,出现“单变量求解状态”对话框,单击【确定】按钮,

结果如图 7-10 所示。

图 7-9 “单变量求解”对话框 图 7-10 运用单变量求解计算隐含的波动率

从图 7-10 中可以看出,通过 B-S 公式,运用单变量求解很容易计算出股票收益率的波

动率为 29.0957%。波动率代表着股票的风险,所以 B-S 期权定价公式可以应用在股票的风

险度量上。 隐含的波动率 ,也可以通过反复试算得到。

注意: 波动率 越大,对应的期权价值也应越大,因为期权的波动率越大,股票的波动率

越大,期权就越有价值。

下面采用试算法求隐含的波动率 ,对应条件与上相同(C=3 元,S=35 元,X=40 元,

r=6%,T=1 年),运用试算法求出隐含的波动率。 具体步骤如下。 (1)任意假设一波动率 ,此处采用 20%(并非实际值),在波动率下求出对应的看涨

期权的价格,具体步骤不再详述。结果如图 7-11 所示。 (2)做出模拟运算表,首先给出一个可能的波动率的变化范围,此处选用 15%~30%

的区间,如图 7-12 所示。单击 C18 单元格,在编辑栏输入“=B15”,使其求出的价格等于

上面求出看涨期权的价格。

101

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

图 7-11 试算法求隐含波动率

(3)选择 B18:C34 单元格区域,执行【数据】→【模拟运算表】命令,在“模拟运算

表”对话框中设置“输入引用列的单元格”为波动率 对应的单元格$B$7,完成后单击【确

定】按钮。 (4)运用模拟运算表的结果,画出对应的看涨期权价格与隐含的波动率 ,如图 7-12

所示。 由图 7-12 中左侧模拟运算表的 C33 单元格和 C34 单元格,结合例子中看涨期权价格

为 3 元的已知条件,说明 应稍大于 29%。为提高准确率,可以再进行一次试算,采用 29%~

30%的区间,以 0.1%为一个单位,再做出模拟运算表,如图 7-13 所示。具体步骤不再详述。

图 7-12 看涨期权价格与隐含的波动率 图 7-13 模拟运算表

从图 7-13 可以看到,当波动率采用 29.1%时,看涨期权的价格为 3.000583 元,十分接

近已知的 3 元,因此隐含的波动率 近似为 29.1%,此结果与采用单变量求解法得出的结

果 29.0957%十分接近。

7.4 运用二分法 VBA 函数计算隐含波动率 7.3 节中介绍了应用 B-S 期权定价公式计算期权隐含波动率 ,同样也可以使用 VBA

来定义一个函数,从而更方便快捷地得到 的值。

102

金融财务建模与计算——基于 VBA 与 MATLAB 实现

下面是定义计算看涨期权的隐含的波动率 的 VBA 程序。

Function CallVolatility(S, X, r, T, target) High = 1 Low = 0 Do While (High - Low) > 0.0001 If CallOption(S, X, T, r, (High + Low) / 2) > target Then High = (High + Low) / 2 Else Low = (High + Low) / 2 End If Loop CallVolatility = (High + Low) / 2 End Function

在 CallVolatility 函数中,参数 target 为看涨期权价格 C。 例 7-4 某股票的看涨期权价格 C=3 元,当前股价 S=35 元,期权执行价格 X=40 元,

无风险年利率 r=6%,期权到期时间 T=1 年,试推断期权隐含的波动率 。 具体步骤如下。 (1)建立一个 Excel 工作表,将已知数据输入,如

图 7-14 所示。 (2)选定 B8 单元格,执行【工具】菜单中的【宏】

命令,系统弹出一个子菜单。 (3)在弹出的菜单中单击【Visual Basic 编辑器】命令

或按【Alt+F11】键,进入“Microsoft Visual Basic”窗口。

执行【插入】→【模块】命令,系统出现一个空白编辑框,

在窗口左下角“属性-模块 1”对话框下的名称后输入将要编辑的模块的名称,然后输入上

面的程序,如图 7-15 所示。

图 7-15 “Microsoft Visual Basic”窗口

(4)执行【调试】→【编译 VBAproject(L)】命令,查找程序是否有错误。 (5)若编译通过,则单击工具栏中的 Excel 图标,返回 Excel 工作表。 (6)执行【插入】菜单中的【函数】命令,系统弹出“插入函数”对话框。 (7)在“插入函数”对话框中的“选择类别”中选择“用户定义”,在“选择函数”中

选择刚刚编辑的“CallVolatility”函数,如图 7-16 所示,单击【确定】按钮即可。 (8)系统弹出“函数参数”对话框,在对话框中输入参数,单击【确定】按钮。 (9)计算结果如图 7-17 所示。

图 7-14 输入已知数据

103

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

图 7-16 “插入函数”对话框 图 7-17 计算结果

从图 7-17 中可以看出,这个结果与 7.3 节中的计算结果基本相同。

7.5 运用牛顿法计算隐含波动率 除了上述介绍的二分法计算隐含波动率外,还可以利用牛顿法来计算隐含波动率。应

用牛顿法时,有如下三个关键公式:

1 2 Market( ) ( ) e ( )rTf SN d X N d C (7-1)

21 / 21( ) e

2dC P

f S T

(7-2)

1( )( )

jj j

j

f

f

(7-3)

式(7-2)是对 B-S 的期权定价模型求波动率的一阶偏导数。 采用牛顿法来计算隐含波动率,需要在假定其他变量固定的条件下,不断改变波动率

系数以求解模型,从而使得模型价格与市场价格的差异趋向于 0。这时,在模型中使用的

波动率就是期权的隐含波动率。 下面,我们以不支付股息的欧式股票看涨期权为例,设 S=20 元,X=17.50 元,r=10%,

T=0.25 年,运用牛顿法来计算隐含波动率。 2 2

Market

2 20.1 0.25

ln( / ) ( / 2) ln( / ) ( / 2)( ) ( ) e ( )

ln(20 /17.5) (0.1 / 2) ln(20 /17.5) (0.1 / 2)20 ( ) 17.5e ( ) 3.50.25 0.25

rTS X r S X rf SN X N C

T T

N N

假设一开始随意选择波动率为 18%(即 1 0.18 ),根据上式求出的模型价格(CModel)

为 2.9592。根据式(7-1)和式(7-2)有:

1( ) 2.9592 3.5 0.5408f , 1( ) 0.40945f

再将 1 1( ), ( )f f 的数值代入式(7-3)得:

20.54080.18 1.5008

0.40945

104

金融财务建模与计算——基于 VBA 与 MATLAB 实现

然后,用 2 1.5008 取代 1 0.18 ,重复以上的步骤,再次计算期权的模型价格及其

2 2( ), ( )f f 和 3 ,……;如此循环反复,最终试算出一个最接近期权市场价格的模型价

格。此时,所试用的波动率就是隐含波动率。在此例子中,当试算的波动率为 44.49%(即

6 0.4449 )时,期权的模型价格为 3.5001,与期权的市场价格 3.5 几乎一样,如表 7-1所示。

表 7-1 运用牛顿法试算隐含波动率的过程

CModel CMarket ( )jf ( )jf ( ) / ( )j jf f 1j

1=0.1800

2=1.5008

3=0.4583

4=0.4288

5=0.4450

6=0.4449

2.9592

7.002

3.5385

3.4548

3.5004

3.5001

3.5

3.5

3.5

3.5

3.5

3.5

0.5408

3.502

0.0385

0.0452

0.0004

0.0001

0.40945

3.3592

1.305

2.7878

2.4816

1.3208

1.0425

0.0295

0.0162

0.000141

2=1.5008

3=0.4583

4=0.4288

5=0.4450

6=0.4449

下面是运用牛顿法计算看涨期权的隐含的波动率 的 VBA 程序。

Function f(S, X, r, T, sigma, Cmarket) f = CallOption(S, X, r, T, sigma) - Cmarket End Function Function fPi(S, X, r, T, sigma) fPi = S * Sqr(T) * Exp(-0.5 * dOne(S, X, r, T, sigma) ^ 2) / Sqr(2 * PI) End Function Function Newton(S, X, r, T, sigma, Cmarket, er) Cmodel = CallOption(S, X, r, T, sigma) Do While (Cmodel - Cmarket) ^ 2 > er ^ 2 sigma = sigma - f(S, X, r, T, sigma, Cmarket) / fPi(S, X, r, T, sigma) Cmodel = CallOption(S, X, r, T, sigma) Loop Newton = sigma End Function

7.6 运用科拉多-米勒公式计算隐含波动率 从 B-S 公式可知,人们不可能直接通过解 B-S 模型来求得隐含波动率。为了计算出隐

含波动率,经济学家和理财专家曾做过种种努力,试图解决这个问题。如布雷纳(Brenner)和萨布拉曼亚(Subrahmanyam)于 1988 年,查恩斯(Chance)于 1993 年分别提出的计算

隐含波动率的公式。虽然这些公式对于持有平价期权的波动率的计算还算准确,但是基础

资产的价格一旦偏离期权执行价格的现值,其准确性就会丧失。1996 年,科拉多(Corrado)和米勒(Miller)在前人研究的基础上建立了一个公式,大大提高了隐含波动率的计算准确

性,这个公式是:

221 2 e e ( e )( )

2 2e

rT rT rT

rT

S X S K S XC C

S XT

(7-4)

105

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

例如,设 S=110 元,X=105 元,r=8%,T=0.75 年(9 个月期), e rTX =98.885276,C=15.62。我们可根据式(7-4)计算出欧式看涨期权的隐含波动率为 24.85%,即:

1 2 3.14159110 98.88530.75

110 98.885315.622

22110 98.8853 (110 98.8853)(15.62 )

2 3.14159

=0.2485

下面是运用科拉多-米勒公式计算看涨期权的隐含的波动率 的 VBA 程序。

Function one(T) one = 1 / Sqr(T) End Function Function two(S, X, r, T) two = Sqr(2 * PI) / (S + X * Exp(-r * T)) End Function Function three(S, X, r, T) three = (S - X * Exp(-r * T)) / 2 End Function Function four(c, S, X, r, T) four = (c - three(S, X, r, T)) ^ 2 End Function Function five(S, X, r, T) five = ((S - X * Exp(-r * T)) ^ 2) / PI End Function Function CM(S, X, r, T, c) CM = one(T) * (two(S, X, r, T) * (c - three(S, X, r, T) + Sqr(four(c, S,

X, r, T) - five(S, X, r, T)))) End Function

7.7 隐含波动率计算模型 估计波动率的方法主要有两种:一种方法是根据股票价格的历史数据进行统计分析而

得到波动率;另一种方法是计算隐含价格波动

率,隐含价格波动率是根据观察的期权市场价

格,通过 B-S 期权定价模型计算出隐含波动率。

7.7.1 模型结构设计 首先建立一个名字为“隐含波动率计算模

型.xls”的工作簿,在当前的工作表上设计模型

的结构,如图 7-18 所示。 模型由以下三个部分组成。 (1)输入数据区域。包括股票和期权的基本 图 7-18 隐含波动率计算模型

106

金融财务建模与计算——基于 VBA 与 MATLAB 实现

数据区域,还包括“看涨期权”和“看跌期权”的下拉列表框控件,其数据源区域为

“$C$6:$C$7”,单元格链接为“$B$9”,在单元格 C6 和 C7 中分别输入“看涨期权”和“看

跌期权”,并将这两个单元格的字体颜色设为白色。 (2)命令按钮区域。包括一个【计算】按钮和一个【清除表格】按钮。单击【计算】

按钮模型自动完成计算,并将隐含波动率的最终计算结果显示在单元格 D3 中。单击【清

除表格】按钮,则将所有的数据清除掉,使工作表返回如图 7-18 所示的界面。 (3)计算结果区域。即单元格 D3。 (4)对【计算】按钮指定一个名字为“Sub 计算()”的宏,并编写如下的程序代码:

Sub 计算() On Error GoTo 10 ActiveWorkbook.Names.Add Name:="p", RefersToR1C1:="=Sheet1!R3C2" Range("b4").Select ActiveWorkbook.Names.Add Name:="x", RefersToR1C1:="=Sheet1!R4C2" Range("b5").Select ActiveWorkbook.Names.Add Name:="t", RefersToR1C1:="=Sheet1!R5C2" Range("b6").Select ActiveWorkbook.Names.Add Name:="s", RefersToR1C1:="=Sheet1!R6C2" Range("b7").Select ActiveWorkbook.Names.Add Name:="rf", RefersToR1C1:="=Sheet1!R7C2" Range("b9").Select ActiveWorkbook.Names.Add Name:="type", RefersToR1C1:="=Sheet1!R9C2" Range("d3").Select ActiveWorkbook.Names.Add Name:="ci", RefersToR1C1:="=Sheet1!R3C4" Range("b12").Select ActiveWorkbook.Names.Add Name:="xd1", RefersToR1C1:="=Sheet1!R12C2" Range("b13").Select ActiveWorkbook.Names.Add Name:="xd2", RefersToR1C1:="=Sheet1!R13C2" Range("d12").Select ActiveWorkbook.Names.Add Name:="nd1", RefersToR1C1:="=Sheet1!R12C4" Range("d13").Select ActiveWorkbook.Names.Add Name:="nd2", RefersToR1C1:="=Sheet1!R13C4" Cells(12, 2) = "=(ln(s/x)+(rf+ci^2/2)*t)/ci/sqrt(t)" Cells(13, 2) = "=xd1-ci*sqrt(t)" Cells(12, 4) = "=if(type=1,normsdist(xd1),normsdist(-xd1))" Cells(13, 4) = "=if(type=1,normsdist(xd2),normsdist(-xd2))" Cells(9, 4) = "=if(type=1,s*nd1-x*exp(-rf*t)*nd2,-s*nd1+x*exp(-rf*t)*nd2)-b3" Range("d9").GoalSeek goal:=0, changingcell:=Range("d3") Range("d9").Font.ColorIndex = 2 Cells(3, 4).NumberFormat = "0.00%" End 10 MsgBox "隐含波动率的初始值设置不合适!请在单元格 D3中输入一个适当的波动率,再重新

运行模型!" End Sub

(5)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Range("b3:b7").ClearContents Cells(3, 4) = ""

107

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

Range("b12:b13").ClearContents Range("d12:d13").ClearContents End Sub

这样,就建立了隐含波动率计算模型。

7.7.2 模型应用举例 例 7-5 已知某股票的目前价格为 40 元,看涨期权的价格为 3.23 元,执行价格为 36

元,期限为 6 个月,年无风险利率为 8%。试计算隐含波动率。 在模型中输入已知数据,并选择看涨期权,单击【计算】按钮,即可得到隐含波动率

为 38.08%,如图 7-19 所示。 模型使用注意事项:如果在运行模型时,波动率的初始值设置不合适,比如,当单元

格 D3 为空单元格时,模型就会出现错误,并弹出如图 7-20 所示的警告框,提示用户在单

元格 D3 中输入一个适当的不为零的数字,然后运行模型。

图 7-19 隐含波动率的计算结果 图 7-20 模型计算出错警告框

7.8 期权定价的蒙特卡罗模拟模型

7.8.1 期权价格的随机模拟方法 在很多情况下,我们无法利用 B-S 模型来计算期权价格。这时,可以利用蒙特卡罗模

拟方法来估计期权价格。蒙特卡罗模拟方法估计期权价格的步骤如下。 (1)首先利用股票价格的模拟模型估计股票的价格:

1 exp( )t tS S t z t

式中 tS ——t 时刻的股票价格; 1tS ——t+1 时刻的股票价格; ——股票价格对数均值; ——股票价格对数标准差; t ——要计算的时间间隔(以年为单位); z ——服从标准正态分布的随机数。

(2)计算出股票在期权期限 T 终了时的价格 TS 后,则可以计算出期权价格。

108

金融财务建模与计算——基于 VBA 与 MATLAB 实现

看涨期权:

e max( ,0)rTTC S X

看跌期权:

e max( ,0)rTTP X S

式中 C——看涨期权的价格; P——看跌期权的价格; r——年无风险利率; X——期权的执行价格。

(3)进行足够多次的模拟计算,将这些模拟计算结果的平均值作为最终的期权价格。

7.8.2 模型结构设计 1.模型的设计 首先建立一个名字为“期权定价的蒙特卡罗模拟模型.xls”的工作簿,在当前的工作表

上设计模型的结构,如图 7-21 所示。

图 7-21 期权定价的蒙特卡罗模拟模型

模型由以下三个部分组成。 (1)已知数据区域。要求用户输入股票的有关数据、期权基本数据和模拟计算时间的

有关参数。需要注意的是,股票价格对数均值和标准差必须与计算的时间间隔对应起来,

如果计算的时间间隔为 1 天,那么股票价格对数均值和标准差必须以日股票价格为基准;

如果计算的时间间隔为 7 天(1 周),那么股票价格对数均值和标准差必须以周股票价格为

基准。此外,还插入一个选择期权类型的下拉列表框控件,其数据源区域为“$E$6:$E$7”,单元格链接为“$D$6”,在单元格 E6 和 E7 中输入“看涨期权”和“看跌期权”,并将这两

个单元格的字体颜色设为白色。 (2)命令按钮区域。包括一个【计算】按钮和一个【清除表格】按钮。单击【计算】

按钮则完成模拟计算过程,输出股票价格的模拟计算结果。单击【清除表格】按钮则完成

数据的清除功能,使工作表返回如图 7-21 所示的界面。 (3)计算结果区域。输出期权价格的最终模拟计算结果,显示在单元格 B12~F12 的

合并单元格内。

109

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

2.程序代码设计 (1)对【计算】按钮指定一个名字为“Sub 计算()”的宏,并编写如下的程序代码:

Sub 计算() Dim i, j, n, nt As Integer Dim dt, rd, z, sumt, x, r As Single Dim pln, pcn As Single Dim myrange As String pln = Cells(3, 2) pcn = Cells(4, 2) n = Cells(4, 4) ReDim p(n) p(0) = Cells(5, 2) dt = Cells(7, 2) / 250 nt = Cells(8, 2) x = Cells(3, 4) r = Cells(5, 4) sumt = 0 For t = 1 To nt For i = 1 To n rd = Rnd() z = Application.WorksheetFunction.NormSInv(rd) p(i) = p(i - 1) * Exp(pln * dt + pcn * z * Sqr(dt)) Next i If Cells(6, 4) = 1 Then sumt = sumt + Exp(-r * n / 250) * IIf(p(n) - x > 0, p(n) - x, 0) Else sumt = sumt + Exp(-r * n / 250) * IIf(p(n) - x > 0, p(n) - x, 0) End If Cells(12, 5) = t Next t pj = sumt / nt Cells(12, 2) = pj Cells(12, 2).NumberFormat = "0.00" End Sub

(2)对【清除表格】按钮指定一个名字为“Sub 清除表格()”的宏,并编写如下的程

序代码:

Sub 清除表格() Range("b3:b5").ClearContents Range("b7:b8").ClearContents Range("d3:d5").ClearContents Range("b12") = "" Range("d6") = "" End Sub

这样,就建立了期权定价的蒙特卡罗模拟模型。

7.8.3 模型应用举例 例 7-6 已知某股票的目前价格为 80 元,股票价格的对数日均值为 8%,日标准差为

25%;看涨期权的有效年限为 1 年(按 250 天计),执行价格为 88 元,年无风险利率为 6%。

110

金融财务建模与计算——基于 VBA 与 MATLAB 实现

试计算此看涨期权的价格。 计算步骤如下。 (1)在单元格 B3 中输入股票价格对数均值“8%”,在单元格 B4 中输入股票价格对数

标准差“25%”,在单元格 B5 中输入目前的股票价格“80”,在单元格 B7 中输入计算时间

间隔“1”,在单元格 B8 中输入总模拟计算次数“1000”。 (2)在单元格 D3 中输入执行价格“88”,在单元格 D4 中输入期限“250”,在单元格

D5 中输入年无风险利率“6%”。 (3)单击【计算】按钮,该模型自动计算出结果,如图 7-22 所示。

图 7-22 模型计算结果

7.9 期权定价信息系统设计 下面以 B-S 期权定价模型为例,来说明其信息系统的设计方法。

7.9.1 设计窗体 在 Visual Basic 编辑器窗口中,执行【插入】菜单中的【用户窗体】命令,插入一个用

户窗体 User1Form1,将其 Caption 属性设置为“B-S 期权定价模型”,如图 7-23 所示。

图 7-23 插入用户窗体

111

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

窗体的设计步骤如下。 (1)在此窗体上插入 2 个框架 Frame1 和 Frame2,其 Caption 属性分别设置为“输入已

知数据”和“计算结果”。 (2)在框架 Frame1 中插入 6 个标签 Label1~Label6,其 Caption 属性分别设置为“目

前股票价格(元)”、“股票年对数收益率标准差%”、“期权执行价格(元)”、“期权到期时

间(年)”、“年无风险利率”和“期权种类”。

(3)在框架 Frame1 中插入 5 个文本框 TextBox1~TextBox5,其 Text 属性均设置为空

值,其 TabIndex 属性分别设置为 1、2、3、4、5。 (4)在框架 Frame1 中插入 2 个单选按钮 OptionButton1 和 OptionButton2,其 Caption

属性分别设置为“看涨期权”和“看跌期权”,其 TabIndex 属性分别设置为 6、7。单选按

钮 OptionButton1 的 Value 属性设置为 True。 (5)在框架 Frame2 中插入 1 个标签 Label7,其 Caption 属性设置为“期权价格”。 (6)在框架 Frame2 中插入 1 个文本框 TextBox6,其 Text 属性设置为空值。 (7) 在用户窗体上插入 3 个命令按钮 CommandButton1、CommandButton2 和 Command

Button3,它们的 Caption 属性分别设置为“确定”、“重新计算”、“取消”,其 TabIndex 属性

分别设置为 1、2、3。命令按钮 CommandButton3 的 Cancel 属性设置为 True。

7.9.2 设计程序代码 1.【确定】、【重新计算】、【取消】按钮的程序代码 双击某按钮,比如双击【确定】按钮,则系统打开程序代码窗口,并自动建立如下

过程:

Private Sub CommandButton1_Click() End Sub

这样,用户就可以直接在 Private Sub CommandButton1_Click()和 End Sub 之间编写有

关的程序代码了。 【确定】、【重新计算】、【取消】按钮程序代码分别如下:

Private Sub CommandButton1_Click() Dim s, c, r, x, t As Single Dim d1, d2, nd1, nd2, p As Single s = Val(TextBox1.Text) c = Val(TextBox2.Text) x = Val(TextBox3.Text) t = Val(TextBox4.Text) r = Val(TextBox5.Text) Cells(1, 1) = "B-S期权定价模型" Cells(2, 1) = "已知数据" Cells(3, 1) = "目前股票价格(元)" Cells(4, 1) = "股票年对数收益率标准差%" Cells(5, 1) = "期权执行价格" Cells(6, 1) = "期权到期时间(年)" Cells(7, 1) = "无风险利率%" Cells(8, 1) = "期权种类"

112

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Cells(3, 2) = s Cells(4, 2) = c Cells(4, 2).NumberFormat = "0%" Cells(5, 2) = x Cells(6, 2) = t Cells(7, 2) = r Cells(7, 2).NumberFormat = "0%" If OptionButton1.Value = True Then Cells(8, 2) = "看涨期权" ElseIf OptionButton2.Value = True Then Cells(8, 2) = "看跌期权" End If d1 = (Log(s / x) + (r + c ^ 2 / 2) * t) / c / Sqr(t) d2 = d1 - c * Sqr(t) If OptionButton1.Value = True Then nd1 = Application.WorksheetFunction.NormSDist(d1) nd2 = Application.WorksheetFunction.NormSDist(d2) p = Round(s * nd1 - x * Exp(-r * t) * nd2, 2) Else nd1 = Application.WorksheetFunction.NormSDist(d1) nd2 = Application.WorksheetFunction.NormSDist(d2) p = Round(-s * nd1 + x * Exp(-r * t) * nd2, 2) End If TextBox6.Value = p Cells(11, 2) = p Range("a2") = "已知数据" Range("a2:b2").Select Selection.Merge Range("a10") = "计算结果" Range("a10:b10").Select Selection.Merge Range("a11") = "期权价格(元)" Range("a2:b8").Select End Sub Private Sub CommandButton2_Click() TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" End Sub Private Sub CommandButton3_Click() End End Sub

2.“看涨期权”和“看跌期权”单选按钮的程序代码 “看涨期权”和“看跌期权”单选按钮的程序代码如下:

Private Sub OptionButton1_Enter()

113

第 7 章 Black-Scholes 期权定价模型及其 VBA 实现

OptionButton1.Value = True OptionButton2.Value = False End Sub Private Sub OptionButton2_Enter() OptionButton1.Value = False OptionButton2.Value = True End Sub

3.自定义菜单的设计 插入一个“模块 1”,在此模块中编写如下的自定义菜单的宏代码和调用用户窗体的宏

代码:

Sub auto_open() MenuBars(xlWorksheet).Menus.Add "期权定价模型" MenuBars(xlWorksheet).Menus("期权定价模型").MenuItems.Add "BS模型", "BS模型" End Sub Public Sub BS模型() UserForm1.Show End Sub

这样,利用 B-S 期权定价模型计算期权价格的计算模块就建立起来了。这个计算模块

同时在窗体中显示计算结果和将计算结果输出到工作表中。

本章小结 本章在介绍 Black-Scholes 期权定价模型基础上,给出了计算 Black-Scholes 期权定价模

型的具体计算步骤,编制了计算 Black-Scholes 期权定价模型期权价格的 VBA 程序,并运

用不同的方法编制了计算波动率的 VBA 程序。波动率的计算,为后面章节(如第 16 章)

的信用度量奠定了良好的基础。

第 8 章 二叉树(二项式)期权定价

模型及其 VBA 实现 本章要点

介绍二项式期权定价模型。

编制二项式期权定价模型计算期权价格的 VBA 程序。

对于无法用 Black-Scholes 期权定价模型进行精确定价的期权,要用其他的替代方法。

本章介绍二叉树(二项式)期权定价模型及其计算过程。该模型是 1979 年由 Cox、Ross、Rubinstein 等人提出的,因此也称 Cox-Ross-Rubinstein 模型。

二叉树期权定价模型,简称 BOPM,与 Black-Scholes 期权定价模型有许多相似之处,

但前者更加形象一些。二叉树期权定价模型可对典型的不支付红利的欧式期权公平定价,

也可以将该模型修改后对美式期权及支付红利的期权定价。 下面用例子来说明二叉树期权定价模型的定价方法。若某公司股票现行市价为 100 美

元(t=0 时),一年以后价格可能变为 125 美元或 80 美元。年无风险利率为 8%(连续复利

计)。则一年后该股票的看涨期权(敲定价格为 100 美元且到期日是一年后)的价值为 0 或

25 美元,其二项式分析如图 8-1 所示。

125 PT=25

(15.72)

125 PT=25 111.80

100 100 100 PT=0

80 PT=0 89.44

(0)

80 PT=0

t=0 t=T t=0 t=0.5T t=T (a)年分析 (b)半年的分析

图 8-1 二项式分析

115

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

从上图可以看出该模型为什么会被称为二叉树(二项式)模型,因为只有两个分叉代

表到期时的价格,即假设标的资产价格变动出现两种可能性。

8.1 单期的二叉树(二项式)期权定价模型 假设:摩擦性资本市场没有交易成本或税收,但人人都能同时免费获悉信息;对卖空

没有限制;资产价格服从整个时期的平稳随机过程;无风险收益率在整个时期恒定不变;

基础资产不付股息(或任何类别的现金支出)。 上述大部分假设可以再放松限制而不会改变期权定价模型的基础。 为了建立二项式模型,假定存在一个时期,在此期间股票价格能够从现行价格上升或

下降。 假定:S=40 美元,即现行的股票价格;q=0.5,即股票价格上升的概率;1+rF 即 1 加

上无风险利率;u=1.2,即股票价格做上升运动(u>1+rF>1);d=0.67,即股票价格做下降运

动(d<1)。 在这时期期末,股票可能上升到 uS(48.00 美元),其概率是 q=0.5;或者下降到 dS(即

26.80 美元),其概率是 1q=0.5,如图 8-2 所示。 q uS=48.00 美元

S =40 美元

1q dS=26.80 美元

图 8-2 一期二项式随机过程

注意: 股票价格下跌乘数 d 一定小于 1,但未必与价格上升运动有联系( ud /1 )。如果

0<d<1,不论实际上又增加了多少时期,股票价格也不可能跌到 0 以下。如果有 n 个时期,

0<d<1,那么 lim 0n

nd

股票价格向上的幅度 u 和向下的幅度 d 是这样定义的,假使股票价格没有上限,下限

为 0,这反映了普通股有限负责的特征;如果你买了一股票,你可能损失你的付款,但不

可能比你的付款更多。因此我们要求 1 1Fu r d 。如果这些不等式不能成立,那么客

观上就存在无风险套利机会。 现在想象一下购买期权 C,根据股票而签订的约定价格 X=38 美元。对购买权的偿付如

图 8-3 所示。 上述价格的变化用一般符号表示,如图 8-4 所示。

q Cu=max{0,uSX}=10.00 美元

C

1q Cd=max{0,dSX}=0.00 美元

q uSmCu

SmC

1q dSmCd

图 8-3 一期二项式随机过程 图 8-4 一期二项式随机过程

后以 10 美元或 0 美元告终的概率各为 50%。问题是:我们对购买权现在应该支付多

少呢?

116

金融财务建模与计算——基于 VBA 与 MATLAB 实现

为了回答这一问题,我们从构成无风险套期保值组合资产开始。该项组合资产由一股

股票 S 和该股票 m 份购买选择权构成。图 8-4 表明了套期保值组合资产的偿付。我们可通

过令期末偿付额相等来确定正确的套期保值比率:

uSmCu= dSmCd

然后求出 m,即该种股票购买选择权的份数: ( )u d

S u dm

C C

代入数字,我们发现合适的套期保值比率是: ( ) 40 (1.2 0.67) 2.12

10 0u d

S u dm

C C

所以,无风险套期保值组合资产由买进的一股股票和根据该股票而签订的 2.12 份购买

选择权构成。表 8-1 使用数字说明套期保值组合资产在两种自然状况下有相同的偿付额。

表 8-1 套期保值组合资产的偿付额

自然状态 组合资产 偿 付 额

有 利 的 uSmCu 1.2402.1210=26.80

不 利 的 dSmCd 0.67402.120=26.80

因为套期保值组合资产是为了无风险而构造的,因此,我们可对该项组合资产乘以(1+无风险利率),以获得期末偿付额。在数学上是:

(1+rF)·(SmC)=uSmCu

求购买选择权的价格 C,有: (1 )

(1 )F u

F

S r u mCC

m r

把套期保值比率 m 代入方程式并且重新排列各项,可把购买选择权的价格重新写成: 1 1[ ( ) ( )] (1 )F F

u d Fr d u r

C C C ru d u d

(8-1)

如果假定: 1 Fr d

pu d

11 Fu rp

u d

那么,式(8-1)可简化为:

[ (1 ) ] (1 )u d FC pC p C r (8-2)

把 p 称为套期保值概率,它总是大于或等于 0,小于或等于 1,具有概率的全部特征。

式(8-2)就是论述的二项式定价模型。根据这个二项式,可测算出衍生资产购买选择权

的价格。 继续上述的例子,可使用式(8-2)估价购买选择权。

[ (1 ) ] (1 )u d FC pC p C r

117

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

= 1 0.1 0.67 1.2 1 0.1[ 10 0] (1 0.1)1.2 0.67 1.2 0.67

=7.38(美元)

如果购买选择权值 7.38 美元,套期保值组合资产要求按 40 美元的价格买进一股股票,

卖出 2.12 份购买选择权,则净投资是:

SmC=4015.65=24.35(美元)

由表 8-1 可以知道,套期保值组合资产在两种自然状态下可盈利 26.80 美元,所以 1加上套期保值组合资产收益率是:

1+rF= (uSmCu )/( SmC)=26.80/24.35=1.1

这就证实了选择权的定价是正确的,套期保值组合资产可赚取 10%的无风险收益率。 购买选择权价格的先前推导,关键取决于套期保值组合资产的存在和下列事实:即购

买权的定价必须保证无风险套期保值能够准确地赚取无风险收益率。如果购买权价格较高

(或较低),那么套期保值组合资产将比无风险收益率赚得更多(或更少),而赚取无风险套

利的机会就会存在。套利将迫使购买权价格恢复正常,因为交易者总是要建立这样的套期

保值组合资产,一旦价格偏离现行标准就能比无风险收益率赚取更多。 二项式选择权定价模型阐明了选择权定价的如下特征。一是选择权价格不依赖于在股

票价格向上运动中的概率 q。尽管投资者对未来的股票价格有各种各样的期望,但他们仍

然同意,购买权价格与其参数即 S、u、d、X、rF和 t(在时期模型中,t=1)有关。二是个

人对待风险的态度与推导购买选择权公式无关。三是购买权价格所依赖的唯一随机变量是

股票价格。购买权价格不取决于由全部证券形成的组合资产。 这些特征有助于强调一点,即选择权定价模型比资本资产定价模型等均衡模型依赖较

少的假定。一项选择权仅仅是一项风险资产的未定债权,一旦观察到资产的均衡价值,便

可知选择权价格的运动与它相一致。 二项式模型可扩展到多时期的结构,并可用来解决诸如支付股息股票的美国购买权价

格或美国出售权价格等更为现实的问题。在一定范围内,随着每单位时间的二项式跳跃次

数趋于无穷大,二项式模型就接近于 B-S 模型。

8.2 购买选择权价格与套利过程 有一种市场机制,它能使买方选择权价格实际上等于均衡购买选择权价格。如果买方

选择权市价不等于均衡价格,投资者便可套利,并保证获取确定利润。例如,假若 C0=10美元,因为买方选择权价格小于其均衡价格(假设为 12.73 美元),所以,我们可买进买方

选择权并卖空股票,这样可保证确定的利润,基于均衡价格的买方套利过程如表 8-2 所示。

表 8-2 基于均衡价格的买方套利过程

期初交易 期初现金流(美元) 期末现金流(美元)

S1=150 S1=75

买进一份买方选择权

卖空 0.4 股股票

总现金流量

10

+40

+30

30

60

30

0

30

30

118

金融财务建模与计算——基于 VBA 与 MATLAB 实现

因为我们已经反向操作表 8-2 对冲证券组合的现金流量,故现金流也应与原来的相反。

投资者期末负债 30 美元。不过,他期初拥有 30 美元,因此,他能以 10%的报酬(即 27.27美元)投资在其他项目上,期末时将变为 27.271.1=30 美元。这一数量将偿还期末负债 30美元,留给他一个确定的期末利润:3027.27=2.73 美元。

只要买方选择权价格 C0小于 12.73 美元,这一套利过程就将继续下去,买方选择权需

求增加导致选择权价格上升。与此同时,C0>12.73 美元的可能性就会变为现实。假定 C0=15美元,买方套利过程如表 8-3 所示。

表 8-3 买方套利过程

期初交易 期初现金流(美元) 期末现金流(美元)

S1=150 S1=75

买进一份买方选择权

卖空 0.4 股股票

总现金流量

+15

40

25

30

+60

+30

0

+30

+30

投资 25 美元在期末可得无风险报酬。这样,期初时投资者可借 30/r=30/1.1=27.27美元,以其中的 25 美元支付初始投资。期末时初始投资得到 30 美元报酬,这足以偿还

贷款(本金乘以利率)(30/r)r=30 美元。投资者在期初时还剩下一确定利润 27.2725=2.27美元。这一套利过程将继续下去,使得购买选择权价格下跌直至它恰好等于 12.73 美元

为止。

8.3 两期与多期的二项式模型 到目前为止,我们一直假定选择权仅有一个时期到期。单期公式是不现实的,因为股

价在某给定日与到期日间是变化多端的。然而,相同的套利过程也可用于多期情形。我们

将较详细地阐明两期情形,并解释一般 n 期情形的二项式定价模型。设现行股价(在买方

选择权到期日的两个时期前)为 S0,那么两期后,当股价每期以固定百分比 u(或 d)上升

(或下跌)时,在到期日,我们有下列 4 种可能的股价: (1)uuS0,表示两期内股价都上升; (2)ddS0,表示两期内股价都下跌; (3)udS0,表示在第一期上升,在第二期下跌; (4)duS0,表示在第一期下跌,在第二期上升。 我们考察到期日之前一期为时间 1 及现在(到期日之前两期)为时间 0 的情形。图 8-5

描述了股价与对应的买方选择权价格。

注意: 我们没有区分事件 udS0和 duS0,因为这两种情况可能导致两期末相同的股价,故而

在到期日有相同的选择权值。

因为在时间 1,离到期日仅剩一个时期,我们可用单期二项式(8-2)求解 Cu 和 Cd,

即在时间 1 的买方选择权价格,如图 8-5 所示。

119

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

现在 一周末 二周末

uuS0

uS0

股票 S0 udS0

dS0

ddS0

Cuu=max{0,uuS0X}

Cu

买方期权 C Cud=max{0,udS0X}

Cd

Cdd=max{0,ddS0X}

图 8-5 多期套利

利用单期二项式(8-2),代入第二期末的数字,对时间 1 有: (1 ) (1 ),

1 1uu ud ud dd

u dpC p C pC p C

C Cr r

p 与 1p 同式(8-1)中的定义。因为 , ,uu dd udC C C 已知,如图 8-5 所示,所以, ,u dC C 也

是已知的。我们又可利用一期二项式(8-2)代入第一期末的数字求解现行卖方选择权价格 0C 。 将

(1 ) (1 )1 1

uu ud ud ddu d

pC p C pC p CC C

r r

代入

0(1 )

1u dpC p C

Cr

中,得到两期二项式买方选择权定价公式: 2 2

0 22 (1 ) (1 )

(1 )uu ud ddP C P P C P C

Cr

重复这一过程,我们可以在 n 期情形下应用二项式模型,每一步朝后移动一期, 终

解出均衡选择权价格 0C 。 多期二项式定价模型为:

0 00

1 ! (1 ) max{0, }( )! !(1 )

nk n k k n k

nk

nC p p u d S X

n k kr

(8-3)

8.4 二项式期权定价模型应用实例 例 8-1 设有三种投资类型,即股票、期权和无风险债券。已知股票的价格,且投资

于无风险债券的 100 美元一年后收益为 108.33 美元,已知和求解如表 8-4 所示。

120

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 8-4 已知和求解

证 券 股价上升时价格 股价下跌时价格 现 价

股 票 125.00 80.00 100.00

债 券 108.33 108.33 100.00

看涨期权 25.00 0.00 ??

现在的问题是:t=0 时该看涨期权的价格是多少? 根据 B-S 期权定价思想,该看涨期权可由股票与无风险债券的投资组合来复制,且投

资组合的成本就构成了该期权的公平定价。 假设这样的投资组合包含 sN 股股票和 bN 张无风险债券,若股价上涨,一年后投资组

合的价值为125 108.33s bN N ;若股价下跌,一年后投资组合的价值为80 108.33s bN N 。

所以可得如下方程组:

125 108.33 2580 108.33 0

s b

s b

N N

N N

解方程组可得

0.55560.4103

s

b

N

N

即需要买入 0.5556 股股票,同时卖出 41.03 美元的债券(或以无风险利率借入 41.03美元)。

注意: 以上是假定期权只有购买 1 股股票的权利,若像场内交易的大多数期权一样合约规

模是 100 股,则需要买入 55.56 股股票,同时卖出票面价值 100 美元的债券 41.03 张。

为了构造投资组合,需花费 55.56 美元购买 0.5556 股股票(价格 100 美元),而卖出债

券所得则为 41.03 美元。因此,该投资组合的成本只需要 55.5641.03=14.53 美元。这就是

看涨期权的价格,即每股的权利金。 以公式表示,看涨期权的价格为:

s bC N S N b

其中,C 代表现在期权的价格,S 为股票的现价,b 为现在无风险债券的价格。 sN 和 bN 则

分别表示复制期权的投资组合所需要的股票和债券数。若 sN 和 bN 为正,表示买进;若 sN

和 bN 为负,则表示卖出。 下面再计算该期权的套保比率。 在上述的投资组合中,若第二天股价就发生了变化(而不是第二年),组合的价值将改

变 0.5556 美元,因为组合包含了 0.5556 股股票。又因为期权与组合价值相等,所以期权价

值也改变了 0.5556 美元。这个关系可用期权的套保比率来描述,其值为 sN 。

(250)/(12580)=0.5556

由此,可得期权套保比率 h 为:

121

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

u d

u d

o o

s s

P Ph

P P

其中,P 表示期末的价格,O 表示期权,S 表示股票,u 表示股价上涨状态,d 表示股价下

跌状态。 因此,用二项式模型复制看涨期权时,必须买入 h 股股票,同时以无风险利率卖出债

券 B 份,其中 B 为:

PV( )d ds oB hP P

其中,PV 表示将括号内的值折现,因为括号内的值是期末债券的价值。 因此,看涨期权的值可以用下式来表达:

C=hS B

其中,h 是期权套保比率,B 是债券的现值。 另外,我们考虑一种情况,即价格的变化更复杂、离散时间点更多的情况。 将例 8-1加以改变,假设第六个月末,股价可能上升至 111.80美元,也可能降低至 89.44。

一年末价格可能出现两种情况,可能上升了 11.8%或降低了 10.56%。其价格变化显示如 图 8-1(b)所示。

用逆推法计算。首先,确定半年后当股价为 111.80 美元时期权的价格,此时

1h =(250)/(125100)=1.0

1B = (1 100 0) /1.0408 96.08

注:8%的年复利率相当于 4.08%的半年离散贴现率。

C=1111.8096.08=15.72(美元)

同理,当股价降为 89.44 美元时,期权值将为 0,此时

2h =(15.720)/(111.8089.44)=0.7030

2B = (0.7030 89.44 0) /1.0408 60.41

所以,t=0 时,看涨期权的价格为:

C=0.703010060.41=9.89(美元)

一般来说,具有相同到期日、相同敲定价的同一标的资产的看涨期权和看跌期权的套

保比率有如下关系:

1c dh h

其中, ,c dh h 分别为看涨期权和看跌期权的套保比率。 下面用二项式的方法来验证欧式看涨-看跌期权的平价关系。假设某股票期权一年

后到期,敲定价格 100 美元。有 A,B 两个投资策略。A 策略是买进一个看跌期权和一

股股票;B 策略是买进一个看涨期权和无风险债券,债券投资额等于敲定价格的现值。 设到期日股价变化可能出现两种情况,即股价高于或低于敲定价格,如图 8-1(a)所

示的情况(等于的情况并不影响结果)。看涨、看跌期权平价关系如表 8-5 所示。

122

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 8-5 看涨、看跌期权平价关系

策略 初始投资(美元) 到期日价格(美元)

S<X=100 X=100>S

A P+S=6.84+100=106.84 履行权利,获 100 放弃权利,保留股票价值 S

B ( )/ er T tC X =14.53+92.31=106.84 放弃权利,从债券市场获 100 执行权利,得到股票价值 S

从表 8-5 可以得出结论:策略 A 与 B 的投资成本相同,即有 ( )/ er T tP S C X

其中,C,P 分别表示看涨期权和看跌期权的现价,X 表示敲定价格,S 表示股票现价。

8.5 二项式期权定价模型与 Black-Scholes 模型的比较 二项式期权定价模型的时间段是离散型的,考虑到期前价格变化的时间段不断增加的

情况。比如,到期前每天,甚至每小时、每分钟股价都有不同的变化,将会得到一个非常

大的二叉树。实际上,当时间段被无限细分时,式(8-3)就会变成 B-S 公式。 B-S 模型与二项式模型的主要差别有如下几点: (1)B-S 模型没有考虑期权提前执行的情况,而二项式模型并未排斥美式期权的情况,

因而适用更广泛。正因为这一原因,对于实值期权的定价,B-S 模型的定价比二项式模型

偏低。 (2)二项式期权定价模型假定标的资产价格变化呈二项式分布,而 B-S 模型假设价格

呈标准正态分布,后者的假设更接近于现实。 (3)二项式模型在计算机发展的初期阶段比 B-S 模型计算起来更复杂、更费时,但随

着快速大型计算机和模型计算的标准程序的出现,这个问题可以得到解决。

8.6 二项式期权定价模型的计算程序及应用 由式(8-3)和平价公式,n 期欧式看涨、看跌期权价格的二项式计算公式为:

买权价格= 00

max{ ,0}n

i n i i n iu d

i

nq q S u d X

i

卖权价格= 00

max{ ,0}n

i n i i n iu d

i

nq q X S u d

i

为了定义该公式的 VBA 语言,应考虑更一般的情形:假设股票的当前价格为 S,股票

在一年内的价格波动率为 ,无风险债券的年利率为 r(VBA 语言中表示为 rf),股票期权

的执行期限为 T,执行价格为 X,将时间区间平分为 n 份,看做 n 个时间周期,在每个时

间周期内股票可能上涨也可能下跌,幅度分别记为 u 和 d,则结合二项式期权定价公式,

在每个阶段中上涨和下降的状态价格具有如下描述:

/ , er tt T n R

e , et tu d

123

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

, 1/( )u d uR d

q q R qR u d

这种表达方法保证了当 0( )t n 时,股票收益的分布接近于正态分布。 欧式二项式期权定价公式的 VBA 程序如下:

Function Eurcall(S, X, T, rf, sigma, n) delta_t = T / n r = Exp(rf * delta_t) Up = Exp(sigma * Sqr(delta_t)) down = Exp(-sigma * Sqr(delta_t)) q_up = (r - down) / (r * (Up - down)) q_down = 1 / r - q_up Eurcall = 0 For i = 0 To n Eurcall = Eurcall + Application.Combin(n, i) * q_up i * q_down (n - i) *

Application.Max(S * Up ^ i * down ^ (n – i) - X, 0) Next i End Function Function EurPut(S, X, T, rf, sigma, n) delta_t = T / n Up = Exp(sigma * delta_t) r = Exp(rf * delta_t) q_up = 1 / r - q_up EurPut = 0 For i = 0 To n EurPut = EurPut + Application.Combin(n, i) * q_up ^ i * q_down ^ (n - i) *

Application.Max(X - Up ^ i * down ^ (n - i) * S, 0) Next i End Function

注意: 当直接定义欧式看跌期权公式时,也可用看涨看跌期权平价公式。

例 8-2 假设某股票当前价格 S=60 元,股票在一年中价格的波动率 =30%,rf=8%,

运用上面定义的 Eurcall 函数计算执行价格 X=60 元,有效期 T=0.5 年,n=20 的欧式看涨期

权的价格。 具体步骤如下。 (1)建立一个 Excel 工作表,将已知数据输入,如图 8-6 中的 A3:B8 单元区域所示。

图 8-6 输入已知数据

124

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(2)选择 B10 单元格,执行【工具】菜单中的【宏】命令,在弹出的菜单中单击【Visual Basic 编辑器】或按【Alt+F11】键,进入“Microsoft Visual Basic”窗口。

(3)执行【插入】→【模块】命令,系统出现一个空白编辑框,在窗口左下角“属性-模块 1”对话框下的名称后输入将要编辑的模块的名称,然后输入上面的程序,如图 8-7所示。

图 8-7 Eurcall 和 EurPut 函数的 VBA 程序代码窗口

(4)执行【调试】→【编译 VBAproject(L)】命令,查找程序是否有错误。 (5)若编译通过,则单击工具栏中的 Excel 图标,返回 Excel 工作表。 (6)执行【插入】菜单中的【函数】命令,系统弹出“插入函数”对话框。 (7)在“插入函数”对话框中的“选择类别”中选择“用户定义”,在“选择函数”中

选择“Eurcall”函数,如图 8-8 所示,单击【确定】按钮即可。 (8)弹出“函数参数”对话框,输入如图 8-9 所示的参数,单击【确定】按钮。

图 8-8 “插入函数”对话框 图 8-9 “函数参数”对话框

计算结果如图 8-6 所示中的 B10 单元格。欧式看跌期权的价格计算步骤与看涨期权相

同,不再详述。

125

第 8 章 二叉树(二项式)期权定价模型及其 VBA 实现

本章小结 本章应用递推理论,重点介绍了二项式期权定价模型,编制了二项式期权定价模型计

算期权价格的 VBA 程序,从而为读者进行期权定价计算提供了一个简捷直观的离散计算方

法。

第 9 章 期货套期保值计算的 VBA 实现

本章要点

介绍套期保值的概念和种类。

介绍各类套期保值的计算模型。

编制各类套期保值计算模型的 VBA 程序。

套期保值就是利用远期、期货、期权、互换等金融衍生品的头寸对冲现货头寸来避免

或减小风险。本章主要讨论期货的套期保值策略及其优化模型的计算。

9.1 套期保值的基本概念

9.1.1 套期保值的概念和种类 套期保值就是买进(或卖出)与现货数量相等但交易方向相反的期货合约,以期在未

来某一时间通过平仓获利来抵偿因现货市场价格变动带来的实际价格风险。 套期保值可分为空头套期保值、多头套期保值、直接套期保值和交叉套期保值等。 空头套期保值就是持有空头头寸的套期保值。例如,某公司现有 3 个月后到期的价值

100 万元的大豆期货,目前的大豆价格 2500 元/吨。公司担心在 3 个月后大豆价格会下跌到

2400 元/吨,那么,该公司就可以在期货市场上安排协议价格为 2500 元/吨的总价值 100 万

元的 3 个月期期货空头头寸,即该公司在 3 个月后期货合约到期日按 2500 元/吨的价格出

售这批价值 100 万元的大豆。显然,如果到期日大豆的价格低于 2500 元/吨,公司就会获

利,而如果到期日大豆的价格高于 2500 元/吨,公司就会亏损。 多头套期保值就是持有多头头寸的套期保值。例如,在上例中,公司担心在 3 个月后

大豆价格会上涨到 2600 元/吨,那么,该公司就可以在期货市场上安排协议价格为 2500 元

/吨的总价值 100 万元的 3 个月期期货多头头寸,即该公司在 3 个月后期货合约到期日按

2500 元/吨的价格购买这批价值 100 万元的大豆。显然,如果到期日大豆的价格高于 2500元/吨,公司就会获利,而如果到期日大豆的价格低于 2500 元/吨,公司就会亏损。

直接套期保值就是用相同的资产的期货对某资产的现货进行套期保值。 交叉套期保值就是用不同的资产的期货对某资产的现货进行套期保值。

127

第 9 章 期货套期保值计算的 VBA 实现

9.1.2 套期保值的基差和基差风险

基差是指需要套期保值资产的现货价格与用于套期保值的期货价格之差,即

, ,t T t t TB P F

式中 ,t TB ——期限为 T 的套期保值在时刻 t(t<T)的基差;

tP ——现货在时刻 t 的即期价格; ,t TF ——期限为 T 的期货在时刻 t(t<T)的价格。

基差是套期保值的一个非常重要的概念,它可以用来计算套期保值的利润和套期保值

资产的有效价格。 由于在任意时刻 t(t<T),套期保值的基差的变化具有不确定性,这种不确定性称为基

差风险,它给出了现货风险经套期保值后残留的风险,用基差变动的方差来表示: 2

,var( ) (1 ) var( )t T tB P

式中 ,var( )t TB ——套期保值的基差风险(基差变动的方差); var( )tP ——现货价格风险(现货价格变动的方差);

——现货价格与期货价格变动间的相关系数。

可见,基差的变化要小于现货价格的变化,即基差风险要小于现货价格风险。因此,

进行套期保值可以降低投资的风险水平。当 =1 时,基差风险为零。

9.1.3 套期保值的利润和有效价格

根据套期保值种类的不同,套期保值的利润计算公式如下。 空头套期保值利润:

, 0,t t T Tr B B

多头套期保值利润:

0, ,t T t Tr B B

式中 tr ——套期保值在时刻 t 的利润; 0,TB ——期限为 T 的套期保值在期初(t=0)的基差。

套期保值的有效价格为资产出售或买入的价格加上期货做空头或做多头所获取的利

润,从而套期保值的有效价格计算公式如下。 空头套期保值的有效价格:

0, ,t T t TA F B

多头套期保值的有效价格:

0, ,t T t TA F B

式中 tA ——套期保值在时刻 t 的有效价格; 0,TF ——期限为 T 的期货在期初 t(t=0)的价格。

128

金融财务建模与计算——基于 VBA 与 MATLAB 实现

9.2 套期保值的套头比

9.2.1 套头比的概念及计算方法 1.套头比的概念 套期保值的套头比是指用于进行套期保值的期货头寸与被套期保值的现货头寸之间的

比例。简单地说,就是对一个单位的现货头寸进行套期保值所需的金融衍生产品的头寸数

量。一般情况下,套期保值的目的就是为了使期货头寸和现货头寸合在一起的利润波动的

方差(风险)最小。因此,套头比的一般计算公式为:

/h S F

式中 h——套期保值的套头比; S ——单位资产的现货价格的波动; F ——单位资产的期货价格的波动。

2.直接套期保值套头比的计算 所谓直接套期保值,就是指用于套期保值的期货合约的标的资产与需要套期保值的现

货资产完全一致的套期保值。 对于可储存的商品的期货,包括大多数的金融期货,期货的价格一般等于现货价格加

上全部持有成本,这里持有成本可以是现货的利息成本、仓储成本等。把全部持有成本转

换成年率,并按连续复利计算,则同种资产的期货价格与现货价格之间有如下的关系: ( )

, e y T tt T tF S

式中 ,t TF ——期限为 T 的期货在时刻 t(t<T)的价格;

tS ——资产在时刻 t 的现货价格; y ——全部持有成本转换所得的年率。

分别对上述方程的两边取对数,并对序列{ ,ln( / )t t TS F }关于时间(Tt)进行线性回归,

假设回归方程为:

,ln( ) ( )t

t T

Sa b T t

F

式中 a、b——回归方程的系数。 则直接套期保值套头比为:

( )eb T th

3.交叉套期保值套头比的计算 所谓交叉套期保值,就是指用于套期保值的期货合约的标的资产与需要套期保值的现

货资产不一致的套期保值。 在交叉套期保值的情况下,计算套头比的方法如下。 (1)首先将第二种资产的现货价格序列对第一种资产的现货价格进行线性回归,得到

第二种资产的现货价格序列与第一种资产的现货价格的表达式:

2 1S a bS

129

第 9 章 期货套期保值计算的 VBA 实现

式中 1S ——第一种资产的现货价格; 2S ——第二种资产的现货价格;

a、b ——回归方程的系数。 (2)再采用直接套期保值套头比的计算方法,得出第一种资产的现货价格与期货价格

比的对数与时间的回归方程:

1,

1, ,ln( ) ( )t

t T

Sc d T t

F

式中 1, ,t TF ——第一种资产的期限为 T 的期货在时刻 t(t<T)的价格;

1,tS ——第一种资产在时刻 t 的现货价格; c、d ——回归方程的系数。

(3)按下面的公式计算交叉套期保值的套头比: ( )ed T th b

9.2.2 直接套期保值套头比的计算模型 1.模型设计 首先建立一个名字为“直接套期保值套头比计算模型.xls”的工作簿,在当前的工作表

Sheet1 上设计模型的结构,如图 9-1 所示。

图 9-1 直接套期保值套头比计算模型

模型由下述四部分组成。 (1)已知数据区域。要求用户输入历史数据个数(即历史天数)和期货期限(均以天

为单位)。在单击【准备数据】按钮后,模型对工作表进行格式化,创建一个要求输入现货

和期货历史数据的区域。 (2)命令按钮区域。包括一个【准备数据】按钮、一个【开始计算】按钮和一个【清

除表格】按钮。【准备数据】按钮的功能是在用户输入历史数据个数后,模型自动对工作表

进行格式化,以方便用户输入现货和期货的历史数据。【开始计算】按钮则完成计算功能。

【清除表格】按钮则完成清除数据的功能,使工作表返回到如图 9-1 所示的界面。 (3)计算结果区域。显示模型的计算结果,包括回归模型的斜率和套头比估计值。 (4)中间计算结果区域。当单击【开始计算】按钮后,对现货价格和期货价格之比的

对数和剩余的天数进行计算的中间结果区域。

130

金融财务建模与计算——基于 VBA 与 MATLAB 实现

对【准备数据】按钮指定一个名称为“Sub 准备数据()”的宏,对【开始计算】按钮

指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除表

格()”的宏,并编写如下的程序代码:

Sub 准备数据() Dim n, i As Integer n = Cells(3, 2) Cells(9, 1) = "请输入现货价格和期货价格的历史数据" Cells(9, 1).HorizontalAlignment = xlCenter Range(Cells(9, 1), Cells(9, 3)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(10, 1) = "日期" Cells(10, 2) = "现货价格" Cells(10, 3) = "期货价格" Range(Cells(10, 1), Cells(10, 3)).HorizontalAlignment = xlCenter For i = 1 To n Cells(10 + i, 1) = i Cells(10 + i, 1).HorizontalAlignment = xlCenter Next i Range(Cells(10 + n, 1), Cells(10 + n, 3)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 计算() Dim n, t, i As Integer Dim myrange1, myrange2 As String n = Cells(3, 2) t = Cells(6, 2) Cells(9, 5) = "计算过程" Range(Cells(9, 5), Cells(9, 6)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(10, 5) = "剩余时间" Cells(10, 6) = "对数计算" For i = 1 To n Cells(10 + i, 5) = (Cells(6, 2) - Cells(10 + i, 1)) / 360 Cells(10 + i, 6) = Log(Cells(10 + i, 2) / Cells(10 + i, 3)) Range(Cells(10 + i, 5), Cells(10 + i, 6)).Select Selection.NumberFormat = "0.0000" Selection.HorizontalAlignment = xlCenter Next i myrange1 = "E11:E" & 10 + n myrange2 = "F11:F" & 10 + n Cells(3, 6) = "=slope(" & myrange2 & "," & myrange1 & ")" Cells(4, 6) = "=exp(f3*(b6-b3)/360)"

131

第 9 章 期货套期保值计算的 VBA 实现

Range(Cells(3, 6), Cells(4, 6)).NumberFormat = "0.0000" Range(Cells(10 + n, 5), Cells(10 + n, 6)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 清除表格() Range("b3:b6").ClearContents Range("F3:F6").ClearContents Rows("9:10000").Delete shift:=xlUp End Sub

2.应用实例 例 9-1 已知某资产在过去 20 天内的现货价格和 3 个月到期的期货价格如表 9-1 所示,

现用同种资产的期货对该资产进行套期保值,试确定套期保值的套头比。

表 9-1 某资产的现货价格和期货价格

日 期 1 2 3 4 5 6 7 8 9 10

现货价格 40 39.82 40.17 40.59 40.77 40.99 40.8 40.3 40.03 40.01

期货价格 42 42.04 42.14 42.32 42.45 42.37 42.35 42.54 42.62 42.42

日 期 11 12 13 14 15 16 17 18 19 20

现货价格 40.07 40.19 40.48 40.74 40.52 40.13 40.35 40.27 40.46 40.23

期货价格 42.27 42.34 42.22 42.39 42.42 42.33 42.27 42.23 42.34 42.46

计算过程如下。 (1)在单元格 B3 中输入历史数据个数“20”,在单元格 B6 中输入期货期限“90”。 (2)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 9-2 所示。 (3)在格式化后的工作表中输入资产的现货价格和期货价格的历史数据。 (4)然后单击【开始计算】按钮,即得计算结果,如图 9-3 所示。

图 9-2 格式化后的工作表 图 9-3 模型计算结果

132

金融财务建模与计算——基于 VBA 与 MATLAB 实现

9.2.3 交叉套期保值套头比的计算模型 1.模型设计 首先建立一个名字为“交叉套期保值套头比计算模型.xls”的工作簿,在当前的工作表

Sheet1 上设计模型的结构,如图 9-4 所示。 模型结构与“直接套期保值套头比计算模型.xls”基本相同,只是回归系数有两个。 对【准备数据】按钮指定一个名字为“Sub 准备数据()”的宏,对【开始计算】按钮

指定一个名字为“Sub 计算()”的宏,对【清除表格】按钮指定一个名字为“Sub 清除表

格()”的宏,并编写如下的程序代码:

图 9-4 交叉套期保值套头比计算模型

Sub 准备数据() Dim n, i As Integer n = Cells(3, 2) Cells(9, 1) = "请输入现货价格和期货价格的历史数据" Cells(9, 1).HorizontalAlignment = xlCenter Range(Cells(9, 1), Cells(9, 4)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(10, 1) = "日期" Cells(10, 2) = "第一种现货价格" Cells(10, 3) = "第二种现货价格" Cells(10, 4) = "第一种期货价格" Range(Cells(10, 1), Cells(10, 4)).HorizontalAlignment = xlCenter For i = 1 To n Cells(10 + i, 1) = i Cells(10 + i, 1).HorizontalAlignment = xlCenter Next i Range(Cells(10 + n, 1), Cells(10 + n, 4)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 计算() Dim n, t, i As Integer Dim myrange1, myrange2 As String

133

第 9 章 期货套期保值计算的 VBA 实现

n = Cells(3, 2) t = Cells(6, 2) Cells(9, 5) = "剩余时间" Cells(9, 6) = "对数计算" Range(Cells(9, 5), Cells(9, 6)).Select Selection.HorizontalAlignment = xlCenter With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(10 + i, 5) = (Cells(6, 2) - Cells(10 + i, 1)) / 360 Cells(10 + i, 6) = Log(Cells(10 + i, 2) / Cells(10 + i, 4)) Range(Cells(10 + i, 4), Cells(10 + i, 5)).NumberFormat = "0.0000" Next i myrange1 = "E11:E" & 10 + n myrange2 = "F11:F" & 10 + n myrange3= "C11:C" & 10 + n myrange4 = "B11:B" & 10 + n Cells(3, 6) = "=slope(" & myrange3 & "," & myrange4 & ")" Cells(4, 6) = "=slope(" & myrange2 & "," & myrange1 & ")" Cells(6, 6) = "=exp(f3*(b6-b3)/360)" Range(Cells(4, 6), Cells(6, 6)).NumberFormat = "0.0000" Range(Cells(10 + n, 5), Cells(10 + n, 6)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 清除表格() Range("b3:b6").ClearContents Range("F3:F6").ClearContents Rows("9:10000").Delete shift:=xlUp End Sub

2.应用实例

例 9-2 已知第一种资产在过去 20 天内的现货价格和 3 个月到期的期货价格如表 9-1所示,而第二种资产在过去 20 天内的现货价格如表 9-2 所示,试确定此交叉套期保值

的套头比。

表 9-2 第二种资产的现货价格

日 期 1 2 3 4 5 6 7 8 9 10

现货价格 24 24.54 24.47 24.02 24.16 24.55 24.84 24.89 24.72 24.63

日 期 11 12 13 14 15 16 17 18 19 20

现货价格 24.56 24.6 25.03 25.26 25.55 25.42 25.67 25.32 25.51 25.98

计算过程如下。 (1)在单元格 B3 中输入历史数据个数“20”,在单元格 B6 中输入期货期限“90”。

134

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(2)单击【准备数据】按钮,对工作表进行格式化,格式化后的工作表如图 9-5 所示。 (3)在格式化后的工作表中输入两个资产的现货价格和期货价格的历史数据。 (4)然后单击【开始计算】按钮,即得计算结果,如图 9-6 所示。

图 9-5 格式化后的工作表

图 9-6 模型计算结果

9.3 现货与期货方差和协方差计算模型 在确定最优套期保值策略时,需要知道现货和期货的方差,以及它们之间的协方差。

现货和期货的方差,以及它们之间的协方差可以通过现货价格和期货价格的历史数据进行

135

第 9 章 期货套期保值计算的 VBA 实现

统计分析得到。

1.模型设计 首先建立一个名字为“现货与期货方差和协方差计算模型.xls”的工作簿,在当前的工

作表 Sheet1 上设计模型的结构,如图 9-7 所示。

图 9-7 现货与期货方差和协方差计算模型

模型由下述三部分组成。 (1)已知数据区域。要求用户输入历史数据个数(即历史天数)和期货期限(均以天

为单位)。在单击【准备数据】按钮后,模型对工作表进行格式化,创建一个要求输入现货

和期货历史数据的区域。 (2)命令按钮区域。包括一个【准备数据】按钮、一个【开始计算】按钮和一个【清

除表格】按钮。【准备数据】按钮的功能是在用户输入历史数据个数后,模型自动对工作表

进行格式化,以方便用户输入现货和期货的历史数据。【开始计算】按钮则完成计算功能。

【清除表格】按钮则完成清除数据的功能,使工作表返回到如图 9-7 所示的界面。 (3)计算结果区域。显示模型的计算结果。 对【准备数据】按钮指定一个名称为“Sub 准备数据()”的宏,对【开始计算】按钮指

定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除表格()”的宏,并编写如下的程序代码:

Sub 准备数据() Dim n, i As Integer n = Cells(3, 2) Cells(9, 1) = "请输入现货价格和期货价格的历史数据" Cells(9, 1).HorizontalAlignment = xlCenter Range(Cells(9, 1), Cells(9, 3)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(10, 1) = "日期" Cells(10, 2) = "现货价格" Cells(10, 3) = "期货价格" Range(Cells(10, 1), Cells(10, 3)).HorizontalAlignment = xlCenter For i = 1 To n Cells(10 + i, 1) = i Cells(10 + i, 1).HorizontalAlignment = xlCenter

136

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Next i Range(Cells(10 + n, 1), Cells(10 + n, 3)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 计算() Dim n As Integer Dim myrange1, myrange2 As String n = Cells(3, 2) myrange1 = "B11:B" & 10 + n myrange2 = "C11:C" & 10 + n Cells(3, 6) = "=var(" & myrange1 & ")" Cells(4, 6) = "=var(" & myrange2 & ")" Cells(5, 6) = "=covar(" & myrange1 & "," & myrange2 & ")" Range(Cells(3, 6), Cells(5, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b3").ClearContents Range("F3:F5").ClearContents Rows("9:10000").Delete shift:=xlUp End Sub

2.应用实例 例 9-3 以例 9-1 的数据为例,试计算现货与期货方差,以及它们之间的协方差。 计算步骤如下。 (1)在单元格 B3 中输入历史数据个数“20”。 (2)单击【准备数据】按钮,对工作表进行格式化,然后在格式化后的工作表中输入

资产的现货价格和期货价格的历史数据。 (3)然后单击【开始计算】按钮,即得计算结果,如图 9-8 所示。

图 9-8 模型计算结果

137

第 9 章 期货套期保值计算的 VBA 实现

9.4 不考虑费用的最优套期保值策略模型

9.4.1 最优套期保值利润和方差的计算

最优套期保值策略,就是要确定最优套头比。在下面的内容中,我们仅介绍直接套期

保值,也就是采用同种资产的期货进行套期保值时的最优套期保值策略问题。 最优套期保值策略问题可以调用 Excel 中的规划求解工具 Solver 来求解。

1.空头套期保值的利润和方差 在空头套期保值的情况下,其利润的期望值和方差的计算公式分别如下:

0 , 0,( ) ( )t t T Tr P P h F F 2 2 2 2 2 cov( , )P Fh h P F

式中 r ——空头套期保值的情况下的投资的利润期望值; 2 ——空头套期保值的情况下的投资的方差;

h ——空头套期保值的情况下的套头比; 2P ——现货价格变动的方差; 2F ——期货价格变动的方差;

cov( , )P F ——现货价格变动与期货价格变动之间的协方差。

而最优空头套期保值策略就是确定最优套头比,使套期保值的风险(方差)最小或使

利润最大。

2.多头套期保值的利润和方差 在多头套期保值的情况下,其方差的计算公式与空头情况下相同,而利润的期望值计

算公式如下:

0 , 0,( ) ( )t t T Tr P P h F F

9.4.2 最低风险情况下的最优套期保值策略模型 1.模型设计 建立一个名字为“最低风险情况下的最优套期保值策略模型.xls”的工作簿,在当前的

工作表 Sheet1 上设计模型的结构,如图 9-9 所示。

图 9-9 最低风险情况下的最优套期保值策略模型

138

金融财务建模与计算——基于 VBA 与 MATLAB 实现

在模型中,要求输入的已知数据有现货的期初价格、即期价格、方差;期货的期初价

格、即期价格、方差;现货和期货之间的协方差。 插入一个选择空头套期保值和多头套期保值的下拉列表框控件,该下拉列表框的数据

源区域为“$C$4:$C$5”,单元格链接为“$B$9”,在单元格 C4 和 C5 中分别输入“空头套

期保值”和“多头套期保值”。 计算结果输出值为最优套头比、投资利润和投资方差。 现货和期货的方差及其协方差可以利用前面介绍的“现货与期货方差和协方差计算模

型”进行计算。 插入两个命令按钮控件,名字分别为“开始计算”和“清除表格”。对【开始计算】按

钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除

表格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(9, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b7-b6)" ElseIf Cells(9, 2) = 2 Then Cells(3, 6) = "=(b3-b4)+f2*(b7-b6)" End If Cells(4, 6) = "=b2+f2^2*b5-2*f2*b8" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverSolve (True) Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b2:b9").ClearContents Range("F2:F4").ClearContents End Sub

2.应用实例 例 9-4 以例 9-1 的数据为例,试计算多头套期保值的最优套头比。 现货的方差为 0.0992,期货的方差为 0.0231,它们的协方差为 0.0142,现货的期初价

格为 40 元、即期价格为 40.23 元,期货期初价格为 42 元、即期价格为 42.46 元,现要计算

多头套期保值的最优套头比,即最低风险(方差)下的套头比。 在模型中输入上述已知数据,单击【开始计算】按钮,即得最优套头比为 0.6147,此

时的投资利润为 0.0528 元,投资的最低方差为 0.0905,如图 9-10 所示。

图 9-10 模型计算结果

139

第 9 章 期货套期保值计算的 VBA 实现

9.4.3 给定最低收益情况下的最优套期保值策略模型 在很多情况下,投资者感兴趣的往往是在某种明确目标下的最优套头比。比如,给定

最低目标收益,这就是给定最低收益情况下的最优套期保值策略问题。 在这种情况下,仍可以采用规划求解工具来求解这种最优套期保值策略问题,其模型

的结构、程序代码与“最低风险情况下的最优套期保值策略模型”基本相同,只是在规划

求解的约束条件中增加了一个投资利润大于给定期望利润的约束条件。

1.模型设计 建立一个名字为“给定最低收益情况下的最优套期保值策略模型.xls”的工作簿,其结

构如图 9-11 所示。

图 9-11 最低收益情况下的最优套期保值策略模型

在模型中,要求输入的已知数据有现货的期初价格、即期价格、方差;期货的期初价

格、即期价格、方差;现货和期货之间的协方差;给定的最低利润。 插入一个选择空头套期保值和多头套期保值的下拉列表框控件,该下拉列表框的数据

源区域为“$C$4:$C$5”,单元格链接为“$B$10”,在单元格 C4 和 C5 中分别输入“空头套

期保值”和“多头套期保值”。 插入两个命令按钮控件,名字分别为“开始计算”和“清除表格”。对【开始计算】按

钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除表

格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(10, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b7-b6)" ElseIf Cells(10, 2) = 2 Then Cells(3, 6) = "=(b3-b4)+f2*(b7-b6)" End If Cells(4, 6) = "=b2+f2^2*b5-2*f2*b8" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$f$3", Relation:=3, FormulaText:="$b$9" SolverSolve Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格()

140

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Range("b2:b10").ClearContents Range("F2:F4").ClearContents End Sub

在模型中,规划求解工具 Solver 的调用方式采用了语句“SolverSolve”,而不是语句

“SolverSolve (True)”,主要是为了能够看到在给定的最低利润情况下是否有最优解。

2.应用实例 例 9-5 以例 9-1 的数据为例,若给定的最低利润为 2 元,试计算多头套期保值的最优

套头比。 在模型中输入上述已知数据,单击【开始计算】按

钮,模型即弹出如图 9-12 所示的“规划求解结果”对话

框,显示出是否得到了最优解。然后单击【确定】按钮,

即得最优套头比为 4.8478,此时的投资利润为 2 元,投

资的方差为 0.5044,如图 9-13 所示。可见,为实现 2元的最低目标利润,最优套头比很高,而投资的风险也

显著增大。

图 9-13 模型计算结果

9.4.4 给定最高风险情况下的最优套期保值策略模型

在某些情况下,给定了允许的最高投资风险(方差),这就是给定最高风险情况下的最

优套期保值策略问题。 在这种情况下,仍可以采用规划求解工具来求解这种最优套期保值策略问题,其模型

的结构、程序代码与“最低风险情况下的最优套期保值策略模型”基本相同,只是在规划

求解的约束条件中增加了一个投资风险小于给定最高投资风险的约束条件。

1.模型设计 建立一个名字为“给定最高风险情况下的最优套期保值策略模型.xls”的工作簿,其结

构如图 9-14 所示。 在模型中,要求输入的已知数据有现货的期初价格、即期价格、方差;期货的期初价

格、即期价格、方差;现货和期货之间的协方差;给定的最高风险(方差)。 插入一个选择空头套期保值和多头套期保值的下拉列表框控件,该下拉列表框的数据

图 9-12 “规划求解结果”对话框

141

第 9 章 期货套期保值计算的 VBA 实现

源区域为“$C$4:$C$5”,单元格链接为“$B$10”,在单元格 C4 和 C5 中分别输入“空头套

期保值”和“多头套期保值”。

图 9-14 给定最高风险情况下的最优套期保值策略模型

插入两个命令按钮控件,名字分别为“开始计算”和“清除表格”。对【开始计算】按

钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除

表格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(10, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b7-b6)" ElseIf Cells(10, 2) = 2 Then Cells(3, 6) = "=(b3-b4)+f2*(b7-b6)" End If Cells(4, 6) = "=b2+f2^2*b5-2*f2*b8" SolverReset SolverOk SetCell:="$f$3", MaxMinVal:=1, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$f$4", Relation:=1, FormulaText:="$b$9" SolverSolve Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b2:b10").ClearContents Range("F2:F4").ClearContents End Sub

在模型中,规划求解工具 Solver 的调用方式仍采用了语句“SolverSolve”,而不是语句

“SolverSolve (True)”,目的是为了能够看到在给定的最高风险情况下是否有最优解。

2.应用实例 例 9-6 以例 9-1 的数据为例,若给定的最高风险(方差)为 0.1,试计算多头套期保

值的最优套头比。 在模型中输入上述已知数据,单击【开始计算】按钮,即得在最高风险(方差)为 0.1

的情况下,最优套头比为 1.2570,此时的投资利润为 0.3482 元,如图 9-15 所示。

142

金融财务建模与计算——基于 VBA 与 MATLAB 实现

图 9-15 模型计算结果

9.5 考虑费用的最优套期保值策略模型

9.5.1 考虑费用的最优套期保值利润和方差的计算 尽管交易成本和各种费用只占很小的比例,但它们对最优套期保值套头比是有影响

的。一般情况下,可以将期货市场上的交易成本和现货市场上的交易成本分解成固定

不变的基本费用和随交易量成正比的可变动费用两部分,并以此来计算最优套期保值

套头比。

1.空头套期保值的利润和方差 在考虑费用的空头套期保值的情况下,其利润的期望值和方差的计算公式分别如下:

0 1 0 10 , 0, 0 , 0,( ) ( ) [ ( ) ] [ ( ) ]t t T T S t S F t T T Fr P P h F F C P P C C h F F C

1 1 1 12 2 2 2 2 2(1 ) (1 ) 2 (1 )(1 )cov( , )S P F F S FC h C h C C P F

式中 0SC ——现货市场的交易的基本费用;

1SC ——现货市场的交易的可变费用;

0FC ——期货市场的交易的基本费用;

1FC ——期货市场的交易的可变费用。 其他符号同前。

2.多头套期保值的利润和方差 在考虑费用的多头套期保值的情况下,其方差的计算公式与空头情况下相同,而利润

的期望值计算公式如下:

0 1 0 10 , 0, 0 , 0,( ) ( ) [ ( ) ] [ ( ) ]t t T T S t S F t T T Fr P P h F F C P P C C h F F C

9.5.2 考虑费用的最低风险情况下的最优套期保值模型 1.模型设计 建立一个名字为“考虑费用的最低风险情况下的最优套期保值模型.xls”的工作簿,在

当前的工作表 Sheet1 上设计模型的结构,如图 9-16 所示。

143

第 9 章 期货套期保值计算的 VBA 实现

图 9-16 考虑费用的最低风险情况下的最优套期保值模型

在模型中,要求输入的已知数据有现货的期初价格、即期价格、方差;现货交易的基

本费用和可变费用;期货的期初价格、即期价格、方差;期货交易的基本费用和可变费用;

现货与期货之间的协方差。 插入一个选择空头套期保值和多头套期保值的下拉列表框控件,该下拉列表框的数据

源区域为“$C$5:$C$6”,单元格链接为“$B$13”,在单元格 C5 和 C6 中分别输入“空头套

期保值”和“多头套期保值”。 计算结果输出值为最优套头比、投资利润和投资方差。 现货和期货的方差及其协方差可以利用前面介绍的“现货与期货方差和协方差计算模

型”进行计算。 插入两个命令按钮控件,名字分别为“开始计算”和“清除表格”。对【开始计算】按

钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除

表格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(13, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)

*b11)" ElseIf Cells(13, 2) = 2 Then Cells(3, 6) = "=(b3- b4)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)

*b11)" End If Cells(4, 6) = "=(1-b6)^2*b2+f2^2*(1+b11)^2*b7-2*f2*(1-b6)*(1+B11)*b12" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverSolve (True) Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b2:b12").ClearContents Range("F2:F4").ClearContents End Sub

144

金融财务建模与计算——基于 VBA 与 MATLAB 实现

2.应用实例 例 9-7 已知现货的方差为 0.068,期初价格为 120 元,即期价格为 126.34 元,现货交

易的基本费用为 0.00015 元,可变费用为 0.00002 元,期货的方差为 0.032,期初价格为 130元,即期价格为 133.68 元,期货交易的基本费用为 0.00008 元,可变费用为 0.00003 元;现

货价格与期货价格变化的协方差为 0.026。试计算空头套期保值的最优套头比。 在模型中输入上述已知数据,单击【开始计算】按钮,即得最优套头比为 0.8125,此

时的投资利润为 3.3386 元,投资的最低方差为 0.0469,如图 9-17 所示。

图 9-17 模型计算结果

9.5.3 考虑费用的给定最低收益情况下的最优套期保值模型 1.模型设计 建立一个名字为“考虑费用的给定最低收益情况下的最优套期保值模型.xls”的工作簿,

在当前的工作表 Sheet1 上设计模型的结构,如图 9-18 所示。

图 9-18 考虑费用的给定最低收益情况下的最优套期保值模型

模型的结构与“考虑费用的最低风险情况下的最优套期保值模型”基本相同,但增加

了一个给定的最低利润的单元格。选择空头套期保值和多头套期保值的数据源区域为

“$C$5:$C$6”,单元格链接为“$B$14”。 在模型的程序代码中,规划求解的约束条件中增加了一个投资利润大于给定期望利润

的约束条件。

145

第 9 章 期货套期保值计算的 VBA 实现

插入两个命令按钮控件,名字分别为“开始计算”和“清除表格”。对【开始计算】按

钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除

表格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(14, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)*b11)" ElseIf Cells(14, 2) = 2 Then Cells(3, 6) = "=(b3- b4)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)*b11)" End If Cells(4, 6) = "=(1-b6)^2*b2+f2^2*(1+b11)^2*b7-2*f2*(1-b6)*(1+B11)*b12" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$f$3", Relation:=3, FormulaText:="$b$13" SolverSolve (True) Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b2:b14").ClearContents Range("F2:F4").ClearContents End Sub

2.应用实例 例 9-8 以例 9-7 的数据为例,若投资者要求的最低利润为 5 元,试计算空头套期保值

的最优套头比。 在模型中输入上述已知数据,单击【开始计算】按钮,即得在最低 5 元的投资利润情

况下,最优套头比为 0.3620,此时的投资利润为 5 元,投资的方差为 0.0534,如图 9-19 所

示。由于要求的投资利润提高,从而增大了投资风险。

图 9-19 模型计算结果

9.5.4 考虑费用的给定最高风险情况下的最优套期保值模型 1.模型设计 建立一个名字为“考虑费用的给定最高风险情况下的最优套期保值模型.xls”的工作簿,

146

金融财务建模与计算——基于 VBA 与 MATLAB 实现

在当前的工作表 Sheet1 上设计模型的结构,如图 9-20 所示。

图 9-20 考虑费用的给定最高风险情况下的最优套期保值模型

模型的结构与“考虑费用的最低风险情况下的最优套期保值模型”基本相同,但增加

了一个给定的最高风险的单元格。 在模型的程序代码中,规划求解的约束条件中增加了一个投资风险小于给定最高风险

的约束条件。 对【开始计算】按钮指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定

一个名称为“Sub 清除表格()”的宏,并编写如下的程序代码:

Sub 计算() If Cells(14, 2) = 1 Then Cells(3, 6) = "=(b4-b3)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)*b11)" ElseIf Cells(14, 2) = 2 Then Cells(3, 6) = "=(b3- b4)-f2*(b9-b8)-(b5+(b3+b4)*b6)-(b10+f2*(b8+b9)*b11)" End If Cells(4, 6) = "=(1-b6)^2*b2+f2^2*(1+b11)^2*b7-2*f2*(1-b6)*(1+B11)*b12" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:="$f$2" SolverAdd CellRef:="$f$2", Relation:=3, FormulaText:="0" SolverAdd CellRef:="$f$4", Relation:=1, FormulaText:="$b$13" SolverOk SetCell:="$f$3", MaxMinVal:=1, ValueOf:="0", byChange:="$f$2" SolverSolve (True) Range(Cells(2, 6), Cells(4, 6)).NumberFormat = "0.0000" End Sub Sub 清除表格() Range("b2:b14").ClearContents Range("F2:F4").ClearContents End Sub

2.应用实例 例 9-9 以例 9-7 的数据为例,若投资者要求的最高投资风险(方差)为 0.05,试计算

空头套期保值的最优套头比。 在模型中输入上述已知数据,单击【开始计算】按钮,即得在最高风险(方差)为 0.05

的情况下,最优套头比为 0.4999,此时的投资利润为 4.4912 元,如图 9-21 所示。

147

第 9 章 期货套期保值计算的 VBA 实现

图 9-21 模型计算结果

9.6 多品种情况下的最优套期保值模型 在多品种套期保值的情况下,投资者既可以采取不同品种资产的期货进行套期保值,

也可以采取同一品种资产的期货进行套期保值。本节介绍如何建立多品种现货资产投资组

合的最优套期保值模型。

1.多品种现货资产投资组合的最优套期保值的计算方法 假设投资组合中有 n 个现货资产,每个现货资产在投资组合中所占的比例为 ix ,则投

资组合在套期保值期间的利润和方差分别为: T

Xr X r 2 T X VX

式中 Xr ——投资组合的利润期望值; 2 2 ( )Xr ——投资组合的方差;

X ——各个现货资产投资比例的向量, T1 2( , ,..., )nx x xX ;

r ——各个资产在套期保值期间的利润向量, T1 2( , ,..., )nr r rr ;

V ——各个资产在套期保值后利润值的方差-协方差矩阵。 这样,通过计算投资组合的利润和方差,对其进行优化计算,找出使方差最小的各个

资产的投资比例组合。

2.模型设计 建立一个名字为“多品种现货资产的套期保值优化模型.xls”的工作簿,在当前的工作

表 Sheet1 上设计模型的结构,如图 9-22 所示。 在模型的已知数据区域中,要求用户输入投资组合的资产数目、历史数据个数和期

货期限。 在模型的计算结果区域输出投资组合的利润和方差。此外,最优投资比例将根据投

资组合中资产数目和历史数据的个数不同,而显示在中间计算结果中。

148

金融财务建模与计算——基于 VBA 与 MATLAB 实现

图 9-22 多品种现货资产的套期保值优化模型

命令按钮有三个,名字分别为“准备数据”,“开始计算”和“清除表格”。 对【准备数据】按钮指定一个名称为“Sub 准备数据()”的宏,对【开始计算】按钮

指定一个名称为“Sub 计算()”的宏,对【清除表格】按钮指定一个名称为“Sub 清除表

格()”的宏,并编写如下的程序代码:

Sub 准备数据() Dim n, m, i As Integer m = Cells(3, 2) n = Cells(4, 2) Cells(9, 1) = "请输入各个资产的现货价格和期货价格的历史数据" Cells(9, 1).HorizontalAlignment = xlCenter Range(Cells(9, 1), Cells(9, 2 * m + 1)).Select Selection.Merge With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(10, 1) = "日期" Range(Cells(10, 1), Cells(11, 1)).Merge For i = 1 To m Cells(10, 2 * i) = "资产" & i Range(Cells(10, 2 * i), Cells(10, 2 * i + 1)).Merge Cells(11, 2 * i) = "现货价格" Cells(11, 2 * i + 1) = "期货价格" Next i Range(Cells(10, 1), Cells(11, 2 * m + 1)).HorizontalAlignment = xlCenter For i = 1 To n Cells(11 + i, 1) = i Cells(11 + i, 1).HorizontalAlignment = xlCenter Next i Range(Cells(11 + n, 1), Cells(11 + n, 2 * m + 1)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With End Sub Sub 计算() Dim m, n, t, i, j As Integer Dim myrange1, myrange2, myrange3, myrange4, myrange5, myrange6 As String m = Cells(3, 2) ReDim h(m) As Double

149

第 9 章 期货套期保值计算的 VBA 实现

n = Cells(4, 2) t = Cells(5, 2) Cells(13 + n, 1) = "计算过程" Range(Cells(13 + n, 1), Cells(13 + n, 1 + 3 * m)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With Cells(14 + n, 1) = "剩余时间" Range(Cells(14 + n, 1), Cells(15 + n, 1)).Merge Cells(14 + n, 2) = "对数计算" Range(Cells(14 + n, 2), Cells(14 + n, 1 + m)).Merge For i = 1 To m Cells(15 + n, 1 + i) = "资产" & i Next i Range(Cells(14 + n, 1), Cells(15 + n, 1 + m)).HorizontalAlignment = xlCenter Cells(14 + n, 2 + m) = "回归方程斜率计算" Range(Cells(14 + n, 2 + m), Cells(14 + n, 1 + 2 * m)).Merge For i = 1 To m Cells(15 + n, 1 + m + i) = "资产" & i Next i Range(Cells(14 + n, 2 + m), Cells(15 + n, 1 + 2 * m)).HorizontalAlignment

= xlCenter Cells(17 + n, 2 + m) = "各资产直接套期保值的套头比计算" Range(Cells(17 + n, 2 + m), Cells(17 + n, 1 + 2 * m)).Merge For i = 1 To m Cells(18 + n, 1 + m + i) = "资产" & i Next i Range(Cells(17 + n, 2 + m), Cells(17 + n, 1 + 2 * m)).HorizontalAlignment = xlCenter For i = 1 To n Cells(15 + n + i, 1) = (t - i) / 360 Cells(15 + n + i, 1).NumberFormat = "0.0000" Cells(15 + n + i, 1).HorizontalAlignment = xlCenter For j = 1 To m Cells(15 + n + i, 1 + j) = Log(Cells(11 + i, 2 * j) / Cells(11 + i, 1 + 2 * j)) Cells(15 + n + i, 1 + j).NumberFormat = "0.0000" Next j Next i Range(Cells(15 + 2 * n, 1), Cells(15 + 2 * n, 1 + 3 * m)).Select Selection.HorizontalAlignment = xlCenter With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With myrange1 = "A" & 16 + n & ":A" & 15 + 2 * n For j = 1 To m myrange2 = Chr(65 + j) & 16 + n & ":" & Chr(65 + j) & 15 + 2 * n Cells(16 + n, 1 + m + j) = "=slope(" & myrange2 & "," & myrange1 & ")" Cells(16 + n, 1 + m + j).NumberFormat = "0.0000" Cells(18 + n, 1 + m + j) = "=exp(" & Chr(65 + m + j) & 16 + n & "*(b5-b4)/360)"

150

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Cells(18 + n, 1 + m + j).NumberFormat = "0.0000" h(j) = Cells(18 + n, 1 + m + j) Next j Range(Cells(18 + n, 2 + m), Cells(18 + n, 1 + 2 * m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To n Cells(15 + n + i, 1) = (t - i) / 360 Cells(15 + n + i, 1).NumberFormat = "0.0000" Cells(15 + n + i, 1).HorizontalAlignment = xlCenter For j = 1 To m Cells(15 + n + i, 1 + j) = Log(Cells(11 + i, 2 * j) / Cells(11 + i, 1 + 2 * j)) Cells(15 + n + i, 1 + j).NumberFormat = "0.0000" Next j Next i Cells(14 + n, 2 + 2 * m) = "各资产套期保值后的利润计算" Range(Cells(14 + n, 2 + 2 * m), Cells(14 + n, 1 + 3 * m)).Merge For i = 1 To m Cells(15 + n, 1 + 2 * m + i) = "资产" & i Next i Range(Cells(14 + n, 2 + 2 * m), Cells(15 + n, 1 + 3 * m)).HorizontalAlignment

= xlCenter For i = 1 To n - 1 For j = 1 To m Cells(16 + n + i, 1 + 2 * m + j) = Cells(12 + i, 2 * j) - Cells(12, 2 * j) +

h(j) * (Cells(12 + i, 1 + 2 * j) - Cells(12, 1 + 2 * j)) Cells(16 + n + i, 1 + 2 * m + j).NumberFormat = "0.0000" Next j Next i Cells(16 + 2 * n, 1 + 2 * m) = "各资产套期保值后的利润协方差计算" Range(Cells(16 + 2 * n, 1 + 2 * m), Cells(16 + 2 * n, 1 + 3 * m)).Select Selection.Merge Selection.HorizontalAlignment = xlCenter For i = 1 To m Cells(17 + 2 * n, 1 + 2 * m + i) = "资产" & i Cells(17 + 2 * n + i, 1 + 2 * m) = "资产" & i Next i Range(Cells(17 + 2 * n + m, 1 + 2 * m), Cells(17 + 2 * n + m, 1 + 3 * m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With For i = 1 To m myrange4 = Chr(65 + 2 * m + i)& 17+n & ":"& Chr(65 + 2 * m +i) &15 + 2 * n For j = 1 To m myrange5 = Chr(65 + 2 * m + j) & 17 + n & ":" & Chr(65 + 2 * m + j) &

15 + 2 * n Cells(17 + 2 * n + i, 1 + 2 * m + j) = "=covar(" & myrange4 & "," & myrange5

& ")" Cells(17 + 2 * n + i, 1 + 2 * m + j).NumberFormat = "0.0000" Next j

151

第 9 章 期货套期保值计算的 VBA 实现

Next i Cells(16 + 2 * n, 1) = "最优投资比例" Range(Cells(16 + 2 * n, 1), Cells(16 + 2 * n, 1 + m)).Merge Cells(17 + 2 * n, 1) = "资产" Cells(18 + 2 * n, 1) = "最优投资比例" For i = 1 To m Cells(17 + 2 * n, 1 + i) = "资产" & i Next i Cells(17 + 2 * n, 2 + m) = "合计" Range(Cells(16 + 2 * n, 1), Cells(18 + 2 * n, 2 + m)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium End With myrange3 = "b" & 18 + 2 * n & ":" & Chr(65 + m) & 18 + 2 * n Range(myrange3).NumberFormat = "0.0000" myrange4 = Chr(66 + 2 * m) & 18 + 2 * n & ":" & Chr(65 + 3 * m) & 17 + 2

* n + m myrange5 = Chr(66 + 2 * m) & 15 + 2 * n & ":" & Chr(65 + 3 * m) & 15 + 2 * n myrange6 = Chr(66 + m) & 18 + 2 * n Range(myrange6) = "=sum(" & myrange3 & ")" Cells(3, 6) = "=sumproduct(" & myrange3 & ":" & myrange5 & ")" Cells(4, 6).FormulaArray = "=mmult(" & myrange3 & ",mmult(" & myrange4 & ",

transpose(" & myrange3 & ")))" SolverReset SolverOk SetCell:="$f$4", MaxMinVal:=2, ValueOf:="0", byChange:=myrange3 SolverAdd CellRef:=myrange3, Relation:=3, FormulaText:="0" SolverAdd CellRef:=myrange6, Relation:=2, FormulaText:="100%" SolverSolve Range(myrange3).Select Selection.Interior.ColorIndex = 36 Selection.NumberFormat = "0.00%" End Sub Sub 清除表格() Range("b3:b5").ClearContents Range("F3:F4").ClearContents Rows("9:10000").Delete Shift:=xlUp End Sub

3.应用实例 例 9-10 某投资组合中有 3 个现货资产,它们在过去 20 天内的现货价格和 3 个月到

期的期货价格的历史数据如表 9-3 所示。试计算为使投资组合风险最小的最优投资组合(即

各个资产的最优投资比例为多少),这里套期保值为空头套期保值。

表 9-3 资产的现货价格和期货价格

日 期 资 产 1 资 产 2 资 产 3

现货价格 期货价格 现货价格 期货价格 现货价格 期货价格

1 40.00 42.00 24.00 24.80 57.00 60.50 2 39.82 42.04 24.54 24.93 57.70 60.77 3 40.17 42.14 24.47 25.00 57.81 60.61 4 40.59 42.32 24.02 25.05 58.29 60.53

152

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表

日 期 资 产 1 资 产 2 资 产 3

现货价格 期货价格 现货价格 期货价格 现货价格 期货价格

5 40.77 42.45 24.16 25.23 58.24 60.76 6 40.99 42.37 24.55 25.44 58.45 61.45 7 40.80 42.35 24.84 25.45 58.32 61.84 8 40.30 42.54 24.89 25.27 57.89 61.46 9 40.03 42.62 24.72 25.21 57.53 61.36

10 40.01 42.42 24.63 25.28 57.68 61.88 11 40.07 42.27 24.56 25.26 57.78 61.99 12 40.19 42.34 24.60 25.61 57.54 62.12 13 40.48 42.22 25.03 25.73 57.42 61.79 14 40.74 42.39 25.26 26.06 58.03 61.53 15 40.52 42.42 25.55 26.13 58.63 61.87 16 40.13 42.33 25.42 25.96 58.71 62.05 17 40.35 42.27 25.67 26.13 58.22 61.92 18 40.27 42.23 25.32 25.98 57.89 61.26 19 40.46 42.34 25.51 25.76 58.23 61.89 20 40.23 42.46 25.98 25.80 58.05 62.16

计算步骤如下。 (1)在单元格 B3 输入资产数目“3”,在单元格 B4 输入历史数据个数“20”,在单元

格 B5 输入期货期限“90”。 (2)单击【准备数据】按钮,对工作表进行格式化,然后输入各个资产现货和期货的

历史数据,如图 9-23 所示。

图 9-23 输入历史数据

153

第 9 章 期货套期保值计算的 VBA 实现

(3)单击【开始计算】按钮,则模型自动计算,计算结果如图 9-24 所示。 可见,最优投资组合为:87.07%的资产 1、11.61%的资产 2 和 1.31%的资产 3。

图 9-24 模型计算结果

本章小结 本章介绍了套期保值的概念和种类,应用投资组合的理论与方法,重点讨论了不同类

套期保值的计算模型,编制了各类套期保值计算模型的 VBA 程序,这也是将投资组合理论

应用于期货套期保值的一个成功实例。

第 10 章 投资项目决策与理财模型

的建立及其 VBA 实现 本章要点

建立投资项目组合收益优化模型并编制 VBA 计算程序。

建立投资项目决策模型并编制 VBA 计算程序。

建立个人理财模型并编制 VBA 计算程序。

在第 4 章中,我们解决了在一定期望投资回报水平下使得风险最小的计算问题,本章

将解决在一定风险水平下使得投资回报最大的计算问题。下面通过几个例子来说明投资项

目决策与理财模型的建立及其 VBA 实现。

10.1 投资项目组合收益优化模型的建立及其 VBA 实现 投资组合收益优化问题研究如何选择投资对象。例如,如何选择不同的债券或股票,

在满足某些要求的前提下使得收益最大。因此,其决策变量是对各种可能的投资对象的投

资组合,其目标函数通常是期望回报最大化,而约束条件则可包括总投资额、公司政策、

法律法规等约束。本节讨论在一定风险水平下如何使得投资回报最大化。 例 10-1 某公司投资组合优化问题。 某公司董事会决定将 20 万元用于债券投资。经咨询,现有 5 种债券是比较好的投资对

象,它们是:黄河汽车,长江汽车,华南电器,西南电器,缜山纸业,它们的投资回报率

如表 10-1 所示。为减小风险,董事会要求,对汽车业的投资不得超过 12 万,对电器业的

投资不得超过 8 万,其中对长江汽车业的投资不得超过对汽车业投资的 65%,对纸业的投

资不得低于对汽车业投资的 20%。该公司应如何投资,才能在满足董事会要求的前提下使

得总回报额最大?

表 10-1 5 种债券的投资回报率

债券名称 黄河汽车 长江汽车 华南电器 西南电器 缜山纸业

回 报 率 0.065 0.092 0.045 0.055 0.042

155

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

解:根据题意,本题的决策变量是对 5 种投资对象的投资额,设该公司对 5 种债券的

投资额分别为 X1、X2、X3、X4、X5。 本题的目标是获得最大的债券回报额。债券回报额等于回报率乘以投资额。由表 10-1

可知,5 种债券的回报率分别为 0.065、0.092、0.045、0.055、0.042,所以总回报额应等于

各种债券回报额之和,即:

总回报额=0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5

公司的目标是使得上述总回报额最大,即:

max 0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5

本题的约束条件包括:总投资额约束,以及对汽车业、电器业、长江汽车业、纸业的

投资限制。因此,本题的线性规划模型如下:

o.b. max 0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5 (总投资额最大化) s.t. X1+X2+X3+X4+X5=200 000(总投资额约束)

X1+X2≤120 000 (汽车业投资约束) X3+X4≤80 000 (电器业投资约束) X2≤0.65(X1+X2)(长江汽车业投资约束) X5≥0.20(X1+X2)(纸业投资约束) X1、X2、X3、X4、X5≥0(非负约束)

用 Spreadsheet 可描述本题并建立模型,如表 10-2 所示;其投资决策模型的公式表示

如表 10-3 所示。

表 10-2 某公司投资决策模型 A B D E F G

1 例 某公司投资决策问题

2

3

4 基金名称 投资回报率

5 黄河汽车 0.065 可提供资金(元) 200 000

6 长江汽车 0.092 汽车业最大投资(元) 120 000

7 华南电器 0.045 电器业最大投资(元) 80 000

8 西南电器 0.055 长江汽车占汽车业的投资比例上限 0.65

9 缜山纸业 0.042 纸业占汽车业的投资比例下限 0.2

10

11 模型

12

13 基金名称 投资额(元) 约束条件 左边 右边

14 黄河汽车 42 000 可提供资金 200 000 = 200 000

15 长江汽车 78 000 汽车业 120 000 <= 120 000

16 华南电器 0 电器业 56 000 <= 80 000

17 西南电器 56 000 长江汽车 78 000 <= 78 000

18 缜山纸业 24 000 纸业 24 000 >= 24 000

19

20 总回报额最大化 13 994

156

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 10-3 某公司投资决策模型的公式表示

A B D E F G

1 例 某公司投资决策问题

2

3

4 基金名称 投资回报率

5 黄河汽车 0.065 可提供资金(元) 200 000

6 长江汽车 0.092 汽车业最大投资(元) 120 000

7 华南电器 0.045 电器业最大投资(元) 80 000

8 西南电器 0.055 长江汽车占汽车业的投资比例上限 0.65

9 缜山纸业 0.042 纸业占汽车业的投资比例下限 0.2

10

11 模型

12

13 基金名称 投资额(元) 约束条件 左边 右边

14 黄河汽车 42 000 可提供资金 =SUM(B14:B18) = =F5

15 长江汽车 78 000 汽车业 =SUM(B14:B15) <= =F6

16 华南电器 0 电器业 =SUM(B16:B17) <= =F7

17 西南电器 56 000 长江汽车 =B15 <= =F8*(B14+B15)

18 缜山纸业 24 000 纸业 =B18 >= =F9*(B14+B15)

19

20 总回报额最大化 =SUMPRODUCT(B5:

B9,B14:B18)

用 Excel 中的规划求解功能求出本题的解。“规划求解参数”对话框如图 10-1 所示。

图 10-1 “规划求解参数”对话框

从表 10-2 可得该公司的最优投资组合,如表 10-4 所示。

表 10-4 最优投资组合

债券名称 黄河汽车 长江汽车 华南电器 西南电器 缜山纸业

回报额(元) 42 000 78 000 0 56 000 24 000

这时,满足所有的约束条件,且总回报额最大,达到 13 994 元。

157

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

上面的计算是通过对单元格的操作来实现的,这是很麻烦的,稍不小心,就很容易出

错,为避免出错,我们编制了一个 VBA 程序来简化上述的操作。VBA 程序如下:

Sub js() Cells(14, 5) = "=SUM(B14:B18)" Cells(15, 5) = "=SUM(B14:B15)" Cells(16, 5) = "=SUM(B16:B17)" Cells(17, 5) = "=B15" Cells(18, 5) = "=B18" Cells(14, 7) = "=F5" Cells(15, 7) = "=F6" Cells(16, 7) = "=F7" Cells(17, 7) = "=F8*(B14+B15)" Cells(18, 7) = "=F9*(B14+B15)" Cells(20, 2) = "=SUMPRODUCT(B5:B9,B14:B18)" SolverReset Call SolverOk("$B$20", 1, 0, "$B$14:$B$18") Call SolverOptions(AssumeLinear:=True, AssumeNonNeg:=True) Call SolverAdd("$E$14", 2, "$G$14") Call SolverAdd("$E$15:$E$17", 1, "$G$15:$G$17") Call SolverAdd("$E$18", 3, "$G$18") SolverSolve (True) End Sub

注意: 在调用任何包含 SolverOk( )、SolverAdd( )等函数的宏之前,必须先建立一个对规划

求解的引用,保持 Visual Basic 模块在激活状态,执行【工具】菜单中的【引用】命令,

然后浏览并找到 Solver.xla(这个工具通常放在\Office\Library 目录下)。

10.2 投资项目决策模型的建立及其 VBA 实现 大型公司每年都要面临着复杂的投资项目选择的问题,其中每一个备选项目净现值

大于 0,作为单一项目都可以上马。但在资本供应受到限制的情形下,不可能都上马。财

务经理的任务是在限制的条件下,上马适当的项目以使总的净现值 NPV 最大化。 实际问题中,资本供应的限制可能不止一期,此外备选项目之间的技术或市场关系亦

可能构成一些新的限制,如预备关系、多择一关系和互斥关系等等。项目选择问题可建立

0-1 规划数学模型,大型问题借助于计算机求解。 本节通过实例来讨论 0-1 整数规划在项目投资选择中的应用。

1.公司资本受到限制的投资决策问题及其灵活性处理 例 10-2 某公司的投资决策问题。 某公司是一家工业公司,2005 年它有 6 个备选项目通过了单个项目评估,项目都是大

型项目,投资分两期进行:0 期(2005 年)和 1 期(2006 年)。按照公司的长期财务计划,

这两期的总投资限额分别为 8 亿 5 千万元和 6 亿元,每个项目的净现值已估算完毕(折现

率不尽相同)。另外,由于技术工艺或市场原因,项目 A、B 和 C 为三择一项目,项目 B

158

金融财务建模与计算——基于 VBA 与 MATLAB 实现

为 D 的预备项目,项目 E 和 F 为互斥项目,问该公司应如何选择以使投资总的净现值最大

化?有关数据如表 10-5 所示。

表 10-5 某公司备选项目数据 (单位:百万元)

项 目 投 资 额

净 现 值 0 期 1 期

A 100 100 150

B 180 50 100

C 200 150 260

D 150 180 200

E 160 120 130

F 500 100 280

资本限制 850 600

首先建立上述项目选择问题的数学模型:0-1 规划模型。 项目 A 若被选择上马,令 Ax =1,否则 Ax =0,项目 B、C、D、E、F 依此类推。这样

有 6 个决策变量 Ax 、 Bx 、 Cx 、 Dx 、 Ex 、 Fx ,每一个变量只取两个值 0 或 1。这时总的

上马项目净现值为:

A B F

A B C D E F

NPV NPV(A) NPV(B) ... NPV(F)150 100 260 200 130 280

x x x

x x x x x x

该公司的目标是使 NPV 最大化。

在限制方面,首先是资本供应限制,第 0 期为:

A B C D E F100 180 200 150 160 500 850x x x x x x

第 1 期为:

A B C D E F100 50 150 180 120 100 600x x x x x x

上两式左端和右端分别是第 0 期和第 1 期的资本需求量和供应量(即限制量)。 其次是技术和其他限制。由题知 A、B、C 为三择一项目,即此三项目之中有一个且仅

有一个被选中,于是

Ax + Bx + Cx =1

由于项目 B 为项目 D 的预备项目(或称紧前项目),也就是说若项目 D 上马的话,项

目 B 必亦上马,故

Dx Bx

Dx Bx 0

另外,项目 E 和 F 为互斥项目,即势不两立,故

Ex + Fx 1

总结上述内容,该公司的项目选择问题可化为典型的 0-1 规划问题:

159

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

0.6. max NPV = A B C D E F150 100 260 200 130 280x x x x x x

s.t. A B C D E F100 180 200 150 160 500 850x x x x x x A B C D E F100 50 150 180 120 100 600x x x x x x

Dx Bx 0 Ex + Fx 1 Ax + Bx + Cx =1 Ax 、 Bx 、 Cx 、 Dx 、 Ex 、 Fx =0 或 1

上述问题的计算机求解结果如表 10-6 所示。

表 10-6 计算机求解结果

A B C D E F G H I J K

1

2 例 某公司投资决策问题

3 数据

4 单位:百万元

5 A B C D E F 资本限制

6 第 0 期(净现值) 100 180 200 150 160 500 850

7 第 1 期(净现值) 100 50 150 180 120 100 600

8 净现值 150 100 260 200 130 280

9

10

11

12 模型

13

14 总利润净现值最大化 580 左边 右边

15 830 <= 850

16 330 <= 600

17 A B C D E F 0 <= 0

18 投资决策 0 1 0 1 0 1 1 <= 1

19 1 = 1

其求解步骤如下。 (1)输入已知数据。 与解一般线性规划问题相同,首先在 Excel 的工作表上输入已知数据:在单元格 C6:H7

中输入 6 个项目在各期所需要的投资,在单元格 I6:I7 中分别输入各期可提供的资本,在单

元格 C8:H8 中分别输入 6 个项目的净现值。 (2)建立 0-1 整数规划模型。 在 Spreadsheet 上描述规划问题的决策变量、目标函数与约束条件。 本题的决策变量是对 6 个项目“投资”或“不投资”进行决策,分别用单元格 C18:H18

160

金融财务建模与计算——基于 VBA 与 MATLAB 实现

中的 0-1 变量表示。 本题的目标函数是使总的净现值最大化,用单元格 D14 表示总的净现值,它应等于所

选中项目的净现值之和,即在单元格 D14 中输入下述公式:

=SUMPRODUCT(C8:H8,C18:H18)

本题共有 6 个约束条件。第一个约束条件是资本约束,即各期投资额不得超过资本限

制。第 0 期资本约束条件的左边是第 0 期投资额。用单元格 I15 表示第 0 期的投资额,它

应等于每个项目在第 0 期所需投资与其 0-1 决策变量乘积之和,即在单元格 I15 中输入下

述公式:

=SUMPRODUCT(C6:H6,C18:H18)

在约束条件右边输入可提供资本额。用单元格 K15 表示可提供资本额,并在其中输入

数据 850。 用单元格 I16 表示第 1 期的投资额,在单元格 I16 中输入下述公式:

=SUMPRODUCT(C7:H7,C18:H18)

在约束条件右边输入可提供资本额。用单元格 K16 表示可提供资本额,并在其中输入

数据 600。 在 I17 中输入=F18D18。在单元格 K17 输入数据 0。 在 I18 中输入=G18+H18。在单元格 K18 输入数据 1。 在 I19 中输入=SUM(C18:E18)。在单元格 K19 输入数据 1。 还有一个约束条件是决策变量必须为 0-1 变量,该约束条件在规划求解时输入。我们

在 Excel 规划求解功能中输入 0-1 整数约束并求解。 在“规划求解参数”对话框中输入目标单元格(目标函数地址)、可变单元格(决策变

量地址)和第一个、第二个、第三个、第四个、第五个约束条件。其中第六个约束条件是

0-1 变量约束,只要在约束条件左边输入要求取 0 或 1 的决策变量的单元格地址(本题中为

C18:H18),然后选择“bin”。其“规划求解参数”对话框如图 10-2 所示。

图 10-2 “规划求解参数”对话框

然后单击【选项】按钮,在弹出的对话框中选择“采用线性模型”和“假定非负”,最

后在“规划求解参数”对话框单击【求解】按钮,即可得到本题的最优解。 从表 10-7 中可见,本题的最优解为: Ax =0, Bx =1, Cx =0, Dx =1, Ex =0, Fx =1,

即项目 B、D、F 上马为最优选择,这时三个项目的总净现值为 580 百万元,第 0 期占用资

本 830 百万元,第 1 期占用资本 330 百万元,分别有 20 百万元和 270 百万元的剩余。

161

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

为了提高工作效率,尽可能地减少出错,我们编制了如下程序:

Sub js() Cells(15, 9) = "=SUMPRODUCT(C6:H6,C18:H18)" Cells(16, 9) = "=SUMPRODUCT(C7:H7,C18:H18)" Cells(17, 9) = "=F18-D18" Cells(18, 9) = "=G18+H18" Cells(19, 9) = "=SUM(C18:E18)" Cells(15, 11) = 850 Cells(16, 11) = 600 Cells(17, 11) = 0 Cells(18, 11) = 1 Cells(19, 11) = 1 Cells(14, 4) = "=SUMPRODUCT(C8:H8,C18:H18)" SolverReset Call SolverOk("$D$14", 1, 0, "$C$18:$H$18") Call SolverOptions(AssumeLinear:=True, AssumeNonNeg:=True) Call SolverAdd("$I$15:$I$18", 1, "$K$15:$K$18") Call SolverAdd("$I$19", 2, "$K$19") Call SolverAdd("$C$18:$H$18", 5, "二进制") SolverSolve (True) End Sub

上述问题是假定公司对第 0 期和第 1 期的资本供应都是限制死了的,彼此不能窜换。

如果公司灵活一点,说这两年额度都拨给投资部门了,今年花不完的钱可以明年再花,那

么第 0 期投资的余额:

y= A B C D E F850 (100 180 200 150 160 500 )x x x x x x

可以存入银行,到第 1 期变成:

y(1+r)

其中,r 为年利率,则第 1 期资本供应为:

600+ y(1+r)

这样,上述投资项目选择问题就化为 0-1 混合规划问题:

o.b.max NPV = A B C D E F150 100 260 200 130 280x x x x x x

s.t. A B C D E F100 180 200 150 160 500 850x x x x x x y

A B C D E F100 50 150 180 120 100 600 (1 )x x x x x x y r

Dx Bx 0 Ex + Fx 1 Ax + Bx + Cx =1 Ax 、 Bx 、 Cx 、 Dx 、 Ex 、 Fx =0 或 1

0y ,实数

如果公司进一步允许第 0 期可以借款,突破 850 的限制,但第 1 期必须平账,则上述

模型中 y 可正、可负。

162

金融财务建模与计算——基于 VBA 与 MATLAB 实现

2.项目投资决策选择问题总结 上面例子给出了在财力受到限制时进行投资项目决策的几种方法。然而在完全的资本

市场上,这种限制并不必然发生。在资本结构允许的情况下,多数公司在有合适的项目时,

都应该能筹集到所需要的资本。 许多公司的资本限制是“软限额”,这并不是由于资本市场的不完善,而是基于公司的

投资计划,进行财务控制的需要。 在公司内部,部门经理有时出于自己部门的需要而高估投资的机会,总部往往不细加

考察,而是简单地给各个部门一个投资上限。这种方法的好处之一是可避免偏的现金流预

测给公司带来损失,另一方面,又能避免粗放式发展。 由于这种限制不是由资本市场不完全导致,而只是人为加上的,因此称为“软限额”。 当资本市场不完全时,公司会拥有 NPV 大于 0 的项目,却筹集不到充足的资金,这时

称为“硬限额”。 有时公司从银行借款或发行债券而资金仍不够用,拟发行股票却遭到怕失去控制权的

老股东的反对时,也会遇到硬限额。这时的硬限额并不是由于资本市场不完全导致的。 无论是软限额,还是硬限额,都使决策的财力受到限制,这时都可采取上述介绍的方

法进行投资项目选择。

10.3 个人理财模型的建立及其 VBA 实现 本节讨论的是一个关于个人财务计划如何通过 VBA 来实现的例子。 例 10-3 老李的个人理财计划问题。 老李是一个做事有条理的人。他打算在退休前为他正在读高中的儿子准备一笔教育资

金,以保证儿子四年大学与三年硕士生的学习费用。据估计,四年大学与三年硕士生的学

习费用如表 10-7 所示。

表 10-7 学费表

年 份 第 一 年 第 二 年 第 三 年 第 四 年 第 五 年 第 六 年 第 七 年

费用(万元) 1.3 1.1 1.2 1.3 1.5 1.6 2

经多方调查,老李发现三种债券值得购买。这三种债券的票面价值均为 1000 元,但由

于它们的回报率不同,所以它们的购买价格不同。它们的购买价格、回报率与到期年限如

表 10-8 所示。

表 10-8 债券的购买价格、回报率与到期年限

债 券 购买价格(千元) 回 报 率 到期年限

1 1.05 5% 4

2 1 3% 5

3 1.15 7% 6

同时,老李也考虑在每年的年初将经费存入银行,在下一年年初再全部取出,这时可

得利息 2.0%。老李希望能设计一个理财计划,使得在保证儿子七年学习费用的前提下,所

需投入的教育资金最少。

163

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

解:老李面临的决策包括第一年投入的教育资金和购买的债券数量,以及七年内每年

年初存入银行的资金,这些变量也就是本题的决策变量。 设投入的教育资金为 F,第一年购买三种债券的数量分别为 B1、B2、B3单位(份,每

份 1000 元),每年年初存入银行的资金分别为 S1、S2、S3、S4、S5、S6、S7(千元)。 本题的目标函数是使投入的教育资金 F 最小化(注意 F 既是决策变量,又是目标函数)。 本题的约束条件是在七年内满足各年的学习费用。下面对学习费用逐年进行分析。 第一年的现金流入是投入的教育资金 F,现金流出是购买债券及存入银行的资金。因

此,教育资金 F 扣除购买债券及存入银行的资金后,剩余的资金(即现金流入量与现金流

出量之差,称为净现金流)应等于第一年的学习费用。即:

F1.05 B1B21.15B3 S1=13 (满足第一年学习费用约束)

第二年的现金流入来自债券的回报,以及第一年存款取出后的资金(本息之和);现金

流出量是第二年存入银行的资金。现金流入量与现金流出量之差(净现金流)应等于第二

年的学习费用。即:

0.05B1+0.03B2+0.07B3+1.02S1S2=11(满足第二年学习费用约束)

同理可得第三年与第四年的约束条件分别为:

0.05B1+0.03B2+0.07B3+1.02S2S3=12(满足第三年学习费用约束)

0.05B1+0.03B2+0.07B3+1.02S3S4=13(满足第四年学习费用约束)

第五年的现金收入除了债券回报和第四年存款的本息之外,由于债券 1 已到期,还可

得到债券 1 的本金。这里,债券 1 的本金应等于债券 1 的票面价值乘以债券 1 的购买份数。

因此有:

(1+0.05)B1+0.03B2+0.07B3+1.02S4S5=15(满足第五年学习费用约束)

同理可得第六年与第七年的约束条件分别为:

(1+0.03)B2+0.07B3+1.02S5S6=16(满足第六年学习费用约束)

(1+0.07)B3+1.02S6S7=20(满足第七年学习费用约束)

最后是非负约束:

F、B1、B2、B3、S1、S2、S3、S4、S5、S6、S7≥0(非负约束)

B1、B2、B3只能是整数 综上所述,本题的线性规划模型如下:

o.b. min F s.t F1.05 B1B21.15B3S1=13 0.05B1+0.03B2+0.07B3+1.02S1S2=11 0.05B1+0.03B2+0.07B3+1.02S2S3=12 0.05B1+0.03B2+0.07B3+1.02S3S4=13 (1+0.05)B1+0.03B2+0.07B3+1.02S4S5=15

164

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(1+0.03)B2+0.07B3+1.02S5S6=16 (1+0.07)B3+1.02S6S7=20 F、B1、B2、B3、S1、S2、S3、S4、S5、S6、S7≥0 B1、B2、B3只能是整数

用 Spreadsheet 可描述本题并建立模型。理财计划模型与其计算结果如表 10-9 所示。

表 10-9 理财计划模型与其计算结果

A B C D E F G H I J K

1 例 老李的个人理财计划

2

3

4 年份 年需金额数

(千元)

债券

5 1 13 1 2 3

6 2 11 价格(千元) 1.05 1 1.15

7 3 12 回报率 0.05 0.03 0.07

8 4 13 到期年限 4 5 6

9 5 15

10 6 16 银行存款复利 1.02

11 7 20

12

13

14 模型

15

16 资金 债券 1 债券 2 债券 3 第1年

存款

第 2 年

存款

第 3 年

存款

第4年

存款

第 5 年

存款

第 6 年

存款

第 7年

存款

17 89.60 27.00 0.00 18.00 27.55 19.71 10.72 0.54 15.16 0.73 0.00

18

19 现金流 净现金流 现金需

要量

20 资金最小化 89.60 约束条件 流入 流出

21 (千元) 第 1 年 89.60 76.60 13.00 = 13.00

22 第 2 年 30.71 19.71 11.00 = 11.00

23 第 3 年 22.72 10.72 12.00 = 12.00

24 第 4 年 13.54 0.54 13.00 = 13.00

25 第 5 年 30.16 15.16 15.00 = 15.00

26 第 6 年 16.73 0.73 16.00 = 16.00

27 第 7 年 20.00 0.00 20.00 = 20.00

其模型的计算公式如表 10-10 所示。

165

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

表 10-10 理财计划模型的计算公式

A B C D E F G H I J K

1 例 老李的个人理

财计划

2

3

4 年份 年需金额

数(千元) 债券

5 1 13 1 2 3

6 2 11 价格(千元) 1.05 1 1.15

7 3 12 回报率 0.05 0.03 0.07

8 4 13 到期年限 4 5 6

9 5 15

10 6 16 银行存款复利 1.02

11 7 20

12

13

14 模型

15

16 资金 债券 1 债券 2 债券 3 第 1 年存款 第 2 年存款 第 3 年

存款

第 4 年

存款

第 5 年

存款

第 6年

存款

第 7 年

存款

17 89.60 27.00 0.00 18.00 27.55 19.71 10.72 0.54 15.16 0.73 0.00

18

19 现金流 净 现

金流

现 金

需 要

20 资金最

小化

=A17 约束条件 流入 流出

21 (千元) 第 1 年 =A17 =SUMPRODU

CT(E6:G6,

B17:D17)+E17

=E21

F21

= =B5

22 第 2 年 =SUMPRODU

CT($E$7:$G$7,

$B$17:$D$17)+

$F$10*E17

=F17 =E22

F22

= =B6

23 第 3 年 =SUMPRODU

CT($E$7:$G$7,

$B$17:$D$17)+

$F$10*F17

=G17 =E23

F23

= =B7

24 第 4 年 =SUMPRODU

CT($E$7:$G$7,

$B$17:$D$17)+

$F$10*G17

=H17 =E24

F24

= =B8

166

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 A B C D E F G H I J K

25 第 5 年 =SUMPRODUCT(

$E$7:$G$7,$B$17:

$D$17)+B17+

$F$10*H17

=I17 =E25

F25

= =B9

26 第 6 年 =(1+F7)*C17+

G7*D17+F10*I17

=J17 =E26

F26

= =B10

27 第 7 年 =(1+G7)*D17+

F10*J17

=K17 =E27

F27

= =B11

用 Excel 中的规划求解功能求出本题的解。“规划求解参数”对话框如图 10-3 所示。

图 10-3 “规划求解参数”对话框

从表 10-10 可知,老李的最优理财计划如表 10-11 所示。

表 10-11 老李的最优理财计划

购买债券(单位) 银行存款(千元)

债 券 1 债 券 2 债 券 3 第 一 年 第 二 年 第 三 年 第 四 年 第 五 年 第 六 年 第 七 年

27.00 0.00 18.00 27.55 19.71 10.72 0.54 15.16 0.73 0.00

这时,满足所有的约束条件,且投入的教育资金最少,为 89.60(千元)。 上面的计算过程是通过单元格一个一个来进行计算的,这是相当麻烦的,而且稍不小

心,就很容易出错,为避免出错,我们编制了一个 VBA 程序,简化了上述的操作。VBA程序如下:

Sub js() Cells(21, 5) = "=A17" Cells(22, 5) = "=SUMPRODUCT($E$7:$G$7,$B$17:$D$17)+$F$10*E17" Cells(23, 5) = "=SUMPRODUCT($E$7:$G$7,$B$17:$D$17)+$F$10*F17" Cells(24, 5) = "=SUMPRODUCT($E$7:$G$7,$B$17:$D$17)+$F$10*G17" Cells(25, 5) = "=SUMPRODUCT($E$7:$G$7,$B$17:$D$17)+B17+$F$10*H17" Cells(26, 5) = "=(1+F7)*C17+G7*D17+F10*I17" Cells(27, 5) = "=(1+G7)*D17+F10*J17" Cells(21, 6) = "=SUMPRODUCT(E6:G6,B17:D17)+E17" Cells(22, 6) = "=F17"

167

第 10 章 投资项目决策与理财模型的建立及其 VBA 实现

Cells(23, 6) = "=G17" Cells(24, 6) = "=H17" Cells(25, 6) = "=I17" Cells(26, 6) = "=J17" Cells(27, 6) = "=K17" Cells(21, 7) = "=E21-F21" Cells(22, 7) = "=E22-F22" Cells(23, 7) = "=E23-F23" Cells(24, 7) = "=E24-F24" Cells(25, 7) = "=E25-F25" Cells(26, 7) = "=E26-F26" Cells(27, 7) = "=E27-F27" Cells(21, 9) = "=B5" Cells(22, 9) = "=B6" Cells(23, 9) = "=B7" Cells(24, 9) = "=B8" Cells(25, 9) = "=B9" Cells(26, 9) = "=B10" Cells(27, 9) = "=B11" Cells(20, 2) = "=A17" SolverReset Call SolverOptions(AssumeLinear:=True, AssumeNonNeg:=True) Call SolverOk("$B$20", 2, 0, "$A$17:$K$17") Call SolverAdd("$G$21:$G$27", 2, "$I$21:$I$27") Call SolverAdd("$b$17:$d$17", 4, "整数") SolverSolve (True) End Sub

该程序的计算结果如表 10-11 所示。

注意: 在调用任何包含 SolverOk( )、SolverAdd( )等函数的宏之前,必须先建立一个对规划

求解的引用,保持 Visual Basic 模块在激活状态,执行【工具】菜单中的【引用】命令,

然后浏览并找到 Solver.xla(这个工具通常放在\Office\Library 目录下)。

本章小结 本章应用项目投资的净现值理论,重点建立了投资项目组合收益优化模型并编制了

VBA 计算程序,以及投资项目决策模型并编制了 VBA 计算程序,同时还建立一个完整的

个人理财模型并编制了 VBA 计算程序,为项目投资者快速进行项目投资提供了很好的例子。

第 11 章 固定收益证券计算

的 MATLAB 实现 本章要点

久期的 MATLAB 计算。

凸度的 MATLAB 计算。

利率期限结构的 MATLAB 计算。

债券的久期、凸度和利率期限结构是固定收益证券中三个最重要的度量。因此,本章

主要介绍这三个度量的 MATLAB 计算。

11.1 久期计算的 MATLAB 实现 久期是金融学中的一个重要概念,它直接衡量了价格对收益率变化的敏感度。麦考利

久期 MD 的计算公式是: d 1MDdP r

r P

MATLAB 中计算久期的函数是 cfdur,计算公式如下:

1 1 2 2 1 1 2 2

1 2

PV( ) PV( ) ... PV( ) PV( ) PV( ) ... PV( )PV( ) PV( ) ... PV( ) PV

n n n n

n

t t t t t t t t t t t tD

t t t

式中, 1 2PV PV( ) PV( ) ... PV( )nt t t , PV( )it 表示 ti 时期的现值。 通常使用的是修正久期,修正久期是在收益率改变而债券的预期现金流不变的情况下,

收益率变化 1%时债券价格变化的百分比。修正久期的计算公式如下:

1 /k

考利久期

修正久期券到期收益率

式中,k 为每年支付利息的次数。

麦考利久期

1+债券到期收益率/k

169

第 11 章 固定收益证券计算的 MATLAB 实现

调用方式: [Duration,ModDuration]=cfdur(CashFlow,Rate) 输入参数: CashFlow %各期现金流 Rate %贴现率 输出参数: Duration %久期 ModDuration %修正久期

例 11-1 某项投资各期的现金流如表 11-1 所示。

表 11-1 现金流数据

第 1 期 第 2 期 第 3 期 第 4 期 第 5 期

1000 2000 3000 4000 5000

贴现率为 0.025,问该项投资久期是多少? 创建计算久期的 M 文件,存于 dura.m 中的内容如下:

cashflow=[1000 2000 3000 4000 5000]; [duration,modduration]=cfdur(cashflow,0.025)

在 MATLAB 状态下运行M 文件dura(按【F5】键或在命令状态下输入dura)得到如下结果:

>> dura duration = 3.6279 modduration = 3.5394

从上面可以看出,久期是 3.6279,修正久期是 3.5394。

11.2 凸度计算的 MATLAB 实现 久期本质上是价值曲线在当前利率和债券价格点的斜率,凸度则是斜率的变化量。债券

价格 P 随利率 r 的变化而变化,习惯上可以把债券价格视为利率函数,利用泰勒展开得到: 2

22

d 1 d ( )d 2 dP P

P r rr r

(11-1)

式(11-1)两边同时除以价格 P,则上式变为: 2

2 2

dd1d d ( )2

PPP r rr r

P P P

(11-2)

这样我们定义凸度 C 如下: 2

2dd

P

rCP

(11-3)

170

金融财务建模与计算——基于 VBA 与 MATLAB 实现

则式(11-2)左边为债券价格的变化率,右边关于 r 的一次项与二次项系数分别是久

期与凸度,所以式(11-2)可理解为:

债券价格变化=久期债券价格债券收益率的变化+ 12凸度债券价格债券收益率的变化 2

下面根据现金流贴现公式推导出债券凸度。设债券将来各期的现金流分别为

1 2, ,..., TC C C ,相应的时间为 1 2, ,..., Tt t t ,债券贴现率为 r,由现值公式得出债券价格表达式

为:

1 (1 )

Ttt

tt t

CP

r

债券凸度为:

1

2

2 21 d 1 [ (1 ) ]

d (1 ) (1 )

Ttt

tt t

P CC t t

P r P r r

可以证明麦考利久期与凸度之间的关系为:

21 [ MD(MD 1)]

(1 )C S

r

其中,1

(1 ) ( MD)T tt

t

t t

C rS t

P

,MD 是麦考利久期,S 衡量现金流的集中程度。当久期

给定时,现金流越集中,债券凸度越大;现金流越分散,债券凸度越小。 债券投资组合的凸度是每个资产凸度的线性组合。设有 N 种债券,第 i 种债券的投资

比例为 ix ,凸度为 iC ,则组合凸度 pC 为:

1

N

p i ii

C x C

MATLAB 中计算凸度的函数有很多种,其中计算现金流凸度的函数为 cfconv。 调用方式: Convexity=cfconv(CashFlow,Yield) 输入参数: CashFlow %各期现金流 Yield %收益率 输出参数: Convexity %凸度

例 11-2 某金融产品面值为 100 元,现金流为连续 9 年支付 2.5 元,第 10 年还本付息,

求该现金流凸度。 创建计算凸度的 M 文件,存于 conv.m 中的内容如下:

cashflow=[2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 102.5];

171

第 11 章 固定收益证券计算的 MATLAB 实现

convex=cfconv(cashflow,0.025)

在 MATLAB 状态下运行 M 文件 conv 得到如下结果:

>> conv convex = 90.4493

该现金流凸度为 90.4493。

11.3 利率期限结构的 MATLAB 实现 利率期限结构可以为债券定价,利率期限结构确定了各到期日货币的价格,可以为市

场上发行的新金融工具寻找合适的价格。 利率期限结构是未来利率水平的重要指标,代表着市场未来的利率预期,投资者通过

利率期限曲线形状推测未来利率走势。债券投资者、基金经理、企业财务人员都会认真研

究利率期限结构;中央银行、财政部也需要解读利率期限结构,结合通货膨胀率等其他信

息来制定国家利率政策。 利率期限结构主要讨论金融资产到期时收益与到期期限之间的关系。假设某一投资者

打算进行 N 年长期投资,他可以有两种选择,一种是购买 N 年底到期的长期债券,并且持

有到期满为止,另外一种是先持有 1 年期债券,到期后再购买 1 年债券,如此不断直到 N

年期满为止。

1.已知债券收益率计算利率期限结构 MATLAB 采用步步为营的方法计算利率期限结构,如计算 3 年期利率期限结构,假设

平价收益率如表 11-2 所示。

表 11-2 平价收益率

年 0.5 1.0 1.5 2.0 2.5 3.0

到期收益率(%) 4.0 4.2 4.6 5.6 5.8 7.0

一年以内债券采用折价销售,一年以上债券每半年支付一次利息,面值为 100 美元,

债券票面利率就是到期收益率。 由于一年以内(含一年)的国债属于零息券,因此年收益率等于即期收益率,下面给

出 0.5~1.5 年的国债现金流。 0.5 年: 0.046 100 0.5 2.3 1.0 年: 0.046 100 0.5 2.3 1.5 年: 0.046 100 0.5 100 102.3 其现金流现值为:

1 2 32 3

2.3 2.3 102.3

(1 ) (1 ) (1 )2 2 2r r r

式中, 1r 为第 0.5 年即期利率, 2r 为第 1.0 年即期利率, 3r 为第 1.5 年即期利率。 由于一年内的债券为零息券,所以 1r =0.04, 2r =0.042,根据现金流等于面值得下列方程:

172

金融财务建模与计算——基于 VBA 与 MATLAB 实现

32 3

2.3 2.3 102.3 1000.04 0.042(1 ) (1 ) (1 )

2 2 2r

求解得 3r =0.0462。 有了 3r 就可以求解 2 年的即期利率。 0.5~2 年的国债现金流如下。 0.5 年: 0.056 100 0.5 2.8 1.0 年: 0.056 100 0.5 2.8 1.5 年: 0.056 100 0.5 2.8 2.0 年: 0.056 100 0.5 100 102.8 其现金流现值为:

1 2 3 42 3 4

2.8 2.8 2.8 102.8

(1 ) (1 ) (1 ) (1 )2 2 2 2r r r r

根据现金流等于面值可得下列方程:

1 2 3 42 3 4

2.8 2.8 2.8 102.8 100(1 ) (1 ) (1 ) (1 )

2 2 2 2r r r r

1r , 2r , 3r 都是已知的,根据上面的方程可求解得 4r =0.0566。依此类推可以计算出各

时点上的即期利率,具体如表 11-3 所示。

表 11-3 各时点上的即期利率

年 0.5 1.0 1.5 2.0 2.5 3.0

到期收益率(%) 4.0 4.2 4.62 5.66 5.86 7.18

在 MATLAB 中计算利率期限结构的函数为 zbtyield。 调用方式: [ZeroRates,CurveDate]=zbtyield(Bonds,Yield,Settle,Compounding) 输入参数: Bonds %息票的时间、利率、面值 Yield %债券息票的收益率 Settle %结算日期 Compounding %复利的计算方式 Compounding 参数如表 11-4 所示。

表 11-4 Compounding 参数

Compounding 1 2 3 4 6 12 1

利息支付方式 每年支付一次 每半年支付 每 4 个月支付 每季度支付 每两个月支付 每个月支付 复利

输出参数: ZeroRates %期限结构上日期对应的利率

173

第 11 章 固定收益证券计算的 MATLAB 实现

CurveDate %期限结构的日期 例 11-3 已知国债面值是 100 美元,各期收益率如表 11-5 所示,表中的当前收益=票

息/市场价格。

表 11-5 各期收益率

国债品种 票 息 到 期 日 当前收益

3 个月 04/17/2003 0.0115

6 个月 07/17/2003 0.0118

2 年 0.0175 12/31/2004 0.0168

5 年 0.03 11/15/2007 0.0297

10 年 0.04 11/15/2012 0.0401

30 年 0.05375 02/15/2031 0.0492

下面分析由上述品种构成的利率期限结构,M 文件名为 qxjg.m 中的代码如下:

bonds=[datenum('04/17/2003') 0 100; datenum('07/17/2003') 0 100; datenum('12/31/2004') 0.0175 100; datenum('11/15/2007') 0.03 100; datenum('11/15/2012') 0.04 100; datenum('02/15/2031') 0.05375 100]; yields=[0.0115; 0.0118; 0.0168; 0.0297; 0.0401; 0.0492]; settle=datenum('17-Jan-2003'); [zerorates,curvedates]=zbtyield(bonds,yields,settle) datestr(curvedates)

在>>状态下输入 qxjg:

>> qxjg

得到下列结果:

zerorates = 0.0115 0.0118 0.0168 0.0302 0.0418 0.0550 curvedates = 731688 731779 732312 733361 735188 741854

174

金融财务建模与计算——基于 VBA 与 MATLAB 实现

ans = 17-Apr-2003 17-Jul-2003 31-Dec-2004 15-Nov-2007 15-Nov-2012 15-Feb-2031

利率期限结构如表 11-6 所示。

表 11-6 利率期限结构

到 期 日 当前收益

04/17/2003 0.0115

07/17/2003 0.0118

12/31/2004 0.0168

11/15/2007 0.0302

11/15/2012 0.0418

02/15/2031 0.0550

进一步画出利率期限结构示意图,代码如下:

>> plot(zerorates)

得到的利率期限结构示意图如图 11-1 所示。

图 11-1 利率期限结构示意图

2.给定债券价格求其收益率 在 MATLAB 中给定债券价格,求其收益率的函数为 zbtprice。 调用方式: [ZeroRates,CurveDates]=zbtprice(Bonds,Price,Settle,OutputCompounding) 输入参数: Bonds %为一个向量,分别为起始日、利率、面值、期间、日计算方

175

第 11 章 固定收益证券计算的 MATLAB 实现

式、月末法则 Price %债券的当前价格 Settle %结算日期 OutputCompounding %利息的支付方式 OutputCompounding 参数如表 11-7 所示。

表 11-7 OutputCompounding 参数

OutputCompounding 1 2 3 4 6 12 1

利息支付方式 每年支付一次 每半年支付 每 4 个月支付 每季度支付 每两个月支付 每个月支付 复利

输出参数: ZeroRates %期限结构上日期对应的利率 CurveDate %期限结构的日期 例 11-4 给定债券的起始日、利率、面值、期间、日计算方式、月末法则和价格,如

Bonds 和 Price 中的值,债券结算日为 12/18/1997,利率按半年复利计算,求利率期限结构。 M 文件名为 jgqx.m 中的代码如下:

bonds=[datenum('6/1/1998') 0.0475 100 2 0 0; datenum('7/1/2000') 0.06 100 2 0 0; datenum('7/1/2000') 0.09375 100 6 1 0; datenum('6/30/2001') 0.05125 100 1 3 1; datenum('4/15/2002') 0.07125 100 4 1 0; datenum('1/15/2000') 0.065 100 2 0 0; datenum('9/1/1999') 0.08 100 3 3 0; datenum('4/30/2001') 0.05875 100 2 0 0; datenum('11/15/1999') 0.07125 100 2 0 0; datenum('6/30/2000') 0.070 100 2 3 1; datenum('7/1/2001') 0.0525 100 2 3 0; datenum('4/30/2002') 0.070 100 2 0 0]; %把结果保存在 price中。 price=[99.375; 99.875; 105.75; 96.875; 103.625; 101.125; 103.125; 99.375; 101.0; 101.25; 96.375; 102.75]; settle=datenum('12/18/1997'); outputcompounding=2; [ZeroRates,CurveDates]=zbtprice(bonds,price,settle,outputcompounding)

在>>状态下输入 jgqx:

>> jgqx

176

金融财务建模与计算——基于 VBA 与 MATLAB 实现

得到下列结果:

ZeroRates = 0.0616 0.0609 0.0658 0.0590 0.0648 0.0655 0.0606 0.0601 0.0642 0.0621 0.0627 CurveDates = 729907 730364 730439 730500 730667 730668 730971 731032 731033 731321 731336

本章小结 本章应用固定收益证券的理论和方法,重点介绍了久期的 MATLAB 计算方法,凸度的

MATLAB 计算方法,以及利率期限结构的 MATLAB 计算方法,这为读者日后研究固定收

益证券提供了很好的工具和手段。

第 12 章 投资组合计算的 MATLAB 实现

本章要点

投资组合收益与风险计算的 MATLAB 实现。

投资组合有效前沿(边界)计算的 MATLAB 实现。

投资组合收益最大计算的 MATLAB 实现。

投资组合风险最小计算的 MATLAB 实现。

投资组合的风险价值计算的 MATLAB 实现。

投资组合是研究如何配置各种不同的金融资产,实现资产组合的最佳投资配置。在前

面的章节中,介绍了如何使用 VBA 工具实现投资组合的计算,本章介绍如何使用 MATLAB工具来实现投资组合的计算。我们将会看到,使用 MATLAB 工具计算投资组合等问题比使

用 VBA 工具要简单。

12.1 将价格序列转换为收益率序列的 MATLAB 实现 MATLAB 中将价格序列转换为收益率序列的函数是 tick2ret。 调用方式: [RetSeries,RetIntervals]=tick2ret(TickSeries,TickTimes,Method) 输入参数: TickSeries %价格序列 TickTimes %价格序列对应的时间 Method %计算收益率的方法,取值为“Simple”时计算方法为算术收益率,

取值为“Continuous”时计算方法为对数收益率。 输出参数: RetSeries %收益率序列 RetIntervals %收益率时间间隔 例 12-1 已知股票的价格时间序列如表 12-1 所示。

178

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 12-1 股票的价格时间序列

时 间 0 6 9 12

价 格 100 110 115 110

求出该股票的收益率时间序列。 计算该股票的收益率时间序列的 M 文件 jssy.m 的代码如下:

TickSeries=[100;110;115;110]; TickTimes=[0;6;9;12]; [RetSeries,RetIntervals]=tick2ret(TickSeries,TickTimes)

在>>状态下输入 jssy:

>> jssy

得到下列结果:

RetSeries = 0.1000 0.0455 -0.0435 RetIntervals = 6 3 3

计算时间间隔和收益率的结果如表 12-2 所示。

表 12-2 计算时间间隔和收益率的结果

计算时间间隔 6 3 3

收 益 率 0.1000 0.0455 0.0435

12.2 协方差矩阵与相关系数矩阵之间转换的 MATLAB 实现 MATLAB 中的 corr2cov 函数可以把相关系数矩阵转换为协方差矩阵。 调用方式: Covariances=corr2cov(STDs,Correlations) 输入参数: STDs %标准差矩阵 Correlations %相关系数矩阵 输出参数: Covariances %协方差矩阵 例 12-2 已知投资组合中有 3 个品种,每个品种的资产收益率、标准差和相关系数矩

阵如表 12-3 所示。

179

第 12 章 投资组合计算的 MATLAB 实现

表 12-3 各品种的资产收益率、标准差和相关系数矩阵

资 产 A 资 产 B 资 产 C

收 益 率 0.1 0.15 0.12

相关系数矩阵

资 产 A 1 0.8 0.4

资 产 B 0.8 1 0.3

资 产 C 0.4 0.3 1

标 准 差 0.2 0.25 0.18

求出该投资组合的协方差矩阵。 计算该投资组合的协方差矩阵的 M 文件 covar.m 的代码如下:

returns=[0.1 0.15 0.12]; stds=[0.2 0.25 0.18]; correlations=[1 0.8 0.4 0.8 1 0.3 0.4 0.3 1]; Covariances=corr2cov(STDs,Correlations)

在>>状态下输入 covar:

>> covar

得到下列结果:

covariances = 0.0400 0.0400 0.0144 0.0400 0.0625 0.0135 0.0144 0.0135 0.0324

12.3 投资组合收益与风险计算的 MATLAB 实现 MATLAB 中计算投资组合收益与风险的函数是 portstats。 调用方式: [PortRisk,PortReturn]=portstats(ExpReturn,ExpCovariance,PortWts) 输入参数: ExpReturn %期望收益向量 ExpCovariance %投资组合的协方差矩阵 PortWts %投资组合中各资产的权重 输出参数: PortRisk %投资组合的标准差 PortReturn %投资组合的收益率 例 12-3 已知投资组合中有 3 个资产 A、B、C,投资组合中各个资产的预期收益率分

别为 0.1、0.2、0.15,权重分别为 0.4、0.2、0.4,具体如表 12-4 所示。

180

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 12-4 各个资产的预期收益率、权重和协方差矩阵

资 产 A 资 产 B 资 产 C

预期收益率 0.1 0.2 0.15

协方差矩阵

资 产 A 0.0010 0.0061 0.0042

资 产 B 0.0061 0.0400 0.0252

资 产 C 0.0042 0.0252 0.0225

投资组合中各资产的权重 0.4 0.2 0.4

求出该投资组合的收益和风险。 计算该投资组合的收益和风险的 M 文件 portrr.m 的代码如下:

ExpReturn=[0.1 0.2 0.15]; ExpCovariance=[0.0010 -0.0061 0.0042 -0.0061 0.0400 -0.0252 0.0042 -0.0252 0.0225]; PortWts=[0.4 0.2 0.4]; [PortRisk,PortReturn]=portstats(ExpReturn,ExpCovariance,PortWts)

在 MATLAB 状态下输入 portrr,得到下列结果:

>> portrr PortRisk = 0.0412 PortReturn = 0.1400

从上述结果可以看到,此投资组合的风险是 0.0412,投资组合的收益率是 0.14。

12.4 投资组合有效前沿(边界)计算的 MATLAB 实现 由于证券市场投资存在巨大风险,一般不主张把投资集中在一种资产上。运用投资组

合理论可以有效地降低风险,其核心思想是在期望收益率给定的条件下,要求投资组合的

风险最小。投资组合的均值-方差模型是: 2 Tmin i j ijx x x Vx

s.t. T( ) ( ) ( ); 1X i i iE r E r x E r x x

其中,V 是协方差矩阵 ( )ijV , ir 表示第 i 种资产的收益率, ix 表示第 i 种资产在投资组

合中所占权重。 MATLAB 工具箱中包含了投资组合均值-方差的有效前沿函数,这些函数都基于

MATLAB 中的最优化理论工具箱。 马柯维茨的投资组合理论就是寻找一个有效组合,所谓有效组合是指在同样风险水平

下具有最高收益率,这样不同收益率与最小风险构成有效前沿。 在不允许卖空情况下,求解有效组合的目标函数为:

2 T1min2 i j ijx x x Vx

181

第 12 章 投资组合计算的 MATLAB 实现

s.t. T( ) ( ) ( ); 1, 0X i i i iE r E r x E r x x x

这是一个约束条件为线性且含有不等式的二次规划方程,给定一个投资组合收益率就

有一个最小方差,组合收益率与最小方差就构成了有效前沿。 MATLAB 中计算均值-方差有效前沿的函数为 frontcon。 调用方式: [Portrisk,Portreturn,Portwts]=frontcon(Expreturn,Expcovariance,Numports,Portreturn,Assetbounds,

Groups,Groupbounds) 输入参数: Expreturn %投资组合中每项资产的预期回报率,为一列向量 Expcovariance %各种资产之间的协方差矩阵,为对称矩阵 Numports %(可选)在投资组合有效前沿上的点的个数,默认值是 10 个点 Portreturn %(可选)在有效前沿上每个点的回报率 Assetbounds %(可选)每种资产权重的上限、下限区间 Groups %(可选)如果 G(i,j)=1 表示第 i 个资产属于第 j 个群,则 G(i,j)=0 表

示第 i 个资产不属于第 j 个群 Groupbounds %(可选)每种群权重的约束区间,默认值规定下限为 0,上限为 1 输出参数: Portrisk %投资组合的标准差 Portreturn %投资组合的回报率 Portwts %投资组合中每种资产的权重 例 12-4 考虑三种资产的投资组合,分别为资产 1、资产 2 与资产 3,其预期收益率

分别为 0.2、0.1、0.15,资产协方差矩阵如表 12-5 所示,求该投资组合的有效前沿。

表 12-5 资产协方差矩阵

资 产 1 资 产 2 资 产 3

资 产 1 0.01 0.0061 0.0042

资 产 2 0.0061 0.04 0.0252

资 产 3 0.0042 0.0252 0.0225

建立一个名为 yxqy.m 的 M 文件,代码如下:

expreturn=[0.1 0.2 0.15]; expcovariance=[0.0100 -0.0061 0.0042 -0.0061 0.0400 -0.0252 0.0042 -0.0252 0.0225]; numports=4; [portrisk,portreturn,portwts]=frontcon(expreturn,expcovariance,numports)

在 MATLAB 状态下输入 yxqy,得到下列结果:

portrisk = 0.0426 0.0483 0.1089

182

金融财务建模与计算——基于 VBA 与 MATLAB 实现

0.2000 portreturn = 0.1569 0.1713 0.1856 0.2000 portwts = 0.2134 0.3518 0.4348 0.0096 0.4352 0.5552 0 0.7128 0.2872 0 1.0000 0

12.5 带约束条件的投资组合有效前沿(边界)计算的 MATLAB实现

投资组合问题一般是在多种约束条件下进行的,比如证券委为了控制风险,对投资组

合中每种资产的比例加以种种限制,这时就需要考虑多种约束条件下的最优组合问题。 MATLAB 利用均值-方差理论求解投资组合问题,首先是将约束条件写成矩阵形式,

比如 或 Ax b Ax b 。 MATLAB 中计算带约束的投资组合有效前沿的函数为 portopt。 调用方式: [Portrisk,Portreturn,Portwts]=portopt(Expreturn,Expcovariance,Numports,Portreturn,Conset) 输入参数: Expreturn %资产预期回报率 Expcovariance %资产之间的协方差矩阵 Numports %(可选)投资组合中资产的个数 Portreturn %(可选)要求投资组合的回报率 Conset %(可选)约束条件 输出参数: Portrisk %投资组合的风险 Portreturn %投资组合的回报率 Portwts %投资组合中各资产的权重 例 12-5 设有两种资产的投资组合,其预期回报分别为 0.1、0.3,资产协方差矩阵如

表 12-6 所示。约束条件如下:

1 2 1x x ; 10 0.2x ; 2 0.3x

表 12-6 资产协方差矩阵

资 产 1 资 产 2

资 产 1 0.02 0

资 产 2 0 0.04

求该投资组合的有效前沿。

183

第 12 章 投资组合计算的 MATLAB 实现

上述约束条件可转化为如下形式:

1 2 1x x 1 0.2x

1 0x 2 0.3x

则得到矩阵为:

[1 1 1; 1 0 0.2; -1 0 0; 0 -1 -0.3]

建立一个名为 tjyxqy.m 的 M 文件,代码如下:

expreturn=[0.1 0.3]; expcovariance=[0.02 0;0 0.04]; conset=[1 1 1;1 0 0.2;-1 0 0;0 -1 -0.3]; %约束矩阵 portopt (expreturn,expcovariance,[],[],conset);

在 MATLAB 状态下输入 tjyxqy,得到如图 12-1 所示的结果。

0.06 0.08 0.1 0.12 0.14 0.16 0.18 0.20.05

0.1

0.15

0.2

0.25

0.3Mean-Variance-Efficient Frontier

Risk(Standard Deviation)

Exp

ecte

d R

etur

n

图 12-1 均值-方差的有效前沿(边界)

例 12-6 各资产的相关系数矩阵、预期回报率和标准差如表 12-7 所示。

表 12-7 各资产的相关系数矩阵、预期回报率和标准差

资 产 A 资 产 B 资 产 C

相关系数矩阵

资 产 A 1 0.8 0.4

资 产 B 0.8 1 0.3

资 产 C 0.4 0.3 1

预期回报率 0.1 0.15 0.20

标 准 差 0.2 0.25 0.18

Exp

ecte

d R

etur

n

184

金融财务建模与计算——基于 VBA 与 MATLAB 实现

求该投资组合的有效前沿。 建立一个名为 yxqyyfs.m 的 M 文件,代码如下:

returns=[0.1 0.15 0.12]; stds=[0.2 0.25 0.18]; correlations=[1 0.8 0.4 0.8 1 0.3 0.4 0.3 1]; covariances=corr2cov(stds,correlations); %相关系数矩阵转换为协方差矩阵 portopt(returns,covariances,20); %绘出投资组合的有效前沿 rand('state',0); weights=rand(1000,3); %产生 1000行 3列随机数 total=sum(weights,2); %对 weights的数据沿对列求和 weights(:,1)=weights(:,1)./total; weights(:,2)=weights(:,2)./total; weights(:,3)=weights(:,3)./total; %这时 weights变成了权重矩阵 [portrisk,portreturn]=portstats(returns,covariances,weights); hold on; plot(portrisk,portreturn,'.r'); title('均值-方差有效前沿以及各个资产组合风险与收益'); xlabel('风险(标准差)'); ylabel(’期望收益率'); hold off

这样投资组合有效前沿和各个资产组合风险与收益点如图 12-2 所示。

图 12-2 有效边界图

12.6 考虑无风险资产及借贷情况下的资产配置计算的

MATLAB 实现 投资组合有效前沿上的点很多,如何选择一个有效点呢?投资者需要根据目标函数权

-

185

第 12 章 投资组合计算的 MATLAB 实现

衡风险与回报。MATLAB 中投资者的目标函数如下: 2( ) 0.5U E r A

其中, ( )E r 表示未来回报率,A 表示投资者风险厌恶系数,一般在 2~4 之间, 是资产

标准差。 投资者决策就是使目标函数最大化,然后对资产进行配置。MATLAB 中考虑无风险资

产时的资产配置计算函数是 portalloc,其功能是根据风险-收益最优原则配置每项资产,其

中包括无风险资产。 调用方式: [Riskyrisk,Riskyreturn,Riskywts,Riskyfraction,Overallrisk,Overallreturn] =portalloc(Portrisk,Portreturn,Portwts,Risklessrate,Borrowrate,Riskaversion) 输入参数: Portrisk %有效前沿上每项资产的方差 Portreturn %有效前沿上每项资产的回报率 Portwts %有效前沿上每项资产的权重 Risklessrate %无风险利率 Borrowrate %(可选)借贷利率,默认为没有借贷 Riskaversion %(可选)投资者的风险厌恶系数,大多数投资者的风险厌恶系数

在 2~4 之间,通常选 3 输出参数: Riskyrisk %风险资产部分的标准差 Riskyreturn %风险资产部分的回报率 Riskywts %风险资产部分的权重 Riskyfraction %总资产中风险资产的回报率 Overallrisk %总资产的标准差 Overallreturn %总资产的回报率 例 12-7 考虑三种资产的投资组合,分别为资产 A、资产 B 与资产 C,每种资产的预

期回报率与协方差矩阵如表 12-8 所示。

表 12-8 每种资产的预期回报率与协方差矩阵

资 产 A 资 产 B 资 产 C

预期回报率 0.1 0.2 0.15

协方差矩阵

资 产 A 0.005 0.010 0.004

资 产 B 0.010 0.040 0.002

资 产 C 0.004 0.002 0.023

无风险利率为 0.08,借贷利率为 0.12,投资者的风险厌恶系数为 3,要求考虑无风险

资产和借贷情况下的最优资产配置。求该投资组合的有效前沿。 建立一个名为 zypz.m 的 M 文件,代码如下:

186

金融财务建模与计算——基于 VBA 与 MATLAB 实现

expreturn=[0.1 0.2 0.15]; expcovariance=[0.005 -0.010 0.004 -0.010 0.04 -0.002 0.004 -0.002 0.023]; [portrisk,portreturn,portwts]=portopt(expreturn,expcovariance); %默认有效前沿上取 10个点 risklessrate=0.08; borrowrate=0.12; riskaversion=3; [riskyrisk,riskyreturn,riskywts,riskyfraction,Overallrisk,Overallreturn

]=portalloc(portrisk,portreturn,portwts,risklessrate,borrowrate,riskaversion)

在 MATLAB 状态下输入 zypz,得到下列结果:

riskyrisk = 0.1283 riskyreturn = 0.1788 riskywts = 0.0265 0.6023 0.3712 riskyfraction = 1.1898 Overallrisk = 0.1527 Overallreturn = 0.1899

从上述结果可以看到,最优组合的标准差为 0.1283,收益率为 0.1788,每项资产的权

重分别为 0.0265、0.6023、0.3712,总资产中的风险资产配置的权重为 1.1898,总资产的回

报率为 0.1899,总资产的标准差为 0.1527。 如果选取有效前沿上的点为 20 个点,得到结果如下:

riskyrisk = 0.1288 riskyreturn = 0.1791 riskywts = 0.0057 0.5879 0.4064 riskyfraction = 1.1869 overallrisk = 0.1529 overallreturn = 0.1902

从上述结果可以看到,最优组合的标准差为 0.1288,收益率为 0.1791,每项资产的权

重分别为 0.0057、0.5879、0.4064,总资产中的风险资产配置的权重为 1.1869,总资产的回

报率为 0.1902,总资产的标准差为 0.1529,除了资产配置差别比较大,第一项资产配置进

一步减少,其他差别并不大。

187

第 12 章 投资组合计算的 MATLAB 实现

12.7 投资组合收益最大计算的 MATLAB 实现 投资组合收益最大计算最终可归结为一个线性规划问题,线性规划是研究目标函数和

约束条件均为线性的最优化问题,线性规划的标准形式如下:

; 0min Ax b x

Cx

其中,C 是目标函数矩阵,A 是约束条件矩阵,x 是向量。 标准形式线性问题简称 LP(Linear Programming),MATLAB 中用 LP 函数求解线性规

划问题。 MATLAB 中的线性规划形式如下:

min fx

Axb s.t. Aeq=beq

1bxub 其中,f、x、b、lb、ub 是向量,A、Aeq 的形式是矩阵。

调用方式:

(x,y)=linprog(f,A,b) (x,y)=linprog(f,A,b,Aeq,beq,lb,ub)

其中,f、A、b、Aeq、beq 分别为标准线性规划模型中的参数;参数 ub、lb 分别为变量 x的上界与下界。

例 12-8 某投资组合中有 3 种资产,各资产的收益率分别为 0.2、0.1、0.15。要求资

产 1 与资产 3 的权重之和小于资产 2 的权重,资产 3 的权重不小于 0.1,且没有卖空。求使

得上述收益率最大的投资组合。 首先确定目标函数为:

max 1 2 30.2 0.1 0.15x x x

资产的约束条件为:

1 3 2 1 2 3 1 2 3, 1, 0 1, 0.1 1x x x x x x x x x 、

我们建立一个名为 xxgh.m 的 M 文件,代码如下:

f=[-0.2 -0.1 -0.15]; a=[1 -1 1]; b=[0]; aeq=[1 1 1]; beq=[1]; lb=[0 0 0.1]; ub=[1 1 1]; x=linprog(f,a,b,aeq,beq,lb,ub)

在 MATLAB 状态下输入 xxgh,得到下列结果:

Optimization terminated.

188

金融财务建模与计算——基于 VBA 与 MATLAB 实现

x = 0.4000 0.5000 0.1000

结果表明:资产 1、资产 2、资产 3 的权重分别为 0.4、0.5、0.1。 投资组合优化问题研究如何选择投资对象,比如如何选择不同的债券或股票,在满足

某些要求的前提下使得收益最大或风险最小。因此,其决策变量是对各种可能的投资对象

的投资组合,其目标函数通常是期望回报最大化,而约束条件则可包括总投资额、公司政

策、法律法规等约束。 例 12-9 某公司投资组合优化问题。 某公司董事会决定将 20 万元用于债券投资。经咨询,现有 5 种债券是比较好的投资对

象,它们是黄河汽车、长江汽车、华南电器、西南电器、缜山纸业。它们的投资回报率如

表 12-9 所示。为减小风险,董事会要求,对汽车业的投资不得超过 12 万,对电器业的投

资不得超过 8 万,其中对长江汽车业的投资不得超过对汽车业投资的 65%,对纸业的投资

不得低于对汽车业投资的 20%,该公司应如何投资,才能在满足董事会要求的前提下使得

总回报额最大?

表 12-9 5 种债券的投资回报率

债券名称 黄河汽车 长江汽车 华南电器 西南电器 缜山纸业

回 报 率 0.065 0.092 0.045 0.055 0.042

解:根据题意,本题的决策变量是对 5 种投资对象的投资额,设该公司对 5 种债券的

投资额分别为 X1、X2、X3、X4、X5。 本题的目标是获得最大的债券回报额。债券回报额等于回报率乘以投资额。由表 12-9

可知,5 种债券的回报率分别为 0.065、0.092、0.045、0.055、0.042,所以总回报额应等于

各债券回报额之和。即:

总回报额=0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5

公司的目标是使得上述总回报额最大化,即:

max 0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5

本题的约束条件包括:总投资额约束,以及对汽车业、电器业、长江汽车业、纸业的

投资限制。因此,本题的线性规划模型如下:

o.b. max 0.065 X1+0.092 X2+0.045 X3+0.055 X4+0.042 X5 (总投资额最大化) s.t. X1+X2+X3+X4+X5=200 000(总投资额约束) X1+X2≤120 000 (汽车业投资约束) X3+X4≤80 000 (电器业投资约束) X2≤0.65(X1+X2)(长江汽车业投资约束) X5≥0.20(X1+X2)(纸业投资约束) X1、X2、X3、X4、X5≥0(非负约束)

根据上面的数学模型和 MATLAB 求解线性规划模型的标准形式,我们建立一个名为

189

第 12 章 投资组合计算的 MATLAB 实现

xxgh1.m 的 M 文件,代码如下:

f=[-0.065 -0.092 -0.045 -0.055 -0.042]; a=[1 1 0 0 0; 0 0 1 1 0; -0.65 0.35 0 0 0; 0.2 0.2 0 0 -1]; b=[120000 80000 0 0]; aeq=[1 1 1 1 1]; beq=[200000]; lb=[0 0 0 0 0]; [x,f]=linprog(f,a,b,aeq,beq,lb)

在 MATLAB 状态下输入 xxgh1,得到下列结果:

Optimization terminated. x = 1.0e+004 * 4.2000 7.8000 0.0000 5.6000 2.4000 f = -1.3994e+004

结果表明:该公司的最优投资组合如表 12-10 所示。

表 12-10 计算结果

债券名称 黄河汽车 长江汽车 华南电器 西南电器 缜山纸业

回报额(元) 42 000 78 000 0 56 000 24 000

这时,满足所有的约束条件,且总回报额最大,达到 13 994 元。

12.8 投资组合风险最小计算的 MATLAB 实现 下面我们考虑用二次规划模型来求解投资组合,二次规划问题(Quadratic Programming)

的标准形式如下:

T T1min x Hx+q x

2

s.t. Ax b Aeq*x = beq lb x ub

其中,x、b、beq、lb、ub 为向量,H 为对称矩阵,A、Aep 为矩阵。 约束条件分成两部分,前一部分约束条件是不等式,后一部分约束条件是等式。在投

资组合问题中,H 多为协方差矩阵。 在 MATLAB 中求解此类问题的函数为 quadprog。

190

金融财务建模与计算——基于 VBA 与 MATLAB 实现

调用方式:

[xopt,fopt]=quadprog(H,q,A,b) [xopt,fopt]=quadprog(H,q,A,b,Aeq,beq,lb,ub)

输入参数包括 b、beq、1b、ub、H、A、Aeq、q 等。 例 12-10 投资组合中有 5 种资产,各资产的收益率和协方差矩阵如表 12-11 所示。

表 12-11 各资产的收益率和协方差矩阵

资 产 1 资 产 2 资 产 3 资 产 4 资 产 5

协方差矩阵

资 产 1 0.2 0.05 0.01 0.03 0.05

资 产 2 0.05 0.3 0.015 0.01 0.03

资 产 3 0.01 0.015 0.1 0.02 0.01

资 产 4 0.03 0.01 0.02 0.1 0.015

资 产 5 0.05 0.03 0.01 0.015 0.15

收 益 率 0.2 0.14 0.12 0.05 0.07

要求寻找最优投资组合,使得投资组合收益率为 0.1,且该投资组合的方差最小。 我们建立一个名为 fxxgh.m 的 M 文件,代码如下:

H=[0.2 0.05 -0.01 0.03 0.05; 0.05 0.3 0.015 0.01 0.03; -0.01 0.015 0.1 0.02 0.01; 0.03 0.01 0.02 0.1 0.015; 0.05 0.03 0.01 0.015 0.15]; q=[0 0 0 0 0]; A=[-0.2 -0.14 -0.12 -0.05 -0.07]; b=[-0.1]; aeq=[1 1 1 1 1]; beq=[1]; lb=[0 0 0 0 0]; ub=[1 1 1 1 1]; [xopt,fopt]=quadprog(H,q,A,b,aeq,beq,lb,ub)

在 MATLAB 状态下输入 fxxgh,得到下列结果:

Optimization terminated. xopt = 0.1235 0.0755 0.3480 0.2802 0.1727 fopt =

0.0210

结果表明:资产 1、资产 2、资产 3、资产 4、资产 5 的权重分别为 0.1235,0.0755,0.3480,0.2802,0.1727,投资组合的最小风险为 0.0210。

例 12-11 3 个资产的投资组合在过去一个月的收益率如表 12-12 所示。

191

第 12 章 投资组合计算的 MATLAB 实现

表 12-12 3 个资产的投资组合在过去一个月的收益率

A B C D

3 天 股票 1 股票 2 债券

4 1 0 0.07 0.06

5 2 0.04 0.13 0.07

6 3 0.13 0.14 0.05

7 4 0.19 0.43 0.04

8 5 0.15 0.67 0.07

9 6 0.27 0.64 0.08

10 7 0.37 0 0.06

11 8 0.24 0.22 0.04

12 9 0.07 0.18 0.05

13 10 0.07 0.31 0.07

14 11 0.19 0.59 0.1

15 12 0.33 0.99 0.11

16 13 0.05 0.25 0.15

17 14 0.22 0.04 0.11

18 15 0.23 0.11 0.09

19 16 0.06 0.15 0.1

20 17 0.32 0.12 0.08

21 18 0.19 0.16 0.06

22 19 0.05 0.22 0.05

23 20 0.17 0.02 0.07

期望值、方差、标准差和相关系数计算结果如表 12-13 所示。

表 12-13 期望值、方差、标准差和相关系数计算结果

A B C D

统计量计算

26 单项期望值 0.1130 0.1850 0.0755

27 单项方差 0.0274 0.1102 0.0008

28 标准差 0.1656 0.3319 0.0278

29

30 相关系数

31 股票 1 股票 2 债券

32 股票 1 1.0000 0.1959 0.0289

33 股票 2 0.1959 1.0000 0.0134

34 债券 0.0289 0.0134 1.0000

根据上面的相关系数矩阵,应用 corr2cov 可得到协方差矩阵:

H=[0.052122,-0.02046,-0.00026; -0.02046,0.20929,-0.00024; -0.00026,-0.00024,0.00147]

192

金融财务建模与计算——基于 VBA 与 MATLAB 实现

现在的问题是:在不允许卖空的情况下,计算在投资组合中 3 个资产的最优投资比例,

要求在总投资回报率不低于 0.13 的前提下,使得投资的风险最小。 我们建立一个名为 fxxgh1.m 的 M 文件,代码如下:

H=[0.052122,-0.02046,-0.00026; -0.02046,0.20929,-0.00024; -0.00026,-0.00024,0.00147]; q=[0,0,0]; A=[-0.1130,-0.1850,-0.0755]; b=[-0.13] Aeq=[1,1,1]; beq=[1]; lb=[0 0 0]; [xopt,fopt]=quadprog(H,q,A,b,Aeq,beq,lb)

在 MATLAB 状态下输入 fxxgh1,得到下列结果:

Optimization terminated. xopt = 0.5063 0.3243 0.1694 fopt = 0.0143

结果表明:资产 1、资产 2、资产 3 的权重分别为 0.5063、0.3243、0.1694,投资组合

的最小风险为 0.0143。

12.9 基于遗传算法投资组合风险最小计算的 MATLAB 实现 在资本市场中,证券交易的数量一般是有限制的,如我国深沪证券市场的股票正常交

易的最小数量是 100 股,低于 100 股的交易是不受理的。另外,投资机构及投资者基于各

种因素的考虑,常常对于资金的分配也有一定要求,这样投资组合就需要满足投资机构和

投资者的这些要求。因此,为了适应资本市场和实际操作,需要对有限制的风险资产的投

资组合决策问题进行研究。而就已有文献的研究表明,有投资数量约束的投资组合优化决

策模型最优解的解析表达式难以求得。遗传算法是在有关学者借助生物界自然选择和进化

机制的基础上提出的,经过近 30 年的研究和应用,它已被广泛应用于函数优化、神经网络

学习过程、模式识别和工业过程控制等领域,然而将遗传算法应用于有投资数量约束的投

资组合优化决策问题的研究目前还相对较少。本节我们试图将遗传算法应用到有投资数量

约束的投资组合决策模型的求解中,并通过标准二次规划的 MATLAB 函数对遗传算法求解

的结果进行验证,以佐证遗传算法求解有投资数量约束的投资组合最优解的可靠性。

12.9.1 有投资数量约束的投资组合优化决策模型的建立 我们假设投资机构(如基金公司)或投资者选择了 n 种可投资的风险资产进行组合投

资。记 T1 2( , ,..., )nr r rr 是风险资产的期望收益率向量; ( )ij n n V 是风险资产收益的协方

差矩阵; T1 2( , ,..., )nx x xX 是风险资产的投资比例向量; T(1,1,...,1)l 是分量全部为 1 的向

193

第 12 章 投资组合计算的 MATLAB 实现

量; 1 2( , ,..., )nl l lL ; 1 2( , ,..., )nu u uU ;1

0 1, 1n

i i ii

l u l

则限制投资数量的有效投资组合决策模型为: 2 Tmin X VX

T Ts.t. , 1, i i il x u r X l X

然而,此问题最优解的解析表达式难以得到,因此我们试图通过遗传算法来解决。

12.9.2 用遗传算法求解有限制的投资组合决策模型的过程 1.初始化 (1)确定种群规模M,杂交概率 pc,变异概率 pm,最大进化代数 maxgen,上、下限

值向量 U、L。 (2)采用实数编码,每个染色体含 n 个基因位(代表 n 个证券),基因的数值代表在投

资组合中该证券所占比例。 (3)由约束条件容易知道可行集包含在下列超几何体中:

1 2 1 1 1{( , ,..., ) | ,..., }n n n nx x x l x u l x u

取 1 2' (0) (0,1), ' (0) (0,1),..., ' (0) (0,1)nx u x u x u ,其中函数 u(0,1)表示在(0,1)上产生的均匀

分布的随机数。然后对 ' (0)jx 进行归一处理,1

(0) ' (0) ' (0)n

j j jj

x x x

,并记 1(0) ( (0),..., (0))nx xx 。

若不满足约束条件,则拒绝接受,由(3)重新产生一个新的染色体,如果产生的新的染色

体可行,则接受它作为种群的一名成员,经过有限次抽样后,得到 M 个可行的染色体

, 1,2,...,jx j M 。设 (0)jx 的染色体编码为 (0)jv ,并记为 1(0) ( (0),..., (0))Mv vv 。

(4)计算 (0)jv 的适应度,即目标值 2( (0)) ( (0))j jF v v 。按目标值的大小把 (0)jv 重

新排序,并把排在第一的染色体记为 0v ,这是最好的。如果在以后的进化过程中,发现比 0v

更好的染色体,则用更好的染色体取代 0v 。

(5)置 k=0。

2.选择 (1)根据适应性强的染色体被选择产生后代机会大的原则,给每个 ( )jv k 依据上面适应

性的排序定义一个繁殖概率:

1 2

( ( ))( )

( ( )) ( ( )) ... ( ( ))j

jn

F v kp k

F v k F v k F v k

j=1 意味着染色体是最好的,j=M 意味着染色体是最差的。 (2)对于每个染色体 ( )jv k ,计算累积概率 jq :

01

0, ( ), 1,2,...,j

j ii

q q p k j M

(3)从区间(0, )Mq 中产生一个随机数 r。若 1j jq r q ,则选择第 j 个染色体1 j M 。

194

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(4)重复(2)、(3)M 次,这样可以得到 M 个复制的染色体,记为 1' ( ' ( ),..., ' ( ))Mv k v kv

3.杂交 (1)事先定义了杂交概率 pc, ' ( )jv k 为确定杂交操作的父代,从 j=1 到 j=M 重复以下

过程:从(0, 1)中产生随机数 r,若 r<pc,则选择 ' ( )jv k 作为一个父代。

(2)用 1'' ( ),..., '' ( )Lv k v k 表示我们所选择的父代,对它们进行随机分对,并对所有的对

进行交叉操作。若要对 1 2( '' ( ), '' ( ))v k v k 进行交叉操作,可先从(0,1)中产生一个随机数 c,

再按下列形式在 1 2( '' ( ), '' ( ))v k v k 之间进行交叉操作,产生两个后代:

1 1 2( ) '' ( ) (1 ) '' ( )x k cv k c v k ; 2 1 2( ) (1 ) '' ( ) '' ( )x k c v k cv k

(3)同理可对其他对进行交叉操作。

4.变异 (1)事先定义了变异概率 pm,对经过杂交操作的中间个体进行变异操作,从 j=1 到 j=M

重复以下过程:从(0,1)中产生随机数 r,如果 r<pm,则选择 ( )jv k 作为变异的父代。

(2)产生[1,n]上的随机整数 i、j 及(0,1)上的随机数 r1和 r2,变异的结果为染色体 ai的

第 i 位基因 aii 的值变为 r1,同样将染色体 ai 的第 j 位基因 aij 的值变为 r2。若不满足约束条

件,则拒绝接受;由(2)重新产生一个新的染色体,如果产生的染色体可行,则接受它作

为种群的一名成员。经过有限次抽样后可以产生 s 个变异后的新个体。 (3)计算由变异操作步骤(2)中 s 个新个体、杂交操作中进行杂交而未选择为变异的

Ls 个新个体的适应值,并把它们同时放回,和选择操作中剩余的 M-L 个个体一起构成新

一代种群 1( 1) ( ( 1),..., ( 1))Mk v k v k v 。 (4)终止检验。 如果达到最大进化次数则终止演化,否则置 k=k+1,转选择操作。

12.9.3 用遗传算法求最优投资组合风险实例及其结果分析 设 3 个证券的月收益率如表 12-12 所示。我们用表格软件的 corvar()函数可求得 3

个证券的协方差矩阵为: 0.052122 0.02046 0.000260.02046 0.20929 0.000240.00026 0.00024 0.00147

V

用 average()函数可求得 3 个证券的期望收益率为:

R=(0.1130,0.1850,0.0755)

设 3 个证券投资组合的最低预期收益率是 0.13,在不允许卖空的情况下,求 3 个证券

投资组合的最佳投资比例和最低风险。 二次规划问题(Quadratic Programming)的标准形式如下:

T T1min x Vx+q x

2

s.t. Ax b

Aeq*x = beq

lb x ub

195

第 12 章 投资组合计算的 MATLAB 实现

其中,x、b、beq、1b、ub 为向量,V 为对称矩阵,A、Aeq 为矩阵。

调用方式: [x,fval] = ga(Obj,nvars,A,b,Aeq,beq,lb,ub)

输出参数: x %优化解 fval %函数值 输入参数: Obj %目标函数 Nvars %自变量的个数 A %不等式约束左边矩阵 b %不等式约束右边向量 Aeq %等式约束左边矩阵 beq %等式约束右边向量 lb %变量下界 ub %变量上界 我们用 MATLAB 的遗传算法函数 ga(),编制程序如下:

%遗传算法的 M文件 tzga.m Obj = @tzfitness; nvars = 3; % Number of variables A=[-0.1130,-0.1850,-0.0755]; b=[-0.13];Aeq=[1,1,1];beq=[1]; lb = [0 0 0]; % Lower bound ub = [1 1 1]; % Upper bound [x,fval] = ga(Obj,nvars,A,b,Aeq,beq,lb,ub,[]) %遗传算法的适应度函数 tzfitness.m function y =tzfitness(x) y=0.02061*x(1)^2+0.104645*x(2)^2+0.0007345*x(3)^2

-0.02046*x(1)*x(2)-0.00025*x(1)*x(3)-0.00023*x(2)*x(3);

运行上述程序得到如下结果:

>> tzga x = 0.5044 0.3245 0.1718 fval = 0.0143

将上述结果和下面应用 MATLAB 二次规划函数 quadprog()、Excel 的规划求解工具所

得到结果做一比较,如表 12-14 所示。

表 12-14 投资组合优化模型 3 种方法的计算结果

MATLAB 的遗传算法函数 ga()

求解结果

MATLAB 的二次规划函数

quadprog()求解结果

Excel 的规划求解工具

求解结果

最优投资比例 (0.5044,0.3245,0.1718) (0.5063,0.3243,0.1694) (0.5063,0.3243,0.1694)

投资组合的最低风险 0.0143 0.0143 0.0151

从表 12-14 可见,3 种不同工具对投资组合优化模型的求解结果非常接近。但 MATLAB

196

金融财务建模与计算——基于 VBA 与 MATLAB 实现

中的 quadprog()函数与 Excel 的规划求解工具只适应于约束是线性的二次规划模型的求解,

而遗传算法除了可以求解约束是线性的二次规划以外,对于约束是非线性的二次规划的情

况,甚至即使目标函数不是二次规划的非线性模型且约束是非线性的复杂模型,遗传算法

也可以很好的解决。因此,遗传算法在社会经济生活的复杂建模中具有无可比拟的优越性。 为了使投资组合优化问题更接近于客观实际,我们常常需要对有投资数量约束的投资

组合优化决策进行研究。本节我们在建立有投资数量约束的投资组合优化决策模型的基础

上,对其投资比例进行了实数编码,从而成功地将选择、杂交、变异等遗传算子运用到投

资组合决策中,得到了最优解,并从 MATLAB 的二次规划 quadprog()函数和 Excel 的规划

求解工具等不同视角对该投资组合模型进行了求解,从而佐证了遗传算法求解该模型的可

靠性。可以预见,在今后投资组合优化决策的实际应用中,遗传算法会用得越来越广。

12.10 投资组合的风险价值计算的 MATLAB 实现 风险价值或在险价值,是指在一定置信水平下,某一金融资产(或证券组合)在未来

特定的一段时间内的最大可能损失。假设 JP 摩根银行在 2008 年置信水平为 95%的日 VaR值为 960 万美元,其含义是指该银行可以以 95%的把握保证,2008 年某一特定时点上的金

融资产在未来 24 小时内,由于市场价格变动带来的损失不会超过 960 万美元。或者说,只

有 5%的可能损失超过 960 万美元。与传统风险度量手段不同,VaR 完全是基于统计分析基

础上的风险管理技术,它的产生是 JP 摩根银行用来计算市场风险的产物。 例 12-12 假设投资者拥有两种资产,资产总价值为 10 000 000 元,资产权重分别为

1/4 与 3/4,这两种资产日波动率的均值分别为 0.003、0.002,标准差分别为 0.02、0.01,这

两种资产之间的相关系数为 0.08,时间为 10 天,给定置信度为 99%,求该资产的 VaR。 首先求总资产方差,公式如下:

1 121 1 2 2

2 2

11

ww w

w

(12-1)

其中, 1 2,w w 分别为投资组合权重, 1 2, 为单个资产标准差, 为两种资产之间的相关系数。 一般地,可将式(12-1)用向量与矩阵形式表示,记 1,..., nw ww ,表示各种资产的

权重; 1,..., n ,表示各种资产的标准差,资产协方差矩阵记为 cov,则式(12-1)

可以写成如下形式: T( )cov( , ) w w (12-2)

其中,“”为向量点乘符号,表示两个向量对应元素的乘积,MATLAB 中用记号“*”表示

向量点乘。记号“ ”表示向量转置。如果记 ˆ w ,则有:

T2 Tcov( ) t

t 为时间长度。 有了投资组合的方差,就可以计算出 VaR。从正态分布表中可以查到对应于置信度 99%

( 0.01 )的 1 2.3263Z 。在各种资产都是服从正态分布的假设下,资产 VaR 值为:

VaR 总资产 1( )t Z t

197

第 12 章 投资组合计算的 MATLAB 实现

具体来讲,计算 VaR 的步骤如下。 (1)输入资产权重向量 w,各资产的标准差 ,资产之间的相关系数 cov,注意协方

差矩阵一定是对称矩阵,需要计算时间长度 t 。 (2)权重向量点乘标准差向量。 (3)计算资产总的标准差 。 (4)对于给定置信度 ,查正态分布表找到 1Z 。 (5)计算 VaR,VaR 总资产 1( )t Z t 。 实际上,MATLAB 中有专门计算 VaR 值的函数,MATLAB 中的 portvrisk 函数可以计

算投资组合的 VaR 值。注意,输入的是总资产的期望收益率与标准差,而不是投资组合中

各种资产的预期收益率与标准差。 调用方式: ValueAtRisk=portvrisk(Portreturn,Portrisk,Riskthreshold,Portvalue) 输入参数: Portreturn %总资产的回报率 Portrisk %总资产的标准差 Riskthreshold %概率阈值,默认值为 0.05 Portvalue %资产总的价值 输出参数: ValueAtRisk %概率阈值下的单资产 VaR 值 例 12-13 已知资产年回报率为 0.0029,标准差为 0.0308,资产现在价值为 1 亿,求

1%水平下资产的在险价值。 我们建立一个名为 fxjz.m 的 M 文件,代码如下:

Portreturn=0.0029; %总资产的回报率 Portrisk=0.0308; %总资产的标准差 Riskthreshold=0.01; %1%水平下损失的概率 Portvalue=1; ValueAtRisk=portvrisk(Portreturn,Portrisk,Riskthreshold,Portvalue)

在 MATLAB 状态下输入 fxjz,得到下列结果:

ValueAtRisk = 0.0688

结果表明:该资产的 VaR 等于 0.0688,即该资产损失 0.0688 亿的可能性为 1%。需注

意的是,金融资产一般并不是正态分布的,而是呈现肥尾特征,其 VaR 较正态分布大。

本章小结 本章重点介绍了投资组合收益与风险计算的 MATLAB 实现;投资组合有效前沿(边界)

计算的 MATLAB 实现;投资组合收益最大计算的 MATLAB 实现;投资组合风险最小计算

的 MATLAB 实现;投资组合的风险价值计算的 MATLAB 实现等,这为读者快速地进行最

优投资组合的计算提供了一个很好的工具。

第 13 章 金融衍生品计算的 MATLAB 实现

本章要点

欧式期权 Black-Scholes 方程的推导及其 MATLAB 实现。

Black-Scholes 欧式期权隐含波动率的 MATLAB 实现。

衍生品定价二叉树计算的 MATLAB 实现。

利率衍生品定价模型计算。

期权衍生品定价是金融工程的核心内容。本章主要介绍 MATLAB 的金融衍生品工具

箱,要求读者掌握工具箱中常见期权的定价方法,包括价格树、利率树的构建格式和奇异

期权的定价方法。

13.1 金融衍生品的种类 期权是一种合约,它赋予购买方在规定期限内按事先约定的价格(协议价格或执行价

格)购买或出售一定数量某种标的金融资产的权利。期权购买方为了获得这个权利,需支

付给出售方一定金额的费用,称为期权费,期权于此后失效的日期叫做到期日。 期权分为基本期权和奇异期权。

1.基本期权 基本期权是常见的期权,如欧式期权(看涨、看跌期权)、美式期权(看涨、看跌期权)

等。基本期权比较简单,除了行使方式、有效期和执行价,不再包括其他附加内容。 (1)欧式期权:欧式看涨期权买方(卖方)有权在到期日以事先约定的价格(执行价

格)买入(或卖出)标的资产,期权买方同时支付期权费来购买这一权利。 (2)美式期权:美式期权与欧式期权内容相同。不同之处在于,欧式期权的执行日是

到期日,美式期权可以在存续期内任意时刻行权,这样增加了期权行使者的灵活性,因此

美式期权的值不会小于欧式期权。 看涨期权:该期权购买者可以在未来以商定价格购买标的资产。 看跌期权:该期权购买者可以在未来以商定价格卖出标的资产。 下面介绍期权内在价值和时间价值。 内在价值:期权内在价值是指立即行权所获得的收益,看涨期权内在价值是标的资产

199

第 13 章 金融衍生品计算的 MATLAB 实现

现价和执行价之差。如某看涨期权执行价为 100 元,股票价格为 107 元,那么内在价值就

是 7 元。 时间价值:期权时间价值就是期权价格高于内在价值的部分,期权时间价值就是期权

价格减去内在价值。如果期权价格为 8 元,内在价值为 7 元,那么该期权时间价值为 1 元。

2.奇异期权 奇异期权也叫“第二代期权”,包括亚式期权、障碍期权、百慕大期权等。奇异期权是

金融机构为满足市场需求而设计的,多在场外交易。 (1)亚式期权:是一种路径依赖型期权,由于执行价是平均价,不容易受到操纵,因

而受到投资者青睐。 (2)障碍期权:指期权回报依赖于标的资产在特定时间内是否达到了某个特定水平,

这个水平就叫做障碍水平。 (3)百慕大期权:一般只在固定日期行权,通常为某一月某一天。它是美式期权和欧

式期权的混合体,与美式期权的区别是美式期权行权日不固定。

13.2 欧式期权 Black-Scholes 方程计算的 MATLAB 实现 欧式期权价格可以通过公式精确求解,下面介绍欧式期权定价的基本理论。

13.2.1 Black-Scholes 方程 Black-Scholes 方程是金融衍生品 重要的定价公式,下面给出 Black-Scholes 方程的推

导过程,首先介绍 ITO 引理。 ITO 引理:假设标的资产满足如下过程

d ( , )d ( , )dx a x t t b x t W (13-1)

其中,dW 是一个维纳过程,设 ( , )G G x t 是 x 与 t 的函数,函数二次连续可微,则 ),( txG

遵循如下过程: 2

22

1d ( , ) ( )d d2

G G G GG x t a b t b W

x t xx

(13-2)

证明:由二元泰勒函数公式 2 2 2

2 22 2

1 1( ) ( ) ...2 2

G G G G GG x t x x t t

x t x tx t

(13-3)

( , ) ( , )x a x t t b x t t (13-4) 2 2 2 2 22x a t ab t t b t (13-5)

其中, 服从标准正态分布, 2( ) 1, ( ) 1E E ,因此期望 2 2 2( )E b t b t ,因为当 0t

时,方差 var 2( ) 0x ,由式(13-5)得: 2 2 ( )x b t o t (13-6)

由式(13-4)得:

200

金融财务建模与计算——基于 VBA 与 MATLAB 实现

2 3/ 2( , ) ( , ) ( ) ( )x t a x t t b x t t o t (13-7)

将式(13-4)和式(13-6)代入式(13-3)得: 2

22

1 ( )2

G G GG x t b t o t

x t x

(13-8)

当 0t ,得: 2

22

1d d d2

G G GG x t b t

x t x

(13-9)

将 d ( , )d ( , )dx a x t t b x t W 代入式(13-9)式得: 2

22

1d ( )d d2

G G G GG a b t b W

x t xx

命题得证。 下面推导出 Black-Scholes 方程。 假设标的资产价格服从几何布朗运动,即:

d d dS S t S W

期权价格为 ( , )V V S t ,由 ITO 引理可得: 2

2 22

1d ( )d d2

V V VV S t S

t SS

22 2

21( )d d2

V V V VS S t S W

t S SS

下面考虑一个投资组合:卖出一个看跌期权,同时买入数量股票,则

22 2

2

22 2

2

d d d

1( d d ) [( )d d ]2

1( )d [ ( ) ]d2

S V

S V

V V V VS t S W S S t S W

t S SS

V V V VS W S S t

S S t S

如果我们选取V

S

,d中没有了随机项 dW,如果我们能够随时间变化及时调整,

就可以在整个时间段将资产变成无风险资产。如果投资组合变成了无风险资产,那么其收

益率和无风险收益率应该相等。即:

d dr t

则 2

2 22

1 02

V VS r

t S

201

第 13 章 金融衍生品计算的 MATLAB 实现

式中,r 为无风险利率。 整理得到:

22 2

21 02

V V VrS S rV

t S S

(13-10)

上式就是 Black-Scholes 方程,它表明金融衍生品定价可以用偏微分方程表示。 因此,为了确定在合约有效期[0, T]内期权的价值,就要在区域

:{0 ,0 }S t T

上求解定解问题: 2

2 22

1 02

( ) ( )|

( ) ( )t T

V V VS rS rV

t SS

S KV

K S

看涨期权

看跌期权

(13-11)

式(13-11)是一个变系数反抛物型方程,而定解问题(13-11)是一个倒向定解问题:

即在终止时间已知“终值条件”,在 0 t T 时段内求解 V=V(S,t),使它适合方程(13-11)。 做变量代换:

x=lnS, T t

定解问题转化为常系数抛物型方程的 Cauchy 问题(初值问题): 2 2

22

1 ( ) 02 2

(e ) ( )|

( e ) ( )

x

t Tx

V V Vr rV

xx

KV

K

看涨期权

看跌期权

(13-12)

由偏微分方程理论知:定解问题(13-12)与定解问题(13-11)是适定的。 注:在 Black-Scholes 方程(13-11)中不出现标的资产模型中的标的资产的期望回报率

,代替它出现在方程(13-11)中的是无风险利率 r。这表明通过对冲技巧,Black-Scholes方程把人们引入一个风险中性世界,它的定价理论不依赖于每个投资者的偏好及对未来

风险资产的期望值。因此,通过求解 Black-Scholes 方程所得到的期权定价是一个风险中

性价格。

13.2.2 Black-Scholes 欧式看涨期权定价公式的推导 下面求解 Cauchy 问题(13-12)。 我们做函数变换:

e xV u (13-13)

通过适当选取常数 a、 使得方程(13-12)转化为热传导方程。由于 2e ( ), e ( ), e ( 2 )x x x

x x xx xx xV u u V u u V u u u

202

金融财务建模与计算——基于 VBA 与 MATLAB 实现

将它们代入(13-12),消去 e x 得到: 2 2 2 2

2 2( ) [ ( ) ] 02 2 2 2xx xu u r u r r u

取 2 2 2

2 22 2

1 1, ( ) ( )2 2 2 22

rr r r r

这样在变换(13-13)下,方程(13-12)变为: 2 2

2 02

u u

x

(13-14)

相应的初值为(以看涨期权为例):

0| e (e )x xu K

(13-15)

热传导方程(13-14)的 Cauchy 问题的解可以用 Poisson 公式表示,即:

( , ) ( , ) ( )du x K x

其中, ( ) 为初值,

2

2( )21( , ) e

2

x

K x

从而 Cauchy 问题的解可以表示为: 2

2

2

2

( )2

( )(1 )2

ln

1( , ) e [e (e ) ]d2

1 e [(e e ]d2

x

x

K

u x K

K

其中,2

21 ( )

2r

。回到原来的未知函数 ( , )V x :

2 22

2 21 1( ) ( )

2 22 1 2( , ) e ( , )r r r x

V x u x I I

其中, 2 2

2 2 21 2ln

22

2ln

1 1e exp ( ) 2( )( ) ( ) d2 222

1 1= e exp [ ( ) ] d222

r

K

r

K

I x x r r

x r

令 2

( )2

x r

203

第 13 章 金融衍生品计算的 MATLAB 实现

2 2 2ln ( )21 2

e ( )exp( )d22

x x K rI

令 2

,

21( ) exp( )d

22x

N x

这里 N(x)称为标准正态分布的累积概率分布函数,则 2

1

ln ( )2e ( )x

x K rI N

同理

2

22

2 2ln

2ln ( )2

2

2

2

1e exp[ [ ( ) ] d222

e exp( )d22

ln ( )2e ( )

r

K

r x K r

r

KI x r

K

x K rI K N

因此由变换 x=lnS, T t 回到原变量 S, t,我们可得欧式看涨期权价格为: 2 2

( )ln ln ( )( ) ln ln ( )( )

2 2( , ) ( ) e ( )r T tS K r T t S K r T t

V S t SN K NT t T t

令 2

1 2 1

ln / ( )( )2 ,

S K r T td d d T t

T t

从而对欧式看涨期权,它的定价公式为: ( )

1 2( , ) ( ) e ( )r T tV S t SN d K N d (13-16)

人们称它为 Black-Scholes 公式。 在式(13-16)中,S 为股票价格,K 是执行价格,N(.)是正态分布函数,r 是无风险

利率,Tt 是期权存续期, 是标准差。 1976 年 Black 研究出期货期权定价模型,该模型假设了期货价格 F 遵循如下几何布朗

运动: d d dF F t W

这里, 是期货价格预期增长率, 是波动率, dW 是维纳过程。 设欧式期货看涨期权价格为 c,看跌期权价格为 p,则有:

204

金融财务建模与计算——基于 VBA 与 MATLAB 实现

( )1 2e [ ( ) ( )]r T tc FN d KN d

( )2 1e [ ( ) ( )]r T tp KN d FN d

2 2

1 2 1

ln( / ) ( ) ln( / ) ( )2 2,

F K T t F K T td d d T t

T t T t

其中,F 为期货价格,K 是执行价格,N(.)是正态分布函数,r 是无风险利率,T 是存续

期, 是标准差。

13.2.3 Black-Scholes 欧式期权价格的计算函数 MATLAB 中计算欧式期权价格的函数是 blsprice。 调用方式: [Call,Put]=blsprice(Price,Strike,Rate,Time,Volatility,Yield) 输入参数: Price %标的资产价格 Strike %执行价格 Rate %无风险利率 Time %距离到期日的时间,即期权的存续期 Volatility %标的资产的标准差 Yield %标的资产的红利率 输出参数: Call %欧式看涨期权价格 Put %欧式看跌期权价格 例 13-1 股票价格为 100 元,股票的标准差为 0.5,无风险利率为 10%,期权执行价

格为 95 元,存续期为 0.25 年,试计算该股票欧式期权价格。 创建计算欧式期权价格的 M 文件,存于 blsp.m 中的内容如下:

Price=100; Strike=95; Rate=0.1; Time=0.25; Volatility=0.5; [Call,Put]=blsprice(Price,Strike,Rate,Time,Volatility)

在 MATLAB 状态下运行 M 文件 blsp(按【F5】键或在命令状态下输入 blsp),得到如

下结果:

>> blsp Call = 13.6953 Put = 6.3497

从计算结果可以看出,该股票欧式看涨期权价格是 13.6953 元,欧式看跌期权价格是

6.3497 元。

205

第 13 章 金融衍生品计算的 MATLAB 实现

13.2.4 Black-Scholes 欧式期权隐含波动率的计算函数 已知欧式期权价格,也可以推导出隐含波动率,然后用隐含波动率与实际波动率做比

较,并作为投资决策参考。 MATLAB 中计算欧式期权隐含波动率的函数是 blsimpv。 调用方式: Volatility =blsimpv(Price,Strike,Rate,Time,Value,Limit,Yield,Tolerance,Type) 输入参数: Price %标的资产价格 Strike %执行价格 Rate %无风险利率 Time %距离到期日的时间,即期权的存续期 Value %欧式期权价格 Limit %(可选)欧式期权波动率上限,默认值是 10 Yield %(可选)标的资产的分红,折合成年收益率 Tolerance %(可选)可以忍受的隐含波动率,默认值是 1.0*106 Type %(可选)欧式期权的种类,如果是欧式看涨期权则输入 type={‘call’},

如果是欧式看跌期权则输入 type={‘put’},默认值为欧式看涨期权 输出参数: Volatility %欧式期权隐含波动率,期权类别由 Type 确定 例 13-2 股票价格为 100 元,股票欧式期权价格为 10 元,无风险利率为 10%,期权

执行价格为 95 元,存续期为 0.25 年,试计算该股票的波动率。 创建计算该股票波动率的 M 文件,存于 bdl.m 中的内容如下:

Price=100; Strike=95; Rate=0.1; Time=0.25; Value=10; Volatility=blsimpv(Price,Strike,Rate,Time,Value)

在 MATLAB 命令状态下输入 bdl,得到如下结果:

>> bdl Volatility = 0.2905

从计算结果可以看出,该股票的波动率是 0.2905。

13.2.5 期货期权定价计算函数 MATLAB 中计算期货期权价格的函数是 blkprice。 调用方式: [Call,Put]=blkprice(Price,Strike,Rate,Time,Volatility)

206

金融财务建模与计算——基于 VBA 与 MATLAB 实现

输入参数: Price %期货价格 Strike %期货期权执行价格 Rate %无风险利率 Time %期权的存续期 Volatility %期货波动率 输出参数: Call %欧式看涨期权价格 Put %欧式看跌期权价格 例 13-3 期货价格为 120 元,期货波动率为 0.5,无风险利率为 10%,期货期权执行

价格为 110 元,存续期为 0.5 年,试计算该期货欧式期权价格。 创建计算期货期权价格的 M 文件,存于 blkp.m 中的内容如下:

Price=120; Strike=110; Rate=0.1; Time=0.5; Volatility=0.5; [Call,Put]=blkprice(Price,Strike,Rate,Time,Volatility)

在 MATLAB 状态下运行 M 文件 blkp,得到如下结果:

>> blkp Call = 20.5629 Put = 11.0506

从计算结果可以看出,该期货欧式看涨期权价格 20.5629 元,欧式看跌期权价格是

11.0506 元。

13.3 衍生品定价二叉树计算的 MATLAB 实现

13.3.1 CRR 二叉树模型 CRR(Cox-Ross-Rubinstein)二叉树模型,简称 CRR 模型。 对于一些期权,无法像欧式期权一样有解析解,因此就需要用数值解进行近似计算,

二叉树方法就是其中一种,该方法由 J.Cox、S.Ross、M.Rubinstein 于 1979 年提出。 二叉树模型首先将时间分成许多小的时间段,记为 t ,并假设该期权价格存在上升与

下降两种可能性,上升与下降的比率分别为 u 和 d,对应概率分别为 p 和(1p)。下面举

例介绍建立二叉树模型的步骤。 例 13-4 股票价格为 52 元,无风险收益率为 10%,期权距离到期日为 5 个月,股票

波动率为 0.4,欧式看跌期权执行价为 52 元,假设将时间离散为 5 个时间段,利用二叉树

模型估计看跌期权价格。 第 1 步:确定 p,u,d 参数。

207

第 13 章 金融衍生品计算的 MATLAB 实现

假设股票初期价格为 S,如果投资无风险资产,经过 t 后价值为 er tS ,股票收益期

望为:

e (1 )r tS pSu p Sd

整理得:

e (1 )r t pu p d (13-17)

由于标的资产服从几何布朗运动,经过 t 时间后,其方差为 2 2S t ,必须和离散模

型中的资产方差相等,离散资产方差可根据公式 2 2( ) ( )D X EX EX 计算,这样有: 2 2 2 2 2 2 2 2(1 ) [ (1 ) ]S t pS u p S d S pu p d

整理得: 2 2 2 2(1 ) [ (1 ) ]t pu p d pu p d (13-18)

选择 u、d 使其满足下面关系:

1/u d (13-19)

从而由式(13-17)、(13-18)、(13-19)可以解出:

er t dp

u d

e tu

e td

对于上面例 13-4 我们计算参数为:

e tu =1.1224

e td =0.8909

er t dp

u d

=0.5073

第 2 步:确定二叉树的结构。 当时间为 0 时,证券价格为 S,时间为 t 时,资产价格要么上涨到 Su,要么下降到

Sd;时间为 2 t 时,资产价格就有 3 种可能,分别为 Su2、Sud、Sd2。依此类推,在时间 i t时,资产价格就有 i+1 种可能,用公式表示为:

j i jSu d

其中,j=0,1,2,3…,i=1,2,3,…。 对于上面例 13-4 中的期权,其二叉树如图 13-1 所示。 第 3 步:根据二叉树进行倒推定价。 在二叉树模型中,期权定价从树形图末端开始,采用倒推定价方法。由于在 T 时刻欧

式看跌期权现金流为 max{ ,0}TK S ,求解 tT 时刻每一节点上的期权价格时就可以通

过将 T 时刻期权现金流预期值以无风险收益率进行贴现求出。依此类推,如果是美式期权,

208

金融财务建模与计算——基于 VBA 与 MATLAB 实现

就要看树形图每一节点上,提前执行是否比将期权持有到下一期更有利,采用这种方法

终可以求出 0 时刻的期权价值。

58.36

46.33

41.28

52.00

65.51

36.78

46.33

58.36

73.53

32.77

41.28

52.00

65.51

82.53

29.19

36.78

46.33

58.36

73.53

92.63

52

图 13-1 例 13-4 的二叉树

假设将欧式看跌期权的存续期分成N个长度为 t 的小区间,设 , (0 ,0 )i jf i N j i 表示在时刻 ti 第 j 个节点处的欧式看跌期权价格,也称 jif , 为节点(i, j)的期权价值,同

时 j i jSu d 表示节点(i, j)处的标的资产的价格,欧式看跌期权到期价值是max{ ,0}TK S ,

所以有:

, max{ ,0}j N jN jf K Su d

其中, 1,2,...,j N 。 当时间从 i t 变到 ( 1)i t 时,从节点(i, j)移动到(i+1, j+1)的概率为 p,移动到

(i+1, j)的概率为(1p),则在风险中性情况下:

, 1, 1 1,e [ (1 ) ],0 1,0r ti j i j i jf pf p f i N j i

当我们选择的时间间隔足够小时,就可以求出欧式看跌期权的精确值,图 13-2 所示为

倒推法过程。

2.25

7.24

10.78

3.92

0.66

15.22

6.63

1.35

0

19.23

10.72

2.77

0

0

22.81

15.22

5.67

0

0

0

4.67

图 13-2 倒推法过程

209

第 13 章 金融衍生品计算的 MATLAB 实现

从图 13-2 中可以看出欧式看跌期权价值是 4.67 元。

13.3.2 EQP 二叉树模型 在 CRR 二叉树模型中,我们首先建立式(13-17)、(13-18),为了减少节点数目,方

便计算,假设 ud=1,这样式(13-17)、(13-18)分别变为:

2er tu d (13-20) 22 2 (2 )2e r tu d (13-21)

这样可以由式(13-20)、(13-21)得: 2

e (1 e 1)r t tu (13-22) 2

e (1 e 1)r t td (13-23)

当 0t ,式(13-22)、(13-23)的一阶近似变为:

1u r t t (13-24)

1d r t t (13-25)

实际上,式(13-22)、(13-23)还可以有更高阶近似:

ea t tu (13-26)

ea t td (13-27)

这里 212

a r 。

13.3.3 二叉树定价函数 MATLAB 中给期权定价采用的方法是 CRR 二叉树模型,函数为 binprice。 调用方式: [AssetPrice, OptionValue]=binprice(Price, Strike, Rate, Time, Increment, Volatility, Flag,

DividendRate, Dividend,Exdiv) 输入参数: Price %股票价格 Strike %期权的执行价格 Rate %无风险利率 Time %期权存续期 Increment %时间的增量 Volatility %波动率 Flag %确定期权种类,看涨期权(Flag=1), 看跌期权(Flag=0) DividendRate %(可选)红利发放率。默认值为 0,表示没有红利,如果给出了红

利发放率,Dividend,Exdiv 值为 0 Dividend %(可选)标的资产价格外的红利金额,除了固定红利之外的红利

210

金融财务建模与计算——基于 VBA 与 MATLAB 实现

Exdiv %(可选)标的资产的除息日期 输出参数: AssetPrice %二叉树每个节点的价格 OptionValue %期权在每个节点的现金流 例 13-5 股票价格为 52 元,无风险收益率为 10%,期权存续期为 5 个月,波动率

为 0.4,在 3 个半月(折合时间为 3.5 月)发放红利 2.06 元,看跌期权执行价格为 50 元,

利用二叉树模型估计看跌期权的价格。 在 MATLAB 中输入如下命令:

>> [price,option]=binprice(52,50,0.1,5/12,1/12,0.4,0,0,2.06,3.5) price = 52.0000 58.1367 65.0226 72.7494 79.3515 89.0642 0 46.5642 52.0336 58.1706 62.9882 70.6980 0 0 41.7231 46.5981 49.9992 56.1192 0 0 0 37.4120 39.6887 44.5467 0 0 0 0 31.5044 35.3606 0 0 0 0 0 28.0688 option = 4.4404 2.1627 0.6361 0 0 0 0 6.8611 3.7715 1.3018 0 0 0 0 10.1591 6.3785 2.6645 0 0 0 0 14.2245 10.3113 5.4533 0 0 0 0 18.4956 14.6394 0 0 0 0 0 21.9312

从计算结果看出,option 第一行第一列就是看跌期权的价格,该期权的价格为 4.4404 元。

13.4 利率衍生品定价模型计算 利率模型有很多,如 Ho-Lee 模型、Hull-White 模型等,本节主要介绍 Ho-Lee 模型的

二叉树定价。 Ho-Lee 模型是由华裔学者 Thomas Ho 与 San-Bin Lee 建立的,该模型假定利率 r 服从

下面的形式: d ( )d dr t t w

其中, ( )t 是 t 时刻利率趋势项, 是利率波动率。 Ho-Lee 模型中趋势变量 是时间依赖型的,随着时间不同,利率趋势也是不断变化的。

例如,第一个月趋势为 10 个基点,第二个月可能就变为 5 个基点。 在 Ho-Lee 模型中,利率变化遵循二叉树结构,如图 13-3 所示。 该模型表明,下一期短期利率为本期利率加上某个常数与时间的乘积,再加上或者减

去另一个常数乘以时间段的平方根。不论利率是上升还是下降,下一期利率都要加上 dt ,

这是短期利率趋势变化。 接下来的问题是如何确定1、2、。 数值可以通过历史波动率进行估计,也可以采用隐含波动率确定,为了确保定价模

型不存在套利机会,模型参数1、2、 必须能使零息债券定价与市场价格相一致。下面

通过一个例子来说明。

211

第 13 章 金融衍生品计算的 MATLAB 实现

0r 0 d dr t t

0 1 2( )d 2 dr t t

0 1 2( )dr t

0 d dr t t

0 1 2( )d 2 dr t t

图 13-3 Ho-Lee 模型

例 13-6 假定即期利率为 6%,利率的年波动率为 0.5%,2 年期零息债券的市场价格

为 88.58 元,3 年期零息债券的市场价格为 82.47 元,构造利率树,并利用利率树对相关产

品定价。 首先,2 年期零息债券的市场价格变化如图 13-4 所示。

88.58

1100 /(1 6% 0.5%)

100

100

100

1100 /(1 6% 0.5%)

图 13-4 2 年期零息债券的市场价格变化

求解下列方程:

1 1

1 100 1 100( ) 1.06 88.582 1 6% 0.5% 2 1 6% 0.5%

解得 1 0.5% ,这样形成 2 年期利率二叉树,如图 13-5 所示。 将利率二叉树延伸一年,则 3 年期利率二叉树结构如图 13-6 所示。

6%

6%

7%

6%

6%

1 26% ( ) 2

7%

1 26% ( ) 2

1 26% ( )

图 13-5 2 年期利率二叉树 图 13-6 3 年期利率二叉树结构 1

由于 1 0.5%, 0.5% ,则 3 年期利率二叉树结构如图 13-7 所示。 3 年期零息债券市场价格为 82.47 元,那么 3 年期零息债券的二叉树结构如图 13-8 所示。

212

金融财务建模与计算——基于 VBA 与 MATLAB 实现

6%

6%

27.5%

7%

26.5%

25.5%

82.47

pd

pu

pdd

pud

puu

100

100

100

100

图 13-7 3 年期利率二叉树结构 2 图 13-8 3 年期零息债券的二叉树结构

2

1001 7.5%uuP

2

1001 6.5%udP

2

1001 5.5%ddP

0.5 0.51 7%uu ud

uP P

P

0.5 0.51 6%ud dd

dP P

P

0.5 0.582.471 6%

u dP PP

求得 2 0.6% ,那么 3 年期利率二叉树如图 13-9 所示。

6%

6%

8.1%

7%

7.1%

6.1%

图 13-9 3 年期利率二叉树

图 13-10 是利用利率树对 3 年期贴现利率为 5.25%的债券进行定价的示意图。 在 T=2 节点上,当短期利率为 8.1%,该附息债权价值为 97.36 元,计算过程如下:

(100 5.25) 0.5 (100 5.25) 0.597.361 8.1%

在 T=2 节点上,当短期利率为 7.1%,该附息债权价值为 98.27 元,计算过程如下:

213

第 13 章 金融衍生品计算的 MATLAB 实现

(100 5.25) 0.5 (100 5.25) 0.598.271 7.1%

在 T=2 节点上,当短期利率为 6.1%,该附息债权价值为 99.20 元,计算过程如下: (100 5.25) 0.5 (100 5.25) 0.599.20

1 6.1%

在 T=1 节点上,当短期利率为 7%,该附息债权价值为 96.32 元,计算过程如下: (97.36 5.25) 0.5 (99.2 5.25) 0.596.32

1 7%

在 T=1 节点上,当短期利率为 6%,该附息债权价值为 98.1 元,计算过程如下: (98.27 5.25) 0.5 (99.2 5.25) 0.598.1

1 6%

在 T=0 节点上,当短期利率为 6%,该附息债权价值为 96.66 元,计算过程如下: (96.32 5.25) 0.5 (98.1 5.25) 0.596.66

1 6%

这样 3 年期附息债权的价格为 96.66 元。

V=96.66 C=0 r0=6%

V=96.32C=5.25 r0=7%

V=98.1C=5.25r0=6%

V=97.36 C=5.25 r0=8.1%

V=98.27C=5.25 r0=7.1%

V=99.20C=5.25 r0=6.1%

V=100 C=5.25

V=100 C=5.25

V=100 C=5.25

V=100 C=5.25

T=0 T=1 T=2 T=3

图 13-10 利率二叉树对衍生产品定价

本章小结 本章介绍了欧式期权 Black-Scholes方程的推导和欧式期权价格计算的 MATLAB实现;

欧式期权隐含波动率的 MATLAB 实现;衍生品定价二叉树计算的 MATLAB 实现;利率衍

生品定价模型计算等,这为读者快速地进行衍生产品的计算提供了一个很好的工具。

第 14 章 期权定价有限差分计算

的 MATLAB 实现 本章要点

有限差分方法计算的基本原理。

显式法和隐式法计算欧式看跌期权价格并编制 MATLAB 程序。

显式法和隐式法计算美式看跌期权价格并编制 MATLAB 程序。

我们知道,期权定价最终归结为一个二阶偏微分方程,而有限差分方法是计算偏微分

方程的有效工具。因此,本章介绍了常见的有限差分方法,并且给出了相关程序,让读者

了解有限差分方法计算的基本原理,熟悉显式法和隐式法计算欧式和美式看跌期权价格。

14.1 有限差分方法计算的基本原理 偏微分方程在金融工程中占有重要位置,著名的 Black-Scholes 方程就是以二阶偏微分

方程形式给出的。偏微分方程为求解复杂的金融衍生工具价格提供了有力手段,但是偏微

分方程通常没有解析解,因此数值计算方法求解衍生工具价格就成为金融工程的一项基本

功。求解金融衍生工具价格与求解通常偏微分方程的区别主要在于:一般偏微分方程是给

定初值求解终值,而衍生品定价问题是给定终值求初值,属于倒向随机偏微分方程求解。 有限差分方法的核心思想是对导数进行离散化,把偏微分方程转化为差分方程,然后

利用迭代法求解。 有限差分方法根据对偏导数离散方法的不同,分为显式差分法、隐式差分法、内含差

分法,下面分别进行介绍。 假设 ,i jf 表示在 i 时刻股票价格为第 j 价位的期权价格,我们对 f 一阶导数进行如下差分:

, 1 ,i j i jf ff

S S

(14-1)

1, ,i j i jf ff

t t

(14-2)

215

第 14 章 期权定价有限差分计算的 MATLAB 实现

上面的差分方法称为显式差分法。我们也可以对一阶导数做如下差分:

, , 1i j i jf ff

S S

(14-3)

, 1,i j i jf ff

t t

(14-4)

上面的差分方法称为隐式差分法。我们也可以做如下差分:

, 1 , 1

2i j i jf ff

S S

(14-5)

1, 1,

2i j i jf ff

t t

(14-6)

上面的差分方法称为内含差分法。 对二阶微分方程,我们用如下方法进行差分:

2, 1 , , , 1

2 ( ) /i j i j i j i jf f f ffS

S SS

(14-7)

整理得: 2

, 1 , 1 ,2 2

2i j i j i jf f ff

S S

以上就是偏微分方程的常见离散方法。

14.2 显式有限差分计算法求解欧式看跌期权 下面利用显式法求解欧式看跌期权。对一阶偏导数、二阶偏导数的离散方式如下:

, 1,i j i jf ff

t t

(14-8)

, 1 , 1

2i j i jf ff

S S

(14-9)

2, 1 , 1 ,

2 22i j i j i jf f ff

S S

(14-10)

将式(14-8)、(14-9)、(14-10)代入 B-S 公式有:

, 1, , 1 , 1 , 1 , 1 ,2 2 2,2

212 2

i j i j i j i j i j i j i ji j

f f f f f f frj S j S rf

t S S

(14-11)

经过整理可得: * * *

1, , 1 , , 1, 0,1,2,..., 1; 1,2,3,..., 1i j j i j j i j j i jf a f b f c f i N j M (14-12)

* 2 21 ( )2ja t j rj

216

金融财务建模与计算——基于 VBA 与 MATLAB 实现

* 2 21 ( )jb t j rj

* 2 21 ( )2jc t j rj

将式(14-12)写成矩阵形式: * * *

1 1 11, 1* * *

2 2 21, 2* * *

1, 3 3 3 3

* * *4 4 4

1,2

1,1

0 ... ... ... ... ... 0

0 ... ... ... ... ... 0

0 0 ... ... ... ... 0... 0 0 0 ... ... ... 0

... ... ... ... ... ...

M M MN M

M M MN M

N M M M M

M M M

N

N

c b af

c b af

f c b a

c b af

f

1,

1, 1

1, 2

1,1

* * * 1,01 1 1

...

... ... ... ...

0 0 0 ... ... ... ...

N M

N M

N M

N

N

f

f

f

f

fc b a

* * *1 1 1

* * *2 2 2

* * *3 3 3

* * *4 4 4

* * *1 1 1

0 ... ... ... ... ... 0

0 ... ... ... ... ... 0

0 0 ... ... ... ... 0

0 0 0 ... ... ... 0... ... ... ... ... ... ... ... ... ...

0 0 0 ... ... ... ...

M M M

M M M

M M M

M M M

c b a

c b a

c b a

c b a

c b a

L

( 1) ( 1)M M

则上式可以写成:

1, 1 1,

1, 2 1, 1

1, 3 1, 2( 1) ( 1)

1,2 1,1

1,1 1,0

... ...

N M N M

N M N M

N M N MM M

N N

N N

f f

f f

f f

f f

f f

L

也即: 1N N f Lf

对于欧式看跌期权,其终值条件如下:

( , ) max ,0 0f S T K S S

下面我们考虑欧式看跌期权的边界条件,当股票价格 tS 非常大时,看跌期权到期日价

格为 0, max( , ) 0f t S ;当股票价格为 0 时, tS =0,那么到期日支付价值为 K,贴现到 t

期有 ( )( ,0) e r T tf t K ,边界条件可以写成下面形式:

, 0i Mf i=1,2,…,N ( )

,0 e r N i tif K i=0,1,2,…,N

217

第 14 章 期权定价有限差分计算的 MATLAB 实现

, max ,0N jf K j S j=0,1,2,…,M

例 14-1 已知股票价格为 50 元,欧式看跌期权执行价格为 50 元,到期日为 5 个月,

股票年波动率为 0.3,无风险利率为 10%,试用有限差分方法求解期权价格。 下面是我们用 MATLAB 编写有限差分求解欧式期权的程序,存于 osqq.m 文件中。

s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.3; %股票波动率 T=5/12; %续存期 smax=100; %确定股票价格的最大价格 ds=2; %股价离散步长 dt=5/1200; %时间离散步长 M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 %%%%%%%% matval=zeros(M+1,N+1); vets=linspace(0,smax,M+1); %将区间[0,smax]分成 M+1段 veti=0:N; vetj=0:M; %建立偏微分方程边界条件 matval(:,N+1)=max(k-vets,0); matval(1,:)=k*exp(-r*dt*(N-veti)); matval(M+1,:)=0; %%%%%%%% %确定迭代矩阵系数 a=0.5*dt*(sigma^2*vetj-r).*vetj; b=1-dt*(sigma^2*vetj.^2+r); c=0.5*dt*(sigma^2*vetj+r).*vetj; %%%%%%% L=zeros(M-1,M+1); for i=2:M L(i-1,i-1)=a(i);L(i-1,i)=b(i);L(i-1,i+1)=c(i); end %%%%%%%%%%%%%% for i=N:-1:1 matval(2:M,i)=L*matval(:,i+1); end jdown=floor(s0/ds); jup=ceil(s0/ds); if jdown==jup price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end >> osqq

运行结果如下:

price = 2.8288

218

金融财务建模与计算——基于 VBA 与 MATLAB 实现

14.3 显式有限差分计算法求解美式看跌期权 这里采用与 14.2 节不同的离散方式,显式差分离散方式如下:

1, ,i j i jf ff

t t

(14-13)

1, 1 1, 1

2i j i jf ff

S S

(14-14)

21, 1 1, 1 1,

2 22i j i j i jf f ff

S S

(14-15)

这样差分方程为:

1, , 1, 1 1, 1 1, 1 1, 1 1,2 2 2,2

212 2

i j i j i j i j i j i j i ji j

f f f f f f frj S j S rf

t S S

整理得:

, 1, 1 1, 1, 1i j j i j j i j j i jf a f b f c f (14-16)

2 21 1 1( )1 2 2ja rj t j t

r t

2 21 (1 )1jb j t

r t

2 21 1 1( )1 2 2jc rj t j t

r t

考虑到边界条件:

,0if K ; , 0i Mf ;i=0,1,2,…,N

如果记:

1 1

2 2 2

2 2 2

1 1

0 0 ... ... ... 00 ... ... ... 0

... ... ... ... ... ... ... ...0 0 0 ... ...0 0 0 ... ... ...

M M M

M M

b c

a b c

a b c

a b

L ,

1

0...00

a K

g

对于第 i 个时刻的现金流 Fi,j:

, ,max( , ), , 1,2,..., 1i j i jF K j S f i j M

1 2 1( , ,..., )MF F F F

则式(14-16)可变为: 1i i F LF g

219

第 14 章 期权定价有限差分计算的 MATLAB 实现

例 14-2 已知股票价格为 50 元,美式看跌期权执行价格为 50 元,到期日为 5 个月,

股票年波动率为 0.4,无风险利率为 10%,试用有限差分方法求解期权价格。 我们编制显式有限差分的 MATLAB 程序如下:

s0=50;k=50;r=0.1;sigma=0.4;T=5/12; dt=T/10;ds=5; smax=100; M=round(smax/ds); N=round(T/dt); ds=smax/M; dt=T/N; %%%%%%%% veti=1:N; vetj=1:M; a=1/(1+r*dt)*(-1/2*r*vetj*dt+1/2*sigma^2*vetj.^2*dt); b=1/(1+r*dt)*(1-sigma^2*vetj.^2*dt); c=1/(1+r*dt)*(1/2*r*vetj*dt+1/2*sigma^2*vetj.^2*dt); %%%%%%% L=zeros(M-1,M-1); L(1,1)=b(1);L(1,2)=c(1); L(M-1,M-2)=a(M-1);L(M-1,M-1)=b(M-1); for j=2:M-2 L(j,j-1)=a(j);L(j,j)=b(j);L(j,j+1)=c(j); end %%%%%%%%%%%%%% f1=zeros(M-1,N+1); f1(:,N+1)=max(k-vetj(1:M-1)*ds,0); f0=zeros(M-1,1); f0(1,1)=a(1)*k; for i=N:-1:1 f1(:,i)=L*f1(:,i+1)+f0; for j=1:M-1 if f1(j,i)<=k-vetj(j)*ds; f1(j,i)=k-vetj(j)*ds; end end end f2(1,1:N+1)=50; f2(2:M,1:N+1)=f1; f2(M+1,1:N+1)=0 >> msqq

得到结果如下:

50.0000 50.0000 50.0000 50.0000 50.0000 50.0000 50.0000 50.0000 50.0000 50.0000 50.0000

45.0000 45.0000 45.0000 45.0000 45.0000 45.0000 45.0000 45.0000 45.0000 45.0000 45.0000

40.0000 40.0000 40.0000 40.0000 40.0000 40.0000 40.0000 40.0000 40.0000 40.0000 40.0000

35.0000 35.0000 35.0000 35.0000 35.0000 35.0000 35.0000 35.0000 35.0000 35.0000 35.0000

30.0000 30.0000 30.0000 30.0000 30.0000 30.0000 30.0000 30.0000 30.0000 30.0000 30.0000

220

金融财务建模与计算——基于 VBA 与 MATLAB 实现

25.0000 25.0000 25.0000 25.0000 25.0000 25.0000 25.0000 25.0000 25.0000 25.0000 25.0000

20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000 20.0000

15.0000 15.0000 15.0000 15.0000 15.0000 15.0000 15.0000 15.0000 15.0000 15.0000 15.0000

10.2770 10.2013 10.1279 10.0620 10.0122 10.0000 10.0000 10.0000 10.0000 10.0000 10.0000 6.7557 6.6134 6.4659 6.3097 6.1460 5.9592 5.7474 5.4984 5.2400 5.0000 5.0000

4.2568 4.0818 3.8859 3.6789 3.4398 3.1788 2.8668 2.5266 2.0725 1.5560 0

2.5872 2.3922 2.2105 1.9878 1.7703 1.5028 1.2436 0.8986 0.5895 0 0

1.4787 1.3670 1.1650 1.0227 0.8101 0.2051 0.1426 0 0 0 0

0.3241 0.4574 0.2288 0.2452 0.1004 0.0887 0 0 0 0 0

0.4550 0.0635 0.1957 0.0403 0.0635 0 0 0 0 0 0

-0.1341 0.2046 -0.0036 0.0518 0 0 0 0 0 0 0

0.2824 -0.0475 0.0479 0 0 0 0 0 0 0 0

-0.1067 0.0497 0 0 0 0 0 0 0 0 0

0.0576 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0

可见,在第 11 行第 1 列的期权价格是 4.2568 元。

14.4 隐式有限差分计算法求解欧式看跌期权

下面利用隐式有限差分计算法求解欧式看跌期权。对一阶偏导数、二阶偏导数的离散

方式如下:

1, ,i j i jf ff

t t

(14-17)

, 1 , 1

2i j i jf ff

S S

(14-18)

2, 1 , 1 ,

2 22i j i j i jf f ff

S S

(14-19)

将上面 3 个等式代入 B-S 公式有:

1, , , 1 , 1 , 1 , 1 ,2 2 2,2

212 2

i j i j i j i j i j i j i ji j

f f f f f f frj S j S rf

t S S

(14-20)

整理得:

1, , 1 , , 1i j j i j j i j j i jf a f b f c f (14-21)

2 21 12 2ja rj t j t (14-22)

2 21jb j t r t (14-23)

2 21 12 2jc rj t j t (14-24)

利用矩阵形式改写为:

221

第 14 章 期权定价有限差分计算的 MATLAB 实现

,11 1

,22 2 2

2 2 2 , 2

1 1 , 1

0 0 ... ... 00 ... ... 0

... ... ... ... ... ... ... ...0 0 0 ...0 0 0 ... ...

i

i

M M M i M

M M i M

fb c

fa b c

a b c f

a b f

=

1,1

1,2

1, 2

1, 1

...

i

i

i M

i M

f

f

f

f

1 1,0

1 1,

0...0

i

M i M

a f

c f

,11 1

,22 2 2

2 2 2 ,, 2

1 1 , 1

0 0 ... ... 00 ... ... 0

... ... ... ... ... ... ... , ... ,0 0 0 ...0 0 0 ... ...

i

i

i

M M M i M

M M i M

fb c

fa b c

a b c f

a b f

L f

1 1,0

1 1,

0...0

i

M i M

a f

c f

g

则有: 1i i Lf f g

例 14-3 已知股票价格为 50 元,欧式看跌期权执行价格为 50 元,到期日为 5 个月,

股票年波动率为 0.4,无风险利率为 10%,试用有限差分方法求解期权价格。 下面是我们用 MATLAB 编写的程序:

s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期 smax=100; %确定股票价格的最高价格 ds=0.5; %股价离散步长 dt=5/2400; %时间离散步长 M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 matval=zeros(M+1,N+1); vets=linspace(0,smax,M+1); %将区间[0,smax]分成 M+1段 veti=0:N; vetj=0:M; %建立偏微分方程边界条件 matval(:,N+1)=max(k-vets,0); matval(1,:)=k*exp(-r*dt*(N-veti)); matval(M+1,:)=0; %%%%%%%% %确定迭代矩阵系数 a=0.5*(r*dt*vetj-sigma^2*dt*vetj.^2); b=1+sigma^2*dt*vetj.^2+r*dt; c=-0.5*(r*dt*vetj+sigma^2*dt*vetj.^2); coeff=diag(a(3:M),-1)+diag(b(2:M))+diag(c(2:M-1),1);

222

金融财务建模与计算——基于 VBA 与 MATLAB 实现

[L,U]=lu(coeff) %%%%%%% aux=zeros(M-1,1); for i=N:-1:1 aux(1)=-a(2)*matval(1,i) matval(2:M,i)=U\(L\(matval(2:M,i+1)+aux)); end jdown=floor(s0/ds); jup=ceil(s0/ds); if jdown==jup price=matval(jdown+1,1) else price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end >> yhcf

运行结果如下:

price = 4.0718

14.5 隐式有限差分计算法求解美式看跌期权

同 14.4 节的方法一样,下面我们考虑美式看跌期权的边界条件。 T 时刻看跌期权到期现金流为 max ,0TK S ,其中 TS 为 T 时刻的股票价格,则

, max ,0N jf K j S j=0,1,2,…,M (14-25)

当股票价格为 0 时,看跌期权价格为 K,则

,0if K i=0,1,2,…,N (14-26)

当股票价格趋于无穷大时,看跌期权价格趋于 0,因此我们有近似值:

, 0i Mf i=1,2,…,N

下面考虑美式期权提前执行条件,当计算 ,i jf 时,有

, ,max ,i j i jf f K j S (14-27)

式(14-27)右边 ,i jf 是递推公式结果,左边才是 i 时刻 j 价位的期权价格。

例 14-4 已知股票价格为 50 元,美式看跌期权执行价格为 50 元,到期日为 5 个月,

股票年波动率为 0.4,无风险利率为 10%,试用有限差分方法求解期权价格。 下面是我们用 MATLAB 编写的程序:

s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期 smax=100; %确定股票价格的最高价格

223

第 14 章 期权定价有限差分计算的 MATLAB 实现

ds=0.5; %股价离散步长 dt=5/2400; %时间离散步长 M=round(smax/ds); %计算股价离散步数 N=round(T/dt); %时间离散步数 ds=smax/M; %股价离散实际步长 dt=T/N; %时间离散实际步长 %%%%%%%% %确定迭代矩阵系数 for j=1:M a(j)=0.5*r*j*dt-0.5*sigma^2*j^2*dt b(j)=1+sigma^2*j^2*dt+r*dt c(j)=-0.5*r*j*dt-0.5*sigma^2*j^2*dt end %%%%%%% L=zeros(M-1,M-1); L(1,1)=b(1);L(1,2)=c(1); L(M-1,M-2)=a(M-1),L(M-1,M-1)=b(M-1); for j=2:M-2 L(j,j-1)=a(j);L(j,j)=b(j);L(j,j+1)=c(j) end for j=1:M-1 f(j,N+1)=max(k-j*ds,0) end for i=N:-1:1 F(1)=f(1,i+1)-a(1)*k;F(2:M-1)=f(2:M-1,i+1) f(1:M-1,i)=L^(-1)*F for j=1:M-1 if f(j,i)<k-j*ds f(j,i)=k-j*ds end end end >> yhcf

运行结果如下:

price = 4.07

14.6 Crank-Nicolson 方法求解欧式障碍期权 Crank-Nicolson 方法是内含有限差分与外推有限差分的平均值,是比较精确的一种数值

解法。 内含有限差分方程为:

, 1, 1 1, 1, 1i j j i j j i j j i jf a f b f c f (14-28)

外推有限差分方程为:

224

金融财务建模与计算——基于 VBA 与 MATLAB 实现

* * *1, , 1 , , 1i j j i j j i j j i jf a f b f c f (14-29)

将式(14-28)和式(14-29)相加得: * * *

, 1, 1, 1 1, 1, 1 , 1 , , 1i j i j j i j j i j j i j j i j j i j j i jf f a f b f c f a f b f c f

整理得:

1, 1 1, 1, 1 , 1 , , 1(1 ) (1 )j i j j i j j i j j i j j j i j j i jf f f f f f

2 2( )4jt

j rj

2 2( )2jt

j r

2 2( )4jt

j rj

方程的矩阵形式为: 1

1 2i i M f M f

1 1

2 2 2

1

2 2 2

1 1

1 0 0 ... ... ... 01 0 ... ... ... 0

... ... ... ... ... ... ... ...0 0 0 ... ... 10 0 0 ... ... ... 1

M M M

M M

M

1 1

2 2 2

2

2 2 2

1 1

1 0 0 ... ... ... 01 0 ... ... ... 0

... ... ... ... ... ... ... ...0 0 0 ... ... 10 0 0 ... ... ... 1

M M M

M M

M

T,1 ,2 , 1( , ,..., )i

i i i Mf f f f

考虑欧式下跌出局看跌期权,障碍值为 bS , bS S ,障碍期权的现金流如下:

max( , ) 0, ( , ) 0bf t S f t S

例 14-5 已知股票价格为 50 元,欧式看跌期权执行价格为 50 元,到期日为 5 个月,股

票年波动率为 0.4,无风险利率为 10%,试用有限差分方法求解欧式障碍期权价格。 下面是用 MATLAB 编写的程序:

s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期

225

第 14 章 期权定价有限差分计算的 MATLAB 实现

smax=100; %确定股票价格的最高价格 ds=5; %股价离散步长 dt=5/2400; %时间离散步长 M=round((smax-sb)/ds); %计算股价离散步数 ds=(smax-sb)/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 matval=zeros(M+1,N+1); vets=linspace(0,smax,M+1); %将区间[0,smax]分成 M+1段 veti=0:N; vetj=vets/ds; %建立偏微分方程边界条件 matval(:,N+1)=max(k-vets,0); matval(1,:)=0; matval(M+1,:)=0; %%%%%%%% %建立对角矩阵 alpha=0.25*dt*(sigma^2*vetj.^2-r*vetj); beta=-dt*0.5*(sigma^2*vetj.^2+r); gama=0.25*dt*(sigma^2*vetj.^2+r*vetj); M1=-diag(alpha(3:M),-1)+ diag(1-beta(2:M))-diag(gama(2:M-1),1); [L,U]=lu(M1); M2=-diag(alpha(3:M),-1)+ diag(1+beta(2:M))+diag(gama(2:M-1),1); for i=N:-1:1 matval(2:M,i)=U\(L\(M2*matval(2:M,i+1))); end jdown=floor((s0-sb)/ds); jup=ceil((s0-sb)/ds); if jdown==jup price=matval(jdown+1,1) else price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end >> yhcf

运行结果如下:

price = 0.5414

例 14-6 已知股票价格为 50 元,美式看跌期权执行价格为 50 元,到期日为 5 个月,

股票年波动率为 0.4,无风险利率为 10%,试用有限差分方法求解美式看跌期权价格。 下面是用 MATLAB 编写的程序:

clc;clear; s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期 Sb=40; %Sb是障碍值 smax=100; %确定股票价格的最高价格 ds=0.5; %股价离散步长

226

金融财务建模与计算——基于 VBA 与 MATLAB 实现

dt=T/10; %时间离散步长 N=round(T/dt); %时间离散步数 M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 dt=T/N; %时间离散实际步长 veti=1:M-1; vetj= vetj'; %%%%%%%% alpha=dt/4*(sigma^2*vetj.^2-r*vetj); beta=-dt/2*(sigma^2*vetj.^2+r); gama=dt/4*(sigma^2*vetj.^2+r*vetj); H=diag(alpha(2:M-1),-1)+ diag(beta(1:M-1))+diag(gama(1:M-2),1); M1=eye(M-1)-H;M2=eye(M-1)+H; f=zeros(M+1,N+1); f(1,:)=k; f(M+1,:)=0; f(2:M,N+1)=max(k-vets*ds,0); g=zeros(1,M-1)';g(1)=2*k*alpha(1); for i=N:-1:1 f(2:M,i)=M1^(-1)*[M2*f(2:M,i+1)+g]; f(2:M,i)=max(f(2:M,i),k-vetj*ds); end

运行结果表明:美式看跌期权价格为 4.16 元。

本章小结 本章主要介绍了有限差分方法计算的基本原理;介绍了显式法和隐式法计算欧式看跌

期权价格并编制了 MATLAB 程序;介绍了显式法和隐式法计算美式看跌期权价格并编制了

MATLAB 程序,这为读者快速地进行期权定价计算提供了很好的工具。

第 15 章 期权定价蒙特卡罗模拟

计算的 MATLAB 实现 本章要点

蒙特卡罗模拟方差削减技术。

随机模拟控制变量技术。

编制蒙特卡罗方法模拟欧式、亚式和障碍期权定价的 MATLAB 程序。

蒙特卡罗模拟方法在现代金融财务研究中的应用越来越广,如股票价格的模拟、期权

价格的模拟等。因此,本章将介绍蒙特卡罗模拟方法的 MATLAB 实现。

15.1 蒙特卡罗模拟方差削减技术 蒙特卡罗模拟精度与模拟次数密切相关,模拟次数越多,其精度越高,但是次数增加

又会增加计算量。实践表明减小模拟方差可以提高稳定性,有很多方法可以减小方差,如

对偶变量技术、控制变量技术、分层抽样、矩匹配、条件蒙特卡罗模拟等,但最简单且应

用最广泛的是对偶变量技术和控制变量技术。 对偶变量技术就是先随机抽样得到一组数据,然后以此为基础构造出另一组对偶变量。

下面以正态分布为例介绍对偶变量技术,首先从正态分布变量中随机抽取 N 个样本值,分

别为 ( 1,2,..., )iZ i N ,由此可以得到 N 个模拟值 ( 1,2,..., )iC i N ,那么衍生证券蒙特卡罗模

拟估计值为: 1

CN

1

ˆN

ii

C

以 ( 1,2,..., )iZ i N 为基础,构造对偶随机数 ,i iiZ Z Z 是与 ( 1,2,..., )iZ i N 相互对偶的

随机数。由正态分布性质可知, ( 1,2,..., )i iZ Z i N ,也服从正态分布,由对偶随机数生

成的估计值为:

1C

N

1

N

i

i

C

228

金融财务建模与计算——基于 VBA 与 MATLAB 实现

对 C 和 C 取平均得到新的估计值:

1 ˆ( )2

C C C

1

ˆ12

Ni i

i

C C

N

如果随机抽样的样本 ( 1,2,..., )iZ i N 模拟得到的估计值比较小,那么与之对偶的随机

抽样样本 ( 1,2,..., )i iZ Z i N 得到的估计值可能会偏大,二者的平均值就可能会接近真实

值。如果 ˆcov( ,iC ) 0iC ,那么

ˆ 1 ˆvar( ) var( )2 2

i ii

C CC

1 ˆcov( ,2 iC 1 ˆ) var( )

2i iC C

从上面的不等式可以看出,利用对偶技术可以增加估计稳定性,提高估计精度。

15.2 随机模拟控制变量技术 控制变量技术就是将与所估计的未知变量密切相关的另一个已知量的真实值和估计值

之间的差异作为控制量,以提高估计精度。在定价实践中,将两种衍生证券用相同的随机

抽样样本和时间间隔,实施同样的蒙特卡罗模拟过程,能够得到两个模拟估计值,以第二

种衍生证券真实值与估计值之间的差异作为控制变量,最后得到第一种衍生证券的蒙特卡

罗估计值。 假设 1V 是需要估计的第一种衍生证券的价值, 2V 是价值容易估计的第二种衍生证券的

价值,第一种证券与第二种证券相似,而 1V 2V与 分别是第一种衍生证券和第二种衍生证券

在同样的随机抽样样本下的蒙特卡罗估计值,那么利用控制变量技术得到第一种衍生证券

的价格估计值为: 1

1CV 1V 2 2( )V V

这里 2 2V V 就是控制变量,它实际上是第二种衍生证券的蒙特卡罗模拟的估计误差,

且上述方程的方差之间的关系为: 1

1var( )CV 1var( )V 2var( )V 12cov(V 2, )V

如果 2var( )V 12cov(V 2, )V ,一定有

11var( )CV 1var( )V

因此,当两种衍生证券的协方差很大时,或者当两种衍生证券的价格高度相关时,上

述关系是成立的。两种衍生证券的正相关性越强,估计效率越理想。然而从实际应用的角

度看,这种控制变量技术的应用十分有限。因此,下面是更一般的控制变量技术,其控制

变量的形式为:

1V 1V 2 2( )V V

方差为:

1var( )V 1var( )V 2 var 2( )V 2 cov 1( ,V 2 )V

229

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现

这是关于控制变量系数 的二次三项式,下面的目标是能够找到特殊的 使方差

1var( )V 最小,这时只要取)ˆvar(

)ˆ,ˆcov(

2

21

V

VV 就可以保证方差 1var( )V 最小,这种控制变量技

术的缺点是需要提前知道协方差 1cov( ,V 2 )V 的信息,而这一般需要靠经验实现。

15.3 蒙特卡罗方法模拟欧式期权定价 在期权计算中,可以利用风险中性的方法计算期权的价格。风险中性定价形式如下:

ˆe ( )rTTf E f

其中,f 是期权价格; Tf 是到期日 T 的现金流; E 是风险中性测度。 如果知道了风险中性测度就可以模拟全路径,也可模拟终端价格。例如,计算障碍期

权等路径依赖型期权时可以模拟全路径,而计算欧式期权可模拟终端价格。 如果标的资产服从几何布朗运动:

d d dS S t S W

那么风险中性定价的关键在于寻找风险中性测度,对于几何布朗运动,可以证明风险

中性测度下标的资产运动过程如下: 2

0 exp[( ) ]2TS S r T T

对于欧式看涨期权,到期日欧式看涨期权现金流如下: 2

0max{0, exp[( / 2) ] }S r T T K

其中,K 是执行价格;r 是无风险利率; 是标准差; 是正态分布的随机变量。 对到期日的现金流用无风险利率贴现,就可以知道期权的价格。 例 15-1 假设股票价格服从几何布朗运动,股票现在价格 S=50 元,欧式期权执行价

K=52 元,无风险利率 r=0.1,股票波动率 =0.4,期权到期日 T=5/12,试用蒙特卡罗方法

模拟计算该期权价格。 下面用 MATLAB 编写一个子程序 blsmc 进行计算:

%蒙特卡罗方法模拟计算欧式看涨期权价格 %输入参数 % s0股票价格 % K执行价格 % r无风险利率 % sigma波动率 %Nu模拟次数 %输出参数 %eucall 模拟的欧式看涨期权价格 %varprice 模拟期权价格的方差 %ci 95%概率保证的期权价格区间 function eucall=blsmc(s0,K,r,T,sigma,Nu) randn('seed',0);

230

金融财务建模与计算——基于 VBA 与 MATLAB 实现

nuT=(r-0.5*sigma^2)*T; sit=sigma*sqrt(T); discpayoff=exp(-r*T)*max(0,s0*exp(nuT+sit*randn(Nu,1))-K); [eucall,varprice,ci]=normfit(discpayoff)

在 MATLAB 状态下运行:

>> blsmc(50,52,0.1,5/12,0.4,1000) eucall = 5.4445 varprice = 9.1361 ci = 4.8776 6.0115 ans = 5.4445

从上面的结果可以看到,蒙特卡罗方法模拟得到的期权价格为 5.4445 元,样本正态拟

合的方差为 9.1361,95%的置信区间为[4.8776,6.0115],模拟波动的区间还是很大的。 我们用 normfit 函数对模拟的结果用正态分布函数进行拟合,这不是必须要做的,主要

是为了考察模拟结果的稳定性,如果不需要考察结果是否稳定,也可直接对模拟的结果求

均值,此时可将最后一句改为 price=mean(discpayoff)。欧式期权的公式解如下:

>> blsprice(50,52,0.1,5/12,0.4) ans = 5.1911

公式解 5.1911 和模拟解 5.4445 两者之间存在较大的差距,增加模拟次数到 10 000 次

时结果如下:

>> blsmc(50,52,0.1,5/12,0.4,10000) eucall = 5.1338 varprice = 8.9335 ci = 4.9587 5.3089 ans = 5.1338

模拟结果为 5.1338 元,可以看到期权模拟精度有了显著提高,95%的置信区间为

[4.9587,5.3089],置信区间较 1000 次时大大缩小,模拟可靠性显著增加。 下面用对偶技术计算欧式看涨期权的价格。

function eucall=blsmc1(s0,K,r,T,sigma,Nu) randn('seed',0); nuT=(r-0.5*sigma^2)*T; sit=sigma*sqrt(T); rand=randn(Nu,1); discpayoff=exp(-r*T)*max(0,s0*exp(nuT+sit*rand)-K);

231

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现

discpayoff1=exp(-r*T)*max(0,s0*exp(nuT+sit*-rand)-K); [eucall,varprice,ci]=normfit([discpayoff,discpayoff1]) >> blsmc1(50,52,0.1,5/12,0.4,10000) eucall = 5.1338 5.2851 varprice = 8.9335 8.8712 ci = 4.9587 5.1112 5.3089 5.4589 ans = 5.1338 5.2851

模拟结果为(5.1338+5.2851)/2=5.20945 元,离精确值 5.1911 非常接近,说明对偶技术

是非常有效的。

15.4 蒙特卡罗方法模拟障碍期权定价 障碍期权是特殊形式的期权。例如,确定一个障碍值 Sb,在期权的存续期内有可能超

过该价格,也有可能低于该价格。对于敲出期权而言,如果在期权的存续期内标的资产价

格触及障碍值 Sb 时,期权合同可以提前终止执行;相反地,对于敲入期权而言,如果标的

资产价格触及障碍值 Sb时,期权合同开始生效。注意,障碍值 Sb 可以低于标的资产现在的

价格 S0,也可以高于 S0。如果 Sb>S0,称为上涨期权,反之称为下跌期权。 对于下跌敲出看跌期权,该期权首先是看跌期权,下跌敲出障碍期权相当于在看跌期

权的基础上附加提前终止执行的条款,内容是当股票价格触及障碍值 Sb 时看跌期权就提前

终止执行。因为该期权对于卖方有利,所以其价格应低于看跌期权的价格。 对于下跌敲入看跌期权,同样地该期权首先是看跌期权,下跌敲入障碍期权相当于在

看跌期权的基础上附加何时生效的条款,内容是当股票价格触及障碍值 Sb 时看跌期权开始

生效。综合地看,标准的看跌期权合同可以拆分为两份产品,分别为下跌敲出看跌期权与

下跌敲入看跌期权,用公式表示如下:

di doP P P

其中,P 是标准看跌期权价格; diP 与 doP 分别表示下跌敲入看跌期权与下跌敲出看跌期权

的价格。如果下跌敲出看跌期权提前终止时卖方补偿一些费用给买方,上述公式表示的平

价关系就不再有效。 当障碍值确定时,障碍期权存在公式解,其形式如下:

4 2 7 5exp( ){ ( ) ( ) [ ( ) ( )]}P K rT N d N d a N d N d

0 3 1 8 6{ ( ) ( ) [ ( ) ( )]}S N d N d b N d N d

其中, 0S 是股票价格;Sb 是障碍值;K 是看跌期权执行价格;T 是存续期;r 是无风险利率;

是波动率。其他参数如下: 2b 1 2 /

0( ) rS

aS

,2b 1 2 /

0( ) rS

bS

232

金融财务建模与计算——基于 VBA 与 MATLAB 实现

20

1ln( / ) ( / 2)S K r T

dT

,2

02

ln( / ) ( / 2)S K r Td

T

20 b

3ln( / ) ( / 2)S S r T

dT

,2

0 b4

ln( / ) ( / 2)S S r Td

T

20 b

5ln( / ) ( / 2)S S r T

dT

,2

0 b6

ln( / ) ( / 2)S S r Td

T

2 2b

7ln( / ) ( / 2)SK S r T

dT

,2 2b

8ln( / ) ( / 2)SK S r T

dT

利用上面的公式编写下跌敲出障碍期权价格的程序如下:

Function P=DownOutPut(S0,K,r,T,sigma,Sb) a=(Sb/S0)^(-1+2*r/sigma^2); b=(Sb/S0)^(1+2*r/sigma^2); d1=(log(S0/K)+(r+sigma^2/2)*T)/(sigma*sqrt(T)); d2=(log(S0/K)+(r-sigma^2/2)*T)/(sigma*sqrt(T)); d3=(log(S0/Sb)+(r+sigma^2/2)*T)/(sigma*sqrt(T)); d4=(log(S0/Sb)+(r-sigma^2/2)*T)/(sigma*sqrt(T)); d5=(log(S0/Sb)-(r-sigma^2/2)*T)/(sigma*sqrt(T)); d6=(log(S0/Sb)-(r+sigma^2/2)*T)/(sigma*sqrt(T)); d7=(log(S0*K/Sb^2)-(r-sigma^2/2)*T)/(sigma*sqrt(T)); d8=(log(S0*K/Sb^2)-(r+sigma^2/2)*T)/(sigma*sqrt(T)); P=K*exp(-r*T)*(normcdf(d4)-normcdf(d2)-a*(normcdf(d7)-normcdf(d5)))-S0*

( normcdf(d3)- normcdf(d1)-b*( normcdf(d8)- normcdf(d6)));

例 15-2 我们考虑一个欧式看跌股票期权。股票的价格为 50 元,看跌期权执行价格

为 50 元,无风险利率为 0.1,时间为 5 个月,股票年波动率为 0.4。 首先用 B-S 公式求解如下:

>> [call,put]=blsprice(50,50,0.1,5/12,0.4) call = 6.1165 put = 4.0760

看跌期权价格为 4.076 元。 对于上述的看跌期权,进一步考虑障碍值 Sb=40 元时下跌敲出看跌期权的价格。

>> P=DownOutPut(50,50,0.1,5/12,0.4,40) P = 0.5424

由于该下跌敲出看跌期权提供的条件过于优厚,买方承担了大量风险,作为回报,其

价格较看跌期权便宜许多。 下面用蒙特卡罗方法模拟下跌敲出看跌期权价格,在模拟中我们给出了模拟次数为

NRepl,每次模拟时间分为 NSteps 步离散,障碍值为 Sb,当 btS S 时,其现金流 CashFlow=0。 我们可以先模拟路径,然后让 btS S 路径的现金流为 0,程序如下:

233

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现

%DOPutMc(s0,k,r,T,sigma,sb,NSteps,NRep1) Function [P,aux,CI]=DOPutMc(s0,k,r,T,sigma,sb,NSteps,NRep1) % 输入参数 % s0 股价 % k 执行价 % r 无风险利率 % T 期权存续期 % sigma 标准差 % sb 障碍值 % Nsteps 时间离散数目 % NRep1 路径数目 % 输出参数 % P 期权价格 % CI 95%置信度的价格区间 dt=T/NSteps; nudt=(r-0.5*sigma^2)*dt; sidt=sigma*sqrt(dt); randn('seed',0); rand=randn(NRepl,NSteps); rand1=nudt+sidt*rand; rand2=cumsum(rand1,2) path=s0*exp(rand2); payoff=zeros(NRepl,1); for i=1:NRepl ax=path(i,:); if min(ax)<sb payoff(i)=0; else payoff(i)=max(0,k-ax(NSteps)); end end [P,aux,CI]=normfit(exp(-r*T)*payoff)

10 000 次模拟,运行程序,得到如下结果:

P = 0.5921 aux = 1.6687 CI = 0.5594 0.6248

该期权模拟的价格为 0.5921 元,和前面的公式解 0.5424 元尚存在差距。 20 000 次模拟,运行程序,得到如下结果:

P = 0.5597 aux = 1.6022 CI = 0.5375 0.5819

234

金融财务建模与计算——基于 VBA 与 MATLAB 实现

结果和公式解比较接近,如果将存续期改为 2/12 年,再考虑其他变化,如 NSteps=60,运行程序,得到如下结果:

P = 1.3527 aux = 2.3664 CI = 1.3319 1.3734

从上面运行结果可知,期权价格为 1.3527 元,模拟期权方差为 2.3664,期权 95%置信

区间为[1.3319,1.3734],障碍期权价格较上面的结果增加了很多。

15.5 蒙特卡罗方法模拟亚式期权定价 亚式期权是一种路径依赖型期权,它的收益函数依赖于期权存续期内标的资产的平均

价格。平均价格分算术平均和几何平均两种,离散算术平均价格定义为:

da1

1 ( )n

ii

A S tn

其中, it (i=1,2,…,n)是离散时间样本点。 离散几何平均价格定义为:

1/dg [ ( )] n

iA S t

亚式看涨期权到期现金流为:

1

1max{ ( ) ,0}, , /N

i ii

S t K t i t t T NN

其中,K 是执行价格; ( )iS t 是 it (i=1,2,…,n)时刻的股价。 例 15-3 股票价格为 50 元,亚式看涨期权执行价格为 50 元,存续期为 5 个月,期权

到期现金流是每月均价与执行价格之差,股票波动率为 0.4,无风险利率为 0.1,下面用蒙

特卡罗方法计算该亚式期权的价格。 该期权定价的程序为:

%AsianMC.m %NSteps 时间离散数目 %NRep1 模拟路径数目 % function [P,CI]=AsianMC(s0,k,r,T,sigma,NSteps,NRep1) s0=50;k=50;r=0.1;T=5/12;sigma=0.4;NSteps=5;NRep1=50000; dt=T/NSteps; nudt=(r-0.5*sigma^2)*dt; sidt=sigma*sqrt(dt); randn('seed',0); rand=randn(NRep1,NSteps); rand1=nudt+sidt*rand; rand2=cumsum(rand1,2) %沿列方向逐列累加 path=s0*exp(rand2);

235

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现

payoff=zeros(NRep1,1); for i=1:NRep1 payoff(i)=max(0,mean(path(i,:))-k); end [P,aux,CI]=normfit(exp(-r*T)*payoff)

运行后,得到如下结果:

P = 3.9622 aux = 5.9669 CI = 3.9099 4.0145

这是一个比较粗糙的估计,用控制变量技术提高估计精度,构造如下函数:

0( )

N

ii

Y S t

显然它和收益函数是相关的,而

1 1( ) ( ( )) [ ( )]

N N

ii i

E Y E S t E S i t

( 1)

0 0

1 e(0)e (0) e (0)1 e

r N tN N iir t r tr t

i i

S S S

此外, [ ( ) / (0)] e tE S t S ,这样利用控制变量技术可以将前面的程序改为:

%AsianMCCV.m function[P,CI]=AsianMCCV(S0,X,r,T,sigma,NSamples,NReple,NPilot) TryPath=AssetPaths1(S0,r,sigma,T,NSamples,NPilot); StockSum=sum(TryPath,2); PP=mean(TryPath(:,2:(NSamples+1)),2); TryPayoff=exp(-r*T)*max(0,PP-X); MatCov=cov(StockSum,TryPayoff); c=-Macov(1,2)/var(StockSum); dt=T/NSamples; ExpSum=S0*(1-exp((NSamples+1)*r*dt))/(1-exp(r*dt)); % MC run ControlVars=zeros(NRepl,1); for i=1:NRepl StockPath=AssetPaths1(S0,r,sigma,T,NSamples,1); Payoff(i)=exp(-r*T)*max(0,mean(StockPath(2:(NSamples+1)))-X); ControlVars(i)=Payoff(i)+c*(sum(StockPath)-ExpSum); end [P,aux,CI]=normfit(ControlVars); %%%%%%%%%% function Spaths=AssetPaths1(S0,mu,sigma,T,NSteps,NRepl) dt=T/NSteps; nudt=(mu-0.5*sigma^2)*dt; sidt=sigma*sqrt(dt); Increments=nudt+sidt*randn(NRepl,NSteps);

236

金融财务建模与计算——基于 VBA 与 MATLAB 实现

LogPaths=cumsum([log(S0)*ones(NRepl,1),Increments],2); Spaths=exp(LogPaths);

下面是控制变量的模拟结果:

>> randn('seed',0) >> [P,CI]=AsianMCCV(50,50,0.1,5/12,0.4,5,45000,50000) P = 3.9533 CI = 3.9307 3.9759

根据前面的蒙特卡罗模拟结果:

>>[P,CI]=AsianMC(50,50,0.1,5/12,0.4,5,50000) P = 3.9622 CI = 3.9099 4.0145

可以看出控制变量使得估计的置信区间缩小了。

15.6 蒙特卡罗方法模拟经验等价鞅测度

等价鞅理论是金融衍生品定价的重要方法,衍生品价格就是在等价鞅测度下对衍生品

现金流用无风险利率贴现,可以用下面的方程表示:

0 0e [ | ]rT QTS E S F

其中, 0S 表示股票价格;r 为无风险利率; 0F 表示 0 时刻信息; 0[. | ]QE F 表示等价鞅测度

算子。 Duan 和 Simonate 在 1998 年提出了乘数调整法,该方法可以保证等价鞅性质,当标的

资产服从几何布朗运动时,等价鞅下的资产运动满足下列条件: 2

0 exp[( / 2) ]TS S r T T

其中, ~ (0,1)N ,这样模拟的第 i 条路径为: 2

, 0 ,exp[( / 2) ]i T i TS S r T T

这时可以构造一个等价鞅测度:

,, 0

,

ˆexp ( ) ˆ /

i Ti t

i T

SS S rT

S M

*S (.) 测度实际上是在第 i 条路径的权重上乘以 0 exp( )S rT ,当样本容量趋于无穷大 时有:

( ) *, 0

1

1eM

rTi t

i

S SM

237

第 15 章 期权定价蒙特卡罗模拟计算的 MATLAB 实现

*,i tS 是风险中性测度下的新样本。

例 15-4 假设股票价格服从几何布朗运动,股票现在价格 S=50 元,欧式期权执行价

格 K=52 元,无风险利率 r=0.1,股票波动率 =0.4,期权到期日 T=5/12,试用蒙特卡罗方

法模拟计算该期权价格。 用 MATLAB 编写程序如下:

% function eucall=blsmc(s0,K,r,T,sigma,Nu) s0=50;K=52;r=0.1;T=5/12;sigma=0.4;Nu=1000; %蒙特卡罗经验等价鞅方法 %输入参数 %s0 股票价格 %K 执行价格 %r 无风险利率 % sigma 股票波动率 %Nu 模拟次数 % 输出参数 %eucall 欧式看涨期权价格 %varprice 模拟现金流的方差 %ci 95%概率保证的期权价格区间 %定义随机数发生器种子是 0,这样可以保证每次模拟的结果相同 randn('seed',0); nuT=(r-0.5*sigma^2)*T; sit=sigma*sqrt(T); %期权到期时的现金流 discpayoff=exp(-r*T)*max(0,s0*exp(nuT+sit*randn(Nu,1))-K); disp('蒙特卡罗模拟结果') [eucall,varprice,ci]=normfit(discpayoff) SM=s0*exp(nuT+sit*randn(Nu,1)); SM=s0*exp(r*T)*SM/mean(SM); S1=max(0,SM-K); disp('风险中性下欧式看涨期权结果') [Emscall,varprice,ci]=normfit(S1) disp('欧式看涨期权解析解') blsprice(50,52,0.1,5/12,0.4)

运行结果如下:

蒙特卡罗模拟结果 eucall = 5.4445 varprice = 9.1361 ci = 4.8776 6.0115 风险中性下欧式看涨期权结果 Emscall = 5.4320 varprice = 9.8321 ci =

238

金融财务建模与计算——基于 VBA 与 MATLAB 实现

4.8219 6.0422 欧式看涨期权解析解 ans = 5.1911

从上面的结果可以看出,经验等价鞅定价误差比蒙特卡罗模拟的结果稍有改进。

本章小结 本章主要介绍了蒙特卡罗模拟方差削减技术与随机模拟控制变量技术,编制了蒙特卡

罗方法模拟欧式、亚式和障碍期权定价的 MATLAB 程序,这为读者快速进行期权价格的计

算提供了一个很好的工具。

第 16 章 上市公司信用度量模型

及其 MATLAB 应用 本章要点

信用风险度量模型的因子分析建模。

信用风险度量模型的 BP 神经网络建模。

根据中国资本市场的特点对 KMV 信用风险度量模型进行修正,验证 KMV 模型在

我国的适用性。

目前,无论在国内还是国外,信用风险度量都是人们讨论和研究的热门问题之一。传

统的信用度量方法(如财务因素分析)和手段已经滞后于当今社会的日新月异的新形势,

也不能满足人们对信用风险进行科学量化度量和有效管理的需要。因此,需要建立新的适

用我国信用风险管理水平的度量模型。本章首先以上市公司的财务数据为基础,应用

MATLAB、SPSS 等工具,分别进行信用风险度量模型的因子分析建模和 BP 神经网络建模;

然后根据中国资本市场的特点对信用风险度量的 KMV 模型进行修正,验证该模型在我国

的适应性,从而得到基于市场数据(即股票价格)的动态信用风险度量模型。

16.1 上市公司信用风险度量模型的意义与国内外现状 1.研究意义 近年来,上市公司信用风险度量问题受到了学术界和财务界的广泛关注。作为金融市

场一个重要的领域,证券市场在我国已经发展了 16 年,证券投资方式已经逐渐被社会大众

所接受;但证券市场的不规范现象十分严重,上市公司财务造假、损害金融机构和投资者

利益的情况屡禁不止;上市公司因财务状况异常而被特别处理屡见不鲜。因此,研究公司

信用风险度量模型具有重大的现实意义和理论意义,主要表现在: (1)对于企业管理层而言,建立有效的公司信用风险度量模型,可使企业在陷入困境

之前采取及时有效的措施,防止危机的真正发生; (2)对企业的投资者而言,信用风险度量模型的建立能指导投资者的决策; (3)对于有并购意向的公司而言,信用风险度量模型的建立可为其正确估价目标公司

240

金融财务建模与计算——基于 VBA 与 MATLAB 实现

的整体价值提供参考; (4)对于国家经济管理部门而言,要制定宏观经济政策,调控经济运行,需要掌握企

业的经济等各方面的情况; (5)对于政府管理机构而言,可根据即将陷入财务危机公司的经济地位,提前协调各

方面的关系,从而降低破产成本的支出和因工人失业造成的社会动荡; (6)对于企业员工而言,其经济利益与公司的经营状况紧密相连,通过对公司信用风

险度量模型的研究可对自己工作的安全保障和未来发展的可能做出评价; (7)对于审计企业财务报表的注册会计师而言,建立信用风险度量模型能使其保持更

加高度的警惕,正确处理企业财务报告中可能存在的错误与舞弊; (8)能帮助那些买“壳”或者借“壳”上市的公司搜寻目标。 正是由于建立公司信用风险度量模型的重大作用和所具有的实践价值,研究建立实用

的公司信用风险度量模型已经成为近 40 年来金融财务管理研究领域的一大热点问题。

2.国内外研究综述 国外上市公司信用风险度量模型主要包括以下几类建模方法:统计分析方法、人工神

经网络方法及基于期权理论的方法。 1)统计分析方法(Statistical Analysis) 国外从 20 世纪 60 年代开始,普遍采用了统计分析方法建立信用风险度量模型。Beaver

于 1966 年首先将财务变量的预测功能引入实证领域中,建立了信用风险度量的单变量模

型。Altman 于 1968 年 早将多变量分析方法(MDA)运用于企业信用风险度量模型,但

是多变量判别分析方法建立在自变量为多元正态分布,不存在高度共线性假设的基础上,

同时其配对的两样本协方差矩阵也应相等,实际上经营失败与经营正常的公司之间的协方

差矩阵并不相同。因此,之后的学者采用 Probit 或 Logistic 方法来建立模型,Ohlson 于 1980年首先质疑了以多变量判别分析方法建立的模型,而建议以 Logistic 回归方法建立模型,

其效果较以前学者的研究显著。Colins 和 Green 于 1982 年则证明 Logistic 模型效果较多变

量判别分析模型更佳;Lo 于 1986 年研究发现,若样本数据符合正态分布,则多元判别模

型预测效果高出 Logistic 模型,但如果样本数据不服从正态分布,则 Logistic 模型预测效果

高出多元判别模型,因此,Lo 建议后续研究者在建立模型时,应进行财务指标分布特征检

验。Thedossiou 于 1933 年认为 MDA、Logistic 和 Probit 忽略了前期财务信息的有用性,信

用风险度量模型应包含企业财务状况恶化的动态过程的信息,并在时间序列判别分 析(time-series DA)的框架下运用多元积和时间序列方法(CUSUM),提出了信用风险度

量的 CUSUM 模型,该模型擅长探测财务状况由好转坏的拐点,对财务状况恶化反应敏感

并具有记忆力。Anthoy 于 2001 年运用生存分析预测了存贷机构的财务困境,采用对数

Logistic 分布作为生存时间的概率分布,结果表明预测精度高于 Probit 方法,其对困境定义

和误判成本具有稳健性。 2)人工神经网络方法(Neural Networks,NNs) NNs 于 20 世纪 90 年代初被引入信用风险度量模型研究中,取得了良好的预测/判别精

度结果。NNs 方法有 4 个重要环节影响模型的结果:学习算法,网络结构,合适的数据及

训练网络的方法。 (1)学习算法分有监督学习算法和无监督学习算法,无监督学习算法主要用自组织图

241

第 16 章 上市公司信用度量模型及其 MATLAB 应用

(self-organizing map),Shah 于 2002 年基于群聚程序(clustering procedure)开发了无监督

学习的 NNs 预测企业破产;而有监督学习算法一般选用反向传播算法(back-propagation)。 (2)在网络结构方面,目前还没有理论来解决 NNs 方法本身如何优化网络结构,由于

网络结构无法固定,Altman 于 1994 年曾指出与统计方法相比,NNs 更是一种黑箱方法。 (3)在数据和预测变量方面,NNs 相对统计方法的优势在于能够同时处理定性变量和

定量变量,而且无须考虑变量之间的统计关系,但可能造成结果相近的模型选用的变量大

不相同而难以理解。 (4)在网络结构训练方面,目前也没有合适的尺度衡量重复训练的次数,过多的重复

训练次数将使网络对样本数据产生过度适应,反而失去了跨样本的预测能力。 在 NNs 的预测结果中,普遍显示Ⅱ类错误高于Ⅰ类错误,与统计方法相反,因此更适

合识别非困境企业。在预测的稳健性方面,往往以大大超出传统统计方法的样本量和变量

数据为基础,而预测精度在不考虑误判成本的情况下却没有实质上的改进。由于Ⅱ类错误

的成本远远低于Ⅰ类错误,而且 NNs 不易构造也不易理解,但综合来看,NNs 基本优于统

计方法。 3)基于期权理论的方法(Methods based on Theories of Options) Merton 模型是一种基于期权方法、盯住市场的信用风险度量模型的经典代表。它将股

权和债权都看成是对公司资产的一种或有要求权,公司是否对债务违约取决于公司资产价

值的波动,在债务到期时,如果公司的资产价值低于某个临界值(boundary value),股东就

会执行看跌期权,公司对债务违约,将公司的资产转给债权人,作为债务的偿还。这个思

想对公司违约做出了一个现代金融学意义上的开创性的、经典的、优雅简洁的解释,为公

司的信用风险度量、信用风险定价打开了新的思路。后来著名的信用风险度量模型,

J.P.Morgan 的 CreditMetrics 模型和 Moody 公司的 KMV 模型都是在这个经典的基础上发展

起来的。CreditMetrics 模型的建立有很多参数需要确定,如等级迁移矩阵、资产之间的相

关系数、远期收益率等,这些参数来自长时期实际情况的积累,所以在中国建立这个模型

还不现实。KMV 模型是根据公司股价和股票收益率的波动率计算违约距离来建立动态、实

时的模型,它与仅依据财务数据来建立模型相比具有明显的优势。 20 世纪 90 年代中后期至今,我国学者在公司信用风险度量模型研究方面起步较晚,

但也取得了一些成果。厦门大学(吴世农等)、上海财经大学(张鸣、陈静等)、清华大

学(陈晓等)、上海交通大学(吴冲锋等)、西安交通大学(杨淑娥等)、天津大学(王春

峰等)、吉林大学(吕长江等)、天津财经大学(张维等)等单位的研究人员发表了一系

列的研究成果。 国内 早陈静于 1999 年采用单变量模型分析了我国证券市场的非 ST 和 ST 企业的部

分财务指标。吴世农于 2001 年在分析我国上市公司时,应用 Fisher 线性判别分析、多元线

性回归分析和 Logistic 回归分析三种方法,结果表明相对同一信息集而言,Logistic 模型的

效果 好。吕长江于 2004 年对公司的财务状况进行了实证研究,结果表明营利能力、资产

负债率、公司规模对陷入财务危机和破产的公司有显著影响。朱顺泉于 2002 年应用熵值法

对公司财务指标进行赋权,运用构建的模糊中和评价模型对上市公司财务状况进行了合理

的评价。近几年,NNs 及其改进方法也已经有了部分研究成果,随着研究的不断深入,也

涌现出了诸如考虑主观决策因素、时间的动态性、方法组合等方面的信用风险度量模型的

242

金融财务建模与计算——基于 VBA 与 MATLAB 实现

研究。基于期权理论的研究相对较少,李秉祥、叶庆祥等的研究通过实证分析表明 Merton模型对我国资本市场有一定的适应性和应用前景;而薛锋等根据中国股权分置的现实情况

对 KMV 模型进行了修正,并证明了公司违约行为给投资者造成的损失与违约距离具有较

强的相关性,但并不是简单的正相关。目前各种模型深入改进的障碍在于证券市场的数据

质量问题,就建模技术来讲,与国外的差距已日益缩小。

3.目前研究中存在的问题 然而,从企业对信用风险度量模型的迫切需求来看,目前人们对信用风险度量模型的

研究深度和广度还远远不够,这主要表现在: (1)国内在这方面的研究成果较多,但缺乏统一的理论基础和指导思想,因此出现了

“百家争鸣”的状况,学术界没有一致的认识也阻碍了模型在实践中的应用。因此,有必要

建立一个有坚实的理论基础而且判别精确度高的信用风险度量模型。 (2)目前,国内学者认为信用风险与企业盈亏有着必然的联系,在建立模型时只采用

损益表及资产负债表的相关财务比率,这些都很少考虑能够直接影响企业周转能力的现金

流量指标,而实践证明,信用风险与盈亏并无必然联系。因此,模型的可靠性很难得到保

证,故指标的选择宜采用传统财务指标和现金流量相结合的方法。 (3)基于期权理论为基础的 KMV 模型虽然在国外的应用十分广泛而且比较成功,但

该模型在国内资本市场的适应性方面的研究成果还相对较少,现有的研究大多是针对单个

公司进行分析,不具有普遍性。 因此,有必要在继承和综合国内外现有研究成果的基础上,针对上述问题,研究并提

出一套比较完整的信用风险度量理论、方法和模型。

4.研究目的 (1)提出基于传统财务比率与现金流量指标相结合的上市公司信用风险度量模型。 (2)研究上市公司信用风险控制的一般规律,研究现代信用风险量化度量的标准。 (3)以因子分析、神经网络、期权定价等理论为指导,改进传统的信用分析方法,探

讨新型的上市公司信用风险度量模型。 (4)分别以财务数据和市场数据为基础,建立上市公司信用风险度量模型,为上市公

司的管理决策提供客观的评价标准。

16.2 基于财务数据的上市公司信用风险度量模型研究

20 世纪 80 年代以来,随着金融的全球化趋势及金融市场的波动性加剧,各国银行和

投资者受到了前所未有的信用风险的挑战。公司会计报表分析是对信用风险进行判别的传

统、有效的手段。《证券法》规定国内上市公司必须每个季度、半年、一年向社会公布三大

会计报表。本章将利用上市公司公开的会计报表中的财务指标计算财务比率,然后分别通

过统计方法和神经网络方法建立信用风险度量模型。

16.2.1 信用风险的界定及样本的选取 在实际操作中,关于信用风险的界定国内外有很多不同观点。在 Beaver 的研究中,78

家发生信用风险的公司包括 59 家破产公司、16 家拖欠优先股股利公司和 3 家拖欠债务的

243

第 16 章 上市公司信用度量模型及其 MATLAB 应用

公司,即 Beaver 把破产、拖欠优先股股利、拖欠债务用来界定发生信用风险。Altman 于

1968 年定义的财务困境是“进入法定破产的企业”。Deakin 于 1972 年认为发生信用风险

的公司“仅包括已经破产、无力偿还债务或为债权人利益而已经进行清算的公司”。

Carmichael 于 1972 年认为发生信用风险是企业履行义务时受阻,具体表现为流动性不足、

权益不足、债务拖欠及流动资金不足四种形式。Foster 于 1986 年将发生信用风险定义为“除

非对经济实体的经营或结构实行大规模重组否则就无法解决的严重变现问题”。谷祺和刘

淑莲于 1999 年将发生信用风险定义为“企业无力支付到期债务或费用的一种经济现象,包

括从资金管理技术性失败到破产以及处于两者之间的各种情况。由于资金管理技术性失败

而引发的支付能力不足,通常是暂时的、比较次要的困难,一般可以采取一定的措施加以

补救,如通过协商,求得债权人让步,延长偿债期限,或通过资产抵押等借新债还旧债”。

由于有研究结果表明我国的资本市场目前仍处于弱式有效市场,信息的不对称导致尚无一

种客观的评判标准,故对我国上市公司信用风险的界定主要是依据证监会定义的 ST 企业,

被证监会认定的 ST 公司(包括*ST 公司,下同)为发生信用风险的公司,而非 ST 公司为

正常公司。 1998 年 3 月 16 日,中国证监会颁布了《关于上市公司状况异常期间的股票特别处理

方式的通知》,证监会定义 ST 的 A 股上市公司的依据有: (1) 近两个会计年度的审计结果显示的净利润为负值; (2) 近一个会计年度的审计结果显示其股东权益低于注册资本,即每股净资产低于

股票面值; (3) 近一个会计年度的财务报告被注册会计师出具无法表示意见或否定意见的审计

报告; (4) 近一个会计年度经审计的股东权益扣除注册会计师、有关部门不予确认的部分,

低于注册资本; (5) 近一份经审计的财务报告对上年度利润进行调整,导致连续两个会计年度亏损。 我们将选取 2000—2004 年我国 A 股上市公司的 t2 年截面财务数据作为研究的样本,

其中建模样本(训练样本)见附录 1,预测样本见附录 2。数据来源:CSMAR 系列研究数

据库。 (1)之所以不考虑用 t1 年的财务报告数据来预测上市公司 t 年的状态,是因为我国上

市公司的年报披露制度决定了这样一个事实:上市公司在 t 年是否被 ST 是由其 t1 年财务

报告的公布所决定的。因此,t1 年预测模型即使有提高的预测精度,在实际预测中也没有

太大的应用价值。 (2)因为 2005 年至今我国资本市场一直在进行股权分置改革,2005—2006 年已经进

行股改的上市公司公布的财务数据都有很大的调整。 (3)考虑行业因素的影响,尽量选取制造业和综合业务的上市公司。 (4)我国 A 股上市公司资料较完整。根据规定,A 股上市公司执行国内的会计准则和

会计制度,由国内的会计师事务所审计;B 股上市公司采用国际会计准则,由外资会计师

事务所审计。这两种会计制度和审计制度所计算出来的业绩及其他相关资料有很大的偏差,

从而导致了 B 股公司财务资料和 A 股公司财务资料的不可比,不能将其简单地堆砌在一起

作为实证研究的对象。

244

金融财务建模与计算——基于 VBA 与 MATLAB 实现

16.2.2 财务比率的选取 1.财务比率的定性分析 由于缺乏具体的经济理论指导,而公司被 ST 的本质原因又不尽相同,所以很难用简

单的几个财务比率对财务困境进行充分描述。因此,在研究过程中选取尽可能多的财务比

率,这些不同的财务比率反映着企业不同的财务侧面,下面分别对选取的 4 个方面 14 个财

务比率做定性分析。 1)偿债能力 偿债能力是指企业清偿到期债务的现金保障程度。偿债能力分为短期偿债能力和长期

偿债能力,短期偿债能力是指企业用流动资产偿还流动负债的现金保障程度,取决于流动

资产、流动负债的多少和质量。流动资产的质量是指其“流动性”,即转换成现金的能力,

包括是否能不受损失地转换为现金以及转换需要的时间。 通常认为反映公司短期偿债能力的指标主要有:流动比率、速动比率和营运资本占总

资产比率。而反映企业长期偿债能力的指标有:股东权益比率和利息保障倍数等。 (1)流动比率=流动资产/流动负债。流动资产越多,流动负债越少,则短期偿债能力

越强。如果用流动资产偿还流动负债,企业剩余的是营运资金,营运资金越多,说明不能

偿还短期债务的风险越小。因此,营运资金的多少可以反映偿还短期债务的能力。但是,

营运资金是流动资产与流动负债之差,是个绝对数,如果企业之间规模相差很大,绝对数

相比的意义很有限。而流动比率是流动资产和流动负债的比值,是个相对数,排除了企业

规模不同的影响,更适合企业之间以及本企业不同历史时期的比较。 (2)速动比率=(流动资产存货)/流动负债。从速动比率的计算公式可以看出,它是

指从流动资产中扣除存货部分,再除以流动负债的比值。为什么要把存货从流动资产中剔

除呢?主要原因为: ① 在流动资产中存货的变现速度 慢; ② 由于某种原因,部分存货可能已损失报废还没做处理; ③ 部分存货已抵押给某债权人; ④ 存货估价还存在成本与合理市价相差悬殊的问题。 因此,在不希望企业用变卖存货的办法还债,以及排除使人产生种种误解因素的情

况下,把存货从流动资产总额中减去而计算出的速动比率反映的短期偿债能力更加令人

信服。 (3)营运资本占总资产比率=(流动资产流动负债)/资产总额。前面在分析流动比率

指标的时候,讲到营运资金的多少可以反映偿还短期债务的能力,但是它是一个绝对数,

受企业规模影响较大,而将营运资金除以资产总额可以消除企业规模的影响,形成一个可

比较的财务比率。 (4)股东权益比率=股东权益/资产总额=1资产负债率。这个指标反映企业所有者提供

的资本占全部资本的比例,分析这一指标需要从公司不同的利益相关者的角度来看: ① 从债权人的角度看,他们 关心的是能否按期收回本金的利息,他们希望债务比例

越低越好,企业偿债有保证,贷款不会有太大的风险。

245

第 16 章 上市公司信用度量模型及其 MATLAB 应用

② 从股东的角度看,由于企业通过举债筹措的资金与股东提供的资金在经营中发挥

同样的作用,在企业所得的全部资本利润率超过因借款而支付的利息率时,股东所得到

的利润就会加大。他们希望在全部资本利润率高于借款利息率时,负债比例越大越好,

否则反之。 ③ 从经营者的角度看,如果举债很大,超出债权人心理承受程度,企业就借不到钱。

如果企业不举债,或负债比例很小,说明企业畏缩不前,对前途信心不足,利用债权人资

本进行经营活动的能力很差。 从财务管理的角度来看,企业应当审时度势,全面考虑,在利用资产负债率制定借入

资本决策时,必须充分估计预期的利润和增加的风险,在两者之间权衡利害得失。 (5)利息保障倍数=EBIT/利息费用。利息保障倍数也称已获利息倍数,是指企业生产

经营所获得的息税前利润与利息费用的比率。它是衡量企业偿付负债利息能力的指标。企

业生产经营所获得的息税前利润相对于利息费用的倍数越多,说明企业支付利息费用的能

力越强。因此,债权人要分析利息保障倍数指标,以衡量债权的安全程度。 2)资产管理能力 资产管理能力是指企业生产经营资金周转速度的有关指标所反映出来的企业资金利用

的效率,它表明企业管理当局资产管理效率的高低。企业生产经营资金周转的速度越快,

表明企业资金利用的效果越好,效率越高,企业管理人员的经营管理能力越强。 资产管理能力的衡量指标常用的有:应收账款周转率、存货周转率和总资产周转率等。 (1)应收账款周转率=主营业务收入/平均应收账款。应收账款周转率反映应收账款的

变现速度及其管理效率。周转率高,表明企业收账迅速,账龄期限较短,可以降低收账费

用和坏账损失,从而相对增加企业流动资产的投资收益。当然,周转率太高,也不利于企

业扩大销售,提高产品市场占有率。企业应加强对应收账款的管理,管理的目标应是在发

挥应收账款强化竞争、扩大销售的同时,尽可能降低应收账款投资的机会成本、坏账损失

与管理成本。 (2)存货周转率=主营业务成本/存货平均余额。存货周转率是评价企业从取得存货,

投入生产到销售收回等各个环节管理状况的综合性指标。存货是流动资产中 重要的组成

部分之一,它不仅金额比重大,而且增值能力强。因此,存货周转速度的快慢,不仅反映

出企业采购、储存、生产、销售各环节管理工作的好坏,而且直接影响到企业的偿债能力

及获利能力。一般来说,存货周转率越高,则存货积压的风险就越小,资金使用效率就越

高。相反,存货周转率低,说明企业在存货管理上存在较多问题。 (3)总资产周转率=主营业务收入/资产总额。总资产周转率是综合评价企业全部资产

经营质量和利用效率的重要指标,它反映出企业单位资产创造的销售收入净额,体现出企

业在一定期间全部资产从投入到产出周而复始的流转速度,全面反映企业全部资产的管理

质量和利用效率。一般来说,总资产周转率越高,表示企业资产经营管理得越好,取得的

销售收入就越多,资产的利用效率就越高,周转速度就越快。 3)营利能力 营利能力是反映上市公司价值的一个重要方面,是指企业获取利润的能力。营利能力

越强,股东获得的回报越高,该上市公司的投资价值就越大。不论是投资者、债权人还是

企业经理人员,都日益重视和关注企业的营利能力。

246

金融财务建模与计算——基于 VBA 与 MATLAB 实现

一般来说,企业的营利能力只涉及正常的营业状况。非正常的营业状况,也会给企业

带来收益或损失,但只是特殊状况下的个别结果,不能说明企业的能力。因此,在分析企

业营利能力时,应当排除:证券买卖等非正常项目、已经或将要停止的营业项目、重大事

故或法律更改等特别项目、会计准则和财务制度变更带来的累积影响等因素。 反映企业营利能力的指标很多,通常使用的主要有总资产净利润率、主营业务收入增

长率、权益净利润率等。 (1)总资产净利润率=净利润/资产总额。总资产净利润率是把企业一定期间的净利与

企业的资产相比较,可反映企业资产利用的综合效果。指标越高,表明资产的利用效率越

高,说明企业在增加收入和节约资金使用等方面取得了良好的效果,否则相反。这是一个

综合性指标,企业的资产是由投资者投入或举债形成的。为了正确评价企业经济效益的高

低,挖掘提高利润水平的潜力,可以用该指标与本企业前期、与计划、与本行业平均水平

和与本行业内先进企业进行对比,分析形成差异的原因。 (2)主营业务收入增长率=(本年年末主营业务收入上年年末主营业务收入)/上年年

末主营业务收入。主营业务收入增长率可以用来衡量公司的产品生命周期,判断公司发展

所处的阶段。一般来说,如果主营业务收入增长率超过 10%,说明公司产品处于成长期,

将继续保持较好的增长势头,尚未面临产品更新的风险,属于成长型公司。如果主营业务

收入增长率在 5%~10%之间,说明公司产品已进入稳定期,不久将进入衰退期,需要着

手开发新产品。如果该比率低于 5%,说明公司产品已进入衰退期,保持市场份额已经很

困难,主营业务利润开始滑坡,如果没有已开发好的新产品,将步入衰落。 (3)权益净利润率(ROE)=净利润/权益总额。在评价企业财务状况和经营成果的综

合指标中,权益净利润(或称股东权益报酬率)是一个综合性极强、 具代表性的财务比

率,它反映股东投入资金的获利能力、企业价值(股东财富) 大化的公司目标追求。它

同时也是著名的财务报表分析方法“杜邦分析体系”的核心指标。 4)现金流动能力 洪森于 2002 年认为,现金流量指标比传统应计制下的利润指标更重要。会计学研究的

对象是社会再生产条件下的资金运动,在现实经济生活中,企业的倒闭不完全取决于赢利

水平。换句话说,以权责发生制和历史成本原则为基础,所核算的资金运动和会计赢利,

不能真实地揭示企业的财务状况和风险。企业能否维持,不是取决于赢利水平的高低,而

是取决于现金流量的大小。现金流是财务预警的对象和内容,其优越性主要体现在以下几

个方面: ① 现金流比利润更真实地反映了企业的收益质量。收益质量是指报告收益与公司业绩

之间的相关性。如果收益能如实反映公司的业绩,则认为收益质量好;如果收益不能很好

地反映公司业绩,则认为收益质量较差。现金流比利润更能说明企业的收益质量。以会计

权责发生制为基础的账面利润与账面成本难以真实反映企业的现金性收益与现金性支出。

由于应收账款的存在及人为夸大利润或缩小利润,根据权责发生制确定的利润指标在反映

企业的收益方面确实容易导致一定的“水分”。多年的实证研究表明,按照应计制编制的

资产负债表和利润表 容易被管理者所粉饰,因此上市公司利润指标含金量差异很大。而

现金流指标,恰恰弥补了权责发生制在这些方面的不足,按照收付实现制编制的现金流量

表被人为粉饰的可能性很小,这也是西方国家非常重视现金流量分析的原因。所以,关注

247

第 16 章 上市公司信用度量模型及其 MATLAB 应用

现金流指标,甩干利润指标中的“水分”,重点考察企业经营活动中现金流的情况,才能

使投资者和债权人能更充分、全面地认识企业的财务状况,评判企业的赢利质量,确定企

业创造的真实价值。 ② 现金流能更好地反映企业的偿债能力。在国外破产倒闭的企业中有 85%的企业是赢

利情况非常好的企业。这些企业虽有大量的流动资产,但现金支付能力却很差,甚至无力

偿债, 终破产清算。传统的根据资产负债表确定的流动比率虽然在一定程度上反映了企

业的流动性,但却有很大的局限性。其主要表现为,作为流动资产主要部分的存货并不能

很快变为可偿债的现金;存货用成本计价而不能反映变现净值;流动资产中的待摊费用并

不能转变为现金。同样的,速动比率可信性的重要因素是应收账款的变现能力,而账面上

的应收账款不一定都能变成现金,如果应收账款的金额过大或质量较差,那么即使速动比

率保持在 1∶1 左右,也不能说明企业的短期偿债能力强,相反企业的短期偿债能力可能较

低,但是却给投资者、债权人传递了错误的信息。从偿债能力的角度看,毫无疑问,现金

流量指标比传统的权责发生制下的指标更具有说服力。 ③ 现金流有助于评价企业的财务弹性。财务弹性是指企业适应经济环境变化和利用投

资机会的能力,也叫财务适应能力。这种能力来源于现金流量和支付现金需要的比较。当

企业的现金流量超过支付现金的需要,有剩余的现金时,企业适应性就强。因此,通常用

经营现金流量与支付要求(指投资需求或承诺支付等)进行比较来衡量企业的财务弹性。

通过现金流量信息可以了解企业适应经济环境变化的能力,而这一信息从传统的权责发生

制下的指标是无法获得的。 ④ 现金流在一定程度上提高了企业之间会计信息的可比性。传统的利润指标由于受会

计政策、会计估计方法的影响而有所差异,不同企业的利润指标因口径不一致而不具有可

比性。现金流量的估价方法以收付实现制为基础,排除了权责发生制和配比原则等传统会

计方法的估计因素,剔除了各企业对同样交易和事项采用不同会计处理方法所造成的影响,

从而使不同企业所报告的经营业绩具有更高的可比性。 ⑤ 现金流量有助于评价上市公司未来获取现金的能力,为投资者做出正确的投资决策

提供信息。企业的现金流量分为经营活动产生的现金流量、投资活动产生的现金流量、筹

资活动产生的现金流量。这三个方面可以反映一定时期内企业现金流量的总体情况,以及

企业的经营状况。经营活动产生的现金流量反映了在不依靠外部融资的情况下企业通过自

身经营活动获得现金的能力;投资活动产生的现金流量反映了企业在投资活动中所发生的

现金流入量和现金流出量;筹资活动产生的现金流量则代表了企业筹集资金及筹资成本的

有关情况。通过对现金流指标分析可以得出企业未来获取或支付现金的能力,从而帮助投

资者分析企业未来股价的走势、股利的分配,以及对上市公司财务状况进行综合评价,为

投资决策提供实用信息。 (1)现金流量对负债比率=经营活动现金净流量/流动负债总额。该指标说明企业通过

经营活动所获得的现金净流量可以用来偿还现时债务的能力。比率越大,说明企业流动性

越大,短期偿债能力越强;反之,则说明企业流动性越小,短期偿债能力越弱。该指标中

的分子,也可以用现金净流量代替,但用经营活动现金净流量较好。这是因为,企业偿债

能力的基础或根本保障是经营活动所带来的经营成果。如果经营活动的现金净流量长期偏

低,而偿还债务的资金主要来源于筹资活动所带来的现金流入或投资收回的现金流入,企

248

金融财务建模与计算——基于 VBA 与 MATLAB 实现

业必将面临财务危机。 (2)主营业务收入现金比率=经营活动现金净流量/主营业务收入。该指标反映了每元

销售得到的现金多少,既可反映公司生产的商品在市场上的畅销程度,又从另一个侧面体

现了公司管理层的经营能力。该指标的比率越大越好,类似于权责发生制下的主营业务利

润率。 (3)经营现金净流量比率=经营活动现金流入量/总现金流入量。这一指标反映了现金

流入结构,在全部现金流入中,经营活动、投资活动和筹资活动三类活动都会带来现金,

经营活动的现金流入应当占有大部分的比例,特别是其主营业务活动流入的现金应明显高

于其他经营活动流入的现金。 目前,国内学者认为信用风险与企业盈亏有着必然的联系,在建立模型时只采用损益

表及资产负债表的相关财务比率,都很少考虑能够直接影响企业周转能力的现金流量指标,

而实践证明,信用风险与盈亏并无必然联系。因此,模型的可靠性很难得到保证,故指标

的选择宜采用传统财务指标和现金流量相结合的方法。

2.财务比率的定量分析 为了分析上述财务比率能否有效区别 ST 公司和非 ST 公司,下面用统计软件 SPSS 对

选定的样本的各个财务比率分别进行样本描述性统计、方差 F 检验和单变量的 T 检验,检

验结果如表 16-1 所示。 (1)若 F 检验(Levene’s 检验)的显著性概率 p 大于 0.05,则说明 ST 公司和非 ST 公

司该财务比率的方差没有明显差异。从表 16-1 可以看到,流动比率、营运资本占总资产比

率、股东权益比率、利息保障倍数和经营现金净流量比率 5 个指标的方差没有明显差异,

通过同方差假设检验,而其他 9 个指标的方差存在明显差异。 (2)对于前面通过同方差假设检验的 5 个财务指标,在观察 T 检验的值时应该用标记“同

方差”一行的结果。当 t 统计量的显著性(双尾)概率 p>0.05 时,则接受同均值假设,即 ST公司和非 ST 公司该财务比率的平均效果没有明显差异。从表 16-1 可以看到,流动比率、速

动比率、股东权益比率、利息保障倍数、总资产周转率、总资产净利润率、主营业务收入增

长率和现金流量对负债比率 8 个财务指标的均值具有显著差异,可以对上市公司将来是否会

发生信用风险有较大的解释作用,因此把这 8 个财务指标作为建模的原始变量。 (3)在短期偿债能力方面,ST 公司不如非 ST 公司,流动比率和速动比率都通过了置

信度为 5%的显著性检验。 (4)在 5%的显著水平上,非 ST 公司的股东权益比率高于 ST 公司,表明平均而言 ST

公司的债务负担要比非 ST 公司重,在总资产报酬率低于负债利息率时,这一比率过高容

易加速公司财务恶化,增加其破产的可能性。 (5)虽然两类公司在存货周转率和应收账款周转率方面并没有表现出差异,但 ST 公

司的应收账款周转率明显低于非 ST 公司,而且两者在总资产周转率方面表现出了明显的

差异(p =0. 006),说明 ST 公司的信用政策及其他资产管理方面不如非 ST 公司。 (6)ST 公司的营利能力明显不如非 ST 公司,在衡量营利能力的 3 个财务指标中,ST

公司均低于非 ST 公司,其中总资产净利润率和主营业务收入增长率两个财务指标表现尤

为突出,通过了置信度为 5%的显著性检验。 (7)在现金流指标方面,现金流量对负债比率和主营业务收入现金比率比较显著,只

249

第 16 章 上市公司信用度量模型及其 MATLAB 应用

有现金流量对负债比率通过了置信度为 5%的显著性检验,而经营现金净流量比率指标没有

显著差异,说明 ST 公司与非 ST 公司的现金流入结构并不存在很大差别。

表 16-1 样本描述性统计、方差 F检验和单变量的 T检验结果

均 值 标 准 差 方差 F 检验 T 检 验

财务比率 ST 非 ST 非 ST ST 假设 F p t p

流动比率 1.2120 1.4375 0.67208 0.47532 同方差 3.817 0.053 2.049 0.043

异方差 2.049 0.043

速动比率 0.8921 1.0789 0.55699 0.39975 同方差 6.896 0.010 2.038 0.044

异方差 2.038 0.044

营运资本占总资产比率 0.0693 0.1128 0.16671 0.17795 同方差 0.110 0.741 1.336 0.184

异方差 1.336 0.184

股东权益比率 0.4764 0.5342 0.13987 0.12610 同方差 0.526 0.470 2.299 0.023

异方差 2.299 0.023

利息保障倍数 3.0454 5.8501 12.02969 6.65140 同方差 0.176 0.676 4.843 0.000

异方差 4.843 0.000

应收账款周转率 10.5287 18.6822 48.39451 18.75216 同方差 4.151 0.044 1.176 0.242

异方差 1.176 0.244

存货周转率 3.4387 8.3828 18.36192 4.89231 同方差 6.227 0.014 1.947 0.054

异方差 1.947 0.056

总资产周转率 0.3140 0.5792 0.65736 0.23922 同方差 6.316 0.013 2.836 0.005

异方差 2.836 0.006

总资产净利润率 0.0623 0.0236 0.03353 0.09188 同方差 21.811 0.000 6.567 0.000

异方差 6.567 0.000

权益净利润率 0.0648 0.0519 0.06065 0.49443 同方差 38.361 0.000 1.754 0.082

异方差 1.754 0.085

主营业务收入增长率 0.1456 0.2481 0.46829 0.22361 同方差 11.789 0.001 5.678 0.000

异方差 5.678 0.000

现金流量对负债比率 0.0141 0.1293 0.21802 0.16075 同方差 4.855 0.030 3.964 0.000

异方差 3.964 0.000

主营业务收入现金比率 0.0974 0.0635 0.21961 0.58552 同方差 7.475 0.007 1.925 0.057

异方差 1.925 0.058

经营现金净流量比率 0.5562 0.5946 0.21905 0.22294 同方差 0.012 0.912 0.919 0.360

异方差 0.919 0.360

16.2.3 上市公司信用风险度量模型的因子分析建模及其实证研究 1.研究方法 因子分析(Factor Analysis)是多元统计分析的一个重要分支。主要目的是浓缩数

据,通过对诸多变量的相关性研究,可以用假想的少数几个变量来表示原来变量的主

要信息。

250

金融财务建模与计算——基于 VBA 与 MATLAB 实现

因子分析 初是由英国心理学家 C. Spearman 提出的。1904 年他在美国心理学刊物上,

发表了第一篇有关因子分析的文章。以后逐步发展完善。20 世纪 50 年代以来,由于计算

机的发展,因子分子在社会学、经济学、管理学、医学、地质学、气象学中得到较为广泛

的应用。下面具体介绍因子分析的数学原理,现在有数据矩阵 k nX (k<n):

对象: 1, 2, …,n

11 12 11

21 22 22

1 2

...

...... ... ... ...

...

n

n

k k knk

x x x

x x x

x x x

指标

指标

...

指标

X

X

X

所面临的因子分析的(样本观察值的)数学模型是:

x1=a11f1+a12f2+…+a1mfm+e1 …

xk=ak1f1+ak2f2+…+akmfm+ek

式中,m<k,fj是公共因子(Common Factors),它们之间是两两正交的;ei 是特殊因子(Unique Factors),只对相应的 xi起作用的因子;aij 是公共因子的负载(Factor Loadings),是第 i 个

变量在第 j 个因子上的负载,相当于多元回归中的标准回归系数。 如下矩阵:

11 12 1

21 22 2

1 2

...

...... ... ... ...

...

m

m

k k km

a a a

a a a

a a a

称为公共因子的负载矩阵。 由上面的假设可知,公共因子之间是互不相关的(两两正交的),特殊因子之间也是

互不相关的,进一步假设公共因子与特殊因子之间也是互不相关的。基于此,可以证明如

下结论。 (1)aij 也是 xi 与 fj 的简单相关系数。事实上,由于 xi 与 fj 都是标准化了的(其方差均

为 1),所以,它们之间的相关系数是:

cov( , )cov( , ) cov( , )

( ) ( )i j

i j it t i j iji j

x fx f a f e f a

D x D f (16-1)

(2)xi 与 xj 之间的简单相关系数,是两个变量的公共因子的对应系数的乘积之和:

fij=ai1aj1+ai2aj2+…+aimajm (16-2)

(3)xi 的方差 2var( ) var( ) 1i i ix h e ,式中 2 2 2 21 2 ...i i i imh a a a 。

2ih (即负载矩阵第 i 行元素的平方和)称为公因子方差(Communality),又称为公共

度或公共方差,是 xi 的方差中由公共因子所决定的部分。 (4)fj 因子的贡献(Contribution),记为 Vj,是该因子在模型中的所有负载的平方和(负

251

第 16 章 上市公司信用度量模型及其 MATLAB 应用

载矩阵第 j 列元素的平方和): 2 2 21 2 ...j j j kjV a a a (16-3)

由于 xi 已经标准化了,所以 k 个变量的总方差为 k,Vj/k 表示第 j 个公共因子的贡献在所有

方差中的比例。 利用因子分析建模的步骤是: (1)对变量 X1,X2,…,Xk 进行相关性检验。 (2)由 X 的初始数据,求出相关系数矩阵 R( k k 阶)。 (3)求 R 的特征根 1 2, ,..., (从大到小排列)及长度为 1 的(相互正交的)特征向量

b1, b2, …。此时若用主成分分析法提取公共因子,主成分 T1 1Y b X , T

2 2Y b X ,…,T

k kY b X 。 (4)求 xi 在 fj 上的负载(简单相关系数), ij ij ja b 。

(5)选部分公共因子,进入因子模型,保证选取的公共因子的方差大于 80%,也就是

说公共因子必须能够反映原始数据的大部分信息。 (6)对求出的负载矩阵做正交旋转,使负载尽可能向1,0 的方向靠近。 (7)在旋转完成后,按照负载绝对值的大小,对公共因子的实际含义进行解释。

2.模型建立、预测结果及检验 对前面选取的训练样本中的财务比率,运用 SPSS14.0 统计软件进行因子分析,可得到

如下结果。 (1)首先对变量进行相关性检验,这里主要使用两种方法。 ① KMO 样本测度(Kaiser-Meyer-Olkin Measure of Sampling Adequacy)。它是所有变

量的简单相关系数的平方和与这些变量之间的偏相关系数的平方和之差。相关系数实际上

反映的是公共因子起作用的空间。偏相关系数反映的是特殊因子起作用的空间。KMO 越接

近于 1,越适合于做公共因子分析。 ② 巴特莱特球体检验(Bartlett’s Test of Sphericity)。这个统计量(在一定条件下服从

2 分布)从整个相关系数矩阵来考虑问题,其零假设 H0 是相关系数矩阵为单位矩阵,可

以用常规的假设检验判断相关系数矩阵是否显著差异于零。 KMO 样本测度和巴特莱特球体检验结果如表 16-2 所示。

表 16-2 KMO 样本测度和巴特莱特球体检验结果

KMO 样本测度 0.631

巴特莱特球体检验

2 统计值 261.850

Df 值 28

显 著 性 0.000

表 16-2 的结果显示:KMO 值为 0.631,该数据较适合做因子分析;巴特莱特球体检验

的 2 统计值的显著性概率是 0.000,小于 1%,说明数据具有相关性,是适宜做因子分析的。 (2)用 SPSS 软件进行分析时设定提取的公共因子数量为 5 个,如表 16-3 所示。

252

金融财务建模与计算——基于 VBA 与 MATLAB 实现

表 16-3 总方差分析表(Total Variance Explained)

初始特征值 旋转后的特征值

因子编号 特 征 根 占总方差比率(%) 累积方差(%) 特 征 根 占总方差比率(%) 累积方差(%)

1 2.868 35.849 35.849 2.374 29.670 29.670

2 1.901 23.760 59.609 1.564 19.550 49.219

3 1.092 13.644 73.253 1.196 14.951 64.170

4 0.891 11.136 84.388 1.131 14.135 78.305

5 0.557 6.966 91.354 1.044 13.050 91.354

6 0.353 4.408 95.763

7 0.233 2.918 98.680

8 0.106 1.320 100.000

注:提取因子的方法为主成分分析法。

表 16-3 说明了各因子的特征值与贡献率,前 5 个因子包含原来指标信息的 91.354%。

由表 16-3 中各因子的贡献率,可以得到因子预测函数为:

Z=0.35849Z1+0.23760Z2+0.13644Z3+0.11136Z4+0.06966Z5 (16-4)

(3)采用的提取因子的方法为主成分法,因子旋转的方法为方差 大旋转法,旋转后

的因子负载值如表 16-4 所示。

表 16-4 旋转后的因子负载值

因 子

Z1 Z2 Z3 Z4 Z5

x1 0.956 0.007 0.051 0.096 0.063

x2 0.947 0.006 0.063 0.014 0.037

x3 0.703 0.254 0.132 0.394 0.206

x4 0.022 0.926 0.089 0.227 0.007

x5 0.003 0.056 0.102 0.044 0.985

x6 0.217 0.751 0.499 0.014 0.109

x7 0.009 0.223 0.949 0.058 0.100

x8 0.145 0.159 0.066 0.953 0.063

从表 16-4 可以看出: ① 因子 Z1 中,x1、x2、x3 的负荷量远大于其他财务指标的负荷量,所以 Z1 主要由

流动比率、速动比率和营运资本占总资产比率反映,它代表了企业的短期偿债能力; ② 因子 Z2 中,x4 的负荷量远大于其他财务指标的负荷量,所以 Z2 主要由利息保障

倍数这个财务指标反映,它代表了企业的长期偿债能力; ③ 因子 Z3 中,x6、x7 的负荷量明显大于其他财务指标的负荷量,所以 Z3 主要由总

资产净利润率和权益净利润率反映,它代表了企业的营利能力; ④ 因子 Z4 中,x8 的负荷量远大于其他财务指标的负荷量,所以 Z4 主要由现金流量

对负债比率这个财务指标反映,它代表了企业的现金流动能力; ⑤ 因子 Z5 中,x5 的负荷量远大于其他财务指标的负荷量,所以 Z5 主要由总资产周

253

第 16 章 上市公司信用度量模型及其 MATLAB 应用

转率这个财务指标反映,它代表了企业的资产管理能力。 因此,5 个因子所代表的经济意义为:Z1——短期偿债能力;Z2——长期偿债能力;

Z3——营利能力;Z4——现金流动能力;Z5——资产管理能力。 (4)可以通过主成分分析法得到因子得分矩阵,如表 16-5 所示,从而计算出公共因子

的值:

Z1=0.429x1+0.443x2+0.242x30.097x4+0.011x5+0.063x60.036x70.111x8 (16-5)

Z2=0.095x10.065x2+0.136x3+0.766x4+0.021x5+0.468x60.277x70.207x8 (16-6)

Z3=0.038x1+0.045x20.185x30.331x40.165x5+0.171x6+0.975x7+0.103x8 (16-7)

Z4=0.065x10.180x2+0.208x30.049x4+0.009x50.247x6+0.110x7+0.968x8 (16-8)

Z5=0.069x1+0.043x20.166x3+0.007x4+0.986x5+0.010x60.143x7+0.024x8 (16-9)

表 16-5 因子得分矩阵(Component Score Coefficient Matrix)

因 子

Z1 Z2 Z3 Z4 Z5

x1 0.429 0.095 0.038 0.065 0.069

x2 0.443 0.065 0.045 0.180 0.043

x3 0.242 0.136 0.185 0.208 0.166

x4 0.097 0.766 0.331 0.049 0.007

x5 0.011 0.021 0.165 0.009 0.986

x6 0.063 0.468 0.171 0.247 0.010

x7 0.036 0.277 0.975 0.110 0.143

x8 0.111 0.207 0.103 0.968 0.024

(5)判别区间的确定,根据式(16-4)、式(16-5)、式(16-6)、式(16-7)、式(16-8)、

式(16-9)建立模型为:

Z=0.1340x1+0.1325x2+0.1054x3+0.0971x4+0.0561x5

+0.1303x6+0.0566x7+0.0345x8 (16-10)

将训练样本中选定的 8 个财务比率标准化代入式(16-10),可得因子分析结果表。当

n 充分大时,由中心极限定理知,不论总体 Z 服从什么分布,均有:

n

ZU

S n

(16-11)

近似地服从标准正态分布 N(0, 1),其中 Z 为 Z 的平均值, 为 Z 的期望值, nS 为样本标

准差,n 为样本个数。

对 ST 公司,置信上限为2

nSZ

n

,其中2 =1.64(当置信度 =0.05 时),可计算

置信上限为0.13153;同理,对非 ST 公司,置信下限为2

nSZ

n

,可计算置信下限为

0.122189(当置信度为 0.05 时)。

254

金融财务建模与计算——基于 VBA 与 MATLAB 实现

根据以上的分析,可得到模型:

Z=0.1340x1+0.1325x2+0.1054x3+0.0971x4+0.0561x5+0.1303x6+0.0566x7+0.0345x8 当 Z 0.122189 时,企业处于财务安全区域;当 Z≤0.13153 时,企业处于财务危机

区域;当0.13153<Z<0.122189 时,企业处于灰色区域,企业应进行深入的财务分析与鉴别。 根据上述临界值标准,对训练样本进行回判,结果为:判断处于财务危机区域的公司

有 29 家,其中有 5 家公司为非 ST 公司,误判率为 5/29=17.2%;判断处于财务安全区域的

公司有 19 家,其中有 3 家公司为 ST 公司,误判率为 3/19=15.8%。用同样的标准对预测样

本进行判别。因子分析模型预测及检验判定结果如表 16-6 所示。

表 16-6 因子分析模型预测及检验判定结果

组 别 训练样本 预测样本

实际个数 正确判定个数 正 确 率 实际个数 正确判定个数 正 确 率

ST 29 24 82.8% 12 10 83.3%

非 ST 19 16 84.2% 14 11 78.6%

正确判定率 83.3% 80.8%

16.2.4 上市公司信用风险度量模型的神经网络建模及其实证研究 1.研究方法 人工神经网络(Artificial Neural Network,ANN)是对生理上真实的人脑神经网络的结

构和功能及基本特征进行理论抽象、简化和模拟而构成的一种信息系统。ANN 作为一种并

行分散处理模式,具有非线性映射、自适应学习和较强容错性的特点,可以对应多变的企

业运作环境。BP 人工神经网络是由 Rmenlhart、McClelland 等研究并设计的、基于误差反

向传播算法的一种多层前向神经网络。由于 BP 神经网络的神经元采用的传递函数通常是

Sigmoid 型可微函数,可以实现输入与输出间的任意非线性映射,因此在模式识别、风险

评价、自适应控制等方面有着广泛的应用。 BP 算法作为人工神经网络的一种比较典型的学习算法,主要结构由一个输入层,一个

或多个隐含层,一个输出层组成,各层由若干个神经元(节点)构成,每一个节点的输出

值由输入值、作用函数和阈值决定。网络的学习过程包括信息正向传播和误差反向传播两

个过程。在正向传播过程中,输入信息从输入层经隐含层传到输出层,经作用函数运算后

得到输出值,与期望值比较,若有误差,则误差反向传播, 沿原先的连接通路返回,通过

逐层修改各层神经元的权值,减小误差,如此循环直到输出的结果符合精度要求为止。

基本的三层 BP 人工神经网络结构如图 16-1 所示。 BP 人工神经网络隐含层和输出层上的某神经元 j 的输出 oj 由下式确定:

(Net ) ( )j j j j j i jo f f x

其中,fj 表示神经元 j 对应的激发函数,目前用的 多的是 Sigmoid 函数;1( )

1 e xf x

j 表示神经元 j 的阈值;xj 表示对神经元 j 的各个输入;wj 表示对应输入和该神经元 j 的连

接权值。

255

第 16 章 上市公司信用度量模型及其 MATLAB 应用

误差反向传播

信息正向传播

输入层 隐含层 输出层

图 16-1 BP 人工神经网络结构图

BP 网络的存储信息主要体现在两个方面:一是网络的体系结构,即网络输入层、隐含

层和输出层节点的个数;二是相邻层节点之间的连接权值。影响网络结构的主要参数是隐

含层的节点个数、学习率和系统误差 。输入层和输出层节点个数由系统应用决定,一

般来说是确定的,而隐含层节点个数由用户凭经验决定,个数过少将影响网络的有效性,

过多则会大幅度增加网络训练的时间。学习率通常在 0.01~0.9 之间,一般来说,学习率越

小,训练次数越多,但学习率过大,会影响网络结构的稳定性。拟定误差 通常需要根据

输出要求来定, 越低,说明要求的精度越高。 具体的步骤简述如下: (1)BP 网络的初始化,确定各层节点的个数,将各个权值和阈值的初始值设为比较小

的随机数; (2)输入样本和相应的输出,对每一个样本进行学习,即对每一个样本数据进行步骤

(3)到步骤(5)的过程; (3)根据输入样本算出实际的输出及其隐含层神经元的输出; (4)计算实际输出与期望输出之间的差值,求输出层的误差和隐含层的误差; (5)根据步骤(4)得出的误差来更新输入层-隐含层节点之间、隐含层-输出层节点之

间的连接权值; (6)求误差函数 E,判断 E 是否收敛到给定的学习精度以内(E≤拟定误差 ),如

果满足,则学习结束,否则,转向步骤(2)继续进行。

2.模型建立、预测结果及检验 1)配置阶段 BP 神经网络模型主要是借助 MATLAB 语言工具来实现的,具体程序见附录 3。为了比

较研究,利用保留下来的 8 个相同的原始财务指标作为基准确认 BP 模型的输入节点,输出

节点数为 1。输出层阈值由网络训练自行确定。隐含层节点数的选择是一个复杂的问题,它

与输入层、输出层节点数的多少直接相关,在参考经验公式 2X > N ( X 为隐含层节点数,N

为样本数)的基础上,采用“凑试”方法,首先定一个比较小的隐含层节点数,进行训练,如

果训练次数很多或者在规定训练次数内没有收敛,则停止训练,逐步增加隐含层节点数,重

256

金融财务建模与计算——基于 VBA 与 MATLAB 实现

新训练,先后训练隐含层节点数分别为 6、8 的两种情况, 终确定隐含层的节点个数为 8。 因此,BP 神经网络模型结构是 8×8×1,如图 16-2 所示。

8

IW{1.1}

b{1}

8 1

LW{2.1}

b{2}

图 16-2 BP 神经网络模型结构图

2)训练阶段 该阶段完成对样本的训练学习,将 112 家上市公司分为训练样本和检验样本(76 家作

为训练样本,36 家作为检验样本)输入系统。基于 BP 算法训练 8×8×1 网络结构,选取

学习率=0.01,系统误差 = 10-4,权值矩阵初值分别为 8×8 阶和 8×1 阶的随机矩阵,这

里的随机矩阵是指矩阵的元素是由系统随机给定的。利用 Levenberg-Marquardt 学习方法,

借助 MATLAB 语言编程实现模型的构建。程序在 PC 上经过 97 个训练周期后达到要求。

注意到不同的权值初值经过训练可以得到不同的终值,但这并不影响训练结果。其中输入

层到隐含层的权值矩阵为:

[-3.8427 -1.3122 4.8056 5.034 -1.2052 -0.29493 -6.5918 8.1441; -6.3728 0.60061 0.46697 8.1294 -2.7463 1.8969 8.9805 -1.6904; -15.4985 8.9213 9.4728 -5.7762 -3.4767 -2.4407 -5.6261 -6.6841; 3.4201 2.8741 -3.6602 -2.518 -2.0942 -4.5995 -2.5758 -1.0956; 10.6784 -1.0744 -13.3603 5.0875 -0.038215 -11.1925 -7.9404 -8.8715; -7.1051 7.4857 4.1309 0.69802 -4.6524 2.1134 -11.5452 0.37181; -3.2595 4.9273 -7.4904 3.7248 -1.3293 4.8517 4.2182 -13.244; 11.4896 10.4386 1.1779 3.2952 6.6485 -7.5523 -4.924 -16.8107]

隐含层到输出层的权值矩阵为:

[20.2452 2.3206 -40.715 -5.4344 -30.727 14.8085 27.9743 30.4184]

输入层到隐含层的阈值矩阵为:

[-2.6198; 16.5567; 5.5529; -11.5696; -7.3505; -7.5396; -2.0166; -0.11538]

隐含层到输出层的阈值矩阵(这里的阈值矩阵是一个实数)为:

[-5.2228]

训练输出结果为:

[2.1917e-007 2.3241e-020 1.6579e-007 6.9618e-031 3.0972e-019 8.0496e-011 3.1289e-010 1.5326e-007 3.3545e-007 3.8288e-007 8.6147e-015 6.5765e-007

257

第 16 章 上市公司信用度量模型及其 MATLAB 应用

6.0082e-008 1.3499e-011 5.8473e-013 4.9569e-007 1.1459e-007 4.2467e-007 1.6639e-027 9.785e-008 5.0444e-007 4.3644e-020 8.4875e-007 1.3606e-007 2.9396e-007 4.753e-007 7.7244e-017 4.238e-028 9.9938e-008 2.6945e-007 6.1013e-009 6.126e-007 9.1704e-015 5.4379e-007 5.5116e-020 1.1682e-008 5.0645e-009 1.1607e-006 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

把输出结果 0<r<0.5 的判断为 ST 公司,0.5<r≤1 的判断为非 ST 公司,可见两者的正

确率都是 100%。 3)预测结果及检验 为了进一步检验模型的应用准确性,将相应的预测样本数据代入 BP 神经网络模型进

行返回判定,模型预测样本的判定与预测结果为:

[1.3773e-011 3.3873e-006 0.00012061 4.3471e-005 7.4188e-023 3.1345e-030 6.002e-005 1.8394e-019 2.3365e-011 1 4.0986e-007 5.3364e-13 0.00010353 1 2.7226e-016 3.5909e-007 1.5338e-006 1.2517e-022 1 1 1 1 1 2.7409e-010 1 1 0.00019353 3.3212e-017 1 1 1 1 0.87381 1 1 1]

同样,把输出结果 0<r<0.5 的判断为 ST 公司,0.5<r≤1 的判断为非 ST 公司,BP 神经

网络模型预测及检验判定结果如表 16-7 所示。

表 16-7 BP 神经网络模型预测及检验判定结果

组 别 训练样本 预测样本

实际个数 正确判定个数 正 确 率 实际个数 正确判定个数 正 确 率

ST 38 38 100% 18 16 88.9%

非 ST 38 38 100% 18 15 83.3%

正确判定率 100% 86.1%

本节首先对财务指标进行定性分析,然后用 T 检验的办法进行筛选, 后分别利用因

子分析模型和 BP 神经网络模型来建立我国上市公司的信用风险度量模型,可以得到以下

结论。 (1)在选取的 14 个财务指标中,流动比率、速动比率、股东权益比率、利息保障倍数、

总资产周转率、总资产净利润率、主营业务收入增长率、现金流量对负债比率 8 个财务指

标的均值具有显著差异,可以对上市公司将来是否会发生信用风险有较大的解释作用,因

此把这 8 个财务指标作为建模的原始变量。 (2)在用因子分析模型对训练样本和预测样本进行判别的时候,实际上是把所有选定

的公司分成了 3 类,即处于财务危机中的公司、财务安全的公司和界于两者之间的公司。

而 BP 神经网络模型是把所有公司分成两类,即处于财务危机中的公司和财务安全的公司,

说明 BP 神经网络对临界状态的公司有较强的判断能力。 (3)BP 神经网络模型对训练样本的正确判定率为 100%,因为样本太小,产生了过拟

合和局部 小的问题,因此该模型还有提升的空间。 (4)BP 神经网络模型的总体判定准确率高于因子分析模型,说明神经网络是一种非线

性映射模型,在指标间相关度较高、呈非线性变化等情况下仍可以对样本所包含的信息进

行充分的学习,从而得到较好的结果。因此,用神经网络来建立信用风险度量模型有广阔

的应用前景和实用价值。

258

金融财务建模与计算——基于 VBA 与 MATLAB 实现

16.3 基于市场数据的上市公司动态信用风险度量模型研究 股票市场可以视为一个评价上市公司的巨大机制。关于宏观经济状况、行业及公司的

信息会以很快的速度传导给或大或小的投资者和投资分析人员,因此股价会在整个交易日

内不断地变化波动,在公司股价的变化中蕴涵着关于该公司可信度变化的可靠证据。据此,

银行等放贷者就有机会利用这些现成的、规模巨大、潜能巨大的信用风险管理工具。KMV公司的信用监控模型就是一个关于股票市场的信用风险度量的著名例子。该模型以期权定

价理论为基础,通过计算预期违约率(Expected Default Frequency,EDF),对所有其股权

公开交易的公司和银行的违约可能性做出预测。 KMV 公司先开发了信用监控模型,后来又在此基础上发展出资产组合管理模型,这里

所应用的只是 KMV 信用监控模型,所以所说的 KMV 模型就是指 KMV 信用监控模型。在

本节中,首先介绍该模型的理论基础与基本框架,接着依据中国国情对模型进行修正,然

后选择 120 家上市公司对模型进行实证研究,并对结果进行分析。

16.3.1 KMV 模型的理论基础 1.期权定价理论 期权是一种特定的金融合同,分为看涨期权和看跌期权两种基本类型。看涨期权是指

其持有者(合同的做多方)在规定的时间内,以事先预定的价格,从看涨期权合同的出售

者(做空方)处购买一定数量标的资产的权利,但它不承担必须购入的义务。看跌期权合

同则赋予其持有者在规定时间内,以事先预定的价格,向看跌期权合同的做空方出售一定

数量标的资产的权利,但它也不承担必须卖出的义务。 1973 年,Fischer Black 和 Myron Scholes 建立了 Black-Scholes 方程,然后对其进行求

解得到了看涨期权的定价公式,其中 Black-Scholes 方程及其推导过程是基于以下假设的。 (1)标的资产价格演化遵循几何布朗运动。

d d dtt

t

St W

S (16-12)

其中, 为期望回报率(expected return rates)(常数); 为波动率(volatility)(常数); d tW 为标准布朗运动(standard Brown motion), (d ) 0, var(d ) dt tE W W t 。

(2)无风险利率 r 是常数。 (3)标的资产不支付股息和税收。 (4)不存在无风险套利机会。 (5)允许使用全部所得卖空衍生证券。 (6)证券交易是连续的。 (7)没有交易费用。 在这些假设条件的前提下,欧式看涨期权的定价公式为:

1 2( ) e ( )rC SN d K N d (16-13)

其中,

259

第 16 章 上市公司信用度量模型及其 MATLAB 应用

2

1 2 1

ln / ( )2 , ,

S K rd d d

根据平价公式,可以得到欧式看跌期权的定价公式:

2 1e ( ) ( )rP K N d SN d (16-14)

式中,C 为看涨期权的当前价格;P 为看跌期权的当前价格;S 为标的资产当前价格;K 为

期权的执行价格;r 为无风险年利率; 为距期权到期的时间,以年表示; 为资产收益的

波动率;

2

21( ) e d2

tx

N x t

,称为标准正态分布的累积概率分布函数。

2.Black-Scholes-Merton 模型 Merton 于 1974 年在《金融杂志》上发表文章,引入 Black-Scholes 期权定价公式对公

司的股权和负债进行定价,计算公司在给定时间内发生违约的可能性,形成了著名的

Black-Scholes-Merton 模型(BSM 模型)。但 初的模型也是基于一系列假设的(其中大部

分假设是来自 Black-Scholes 定价理论)。 (1)市场没有摩擦。没有交易费用和税收。资产是完全可分的,且可以连续交易。没

有对卖空的限制。不存在买卖差价,借款利率等于贷款利率。 (2)假设了存在着足够多的投资者,他们可以按照市场价格从事任何规模的交易。 (3)存在无风险资产,资产的回报率是已知且固定不变的。 (4)公司资产的价值演化遵循几何布朗运动:

d d dAt

A

Vt W

V (16-15)

其中, 为基础资产的期望回报率(expected return rates)(常数), 为基础资产收益的波

动率(volatility)(常数), d tW 为标准布朗运动(standard Brown motion), (d ) 0,tE W var(d ) dtW t 。

(5)在公司资产负债表的负债方,为公司总价值融资的是股权 E 和一个零息、无赎回

权的债务合约 D,该债务合约的到期日为 T,面值为 F,即有:

t t tV D E (16-16)

将此假设同假设(1)结合在一起,就意味着公司价值同其资产价值是相同的,而且同

资本结构无关(等同于 MM 定理);这还意味着资产收益的漂移率和波动率无须依赖公司

价值的大小。 (6)股东价值的 大化,管理层的目标在于追求股东的财富。 (7)债务合约是固定的,且初始假设是公司尚且没有违约。 (8)在债务合约的有效期内,既没有任何现金支付,也没有任何类型的其他证券的发

行,破产成本是 0。 (9)绝对不能违反关于优先权的规则:股东只有在债权人获得全部偿付之后,才能得

到支付。 企业资产负债表的资产由股东拥有的价值和债权人拥有的债务价值构成。由于公司的

260

金融财务建模与计算——基于 VBA 与 MATLAB 实现

有限责任,股东可能遭受的 大损失就局限于股份所代表的总价值上,即股东面临的下跌

风险是有限的。另外,只要对债权人的债务可以及时偿还,则股东享有对剩余资产的要求

权。于是,股东拥有的价值就可以用一个看涨期权的价值来表示,据以签发该期权的是公

司的资产。 设 VT 为债务到期时公司的资产价值,D 为债务面值,则到期时,债权人的损益为

max{VT,D},股东的损益为 max{0,VT D}。可以用图 16-3 和图 16-4 来分别描述债权人

和股东到期时的损益状况,从而说明债权与期权的相似性。

45° O

损益额

资产价值D

45°O

D

损益额

资产价值

图 16-3 债权人到期时的损益图 图 16-4 股东到期时的损益图

Merton 注意到持有股权的报酬与买入一份借款企业资产的看涨期权是同构的

(isomorphic),他把公司的股权看做是以公司资产为标的的看涨期权,它的执行价格为公司

债务的账面价值,它的期限为公司债务的期限。根据 Black-Scholes 期权定价模型,就得到

了股票市场价值和公司资产价值之间的评价关系:

1 2( ) e ( )rTAE V N d D N d (16-17)

其中,

2

1 2 1

ln / ( )2 , ,A

A

AA

V D r Td d d T

T

式中,E 为公司股票的市场价值;D 为公司债务账面价值;VA 为公司资产市场价值;T 为

债务期限; A 为资产价值的波动率;r 为无风险年利率;

2

21( ) e d2

tx

N x t

,称为标准

正态分布的累积概率分布函数。 这就是著名的 Black-Scholes-Merton 模型(BSM 模型)。1997 年,由于这个光辉的公

式以及由此产生的期权定价理论方面的一系列贡献,Scholes 和 Merton(Black 已故)获得

诺贝尔经济学奖。

16.3.2 KMV 模型的框架 KMV 模型是将 BSM 定价理论应用于贷款和债券估值而开发出的一种信用监控模型,

是直接计算、估计和模拟技术的混合系统。它通过对上市公司股价波动的分析来预测股权

公开交易公司发生违约的可能性。KMV 模型的基本假设是:当公司的资产价值(股票市场

261

第 16 章 上市公司信用度量模型及其 MATLAB 应用

价值+债务价值)低于一定水平时,公司就会对债权人和股东违约。这一水平对应的点就是

违约触发点 DP(Default Point),即公司的资产价值等于负债价值时的点。KMV 模型如 图 16-5 所示。

DP

一年以后 T O

资产价值的均值

资产预期增长率

DD

VA

资产价值的标准差

一年后资产价值的分布

EDF

图 16-5 KMV 模型图

在 KMV 模型图中,在某个给定的未来时期,预测公司的资产价值服从某个分布,此

分布的特征由资产价值的期望值和标准差(波动率)表示。图 16-5 中假定公司资产价值以

资产预期增长率增长并且服从正态分布。未来资产价值的均值到所需清偿公司债务账面价

值之间的距离就是违约距离 DD(Distance to Default)。KMV 模型认为,当表示资产价值的

均值线下降到所需清偿公司债务账面价值线以下时就会发生违约,在图 16-5 中一年后的资

产价值分布曲线和代表公司债务账面价值线以下所包围形成的面积,即表示公司在一年后

预期发生违约的概率(EDF)。从图 16-5 中可看出,违约概率的大小取决于负债线的位置和

资产价值分布曲线的形状。 KMV 模型主要是利用预期违约率 EDF 的值(范围为 0.02%~20%)来判断一个公司在

未来一定时期发生违约的概率。EDF 是根据企业资产价值的波动率(通过公司股票价格在

证券市场上的波动率估计出来)来衡量企业日前市场价值降低到违约触发点水平以下的概

率。所需计算 EDF 的信息,都包含在公司上市交易的股票价格变动之中。计算上市公司预

期违约率的步骤如下。 (1)根据负债计算出公司的违约触发点 DP 及违约距离 DD。 根据违约触发点的定义,在违约触发点处,上市公司的资产价值正好能够抵偿其债务。

KMV 公司根据大量违约的实证分析,发现违约发生 频繁的临界点处在公司价值大于等于

流动负债加 50%的长期负债。 设:STD 为短期负债,LTD 为长期负债,则有:

DP= STD+ 0.5LTD (16-18)

DD 表示位于资产价值概率分布均值与违约发生临界值之间的距离,它是用来衡量违

约风险的指标。它也可表示为资产的未来预期价值和违约点之间存在未来资产收益标准差

的数目,其中违约点设在当前负债(在信用期限内的短期债务加上一半的长期债务)的价

262

金融财务建模与计算——基于 VBA 与 MATLAB 实现

值处。DD 的正式定义如下:一年后资产的未来预期价值 E(VA)和违约点 DP 之间的距离除

以未来资产收益的标准差。公式如下: ( ) DPDD( )

A

A A

E V

E V

(16-19)

违约距离测度是一个标准化的度量方法,可用于不同公司之间的比较。但它类似于债

券等级序数性的度量指标,仍然没有告知公司违约概率是多大,因此还须将违约距离转化

成预期违约率 EDF。 (2)确定违约距离 DD 与预期违约率 EDF 之间的映射关系。用具有不同违约距离值公

司的违约数据库将违约距离按比例对应于预期违约率来确定 EDF。 KMV 公司选取一定时期,将违约距离和预期违约率两者之间的关系映射起来。对于每

一时段,基于一个大量的包括有违约公司样本的历史数据库,把违约数据拟合成一条平滑

曲线来表示违约距离函数,以此来估计 EDF 值的大小。

16.3.3 KMV 模型的修正、参数设计及计算方法 从总体来说,KMV 模型是一种具有前瞻性(Forward-looking)的动态模型,可以及时

反映公司违约风险水平的变化。它提供的预期违约率 EDF 指标在本质上是一种对风险的基

数衡量法,其特点在于不仅可以反映不同企业风险水平的高低顺序,而且可以反映风险水

平差异的程度,因而更加准确。但由于我国证券市场不同于西方成熟证券市场上的股份全

流通,我国股权分置改革尚未完成,即使完成改革的上市公司也有很多非流通股没有“解

禁”,所以在计算上市公司股权的市场价值时无法从市场上直接测量;其次,我国信用制度

不健全,信用体系尚未建立,有关企业违约或破产的历史统计数据严重缺乏,很难把违约

距离(DD)转化成实际违约率(EDF)。下面针对非流通股的定价、历史违约数据缺乏和

方程求解三个方面的问题对 KMV 模型进行修正。

1.非流通股的定价问题 由于这里不是计算非流通股的内在价值,只是寻找目前市场所认可的定价标准,以此

为依据来估算非流通股的市场价格。净资产定价法是目前非流通股转让、回购中应用较多

的度量模型,该方法简单易行,可操作性极强,并为市场普遍接纳。实际上,目前协议转

让的非流通股价格基本都是围绕每股净资产浮动。薛锋通过选取 2000 年和 2001 年协议转

让的 36 只股票的实际转让价格和每股净资产数据进行回归,得到两者的回归方程为:

1.326 0.53P X (16-20)

其中, P表示非流通股实际转让价格;X 表示每股净资产。 所以上市公司股票的市场总价值为:

E E NP (16-21)

其中, E为流通股市值;N 为公司非流通股股数;KMV 模型中的 BSM 公式(16-17)修

正为:

1 2( ) e ( )rTAE NP V N d D N d (16-22)

263

第 16 章 上市公司信用度量模型及其 MATLAB 应用

2.历史违约数据缺乏的问题 由于缺乏违约历史数据库,所以无法建立预期违约率 EDF 与违约距离 DD 之间的函数

关系。为了解决这个问题,在研究时根据 KMV 模型中违约的概念,并基于假设条件,计

算理论上的违约率。该违约率的计算是建立在对公司资产价值几何布朗运动以及资产收益

正态分布假设的基础上的。根据 BSM 模型的假设(4)即式(16-15),如果以 VA表示时间

为 0 时公司资产的市场价值,那么 t 时间公司资产的市场价值为: 2

ln ln ( )2

tA A AV V t t

(16-23)

这里 是公司资产收益的随机部分。 由于违约率是债务到期时公司资产的市场价值低于其债务账面值的概率,所以有:

0 0[ ] [ln ln ]t tt A A A A A AP P V D V V P V D V V (16-24)

其中,Pt 是 t 时的违约率; tAV 是 t 时公司资产的市场价值;D 是 t 时到期的债务账面价值。

结合式(16-23)和式(16-24),可得到违约率的表达式为: 2

[ln ( ) ln ]2t A AP P V t t D (16-25)

整理后得: 2

ln ( )2

A

tA

Vt

DP Pt

(16-26)

BSM 模型假定公司资产收益的随机部分服从标准正态分布,即 ~N(0, 1),从而可以

得到以正态累积概率表达的违约率: 2

ln ( )2 ( DD)

A

tA

Vt

DP N Nt

(16-27)

依据式(16-27)计算出来的理论违约率与实际违约率会有一定的偏差,这主要是因为: (1)对于资产价值的变化,仅仅考虑了资产价值的增长率,而没考虑在债务到期前现

金流的流出,如债务利息、股票红利等的偿付。 (2)对资产收益正态分布的假设在现实中很可能不满足。 (3)尤其重要的是,现实中违约点并非一个固定值,而是一个随机变量,这是因为公

司的资本结构往往是动态的,会随时间不断调整。例如,工商企业在临近违约时通常会增

加负债,而金融企业处于违约边缘时通常会减少负债。这种差异反映了不同类型企业资产

的变现能力,以及由此产生的在困难时期的杠杆调节能力。

3.方程求解的问题 为了计算 A ,采取一个迭代过程计算隐含波动率,以此作为资产的期望波动率。例如,

264

金融财务建模与计算——基于 VBA 与 MATLAB 实现

用过去的 100 天日交易数据估算股票价格的波动率 E ,并把它作为资产价值波动率 A 的

初始估计值,代入修正的期权定价公式,计算出资产价值 VA。对于过去 100 个交易日里每

一天的股票市场价值 E,都可以相应计算出一个 VA,这样,就可以获得 100 个交易日资产

市场价值,从而可以估算一个新的资产波动率 A 。并把 A 作为新的变量代入修正的期权

定价公式。重复以上过程,直到 A 收敛(设定容忍度为 10E4)。一旦确定了 A 的值,就

可以代回修正的期权定价公式计算出 VA。上面的计算涉及权益和资产波动率及非线性方程

的求解,现分别对它们进行说明。 1)权益和资产波动率的计算 为了根据实际数据估计权益和资产的波动率,选择观察股票价格的时间间隔是每天。 n+1:观察次数。 Si:在第 i 个时间间隔末的权益或资产的值(i=0, 1, 2, …, n)。 :以年为单位表示的时间间隔的长度。 令

1ln( )i

ii

S

S

(16-28)

其中,i=0, 1, 2, …, n。 因为 1e iu

i iS S , iu 为第 i 个时间间隔后的连续复利收益。 iu 的标准差 s 的一般估计

值为:

2

1

1 ( )1

n

ii

s u un

(16-29)

其中,u 为 iu 的均值。得到的 s 即为权益或资产的日波动率,设一年有 250 个交易日,年

波动率为:

250s (16-30)

2)非线性方程的求解 前面提到需要通过代入 A 到式(16-22),计算 VA,也有代入 VA到式(16-22)求 A ,

下面介绍一下在求解过程中用到的方法,首先将式(16-22)变形为:

1 2( ) e ( ) ( ) 0rTAy V N d D N d E NP (16-31)

这是一个非线性方程,对于求解给定区间的根,二分法是一种既简单又稳健的方法。

设要求解的变量为 x,则方程(16-31)变形为 f(x)=0,假设它的根位于[a,c],二分法要

求在 x=a 和 x=c 的符号是相反的,即 f(a)f(c)<0,如图 16-6 所示。将区间[a,c]分为相等

的两部分[a,b]及[b,c],其中 b=(a+c)/2,通过检查 f(a)f(b)和 f(b)f(c)的符号,找到包含

根的半区间。事实上,由于 f(b)f(c)<0,则区间[b,c]上有一个根,否则根在另半个区 间[a,b],然后将含有根的新区间再次分成两份。重复进行上述过程,包含根的区间长

度越来越小,每一步将区间的中点作为当前根的近似值,当区间小于给定的容许误差时,

迭代停止。

265

第 16 章 上市公司信用度量模型及其 MATLAB 应用

终解

O 1 x=cx=a

2 4 3

图 16-6 二分法示意图

经过 n 步迭代后,区间长度变为:

0 0

2n

c a (16-32)

其中,a0,c0是 a,c 的初值,所以上式的分子为初始区间的长度。当根取为第 n 个区间的

中点时,式(16-32)给出的是可能的 大误差。因此,需用的 小迭代步数 n 应满足:

0 0

2n

c a (16-33)

0 0lg

lg(2)

c a

n

(16-34)

其中, 是容许误差。

16.3.4 实证研究 1.样本选择与参数确定 为了方便与前面建立的信用风险度量模型进行对比,仍然把上市公司被“ST”作为公

司违约的标志,并且测算被 ST 前 2 年(t2)的违约距离(DD)。选取沪深两市 2003 年和

2004 年被证监会认定为 ST 的公司。由于除了发行 A 股外,还发行 B 股或 H 股的公司股权

的市场价值计算烦琐,且本章研究的是中国 A 股上市公司,所以该类公司也超出了本章研

究的范围,在选取样本时给予剔除,剩下的公司作为违约组样本,同时选取相同数量财务

正常的公司作为配对样本。 每个样本公司的数据分为截面数据和时间序列数据。其中,截面数据包含的指标有非

流通股股数、流通股股数、每股净资产、非流通股每股价格、非流通股市值和违约点(DP)。

266

金融财务建模与计算——基于 VBA 与 MATLAB 实现

这些指标中非流通股股数、流通股股数、每股净资产可以直接从公司年报中获取,非流通

股每股价格可通过式(16-20)计算得到,于是,非流通股市值可由非流通股每股价格乘以

非流通股股数计算得到,而违约点(DP)可由式(16-18)求得。时间序列数据包含的指标

有每天的流通股每股价格和股权市场价值,其中流通股每股价格可以从每天股市交易的数

据中获取,而股权市场价值=非流通股市值+流通股每股价格流通股股数。样本截面数据

和时间序列数据分别见附录 4 和附录 5。其他用到的参数,无风险利率 r 按 2001 年和 2002年的一年期银行存款利率计算,为 2.25%,债务期限 T 为 1 年。

2.实证研究过程及其结果分析 1)迭代法求资产价值波动率 A 和违约距离 DD(t2) (1)根据每天的股权市场价值计算该年的股权价值波动率 E ,并将 E 作为资产价值

波动率 A 的初始值; (2)将资产价值波动率 A 代入式(16-22),可求出每天的股权市场价值 E 对应的资产

市场价值 VA; (3)根据每天的资产市场价值 VA,计算资产价值波动率 A ; (4)判断 A 是否收敛,即计算新的 A 与上一个计算得到的 A 的差值,如果收敛,则

进行下一步,否则转向步骤(2); (5)将得到的资产价值波动率 A 代入式(16-22),求出该年股票交易的每天的股权市

场价值 E 对应的资产价值 VA,然后对 VA求日平均值,进而根据式(16-19)求出违约距离

DD(t2)和预期违约率 EDF。 以上步骤都是借助 MATLAB 语言工具来实现的,具体程序见附录 6,得到的违约距离

DD(t2)和预期违约率 EDF 数据见附录 7。 2)资产价值波动率 A 和违约距离 DD(t2)、预期违约率 EDF 的关系分析 用统计软件 SPSS 首先对选定的 60 对样本的资产价值波动率 A 、违约距离 DD(t2)

和预期违约率 EDF 分别进行样本描述性统计、方差 F 检验和独立样本的 T 检验(结果如

表 16-8 所示)。为进一步探讨资产价值波动率 A 、违约距离 DD(t2)和预期违约率 EDF之间的关系,分别对资产价值波动率 A 和违约距离 DD(t2),以及资产价值波动率 A 和

预期违约率 EDF 进行 Spearman 相关性检验(结果如表 16-9 和表 16-10 所示)。通过实验

发现: (1)ST 公司在 t2 年公司的资产市场价值波动率显著大于非 ST 公司。 (2)ST 公司在 t2 年的违约距离 DD(t2)显著小于非 ST 公司,而 ST 公司的预期违约

率 EDF 显著大于非 ST 公司。 (3)从表 16-9 可以看出,上市公司资产价值波动率与该公司的违约距离显著相关,且

呈负相关关系。 (4)从表 16-10 可以看出,上市公司资产价值波动率与该公司的预期违约率显著相关,

且呈正相关关系。 (5)计算得到 ST 组样本预期违约率 EDF 均值为 0.00937,数值非常小,不符合实际

情况。

267

第 16 章 上市公司信用度量模型及其 MATLAB 应用

表 16-8 样本描述性统计、方差 F检验和 T检验结果

均 值 标 准 差 方差 F 检验 T 检 验

指 标 ST 非 ST ST 非 ST 假设 F p t p

资产波动率 0.25618 0.16491 0.13278 0.045653 同方差 8.745 0.004 5.035 0.000

异方差 5.035 0.000

违约距离 3.21952 4.66873 0.80296 1.26982 同方差 3.253 0.074 7.472 0.000

异方差 7.472 0.000

预期违约率 0.00937 0.00005 0.03032 0.00009 同方差 17.229 0.000 2.381 0.019

异方差 2.381 0.021

表 16-9 资产价值波动率 A 和违约距离 DD(t2)相关关系

A DD(t2)

Spearman’s rho A 相关系数 1.000 0.795(**)

显著性(双尾) . 0.000

N 120 120

DD 相关系数 0.795(**) 1.000

显著性(双尾) 0.000 .

N 120 120

**:1%置信度下的显著性(双尾)。

表 16-10 资产价值波动率 A 和预期违约率 EDF 相关关系

A EDF

Spearman’s rho

A 相关系数 1.000 0.795(**)

显著性(双尾) . 0.000

N 120 120

EDF

相关系数 0.795(**) 1.000

显著性(双尾) 0.000 .

N 120 120

**:1%置信度下的显著性(双尾)。

3)用违约距离 DD(t2)来区分 ST 公司和非 ST 公司 根据 16.2.3 节的原理可计算得 ST 公司违约距离 DD(t2)的置信上限为 3.390;非 ST 公

司的置信下限为 4.400(置信度为 0.05)。 当 DD(t2)≥4.400 时,企业处于财务安全区域;当 DD(t2)≤3.390 时,企业处于财务

危机区域;当 3.390<DD(t2)<4.400 时,企业处于灰色区域,企业应进行深入的财务分析与

鉴别。 根据上述临界值标准,对 38 对训练样本进行回判,结果为:判断处于财务危机区域的

公司有 32 家,其中有 1 家公司为非 ST 公司,正确判定率为 31/32=96.875%;判断处于财

务安全区域的公司有 32 家,其中有 3 家公司为 ST 公司,正确判定率为 29/32=90.625%。

为了更好地控制信用风险,上市公司的利益相关者需要根据股票每天的实时价格来监

控公司的信用状况,从而可以及时地做出有效的决策来降低甚至避免损失,这就需要利用

268

金融财务建模与计算——基于 VBA 与 MATLAB 实现

KMV 模型来建立动态的信用风险度量模型。于是我们选择股票代码为 000801 的公司,该

公司在 2003 年被“ST”,在此仅对它进行纯定量分析,根据该公司在 t2 年(即 2001 年)

每天股票收盘价计算对应的违约距离 DD 和预期违约率 EDF,见附录 8。 该公司在 2001 年有 239 天在股市交易,于是计算得到了 239 组 DD 和 EDF 数据,但

这不利于对这两个指标变化趋势的观察,所以将利用 MATLAB 的 plot 函数对这两个指标

的变化趋势进行描绘,得到图 16-7 和图 16-8 所示的两条曲线。从这两个图可以看出,该

公司在 2001 年的违约距离 DD 和预期违约率 EDF 整体上分别呈明显的下降和上升趋势,

说明利用 KMV 模型对该公司进行信用风险的判断是准确的,在被“ST”的 t2 年公司的

利益相关者就能根据模型得到的结果采取相应的措施来规避风险。

图 16-7 公司(000801)违约距离 DD 的变化趋势 图 16-8 公司(000801)预期违约率 EDF 的变化趋势

本节根据中国资本市场的具体情况,对 KMV 模型进行了修正,然后计算了 60 家 ST公司和 60 家非 ST 公司的 t2 年的违约距离 DD 和预期违约率 EDF,可以得出以下结论。

(1)由于股权分置改革尚未完成,在研究的时候仍取股改前的样本,所以需要首先对

非流通股进行定价才能确定整个公司的资产市场价值。 (2)在对公司资产市场价值服从几何布朗运动及资产收益正态分布假设的基础上计算

得到的预期违约率 EDF 数值非常小,不符合实际情况,所以这个假设是不成立的。计算预

期违约率 EDF 的意义只在于可以观察它的相对值,要建立违约距离 DD 和预期违约率 EDF的映射关系必须建立上市公司违约数据库。

(3)公司资产市场价值波动率 A 实际上是Black-Scholes-Merton模型期权公式的隐含波

动率,本节通过迭代的办法得到了 A 比较科学的结果。 (4)ST 公司在 t2 年公司的资产市场价值波动率显著大于非 ST 公司,说明公司资产

价值波动主要来源于流通股价的波动,所以流通股价格的波动加大很可能是公司财务恶化

的标志。 (5)ST 公司在 t2 年的违约距离 DD 显著小于非 ST 公司,ST 公司的预期违约率 EDF

显著大于非 ST 公司,说明用 KMV 模型计算公司的违约距离和预期违约率来预测公司未来

的信用风险状况是可行的。 (6)上市公司资产价值波动率 A 与该公司的违约距离 DD 显著相关,且呈负相关关系;

上市公司资产价值波动率 A 与该公司的预期违约率 EDF 显著相关,且呈正相关关系。

269

第 16 章 上市公司信用度量模型及其 MATLAB 应用

(7)用 DD 来判别公司未来财务状况,判断处于财务危机区域的公司的误判率为

3.125%,判断处于财务安全区域的公司的误判率为 9.375%,均高于通过前面建立的因子分

析模型和 BP 神经网络模型计算的值。 (8)在 ST 组样本中抽取一家样本公司,根据其 t2 年的股票价格数据计算了当年每天

的违约距离 DD 和预期违约率 EDF,结果显示公司在 t2 年的违约距离 DD 和预期违约率

EDF 整体上分别呈明显的下降和上升趋势。 根据上述结论,在中国资本市场完全可以利用 KMV 模型来及时识别上市公司的信用

风险,由于股票价格信息除了反映公司历史状况,更为重要的是包含了市场对公司未来发

展前景的预期。因此,投资者还可以参考模型的信用风险评价结果选择低风险、高收益的

投资组合, 大限度地化解信用风险,保障资金的安全,实现收益 大化。

本章小结 本章首先通过分析上市公司的财务比率,分别建立了信用风险度量的因子分析模型和

BP 神经网络模型,然后根据中国资本市场的特点对国际上流行的 KMV 信用风险度量模型

进行修正,验证了 KMV 模型在我国的适用性。

附录 1 建模样本(训练样本)

证券代码 是否

ST 会计年度 流动比率 速动比率

营运资本占

总资本比率

利息保障

倍数

总资产

周转率

总资产净

利润率

权益净

利润率

现金流量对

负债比率

000005 0 20011231 0.7062 0.4749 0.567 -0.6071 0.0349 -0.0346 -0.0617 -0.046

000505 0 20011231 1.328 0.4642 0.5577 -1.7285 0.128 -0.0533 -0.0979 -0.0555

000529 0 20011231 1.4802 1.1004 0.5447 -4.9046 0.2175 -0.1373 -0.2564 0.16195

000552 0 20021231 1.0165 0.3088 0.4816 -7.0449 0.1435 -0.0993 -0.2062 -0.0046

000561 0 20011231 1.1148 0.8623 0.3695 -23.746 0.4552 -0.2433 -0.6655 -0.0914

000587 0 20021231 1.4833 0.8224 0.4423 -2.2244 0.2052 -0.0671 -0.1567 -0.0459

000691 0 20021231 1.2384 0.4257 0.7348 1.53885 0.0585 0.0016 0.00225 0.39573

000710 0 20011231 1.1934 0.9826 0.452 -9.8217 0.1431 -0.1241 -0.2784 -0.4361

000718 0 20011231 0.9742 0.8483 0.4324 1.39922 0.3051 0.00161 0.00372 0.03698

000736 0 20021231 1.1401 0.9672 0.4161 2.52111 0.3132 0.02295 0.07203 0.00416

000765 0 20011231 0.5988 0.5367 0.3944 -0.2675 0.1881 -0.0273 -0.0794 -0.2701

000766 0 20021231 0.8608 0.7773 0.3206 1.55351 0.1052 0.01073 0.03359 0.06991

000776 0 20021231 0.4933 0.4737 0.44 -15.99 0.275 -0.4936 -1.1219 0.16224

000799 0 20021231 1.5317 0.999 0.5014 -3.3375 0.1683 -0.0635 -0.1297 0.1929

000802 0 20021231 0.7245 0.2814 0.277 -3.4392 0.3105 -0.0563 -0.2204 0.10763

000805 0 20021231 0.8876 0.7003 0.4798 6.61454 0.6757 0.05335 0.12031 -0.018

000816 0 20021231 1.5732 1.2603 0.5791 -6.1514 0.7582 -0.0621 -0.113 -0.0488

000832 0 20021231 1.8738 1.474 0.7336 3.62733 0.676 0.01882 0.02727 0.35597

000950 0 20021231 0.7931 0.5782 0.3634 -3.9895 0.3691 -0.1087 -0.2991 0.0767

000951 0 20011231 1.1838 0.7476 0.3686 -1.9277 0.333 -0.0521 -0.1414 -0.0894

000980 0 20011231 1.7182 1.4883 0.471 1.2638 0.2051 0.00113 0.0024 -0.0639

600077 0 20021231 2.1666 1.4452 0.6326 -3.4797 0.3688 -0.0909 -0.1505 -0.1246

600338 0 20011231 2.0105 1.5718 0.6012 9.17157 0.5592 0.03039 0.05055 -0.2574

600617 0 20011231 1.2495 0.4863 0.5487 1.18525 0.5723 0.002 0.00396 -0.0799

600659 0 20021231 0.8757 0.8483 0.4242 2.75148 0.304 0.01693 0.0512 -0.1229

600672 0 20011231 1.134 0.6702 0.6019 3.96351 0.4698 0.02202 0.04055 0.28869

600691 0 20021231 1.1569 0.8511 0.3588 -1.4189 0.2109 -0.0514 -0.1434 -0.0261

271

附录 1 建模样本(训练样本)

续表

证券代码 是否

ST 会计年度 流动比率 速动比率

营运资本占

总资本比率

利息保障

倍数

总资产

周转率

总资产净

利润率

权益净

利润率

现金流量对

负债比率

600695 0 20011231 0.9017 0.4426 0.4507 -1.7825 0.8722 -0.0703 -0.1733 0.0326

600735 0 20021231 1.4996 1.1818 0.6066 -18.202 0.2175 -0.1533 -0.2527 0.04425

600738 0 20011231 0.5868 0.2069 0.2888 -0.3847 0.5971 -0.0365 -0.1275 -0.0056

600760 0 20011231 2.9271 1.7499 0.7734 -17.056 0.2948 -0.0542 -0.0701 0.04928

600776 0 20021231 1.8394 1.2516 0.5666 -20.654 1.1989 -0.03 -0.0598 -0.2697

600781 0 20011231 0.8725 0.7824 0.3859 -1.9442 0.3866 -0.1291 -0.3608 -0.0055

600788 0 20021231 1.4109 1.2294 0.5728 2.59904 0.1331 0.01228 0.0216 0.07521

600807 0 20011231 0.4073 0.3799 0.3538 -5.5505 0.1026 -0.2258 -0.6691 -0.0335

600869 0 20021231 1.2044 0.9785 0.3777 -9.0677 0.2756 -0.2373 -0.6384 0.10733

600873 0 20011231 0.734 0.5277 0.5169 -3.3146 0.1215 -0.0855 -0.1654 0.05767

600899 0 20011231 1.0556 1.0453 0.4347 1.83856 0.152 0.01443 0.03441 -0.2377

000004 1 20011231 1.5026 1.3362 0.4705 2.54544 0.4599 0.02118 0.95574 -0.337

000018 1 20011231 2.8056 1.7087 0.8199 2.33562 0.4297 0.00358 0.08694 0.28203

000078 1 20011231 1.7499 1.7008 0.6016 3.1928 0.2419 0.01231 0.08415 -0.083

000088 1 20011231 0.2478 0.2459 0.6227 78.9777 0.1478 0.16183 0.32425 0.24671

000413 1 20011231 0.4816 0.4526 0.4448 2.95185 0.0356 0.01939 -0.1405 -0.0274

000510 1 20011231 0.8601 0.599 0.3702 3.37886 0.3982 0.04236 0.48446 0.05948

000540 1 20011231 1.3769 0.4553 0.3913 1.37419 0.1432 0.00569 -0.1401 -0.1726

000586 1 20011231 1.2739 1.1231 0.4584 1.98743 0.4114 0.0025 -0.296 0.02502

000589 1 20011231 1.1994 0.7687 0.3509 1.62863 0.6456 0.01003 0.18942 0.05595

000619 1 20011231 3.6914 1.978 0.8331 39.5433 1.019 0.12589 0.41679 0.69853

000623 1 20011231 1.3303 1.1611 0.651 11.0968 0.305 0.04016 0.28727 -0.007

000626 1 20011231 1.1213 0.9551 0.2311 3.34339 3.3894 0.02283 0.34505 -0.18

000882 1 20011231 0.9706 0.9313 0.4348 1.67964 0.5449 0.00735 2.40684 0.25801

000883 1 20011231 1.6453 1.2019 0.4965 4.47541 1.1109 0.01887 0.24187 0.17337

000911 1 20011231 0.6942 0.6028 0.5153 5.87259 0.9649 0.03978 0.48342 0.26461

000912 1 20011231 1.7854 1.4704 0.5535 4.2225 0.4626 0.03117 0.09961 0.29911

000917 1 20011231 1.3102 1.2742 0.5187 1.3176 0.1403 0.00827 -0.0129 -0.2359

000918 1 20011231 0.9591 0.6446 0.3613 1.74324 0.3282 0.00728 0.71907 0.01902

000955 1 20011231 2.5557 2.002 0.615 2.62908 0.1881 0.01079 -0.0601 0.26556

000958 1 20011231 1.7476 1.6625 0.5717 8.7079 0.1994 0.0346 -0.0992 0.24482

000959 1 20011231 1.3979 1.1833 0.5147 5.40106 1.2564 0.06817 0.04694 0.30126

000960 1 20011231 1.19 0.7977 0.5171 1.03822 0.5428 0.00051 0.06969 -0.0939

000961 1 20011231 0.8353 0.6223 0.3452 2.51933 0.3987 0.01459 0.05021 0.04509

000993 1 20011231 1.4613 1.4437 0.6122 2.15097 0.095 0.00931 0.03697 0.08241

000996 1 20011231 1.9234 1.7786 0.7398 -5.0578 0.2386 -0.0405 -0.2651 -0.1874

000999 1 20011231 1.3067 1.1929 0.4236 2.87832 0.3162 0.02409 0.15978 0.12656

600001 1 20011231 1.3786 0.9298 0.6699 29.052 0.7986 0.05361 0.0882 0.27827

272

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表

证券代码 是否

ST 会计年度 流动比率 速动比率

营运资本占

总资本比率

利息保障

倍数

总资产

周转率

总资产净

利润率

权益净

利润率

现金流量对

负债比率

600002 1 20011231 0.5485 0.2381 0.6592 1.87061 1.0762 0.0064 -0.0431 0.7027

600063 1 20011231 0.7365 0.5296 0.4466 4.87529 0.5068 0.03031 0.4636 0.18356

600064 1 20011231 1.0697 0.4398 0.4186 2.56596 0.2904 0.02839 0.63817 -0.007

600086 1 20011231 1.5489 1.5464 0.6981 3.24569 0.1153 0.01846 -0.6246 0.15219

600088 1 20011231 2.2335 1.9998 0.8228 3.2245 0.3432 0.00248 -0.1324 0.44851

600089 1 20011231 1.1092 0.7688 0.3697 3.59904 0.6505 0.03236 0.34437 0.1909

600122 1 20011231 1.315 1.0288 0.3648 1.82594 0.755 0.01184 0.10242 0.0566

600149 1 20011231 2.3945 1.8342 0.6074 3.14979 0.4598 0.03269 0.09758 0.07792

600173 1 20011231 1.2021 0.8447 0.5319 1.30634 0.3553 0.00288 0.05783 -0.1564

600199 1 20011231 1.8034 1.3746 0.6117 2.40423 0.2554 0.01123 -0.1923 -0.0335

600220 1 20011231 3.2141 2.8186 0.5453 9.64598 0.3436 0.05008 0.15086 0.41349

附录 2 预测样本

证券代码 是否 ST 会计年度 流动比率 速动比率营运资本占

总资本比率

利息保

障倍数

总资产

周转率

总资产净

利润率

股东权益

净利润率

现金流量对

负债比率

000040 0 20011231 1.1092 0.5459 0.5411 -1.6342 0.1574 -0.0628 -0.1187 0.05061

000537 0 20021231 1.5938 1.4918 0.5532 -0.3396 0.1538 -0.0289 -0.0523 0.24068

000695 0 20011231 1.3245 1.1917 0.4163 -0.2061 0.2265 -0.0324 -0.0786 -0.1205

000730 0 20011231 2.2333 2.0355 0.4528 0.99192 0.133 -0.0045 -0.0106 -0.4074

000801 0 20011231 1.6722 0.9016 0.668 -12.69 0.1963 -0.1611 -0.2564 0.01786

000809 0 20011231 0.7523 0.4169 0.3702 -8.8282 0.814 -0.1389 -0.3907 -0.0213

000827 0 20021231 1.0699 0.9599 0.5196 1.22213 0.2095 0.00263 0.00546 0.13684

000931 0 20021231 1.033 0.8184 0.2745 -0.2966 0.1267 -0.0254 -0.1236 -0.0471

000995 0 20021231 1.5281 1.0885 0.7016 2.29881 0.1578 0.00325 0.0047 -0.0408

600090 0 20011231 1.0686 0.8726 0.3437 3.26198 0.4142 0.04599 0.13894 -0.0287

600203 0 20021231 1.1292 1.0795 0.3691 1.01774 0.7509 0.00087 0.00268 0.00489

600613 0 20011231 0.7423 0.718 0.6158 -5.3065 0.0899 -0.1068 -0.1804 -0.1305

600681 0 20011231 1.2823 0.9659 0.4651 2.08479 0.2876 0.02019 0.04452 0.02396

600737 0 20021231 0.6602 0.4838 0.258 1.79019 0.3075 0.01782 0.11152 0.11462

600752 0 20021231 1.6983 1.5778 0.6187 -10.389 0.0362 -0.154 -0.2511 -0.2694

600766 0 20011231 1.0794 0.9013 0.338 -3.4729 0.2578 -0.089 -0.2894 -0.1605

600844 0 20021231 1.1938 1.0707 0.2991 -5.9147 0.0704 -0.0736 -0.252 -0.0607

600876 0 20021231 0.7577 0.6172 0.4511 -6.1261 0.291 -0.1216 -0.283 0.01824

000627 1 20011231 1.5019 1.0992 0.7043 2.49132 0.3197 0.00483 -0.0208 -0.216

000666 1 20011231 1.4453 0.8971 0.4864 6.67337 0.5925 0.02884 0.27681 0.19143

000667 1 20011231 1.8439 0.8896 0.5695 14.8613 0.3783 0.06144 1.35904 0.38323

000668 1 20011231 0.8278 0.4566 0.3428 2.56627 1.2297 0.02302 -0.0439 0.11961

000697 1 20011231 1.9222 1.5612 0.6641 3.1012 0.4535 0.00788 0.09617 0.42611

000698 1 20011231 0.5882 0.4312 0.5906 1.00855 0.6841 -0.005 0.04747 0.11189

000700 1 20011231 1.9283 1.7114 0.7097 8.36345 0.3075 0.05022 0.4166 0.47925

000725 1 20011231 1.1575 1.0096 0.3894 2.98379 0.7052 0.01221 0.79154 0.05748

000727 1 20011231 0.6006 0.5622 0.6072 4.45924 0.1419 0.031 -0.1172 0.12369

274

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表

证券代码 是否 ST 会计年度 流动比率 速动比率营运资本占

总资本比率

利息保

障倍数

总资产

周转率

总资产净

利润率

股东权益

净利润率

现金流量对

负债比率

000762 1 20011231 2.5704 2.0405 0.6916 -9.21 0.2441 -0.0903 -0.1299 0.02801

000763 1 20011231 1.2731 0.4921 0.6544 3.30724 3.8319 0.00535 0.04544 0.52255

000810 1 20011231 0.9917 0.5635 0.3999 2.67068 0.7499 0.02228 0.88223 0.05711

000811 1 20011231 0.8191 0.3886 0.3846 6.47687 0.6099 0.04071 0.17625 0.16135

000812 1 20011231 1.0647 0.8925 0.527 3.19916 0.324 0.02959 0.62011 0.04394

000813 1 20011231 1.6648 0.7568 0.5528 1.26249 0.304 0.00451 0.27414 0.06562

000837 1 20011231 2.0877 1.4562 0.5951 3.13706 0.3736 0.02517 -0.0113 0.2104

000838 1 20011231 0.967 0.4529 0.2574 7.4224 0.6155 0.04595 0.73333 -0.0681

000839 1 20011231 1.2666 1.1097 0.5806 4.12963 0.2038 0.03928 1.07316 0.11446

附录 3 BP 神经网络 MATLAB 程序

bpnn.m %construct and train bpnn net=newff(threshold,[8,1],{'tansig','tansig'},'trainlm'); net.trainParam.epochs=10000; net.trainParam.goal=0.0001; LP.lr=0.1; net=train(net,in1,target); %simulate net_out=sim(net,in1)

附录 4 样本截面数据

代 码 是否ST 非流通股数 流通股数 每股净资产 非流通股每股价格 非流通股市值 DP

600385 0 73488648 67835000 1.3816351 2.058267 151259231 208713928.7

600758 0 98160000 61595200 1.9368907 2.352552 230926513 773553008.8

600738 0 103141120 131256000 1.3284006 2.030052 209381872 723913757.7

000583 0 100936194 130720000 5.9915636 4.501529 454367175 753890767

600090 0 193795686 174120960 1.4860337 2.113598 409606149 1049103427

600807 0 43576995 64350000 1.2753119 2.001915 87237454 256658989.9

000710 0 107100000 44100000 1.053253 1.884224 201800399 195812159.6

000765 0 178240204 70616448 1.0632657 1.889531 336790357 464872981.9

000801 0 92723904 39311999 1.0077181 1.860091 172474864 70284526.44

600781 0 126967864 50625000 1.0984505 1.908179 242277380 315907488.2

600735 0 71351406 83461530 1.5548832 2.150088 153411810 156124622

600737 0 285228000 290203590 1.7551954 2.256254 643546694 4475576173

600700 0 135206760 155691288 1.0287291 1.871226 253002464 732629280.1

000695 0 144897639 77249900 1.6582565 2.204876 319481316 520812066.4

000409 0 96097677 75276471 1.2636043 1.99571 191783120 45880446.33

000049 0 92105587 44723572 1.0244695 1.868969 172142469 195068646.3

600899 0 123200000 54305386 2.6003485 2.704185 333155554 621721285.9

600159 0 216993936 88007680 2.3044347 2.54735 552759586 360397839

600681 0 99544230 108523800 1.5475434 2.146198 213641627 476279169.4

000766 0 164082276 284934000 1.0883595 1.902831 312220762 1039991156

000776 0 90926034 93183954 1.0409895 1.877724 170734035 198981570.3

600691 0 44058499 33216000 1.0607211 1.888182 83190474 145303369.3

000931 0 300000000 374846940 2.2551626 2.521236 756370855 5342125556

000805 0 42802100 14416150 1.7821108 2.270519 97182970 118883464.8

000730 0 372651994 193333140 1.0264242 1.870005 696861027 606878572

600766 0 110952273 60213240 1.5220503 2.132687 236626431 560550015.4

600053 0 85020000 76050000 2.1614625 2.471575 210133319 1032182852

000552 0 111078000 66792000 1.0709731 1.893616 210339047 203200145.7

277

附录 4 样本截面数据

续表 代 码 是否ST 非流通股数 流通股数 每股净资产 非流通股每股价格 非流通股市值 DP

600852 0 108000000 56308602 1.1964337 1.96011 211691866 707789523.5

000736 0 40001300 25998700 3.923277 3.405337 136217899 474176115.7

000621 0 94006250 55676948 2.1315699 2.455732 230854160 264897101

600873 0 56100000 52136600 1.9818122 2.37636 133313823 165212508.8

000561 0 154924880 242087705 1.2245855 1.97503 305981335 828902403.7

000769 0 104400000 81000000 2.4023044 2.599221 271358706 127979660.2

000691 0 128000000 130180000 2.3939629 2.5948 332134445 230719887.8

000587 0 102272723 83438855 2.0386966 2.406509 246120249 468784215.5

600891 0 114144800 129419334 2.2462301 2.516502 287245614 335957261.7

600077 0 80278400 46540742 2.4010791 2.598572 208609198 160082952.7

600847 0 48763000 39897000 1.0015793 1.856837 90544944 109268739.3

600313 0 172200000 80000000 2.9993025 2.91563 502071542 592558514

000827 0 37536000 29203200 3.7941977 3.336925 125254808 249889317

600892 0 35190300 15309700 1.0310384 1.87245 65892090 267635504.3

000950 0 100000000 55000000 2.1230886 2.451237 245123697 551845904.2

000040 0 182792896 286800468 2.2543937 2.520829 460789571 879458328

600139 0 46610200 29400000 1.3665975 2.050297 95564738 306098199.4

600240 0 100000000 75000000 3.8379269 3.360101 336010126 76030304.99

600752 0 177575574 160888554 2.2218958 2.503605 444579057 461484393.6

600338 0 108333333 50000000 3.8571487 3.370289 365114622 390126731.3

000555 0 59827678 22000000 1.1942723 1.958964 117200286 198242538.6

600869 0 90000000 30000000 1.0532351 1.884215 169579312 187069774.2

000832 0 168469773 183600000 3.6323526 3.251147 547719978 464694480.2

600672 0 184976960 256000000 1.4223681 2.079855 384725271 454104820.6

000809 0 79570000 35000000 1.399673 2.067827 164536971 231365084

000537 0 239920387 166228258 1.961048 2.365355 567496992 643228058.3

600878 0 195794419 88636288 1.7321821 2.244057 439373739 304077896.2

600335 0 81628600 35000000 2.4211901 2.609231 212987853 274445781.7

600615 0 103915926 46500480 3.5809565 3.223907 335015275 403909344.3

600156 0 302900000 136000000 2.4059938 2.601177 787896428 469909938.1

600182 0 220000000 120000000 1.7832878 2.271143 499651354 1164241180

600203 0 186400000 70000000 2.3258765 2.558715 476944388 1153760823

000023 1 92565018 46191222 1.2263925 1.975988 182907368 637053103.9

000159 1 101792300 70000000 3.4037147 3.129969 318606720 908987242.4

000046 1 117566103 126518238 3.9480877 3.418486 401898134 956684903.9

000009 1 379292401 579517641 1.2484007 1.987652 753901448 2725359844

600173 1 150000000 80000000 2.663286 2.737542 410631238 501571485.3

600069 1 226000000 145600000 1.0173079 1.865173 421529141 547546119.2

000522 1 217800000 156544355 1.0660461 1.891004 411860760 1855947898

278

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 代 码 是否ST 非流通股数 流通股数 每股净资产 非流通股每股价格 非流通股市值 DP

600108 1 348223200 276822000 2.1920923 2.487809 866312790 443441079.6

000430 1 109242000 74358000 1.1351825 1.927647 210579981 103708031.3

600131 1 196594200 99950008 2.0076363 2.390047 469869420 706862186.9

000066 1 277649893 180841607 2.5758572 2.691204 747212590 1076390064

600289 1 65890000 40000000 8.3927355 5.77415 380458730 452066041.2

600070 1 13411200 31200000 3.0231629 2.928276 39271700 138120790.9

600037 1 190000000 80000000 6.0366057 4.525401 859826193 217953207.6

600095 1 110493993 151066007 2.2764815 2.532535 279829928 648494303

600286 1 60000000 35000000 3.4895458 3.175459 190527556 520944752.9

000078 1 114744000 107056000 7.5132761 5.308036 609065319 1068856514

000406 1 81832680 221523660 4.3668285 3.640419 297905253 662904275

000006 1 95861432 157730199 4.6965452 3.815169 365727562 2683776841

000153 1 40002300 25000000 8.2315907 5.688743 227562806 173329252.4

000031 1 302812500 163489877 2.0318431 2.402877 727621141 534614759

600058 1 304088710 120000000 4.3543155 3.633787 1.105E+09 3422512844

000156 1 60500000 36000000 4.9588295 3.95418 239227867 153151544

000507 1 149439400 195558020 2.7197853 2.767486 413571476 312097853

000517 1 62092881 27801810 3.2293593 3.03756 188610878 447873068.8

600305 1 87150000 40000000 2.9498151 2.889402 251811385 83913090.39

600312 1 123500000 60000000 4.8055204 3.872926 478306335 429950092.8

600075 1 129600000 97200000 4.7993193 3.869639 501505245 1390690612

000400 1 183872000 194400000 3.8332834 3.35764 617376022 1081465693

000033 1 220500000 67223488 1.5048173 2.123553 468243475 163469279.4

600066 1 43000520 93723141 6.2433128 4.634956 199305508 550363170

600136 1 63520000 40924000 4.0277955 3.460732 219825673 425646973.9

000419 1 110426780 65081375 3.1266335 2.983116 329415866 444294460.5

000421 1 121218112 75964893 2.0870584 2.432141 294819535 452110354.5

000032 1 94511997 36300003 2.0298321 2.401811 226999957 571096103.3

000099 1 136000000 60000000 4.4164095 3.666697 498670799 201318872.8

600170 1 404415000 195000000 4.5299375 3.726867 1.507E+09 3787636737

600009 1 90000000 512307000 3.5552818 3.210299 288926941 1221652993

600296 1 185004480 110000000 4.0659973 3.480979 643996630 786336762.2

600059 1 126330000 106470000 4.8166261 3.878812 490010300 511860438.9

600051 1 217002140 85397860 2.719262 2.767209 600490242 1336889444

600105 1 174610462 75000000 2.7469651 2.781892 485747360 619123865.2

600081 1 150750000 50250000 1.9227723 2.345069 353519197 473639766

000027 1 596815960 405263484 2.5931368 2.700363 1.612E+09 2898846141

000021 1 532350000 200582101 3.0978822 2.967878 1.58E+09 1781935442

600192 1 210000000 110500000 3.1857592 3.014452 633035003 826925785.3

279

附录 4 样本截面数据

续表 代 码 是否ST 非流通股数 流通股数 每股净资产 非流通股每股价格 非流通股市值 DP

600166 1 200466000 80000000 3.5849572 3.226027 646708795 2063182942

000042 1 170341384 69121656 5.3572367 4.165335 709529001 2641077503

600098 1 1018800000 234000000 3.8331313 3.35756 3.421E+09 2644819075

600160 1 256800000 114400000 3.5571476 3.211288 824658817 867094403.7

600018 1 692200000 210000000 5.0924071 4.024976 2.786E+09 1866707427

000088 1 460107400 124892600 2.5560988 2.680732 1.233E+09 1477523874

600178 1 323500000 138580000 3.0928187 2.965194 959240226 655997886.4

000301 1 367000000 99650212 2.7542328 2.785743 1.022E+09 620998530

600087 1 166523072 72800000 3.3871872 3.121209 519753351 149072318.7

600102 1 715182000 156000000 3.7096917 3.292137 2.354E+09 1767806181

600006 1 700000000 300000000 2.957879 2.893676 2.026E+09 1794351260

600126 1 479587500 165750000 3.1672896 3.004664 1.441E+09 885605006

000059 1 494226514 168998700 2.0211314 2.3972 1.185E+09 900154824

600188 1 1670221000 179779000 3.039487 2.936928 4.905E+09 2571440395

附录 5 样本时间序列数据(限于篇

幅,仅以股票代码 000040

的公司为例)

时 间 价 格 股权总价值 时 间 价 格 股权总价值 时 间 价 格 股权总价值

20010102 9.88 3294378194 20010216 9.29 3125165918 20010321 9.4 3156713970

20010103 9.9 3300114204 20010219 9.41 3159581974 20010322 9.59 3211206059

20010104 9.78 3265698148 20010220 9.31 3130901928 20010323 9.4 3156713970

20010105 9.85 3285774180 20010221 9.09 3067805825 20010326 9.5 3185394017

20010108 9.71 3245622115 20010222 8.87 3004709722 20010327 9.49 3182526012

20010109 9.77 3262830143 20010223 8.98 3036257773 20010328 9.54 3196866035

20010110 10.02 3334530260 20010226 9.02 3047729792 20010329 9.44 3168185988

20010111 10.01 3331662255 20010227 9.14 3082145848 20010330 9.41 3159581974

20010112 9.89 3297246199 20010228 9.04 3053465801 20010402 9.84 3282906176

20010115 9.72 3248490120 20010301 8.99 3039125778 20010403 10.19 3383286339

20010116 9.76 3259962138 20010302 9.08 3064937820 20010404 9.94 3311586222

20010117 9.68 3237018101 20010305 9.08 3064937820 20010405 10.19 3383286339

20010118 9.72 3248490120 20010306 9.01 3044861787 20010406 10.12 3363210307

20010119 9.91 3302982208 20010307 9.05 3056333806 20010409 10.26 3403362372

20010205 9.79 3268566152 20010308 9.18 3093617867 20010410 10.18 3380418335

20010206 9.68 3237018101 20010309 9.38 3150977960 20010411 9.94 3311586222

20010207 9.62 3219810073 20010312 9.28 3122297914 20010412 10.16 3374682325

20010208 9.33 3136637937 20010313 9.15 3085013853 20010413 9.99 3325926246

20010209 9.49 3182526012 20010314 9.19 3096485871 20010416 10.66 3518082559

20010212 9.47 3176790003 20010315 9.17 3090749862 20010417 11 3615594719

20010213 9.45 3171053993 20010316 9.15 3085013853 20010418 10.85 3572574648

20010214 9.4 3156713970 20010319 9.22 3105089886 20010419 10.99 3612726714

20010215 9.39 3153845965 20010320 9.42 3162449979 20010420 10.58 3495138522

281

附录 5 样本时间序列数据(限于篇幅,仅以股票代码 000040 的公司为例)

续表 时 间 价 格 股权总价值 时 间 价 格 股权总价值 时 间 价 格 股权总价值

20010423 10.46 3460722466 20010622 10.22 3391890354 20010815 8.41 2872781506

20010424 10.5 3472194485 20010625 10.36 3432042419 20010816 8.29 2838365450

20010425 10.08 3351738288 20010626 10.52 3477930494 20010817 8.2 2812553408

20010426 10.11 3360342302 20010627 10.42 3449250447 20010820 8.22 2818289418

20010427 10.15 3371814321 20010628 10.27 3406230377 20010821 8.22 2818289418

20010430 10.2 3386154344 20010629 10.28 3409098382 20010822 8.1 2783873361

20010508 10.23 3394758358 20010702 10.17 3377550330 20010823 8.16 2801081389

20010509 10.08 3351738288 20010703 10.15 3371814321 20010824 8.07 2775269347

20010510 10.09 3354606293 20010704 10.13 3366078311 20010827 7.81 2700701226

20010511 10.06 3346002279 20010705 10.12 3363210307 20010828 7.65 2654813151

20010514 10.23 3394758358 20010706 10.03 3337398265 20010829 7.78 2692097212

20010515 10.19 3383286339 20010709 9.92 3305850213 20010830 7.67 2660549160

20010516 10.13 3366078311 20010710 10.07 3348870283 20010831 7.72 2674889184

20010517 10.06 3346002279 20010711 9.92 3305850213 20010903 7.57 2631869113

20010518 10.07 3348870283 20010712 9.95 3314454227 20010904 7.8 2697833221

20010521 10.04 3340266269 20010713 10.03 3337398265 20010905 7.82 2703569230

20010522 9.99 3325926246 20010716 10 3328794251 20010906 7.76 2686361202

20010523 9.85 3285774180 20010717 9.92 3305850213 20010907 7.55 2626133104

20010524 9.77 3262830143 20010718 9.94 3311586222 20010910 7.69 2666285169

20010528 9.87 3291510190 20010719 9.92 3305850213 20010911 7.78 2692097212

20010529 9.76 3259962138 20010720 10.09 3354606293 20010912 7.62 2646209137

20010530 9.78 3265698148 20010723 10.05 3343134274 20010913 7.59 2637605123

20010531 10.08 3351738288 20010724 9.87 3291510190 20010914 7.45 2597453057

20010601 10.04 3340266269 20010725 9.79 3268566152 20010917 7.2 2525752940

20010604 9.92 3305850213 20010726 9.47 3176790003 20010918 7.23 2534356954

20010605 9.99 3325926246 20010727 9.43 3165317984 20010919 7.28 2548696978

20010606 9.93 3308718218 20010730 8.49 2895725544 20010920 7.25 2540092964

20010607 9.99 3325926246 20010731 8.13 2792477375 20010921 7.13 2505676907

20010608 9.9 3300114204 20010801 8.67 2947349628 20010924 7.11 2499940898

20010611 9.88 3294378194 20010802 8.5 2898593549 20010925 7.12 2502808903

20010612 9.85 3285774180 20010803 8.62 2933009605 20010926 6.9 2439712800

20010613 10 3328794251 20010806 8.32 2846969464 20010927 6.71 2385220711

20010614 10.02 3334530260 20010807 8.41 2872781506 20010928 6.84 2422504772

20010615 10.17 3377550330 20010808 8.32 2846969464 20011008 6.62 2359408669

20010618 10.13 3366078311 20010809 8.46 2887121530 20011009 6.7 2382352706

20010619 10.09 3354606293 20010810 8.58 2921537586 20011010 6.4 2296312566

20010620 9.97 3320190237 20010813 8.59 2924405591 20011011 6.05 2195932402

20010621 10.01 3331662255 20010814 8.45 2884253525 20011012 6.26 2256160500

282

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 时 间 价 格 股权总价值 时 间 价 格 股权总价值 时 间 价 格 股权总价值

20011015 6.39 2293444561 20011115 6.78 2405296744 20011218 7 2468392847

20011016 6.26 2256160500 20011116 6.9 2439712800 20011219 6.9 2439712800

20011017 6.28 2261896510 20011119 7.02 2474128856 20011220 6.68 2376616697

20011018 6.21 2241820477 20011120 7.12 2502808903 20011221 6.65 2368012683

20011019 6.07 2201668411 20011121 7.15 2511412917 20011224 6.37 2287708552

20011022 5.91 2155780336 20011122 7.13 2505676907 20011225 6.37 2287708552

20011023 6.5 2324992613 20011123 7.06 2485600875 20011226 6.48 2319256603

20011024 6.88 2433976790 20011126 6.98 2462656837 20011227 6.53 2333596627

20011025 6.61 2356540664 20011127 7.11 2499940898 20011228 6.66 2370880687

20011026 6.63 2362276673 20011128 7.12 2502808903 20011231 6.61 2356540664

20011029 6.73 2390956720 20011129 7.12 2502808903

20011030 6.66 2370880687 20011130 7.15 2511412917

20011031 6.67 2373748692 20011203 7.28 2548696978

20011101 6.71 2385220711 20011204 7.26 2542960968

20011102 6.72 2388088716 20011205 7.05 2482732870

20011105 6.6 2353672659 20011206 7.05 2482732870

20011106 6.57 2345068645 20011207 7.09 2494204889

20011107 6.17 2230348458 20011210 7.02 2474128856

20011108 6.23 2247556486 20011211 7.03 2476996861

20011109 6.85 2425372776 20011212 7.15 2511412917

20011112 6.83 2419636767 20011213 7.13 2505676907

20011113 6.84 2422504772 20011214 7.2 2525752940

20011114 6.83 2419636767 20011217 6.91 2442580804

附录 6 迭代法求资产价值波动率A和

违约距离 DD 的 MATLAB 程序 bio.m function bio(f_name,a1,c1,dp) f_name % a,c:endpoints of initial interval % it_limit:limit of iteration number % Y_a,Y_c:y values of the current end points % fun_f(x):function value at x eq=[2541618283 … ] for i=2:length(eq) mu(i-1)=log(eq(i)/eq(i-1)); end sig=std(mu)*sqrt(250); % we get sige % fprintf('Bisection Scheme\n\n'); while 1 for j=1:length(eq) tolerance=0.0001;it_limit=30000; it=0; a=a1; c=c1; Y_a=feval(f_name,sig,eq(j),a,dp); Y_c=feval(f_name,sig,eq(j),c,dp); if(Y_a*Y_c>0) fprintf('\n\n Stoped because fa*fc>0'); else while 1 it=it+1; b=(a+c)/2; Y_b=feval(f_name,sig,eq(j),b,dp); if(abs(c-a)<=tolerance) fprintf('Tolerance1 is satisfied.\n'); break

284

金融财务建模与计算——基于 VBA 与 MATLAB 实现

end if(it>it_limit) fprintf('Iteration limit exceeded.\n');break end if(Y_a*Y_b<=0) c=b; Y_c=Y_b; else a=b; Y_a=Y_b; end end va(j)=b; fprintf('Result:VA=%12.2f \n',b); end end { for k=2:length(va) mu1(k-1)=log(va(k)/va(k-1)); end sig1=std(mu1)*sqrt(250); if(abs(sig1-sig)<=tolerance) fprintf('Tolerance2 is satisfied.\nFinial result: \n va='); sumva=0; len=length(va); for m=1:len fprintf('%18.2f \n',va(m)); sumva=sumva+va(m); end eva=sumva/len; fprintf(' \n E(VA)=%18.2f \n',eva); fprintf('sig=%8.4f \n',sig1); dd=(eva-dp)/(eva*sig1); edf=normcdf(-dd,0,1); fprintf('DD=%8.3f \n',dd); fprintf('EDF=%12.10f \n',edf); break else sig=sig1; end end } { for k=2:length(va) mu1(k-1)=log(va(k)/va(k-1)); end sig1=std(mu1)*sqrt(250); if(abs(sig1-sig)<=tolerance) fprintf('Tolerance2 is satisfied.\nFinial result: \n va='); sumva=0; len=length(va); for m=1:len dd(m)=(va(m)-dp)/(va(m)*sig1); edf(m)=normcdf(-dd(m),0,1);

285

附录 6 迭代法求资产价值波动率A和违约距离 DD 的 MATLAB 程序

fprintf('%18.2f %18.3f%18.2f\n',va(m),dd(m),edf(m)); end plot(dd); plot(edf); fprintf('sig=%8.4f \n',sig1); break else sig=sig1; end end }

说明:以上程序未用大括号标识的为共用程序。

merton.m function f=merton(sig,eq,va,dp) r=0.0225; t=1; d1=(log(va/dp)+(r+sig^2/2)*t)/(sig*sqrt(t)); d2=d1-sig*sqrt(t); f=va*normcdf(d1,0,1)-dp*exp(-r*t)*normcdf(d2,0,1)-eq;

附录 7 违约距离 DD(t2)与预期

违约率 EDF 数据 代 码 是否 ST 资产波动率 DD EDF

000040 0 0.2107 3.65 0.000131154

000049 0 0.2764 2.806 0.002508095

000409 0 0.3437 2.803 0.002531544

000537 0 0.2008 4.088 2.1767E-05

000552 0 0.2361 3.324 0.000443738

000555 0 0.1927 3.895 4.91188E-05

000561 0 0.2042 3.451 0.000279305

000583 0 0.5401 1.442 0.07465123

000587 0 0.1882 3.497 0.000235305

000621 0 0.2443 3.371 0.000374533

000691 0 0.2445 3.489 0.000242461

000695 0 0.2905 2.594 0.004743357

000710 0 0.3523 2.398 0.008242425

000730 0 0.2069 3.195 0.000699219

000736 0 0.1587 3.369 0.000377261

000765 0 0.326 2.411 0.00795442

000766 0 0.2198 2.964 0.00151841

000769 0 0.2527 3.458 0.000272148

000776 0 0.2783 2.982 0.001431929

000801 0 0.38 2.454 0.007063854

000805 0 0.2389 3.159 0.000791623

000809 0 0.1823 4.07 2.35188E-05

000827 0 0.1929 3.609 0.000153726

000832 0 0.1988 3.96 3.74913E-05

000931 0 0.1564 3.147 0.000824841

287

附录 7 违约距离 DD(t2)与预期违约率 EDF 数据

续表 代 码 是否 ST 资产波动率 DD EDF

000950 0 0.1754 3.638 0.000137416

600053 0 0.161 3.303 0.00047834

600077 0 0.2289 3.574 0.000175823

600090 0 0.3758 1.982 0.02373955

600139 0 0.1998 3.682 0.000115737

600156 0 0.1745 4.566 2.48807E-06

600159 0 0.2954 2.852 0.002172319

600182 0 0.118 4.595 2.16598E-06

600203 0 0.1058 4.597 2.1453E-06

600240 0 0.2487 3.754 8.70445E-05

600313 0 0.2014 3.597 0.000160992

600335 0 0.1731 4.099 2.07582E-05

600338 0 0.1963 3.89 5.01418E-05

600385 0 0.978 0.898 0.18459274

600615 0 0.1724 4.227 1.18491E-05

600672 0 0.2131 4.023 2.87446E-05

600681 0 0.2443 2.895 0.001895859

600691 0 0.2474 3.033 0.001210747

600700 0 0.2625 2.519 0.005884451

600735 0 0.216 2.497 0.006262462

600737 0 0.2378 2.515 0.005951637

600738 0 0.566 1.301 0.096629292

600752 0 0.2036 3.783 7.75001E-05

600758 0 0.5574 1.297 0.097315658

600766 0 0.2016 3.21 0.000663738

600781 0 0.3173 2.463 0.006889003

600807 0 0.3475 2.395 0.008310174

600847 0 0.2446 3.583 0.000169874

600852 0 0.1462 3.364 0.000384162

600869 0 0.1861 3.934 4.17895E-05

600873 0 0.2459 3.385 0.000355944

600878 0 0.2027 4.091 2.14874E-05

600891 0 0.2269 3.569 0.000179213

600892 0 0.1488 3.626 0.000143958

600899 0 0.2343 2.848 0.00219981

000006 1 0.12 3.9 4.81155E-05

000009 1 0.1731 3.538 0.000201627

000021 1 0.1407 5.136 1.40576E-07

288

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 代 码 是否 ST 资产波动率 DD EDF

000023 1 0.1837 3.297 0.000488676

000027 1 0.1272 5.133 1.42836E-07

000031 1 0.2504 3.947 3.95853E-05

000032 1 0.1336 4.584 2.28314E-06

000033 1 0.2048 4.298 8.62346E-06

000042 1 0.075 5.335 4.78749E-08

000046 1 0.1903 3.514 0.00022075

000059 1 0.1016 7.075 7.52287E-13

000066 1 0.2054 3.742 9.13085E-05

000078 1 0.2371 3.87 5.44383E-05

000088 1 0.1185 5.722 5.27931E-09

000099 1 0.1941 4.616 1.9581E-06

000153 1 0.2185 3.932 4.21387E-05

000156 1 0.214 4.032 2.76657E-05

000159 1 0.1817 3.479 0.00025169

000301 1 0.1317 5.93 1.51984E-09

000400 1 0.1805 4.258 1.03202E-05

000406 1 0.217 3.884 5.13959E-05

000419 1 0.1656 4.479 3.75304E-06

000421 1 0.1595 4.495 3.48168E-06

000430 1 0.246 3.681 0.000116192

000507 1 0.2102 4.126 1.84668E-05

000517 1 0.1585 4.129 1.82275E-05

000522 1 0.1369 3.604 0.000156715

600006 1 0.1107 6.611 1.9187E-11

600009 1 0.1731 4.67 1.50769E-06

600018 1 0.1446 5.491 2.00321E-08

600037 1 0.2504 3.769 8.19776E-05

600051 1 0.1129 4.933 4.0548E-07

600058 1 0.1288 3.998 3.19548E-05

600059 1 0.1652 4.79 8.34972E-07

600066 1 0.1744 4.322 7.73676E-06

600069 1 0.2145 3.548 0.000194125

600070 1 0.2161 3.768 8.23066E-05

600075 1 0.1308 4.24 1.11834E-05

600081 1 0.1546 5.129 1.45903E-07

600087 1 0.1525 5.976 1.14744E-09

600095 1 0.2011 3.793 7.44439E-05

289

附录 7 违约距离 DD(t2)与预期违约率 EDF 数据

续表 代 码 是否 ST 资产波动率 DD EDF

600098 1 0.1365 5.362 4.12433E-08

600102 1 0.1105 6.297 1.52391E-10

600105 1 0.1426 5.047 2.24772E-07

600108 1 0.2388 3.663 0.000124672

600126 1 0.1118 6.965 1.65246E-12

600131 1 0.1891 3.696 0.000109542

600136 1 0.1555 4.457 4.15936E-06

600160 1 0.1344 5.37 3.94555E-08

600166 1 0.0844 5.178 1.12348E-07

600170 1 0.1089 4.646 1.69401E-06

600173 1 0.2049 3.547 0.000194863

600178 1 0.1328 5.876 2.10839E-09

600188 1 0.0636 11.41 0

600192 1 0.134 5.146 1.33291E-07

600286 1 0.1638 3.817 6.75655E-05

600289 1 0.2173 3.761 8.46444E-05

600296 1 0.1505 4.778 8.86354E-07

600305 1 0.2211 4.159 1.59916E-05

600312 1 0.1889 4.175 1.49083E-05

附录 8 公司(000801)在 t2 年违约距

离 DD 与预期违约率 EDF 数据

代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20010102 36.4 1603431627 1672152410 2.521 0.00584854

000801 20010103 36.01 1588099948 1656820731 2.52 0.00586558

000801 20010104 35.7 1575913228 1644634011 2.519 0.00587938

000801 20010105 35.33 1561367788 1630088571 2.518 0.00589616

000801 20010108 35.48 1567264588 1635985371 2.519 0.00588931

000801 20010109 34.86 1542891149 1611611932 2.517 0.00591797

000801 20010110 34.11 1513407149 1582127932 2.515 0.005954

000801 20010111 32.91 1466232751 1534953534 2.511 0.00601495

000801 20010112 32.42 1446969871 1515690654 2.51 0.0060411

000801 20010115 31.55 1412768432 1481489215 2.507 0.00608946

000801 20010116 32.12 1435176271 1503897054 2.509 0.00605749

000801 20010117 32.53 1451294191 1520014974 2.51 0.00603516

000801 20010118 32.03 1431638192 1500358975 2.508 0.00606246

000801 20010119 31.73 1419844592 1488565375 2.508 0.00607925

000801 20010205 31 1391146833 1459867616 2.505 0.00612139

000801 20010207 29.99 1351441714 1420162497 2.502 0.00618298

000801 20010208 29.03 1313702195 1382422978 2.498 0.00624534

000801 20010209 28.05 1275176436 1343897219 2.494 0.00631324

000801 20010212 27.95 1271245236 1339966019 2.494 0.00632043

000801 20010213 27.63 1258665396 1327386179 2.492 0.00634376

000801 20010214 27.8 1265348436 1334069219 2.493 0.0063313

000801 20010215 27.47 1252375476 1321096259 2.492 0.00635562

000801 20010216 27.2 1241761236 1310482019 2.491 0.00637594

000801 20010219 27.21 1242154356 1310875139 2.491 0.00637518

000801 20010220 27.16 1240188756 1308909539 2.49 0.00637898

291

附录 8 公司(000801)在 t2 年违约距离 DD 与预期违约率 EDF 数据

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20010221 27 1233898837 1302619620 2.49 0.00639124

000801 20010222 26.98 1233112597 1301833380 2.49 0.00639279

000801 20010223 27 1233898837 1302619620 2.49 0.00639124

000801 20010226 27.31 1246085556 1314806339 2.491 0.00636762

000801 20010227 27.35 1247658036 1316378819 2.491 0.00636461

000801 20010228 28.13 1278321395 1347042178 2.494 0.00630753

000801 20010301 27.86 1267707156 1336427939 2.493 0.00632694

000801 20010302 27.84 1266920916 1335641699 2.493 0.00632839

000801 20010305 27.61 1257879156 1326599939 2.492 0.00634524

000801 20010306 27.3 1245692436 1314413219 2.491 0.00636837

000801 20010307 27.42 1250409876 1319130659 2.492 0.00635936

000801 20010308 27.22 1242547476 1311268259 2.491 0.00637442

000801 20010309 28.03 1274390196 1343110979 2.494 0.00631468

000801 20010312 27.89 1268886516 1337607299 2.493 0.00632476

000801 20010313 27.9 1269279636 1338000419 2.494 0.00632404

000801 20010314 27.54 1255127316 1323848099 2.492 0.00635042

000801 20010315 27.96 1271638356 1340359139 2.494 0.00631971

000801 20010316 27.09 1237436917 1306157700 2.49 0.00638433

000801 20010319 26.75 1224070837 1292791620 2.489 0.00641068

000801 20010320 26.79 1225643317 1294364100 2.489 0.00640755

000801 20010321 26.88 1229181397 1297902180 2.489 0.00640053

000801 20010322 27.02 1234685077 1303405860 2.49 0.0063897

000801 20010323 26.89 1229574517 1298295300 2.489 0.00639975

000801 20010326 26.98 1233112597 1301833380 2.49 0.00639279

000801 20010327 27.3 1245692436 1314413219 2.491 0.00636837

000801 20010328 28.11 1277535155 1346255938 2.494 0.00630895

000801 20010329 27.15 1239795636 1308516419 2.49 0.00637975

000801 20010330 27.01 1234291957 1303012740 2.49 0.00639047

000801 20010402 27.02 1234685077 1303405860 2.49 0.0063897

000801 20010403 26.36 1208739157 1277459940 2.487 0.00644171

000801 20010404 25.96 1193014358 1261735141 2.485 0.00647446

000801 20010405 24.65 1141515639 1210236422 2.479 0.0065888

000801 20010406 24.5 1135618839 1204339622 2.478 0.00660264

000801 20010409 23.51 1096699960 1165420743 2.473 0.00669817

000801 20010410 23.61 1100631160 1169351943 2.474 0.00668817

000801 20010411 25.18 1162350998 1231071781 2.482 0.00654117

000801 20010412 25.2 1163137238 1231858021 2.482 0.00653941

000801 20010413 25.68 1182006998 1250727781 2.484 0.00649796

292

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20010416 25.48 1174144598 1242865381 2.483 0.00651505

000801 20010417 25.01 1155667959 1224388742 2.481 0.00655624

000801 20010418 25.72 1183579478 1252300261 2.484 0.00649457

000801 20010419 25.56 1177289558 1246010341 2.483 0.00650819

000801 20010420 25.29 1166675318 1235396101 2.482 0.00653153

000801 20010423 24.8 1147412439 1216133222 2.48 0.00657513

000801 20010424 25.08 1158419799 1227140582 2.481 0.00655001

000801 20010425 24.30 1127756439 1196477222 2.477 0.00662134

000801 20010426 24.38 1130901399 1199622182 2.478 0.00661383

000801 20010427 24.50 1135618839 1204339622 2.478 0.00660264

000801 20010430 25.12 1159992278 1228713061 2.481 0.00654647

000801 20010508 25.00 1155274839 1223995622 2.481 0.00655714

000801 20010509 24.46 1134046359 1202767142 2.478 0.00660636

000801 20010510 24.56 1137977559 1206698342 2.478 0.00659709

000801 20010511 24.51 1136011959 1204732742 2.478 0.00660171

000801 20010514 24.86 1149771159 1218491942 2.480 0.0065697

000801 20010516 24.99 1154881719 1223602502 2.481 0.00655803

000801 20010517 25.45 1172965238 1241686021 2.483 0.00651764

000801 20010518 26.06 1196945558 1265666341 2.486 0.00646618

000801 20010521 26.81 1226429557 1295150340 2.489 0.00640598

000801 20010522 26.78 1225250197 1293970980 2.489 0.00640833

000801 20010523 27.48 1252768596 1321489379 2.492 0.00635488

000801 20010524 27.90 1269279636 1338000419 2.494 0.00632404

000801 20010525 27.09 1237436917 1306157700 2.49 0.00638433

000801 20010528 20.51 978763963.1 1047484746 2.455 0.00704059

000801 20010529 19.99 958321723.6 1027042506 2.452 0.00710974

000801 20010530 20.32 971294683.3 1040015466 2.454 0.00706547

000801 20010531 22.35 1051098041 1119818824 2.467 0.00682028

000801 20010601 21.79 1029083322 1097804105 2.463 0.00688362

000801 20010604 22.70 1064857241 1133578024 2.469 0.00678219

000801 20010605 22.57 1059746681 1128467464 2.468 0.00679621

000801 20010606 22.82 1069574681 1138295464 2.469 0.00676939

000801 20010607 22.53 1058174201 1126894984 2.468 0.00680055

000801 20010608 21.95 1035373242 1104094025 2.464 0.00686522

000801 20010611 21.82 1030262682 1098983465 2.463 0.00688015

000801 20010612 21.46 1016110362 1084831145 2.461 0.00692241

000801 20010613 22.01 1037731962 1106452745 2.465 0.00685838

000801 20010614 21.74 1027117722 1095838505 2.463 0.00688943

293

附录 8 公司(000801)在 t2 年违约距离 DD 与预期违约率 EDF 数据

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20010615 21.95 1035373242 1104094025 2.464 0.00686522

000801 20010618 21.38 1012965402 1081686185 2.461 0.00693198

000801 20010619 21.25 1007854842 1076575625 2.46 0.00694768

000801 20010620 21.26 1008247962 1076968745 2.46 0.00694646

000801 20010621 21.55 1019648442 1088369225 2.462 0.00691172

000801 20010622 21.3 1009820442 1078541225 2.46 0.00694162

000801 20010625 21.2 1005889242 1074610025 2.46 0.00695377

000801 20010626 21.2 1005889242 1074610025 2.46 0.00695377

000801 20010627 21.1 1001958042 1070678825 2.459 0.00696602

000801 20010628 21.3 1009820442 1078541225 2.46 0.00694162

000801 20010629 21.19 1005496122 1074216905 2.46 0.00695499

000801 20010702 20.8 990164442.8 1058885225 2.457 0.00700344

000801 20010703 20.3 970508443.3 1039229226 2.454 0.00706812

000801 20010704 20.15 964611643.4 1033332426 2.453 0.00708811

000801 20010705 20.71 986626362.9 1055347146 2.457 0.00701487

000801 20010706 20.25 968542843.3 1037263626 2.453 0.00707475

000801 20010709 20.12 963432283.5 1032153066 2.453 0.00709214

000801 20010710 20.04 960287323.6 1029008106 2.452 0.00710294

000801 20010711 19.38 934341404.2 1003062187 2.447 0.00719525

000801 20010712 19.39 934734524.2 1003455307 2.447 0.00719381

000801 20010713 19.2 927265244.4 995986027.1 2.446 0.00722145

000801 20010716 19.1 923334044.5 992054827.2 2.445 0.00723621

000801 20010717 19.06 921761564.5 990482347.2 2.445 0.00724215

000801 20010718 19.86 953211163.7 1021931946 2.451 0.00712755

000801 20010719 19.88 953997403.7 1022718186 2.451 0.00712479

000801 20010720 20.36 972867163.2 1041587946 2.454 0.0070602

000801 20010723 20.54 979943323.1 1048664106 2.455 0.00703671

000801 20010724 20.2 966577243.4 1035298026 2.453 0.00708141

000801 20010725 19.98 957928603.6 1026649386 2.452 0.0071111

000801 20010726 19.66 945348763.9 1014069547 2.449 0.00715538

000801 20010727 18.7 907609244.9 976330027.6 2.442 0.00729669

000801 20010730 17.48 859648606.1 928369388.8 2.433 0.00749691

000801 20010731 16.42 817977887.2 886698669.9 2.423 0.00769298

000801 20010801 17.1 844710046.5 913430829.2 2.429 0.00756464

000801 20010802 16.76 831343966.8 900064749.5 2.426 0.00762762

000801 20010803 16.48 820336607.1 889057389.8 2.424 0.00768126

000801 20010806 15.1 766086048.5 834806831.2 2.41 0.00797194

000801 20010807 15.41 778272768.2 846993550.9 2.413 0.00790254

294

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20010808 15.3 773948448.3 842669231 2.412 0.00792688

000801 20010809 15.95 799501247.6 868222030.3 2.419 0.0077875

000801 20010810 17 840778846.6 909499629.3 2.428 0.00758292

000801 20010813 17.13 845889406.5 914610189.2 2.43 0.00755919

000801 20010814 16.9 836847646.7 905568429.4 2.428 0.0076014

000801 20010815 17.1 844710046.5 913430829.2 2.429 0.00756464

000801 20010816 16.43 818371007.2 887091789.9 2.423 0.00769102

000801 20010817 16.46 819550367.1 888271149.8 2.424 0.00768516

000801 20010820 16.34 814832927.3 883553710 2.422 0.00770871

000801 20010821 16.37 816012287.2 884733069.9 2.423 0.0077028

000801 20010822 15.95 799501247.6 868222030.3 2.419 0.0077875

000801 20010823 15.93 798715007.7 867435790.4 2.419 0.00779163

000801 20010824 15.65 787707647.9 856428430.6 2.416 0.00785053

000801 20010827 15.2 770017248.4 838738031.1 2.411 0.00794928

000801 20010828 15.66 788100767.9 856821550.6 2.416 0.00784839

000801 20010829 15.99 801073727.6 869794510.3 2.419 0.00777926

000801 20010830 15.88 796749407.7 865470190.4 2.418 0.00780201

000801 20010831 16.57 823874687 892595469.7 2.425 0.00766384

000801 20010903 16.61 825447167 894167949.7 2.425 0.00765615

000801 20010904 17.09 844316926.5 913037709.2 2.429 0.00756646

000801 20010905 16.78 832130206.8 900850989.5 2.426 0.00762385

000801 20010906 16.74 830557726.9 899278509.6 2.426 0.00763139

000801 20010907 15.71 790066367.9 858787150.6 2.416 0.00783775

000801 20010910 16.65 827019646.9 895740429.6 2.425 0.00764849

000801 20010911 17.01 841171966.6 909892749.3 2.428 0.00758108

000801 20010912 16.89 836454526.7 905175309.4 2.427 0.00760326

000801 20010913 16.73 830164606.9 898885389.6 2.426 0.00763328

000801 20010914 16.28 812474207.3 881194990 2.422 0.00772061

000801 20010917 16.04 803039327.6 871760110.3 2.42 0.00776901

000801 20010918 16.3 813260447.3 881981230 2.422 0.00771664

000801 20010919 16.46 819550367.1 888271149.8 2.424 0.00768516

000801 20010920 16.57 823874687 892595469.7 2.425 0.00766384

000801 20010921 16.54 822695327.1 891416109.8 2.424 0.00766963

000801 20010924 16.04 803039327.6 871760110.3 2.42 0.00776901

000801 20010925 16.38 816405407.2 885126189.9 2.423 0.00770083

000801 20010926 15.81 793997567.8 862718350.5 2.417 0.00781664

000801 20010927 15.89 797142527.7 865863310.4 2.418 0.00779993

000801 20010928 15.35 775914048.2 844634830.9 2.413 0.00791578

295

附录 8 公司(000801)在 t2 年违约距离 DD 与预期违约率 EDF 数据

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20011008 15.35 775914048.2 844634830.9 2.413 0.00791578

000801 20011009 15.4 777879648.2 846600430.9 2.413 0.00790474

000801 20011010 13.86 717339169.7 786059952.4 2.396 0.00827723

000801 20011011 12.87 678420290.7 747141073.4 2.384 0.00855817

000801 20011012 13.26 693751970.3 762472753 2.389 0.00844308

000801 20011015 13.16 689820770.4 758541553.1 2.388 0.00847202

000801 20011016 12.87 678420290.7 747141073.4 2.384 0.00855817

000801 20011017 12.88 678813410.7 747534193.4 2.384 0.00855515

000801 20011018 12.2 652081251.4 720802034.1 2.375 0.00877086

000801 20011019 11.01 605299972.6 674020755.3 2.357 0.00920316

000801 20011022 11.21 613162372.4 681883155.1 2.361 0.00912503

000801 20011023 12.33 657191811.3 725912594 2.377 0.00872802

000801 20011024 12.8 675668450.8 744389233.5 2.383 0.00857948

000801 20011025 12.72 672523490.9 741244273.6 2.382 0.00860409

000801 20011026 12.82 676454690.8 745175473.5 2.384 0.00857337

000801 20011029 12.96 681958370.6 750679153.3 2.385 0.00853107

000801 20011030 12.5 663874851.1 732595633.8 2.379 0.00867317

000801 20011031 12.29 655619331.3 724340114 2.376 0.00874111

000801 20011101 12.37 658764291.2 727485073.9 2.378 0.00871499

000801 20011102 12.26 654439971.3 723160754 2.376 0.00875099

000801 20011105 12.02 645005091.6 713725874.3 2.373 0.0088315

000801 20011106 12 644218851.6 712939634.3 2.372 0.00883833

000801 20011107 11.24 614341732.4 683062515.1 2.361 0.00911351

000801 20011108 10.94 602548132.7 671268915.4 2.356 0.00923109

000801 20011109 11.25 614734852.3 683455635 2.361 0.00910968

000801 20011112 11.42 621417892.2 690138674.9 2.364 0.0090455

000801 20011113 11.3 616700452.3 685421235 2.362 0.00909063

000801 20011114 11.18 611983012.4 680703795.1 2.36 0.00913659

000801 20011115 11.13 610017412.5 678738195.2 2.359 0.00915599

000801 20011116 11.22 613555492.4 682276275.1 2.361 0.00912118

000801 20011119 11.66 630852771.9 699573554.6 2.367 0.00895762

000801 20011120 11.92 641073891.7 709794674.4 2.371 0.00886587

000801 20011121 12.37 658764291.2 727485073.9 2.378 0.00871499

000801 20011122 12.42 660729891.2 729450673.9 2.378 0.00869882

000801 20011123 12.56 666233571 734954353.7 2.38 0.00865412

000801 20011126 12.45 661909251.1 730630033.8 2.379 0.00868916

000801 20011127 12.87 678420290.7 747141073.4 2.384 0.00855817

000801 20011128 13.03 684710210.6 753430993.3 2.386 0.00851022

296

金融财务建模与计算——基于 VBA 与 MATLAB 实现

续表 代 码 时 间 价 格 股权市场价值 资产市场价值 DD EDF

000801 20011129 13.1 687462050.5 756182833.2 2.387 0.00848957

000801 20011130 13.21 691786370.4 760507153.1 2.389 0.0084575

000801 20011203 13.11 687855170.5 756575953.2 2.387 0.00848663

000801 20011204 13.26 693751970.3 762472753 2.389 0.00844308

000801 20011205 12.64 669378531 738099313.7 2.381 0.00862896

000801 20011206 12.93 680779010.7 749499793.4 2.385 0.00854007

000801 20011207 13.16 689820770.4 758541553.1 2.388 0.00847202

000801 20011210 13.01 683923970.6 752644753.3 2.386 0.00851616

000801 20011211 12.74 673309730.9 742030513.6 2.382 0.00859791

000801 20011212 12.73 672916610.9 741637393.6 2.382 0.008601

000801 20011213 12.55 665840451 734561233.7 2.38 0.00865728

000801 20011214 12.25 654046851.3 722767634 2.376 0.00875429

000801 20011217 12.29 655619331.3 724340114 2.376 0.00874111

000801 20011218 12.44 661516131.2 730236913.9 2.378 0.00869238

000801 20011219 11.8 636356451.8 705077234.5 2.369 0.00890779

000801 20011220 11.36 619059172.2 687779954.9 2.363 0.00906796

000801 20011221 11.64 630066532 698787314.7 2.367 0.00896483

000801 20011224 11.76 634783971.8 703504754.5 2.369 0.00892192

000801 20011225 11.75 634390851.8 703111634.5 2.369 0.00892547

000801 20011226 11.93 641467011.7 710187794.4 2.371 0.00886241

000801 20011227 11.8 636356451.8 705077234.5 2.369 0.00890779

000801 20011228 11.72 633211491.9 701932274.6 2.368 0.00893614

000801 20011231 11.23 613948612.4 682669395.1 2.361 0.00911734

附录 9 VBA 宏工具录制使用简介

在金融财务模型计算中,常常要用到许多复杂的公式,而复杂公式计算用 VBA 中的宏

求解非常方便。因此,为阐述金融财务模型计算,本附录简单介绍一下 VBA 宏的录制和使

用。 例如,可以用宏来实现数据的求和。在 A1~A4 的单元格中分别输入 100、200、300、

400,如表 9-1 所示。

表 9-1 宏录制数据

A B C

1 100

2 200

3 300

4 400

5

6

我们可以用电子表格中的 SUM 函数来计算 A1~A4 的和,也可以用宏来实现,并自动

把结果写到 A5 中。宏的录制过程如下。 (1)执行【工具】→【宏】→【录制新宏】菜单命令,如图 9-1 所示。

图 9-1 执行【录制新宏】命令

(2)在弹出的“录制新宏”对话框中给将要录制的宏起一个名字,比如 mySum,如 图 9-2 所示。

298

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(3)单击【确定】按钮后,我们就录制了一个宏,并给其命名为 mySum,但是该宏并

不能起任何作用,为使宏具备想要的功能,就要给它编写代码。 (4)打开【工具】→【宏】菜单,这时不再选【录制新宏】命令,而是选择【宏(M)…】

命令,这时出现如图 9-3 所示的“宏”对话框。

图 9-2 “录制新宏”对话框 图 9-3 “宏”对话框

(5)单击【编辑】按钮,出现如图 9-4 所示的宏代码编辑窗口。

图 9-4 宏代码编辑窗口

(6)在 Sub mySum()和 End Sub 之间输入如下代码。注意,如果在代码的前面加上一

个“'”,那么这个语句就成为了注释行,注释行不会对宏的运行产生任何影响。

Sub mySum() ' ' mySum Macro ' 宏由 zsq 录制,时间: 2008/7/3 ' Range("a5") = "=sum(a1:a4)" End Sub

(7)关闭宏代码编辑窗口。到此已经完成了一个宏的录制,而且能够完成相应的操作,

那么如何运行录制好的宏呢?

299

附录 9 VBA 宏工具录制使用简介

(8)重新选择菜单栏中的【工具】→【宏】,像步骤(4)那样选择【宏(M)…】命

令,在弹出的对话框中单击【执行】按钮,可以发现在电子表格的 A5 单元格中自动添入

了一个数字“1000”,如图 9-5 所示。

图 9-5 计算结果

下面给这个宏加个按钮,这样可以通过这个按钮直接执行录制好的宏,使宏的执行快

捷高效,和其他的 Windows 命令一样简单。 (9)执行菜单栏中的【视图】→【工具栏】→【窗体】命令,如图 9-6 所示。

图 9-6 执行【窗体】命令

(10)弹出“窗体”工具箱,如图 9-7 所示。

图 9-7 “窗体”工具箱

300

金融财务建模与计算——基于 VBA 与 MATLAB 实现

(11)单击“命令”按钮(它的图标像一块砖),然后拖动鼠标在 B5 单元格中画出一个

“命令”按钮,如图 9-8 所示。

图 9-8 添加一个“命令”按钮

(12)在弹出的“指定宏”对话框中选择“mySum”。单击【确定】按钮,并将图 9-8中的“按钮 7”改名为“求和”,如图 9-9 所示。

图 9-9 按钮改名

(13)删除 A5 单元格中的结果,单击【求和】按钮,即可得到同样的运算结果。 本书用到的宏都是按照这个步骤录制的,只不过书中的代码比这个例子要复杂得多。

附录 10 MATLAB 工具软件使用简介

MATLAB 软件是金融财务建模的重要工具。随着计算机技术在各个领域的不断深入,

MATLAB 已经成为金融财务领域的必备工具。MATLAB 的金融工具箱提供了丰富的金融

计算工具,可以求解投资组合的有效边界、最优投资组合、期权定价等各种问题。金融工

具箱中没有提供的功能,也可以使用 MATLAB 开发出相应的求解程序和函数,因此

MATLAB 已经成为金融财务领域应用的重要辅助工具。本附录以 MATLAB 7.4.0(R2007a)为例,简单说明 MATLAB 软件的操作和编程方法。

1.MATLAB 7.4.0(R2007a)界面和菜单简介 进入 MATLAB 7.4.0(R2007a)后,出现如图 10-1 所示的 MATLAB 7.4.0(R2007a)

主窗口。

图 10-1 MATLAB 7.4.0(R2007a)主窗口

在 MATLAB 7.4.0(R2007a)主窗口中可以看到 MATLAB 7.4.0(R2007a)的主要窗口

302

金融财务建模与计算——基于 VBA 与 MATLAB 实现

和菜单,这些窗口和菜单的基本功能如下。 1)MATLAB 7.4.0(R2007a)主要窗口 “Command Window”窗口:该窗口执行各种 MATLAB 命令、函数和表达式,并输出

图形之外的运算结果。 “Command History”窗口:该窗口记录已经执行过的各种命令、函数和表达式,用户

可以通过在历史窗口中双击以前运行过的命令、函数和表达式,以重新执行。 “Workspace”窗口:该窗口列出 MATLAB 工作空间存储的变量名称、类型和字节数。 2)MATLAB7.4.0(R2007a)主要菜单 “File”菜单:完成文件的打开、建立、保存、导入和打印功能。 “Edit”菜单:完成对程序源代码和窗体进行编辑和整理的功能。 “Debug”菜单:完成程序源代码的调试功能。 “Desktop”菜单:完成管理 MATLAB 窗口的各种功能。 “Window”菜单:可以用来查看系统打开的所有窗口,并实现不同窗口之间的切换功能。 “Help”菜单:实现 MATLAB 的辅助功能。

2.MATLAB 7.4.0(R2007a)基本编程方法 1)MATLAB 7.4.0(R2007a)基本运算功能 (1)算术运算:算术运算主要进行基本的数学运算,完成数值类型变量的运算。主要

的 MATLAB 7.4.0(R2007a)算术运算符号及其运算示例如表 10-1 所示。

表 10-1 算术运算符号及其运算示例

运 算 符 号 运算示例

加法 2+3 的结果为 5

减法 53 的结果为 2

乘法 * 3*5 的结果为 15

除法 / 15/3 的结果为 5

幂次方 ^ 2^3 的结果为 8

(2)关系运算:主要用于比较运算对象之间的大小或相等关系,其运算结果为逻辑变

量。如果比较运算结果成立,其运算结果为真(非 0 值),否则为假(0 值)。主要的 MATLAB 7.4.0(R2007a)关系运算符号及其运算示例如表 10-2 所示。

表 10-2 关系运算符号及其运算示例

运 算 符 号 运算示例

大于 > 3>2 的结果为真

小于 < 3<2 的结果为假

等于 = = 3= =2 的结果为假

不等于 ~ = 3~ =2 的结果为真

大于或等于 >= 3>=2 的结果为真

小于或等于 <= 3<=2 的结果为假

(3)逻辑运算:逻辑运算主要将关系表达式或逻辑表达式联系起来,构成较为复杂的

303

附录 10 MATLAB 工具软件使用简介

逻辑表达式,以满足实际编程需要。逻辑表达式的值也是逻辑变量(即表示真或假的非 0或 0)。主要的 MATLAB 7.4.0(R2007a)逻辑运算符号及其运算示例如表 10-3 所示。

表 10-3 逻辑运算符号及其运算示例

运 算 符 号 运算示例

结果为真 结果为假

与 & 真&真 真&假,假&真,假&假

或 | 真|真,真|假,假|真 假|假

非 ~ ~假 ~真

2)MATLAB 7.4.0(R2007a)数组 MATLAB 7.4.0(R2007a)中构造数组的方法很简单,只需要用空格或分号间隔数组元

素,然后用方括号“[ ]”括起来就可以。 在 MATLAB 7.4.0(R2007a)中,一维数组创建如下:

>> a=[1 2 3 4 5 6] a = 1 2 3 4 5 6

二维数组创建如下:

>> a=[1 2 3;4 5 6] a = 1 2 3 4 5 6

MATLAB 7.4.0(R2007a)提供了多个创建数组的函数,用以创建各种特殊矩阵,函数

的名称和功能如表 10-4 所示。

表 10-4 函数的名称和功能

函 数 功 能

ones 创建一个所有元素全部为 1 的数组

zeros 创建一个所有元素全部为 0 的数组

eye 创建一个对角线元素为 1,其余元素全部为 0 的数组

这些函数的使用示例如下:

>> a=ones(2,3) a = 1 1 1 1 1 1 >> a=ones(1,3) a = 1 1 1 >> a=zeros(2,3) a = 0 0 0 0 0 0 >> a=zeros(1,3)

304

金融财务建模与计算——基于 VBA 与 MATLAB 实现

a = 0 0 0 >> a=eye(3) a = 1 0 0 0 1 0 0 0 1

3)MATLAB 7.4.0(R2007a)矩阵运算 (1)矩阵转置运算示例。 输入矩阵 a:

>> a=[1 2 3;4 5 6] a = 1 2 3 4 5 6

计算矩阵 a 的转置矩阵 b:

>> b=a' b = 1 4 2 5 3 6

(2)矩阵加法运算示例。 输入矩阵 a:

>> a=[1 2 3;4 5 6] a = 1 2 3 4 5 6

输入矩阵 b:

>> b=[3 2 1;6 5 4] b = 3 2 1 6 5 4

计算矩阵 a 与矩阵 b 的和矩阵 c:

>> c=a+b c = 4 4 4 10 10 10

(3)矩阵乘法运算示例。 输入矩阵 a:

>> a=[1 2 3;4 5 6] a = 1 2 3

305

附录 10 MATLAB 工具软件使用简介

4 5 6

输入矩阵 b:

>> b=[1 2;3 4;5 6] b = 1 2 3 4 5 6

计算矩阵 a 与矩阵 b 的乘积矩阵 c:

>> c=a*b c = 22 28 49 64

(4)矩阵的乘方运算示例。 输入矩阵 a:

>> a=[1 2 3;4 5 6;7 8 9] a = 1 2 3 4 5 6 7 8 9

计算矩阵 a 的三次方矩阵 b:

>> b=a^3 b = 468 576 684 1062 1305 1548 1656 2034 2412

4)MATLAB 7.4.0(R2007a)的程序结构 (1)顺序结构。 MATLAB 7.4.0(R2007a)顺序结构就是表达式构成的语句,MATLAB 7.4.0(R2007a)

从上到下顺序执行各行语句。复合表达式由几个逗号或分号隔开的表达式构成。 (2)分支结构。 If-End 结构为:

If 逻辑表达式 语句体 End

当逻辑表达式为真时,执行语句体,否则不执行。 If-Else-End 结构为:

If 逻辑表达式 语句体 1 Else 语句体 2

306

金融财务建模与计算——基于 VBA 与 MATLAB 实现

End

当逻辑表达式为真时,执行语句体 1,否则执行语句体 2。 If-Elseif…-End 结构为:

If 逻辑表达式 1 语句体 1 Elseif逻辑表达式 2 语句体 2 Elseif逻辑表达式 3 语句体 3 …… Else 语句体 n End

当逻辑表达式 i(i<n)为真时,执行语句体 i。当所有表达式为假时,执行语句体 n。 Switch 结构为:

Switch表达式 Case 常量表达式 1 语句体 1 Case 常量表达式 2 语句体 2 …… Case 常量表达式 n 语句体 n Otherwise 语句体 n+1 End

当表达式的值为常量表达式 i(i<=n)时,执行语句体 i。当表达式的值与常量表达式 i(i<=n)都不相等时,执行语句体 n+1。

(3)循环结构。 For-End 结构为:

For i=m: s: n 语句体 End

在上面的格式中,m 为初值,n 为终值,s 为步长,当步长为 1 时可以省去。循环变

量 i 的值从 m 开始,每执行一次语句体,i 值都增加 s,当 i 小于或等于 n 时就循环执行

语句体。 While-End 结构为:

While 逻辑表达式 语句体 End

当逻辑表达式的值为真时,就循环执行语句体。

307

附录 10 MATLAB 工具软件使用简介

5)MATLAB 7.4.0(R2007a)的 M 文件 当我们在 MATLAB 7.4.0(R2007a)的“Command Window”窗口输入指令后,系统会

立即执行该指令,这种执行命令的方式为命令行方式。当我们需要处理复杂问题和大量数

据时,使用命令行方式会很不方便,这时可以使用文件驱动方式。在文件驱动方式下,可

将需要执行的语句序列以扩展名为.m 来存储文件,然后在“Command Window”窗口输入

该 M 文件名,即可执行 M 文件中的语句(语句后有分号,其结果不在“Command Window”

窗口显示,没有分号则显示)。当编制 M 文件时,可以按照【File】→【New】→【M-File】顺序打开 MATLAB 7.4.0(R2007a)的文本编辑器,如图 10-2 所示,在其中编辑语句后,

存盘即可。

图 10-2 文本编辑器

从功能上来看,M 文件可以分为两类:命令文件和函数文件。 (1)命令文件。 命令文件又称为脚本文件,它没有输入和输出参数,实际上为一串命令的集合。用户

只要在“Command Window”窗口输入 M 文件名(将 MATLAB 7.4.0(R2007a)当前目录

改为 M 文件所在目录),这一串指令即可执行。 例 1:已知 Fibonacci 数列满足 Fibonacci 规则 2 1k k kF F F ,其中 1 2 1F F ,求元

素小于 200 的 Fibonacci 数列。 解:求解该问题的 M 文件如下。

fibon=[1 1]; k=1; while fibon(k)+ fibon(k+1)<200 fibon(k+2)= fibon(k+1)+ fibon(k); k=k+1; end fibon

308

金融财务建模与计算——基于 VBA 与 MATLAB 实现

将 MATLAB 7.4.0(R2007a)当前目录调整到该文件所在目录,在“Command Window”

窗口输入 Fibonacci,按回车键后就得到该 M 文件的运行结果。 >> Fibonacci fibon = 1 1 2 3 5 8 13 21 34 55 89 144

(2)函数文件。 函数文件是另一种格式的 M 文件,每个函数文件都定义一个函数。用户可以根据需要

定义函数文件,调用时就像调用 MATLAB 7.4.0(R2007a)自身函数一样。函数文件和命

令文件的区别在于:函数文件可以传递参数,而命令文件不能传递参数。命令文件中的变

量为全局变量,文件执行完成后,这些变量还存在;函数文件中的变量为局部变量,文件

执行完成后,这些变量将被清除(除非特殊声明)。这样我们在使用函数文件时,只考虑函

数的输入和输出即可,不用担心函数中的变量是否对后继工作造成影响。 函数文件由 function 语句引导,其结构如下:

function [输出参数列表]=函数名(输入形式参数列表) 语句体

当编写好函数文件后,就可以调用该函数文件进行计算。函数文件的调用格式如下:

[输出参数列表]=函数名(输入实际参数列表)

例 2:编制计算小于某数的 Fibonacci 数列。 解:小于 x 的 Fibonacci 数列计算函数如下。

function [fval]=fibonf(x) fibon=[1 1]; k=1; while fibon(k)+ fibon(k+1)<x fibon(k+2)= fibon(k+1)+ fibon(k); k=k+1; end fval=fibon;

将 MATLAB 7.4.0(R2007a)当前目录调整到该文件所在目录,在“Command Window”

窗口输入 Fibonacci,按回车键后就得到该 M 文件的运行结果。

>> [fval]=fibonf(200) fval = 1 1 2 3 5 8 13 21 34 55 89 144

参 考 文 献

[1] 杨海明.投资学[M].上海:上海人民出版社,1998. [2] 滋维.博迪 等.投资学(第 6 版)[M].北京:机械工业出版社,2006. [3] 戴维.卢恩伯格.投资科学[M].北京:中国人民大学出版社,2005. [4] 朱世武.金融计算与建模——理论、算法与 SAS 程序.北京:清华大学出版社,2007. [5] 郑振龙.金融工程[M].北京:高等教育出版社,2003. [6] 韩良智.用 Excel 进行高效投资决策.北京:中国铁道出版社,2006. [7] 西蒙.本尼卡.财务金融建模——用 Excel 工具(第 2 版)[M].上海:上海财经大学出

版社,2003. [8] 张树德.金融计算教程——MATLAB 应用.北京:清华大学出版社,2007. [9] 姜礼尚.期权定价的数学模型与方法[M].北京:高等教育出版社,2003. [10] 王惠 等.动态联盟的期权分析[M].上海:上海交通大学出版社,2006. [11] 叶中行,林建忠.数理金融[M].北京:科学出版社,2002. [12] 张卫国.现代投资组合理论——模型、方法与应用.北京:科学出版社,2007. [13] 孔爱国.现代投资学.上海:上海人民出版社,2003. [14] 刘红忠.投资学.北京:高等教育出版社,2003. [15] 朱顺泉.投资学原理与应用[M].北京:清华大学出版社,2006. [16] 郭仁生.基于 MATLAB 优化设计解析[M].北京:机械工业出版社,2007.