Professional Documents
Culture Documents
前言..............................................................................................6
前言
致謝..............................................................................................7
致謝
第 1 章 介紹................................................................................8
介紹
1.1 金融學概覽 ....................................................................................................................... 8
1.2 收益分佈假設 ................................................................................................................... 9
1.3 數學和統計方法 ............................................................................................................... 9
1.4 數值方法 ........................................................................................................................... 9
1.5 Excel 解決方案................................................................................................................. 9
1.6 本書主題 ......................................................................................................................... 10
1.7 有關 Excel 工作簿...........................................................................................................11
1.8 意見和建議 ......................................................................................................................11
第 3 章 VBA 介紹 ....................................................................38
3.1 掌握 VBA 的好處........................................................................................................... 38
3.2 VBA 的面向物件觀點..................................................................................................... 39
3.3 編寫 VBA 宏................................................................................................................... 40
3.3.1 簡單 VBA 副程式................................................................................................ 40
3.3.2 交互函數 MsgBox ............................................................................................... 41
3.3.3 編寫環境 .............................................................................................................. 42
3.3.4 輸入代碼並運行宏 .............................................................................................. 43
3.3.5 錄製按鍵和編輯代碼 .......................................................................................... 43
3.4 編程要素 ......................................................................................................................... 45
3.4.1 變數和資料類型 .................................................................................................. 45
3.4.2 VBA 陣列變數...................................................................................................... 46
3.4.3 控制結構 .............................................................................................................. 48
3.4.4 控制重複過程 ...................................................................................................... 48
3.4.5 在代碼中使用 Excel 和 VBA 函數..................................................................... 50
3.4.6 編程的一般觀點 .................................................................................................. 50
3.5 宏與試算表之間的通信 ................................................................................................. 50
3.6 副程式實例 ..................................................................................................................... 53
3.6.1 圖表 ...................................................................................................................... 54
3.6.2 正態概率散點圖 .................................................................................................. 56
3.6.3 用規劃求解產生有效邊界 .................................................................................. 58
小結........................................................................................................................................ 61
附錄 3A Visual Basic 編輯器 ................................................................................................ 62
附錄 3B 用‘相對引用’模式來錄製按鍵......................................................................... 65
第 4 章 編寫 VBA 用戶定義函數...........................................68
用戶定義函數
4.1 簡單銷售傭金函數 ......................................................................................................... 68
4.2 在工作表中創建 Commission(Sales)函數..................................................................... 69
4.3 多參數期權定價函數 ..................................................................................................... 70
4.4 在 VBA 中運算元組....................................................................................................... 72
4.5 陣列變數的期望和方差函數 ......................................................................................... 73
4.6 陣列變數的組合方差函數 ............................................................................................. 75
4.7 輸出陣列形式的函數 ..................................................................................................... 77
4.8 在用戶定義函數中調用 Excel 和 VBA 函數................................................................ 78
4.8.1 在用戶定義函數中使用 VBA 函數.................................................................... 79
4.8.2 增益集 .................................................................................................................. 79
4.9 編寫 VBA 函數的優缺點............................................................................................... 79
小結........................................................................................................................................ 80
附錄 4A 演示函數如何處理陣列 ........................................................................................ 81
附錄 4B 二叉樹期權定價函數 ............................................................................................ 82
編寫函數練習 ........................................................................................................................ 87
第 5 章 股票的有關簡介 .........................................................92
第 6 章 投資組合最優化 .........................................................93
6.1 組合的均值和方差 ......................................................................................................... 93
6.2 組合的風險-收益表示 .................................................................................................. 95
6.3 用規劃求解得到有效點 .................................................................................................. 95
6.4 求有效邊界(黃和利曾伯格的方法) .......................................................................... 98
6.5 有約束邊界組合 ............................................................................................................ 100
6.6 無風險資產和風險資產的結合 .................................................................................... 102
6.7 問題一 一種無風險資產和一種風險資產的組合 ...................................................... 102
6.8 問題二 存在兩種風險資產的組合 .............................................................................. 104
6.9 問題三 一種無風險資產和一個風險投資組合 .......................................................... 105
6.10 Module1 中的用戶定義函數....................................................................................... 107
6.11 Module1 中用於解決三類常見組合問題的函數 ....................................................... 108
6.12 模組 M 中的巨集功能..................................................................................................110
小結.......................................................................................................................................111
第 7 章 資產定價....................................................................
資產定價 112
7.1 單因素模型 .....................................................................................................................112
7.2 估計β係數 .....................................................................................................................113
7.3 資本資產定價模型(CAPM)......................................................................................115
7.4 方差-協方差矩陣 .........................................................................................................115
7.5 風險值(VaR) ..............................................................................................................117
7.6 水準財富 .........................................................................................................................119
7.7 正態和對數正態分佈矩之間的關係 ............................................................................ 120
7.8 Module1 中的用戶定義函數......................................................................................... 121
小結...................................................................................................................................... 122
第 8 章 投資組合業績評價 ...................................................123
8.1 傳統業績評價方法 ........................................................................................................ 123
8.2 主動—被動管理 ........................................................................................................... 125
8.3 風格分析(Style Analysis) ......................................................................................... 127
8.4 簡單風格分析 ................................................................................................................ 128
8.5 滾動時段風格分析 ....................................................................................................... 129
8.6 風格權重的置信區間 .................................................................................................... 130
8.7 Module1 中的用戶定義函數......................................................................................... 132
小結...................................................................................................................................... 134
第 9 章 股票期權介紹 ...........................................................136
9.1 布萊克-舒爾斯公式的起源.......................................................................................... 136
9.2 布萊克-舒爾斯公式...................................................................................................... 137
9.3 對沖投資組合(Hedge Portfolios) ............................................................................ 138
9.4 風險中性定價 ............................................................................................................... 139
9.5 風險中性定價的單期二叉樹模型 ............................................................................... 140
9.6 期權平價關係(Put-Call Parity) ................................................................................ 141
9.7 紅利(Dividends)....................................................................................................... 142
9.8 美式期權的特徵 ........................................................................................................... 142
9.9 數值方法 ....................................................................................................................... 142
9.10 波動率和非正態股票收益 ......................................................................................... 143
小結...................................................................................................................................... 143
第 10 章 二叉樹 .....................................................................145
10.1 二叉樹介紹 ................................................................................................................. 145
10.2 簡化的二叉樹 ............................................................................................................. 146
10.3 JR 二叉樹..................................................................................................................... 147
10.4 CRR 樹 ......................................................................................................................... 150
10.5 二項分佈近似與布萊克-舒爾斯公式........................................................................ 151
10.6 CRR 二叉樹的收斂性 ................................................................................................. 152
10.7 LR 樹............................................................................................................................ 153
10.8 CRR 樹與 LR 樹的比較 .............................................................................................. 154
10.9 美式期權和 CRR 美式二叉樹 ................................................................................... 155
10.10 Module0 和 Module1 中的用戶定義函數 ................................................................ 157
小結...................................................................................................................................... 158
第 11 章 布萊克-舒爾斯公式
布萊克 舒爾斯公式................................................160
舒爾斯公式
11.1 布萊克-舒爾斯公式.................................................................................................... 160
11.2 在 Excel 中運用布萊克-舒爾斯公式......................................................................... 161
11.3 外匯(Currencies)和商品(Commodities)期權................................................... 162
11.4 計算期權的‘希臘’參數............................................................................................... 163
11.5 對沖組合 ..................................................................................................................... 164
11.6 布萊克-舒爾斯公式的正式推導 ................................................................................ 166
11.7 Module1 中的用戶定義函數....................................................................................... 168
小結...................................................................................................................................... 169
第 12 章 歐式期權定價的其他數值方法.............................171
歐式期權定價的其他數值方法
12.1 蒙特卡羅模擬介紹 ..................................................................................................... 171
12.2 對偶變數(Antithetic Variables)類比 ..................................................................... 173
12.3 准隨機抽樣(Quasi-Random Sampling)模擬......................................................... 173
12.4 模擬方法比較 ............................................................................................................. 175
12.5 蒙特卡羅 模擬中的希臘參數計算 ........................................................................... 176
12.6 數值積分 ..................................................................................................................... 176
12.7 Module1 中的用戶定義函數....................................................................................... 177
小結...................................................................................................................................... 179
第 13 章 非正態分佈和隱含波動率.....................................181
非正態分佈和隱含波動率
13.1 非正態分佈假設下的布萊克-舒爾斯 公式 .............................................................. 181
13.2 隱含波動率(Implied Volatility) ............................................................................. 182
13.3 調整偏度(Skewness)和峰度(Kurtosis) ............................................................ 183
13.4 波動率曲線(The Volatility Smile) ......................................................................... 185
13.5 Module1 中的用戶定義函數....................................................................................... 186
小結...................................................................................................................................... 189
第 14 章 債券期權定價介紹 .................................................190
14.1 利率期限結構 ............................................................................................................. 191
14.2 附息債券的現金流和到期收益率 ............................................................................. 192
14.3 二叉樹 ......................................................................................................................... 192
14.4 布萊克的債券期權定價公式 ..................................................................................... 193
14.5 久期和凸性 ................................................................................................................. 194
14.6 符號............................................................................................................................. 195
小結...................................................................................................................................... 195
第 15 章 利率模型..................................................................197
利率模型
15.1 Vasicek 利率期限結構模型......................................................................................... 197
15.2 Vasicek 模型對零息票債券歐式期權定價................................................................. 199
15.3 Vasicek 模型對附息債券歐式期權定價..................................................................... 200
15.4 CIR 利率期限結構模型 .............................................................................................. 201
15.5 CIR 模型對零息票債券歐式期權定價....................................................................... 202
15.6 CIR 模型附息債券歐式期權定價............................................................................... 202
15.7 Module 1 中的用戶定義函數...................................................................................... 203
小結...................................................................................................................................... 205
第 16 章 擬合利率期限結構 .................................................206
16.1 對數正態分佈利率樹 ................................................................................................. 206
16.2 正態利率二叉樹 ......................................................................................................... 208
16.3 BDT 樹 ......................................................................................................................... 209
16.4 用 BDT 樹為債券期權定價 ....................................................................................... 210
16.5 Module 1 中的用戶定義函數.......................................................................................211
小結...................................................................................................................................... 213
附錄 其他 VBA 函數 .............................................................214
預測...................................................................................................................................... 214
ARIMA 模型........................................................................................................................ 215
樣條...................................................................................................................................... 216
特徵值和特徵向量 .............................................................................................................. 217
前言
當被問到為什麼要攀登珠穆朗瑪峰時,登山員通常會說:“因為它在那兒。”而我們
寫《高級金融建模》這本書則出於相反的原因。無論是以前還是現在,幾乎沒有一本書重點
突出和解釋 VBA 函數在 Excel 中的應用。另一方面,能夠掌握金融領域數值方法精髓的書
也寥寥無幾。
有人認為,像 Excel 這樣的電子製表軟體,不能滿足高級技術和數值分析領域(如金融
衍生工具的定價)的需要,現在這種想法已經過時。以前通過專門的套裝軟體和語言進行的
計算,現在可以應用有效的代碼和 VBA 函數,在一台普通的電腦上只需一秒就可以完成。
通過使用 Excel 和 VBA 編碼,可以使得以前處於黑箱中的計算過程明朗化。
最初,宏的出現拓寬了 Excel 的應用範圍,後來這一應用促進了 VBA 語言在 Excel 中
的全面發展,從股票計算、期權計算,最後到債券計算,VBA 廣泛應用于金融領域中的各
種計算。在本書中,可以學習到一些新的 Excel 技巧,並可更深入地理解數值方法在金融中
的應用。
本書的基礎部分來源於倫敦商學院的 MBA 選修課程講義《基於電腦的金融建模》 。書
中的股票部分是學習《資產組合管理》課程的基礎,該課程每年在日內瓦的國際貨幣銀行中
心舉辦一次。而關於期權和債券的章節則來自城市大學商學院電腦碩士課程《數值方法》 。
本書適用于研究生和本科高年級學生。
使用本書時,讀者必須採取積極嘗試的態度,學會提出問題並解決問題,既要理解書
中的代碼和 VBA 用戶定義函數,也要勇於在實踐中應用它們。由於假設資產收益服從對數
正態分佈,並將二叉樹作為一種核心數值方法,因此我們的解釋可以建立在概率和統計中常
用的結論基礎上。全書採用了統一的符號,並且用圖片顯示了 Excel 和 VBA 的應用過程,
這些都有助於讀者更好地理解本書內容。
致謝
本書得益於之前的學術研究者和金融研究機構,他們發展了有關金融理論,並提出了
相應的數值方法,從而形成了本書的基本內容。用牛頓的話來說,“如果我看得更遠,那是
因為我站在巨人的肩膀上”。
感謝倫敦商學院和城市大學商學院的同事,特別是 Elroy Dinenis,保羅·馬什和 Kiriakos
Vlahos。
同時,還感謝薩姆·惠特克對我們的熱心鼓勵,作為一位編輯,他付出了很大的努力和
耐心。
最後,感謝家人和朋友對我們的耐心,因為本書醞釀了較長一段時間,這期間給他們添
了不少麻煩。
第 1 章 介紹
我們希望《高級金融建模》一書可以證明,能夠應用電子製表軟體成功地實現大部分
的金融模型。這些模型從二十世紀五十年代早期發展到九十年代末期,覆蓋了整個金融領
域,包括股票、股票期權和債券期權。只要輔助使用 VBA 語言,這些模型完全能在 Excel
試算表中實現。而用戶定義函數提供了一個方便的程式庫,使得計算的速度和準確度大大提
高。
《高級金融建模》應該看作是這個領域中傳統教材的補充讀物(它甚至是對傳統教材
的糾正) 。本書沒有列出金融模型的詳細推導過程,目的是為了能夠涵蓋更多的模型和方法,
特別是將重點放在更新的研究成果上。
金融領域發展的重要理論包括:二十世紀五十年代的組合理論,六十年代的資本資產
定價模型(CAPM) ,以及七十年代的布萊克-舒爾斯公式,這些理論中的解析解現在都能直
接計算。這都得益於最近一二十年來發展的數值演算法。通過選擇適當的參數,二叉樹方法
在股票和債券期權定價的數值演算法中扮演著重要的角色。在最近幾年,金融領域的研究重
點落在尋找有效的計算方法上,而不是理論本身。
儘管本書覆蓋了大部分的金融領域,並且包括了不少複雜的模型,但只需應用 Excel,
以及 Excel 中內嵌的函數和 VBA 程式,就能完美地解決問題。這使得我們可以將常用的假
設(對數正態分佈) 、數學問題(期望)和數值方法(二叉樹)在金融建模領域統一起來。
當然,我們也努力確保本書使用一致和簡單的符號,以便表達的更加清晰。
嘗試在本書中覆蓋大部分的金融研究課題,這對我們來說既是一個挑戰也是一個機
遇。機遇就是我們可以縱覽金融領域,並將資產定價中的假設、數學問題、數值方法和 Excel
的解法連接起來,總結出一般性規律。在以下的幾節中,將簡要地描述在股票、期權和債券
計算中,關於金融、數學、數值方法和 Excel 特點方面的一些問題。以下的內容將會在以後
的章節中詳細地分析。
1.1 金融學概覽
儘管組合理論是根據個人投資者的選擇推導出來的,但是它也可以通過對資產價格收
益的分佈進行合理假設來推導。標準的假設就是股票收益服從對數正態分佈,或者假設股票
的對數收益服從正態分佈。最近,業界學者檢驗了實際分佈同嚴格正態分佈之間的偏離效應
(偏度和峰度),並建議使用一些其他的分佈(如逆 gamma 分佈)。
而債券與股票相比有許多不同之處,因此債券期權定價的出發點是短期利率。一般假
設短期利率服從對數正態分佈或正態分佈。這些概率分佈的特性被廣泛應用于各種金融研究
中。
1.3 數學和統計方法
在關於股票的章節中,涉及到最優化數學方法。這些最優化方法可能含有約束條件,
如夏普基於資產收益所進行的分析。在他的分析中, β 代表線性回歸的斜率。
期權定價是在風險中性的條件下求統計學中的數學期望。對數股票價格的正態分佈可
以用離散的二項分佈來近似。二項分佈為計算期權的期望價格提供了一個框架。
1.4 數值方法
在關於組合最優化的章節中,最優化涉及到組合的方差,而解決最優化的數值方法是
二次規劃。風格分析也用到了二次規劃,也就是使得誤差的方差最小。而線性回歸也是通過
選擇斜率係數來使誤差項的平方和最小,儘管它通常不被看作是最優化問題。與一般最優化
問題有所不同的是,線性回歸為計算 β 係數提供了一個直接公式。
在為期權定價方面,二叉樹方法為計算風險中性期望提供了一個分析框架。我們通過
檢驗三個不同二叉樹的收斂效應來強調參數選擇的重要性。這些二叉樹也可以給美式期權定
價,在美式期權中,期權可以在到期日之前的任意時刻執行。
在歐式期權中,像蒙特卡羅模擬和數值積分等技巧也經常用到。而數值迭代方法,特
別是牛頓-拉夫森方法,可以用來估算期權市場價格中的隱含波動率。
1.6 本書主題
第 一 部 分集 中 介紹 Excel 函 數和 理解 VBA 語 言。 這 部 分有 三 個相 關 工作 簿 ,
AMFEXCEL,VBSUB 和 VBFNS 分別對應於第 2,3 和 4 章。
第二部分是關於股票的三個工作簿,EQUTY1,EQUTY2 和 EQUTY3,分別對應第 6,
7 和 8 章。
第三部分關於股票期權有四個工作簿,OPTION1,OPTION2,OPTION3 和 OPTION4,
分別對應第 10,11,12 和 13 章。
第四部分關於債券方面有兩個工作簿,BOND1 和 BOND2,對應第 14,15 和 16 章,
具體見書中的解釋。
附錄有一個工作簿 OTHERFNS。
1.8 意見和建議
儘管花費了很大精力收集材料和撰寫本書,我們仍然很樂意接受意見、建議甚至是改
正和改善。請發到電子郵箱 mstaunton@london.edu 或者通過以下網頁與我們聯繫。
www.london.edu/ifa/services/services.html 或 者
www.business.city.ac.uk/irmi/mstaunton.html。
第 2 章 高級 Excel 函數和過程
2.1 訪問 Excel 函數
Excel 提供了許多工作表函數,它們是一些已經編寫好的計算程式。函數常用於試算表
的簡單計算,在 VBA 巨集代碼和用戶定義函數中也經常用到這些基本函數(見第三章和第
四章) 。
點擊標準工具欄中的粘貼函數
粘貼函數按鈕(標記為 fx)就可以訪問這些函數。函數嚮導
粘貼函數 函數嚮導如圖
函數嚮導
2.1 所示,函數分為幾個不同的類別:如數學與三角函數類、統計類、邏輯類、查找與引用
類,等等。
圖 2.1 粘貼函數對話方塊顯示數學與三角函數
粘貼函數 數學與三角函數類別中的
數學與三角函數 COMBIN 函數
如圖 2.1 所示,數學與三角函數
數學與三角函數類別中的
數學與三角函數 COMBIN 函數被選中,這時對話方塊下面出
現該函數輸入值和輸出值的簡單描述。要想得到更詳細的描述,可以點擊幫助 幫助按鈕(標記
幫助
為?)
。
點擊確定
確定按鈕之後,就會出現提供適當參數輸入框的公式面板,如圖
確定 2.2 所示。需要輸
入的資訊可以用鍵盤鍵入(如這裏),也可以通過選擇試算表中的網格來引用(點擊輸入框
右側的按鈕可以縮小公式面板)。注意,可以拖動公式面板離開它原來的位置。點擊面板上
的確定
確定按鈕或編輯欄中的勾號,就可以把公式輸入到試算表。
確定
2.2 數學類函數
本書用到的數學與三角函數
數學與三角函數有:EXP(x)、LN(x)、SQRT(x)、RAND()、FACT(x)和
數學與三角函數
COMBIN(number,number_chosen)。
x
EXP(x)返回指數函數的值,exp(x)或 e 。例如:
EXP(1)返回 e 的值(2.7183,小數位數為 4)
2
EXP(2)返回 e 的值(7.3891,小數位數為 4)
−1
EXP(-1)返回 1/e 或 e 的值(0.36788,小數位數為 5)
在金融計算時,經常需要利用複利(或折現)因數將不同時段的現金流轉換為未來價值
(或現值)
。給定連續複利 r,則一年的複利因數為 exp(r),對應的年利率為 ra ,如果複利以
年為基礎,則公式為:
ra = exp(r ) − 1
關於連續複利以及 EXP 函數的應用,將在 2.7.1 節的模擬運算表中作進一步的闡述。
LN(x)返回 x 的自然對數值。注意,x 必須為正,否則函數會因數值溢出而返回#NUM!。
例如:
LN(0.36788)的返回值為-1
LN(2.7183)的返回值為 1
LN(7.3891)的返回值為 2
LN(-4)的返回值為#NUM!
在金融領域,我們經常與(自然)對數收益打交道,可以利用 LN 函數將收益值轉換為
對數收益。
SQRT(x)返回 x 的平方根。很顯然,x 必須為非負,否則函數會因數值溢出而返回#NUM!。
RAND()產生[0, 1]區間均勻分佈的亂數。每次試算表重新計算時,產生的亂數都不一
樣。用蒙特卡羅模擬法計算期權價格時,我們可以利用 RAND()函數來產生亂數。
FACT(number)返回整數 number 的階乘,它等於 1×2×3×…×number。例如:
FACT(6)的返回值為 720
COMBIN(number,number_chosen) 返 回 number 個 元 素 的 組 合 值 ( 子 集 大 小 為
,子集可以按任何順序組合。例如,如果某支股票的價格在四個離散時間
number_chosen)
裏要麼上漲,要麼下跌,則出現三次上漲(和一次下跌)序列的個數為:
COMBIN(4,1) = 4 或者 COMBIN(4,3) = 4
也就是這樣四個序列‘上漲-上漲-上漲-下跌’、‘上漲-上漲-下跌-上漲’、
‘上漲-下跌-上漲-上漲’和‘下跌-上漲-上漲-上漲’。從統計的角度來說,
Excel 中還有一些函數可以進行矩陣轉置、矩陣相乘、或求方陣的逆。相應的函數分別
為:
TRANSPOSE(array)返回矩陣 array 的轉置
MMULT(array1,array2)返回兩個矩陣的乘積
MINVERSE(array)返回矩陣 array 的逆矩陣
這些函數都屬於數學類函數。可能有些讀者對矩陣並不熟悉,為了熟悉這些函數,我們
將在本章的末尾對矩陣做介紹(見 2.13) 。
2.3 統計類函數
FREQUENCY(data_array,bins_array)統計一個資料集中出現在特定間隔(或‘bins’)
中的元素個數,並以一豎列陣列返回。‘bins_array’為用於對 ‘data_array’ 中的數值
進行分組的間隔陣列。由於該函數是以陣列的形式返回,所以在輸入函數之前,必須在試算
表中為返回值選定一個相鄰的單格區域。
我們從 AMFEXCEL 工作簿 Frequency and Snorm 表中的一個例子出發,來說明如何
使用 FREQUENCY 函數。如圖 2.3 所示,D10:D71 列和 E10:E71 列中的月收益和對數收
益(採用 LN 函數)資料的統計資訊放在第 4 到第 7 行。假設現在我們想得到對數收益
(E10:E71),即所謂‘data_array’的頻率分佈。目的是為了檢測這些資料是否近似地服
從正態分佈。首先,我們為分組確定間隔。觀察一下最大和最小的對數收益,範圍在-0.16
到+0.20 之間,分為 10 到 12 個間隔比較合適。將間隔值輸入到 G5:G14 中,這些值作為對
數收益分組的上邊界。
圖 2.3 計算對數收益資料的頻率分佈
圖 2.4 對數收益的百分比頻率和累積百分比頻率分佈
顯示累積百分比頻率的最好方法是用 XY 圖,資料點用一條沒有標記的平滑曲線連接。
要生成圖 2.5 中所示的圖形,可以選擇單格區域 G5:G14 和 J5:J14 作為資料源。注意,如
果要選中一些不連續的區域,可以先選擇第一個區域,然後按下 Ctrl 鍵不放鬆,再選擇第
二個以及後繼的區域。
Frequency Distribution:頻率分佈;
interval:間隔;freq:頻數;theory:理論值;Cumulative Frequency:累積頻率;
actual:實際值;
%freq:頻率百分比;%cum freq:累積頻率百分比;Month:月份;Total:共計
圖 2.5 累積百分比頻率圖(實際資料和嚴格正態分佈的資料)
對於正態分佈的對數收益,累積分佈呈一個 S 形(如圖中的虛線所示)
。而實際的對數
收益資料則可能是由於偏度的原因,與正態分佈有一些偏離。
QUARTILE(array,quart)函數返回資料集四分位元數。其中的第二個參數‘quart’是一
個整數,表明返回哪一個四分位數:即,quart=0 時,返回陣列的最小值;quart=1 時,返
回第 1/4 分位數(即排序後,處於陣列 25%處的值) ;quart=2 時,返回中位數(50%)
;quart=
時,返回第 3/4 分位數(75%);如果是 4,返回最大值。
QUARTILE 函數提供了一個快捷並相對容易的方法來得到一個資料集的累積分佈。例
如在圖 2.6 的單格 H22 中輸入:
QUARTILE(E10:E71,G22)
這裏 G22 中的值為 1,於是該函數返回第 1/4 四分位數。單格中顯示的數值為-0.043,也就
是說,在選定的陣列中,低於-0.043 的對數收益占整個資料集的 25%。第 2/4 分位數為
0.028,是中位數,第 3/4 分位數為 0.075,低於此數的對數收益占整個資料集的 75%。圖
2.6 還畫出了區域 H21:H25 的 XY 圖,並對數據點作了標記。可以看出,基於五個數據點上
的累積分佈曲線與圖 2.5 中的分佈曲線頗為相似。
Excel 提供了大量的函數來進行資料匯總和理論分佈建模。本書的股票和期權部分將用
到它們。
2.4 查找類函數
在含有相關資訊的表格中,查找函數可以根據不同的輸入資訊,檢索出其相關的資訊。
例如,在圖 2.8 中,我們利用 VLOOKUP 函數從波動率及對應的期權價格表中檢索出給定
波動率下的布萊克-舒爾斯期權價格。 (布萊克-舒爾斯公式的基本理論見第 11 章。)
一般來講,函數 VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
可以在給定表格(‘table_array’)中的最左一列中查找出匹配值,然後返回同一行中指定
列(‘col_index_num’)中的數值。缺省情況下,表格中的第一列是按昇冪排列的(這就
暗示 range_lookup=1(或 TRUE))。實際上,在本例中,最後一個參數可以忽略不寫。
關於查找的例子可以在工作表 LookUp 中找到。為了檢驗你是否已經理解,可以用
VLOOKUP 函數查找出不同銷售額下應付的傭金,傭金率放在單格區域 F5:G7 中。然後滾
動到下面的布萊克-舒爾斯期權價格查詢表,如圖 2.8 所示。
所要查找的波動率放在 C17(20%)中,表格陣列為 F17:G27,波動率按昇冪排列,
期權價格在表格的第二列。因此,單格 D18 中的公式為:
VLOOKUP(C17, F17:G27,2)
返回波動率為 20%時對應的期權價格為 9.73。
要查找的值(‘lookup_value’)可以近似(或精確)地匹配表格中第一列的資料,在
匹配的基礎上找到同一行中指定列的資料,並返回。可以試著在 C17 中輸入不同的值,如
20.5%、21.5%等,看看這個查找函數是如何工作的。
‘range_lookup’參數是一個邏輯值(TRUE 或者 FALSE) ,表明是進行近似匹配還是
精確匹配。如果是 TRUE 或忽略,則進行近似匹配。這時如果沒有找到完全相同的值,就
會用比‘lookup_value’小的最大值來匹配。如果是 FALSE,VLOOKUP 函數將進行精確
匹配,這時沒有找到完全相同的值就會返回錯誤值#NA。
與 VLOOKUP 類似的函數 HLOOKUP 則對行資料進行匹配,先查找表格中第一行中的
匹配資料,然後返回同一列中指定行的資料。
MATCH 和 INDEX 也 是 查 找 類 函 數 , 參 看 圖 2.8 中 的 演 示 。 函 數
MATCH(lookup_value,lookup_array,match_type) 返 回 單 一 列 ( 或 行 ) 中 在 指 定 方 式 下
(‘match_type’) ,與指定數值匹配的陣列元素的相對位置。注意該函數返回的是匹配數
值在陣列中的位置,而不是數值本身。
如果 match_type 為 0,函數則返回精確匹配的數值位置,不管陣列如何排序。如果
match_type 為 1,則返回近似匹配的數值位置,此時需要陣列按昇冪排列。如果 match_type
為-1,也返回近似匹配的數值位置,但此時需要陣列按降冪排列。
在圖 2.8 中,G 列中的期權價格按昇冪排列。為了找出陣列中匹配 9.73 的數值位置,
可以在 D22 中輸入公式:
=MATCH(C21,G17:G27,1)
其返回值為 6。
函數 INDEX 返回表或區域裏特定行列中的數值。在圖 2.9 中,特定的行和列為單格 C25
和 C26 中的值,於是返回陣列 F17:G27 中第六列、第二行中的值。
如果陣列是單一列(或者單一行),參數‘col_num’(或‘row_num’)可以為空。你可
以改變一下單格 D27 中的值來練習函數 INDEX 在這種情況下的使用方法。
我們將在本書的股票部分應用 VLOOLUP、MATCH 以及 INDEX 函數。
2.5 其他類型函數
在介紹試算表公式的同時,我們也想盡可能地介紹一些‘通用’的公式,它們可以處理
一些相關但不完全相同的情況。例如,圖 2.10 中顯示的是某只債券在某年的現金流,可以
是 0,可以是利息,也可以是本金加上利息。
IF 函數給出了兩種狀況下的不同結果,而含有一級嵌套的 IF 函數則可以給出三種不同的結
果(嵌套越多,可給出的結果也越多)。單格 C11 中的現金流公式含有一級嵌套:
=IF($B11<C$6,C$5,IF($B11=C$6,100+C$5,0))
如果把 C11 中的公式拷貝到 C11:H13 中,就會得到每只債券每年的現金流。
對於類型 1 的債券,現金流依賴於不同年份(單格 B11)和債券到期時間(C6) 。如果
年份在到期時間之前(B11<C6) ,則現金流就是利息 C5;如果剛好到期(B11=C6)
,則現
金流為本金加上利息;其他情況(B11>C6)則現金流為 0。內嵌的 IF 函數處理到期年份以
及到期年份之後的現金流,而週邊的 IF 函數則處理第一種狀態下的利息收入。
在輸入公式時我們採用了‘混合定址’方式,這是為了保證在拷貝單格公式時,引用能
夠作正確地變化。我們輸入 C$6 和 C$5 是為了保證在沿著列 C 向下拷貝時,始終將行 5 和
行 6 中的資料作為到期年份和利息率。而$B11 則隨著年份的不同變為$B12 和$B13。我們
輸入$B11,則當公式拷貝到 D 列中時,B 列中的資料仍然作為年份來計算,而 C$5 和 C$6
則變為 D$5 和 D$6。
在複製複雜模型的結果時,編寫這種通用公式得到的收穫比節約的時間更有價值。
2.6 審核工具
對於複雜的單格公式,使用審核
審核按鈕組將會給你很大的幫助。從功能表欄中調出該按鈕
審核
組的方法之一,是點擊視圖
視圖功能表下的工具欄
視圖 工具欄,然後選擇用戶定義
工具欄 用戶定義…。在如圖 2.11 中所示
用戶定義
的用戶定義
用戶定義對話方塊中,選中審核
用戶定義 審核,就會出現審核
審核 審核按鈕組。
審核
用戶定義對話方塊可以按你的意願來定制工具欄。如果你點擊命令
用戶定義 命令頁,並選中某一類
命令
別,你可以選擇並拖動命令
命令列表中的工具按鈕將按鈕拖到工具欄中。相反,你也可以選擇和
命令
拖動按鈕將按鈕移出工具欄(使它們返回工具框)。
2.7 模擬運算表(
模擬運算表(Data Tables)
)
模擬運算表(Data Tables)可以執行單格公式一系列的重複計算,而不用拷貝或重新
輸入公式。AMFEXCEL 工作簿中有不少類比運算表的應用實例。這裏用 CompoundDTab
工作表中計算複利和折現因數的例子說明單變數和雙變數輸入類比運算表的使用方法。在工
作表 DSBTab 中也有其他一些關於模擬運算表應用的例子。
2.7.1 建立單變數類比運算表
Continuous Compounding:連續複利;
Enter formula(s) for output:輸入公式;
Enter numbers for input variable t:為參數 t 輸入數位;
【參照書中第 21 頁的圖 2.13】
現在工作表就可以進行模擬運算表計算了,只需簡單地做如下操作:
選中表格區域 C16:E26
在主功能表中,點擊資料 資料中的類比運算表
資料 類比運算表
在對話方塊中:列輸入單格
列輸入單格中輸入單格
列輸入單格 確定按鈕
C7,然後點擊確定
確定
Compounding/Discounting Factors:複利/折現因數;
Enter formula(s) for output:輸入公式;
Enter numbers for input variable t:為參數 t 輸入數位;
圖 2.14 模擬運算表中不同時段的複利因數和折現因數
2.7.2 建立雙變數類比運算表
圖 2.16 模擬運算表中不同利率不同時段的折現因數
模擬運算表在處理‘what-ifs’類問題時極為有用。其優點在於表格能夠自動地適應模
型的變化。而其缺點在於:如果工作表中含有大量的模擬運算表,當輸入改變後,連續的重
新計算會降低處理速度。基於這個原因,有時可能需要關掉類比運算表的自動重算功能。
建立類比運算表需要注意一下幾點:
到目前為止,Excel 要求模擬運算表的輸入單格必須與模擬運算表在同一個工作表
中。
類比運算表單格中的公式是以陣列形式出現的,例如,模擬運算表單格的輸入為
{=TABLE(C5,C7)},其中的 C5 和 C7 是輸入單格。既然是以陣列的形式出現,那
麼你就不能編輯它。
如果要重建或者擴建模擬運算表,可以先選中所有包含了{=TABLE()}的單格,然後
點擊編輯編輯功能表下的清除所有
編輯 清除所有,或者直接按
清除所有 Del 鍵。
改變輸入或其他假定的資料,會導致類比運算表重新計算,除非缺省的計算方法做
了有意的改動。
在大型模型中,類比運算表中每一個輸入的重新計算可能需要很長的時間,這時可以關
閉模擬運算表的自動重算功能。要做到這一點,可以進行如下操作
點擊工具
工具功能表下的選項
工具 選項
點擊重新計算
重新計算頁,選中除模擬運算表外
重新計算 除模擬運算表外,
除模擬運算表外,自動重算選項
自動重算
當自動重算功能關閉後,按下 F9,強迫所有的模擬運算表重新計算一遍。
如果你對期權定價的布萊克-舒爾斯公式很熟悉,你可以通過建立工作表 BSDTab 中建
議的三個模擬運算表來鞏固模擬運算表方面的知識。它同樣可以用來計算布萊克-舒爾斯看
漲期權價格對即期股票價格 S 的敏感度,以及對其他輸入變數的敏感度。
2.8 XY 圖
1. 點擊主工具欄中的圖表嚮導
圖表嚮導按鈕。
圖表嚮導 (它像一個小的條形圖。)在步驟 1 的對話方塊中(如
圖 2.17 所示),選擇圖表類型
圖表類型;這裏,選擇
圖表類型 XY 散點圖子圖表類型中的無數據點平滑線散點
散點圖 無數據點平滑線散點
圖。點擊按下不放可查看示
按下不放可查看示例
按下不放可查看示例按鈕。如果覺得不錯,就可以點擊下一步
下一步按鈕。
下一步
圖 2.17 圖表類型對話方塊
圖表類型
2. 在步驟 2 的對話方塊中,檢查資料區域
資料區域輸入框中的資料源是否是正確的,注意,Excel
資料區域
將這個資料區域理解為三列資料。點擊系列 系列頁,可以看到系列
系列 系列 1 中的 X 值和 Y 值。點擊名
名
稱輸入框,選擇工作表中單格或是直接鍵入(compound)的方式為當前啟動的系列加一個
名稱。圖 2.18 中顯示系列
系列 2 的名稱改成了單格 E15 中的 discount。點擊下一步
下一步按鈕繼續。
下一步
【參照書中第 25 頁的圖 2.18】
圖 2.18 在圖表源資料
圖表源資料對話方塊中指定
圖表源資料 X 值和 Y 值
3. 在步驟 3 的對話方塊中,輸入圖表選項
圖表選項,如標題、格線、圖例等。在我們的例子中,
圖表選項
象圖 2.19 中顯示的那樣,增加標題並去掉格線就夠了。點擊下一步
下一步按鈕繼續。
下一步
【參照書中第 25 頁的圖 2.19】
圖 2.19 圖表選項對話方塊
圖表選項
4. 在步驟 4 的對話方塊中,決定圖表位置
圖表位置。圖表可以作為工作表的一部分
圖表位置 (嵌入式圖表)
,
也可以作為一個分開的圖表頁。通常是作為一個嵌入式圖表,這樣就可以看到圖表源資料變
化的效果了,如圖 2.20 顯示的那樣。
圖 2.20 圖表位置對話方塊
圖表位置
Compounding/Discounting Factors:複利/折現因數;
圖 2.21 由圖表嚮導
圖表嚮導生成的未經加工的圖表
圖表嚮導
2.9 訪問資料分析和規劃求解
Excel 有一些附加的模組,這些模組在完全安裝時是可用的,但如果選擇節省空間的安
裝,則被忽略。我們需要用到規劃求解和資料分析回歸過程,因此需要先檢查一下工具 工具功能
工具
表,看看它們是否可用。如圖 2.22,其中含有規劃求解
規劃求解和資料分
規劃求解 資料分析
資料分析選項。如果工具 工具功能表
工具
中沒有,你可以點擊增益集增益集選項(也在工具
增益集 工具功能表中)
工具 。在如圖 2.22 所示的對話方塊中選中
分析工具庫、分析工具庫
分析工具庫 分析工具庫-
分析工具庫 函數和規劃求解
-VBA 函數 規劃求解,然後點擊確定
規劃求解 確定按鈕。安裝完畢後,你就
確定
可以在工具
工具功能表中看到這兩個選項了。
工具
【參照書中第 27 頁的圖 2.22】
圖 2.22 含有資料分析
資料分析和規劃求解
資料分析 規劃求解選項的工具
規劃求解 工具功能表,以及增益集
工具 增益集對話方塊
增益集
在解最優化問題時,可以對規劃求解的使用作最好的描述,因此這部分內容將放在本書
股票部分的 6.5 節,在那裏,使用規劃求解來求解最優的組合權重。
在利用函數和分析工具庫來進行回歸分析之前,我們先簡單地介紹一下區域名稱,它在
選擇和引用大範圍資料時是很有用的。
2.10 使用區域名稱
圖 2.23 帶有名稱的資料區域,粘貼名稱
粘貼名稱按鈕以及定義名稱
粘貼名稱 定義名稱對話方塊
定義名稱
需要命名的區域被選中後,就可以在主功能表欄左下方的名稱框裏鍵入你想取的名稱,
如圖 2.23 所示。這樣,在 Beta 工作表中,名稱 ShareA 就與區域 B5:B64 綁定起來。另外,
還可以選擇插入 插入功能表下的名稱
插入 名稱選項,然後點擊定義
名稱 定義選項來為選中的區域命名,在出現的對
定義
話方塊中鍵入名稱 ShareA 即可,如圖 2.23 所示。這樣,選擇和引用收益區域時就可以用
它的名稱來代替了,比如選定名稱框中的名稱 ShareA,或是在輸入函數時使用粘貼名稱粘貼名稱按
粘貼名稱
鈕。
2.11 回歸分析
假設讀者已經對簡單的回歸分析(兩個變數)很熟悉,在本書的股票部分將用到它。這
裏,我們概述一下怎樣利用 Excel 來進行必要的計算。實際上,Excel 有多種方法來進行回
歸運算,主要有兩類:使用 Excel 函數和使用分析工具庫中的簡單回歸程式。我們將用 Beta
工作表中的股票和指數收益來演示這兩種不同的簡單回歸方法,首先用 Excel 函數,然後使
用資料分析回歸過程。如果你對這些函數和過程不熟悉,Beta 工作表提供了一個適當的練
習版面。
Excel 提供了一些進行回歸分析時經常用到的函數。圖 2.24 展示了回歸方程的截距、斜
率函數,以及兩種擬和度函數:R 平方和標準差
平方 標準差(STEYX
標準差 表示‘standard eror of Y given
X’)。由於資料區域已被命名,所以可以用粘貼名稱 粘貼名稱按鈕把它們的名稱輸入到函數中。這
粘貼名稱
些函數結果會隨著輸入資料(ShareA 和 Index 區域中的資料)的變化而動態變化。
下一步,我們來練習一下分析工具庫中的回歸過程。首先,點擊功能表工具 工具下的資料分
工具 資料分
析選項,然後點擊回歸
回歸,於是就出現了圖
回歸 2.27 中顯示的對話方塊。同樣,對話方塊中的 Y
區域和 X 區域可以通過選擇單格區域來引用,也可以通過輸入名稱來引用(如果區域已經
命名的話)。一般來說,指定一個資料表中左上角的單格作為輸出區域比接受缺省輸出選項
(將結果輸出到一個新工作表中)更方面一些。
圖 2.27 設定分析工具庫的回歸計算以及輸出選項
2.12 單變數求解
圖 2.31 單變數求解求出的波動率大小
單變數求解從一個初值開始,然後採用一種迭代方法使結果與設定值逐漸靠近。可變單 可變單
格中的數值就作為初值,在這裏是 20%。求解時,你可以改變一個單格中的輸入值,也可
以改變多個單格中的輸入值(見第 6 章)
。
作為練習,可以將市場價格改為 9,然後在 BSDTab 表中用單變數求解來求出相應的波
動率。
2.13 矩陣代數以及相關函數
矩陣的概念在代數中應用非常廣泛,它為結構相似的方程提供了一個緊湊的表達形式。
矩陣運算看起來很像代數運算,但是矩陣相乘卻顯得很複雜。Excel 包含了一些有用的矩陣
函數,它們屬於數學類函數,要想熟練地使用它們,必須先瞭解一些矩陣的基本背景知識。
接下來的一節,我們將解釋一下矩陣的概念,然後介紹矩陣的轉置、相加、相乘以及逆運算。
演示這些運算的常式放在 AMFEXCEL 工作簿的 MatDef 表中。對矩陣很熟悉的讀者,可以
跳過這節內容,直接看一下矩陣函數小結(2.13.7)就可以了。
2.13.1 矩陣介紹
在代數中,一個矩形的數值陣列就是矩陣。只有一列數值的矩陣通常被稱為列向量;同
樣,只有一行數值的矩陣被稱為行向量。在 Excel 中,矩形的單格區域被稱為陣列。下面的
這些數值區域都可以看成為矩陣:
−3 2 7
−3 2 7
2 2 20 19
6 7 2 20 19
4 7 9 21
7 9 21
0 13 3
2
x= 並且 y = 6 7
4
則 x 的維數為(2×1),而 y 的維數為(1×2)
。
2.13.2 矩陣轉置
矩陣的轉置是將矩陣的行轉換為列(反之亦然)。很明顯,列向量 x 的轉置是一個行向
T
量,表示為 x 。圖 2.32 中的試算表演示了列向量 x 和行向量 y 的轉置過程。
Array Manipulation:陣列操作;Transposes:轉置;
Array:陣列;dim:維數;
2.13.3 矩陣相加
兩個矩陣相加是將對應的元素分別相加。因此,這兩個陣列必須具有相同的維數。所以,
T
x 和 y 是不能相加的,而 x 和 y 具有相同的維數,2×1,它們是可以相加的,其結果如下:
2 6 8
x + yT = + = =z
4 7 11
如果將向量 y 數乘以 10,則 y 中的每一個元素都乘以 10。結果如下:
10 y = 10* 6 7 = 60 7 0
這相當於 10 個 y 相加。
2.13.4 矩陣相乘
兩矩陣作相乘運算時,必須有一個維數是相等的,即,一個矩陣的列數必須等於另一個
矩陣的行數。簡稱其為‘維數一致’。如果要得到乘積 xy,則 x 的列數必須等於 y 的行數,
(2×1)乘以(1×2),其結果為一個(2×2)的矩陣。
在圖 2.32 中,單格 C10:D11 中乘積 xy 的計算過程如下:
2 2*6 2 *7 12 14
6 7= =
4 4*6 4 *7 24 28
就是說,乘積 xy 第一行第一列的元素是 x 第一行元素乘以 y 第一列元素的結果,如此類推。
作為對比,乘積 yx 是維數(1×2)乘以(2×1)
,結果為(1×1),也就是說,它只包含
一個元素。觀察單格 C13 中的乘積 yx,其計算過程如下:
2
6 7 = 6 * 2 + 7 * 4 = 40
4
這些計算結果表明,乘積 xy 與乘積 yx 是不相等的。所以相乘的順序很重要的。
MMULT 陣列函數返回的是兩個矩陣‘array1’和‘array2’的乘積。因此,為了得到
乘積 xy 的(2×2)矩陣元素,必須先選中一個 2×2 的單格區域,然後鍵入或利用粘貼函數
粘貼函數
按鈕輸入如下的公式:
=MMULT(C4:C5,C7:D7)
最後記住同時按下組合鍵 Ctrl+Shift+Enter。
如果資料區域 C4:C5 和 C7:D7 分別命名為 x 和 y,則公式可以簡單地寫成:
=MMULT(x,y)
再考慮兩個大點的陣列:
12 4 16 19 −2
C= 並且 D =
3 13 5 12 14
C 和 D 的維數分別為(2×2)和(2×3)
,既然 C 的列數與 D 的行數相同,因此乘積 CD
是可以得到的,它的維數是(2×3) ,計算過程如下:
2.13.5 矩陣求逆
1 0 0 L 0
0 1 0 L 0
0 0 1 L 0 是一個單位矩陣。
L L L L L
0 0 0 L 1
假設 D 是前面提到的(2×3)的矩陣,而 I 是一個(2×2)的單位矩陣。那麼:
1 0 16 19 −2 16 19 −2
ID = * = =D
0 1 5 12 14 5 12 14
任何矩陣與一個適當維數的單位矩陣相乘都等於該矩陣本身(就如同與 1 相乘一樣)。
足下面的條件,我們就把它叫做矩陣 A 的逆矩陣:
A−1 A = AA−1 = I
例如,
−3 2 7 −0.175 −0.015 0.072
A= 2 20 19 則 A−1 = −0.064 0.079 −0.050
7 9 21 0.086 −0.029 0.045
並且
1 0 0
−1
AA = I = 0 1 0
0 0 1
求一個矩陣的逆矩陣是一件很麻煩的事。幸運的是,函數 MINVERSE 可以直接求矩陣
的逆。例如,為了得到圖 2.33 中矩陣 A 的逆矩陣,我們先選中一個 3×3 的單格區域 I17:K19,
然後輸入陣列公式:
=MINVERSE(C17:E19)
就可以了。讀者可以將結果與 A 相乘來檢測一下它是否正確。
Array:陣列;dim:維數;
2.13.6 線性方程組求解
矩陣逆運算的用途之一是對如下形式的方程組求解:
−3 x1 + 2 x2 + 7 x3 = 20
2 x1 + 20 x2 + 19 x3 = −5
7 x1 + 9 x2 + 21x3 = 0
它們可以寫成矩陣的形式:Ax=b,其中:
−3 2 7 20 x1
A= 2 20 19 b = −5 x = x2
7 9 21 0 x3
要想解這組方程,可以將方程的兩邊分別乘以矩陣 A 的逆矩陣:
求得。
匯總一下,Excel 中有進行矩陣轉置、矩陣相乘、矩陣求逆運算的函數。對應的函數如
下:
TRANSPOSE(array) 返回一個矩陣的轉置
MMULT(array1, array2) 返回兩個矩陣的乘積
MINVERSE(array) 返回一個矩陣的逆矩陣
由於這些函數是以陣列形式輸出的,因此輸出陣列的大小必須預先知道。在選中適當大
小的區域之後,才能鍵入公式(或者利用粘貼函數 粘貼函數按鈕以及函數參數
粘貼函數 函數參數面板)
函數參數 。最後按下組合
鍵 Ctrl+Shift+Enter 而不是簡單的 Enter 鍵來輸入公式。如果操作失敗,可以保持輸出區域
在 ‘ 選 中 ’ 狀 態 , 然 後 按 下 編 輯 鍵 ( F2 ), 必 要 時 重 新 輸 入 公 式 , 最 後 再 按 一 次
Ctrl+Shift+Enter 組合鍵。
為了鞏固所學的知識,可以試著做一下 MatExs 工作表中的練習。
我們將在本書的股票部分大量地使用到矩陣函數,不管是用於試算表計算,還是用於
VBA 用戶定義函數。
小結
Excel 中有各種類型的函數和過程。它們包括數學、統計和查找類函數,以及常用的過
程,如建立模擬運算表和用 XY 散點圖顯示結果等。
要訪問函數,可以點擊粘貼函數
粘貼函數按鈕,函數的參數可以在函數參數
粘貼函數 函數參數對話方塊中輸入。區
函數參數
域名稱的使用可以簡化操作,特別是當區域比較大的時候。區域名稱可以用於函數參數
函數參數對話
函數參數
方塊中。
審計工具條給我們帶來很大的方便,特別是追蹤引用單格
追蹤引用單格、移去引用單格追蹤箭頭
追蹤引用單格 移去引用單格追蹤箭頭和追
移去引用單格追蹤箭頭 追
蹤從屬單格按鈕,它們在檢查公式時非常有用。
蹤從屬單格
熟悉各類函數是很必要的,因為它們能夠非常容易地嵌入到用戶定義函數中,進行 VBA
編碼時也經常用到它們。
在使用陣列函數時需要非常小心。必須預先知道輸出陣列的區域大小。然後選中適當大
小的單格區域並輸入公式,最後按下組合鍵 Ctrl+Shift+Enter。
嵌入式函數是動態的,也就是說,當它們的輸入資料發生改變時,函數結果也會隨之變
化。相比之下,一些過程如單變數求解和分析工具庫中的程式則是靜態的。資料堆疊(data
dump)的結果與初始資料是沒有關聯的。因此當輸入資料改變時,這些過程必須重新運行
一遍。
第 3 章 VBA 介紹
有經驗的用戶使用宏是出於兩種原因:方便控制重複計算;協助那些對試算表不熟的第
三方用戶。從我們的觀點來看,掌握 VBA 的主要目的是能夠利用函數和巨集來進行自動計
算。如果一系列計算由函數代替,則試算表模型將變得更為強大。Excel 提供了各種類型的
函數,而 VBA 可以將函數的範圍進一步擴大。另外,使用 VBA 巨集來產生圖表或進行自動
重複操作非常有用,如進行模擬。在這兩種情況下都需要使用 VBA,但第一種情況會使用
用戶定義函數,而第二種情況則使用巨集(副程式) 。然而兩種類型的編程代碼大部分都是
相同的,本章將集中講解宏的編寫方法,而在第四章則集中講解用戶定義函數的編寫方法。
Excel 中使用的編程語言叫做 Visual Basic for Applications,簡稱為 VBA。單詞 basic
表明這種語言源於古老的 BASIC 語言,這意味著 VBA 在處理大量計算時效率不高。當 PC
機變得越來越強大,並且試算表的功能越來越多時,試算表與專業計算套裝軟體之間的界限
也變得越來越模糊了。當前的問題是:完成一項任務的最佳途徑是什麼?如:發現‘有效邊
界’,模擬一隻股票的表現,或者求一個矩陣的‘特徵向量’。答案依賴於用戶的目的。試
算表的運算速度較慢,但計算過程卻很容易理解。而專業套裝軟體的運算速度很快,但其計
算過程太過晦澀。
根據要解決的問題來選擇 VBA 的使用方式是很重要的,試算表並不能提供所有問題的
解決方案。使用 VBA 副程式來處理自動重複計算任務是很有效的;使用 VBA 建立簡單函數
也是很方便的;但是想編寫強大的互動式程式,使得一個新手能夠訪問一個複雜的試算表模
型,則似乎非常困難。也許真有程式師可以處理這類問題,但我們並不提倡這樣做。VBA
不是所有編程任務的萬能靈藥,它應該被選擇性地使用,因為還有一些更為有效的方法來處
理那些計算量大的任務。
Excel 的宏錄製器(macro recorder)可以將用戶的按鍵轉化為 VBA 代碼,並且可以用
來提供適當的代碼。雖然我們可以不必知道底下的 VBA 代碼而直接使用宏錄製器,但我們
本章的目的是解釋並演示一些 VBA 的實際應用,這樣能使你更加有效地使用整個 Excel 套
裝軟體。也許在剛開始時,最好的辦法是先用宏錄製器產生初始代碼,然後在你熟悉 VBA
代碼之後,再選擇性地編輯(或重寫)這些代碼。
瞭解 VBA 副程式與函數之間的區別是很重要的。它們之間有較大的差異,包含一段源
代碼的函數可以返回數值(或陣列) ,而 VBA 副程式則不能。典型的 VBA 副程式是沒有輸
入項的,但它們可以執行一系列試算表命令(這些命令可以使用試算表單格中的數值,並改
變某些單格中的數值) 。而函數則可以接受輸入(或‘參數’) ,並在執行一系列數值計算後,
返回一個數值(或一個陣列) 。然而,不管是 VBA 副程式還是函數,試算表都是第一個發展
的工具。
3.3 編寫 VBA 宏
掌握任何一種語言都有一個積累的過程,一方面要學習語言規則,另一方面要不斷地試
驗和測試編碼。VBA 代碼是在 Excel 的編碼環境――Visual Basic 編碼器中編寫的。Excel 97
的編碼功能在 Excel 5/7 的基礎上得到了擴充和增強,為編碼提供了更多的支援。我們先從
檢查一些簡單常式的代碼入手。VBA 的 MsgBox 函數提供了一種簡單的方式來顯示計算結
果和回饋簡單的診斷資訊。我們將演示怎樣用巨集錄製器來生成代碼,並與手寫代碼作比
較。最後概述一下這兩種方法的優缺點。
一般來講,副程式的輸入值要麼來自試算表的單格,要麼來自用戶輸入(通過螢幕) ,
而它的輸出值要麼輸出到檔中,要麼直接顯示給用戶。VBA 的內嵌函數提供了兩種有用的
螢幕顯示方法,MsgBox()和 InputBox()。相對簡單的 MsgBox()函數在螢幕上顯示一條資訊,
然後等待用戶的反應。代碼如下:
Sub MsgBoxDemo1()
MsgBox “Click OK to continue”
End Sub
資訊(或‘提示’)必須用雙引號引起來。在這個簡單的 MsgBox 實例中,提示兩邊的括
弧是可選的。然而,當需要從 MsgBox 中得到回應,就必須使用括弧,這時 MsgBox 就象
函數一樣使用。如果有一個變數鏈結到提示上(使用連接符&),則 MsgBox 會變得更加有
用。例如,在 Factorial 副程式中,可以用下面的語句將結果傳遞給用戶:
MsgBox “Factorial is ”& fac
下面的代碼中,用戶用 InputBox 函數來輸入數值。這個 VBA 函數彈出一個對話方塊,顯示
一條資訊,並返回用戶的輸入值,這裏表示為 num。InputBox 語句中的參數是需要顯示的
資訊,也就是‘提示’。這裏的 InputBox 有一對括弧,說明它是作為一個函數被調用的,
它返回用戶的回答,num。階乘的計算仍是採用一個 For…Next 迴圈:
Sub Factorial()
‘calculates the factorial of a number
fac = 1
num = InputBox(“Enter number”)
For i = 1 To num
fac = i * fac
Next i
MsgBox “Factorial is ”& fac
End Sub
我們將利用這個簡單的例子來探討 3.4 節中巨集編程的組成元素。
3.3.3 編寫環境
運行代碼時,如果出現一個運行時錯誤,運行過程就會停止。一個確定 確定對話方塊會說明
確定
錯誤的類型,儘管對於新手來說,這種說明不夠詳細。記住錯誤資訊之後,點擊確定 確定按鈕,
確定
滑鼠指示器就會跳到出現錯誤的語句那裏,並且這條語句會以高亮度的形式顯示(黃色) 。
更正錯誤之後,點擊運行 運行功能表下的重新設置
運行 重新設置(或者點擊工具欄中的黑色方框)來去掉黃色
重新設置
亮條,然後重新運行宏。
為了作進一步的練習,可以輸入下面改進後的 Factorial 副程式。在這個版本中,迴圈
語句被用於計算階乘的 Excel 函數 FACT 代替,注意,要在 VBA 代碼中使用 Excel 函數,
只需在 FACT 函數前加上首碼 Application.(或者 WorksheetFunction.)就可以了。
Sub Factorial()
'calculates the factorial of a number
num = InputBox("Enter integer number ","Calculate Factorial ")
fac = Application.Fact(num)
MsgBox "Factorial is " & fac
End Sub
為了避免記憶體溢出,副程式 Factorial 的輸入整數應小於 25。
這些簡單的宏都是手工輸入的。然而,許多操作代碼可以用 Excel 宏錄製器來生成,因
此下一節我們將介紹這種不同的編寫宏的方法。
3.3.5 錄製按鍵和編輯代碼
3.4 編程要素
金融建模時,要編寫的許多代碼都是對數值計算進行控制。這包括對它賦值,採用適當
的結構來控制過程流,以及報告結果等。這些任務對所有的編程語言來說,都是最普通的。
VBA 程式的唯一不同之處就在於,它經常需要從試算表模型開始,其任務是由功能表操作
執行,而且關鍵的計算放在單格公式中,許多公式還包含 Excel 函數。幸運的是,將 Excel
函數嵌入到 VBA 代碼中是很容易的事。VBA 程式不是用來代替試算表模型的,而是用來擴
展和增強它們的功能的。我們先來簡要回顧一下關於變數的應用(特別是陣列變數) 、控制
過程流的結構,以及 VBA 中 Excel 函數的應用等相關內容。
3.4.1 變數和資料類型
編程時,變數是用來存儲和運算元據的。按照慣例,資料具有不同的形式或者說‘類
型’,而這會影響到它們在記憶體中的存儲空間。在大部分的數值計算中,主要有四種類型
的資料:小數型(傳統的十進位小數,也叫標量)、整型、邏輯型(True 或 False)和日期
型。而字元型變數存儲的是文本資訊。VBA 有一個非常有用的資料類型,variant,它可以
代表任何資料類型。它是缺省的資料類型,當我們不知道一個變數的類型時它是很有用的。
但是,variant 類型會佔用額外的記憶體空間,這在處理大量數值計算時會影響運行的速度。
還有一個‘物件’型資料類型,它可以引用一個物件,如一個區域或者工作表等。更詳細的
內容見 Green(1999)。
從 VBA 編程新手的角度來看,明確地聲明所有需要用到的變數是很重要的,這可以減
少代碼中錯誤的出現。你可以在每個模組頁的開頭寫上‘Option Explicit’語句來強制實行
這一點。(VBE 可以自動地增加該語句,在 VB 視窗點擊 工具 功能表下的選項 選項,然後選中
選項
要求變數聲明的選項。)這樣,在運行時,如果編輯器遇到一個未聲明的變數,就會返回一
要求變數聲明
個錯誤資訊。這在檢測代碼中是否有錯誤拼寫的變數名時顯得特別有用。金融建模時,聲明
變數的類型(作為整型、字串型還是邏輯型等)並不重要。但它可以用來在程式中說明變數
的用途。
變數聲明使用 Dim 關鍵字,如下面 Factorial 副程式中的第三行所示。這裏,聲明了兩
個變數,但沒有給出資料類型(如整型) 。缺省情況下,它們是 variant 類型:
Sub Factorial()
'calculates the factorial of a number
Dim fac,num
num = InputBox("Enter number ","Calculate Factorial ")
fac = Application.Fact(num)
MsgBox "Factorial is " & fac
End Sub
(順便提一句,注意這裏的 InputBox()函數,它返回用戶的輸入資訊,在這裏它有兩個參數,
第一個參數是提示資訊‘Enter number ’,而第二個參數(可選)則是對話方塊的標題。)
總體來講,副程式中用到的所有變數都應該用 Dim 關鍵字作顯式聲明。模組頁前的
‘Option Explicit’語句保證所有的變數必須預先聲明,否則,副程式就不能正確運行。
有時變數可以按名稱分組組成陣列(向量或者矩陣) 。例如,一個資料集累積分佈的所
有四分位元數可以用一個陣列變數 qvec()表示。陣列中的元素可以用下面的方式引用:
qvec(0),qvec(1)等。利用前面一章討論的對數收益資料,如圖 3.2 顯示,單格 H21:H25
中存放的是用 Excel 的 QUARTILE 函數計算出來的四分位數,第一個和最後一個分位元數
分別是資料集的最小和最大值,低於-0.043 的資料占整個資料集的 25%。因此陣列 qvec()
從單格區域 H21:H25 中得到資料,qvec(0)的值為-0.153,qvec(1)的值為-0.043,如此類推。
擴展一下,陣列變數可以是多維的,例如,兩維的陣列變數 PQmat()代表包含一列四分
位數和一列分佈左百分位數的 5×2 陣列。例如,變數 PQmat()可以從 5×2 的單格區域 H21:I25
中得到資料,如圖 3.2 所示。儘管對陣列變數的命令沒有什麼規定,但選擇可以區分一維陣
列(向量)和二維陣列(矩陣)的名稱還是有幫助的。因此我們分別使用 qvec 和 PQmat
作為陣列變數名稱。
和其他變數一樣,陣列變數應該在使用之前先聲明。缺省情況下,VBA 從 0 開始對陣
列變數編號。因此如果聲明語句為:
Dim qvec(4)
則陣列 qvec()包含 5 個元素。擴展一下,如果兩維陣列 PQmat()的聲明為:
Dim PQmat(1,4)
則它包含 10 個元素。
如果希望 VBA 將 1 作為最小編號,必須在模組頁的開頭聲明‘Option Base 1’。有了這
個聲明後,陣列變數 qvec(4)就只有 4 個元素:qvec(1), qvec(2) ,qvec(3) 和 qvec(4)。
實際上,在本書的大部分 VBA 程式中,陣列的基數都設為 1。
‘Option Base’設置的作用可以從下面的 ArrayBase 宏中看出。當給模組頂部的
‘Option Base’賦不同的值時,產生的結果也不同。既然 VBA 陣列函數 Array()是用來輸
入真實陣列的,就沒有必要為陣列變數 avec 指定維數:
Sub ArrayBase()
‘gives b=20 if Option Base is 1;gives b=30 in absence of Option Base statement
Dim avec,b
avec = Array(10,20,30)
b = avec(2)
MsgBox “b is ”& b
End Sub
通常,開始時並不知道陣列元素的個數,要根據巨集的操作結果而定。這種所謂的‘動
態陣列’事先沒有設定元素個數。它用一對空括弧聲明,如 Dim qvec()或者 Dim PQmat()。
但是在使用任何無維數陣列之前,必須先用 ReDim 語句告訴 VBA 這個陣列有多少元素。
在下面的例子中,名為‘dvec’的區域包含了需要存儲到陣列變數 cvec 中的結果。在聲明
cvec 為陣列變數之後,它的維數就由 dvec 區域的元素個數決定,在 cvec 被使用之前需要
使用 ReDim 語句:
Sub SelectCount()
're-Dim data array cvec
Dim n, cvec()
Sheets("Data").Range("dvec").Select
n = Selection.Count
ReDim cvec(n)
End Sub
操作 VBA 中的陣列要比使用 Excel 的陣列公式(如 SUM、SUMPRODUCT 以及矩陣
函數)複雜的多。有些時候,陣列操作可以完全由 Excel 函數來完成。注意,如果代碼中不
需要訪問陣列中的單個元素,陣列就可以直接用變數名引用,如 qvec,而不用加上它的維
數。但是,陣列處理經常包括對其中元素的操作,對元素進行操作的最好方法是在一個迴圈
語句中應用陣列。在這種情況下,元素用 qvec(i)來標識,且一般需要使用 Dim qvec()和
ReDim 語句。要想避免出錯,需要非常小心地編碼。由 Excel 構建的 VBA 陣列在編號上有
些模糊,特別是在處理行向量和列向量時。為了避免混淆,在將一個陣列作為過程的輸入時,
Excel 一般對陣列元素從 1 開始編號。
3.4.3 控制結構
和其他編程語言一樣,VBA 也提供了一些控制流程的結構。這些包括條件語句,如
If…Then…Else,它先判斷條件是否滿足,然後根據判斷的結果改變執行的流程;還有 Select
Case,它從多個條件(Case)中選擇一個分支。迴圈結構允許重複運行一段執行語句。有
些迴圈重複執行特定的次數,如帶有計數器的 For…Next 迴圈,前面,我們在計算階乘時
用到過它。其他的語句,如 Do While…Loop,重複執行語句直到條件為 True(或直到條件
為 False)。本節先看一個關於 If…Then 的簡單例子,更多的關於 For…Next 迴圈語句和
Do While…Loop 語句的例子會在接下來的章節出現。很多教科書(如 Green,1999;
Walkenbach,1999;Wells 和 Harshbarger,1997)中對這些控制語句都作了更為詳細的
解釋,並給出了一些其他的例子。
在 Factorial 副程式中我們已經提到,VBA 的交互函數 InputBox 可以返回用戶的輸入資
訊。為了使程式更強大,我們應該將用戶輸入的一些錯誤進行輸入過濾掉更正。一種方法是
檢查輸入是否是數值型,如果不是就丟棄它。下面的代碼演示了兩個 If…Then 結構語句的
使用。一個是單行的 If…Then 語句,它沒有額外的代碼行。這條語句檢查 numtype 變數(VBA
函數 IsNumeric 的結果變數)是否為真,如果為真,就計算階乘。它的檢測語句和執行語句
在同一行中。第二個條件語句採用塊 If…Then 形式。如果用戶的輸入不是數值型,則用戶
會被警告,並且不進行階乘計算。當條件語句結束後,有一個 End If 語句:
Sub Factorial()
'calculates the factorial of a number
' filters out non numeric input
Dim fact, num
num = InputBox("Enter number ", "Calculate Factorial ")
numtype = IsNumeric(num) ‘True 或者 False
If numtype = ture then fac = Application.Fact(num) ‘單行的 If…Then
If numtype = False Then ‘塊 If…Then End If
MsgBox "Not a number. Try again" 'don't proceed
End If
End Sub
我們將在第四章的用戶定義函數中多次用到 If…Then…Else 語句。
3.4.4 控制重複過程
Sub Quartiles()
'displays quartiles of range named 'dvec'
Dim i As Integer
Dim qvec 'to hold quartile
Dim dvec As Variant 'col vec of data
'fill array variable from spreadsheet range
dvec = Worksheets("Data").Range("dvec")
3.4.6 編程的一般觀點
結束這一節之前,我們對編程過程提出一些建議。採用結構化編程的目的是使程式按
一個有序的方式運行,這樣編碼就很容易進行,更重要的是,很容易修改。
先在紙上設計出整個應用程式的主要階段,並將整個任務分成幾個不同的子任務。然
後把每個子任務再分成一系列副程式,並對它們分別進行編碼和測試。如果可能,副程式應
保持合適的大小。結構化編程的一個原則是,代碼段應該只有一個入口和一個出口。程式控
制不能在代碼段的中間跳入或跳出。如果堅持這個原則,將各個分開的代碼段連接起來就會
很簡單。
程式經常需要更新和修改。如果在第一次編程時加上注釋,那麼搞清程式的邏輯就會容
易的多。只要可能,數值計算中的重要常量都應該用參數來表示(顯式聲明),這樣,當程
式用於不同的環境時,它們就很容易修改了。如果編寫的代碼能夠通用,這些額外的工作是
值得的。
3.5 宏與試算表之間的通信
作為對比,Factorial2 從試算表的單格(B5)中得到輸入資訊,然後將計算出的階乘返
回給另一個單格(C5) :
Sub Factorial2()
'gets number from spreadsheet, uses Excel fact function, returns answer to
spreadsheet
Dim fac, num
num = Sheet1.Range("B5").Value
fac = Application.fact(num)
Sheet1.Range("C5").Value = fac
End Sub
For i = 1 To niter
x = Range("atop").Offset(i - 1, 0)
y = y * x 'calculation routine
Range("aoutput").Offset(i - 1, 0) = y
Next i
End Sub
Offset(i,j)是一個非常有用的物件方法,它返回參考單格(這裏是 Range(“stop”))向下 i
行,向右 j 列的單格數據。例如,Range("atop").Offset(1, 0)代表的是單格 atop 正下方的單
格,等等。x 的第一個賦值是 Range("atop").Offset(0, 0),也就是 Range("atop")中的值。
作為巨集與電子錶之間通信的最後一個例子,我們來看看 Quartiles 副程式,改進它的
代碼使得它以陣列的形式返回五個四分位數給試算表。這個新的副程式 Quartiles1,先讀取
陣列 qvec()中的五個四分位數,然後將它們輸出到前面已命名的區域 qvec1 中。 (區域名稱
qvec1 與試算表中的區域 K20:K24 綁定,可以通過點擊插入 插入功能表下名稱
插入 名稱中的定義
名稱 定義選項來
定義
檢查。)
下面的代碼中,陣列變數 qvec(4)可以存儲五個數值。輸入和輸出陣列變數:dvec(資
料集)和 qvec(結果陣列) ,都被聲明為 Variants 類型,這暗示著它們不是簡單的標量。由
於不需要訪問 dvec 和 qvec1 中的單個元素,因此聲明它們時不用帶括弧()。在用試算表區
域 dvec 的資料填充完陣列變數 dvec 之後,陣列變數 qvec 中的每個元素會在一個 For…Next
迴圈中一一賦值。缺省情況下,VBA 以行的形式在試算表中建立陣列,因此需要使用 Excel
函數 Transpose 來將輸出陣列轉換成列向量:
Option Base 0
Sub Quartiles1()
'pastes 4 by 1 col vector of quartiles into range named 'qvec1'
'requires 2 named ranges in spreadsheet, dvec with data & qvec1 for results
Dim i As Integer
Dim qvec(4) 'quartiles array
Dim dvec As Variant 'col vec of data
Dim qvec1 As Variant 'results array
'fill array variable from spreadsheet range
dvec = Worksheets("Data").Range("dvec")
'calculate quartiles & assemble as col vector
For i = 0 To 4
qvec(i) = Application.Quartile(dvec, i)
Next i
qvec1 = Application.Transpose(qvec)
' transfer results into spreadsheet range qvec1
Worksheets("Data").Range("qvec1") = qvec1
End Sub
注意,在循環體中,只有一條語句執行。這裏要說明一點,在循環體內不要放任何不必
要的語句。循環體中任何與迴圈操作無關的語句都應該放在循環體外。
讀者可以用自己的資料和公式來改寫一下上面的這些代碼,從而鞏固所學的知識。作為
參考,VBSUB 工作表在 ModuleI 和 ModuleQ 模組中分別提供了 ReadWrite 和 Quartiles
副程式的代碼。
本節對編寫 VBA 副程式做了一個簡單的介紹。要想加強這方面的知識,可以參看
Green(1999)教科書的第 2 章,它是一本很好的 VBA 初級讀本。下一節將介紹三個更深入
一層的 VBA 應用實例,代碼和解釋都會更長。它們代表了巨集的一些實際應用,並且演示
了 VBA 編程的一些深層思想。
3.6 副程式實例
在本節中,我們進一步改寫了一些副程式,一來可以演示改進代碼的過程,二來可以展
示宏的一些應用領域。在編寫這些例子時,我們將錄製器和代碼編輯混合起來使用。這些副
程式包括:生成特殊類型的圖表,累積分佈和正態分佈作圖,求解的重複優化。
3.6.1 圖表
代碼 ActiveChart.PlotArea.Select 及其之後的代碼是後加的。這段代碼設置坐標軸 y 的
最大值為 1(或 100%),並且將繪圖區的缺省背景填充色灰色去掉。
前面提到的這些宏在工作簿的 ModuleC 模組中定義,並能在 Data 表中運行。
3.6.2 正態概率散點圖
正態概率散點圖是一種有用的資料視覺化工具。繪出的圖形可以表明觀測變數是否可以
假設服從正態分佈。假設有 50 個觀測值。我們先計算出服從正態分佈的 50 個順序值(叫
做 norm-scores)
,並用它們對照 50 個觀測值的標準化值(叫做 z-scores)繪圖。如果觀測
值是服從正態分佈的,則兩組值繪出的點大致在一條直線上。圖 3.4 中繪出的散點表明,觀
測值與正態分佈有一點偏差,特別是在分佈的尾部。
現在,Excel 的統計庫中已經步包括這種有用的繪圖工具了。
(資料分析工具庫回歸選
項中的正態概率分佈圖並不是傳統意義上的正態概率散點圖,它只是應變數的累積分佈圖。)
圖 3.4 對數收益數據的正態分佈散點圖
Option Explicit
Option Base 1
Sub NPPlotData()
' returns n by 2 matrix where n = no. of elements in dvec
' 1st col z-scores, 2nd col normscores for n obs.
Dim M, V, r, c
Dim i As Integer, n As Integer
Dim Znmat() As Variant
Dim dvec As Range
M = Application.Average(dvec)
V = Application.Var(dvec)
For i = 1 To n
Znmat(i, 1) = (dvec(i) - M) / Sqr(V)
r = Application.Rank(dvec(i), dvec, 1)
c = (r - 3 / 8) / (n + 1 / 4)
Znmat(i, 2) = Application.NormSInv(c)
Next i
3.6.3 用規劃求解產生有效邊界
Asset Data:資產數據;
Correlation Matrix:相關係數矩陣;
VCV matrix:VCV 矩陣;Portfolio weights:組合權重;
' initialisation
Dim target1 As Double
Dim incr As Single
Dim i As Integer, niter As Integer
target1 = Range("min_tgt1").Value
incr = Range("incr1").Value
niter = Range("niter1").Value
'set up Solver
SetUpSolver: 'for special case
If Selection.Columns.Count = 1 Then MsgBox ("Setting Up Solver. Continue ?")
Application.Goto Reference:="storestart1"
SolverReset
Call SolverAdd(Range("portret1"), 2, Range("target1"))
Call SolverOk(Range("portsd1"), 2, 0, Range("change1"))
Range("target1").Select
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
編寫完代碼後,就可以為這個宏增加一些描述,並且分配一個快捷鍵,就像錄製巨集時的那
樣。可以在 Excel 視窗中點擊 工具 功能表下巨集 巨集中的巨集
巨集 巨集選項。在巨集對話方塊中,選中
巨集
巨集的名稱(Eff1) ,然後點擊選項 選項按鈕。
選項
作為參考,計算有效邊界的宏代碼放在 VBSUB 工作簿的 ModuleS 模組頁中,並可以
在 Eff1 表中運行。在調用任何包含規劃求解的宏之前,必須先建立一個對規劃求解插件的
引用。保持 Visual Basic 模組在啟動狀態,然後點擊工具 工具功能表中的引用
工具 引用,然後流覽並找到
引用
Solver.xla(通常在\Office\Library 目錄下)
。
小結
參考文獻
Green,J.,1999,Excel 2000 VBA Programmer’s Reference,Vrox Press Ltd.,Birmingham.
Leonhard,W.,L.Hudspeth and T.J.Lee,1997,Excel 97 Annoyances, O’Reilly&Associates,
Inc., Sebastopol, CA.
Walkenbach,J.,1999,Excel 2000 Power Programming with VBA,IDG Books,Foster
City,CA
Wells,E. and S. Harshbarger,1997,Nicrosoft Excel 97 Developer’s Handbook,Microsoft
Press.
圖 3.8 VB 表單中的標準工具欄
用 VBA 編程時有兩種類型的程式:副程式(或巨集)和函數。只有副程式(或巨集)
可以錄製。錄製後的代碼通常需要在代碼視窗作進一步的修改,並用 Excel 調試工具來測
試。由於函數不能錄製,它們必須在一個代碼模組中手工編寫。因此錄製工具在編寫函數時
基本無用。
如前所述,副程式可以在 Excel 表單中運行(通過功能表操作,或者點擊 VB 工具欄中
的運行
運行按鈕,或者使用一個快捷鍵)
運行 。它們也可以在代碼視窗中運行(將滑鼠指示器移動到
副程式代碼體內的任何地方,然後點擊 VB 表單功能表下 VB 標準工具欄中的運行 運行按鈕)
運行 。
相比上面的兩種方法而言,如果我們能夠將副程式與按鈕綁定,也許會對用戶更友好。但是,
既然我們的工作簿相對來說更依賴函數而不是巨集,因此我們在此就不介紹這方面的內容,
讀者可以參考其他文獻來瞭解它。 (例如,可以參看 Leonhard et al.,1997 中的‘VBE and
developing macros’部分。)
注意,運行副程式時,如果 VBE 中斷了它,並告訴存在一個編譯錯誤時,VBE 會以一
種‘調試模式’掛起巨集操作,而此時副程式名會以黃色顯示。可以將滑鼠移到出錯的語
句,修改簡單的錯誤,然後點擊運行 運行功能表中的重新設置
運行 重新設置或點擊工具欄中的重新設置
重新設置 重新設置按鈕來
重新設置
跳出‘調試模式’。這時黃色條紋會消失,宏就可以重新運行了。
逐語句運行宏和使用其他調試工具
如果你的宏並不如你所期待的那樣運行,採用逐語句運行的方式是很有幫助的。如果你
通過功能表操作來運行巨集,選擇工具 工具功能表下的巨集
工具 巨集,然後選中巨集名稱,這時你需要在
巨集
巨集對話方塊中點擊逐語句 逐語句按鈕,而不是運行
逐語句 運行按鈕。這使得你能夠逐語句地運行宏。如果滑
運行
鼠不在代碼視窗,你可以點擊 VBA 工具欄中的運行 運行按鈕,選中要測試的宏,然後點擊逐語
運行 逐語
句按鈕。這時相應的代碼視窗就會打開,而且被選中的宏的第一條語句會高亮顯示(黃色)。
按下功能鍵 F8(或者逐語句 逐語句按鈕,如果它可見的話)執行語句到下一行。如果你希望
逐語句
看到試算表視窗中的動作,可以縮小 VBE 視窗,直到你可以看到視窗下面的 Excel 工作表,
或者使用 Alt+Tab 組合鍵在兩個視窗之間切換,並且觀察代碼視窗中巨集的逐步執行情況。
不中斷點擊 F8(或者逐語句 逐語句按鈕)就可以逐語句地運行宏了。有一個跳出
逐語句 跳出按鈕可以跳出逐
跳出
語句執行模式。也可以使用 VBE 編輯視窗中運行 運行功能表下的重新設置
運行 重新設置選項,點擊它就可以
重新設置
跳出逐語句執行模式或調試模式。
圖 3.9 中的調試工具欄中包含逐語句逐語句按鈕、逐過程
逐語句 逐過程按鈕和跳出
逐過程 跳出按鈕,它們是用來執行宏
跳出
代碼的。一個巨集如果按逐語句的模式來運行,被稱為‘中斷點模式’。如果巨集中還調用
其他的二級副程式,那麼點擊逐過程 逐過程按鈕就會直接執行這些二級副程式,而不是跳到二級副
逐過程
程式裏面逐語句地執行了。
圖 3.9 調試工具欄,逐語句
逐語句、跳出
逐語句 跳出和重新設置
跳出 重新設置按鈕分開顯示
重新設置
為了作進一步的演示,我們先點擊本地視窗 本地視窗按鈕(調試工具欄中從右向左數第五個按鈕)
本地視窗 ,
然後再次單步執行 Factorial 宏。在新的觀測視窗中,隨著巨集代碼的一步步運行,會依次
出現變數 num、fac 和 i 的值。
另一個調試宏代碼的工具是插入中斷點,在宏代碼很長的時候它非常有用。當運行宏
時,一旦遇到中斷點就會停下來。這時運行進入中斷點模式,並且巨集可以單步執行。要想
插入一個中斷點,先找好代碼中的中斷點位置,然後點擊代碼左邊的灰色邊界,或者直接點
擊中斷點按鈕(圖 3.9 中顯示的小手)。要想去掉中斷點,只需再次點擊代碼左邊的灰色邊
界,或再次點擊中斷點按鈕。在 Factorial 宏代碼中,試著在 MsgBox 語句處加上中斷點,
然後執行宏代碼,看看能否正常執行到中斷點處。然後按一下 F8,將運行模式改為‘單步
執行’模式。(中斷點也可以用來調試函數,因為它提供了一種進入‘單步執行’模式並檢
測函數代碼執行情況的方法。)
附錄 3B 用‘相對引用’
相對引用’模式來錄製按鍵
VBA 代碼不僅可以用於編寫試算表的自動操作程式,還可以用於編寫函數,這些函數
與 Excel 內嵌函數的工作方式是一樣的。函數在進行重複自動計算時非常有用。函數計算是
‘離表(off sheet)’執行的,函數一旦編寫完畢,就可以拷貝到不同的工作簿中使用。
VBA 副程式通常執行一個或多個動作,而 VBA 函數則是由一系列指令組成的,它們返
回單個數值(如 SUM 函數)或一個陣列(如 LINEST 函數) 。用戶定義函數能將編程語句
(包括迴圈和條件選擇語句)與 Excel 函數(如 NORMSDIST 和 MMULT)結合起來。
最簡單的函數是單值輸入單值輸出函數。本章從一個簡單的單值輸入單值輸出銷售傭金
函數開始,來描述編寫和使用函數的步驟。多標量輸入函數的編寫方式與它基本相同。作為
演示,我們將編寫基於布萊克-舒爾斯期權定價公式的函數。當輸入的資訊是陣列形式而不
是單個數值時,編寫函數就顯得複雜多了。為了演示如何進行陣列處理,我們還將使用一個
用來計算一組現金流的期望及方差的例子,和一個計算資產組合方差的例子。還有一些輸入
和輸出都是陣列形式的例子。這些函數的代碼放在 VBFNS.xls 工作簿中,鼓勵讀者用這些
例子來作練習,並練習本章後面的習題。
4.1 簡單銷售傭金函數
4.3 多參數期權定價函數
Excel 至今還沒有利用布萊克-舒爾斯公式來計算期權價格的內嵌函數。因此,我們可以
編寫一個用戶定義函數來給看漲期權定價,命名為 BSCallValue。布萊克-舒爾斯公式的背
景知識將在本書的第三部分介紹。現在不必理解期權定價公式,這裏的目的只是將公式變成
VBA 代碼。
一個歐式看漲期權的布萊克-舒爾斯定價公式為:
其中, d1 和 d 2 為:
這些都是期權價格單格公式(G4 中)的輸入值:
=D4*D16*G9 – D5*D15*G12
其計算結果為 9.73。(對應的看跌期權價格顯示在單格 H4 中。)
看漲期權公式可以用一個用戶定義函數表示,它有六個輸入值( S , X , r , q, T , σ ),其
計算結果在單格 G5 中顯示。
Black-Scholes Formula:布萊克-舒爾斯公式
Call:看漲期權;Put:看跌期權;
圖 4.2 期權資訊與計算出來的布萊克-舒爾斯期權價格
函數 BSCallValue(S,X,r,q,tyr,sigma)的 VBA 代碼在下面給出。當前距期權到期日的時間表
示為 tyr(單位:年) , σ 表示為 sigma。布萊克-舒爾斯公式的計算相當複雜,因此我們在
代碼中使用了中間變數【DOne 表示 d1 ,而 NDOne 表示 N ( d1 ) 】:
Option Explicit
Function BSCallValue(S, X, r, q, tyr, sigma)
' Returns Black-Scholes Call Value (allowing for q=div yld)
Dim ert, eqt
Dim DOne, DTwo, NDOne, NDTwo
ert = Exp(-r * tyr) 'exp is the VBA function for 'e'
eqt = Exp(-q * tyr) 'dividend yield effect
DOne = (Log(S / X) + (r - q + 0.5 * sigma ^ 2) * tyr) / (sigma * Sqr(tyr))
DTwo = (Log(S / X) + (r - q - 0.5 * sigma ^ 2) * tyr) / (sigma * Sqr(tyr))
NDOne = Application.NormSDist(DOne)
NDTwo = Application.NormSDist(DTwo)
BSCallValue = (S * eqt * NDOne - X * ert * NDTwo)
End Function
表示 d1 ,NDOne 表示 N ( d1 ) ,等等,它們將代碼與期權公式中的傳統符號聯繫起來。變數
p = − S exp(− qT ) N (− d1 ) + X exp(− rT ) N (− d 2 )
成了負號,並且布萊克-舒爾斯公式中的兩項都變了號。增加一個參數 iopt(當值為 1 時計
算看漲期權價格,當值為-1 時計算看跌期權價格) ,前面計算看漲期權價格的 VBA 代碼就
可以改寫成用來計算兩種歐式期權價格,看漲期權或看跌期權。
BSOptValue 函數的代碼在下面給出,它有七個輸入變數(包括 iopt,其值為 1 或-1)。
End Function
Function BSDOne(S, X, r, q, tyr, sigma)
' Returns Black-Scholes d1 value
BSDOne = (Log(S / X) + (r - q + 0.5 * sigma ^ 2) * tyr) / (sigma * Sqr(tyr))
End Function
事實上,帶有陣列輸入或輸出的函數編碼是比較複雜的。因此,在編寫這類函數之前,
有必要先弄清楚 Excel 是如何處理陣列的。在許多實例中,大家熟悉的 Excel 函數,如
SUM,AVERAGE,STDEV,SUMPRODUCT 和 NPV,都可以用來處理陣列。而在其他情形下,
則需要一些額外的安全措施才能使函數按預想的方式執行。特別是:
在沒有合適的內嵌函數的情況下,處理陣列時,需要在一個循環體中執行重複操作。這
樣的話,就必須先計算陣列元素的個數,使用 Excel 函數 COUNT 可以很容易地得到它,
如 Application.Count(avec)。
必須清楚陣列的編號方式。沒有 Option Base 語句時,則元素從 0(缺省值)開始編號。
模組頁開頭有 Option Base 1 語句時,則陣列中的元素從 1 開始編號,就象 Excel 通常
的操作。
進行矩陣操作,如矩陣相乘時,需要先檢查一下矩陣維數的一致性。(一致性是指,如
果矩陣相乘,則前一矩陣 A 的列數必須等於後一矩陣 B 的行數。)對於任何矩陣操作,
都需要一些額外的代碼來確保矩陣的格式是正確的(行向量或列向量) 。
4.5 陣列變數的期望和方差函數
假設一項投資的未來現金流是不確定的,有五種可能結果,每結果出現的概率在圖 4.3
中的第一列顯示。計算現金流的期望值需要用每一現金流乘以它出現的概率,然後將乘積相
加,如 D 列所示。
Expected Values:期望值
採用 Excel 函數來計算,可以寫成一條簡單的公式:
SUMPRODUCT(B5:B9,A5:A9)
注意,SUMPRODUCT 函數中的兩個陣列要麼都是列向量(本表) ,要麼都是行向量。
另外,如果第二個陣列的(這裏是 A5:A9)數值之和不為 1,則公式計算出來的期望值就是
錯誤的。
在工作表中計算方差則顯得不那麼緊湊,它需要先計算每個現金流與平均值的偏離量,
再用偏離量的平方與概率相乘,然後相加,如列 E 所示。因為在函數中,對每個元素的計
算是‘離表(off sheet)’執行的,所以使用 VBA 函數來計算方差(以及計算現金流的期
望值)將更有優勢。兩個函數,WVariance 和 ExpVal,都有兩個陣列形式的輸入變數,它
們是計算期望值時需要用到的現金流陣列 vvec 和概率陣列 pvec。
ExpVal(vvec,pvec) 函 數 的 代 碼 中 主 要 調 用 了 Excel 函 數 SUM , COUNT 和
SUMPRODUCT。由於 Excel 函數為這個函數處理了所有的陣列操作,因此它的代碼很直
接。前面的 If…Then 條件語句濾除了那些期望值無法有效計算的情況,也就是,如果陣列
pvec 中的數值相加不為 1,或兩個陣列中的元素個數不相時,將函數返回-1:
Function ExpVal(vvec, pvec)
' returns expected value for 2 arrays
If Application.Sum(pvec) <> 1 Or _
Application.Count(vvec) <> Application.Count(pvec) Then
ExpVal = -1
Exit Function
ElseIf pvec.Rows.Count <> vvec.Rows.Count Then vvec =
Application.Transpose(vvec)
End If
ExpVal = Application.SumProduct(vvec, pvec)
End Function
要使 SUMPRODUCT 函數能夠正常運行,兩個陣列形式的輸入變數必須是同一類型
的,要麼都是列向量,要麼都是行向量。如果輸入變數不是同一類型的,就需要將 vvec 轉
置。
WVariance 函數的 VBA 代碼中需要處理陣列中的單個元素。模組頁開頭的聲明 Option
Base 1 確保了陣列元素是以 1 開始編號的(與缺省值 0 相反)。與 ExpVal 函數一樣,條件
語句濾除了陣列 pvec 中的數值相加不為 1,或兩個陣列中的元素個數不相等的情況:
Option Base 1
有必要為函數的用途寫一段簡要的描述,這樣在函數列表中訪問該函數時,它就會出現
對該函數的描述。在 VBE 中,保持相應的模組頁在啟動狀態。然後訪問物件流覽器,觀察
Excel 中不同物件的方法和屬性。在庫
庫中選擇當前的工作簿,並選擇函數代碼所在的模組,
然後在成員視窗
成員視窗選擇你創建的函數。點擊滑鼠右鍵,選擇選項屬性
成員視窗 屬性,這時會出現一個對話方
屬性
塊,這裏可以為你創建的函數增加一段簡單的描述。最後,點擊確定 確定按鈕來關閉對話方塊。
確定
可以通過粘貼函數
粘貼函數按鈕來訪問該函數,檢查剛才添加的描述資訊是否出現。
粘貼函數
4.6 陣列變數的組合方差函數
計算投資組合收益的均值和方差的函數是很容易編寫的。為了演示這一過程,我們用
Excel 函數寫一個工作表公式,然後將公式用 VBA 代碼完成,並產生出相應的函數。
圖 4.4 中的工作表包含有三種資產的風險和收益資訊,分別是 A、B 和 C,並顯示了等
權重時投資組合的計算結果。資產的收益資訊在單格 C5:C7 中,為列向量,在工作表公
式中可以用區域名稱 e 來引用,而在 VBA 代碼中用 retsvec 來引用。組合由三種資產組成,
權重放在單格區域 E5:E7 中,也是列向量,在工作表公式中用區域名稱 w 引用,在 VBA
代碼中用 wtsvec 來引用。
Portfolio Risk&Return:資產組合的風險和收益;
Asset Data:資產數據;Correlations:相關係數;VCV Matrix V:VCV 矩陣 V
圖 4.4 投資組合中三種資產的風險和收益
組合的期望收益(單格 G5 中)等於每種資產的期望收益乘以它們的權重然後相加(實
際上等於 0.093 或者 9.3%)。G5 中的公式 SUMPRODUCT(e,w)給出了加權收益,它使用
了區域名稱 w 和 e,這兩個列向量的元素個數是相同的。
三種資產的方差——協方差矩陣可以用相關係數矩陣(C10:E12)以及單個資產的標
準差(D5:D7)計算得到。其結果(C15:E17)矩陣的對角線上是單個資產的方差,而
其他則是兩種不同資產的協方差。假設此方差——協方差矩陣的區域名稱為 V。方差——協
方差矩陣,再加上權重陣列,構成了計算投資組合方差的基礎,計算時採用矩陣相乘的形式
編寫計算資產組合收益的函數其實很簡單,我們將這個函數取名為
PFReturn(wtsvec,retvec):
Option Base 1
第二個函數 PFVariance(wtsvec,vcvmat)的代碼則有點複雜:
Function PFVariance(wtsvec, vcvmat) 'calculates PF variance
Dim nc As Integer, nr As Integer
Dim v1 As Variant
nc = wtsvec.Columns.Count
nr = wtsvec.Rows.Count
If nc > nr Then wtsvec = Application.Transpose(wtsvec)
v1 = Application.MMult(vcvmat, wtsvec)
PFVariance = Application.SumProduct(v1, wtsvec)
End Function
4.7 輸出陣列形式的函數
前面提到的所有函數都是將返回值傳遞給單個單格(也就是標量輸出)。有時,我們希
望函數能返回一組資料,就像 LINEST 函數那樣,它為一組有 k 個解釋變數的資料集返回一
個 5×(k+1)的回歸結果陣列。一般來說,編寫帶有陣列輸出的函數是有困難的,因為它
需要正確地配置和構建陣列。另外,用戶還需要線索來為公式的輸出選擇適當大小的區域。
函數名稱可以用來暗示函數返回的是向量還是矩陣,並且,在函數列表的函數描述欄可以提
供輸出結果的維數。在代碼中,變數名和定義的變數類型可以用來暗示是否需要對單個元素
進行處理。
這種方法可以用一個計算匯總統計量的例子來演示:顯示一個資料集的百分比分佈。其
目的是用一個函數返回向量或矩陣形式的計算結果。
假設資料集由許多價格資料組成,命名為 dvec,如圖 4.5 第一列所示。注意,圖中只
顯示了 120 個資料中的 12 個資料。
如果低於某一價格的元素個數占總數的 10%,20%,30%...,則這個價格被稱為資料
集分佈的十分位元數。它們只是百分位累積分佈的一個特例。就像資料集 dvec 的均值可以
用一個 Excel 函數計算一樣,我們也可以用 PERCENTILE 函數計算出不同的百分位數。加
上 0%的十分位數(即最小價格) ,總共有 11 個十分位數值。圖 4.5 顯示了這些十分位元數
以及它們對應的百分比。在作圖時,這個 11×2 的陣列就可以用來顯示資料的累積分佈情況
了。現在,我們的目的是編寫一個函數來返回一個 11×2 的數值矩陣。
函數 DecilesMat(dvec)的代碼如下。由於我們已經知道陣列的維數,因此在定義陣
列時,可以直接給出它的維數(Dim decmat(11,2))
。第一列存放用 Excel 函數 PERCENTILE
計算出的十分位數值;而第二列存放對應的百分比,0%、10%、20%等。
Option Base 1
Function DecilesMat(dvec)
' returns 11 by 2 array of deciles ready for X-Y plot
Dim i As Integer
Dim decmat(11, 2) As Variant 'output array
For i = 0 To 10
decmat(i + 1, 1) = Application.Percentile(dvec, 0.1 * i)
decmat(i + 1, 2) = 0.1 * i
Next i
DecilesMat = decmat
End Function
4.8.2 增益集
優點:
優點:
相對於工作表計算和複雜的單格公式,函數的優點在於可以將大量的計算壓縮到一個單
格中。如果編碼正確並且函數名容易理解,用戶定義的函數可以為單個單格帶來相當強大的
功能。在單格中輸入函數比輸入複雜公式出錯的可能性要小。如果函數名和參數名都很清晰
易懂,那麼對於半熟練的用戶來說,使用它們比使用複雜的公式更容易一些。要想增強用戶
對使用函數的信心,最重要的一點是,必須對 VBA 代碼作清晰的注釋。
函數還有方便移植的優點,所有能訪問到它們的 VBA 代碼的工作簿中,都可以使用它
們。將工作簿 A 中的函數移植到工作簿 B 中的最佳辦法是:將 A 模組(如 ModuleA1)中
的代碼拷貝到 B 的模組(如 ModuleB1)中。注意,只需在 ModuleA1 中用常用的拷貝粘貼
方法將代碼複製到 ModuleB1 中即可。不需要從工程資源管理器視窗中‘導出’模組頁。為
了方便移植,最好將相關的函數放在同一個模組頁中,例如,VBFNS 工作簿的 ModuleB1
頁中包含了所有與布萊克-舒爾斯有關的函數。
函數也可以擴展(例如,為三種資產編寫的函數可以擴展到處理任何數量的資產)。為
了更加靈活方面,有些函數也可以合併起來(例如,在 BSOptValue 函數中增加一個 iopt
參數就可以同時計算看漲期權和看跌期權的價格) 。
有時,函數的存在意味著不必在工作表中建立複雜的結構。例如,如果將二叉樹的層次
作為函數的一個參數,就沒有必要為不同的層次複製二叉樹結構。 (見附錄 4B 用二叉樹方
法為期權定價的函數。)
缺點:
缺點:
有些人認為使用 VBA 編碼語言是用戶定義函數的一大缺點。但需要強調的是,編寫函
數只需要熟悉 VBA 的一個小子集。編程所需的句法和控制語句本質上是程式設計的基礎。
這是傳統的編程語言而不是 VBA 語言面向物件部分的內容。
函數不可能完成的任務
有些操作不能寫成函數。在 VBA 中重寫程式列代碼,或者插入臨時的空工作表,或者
使用規劃求解來求解最優化問題,這些都不能寫成函數的形式。同樣,有些操作,如建立圖
表,或根據某些值改變單格的顏色等,都不易用函數來實現。
本章附錄 4A 用 Excel 矩陣函數演示了運算元組的一些方法。附錄 4B 介紹用二叉樹方
法為期權定價的函數。本章的最後是一些編寫函數的簡單練習,及簡要答案。
小結
附錄 4A 演示函數如何處理陣列
如果向量轉置成行向量,它可以‘左乘以’矩陣 Amat1,但結果將是不同的,實際上,
結果是一個 1×3 的行向量。第三行應該改成:
ArrayDemo2 = Application.MMult(Application.Transpose(avec),Amat1)
另外,如果倒數第二行的代碼改為:
ArrayDemo4 = Application.MMult(,Amat1,Application.Transpose(avec))
則會執行一個不同的矩陣相乘運算,並返回一個不同值的列向量。
模組頁開頭的 Option Base 1 語句確保陣列元素從 1 開始編號,就像 Excel 平常操作的
那樣。如果 Option Base 語句被忽略,則陣列元素從 0 開始編號(缺省情況) (那麼接下來
的矩陣相乘會由於維數不一致而失敗) 。這裏,Option Base 語句確保陣列 avec 中的元素只
有三個:avec(1)、avec(2)和 avec(3),而沒有元素 avec(0)。
當 Excel 中沒有合適的陣列函數來滿足陣列操作的需要時,那麼,在一個循環體內對陣
列中的每一個元素進行處理就變得不可避免了。這樣,必須先計算出陣列的元素個數,我們
使用 Application.Count(avec) 。
(對於用戶定義函數自身創建的陣列,元素個數可以用陣列
的 UBound(和 LBound)計算得到。)
附錄 4B 二叉樹期權定價函數
布萊克-舒爾斯公式給出了歐式看漲期權和看跌期權的價格。另外一種期權定價的替代
方法是二叉樹方法,它可以用於更廣泛的期權定價。這種方法在期權生存期內使用一系列概
率驅動的二叉分支(股票價格只有以確定的數量向上和向下運動兩種方式)來近似股票價格
的變動。這個二叉樹結構產生了一個股票價格樹,價格樹有一組的終端價格和一簇價格運動
路徑。對於樹的每一個節點,股票期權的價格都可以計算出來,並且使用樹的概率結構,期
權的收益可以通過折現來得到它的現值。
p* ,稱為考克斯,羅斯和魯賓斯坦(CRR)參數。參數的計算公式能夠保證股票的價格樹
與一個幾何擴散過程一致,該過程可以認為是股票價格運動的真實過程。關於 u、d、p 和 p*
的公式這裏不必考慮,這些公式用於計算起始價格以及所有九期價格時,會生成圖 4.7 所示
的股票價格樹。
或者對於 n 級樹:
Sin = Su i d n −i
這使得到期日的期權有 10 種收益,如圖 4.8 中的單格區域 K49:K58 所示,它們可以用
下面的公式計算得到:
例如,對於就此向上運動的股票,期權價格為:
圖 4.8 倒推並折現期權價格
接下來的五行代碼沿著樹形結構向後倒推、計算價格並折現:
For j = nstep - 1 To 0 Step -1
For i = 0 To j
vvec(i) = (P * vvec(i + 1) + pstar * vvec(i)) / erdt
Next i
Next j
則合併後的整個二叉樹定價函數代碼如下,它可以用來計算歐式期權以及美式期權的價
格:
Function BinOptVal(iopt, iea, S, X, r, q, tyr, sigma, nstep)
' Returns Binomial Option Value (iopt = 1 for call, -1 for put;
' iea=1 for euro, 2 for amer)
BinOptVal = vvec(0)
End Function
前面計算出來的歐式看跌期權價格為 2.40,而採用九期二叉樹計算出來的美式看跌期
權的價格為 2.54。
編寫函數練習
1. 金融算術函數
編寫如下簡單金融計算函數:
i. FutrueValue(P,r,n,t),該函數返回投資 P 在 t 年後的未來價值,假設收益年利率為
r,一年計算 n 次複利。
ii. AnnPercentRate(rf,f)函數,該函數返回年利率為 rf,一年計算 f 次複利的實際利率。
iii. APRCont(r)函數,該函數返回連續複利為 r 的實際年利率。
2. 和與積和函數
編寫一個求和函數,該函數的功能與 Excel 函數 SUM 相同,用來將一個陣列中的數值
加總。
編寫一個求積和函數,模仿 Excel 函數 SUMPRODUCT(array1,array2),它用來計算兩
個陣列的元素乘積之和。在兩個陣列大小不一致時,返回錯誤資訊。
3. 淨現值函數
編寫一個函數 NetPV(cvec,rate),功能與 Excel 函數 NPV 相同,該函數需要兩個參數,
第一個參數是現金流陣列,第二個參數是折現率。
4. 現金流標準差函數
編寫一個函數,用來計算不同權重(pvec)的一組現金流(vvec)的標準差,如 4.5
節中討論的那樣。記住,要使用 VBA 的內嵌函數 Sqr,而不能使用 Excel 函數。
5. 回收期函數
工作表中顯示了一項投資計畫在未來五年的現金流。現金流初值是負的,而在第三年
裏,累積現金流變為正號,這個時刻被稱為工程的回收期(在這裏是 2.4 年) 。
決定回收期的中間計算已顯示在表中。其重點在於計算每年的累積現金流,以及判斷累
積現金流首次變為正數的時刻。編寫一個回收期函數 PayBack(cvec),它返回任何現金流陣
列的回收期。
【參照書中第 95 頁的圖】
練習答案
1. 金融算術函數代碼
Function FutureValue(P, r, n, t)
'returns future value of P, compounded at annual rate r,
'n times a year, for t years
FutureValue = P * (1 + r / n) ^ (n * t)
End Function
Function AnnPercentRate(rf, f)
'returns annual effective rate of compounding at rate rf, f times p.a.
Dim APR
APR = (1 + rf) ^ f - 1
AnnPercentRate = APR
End Function
Function APRCont(r)
'returns annual effective rate of compounding continuously at rate r p.a.
APRCont = Exp(r) - 1
End Function
2. 和與積和函數代碼
陣列求和:
Option Base 1
Function SumArray(avec)
'VBA version of Excel's SUM function
Dim n As Integer: Dim i As Integer
Dim total
n = Application.Count(avec) 'counts all elements in array
total = 0
For i = 1 To n
total = total + avec(i)
Next i
SumArray = total
End Function
陣列求積和:
Option Base 1
ProdArray = ProdArray
End Function
3. 淨現值函數代碼
Option Base 1
4. 現金流標準差函數代碼
Option Base 1
End Function
5. 回收期函數代碼
函數代碼如下,注意用粗體顯示的三個特點。
第一,陣列 cvec 中的元素要求必須是數值。這裏,Option Base 1 語句確保陣列 cvec
中的元素從 1 開始編號,cvec 中的元素可以用 cvec(1)、cvec(2)引用,最後一個元素 cvec(6)
的值為 60。陣列中沒有元素 cvec(0)。
第二,在函數開頭,用 If…Then…Else 語句濾除了那些導致回收期無法計算的情況,
這使得函數更加穩健(Robust)。(例如,如果第一個現金流為正,cvec(1)>=0,或者整個
現金流的累積值為負,Application.Sum(cvec)<0,則函數返回-1)。
第三點,陣列 cvec 中的元素是逐個處理的,每個現金流被一一加總來得到累積現金流,
並用變數 csum 表示。這種操作在一個 For…Next 循環體中進行,在循環體中,隨著 i 的不
斷增加直到最大值(Application.Count(cvec))
,單個現金流也被一一加總。當變數 csum 變
為正的時候,程式跳出 For…Next 循環體(Exit For)並計算回收期。
需要關注一下到底是哪一個現金流導致累積現金流由負變正的。在這個例子中,當 i=4
時,csum 從-20 變為+35,csum 的最後一個負值-20 出現在第 2 年底。因此,確切的回收
期就是 2 年加上分數 20/55,也就是 2.4 年。
Function PayBack(cvec)
' calculates payback period (no. of years to 1 d.pl)
' initial cashflow must be negative
Dim csum
Dim i As Integer
If cvec(1) >= 0 Or Application.Sum(cvec) < 0 Then
PayBack = -1
Else
csum = 0
For i = 1 To Application.Count(cvec)
csum = csum + cvec(i)
If csum > 0 Then
Exit For
End If
Next i
csum = csum - cvec(i)
PayBack = Application.Round(i - 2 - csum / cvec(i), 1)
End If
End Function
第 5 章 股票的有關簡介
本書的第二部分主要介紹股票方面的相關內容。以下三章將分別介紹幾個不同的主題:
第 6 章介紹投資組合的最優化,第 7 章主要涉及資產定價,第 8 章則主要研究如何進行業
績評價。本章作為第二部分的簡介,扼要地總結了在本書的股票部分所涉及的相關金融理
論,以及在試算表中用到的定量數學方法。
在二十世紀五十年代,哈裏·馬可維茨創立了投資組合的均值-方差理論。從此以後,
金融學開始從經濟學中分離出來,成為一門新的學科。但它與經濟學仍有很大的聯繫。馬可
維茨指出,單只股票的自身風險與它對投資組合整體風險的貢獻是有很大區別的。投資組合
均值—方差理論的一個重要特點是,它認為收益和風險的關係與均值和方差的關係是一致
的。在收益服從正態分佈的假設條件下,金融理論可以用許多經典的統計分析方法來研究。
隨後,在二十世紀六十年代創立了資本資產定價模型 CAPM。它是股票期望收益的單因素
模型,其中引入的β值是衡量投資組合風險的重要指標。在 CAPM 模型的基礎上,又提出
了許多評價投資組合業績的方法。此後,對 CAPM 模型的研究主要集中在資產收益的多因
數模型上,其中最新的成果就是夏普于九十年代初提出的風格分析(Style Analysis) 。下面
三章將要介紹的內容包括:風險和收益的表示方法,投資組合的風險和收益,有效邊界理論,
單因素模型,CAPM,傳統的資產業績評價方法,風格分析,以及風險值 VaR。
本書的第二部分,首先按年代順序介紹了股票投資組合管理方法的發展狀況,然後以三
個相關的工作簿(EQUITY1.xls,EQUITY2.xls 和 EQUITY3.xls)為基礎,演示了不同金融
領域中反復出現的一些重要思想。投資組合理論經常由於計算能力的不足而受到制約。到了
今天,在 Excel 和高性能電腦的幫助下,這方面的制約已經基本不存在了(儘管有些應用只
涉及到少量的資產,而不是上千種股票) 。
以下三章中用到的最主要計算方法是一種最優化方法,即‘二次規劃’。這種方法可以
用 Excel 的規劃求解插件來實現。本文將介紹如何構建各種不同的投資組合最優化問題,並
正確地使用規劃求解來得到每種資產在整個組合中的最優權重。為了方便在第 6 章推導有
效邊界和在第 8 章進行風格分析,本文將對二次規劃的相關計算原理和應用進行反復說明。
在股票部分的研究中,經常用到的第二種方法是回歸方法。第 7 章將介紹如何用 Excel 中的
回歸功能來估計 CAPM 模型中的β係數。一般來講,用來估計資產風險和收益的許多計算,
都可以用 Excel 的統計計算功能來實現。第 6 章和第 8 章中還介紹了如何應用 VBA 宏來自
動調用規劃求解,從而更方便有效地生成各種圖表。
三個工作簿(EQUITY1.xls,EQUITY2.xls 和 EQUITY3.xls)中均包括需要用二次規劃
來解決的最優化問題,它們是:投資組合風險(邊界組合) ,殘差平方和(β估計值)和誤
差方差(風格分析) 。雖然有些簡單的問題可能有解析解,但作為一個基本方法,最優化問
題通常是通過一個反復迭代的尋找過程來找到最優解。在 Excel 中,這個尋找過程是由規劃
求解插件來實現的。規劃求解的使用方法將在 EQUITY1.xls 中的 EF2 表和 EQUITY3.xls 的
Style 表中進行詳細介紹。
本部分的股票建模技術不僅對股票本身具有重要意義,而且也為本書的第三部分(股票
期權估價)作了鋪墊。
第 6 章 投資組合最優化
本章研究個體投資者如何解決投資組合的最優化問題。所需的背景知識和許多實例可參
考 Bodie et al 的著作(1996,第六章和第七章)
。這裏,將集中討論如何利用試算表來進行
相關計算,並進一步研究常見的組合問題類型。在確定各類風險資產的權重時,主要使用了
Excel 裏的規劃求解,而對於常見的組合問題,還需要分析資金應如何分配在無風險資產和
風險資產上,此時更傾向於使用根據試算表相關公式設計出來的用戶定義函數。第 6.1 和
6.2 節主要介紹有關風險資產組合的預備知識。第 6.3 到 6.5 節集中介紹如何確定投資組合
中各類資產的最優權重。第 6.6 節介紹風險厭惡的概念以及如何權衡風險與收益。接下來的
第 6.7 節到 6.9 節,主要介紹如何使用試算表來解決常見的組合問題。在本章的練習部分還
詳細介紹了為分析投資組合而設計的用戶定義函數和巨集,見 EQUITY1.xls。
6.1 組合的均值和方差
所有的金融教科書都對投資組合的均值—方差模型進行過詳盡的描述和解釋(如 Bodie
。馬可維茨的工作大大簡化了投資
et al,1996,第七章介紹了風險投資組合的最優化問題)
組合的最優化問題。他指出,在最優化過程中,應該先找到均值-方差的有效投資組合,這
些組合就是那些在給定風險水準的情況下期望收益最高的有效點。這裏,風險用投資組合的
方差來度量(更嚴格地講,應該是方差平方根,即投資組合收益的標準差)。在對一組資產
建立組合分析模型時,應主要考慮以下兩點:
1) 投資組合收益的均值和方差;
2) 用風險-收益空間上的座標點來表示的投資組合;
在本文的研究中,自始至終都假設投資組合處於完全投資狀態,即對權重加上約束條
件——所有資產的投資權重之和必須為 100%。
給定一組風險資產及其相應權重,就可以確定一個投資組合。對於 n 種風險資產,有
如下的一般公式:
投資組合收益: E ( rp ) = ∑ w E (r )
i i
投資組合方差: Var ( rp ) = σ p =
2
∑∑ w w
i j cov(i, j ) ,其中 cov(i, i ) = σ i 2
其中 E(ri)代表第 i 種資產的期望收益,σi 代表第 i 種資產的風險(其收益的標準差)。
而元素 cov(i,j)則組成了通常所說的資產收益方差—協方差矩陣。從上面的公式可以看出,
組合的方差是組合中各資產權重的二次函數。投資組合的風險用它的標準差來度量。
在使用試算表時,採用那些便於輸入的投資組合收益和方差運算式會很有好處。鑒於上
面列出的求和公式非常不方便輸入到表格中,這裏採用兩種可供選擇的方法:(i)以 Excel
向量和矩陣乘法為基礎的單格公式; (ii)工作表中的用戶定義函數。
首先來看單格的計算公式,如果期望收益和投資組合的權重都用列向量形式來表示(分
別用 e 和 w 表示,行向量則對列向量進行轉置,即 eT 和 wT),方差—協方差用矩陣 V 表示,
那麼原來的公式就可以改寫成如下所示的簡單矩陣公式。Excel 陣列函數可以很容易地計算
出這些公式的結果。
矩陣表示 用 Excel 公式表示
投資組合收益: wT e = SUMPRODUCT ( w, e)
圖 6.1 計算包括三種資產投資組合的風險和收益
計算中使用的輸入資料包括這三種資產收益的方差—協方差矩陣。矩陣的元素由資產收
益之間的相關係數(單格 C10:E12)和標準差(D5:D7)計算得到。注意,圖 6.1 中求方差—
協方差矩陣中每個元素的一般公式如下:
圖 6.2 投資組合的風險-收益表示
在接下來的幾節中,將從確定有效邊界上的單個點入手,進而得到整個邊界。然後將對
投資者所持有的單個資產權重加上約束條件(這將會把整個投資組合的收益限制在一個較小
的範圍內),並計算出那些有約束邊界上的點。注意,可以肯定的是,有約束邊界上的點總
是在無約束邊界上或在其右側,儘管由於圖的大小有限,我們不能在圖上清楚地看到這一點。
如果單個資產的權重沒有額外的約束條件,我們可以通過黃和利曾伯格給出的公式
(1988,第 6.4 節)來得到有效投資組合。但由於用規劃求解來得到有效組合比較容易解
釋,所以,接下來將首先介紹這種方法,然後將其擴展到單個資產權重有約束的情況。最後
介紹得到整個有效邊界的方法。
6.3 用規劃求解得到有效點
Eppeb et al(1998)已明確指出了具有什麼樣代數結構的問題可以用二次規劃來解決,
以及如何用 Excel 的規劃求解解決這些問題。因此,這裏將在圖 6.3 的基礎上,簡明扼要地
解釋如何使用規劃求解來解決這個投資組合問題。注意圖中的區域名稱,如 I11:I12 為
change1,I15 為 portret1,等等。
在用規劃求解進行計算時,需要輸入可變單格 可變單格、作為最小化前提的目標單格
可變單格 目標單格和規範的約
目標單格 約
束條件。這些約束條件用來控制可變單格的取值範圍。注意,要滿足完全投資情況下的約束
束條件
條件,只需在單格 I10 中輸入下面的公式即可:
圖 6.4 用規劃求解實現方差最小化
到現在為止,我們用最小化投資組合風險的方法得到了最優投資組合權重。同樣,我們
可以通過在某一給定風險水準下最大化投資組合收益的方法來確定投資組合的權重。這對使
用規劃求解來說好像是不同的問題,但用這種方法得到的最優權重,與前面最小化方差方法
得到的有效邊界投資組合的最優權重是一致的。
6.4 求有效邊界(
求有效邊界(黃和利曾伯格的方法)
黃和利曾伯格的方法)
對單個資產的權重不加任何限制時,有效邊界可以用數學方法推導出來。雖然一些更高
級的教科書(例如愛爾頓和格魯伯,1995) ,是通過反復迭代去求解一組聯立方程來得到有
效邊界,但有一種更加簡潔有效的方法。黃和利曾伯格(以下簡稱 HL)給出了如何找到有
效邊界上的兩個點,並在這兩個點的基礎上得到整個邊界(直接應用布萊克的結論) 。本節
將利用他們給出的代數方法,計算時會用矩陣加以解釋,並推廣到投資組合有多種(多於三
種)可選擇資產的情況。下面將介紹如何使用 Excel 的陣列函數在試算表中求出有效邊界。
本節涉及的內容難度較大,初學者可以暫時略過,在完全理解本章後面的章節之後再來學習
本節。
圖 6.6 中的表 EF1HL 很清楚地定義了區域名稱,使得單格中的公式更加容易理解。期
望收益向量(C5:C7)被命名為 e,權重向量(I5:I7)為 w,A24:A26 所表示的向量命名為
u。C15:E17 所代表的方差-協方差矩陣命名為 V。如同前面解釋的那樣,投資組合的方差
可以寫成矩陣乘積 wTVw 的形式,結果放在單格 I11 中。
用 HL 法尋找有效組合時,需要知道方差-協方差矩陣的逆,這裏記為 V-1。Excel 中專
門用來進行矩陣求逆的函數是 MINVERSE。在使用陣列函數時,需要在表中一個 3×3 的區
域 H15:J17 中輸入公式:
圖 6.6 用黃和利曾伯格的方法直接得到解析解
g = [ Bm − AI ] D h = [CI − Am] D
在輸入計算 g 的公式時,需要先選擇一個 3×1 的列向量區域,因為這是一個陣列公式。
輸入計算 h 的公式時與 g 類似。圖 6.6 中的單格 I24:I26 和 K24:K26 給出了這兩個邊界組合
的權重。
於是向量 g(124%,-20.5%,-3.5%)給出了國庫券、債券和股票的權重,這些權
重確定了有效邊界上期望收益為 0%的投資組合。同樣,向量 g+h 給出了另一組國庫券、債
券和股票的權重,這些權重確定了有效邊界上期望收益為 100%的投資組合。把上面得到的
向量 g 和 h 進行線性組合 g+h*T,可以得到有效邊界上給定期望收益為 T 的投資組合權重。
例如,從圖 6.6 的 33 到 38 行可以看出,期望收益為 7%的投資組合中包含-5.6%的國庫券、
35.8%的債券和 69.8%的股票(單格 D36:D38)。也就是說,為構造期望收益為 7%的最小
風險投資組合,需要買進債券和股票,同時賣空國庫券。這些用 HL 方法得到的結果與圖
6.5 中在沒有其他權重約束情況下用規劃求解得到的結果是一致的。
邊界上的其他點可以用陣列函數 g+h*T 計算得到,其中 T 是該點的期望收益。用這種
方法可以得到整個有效邊界。例如,在 Excel 中,一個模擬運算表可以將一系列期望收益(從
0%到 10%)作為輸入,計算出相應的投資組合風險和收益,然後可以在此表的基礎上畫出
一個 XY(散點)圖。在圖 6.2 中可以看到,用‘無約束邊界’標記的所有點都來自於上述
的模擬運算表。
顯然,在試算表中為得到兩個有效組合權重所進行的計算非常複雜。這就是我們採用
VCA 用戶定義函數來簡化公式輸入的原因。第 6.10 節將演示黃和利曾伯格的計算是如何通
過編程來實現的。HLPortfolioWeights 函數有四個重要變數:expret,retvec,vcvmat 和 rf
(這裏是-1)。expret 是該有效邊界組合的期望收益,retvec 是期望收益向量,而 vcvmat
是方差-協方差矩陣。該函數可以得到投資組合的權重。在圖 6.6 中,用此用戶定義函數得
到的權重放在單格 E36:E38 中。
6.5 有約束邊界組合
如果給單個資產的權重加上一些約束條件(例如權重必須非負),此時解析方法就不再
適用了。但是,使用規劃求解仍可以得到最優權重。為了與前面的情況區別開來,這裏把這
種情況下得到的投資組合叫做‘有約束’邊界組合。圖 6.7 展示了從表 EF2 中摘錄的部分
資訊,從表中可以看出,可能的組合權重放在單格 H8:J8 中(命名為 portwts2)
,其上面一
行是所能允許的最小權重,下面一行則列出了所能允許的最大權重(分別命名為 portmin2
和 portmax2)
。用規劃求解可以解決上述約束條件下的邊界組合問題,具體的操作如圖 6.8
所示。
圖 6.8 權重有約束時的規劃求解操作過程
圖 6.9 有約束邊界組合的權重
U = E ( rp ) − 0.5 Aσ p 2
其中,投資者的風險厭惡係數 A 的值越大,由投資風險帶來的、需要從投資預期收益
中減去的懲罰項就越大。實驗表明,A 的值通常在 2 到 4 之間。下面的研究中,我們選擇了
A=3。
既然接下來的幾節都是研究兩種資產的情況,因此在此處把 6.1 節給出的投資組合收益
和風險的一般公式修改為只涉及兩種資產的情況:
投資組合收益: E ( rp ) = w1 E ( r1 ) + w2 E ( r2 )
三類常見組合問題中的第一個,是指由一種無風險資產(asset0)和一種風險資產
(asset1)組成的組合,收益不相關。圖 6.10 給出了這兩種資產的具體情況:無風險利率
是 1%,asset1 的風險和收益狀況與前面幾節所研究的投資組合中的債券是一樣的。我們把
投資於 asset1 的資金比例(單格 H14)從 0%變化到 100%,這就得到風險收益圖上連接代
表 asset0 的點到代表 asset1 的點的一條直線。圖 6.11 上標明了這條直線。
Generic Portfolio Problems:常見組合問題;
Problem One:risk-free asset and 1 risky asset:
問題一:無風險資產和一種風險資產的組合
Asset Data:資產數據;
Corr Matrix:相關係數矩陣;
VCV Matrix:VCV 矩陣;
Risk aversion coefficient:風險厭惡係數;
Optimal Portfolio:最優組合
Problem One:問題一;
Portfolio return:組合收益;
Portfolio risk(standard deviation):組合風險(標準差);
Portfolio utility:組合效用
圖 6.11 問題一中效用、收益與風險的關係圖
個體投資者將會根據他們的風險厭惡係數(單格 K6 中)在直線上選擇一個特定的、符
合自己要求的點。圖 6.11 還給出了假定風險厭惡係數為 3 時投資者的效用曲線,上面不同
點所代表的投資組合中 asset1 的比例是不同的(圖上表示為一系列離散點,其縱軸刻度在
圖的右邊) 。效用值從 0.01(所有資金都投資於 asset0)開始,隨著投資於 asset1 的資金
比例增加而平穩增加到最優點,接著開始減少到 0.006(所有資金都投資於 asset1)。
直線上的最優點就是效用最大點。可以通過下面的公式計算出 asset1 的權重(列在單
格 H14 中),得出最優點:
w1* = E (r1 ) − rf Aσ 12
在這個例子中,最優投資組合中包括 36%(35.9%)的風險資產投資,總效用是 0.012
(也就是說,等於該投資者獲得大小為 1.2%的確定性等價收益時所得到的效用) 。同樣可以
設計一個名為 Prob1OptimalRiskyWeight 的用戶定義函數,以此來求出權重(單格 H15)。
這將在 6.11 節中進行介紹。
注意,最優投資組合中風險資產的比例(與 asset0 投資比例的變動情況相反-因為二者
之和為 1)是由投資者的風險厭惡程度決定的。一個風險厭惡係數更大(例如 4)的投資者
將會把其最優投資組合中的風險資產比例減少到 27%。
6.8 問題二 存在兩種風險資產的組合
在問題二中,存在兩個風險資產。在後面的分析中,假設這兩種資產的情況分別與前
面例子中給出的債券和股票相同,則它們的收益存在微弱的正相關關係。具體的資料列在圖
6.12 中,其中單格 D25 給出了相關係數 0.23。
Problem Two:問題二;
Portfolio return:組合收益;
Portfolio risk(standard deviation):組合風險(標準差);
Portfolio utility:組合效用
圖 6.13 問題二中效用、收益與風險的關係圖
常見組合問題中的最後一個問題研究一個無風險資產和一個風險投資組合的情況。通
常分兩步解決。首先計算風險投資組合中各種風險資產的最優權重(問題二的特殊情況) 。
其次確定投資如何在無風險資產和最優風險投資組合之間分配(實質上是問題一) 。圖 6.14
給出了詳細的計算過程。
首先,在不考慮無風險資產的情況下,確定投資如何在 asset1 和 asset2 之間達到最優
分配。前面一節給出了只考慮風險資產時兩種資產的最優分配比例大約為 35%:65%。假設
最優風險投資組合(此處記為 R)的預期收益為 E(rR)、標準差為σR,其中 asset1 的權重
為 F1。在第二步引入無風險資產後,我們需要確定合適的 F1 使投資組合 R 的收益-風險比
率最大,也就是說,選擇合適的 F1 使下式達到最大:
E (rR ) − rf σ R
圖 6.15 問題三中效用、收益與風險的關係圖
現在,在某種意義上,從問題三到下一章推導出資本資產定價模型只需要再前進很小
的一步,最主要的難點將是如何將所有個體投資者的信心匯總,從而給出資產定價理論。
6.12 模組 M 中的巨集功能
本節將介紹可以求出有效邊界(前面的幾節中是用規劃求解求出的)的宏。規劃求解
是 Excel 的一個插件,在安裝之後才會出現在工具 工具功能表中。另外,為了在
工具 VBA 中使用規
劃求解功能,這個模組需要使用 Solver.Xla 插件。
Sub Efffrontier1()
SolverReset
Call SolverAdd(Range(“portret1”), 2, Range(“target1”))
Call SolverOk(Range(“portsd1”), 2, 0, Range(“change1”))
Call SolverSolve(True)
SolverFinish
End Sub
Efffrontier1 宏包含對規劃求解的一個簡單應用。SolverAdd 函數加上了必須的簡單約束
(數值 2 表示了這個等價約束) ,接著用 SolverOk 函數提出了要解決的問題(這裏的數值 2
說明要進行最小化)。SolverSolve 函數用來解決這個問題(參數 True 的作用是隱藏結果
屏),程式結尾部分的 SolverFinish 函數得到問題的答案並顯示在工作表中。
嚴格的說,程式中的 Call 並不是必需的,但是我們建議,在程式中使用了需要參數的
副程式時,最好使用 Call。在使用這個語句時,參數必須用括弧括起來。
Efffrontier2 宏相當複雜,這是因為它在一個迴圈中反復使用了規劃求解功能,最後得
到了整個有效邊界。迴圈的次數需要預先確定。最重要的是,在迴圈中我們要使用儘量少的
程式。規劃求解問題是在迴圈外建立的,在迴圈中需要使用 SolverChange 函數改變約束條
件等式的右端(目標預期收益) 。迴圈中,每次規劃求解迭代運算的結果將會用 PasteSpecial
命令複製到工作表的一個特定區域。下面就是該迴圈的程式:
Do While iter <= niter
Call SolverSolve(true)
SolverFinish
Range(“portwts2”).copy
Range(“effwts2”).Offset(iter, 0).PasteSpecial Paste:=xlValues
Range(“priter2”) = Range(“priter2”).Value + pradd
’amend portret constraint in Solver
Call SolverChange(Range(“portret2”), 2, Range(“priter2”))
iter = iter + 1
Loop
在這個巨集的開始部分用了兩次規劃求解:第一次是計算在給定的約束下可以得到的
投資組合最小收益(用 SolverOk 函數中給出的數值 2 表示) ;第二次是計算最大收益(用
SolverOk 函數中給出的數值 1 表示) 。在這個收益範圍內將選取若干個預先確定數目的目標
收益,針對每個不同的收益求出並儲存其相應的邊界組合權重。
SolverReset
’first calculate portfolio min return given constraints
Call SolverAdd(Range(“portwts2”), 3, Range(“portmin2”))
Call SolverAdd(Range(“portwts2”), 1, Range(“portmax2”))
Call SolverOk(Range(“portret2”), 2, 0, Range(“change2”))
Call SolverSolve(True)
SolverFinish
prmin = Range(“portret2”).Value
’then calculate portfolio max return given constraints
Call SolverOk(Range(“portret2”), 1, 0, Range(“change2”))
Call SolverSolve(True)
SolverFinish
小結
馬可維茨創建的投資組合最優化理論是本書整個股票部分的理論基礎。本節介紹了使用
Excel 的陣列函數功能,很容易把兩種資產投資組合均值和方差的基本計算公式推廣到多種
資產的情況。由於陣列函數可以實現矩陣乘法和矩陣求逆,我們可以用 Excel 求出黃和利曾
伯格的解析解,從而得到有效邊界。上述步驟可以通過用 Excel 工作表直接計算或用戶定義
函數的方式實現。
雖然上述理論很重要,但實際應用時需要諸如規劃求解之類的工具進行計算。本節證明
了在無約束情況下用規劃求解得到的解與 HL 的解析解是一致的,同時也給出了在單個資產
權重有約束的情況下如何使用規劃求解得到正確解答。另外,本節還介紹了在用工作表直接
計算和用宏時,如何使用規劃求解工具。
下一章我們將介紹金融理論的另一個重要發展-資本資產定價模型和模型中β值的作
用。接下來,我們將在股票收益服從對數正態分佈的假設下預測單個股票和投資組合的未來
價值和風險值。
參考文獻
Bodie, Z., A. Kane and A. J. Marcus, 1996,Investments, 3rd Edition, Richard E. Irwin,
Englewood Cliffs, NJ.
Elton, E. J. and M. J. Gruber, 1995, Modern Portfolio Theory and Investment Analysis,
John Wiley & Sons, Chichester.
Eppen, G. D., F. J. Gould, C. P. Schmidt, J. H. Moore and L. R. Weatherford, 1998,
Introductory Management Science, Decision Modeling with Spreadsheets, 5th edition,
Prentice Hall, New Jersey.
Huang, C. and R. Litzenberger, 1988, Foundations for Financial Economics, North
Holland, New York.
Taggart,R. A., 1996, Quantitative Analysis for Investment Management, Prentice Hall,
New Jersey.
第 7 章 資產定價
本章的研究將從單個投資者(微觀角度)轉移到包括多種資產的整個市場,並且觀察所
有投資者的行為(宏觀角度)。其中最主要的區別是我們原來描述的是個體行為,而現在我
們要把所有投資者作為一個整體來考慮,總結他們的行為。只有這樣,才能研究對金融資產
的定價。資本資產定價模型(CAPM)是在 60 年代由金融學院派發展起來的。其基礎是第
6 章介紹的投資組合均值-方差分析。其中一條重要的結論是:市場價格只反映了投資組合
的一部分風險。市場價格所反映的那部分風險是與市場表現相關,通常由β值來度量。在
Bodie et al.(1996)著作的第八章中詳細討論了 CAPM 的有關背景知識。
本章一開始就引入了單因素模型,並且解釋了如何計算相關風險,其中需要特別注意的
是β值和單個資產收益之間的方差—協方差矩陣是如何估計的。本章用到的核心數學方法就
是回歸,它主要用於估計單個資產的β值。一個資產的β值度量了該資產的收益與整個市場
收益的相關性。資產的β值是描述資產收益與市場相關性的唯一工具。但是,在單因素模型
中,協方差也是很容易計算的。工作簿 EQUITY2.xls 中展示了估計過程是如何實現的,其
中還包括許多為了減少計算量而編寫的用戶定義函數。
上一章,我們在用效用函數刻畫單個投資者偏好的假設下,推導出馬可維茨的均值-方
差模型。分析中並沒有考慮資產收益分佈。同樣,可以在忽略投資者偏好而假設資產收益服
從對數正態分佈的條件下,通過均值-方差模型得到與前面完全相同的理論結果。
在假設收益對數服從正態分佈的條件下,可以得到水準財富(horizon wealth)預測值
和風險值的解析解。本章同時給出了使用上述技巧的實例。在某種意義上,我們接受馬可維
茨關於收益和風險可以與正態分佈的均值和方差聯繫起來的觀點,於是我們可以借用統計學
的一些已有結論。另外,為了更容易實現在資產收益的正態和對數正態形式之間進行反復轉
換,我們對刻畫兩種分佈聯繫的有關理論進行實例解釋。
7.1 單因素模型
單因素模型為推導資產定價模型時更好地理解收益和風險有很大幫助。模型假設股票 i
的收益和指數 I 的收益之間存在一種線性關係。分別用 Ri 和 RI 表示股票 i 和指數 I 的超額收
益(即超過無風險收益的部分)時,模型可以寫成:
Ri = α i + β i RI + ei
其中αi 和βi 是模型的參數,於是股票收益可以分為兩部分:系統部分(αi+βiRI)和
殘差部分 ei。系統部分的αi 是指數 I 超額收益為 0 時的股票收益,而βiRI 則是與指數密切
相關的部分。於是,βi 度量了股票對指數運動所作出的反應。收益 ei 與指數無關,僅僅是
股票 i 所特有的。通常假設 ei 是一個隨機誤差項,其數學期望為 0,即 E(ei)=0,所以股票
i 的預期超額收益為:
E ( Ri ) = α i + βi E ( RI )
如果指數是一個市場指數(例如英國的 FTSE100 指數和美國的 S&P500 指數),此時
收益的系統部分就是‘與市場相關的’,殘差部分就是‘公司特有的’。參數β就度量了股
票相對市場的敏感性。
用股票和指數的超額收益(例如用 60 個月的收益資料)資料可以估計回歸參數αi 和β
2
i。同樣可以得到殘差方差σ(ei) 的估計值。
單因素模型同樣可以用來分解風險(為了與第六章保持一致,風險用方差來表示)。股
票 i 收益的方差可以分解為兩部分:第一部分反映系統風險,第二部分反映該股票特有的風
險:
Var ( Ri ) = σ i 2 = β i 2σ I 2 + σ ( ei )
2
此結論極大簡化了為得到方差-協方差矩陣所作的計算,具體計算過程將在第 7.4 節中
介紹。
7.2 估計β
估計β係數
Excel 提 供 了 許 多 可 以 用 來 估 計 斜 率 值 的 方 法 。 單 格 I7 中 的 公 式 =
SLOPE(B6:B65,C6:C65)採用了 Excel 的 SLOPE 函數來估計斜率βi。類似地,單格 I6 中
的 INTERCEPT 函數計算了回歸方程中的截據項α。在方程中代入α i i 和βi 的估計值可以得
到:
‘擬合(Fitted)收益’=-0.0013+1.5065×指數收益
E 列和 F 列分別給出了在每一個指數收益下得到的‘擬合(fitted)’股票收益和‘殘
差’(即實際收益減去‘擬合’股票收益的差)。殘差的大小是由殘差標準誤差(單格 I9)
度量的。殘差標準誤差可以通過另外一個 Excel 函數 STEYX(它與 SLOPE 函數的輸入是
相同的)得到。圖 7.2 為股票收益和指數收益的散點圖及相應的回歸直線。實際收益偏離這
條直線(因此與指數不相關)的程度被稱為這只股票的特有風險。它是前面提到的σ(ei)
的最佳估計。
圖 7.2 股票收益與市場收益的散點圖(包括回歸直線)
另外一種進行回歸分析的方法(雖然是以靜態的形式)是使用工具 工具功能表,然後選擇資
工具 資
料分析,點擊回歸
料分析 回歸,就得到如圖
回歸 7.3 所示單格 K6 下的回歸結果。截距和斜率在單格 L22:L23
中,殘差標準差在單格 I12 中。
使用 Excel 的 LINEST 函數可以得到更簡練的回歸結果。與上面只能給出一個靜態的、
不能改變結果的方法不同,此函數可以進行動態調用。LINEST 函數是一個陣列公式,這裏
有 5 行、2 列,因此需要預先選擇好一個 5×2 的區域來輸入該公式,並輸出回歸結果(接下
來不要忘記按下 Ctrl+Shift+Enter 組合鍵):
票的年度風險等於月度風險乘以 12 得到。
圖 7.3 應用工具欄回歸
回歸命令得到的結果
回歸
在估計β值的過程中,還需要對它進行校正,校正後的β值才能用來預測股票的收益。
表中 1.51 的β值是從 60 組月度觀測資料中得到的樣本估計值。校正β值的原因是基於下
面的假設:整個市場上所有股票用價值加權的真實β值之和必須等於 1,並且較高的β樣本
估計值在要預測的時段裏有可能降低,同樣,較低的β樣本估計值在要預測的時段裏有可能
升高。因此β的樣本估計值將向 1.0 的總體均值調整。調整的幅度依賴於β樣本估計值的方
差(等於β樣本估計值標準差的平方)與總體β值方差的相對大小(假設為 0.32)。這個比
率就是均值回復因數(mean reversion factor)
。例中,見圖 7.4,回歸的β樣本估計值 1.51
用一個大小為 32%的均值回復因數進行調整,從而向整個市場的均值靠近。校正後的β值
顯示在單格 O31 中,大小為 1.34。均值回復因數也可以用來調整β樣本估計值的標準差。
下面摘錄的工作表顯示,用戶定義函數給出了一種更方便地調整β樣本估計值的方法。
圖 7.4 為了預測股票收益而校正樣本β值
7.3 資本資產定價模型(
資本資產定價模型(CAPM)
)
前面一章,我們發展了組合優化理論,並且解決了第三個問題-投資者如何在最優風險
投資組合和無風險資產之間分配投資資金。CAPM 模型是基於下面假設建立起來的模型:
只存在一個最優風險投資組合;這個組合就是市場組合,市場組合中各種股票的權重等於其
價值占整個市場價值的比例。我們已經從只考慮單個投資者的微觀角度轉到了考慮所有投資
者的宏觀角度,這樣就可以介紹資產定價的有關理論了。CAPM 理論認為,β值,即股票
收益和市場收益的協方差,是市場定價的唯一因素。另一方面,投資者承擔單只股票的特有
風險將得不到任何回報,因為 CAPM 理論認為,對於所有股票而言,截據α的期望值為 0。
CAPM 是研究與市場預期收益相關的資產預期收益理論。此理論認為:對於一個風險
完全分散化的投資者,影響股票 i 預期超額收益 E(Ri)的唯一因素就是股票的系統風險(用
βi 來度量)。對所有股票而言,α的期望值為 0。用公式表示就是:
E ( Ri ) = β i E ( RM ) 因因E (α i ) = 0
其中,βi 等於 cov(Ri,RM)/σM2,E(RM)是市場的預期超額收益。βi E(RM)通常被稱為收益
的“CAPM 基準”。
假設在市場組合之外存在一個風險資產 x,通過解問題三可以推導出 CAPM,於是,問
題三的答案是,資產 x 的權重為 0。在前面一章中,我們假設投資者的效用函數為二次的(也
就是說,形式為 U=E(rp)-0.5AσP2) ,並在此基礎上發展了投資組合理論。CAPM 理論可以
不使用效用的概念,而通過資產收益服從對數正態分佈這個假設推導出來。我們將在 7.5 節
觀察一隻普通股票的收益形態以檢驗上述假設的合理性。
7.4 方差-
方差-協方差矩陣
上一章選擇風險投資組合時,都是試圖使組合風險最小化。確定投資組合的風險時,使
用了三種資產的方差-協方差矩陣。作為對比,表 VCV 包括 8 種資產的收益資料(實際上
是超額收益的對數) ,並計算了收益的相關係數矩陣和方差-協方差矩陣。計算可由用戶定
義函數 CorrMatrix 和 VCVMatrix 來實現。其中,CorrMatrix 函數中包含了 Excel 的 CORREL
函數,VCVMatrix 函數使用了 Excel 的 COVAR 函數。程式非常簡潔,可以從表 Module1
中得到。如圖 7.5 所示,得到的方差-協方差矩陣中包含 8 個方差和 28 個不同的協方差。
VCV Matrix:VCV 矩陣
σ ij = β i β jσ M 2
對角線元素可以由單因素模型的風險分解方法得到:
σ i 2 = βiσ M 2 + σ ( ei )
2
= $ M $36 * HLOOKUP ($ L 41,$ M $32 : $T $34, 2, FALSE ) * HLOOKUP ( M $40, $ M $32 : $T $34, 2, FALSE )
圖 7.6 由單因素模型β值估計出來的方差-協方差矩陣
比較圖 7.5 和 7.6 的數值之後,就會發現單因素 VCV 矩陣低估了原來的 VCV 中那些處
於同一行業的股票之間的協方差。(那些資產依次代表兩個銀行、兩個保險公司和三個化學
公司。)
用戶定義函數 VCVSingleIndexMatrix 只需將收益資料作為輸入變數,就可以自動得出
β、特有風險的估計值,並且給出單因素 VCV 矩陣。該函數從單格 M55 開始。7.8 節給出
了該函數的具體程式。
7.5 風險值(
風險值(VaR)
)
本節我們介紹風險值(VaR)的概念,並在收益服從對數正態分佈假設的條件下,得到
股票風險值的解析解。
對股票收益的實證研究表明,它們通常具有一定的偏斜度。但是,對收益取對數後(通
常是自然對數)得到的分佈會更加對稱。因此與收益相比,對數收益通常更加對稱並且近似
的服從正態分佈。當對數收益服從正態分佈時,稱收益服從對數正態分佈。雖然在某些情況
下(例如處理日收益或資產收益波動性很低時)經常會忽略對數正態和正態分佈之間的顯著
區別,但精確的研究中絕對不能忽略這種差別。我們至少要理解這兩種分佈之間的區別,這
一點非常重要。兩者的一個主要區別是:專家在他們的學術研究中一般使用對數收益,而在
一般的商業軟體中通常使用普通(未經處理的)收益,並且假設它們服從正態分佈。另外,
研究中傾向於用超額收益(收益減去無風險利率)作為分析的基礎。本質上講,關鍵要知道
在分析中,需要假定股票價格收益服從何種分佈。
嚴格地說,我們需要檢驗‘收益’資料以確保這些資料大致服從正態分佈。一個比較簡
便的方法是生成一個正態概率分佈圖,例如 Beta 表中股票 A 的對數收益。生成正態概率分
佈圖的方法在第 3 章(3.6.2 節)中已經介紹過了。工作簿 EQUITY2.xls 中的表 1 給出了股
票 A 對數收益的散點圖。
在對數收益服從正態分佈的假設下,定義一個投資組合分佈的左尾(lower tail)值,資
產的價值會以一定的概率低於該值。分佈的左尾(lower tail)值就是風險值或 VaR。這種
度量的本質是把度量股票收益的波動率轉化為求正態分佈的百分位點。
知道了月度對數收益的均值和方差(分別用 M 和 V 表示)後,還需要知道服從對數正
態分佈收益資料的均值(用 M1 表示) 。因為本節和下節都要用到收益分佈的矩,所以在圖
7.10 中 對 它 們 進 行 了 總 結 , 其 中 對 數 正 態 矩 M1 和 正 態 分 佈 矩 之 間 關 係 是
M1=exp(M+0.5V)。
如果一個資產的月度對數收益服從正態分佈,其均值和方差分別為 M 和 V,那麼時間
段δt 內其收益同樣服從正態分佈,這時的均值和方差分別為 Mδt 和 Vδt。根據標準正態
分佈的有關理論,收益均值減去 1.64 倍標準差的概率為 5%,用公式表示就是:
M δ t − 1.64 (V δ t )
即收益比上式數值低的概率為 5%。類似的,收益低於均值減去 1.96 倍標準差的概率
為 2.5%。‘z 值’(這裏 z=1.645)確定了分佈的左尾區域(這裏是 5%)
。如果一種資產
的初始價值是 S,那麼在δt 個月之後其價值將有 5%的概率低於:
S M δ t − 1.64 (V δ t )
這就是該資產的風險值。更嚴格的說此處得到的是絕對風險值。只考慮波動率(忽略預
期收益 SMδt)時得到的就是相對風險值。
風險值只是一個數字,用來表示一個資產或投資組合可能出現的損失,風險值給出了在
給定的時間段(如一個月)和合適的概率(如 5%)下資產的最大預期損失是多少。在當前
的實際應用中,風險值被大多數主要的投資銀行用來集中度量其持有的投資組合每天出現損
失的風險。這些投資組合可能幾乎包括所有的金融資產,例如期權、債券、期貨和股票。此
處的解釋只針對由股票構成的投資組合,而沒有涉及如何計算其他金融資產的風險值(往往
比較複雜) 。
下面給出了由 8 種瑞士股票構成的投資組合風險值的計算過程,股票的收益展示在表
VCV 中。如圖 7.7 所示,這裏使用的是這 8 只股票的月度對數超額收益率。從 C 列到 J 列
給出了各種資產的 60 組月度對數收益率,其均值和方差列在第 8 到第 10 行中。拿 UBS 來
說,單格 W8 給出了它的均值(用公式=AVERAGE(C13:C72)算出),單格 W10 給出其方
差(公式=VARP(C13:C72))。計算相對風險值的公式主要用到了 UBS 的資產價值(單格
W16)、UBS 的方差(單格 W10)、所選擇的時間段(單格 W15 給出的一個月)和標準差
的倍數即‘z 值’(單格 W19) 。相對風險值(單格 W21)的意義可以解釋為:如果持有現
在價值為 1000 的 UBS 的股票,在今後一個月的時間內,其價值有 5%的概率減少 105.59
或更多。在計算相對風險值的過程中,我們假設資產在整個期間內有一個預期收益,但是這
個收益很小,可以忽略不計。(在計算每天的風險值時通常這麼考慮)
絕對風險值中包含了資產的預期收益(從單格 W12 的 M1 可以得到,此處 UBS 的月度
收益為 1.21%),並且要從相對風險值中減去這個正數(因為此處持有該股票)。計算預期
收益率(單格 W12 中的 M1)的過程中用到了對數正態和正態分佈矩之間的關係公式,該
公式將在 7.7 節介紹。因此,在我們的例子中單格 W24 給出的 93.5 的絕對風險值比相對風
險值要低。在上面給出的那些股票中,風險值最低的是 Roche,因為它的方差最小。
在知道單只股票的風險值和它們收益之間的相關係數矩陣之後,估計整個投資組合(此
處假設組合中 8 種股票的權重相等)的風險值也就不難了。單格 W30 中給出了整個投資組
合的相對風險值是 702.70,比所有單只股票的風險值之和 914.73 要小很多,這從另一個側
面證明了投資分散化可以減小投資風險。圖 7.7 給出了用於度量風險值的一些用戶定義函
數。
7.6 水準財富
M = 2 ln( M 1) − 0.5ln( M 2)
V = −2 ln( M 1) + ln( M 2)
其中 M,V 的值分別為 0.0715、0.0324(分別列在圖 7.8 的單格 E6、E7 中)
。在對數
收益服從正態分佈的假設下,不同的預期收益分佈的參數列在 F 列中,其中預測收益的方
差與時間段的長度為負相關關係。無限期的預測收益為 7.41%,而收益的幾何均值為
7.23%。E 列給出了對於不同時間段由正態分佈的參數得到的預測收益,B 列是用對數正態
分佈的前兩階矩得到預測收益。
對於正態分佈,針對不同的時間段可以做出預測財富值的分佈圖。其置信水準(例如上
95%水準)由下面公式給出的“z 值”確定:
WT = W0 exp( MT + z V T )
下面的圖 7.9 給出了過去 70 年的實際財富狀況和對未來 20 年財富的預測值,財富分
佈的上 95%,中間(50%)和下 5%水準都展示在圖中。
Wealth index:財富指數
圖 7.9 對預測的水準財富值所作的解釋
7.7 正態和對數正態分佈矩之間的關係
圖 7.10 中表格的內容值得仔細閱讀,因為在教科書中經常忽略收益和對數收益之間的
區別,並且無論是在研究股票還是在研究期權等其他重要領域時,理解對數正態和正態分佈
參數之間的差別對我們的研究有很大幫助。
資產 收益 對數收益
分佈 對數正態 正態
一階矩
二階矩
一階矩計算
二階矩計算
圖 7.10 正態分佈和對數正態分佈矩之間的關係
可以用分佈的中心矩來描述這個分佈(見上表中的正態分佈),也可以用原點矩來描述
這個分佈(見上表中的對數正態分佈) 。兩種分佈的一階矩都是其均值(記做 M1 或 M) ,二
階中心矩是方差 V,二階原點矩為 M2。在 Excel 中,可以對所有收益使用 SUMSQ 函數,
然後把計算結果除以收益的總個數,這就得到了 M2。
由於正態和對數正態分佈的矩存在上面給出的等價關係,可以根據一個分佈的參數求出
另一個分佈的參數。假設對數收益服從均值為 M、方差為 V 的正態分佈。於是利用上表第
二列最後兩行給出的公式可以算出相應收益服從對數正態分佈時的原點矩 M1 和 M2。同
樣,知道收益服從對數正態分佈時的原點矩之後,可以利用表中第三列最後兩行的公式求出
收益服從正態分佈的均值和方差(M 和 V)。
本 模 組 中 的 許 多 函 數 都 能 把 工 作 表 中 的 公 式 直 接 轉 化 到 VBA 。 這 些 函 數 包 括
ISHorizonWealth 函 數 和那 些 函 數 名 前 面 冠 有 Portfolio 的 函數 。 函 數 CorrMatrix 和
VCVMatrix 分別用來計算相關係數矩陣和方差-協方差矩陣,它們只需要輸入-收益矩陣
(retsmat)。這兩個函數都系統地選擇了收益矩陣中的兩列,應用 Excel 中的一些函數(這
裏主要使用了 CORREL 和 COVAR)來計算度量指標,然後在輸出矩陣中儲存計算結果。
這裏需要對 VCVMatrix 程式進行一點說明。在計算 VCV 矩陣時我們採用了樣本度量函
數(例如 VAR 函數) ,而不是總體度量函數(如 VARP 函數)。更為混亂的是,Excel 中的
COVAR 函數是用來度量總體值的,其計算乘以 n/(n-1)時才能得到樣本值。
本模組中最具獨創性的函數是計算單因素 VCV 矩陣函數。它有兩個輸入:收益矩陣
(retsmat)和市場收益向量(mktvec) 。下面詳細給出了該函數的程式。注意:在輸入矩陣
的階數確定之後,rvec()等變數的維數在後面的程式中要用 ReDim 語句加以聲明。
Function VCVSingleIndexMatrix(retsmat, mktvec)
’returns nxn sample single-index variance-covariance matrix
’uses PortfolioBeta fn
’uses PortfolioSpecificRisk fn
Dim vmkt, bi, sri
Dim i As Integer, j As Integer, nc As Integer, nr As Integer
Dim rvec() As Variant, bvec() As Variant, srvec() As Variant, Vcvmat() As Variant
nc = retsmat.Columns.Count
ReDim Vcvmat(nc, nc)
ReDim bvec(nc)
ReDim srvec(nc)
nr = retsmar.Rows.Count
ReDim rvec(nr)
’first calculate the input (beta, specific risks and market variance)
For j = 1 To nc
For i = 1 To nr
rvec(i) = retsmat(i, j)
Next i
bvec(j) =PortfolioBeta(rvec, mktvec)
srvec(j) = PortfolioSpecificRisk(rvec, mktvec, 1)
Next j
vmkt = Application.Var(mktvec)
’then cycle through vcv matrix
For I = 1 To nc
bi = bvec(i)
sri = srvec(i)
For j = 1 To nc
If j = i Then
Vcvmat(i, j) = (bi^ 2)*vmkt + (sri^ 2)
else
Vcvmat(I, j) = bi*bvec(j)*vmkt
Vcvmat(j, i) = Vcvmat(I, j)
End If
Next j
Next i
VCVSingleIndexMatrix = Vcvmat
End Function
在第一個 If… Then 迴圈中,j 指第 j 種資產,i 指第 i 個收益,用其他的用戶定義函數估
計了每種資產的β值和特有風險。第二個 If… Then 迴圈則在 VCV 矩陣的合適位置插入了
基於β值和特有風險的方差-協方差運算式。
小結
單因素模型的主要貢獻是把第六章中所研究的風險分為兩個部分:第一部分是直接受指
數或市場組合影響的風險,第二部分是單只股票或資產自身特有的風險。本章是應用單因素
模型來估計方差-協方差矩陣,並且用回歸分析得到了β係數。給出了分別使用工作表和用
戶定義函數時的所有計算過程(包括回歸和矩陣乘法)。
雖然單因素模型和資本資產定價模型的數學原理極為相似,但是 CAPM 要比單因素模
型向前多走了一大步。從 CAPM 的模型公式可以看出,只有投資者承擔的市場風險才能得
到回報。
可以通過單個投資者的效用和第六章介紹的常見組合問題推導出 CAPM 模型,同樣可
以採用股票的對數收益服從正態分佈的假設,直接得到 CAPM 模型。在此正態假設的基礎
上,本章解釋了如何根據歷史收益預測投資者未來財富的分佈和如何計算風險值。
下一章,將研究如何用單因素和多因素模型的被動標準來度量主動的投資戰略。
參考文獻
Bodie, Z., A. Kane and A. J. Marcus, 1996, Investments, 3rd Edition, Richard E. Irwin,
Englewood Cliffs, NJ.
第 8 章 投資組合業績評價
投資組合業績評價的主要目的是估計和比較不同投資策略的業績(歷史收益) 。對於由
風險資產構成的投資組合,本章的內容是選擇被動的還是主動的投資策略。另外,還將介紹
在確定風險投資組合的條件下,如何選擇無風險資產的投資水準。
對於一個完全被動的投資策略,投資者持有的組合完全複製市場指數(即成份股及其權
重與市場指數完全相同)。被動的投資者並不需要過多資訊,並且一般不交易其投資組合所
包含的股票,除非市場指數的結構(成份股或者權重)發生變化促使投資者改變持有的投資
組合。被動的投資者承受了市場風險並且獲得相應回報,其收益等於市場收益減去必需的交
易成本。
與之相反,主動投資者所持有的投資組合與市場指數構成不同,主要表現在投資組合的
部分或是所有股票的權重與市場指數不同。主動投資者需要得到充分的資訊並且比被動的投
資者承擔更多的交易成本。實際上,因為主動的投資者承受了特殊的風險並且承擔較多的交
易成本,所以從長期來看只有少數的主動投資者所獲的收益超過了被動的投資者。隨著主動
的投資策略變得越來越複雜,所以急需發展更為適用的組合業績評價方法和評價標準。
本章回顧了最早在二十世紀六十年代興起的有關投資組合業績評價的有關想法和九十
年代提出的最新的投資組合業績評價理論。所有的研究方法都用到了資產的收益(這樣做的
好處是股票和投資資金的相關資料都是可以得到的) 。傳統的投資組合業績評價理論是與前
面章節介紹的資產定價理論同時發展起來的。因此,夏普比率採用無風險資產的收益作為收
益基準,而其他三種方法以 CAPM(單因素模型)為基準。七十年代出現了另一種方法-
特雷納-布萊克模型(特雷納和布萊克,1973),這種方法把那些定價不合理的股票和一個
被動的市場指數投資組合混和起來,構築了一個最優風險投資組合。這種方法是基於第六章
中討論的常見組合問題提出的。投資組合業績評估和特雷納-布萊克模型在 Bodie et al
(1996)著作的第二十四章有詳細介紹。但是,Bodie et al 的書中並沒有介紹評估投資組
合貢獻的最新方法-風格分析(Style Analysis)。風格分析採用了多因素模型作為收益基
準,它是夏普於 1992 年提出的。
四種傳統的投資組合業績評價方法包括用投資組合相對於某個收益基準的收益除以相
應風險指標(如波動性、β值或特有風險)所得到的比率。表 EQUITY3.xls 詳細解釋了這
些評價方法。針對這些方法,也給出了相應的用戶定義函數。類似的,用試算表來實現特雷
納-布萊克“主動-被動”模型的過程中使用了一些函數,這些用戶定義函數在我們解決常
見組合問題時已經介紹過了。類似於求出有約束有效邊界時的處理方法,風格分析也用到了
Excel 的規劃求解來解決二次規劃問題。風格分析還有兩個擴展應用:求風格權重的置信區
間(同樣用規劃求解來實現)和暴露分析(exposure analysis,即一個滾動時期的風格分析,
它表示了隨著時間的改變投資基金風格的變化情況) 。因為進行暴露分析時反復用到了風格
分析,所以我們將用 Excel 的宏來實現暴露分析。
8.1 傳統業績評價方法
傳統的投資組合業績評價方法主要通過比較不同投資策略的歷史收益和風險對其進行
評價的。因為這些方法僅以單因素模型作為基準,所以現在看來都有點過時了,並且它們都
缺乏統計上的準確性和說服力。在此我們只把它們作為歷史方法進行介紹。
表 4Measures 展示了二十世紀六十年代後期在 CAPM 基礎上發展的投資組合業績評價
方法。它們的定義由如下公式給出:
夏普的方法: rp − rf σ ( rp )
特雷納的方法: rp − rf β p = 常常 + α p β p
詹森的方法: { }
α p = rp − rf + β p rm − rf
Appraisal 比率: α p σ ( ep )
其中,rp 和σ(rp)分別是投資組合的平均收益和收益標準差,αp 和βp 是 CAPM 模型
中描述該投資組合和市場表現之間關係的參數,σ(ep)是投資組合收益的特有風險(即收
益的標準差中不與市場相關的那部分),rf 是無風險資產的收益。這些評價方法是基於歷史
可以反映未來的假設,用歷史(後驗)資料計算相應指標從而預測(先驗)未來的情況。
夏普比率用超額收益除以投資組合的風險(投資組合收益的標準差)。特雷納指標是用
超額收益除以系統風險βp。詹森指標僅僅是αp,它等於投資組合的實際收益減去市場收益
已知的情況下用 CAPM 預測出來的組合收益,相當於“定價偏差”。Appraisal 比率等於α
p 除以投資組合的非系統風險。
圖 8.1 中 C 和 D 列給出的收益均值,α,β等都是通過單只股票和市場指數的月度超
額收益得到。(注意:我們同樣可以選擇一個投資組合的收益來代替上面提到的單只股票的
收益)單格 C11 中顯示股票的α值(即單格 H12 中的詹森指標)為正,這說明該股票的收
益比用 CAPM 模型預測的結果要高。同樣,單格 H14 顯示的 Appraisal 比率也是正的。特
雷納指標等於一個常數加上αp/βp,這個常數就是市場組合的超額收益。但是,在我們的例
子中,α值不足以補償該股票比市場組合大的多的總風險,因此,如果用夏普指標來評價的
話,該股票的表現比市場要差。
上面幾種評價指標分母上的風險指標是不同的,這在很大程度上決定了這幾種方法的適
用範圍。例如,夏普指標只適用於評價整個投資組合的表現(因為它忽略了與市場的相關
性)。特雷納指標和詹森指標只適用於評價整個投資組合中的一部分投資業績。Appraisal
比率只適用於評價在一個核心的被動投資組合的基礎上,進行的幾個不同的主動投資策略的
業績。使用這些單因素的業績評價指標時必須要小心。一般來說,這些方法比我們在本章後
面部分介紹的多因素業績評價方法(例如風格分析)要差。
8.2 主動—
主動—被動管理
實踐中,許多投資經理假設大部分股票的價值是合理的,但是也有一部分股票被高估,
另一部分被低估。根據 CAPM 模型,在一定程度上,可以用股票的α值來評價其價值被高
估或低估的程度。
基於股票市場不是完全有效的假設,特雷納和布萊克給出了一個如何評估由定價不合理
股票構成的投資組合的模型。首先,他們給出了如何混和最優主動投資組合和被動市場組合
來得到最優風險投資組合。其次,他們描述了如何在無風險資產和最優風險投資組合之間分
配投資來構造最優投資組合。上面的兩個步驟與前面我們解決常見組合問題時首先考慮兩種
風險資產、然後考慮一種風險資產和一種無風險資產的做法是一致的(即分別在 6.8 和 6.7
節中介紹的問題二和問題一)。特雷納-布萊克方法採用了 Appraisal 比率,它是投資管理中
常用的“core-satellite”方法的基礎。
Active-Passive Exercise:主動-被動練習
圖 8.2 的例子中,給出了投資經理認為定價不合理四隻股票的一些具體指標。例如,股
票 1 在下一年的預期超額收益為 1%(超出用 CAPM 模型得到的預測值) 。給定四種定價不
合理股票的預期收益、β值和特殊風險後,可以首先得到最優主動投資組合。特雷納-布萊
克方法認為應當使主動投資組合的 Appraisal 比率最大化。並證明了上面這種方法的結果等
價於持有這幾種股票:各股票的權重等於其預期收益除以各自的特有風險。這些比率列在單
格 G12:G15 中,它們之和列在單格 G17 中,最優主動投資組合中這四種股票的權重列在單
格 I12:I15 中。例如,最優主動投資組合中股票 1 的權重為 98.2%(=G12/G17)。結合這
四種股票的權重以及其他資訊,可以得到最優主動投資組合的預期超額收益為 3.7%,β值
為 1.27,特有風險為 24.8%(假設四種股票的特定風險是相互獨立的) 。
接下來的任務是在最優主動投資組合和被動市場組合之間分配投資(對於後者,其超額
收益等於單格中的股權風險溢價,總風險等於單格中的股票市場風險)。這裏可以利用 6.8
節中關於問題二的結論。6.8 節主要解決了存在兩種風險資產的情況,這同樣適用於存在兩
種投資組合的情況。因此圖 8.3 的單格 I23 給出了主動投資組合的權重,其計算公式為:
這個公式的輸入項主要有:這兩個投資組合的收益和風險(B24,E24,B29 和 E29)、
它們的相關係數(B31),無風險利率(B4),風險厭惡係數(B7)
。結果顯示有 32.8%的資
金是投資於主動投資組合的。注意到最優風險投資組合的夏普比率比被動投資組合的要大,
這說明最優風險投資組合為風險提供了更多回報。
最後的任務是解決如何在最優風險投資組合和無風險資產之間分配投資。同樣,這個問
題的解決方法已經在 6.7 節中介紹過了,是第一個常見組合問題。圖 8.4 的單格 B41 給出
了最優風險投資組合的權重,其公式為:
圖 8.5 中的風險-收益圖解釋了主動和被動投資組合。根據資金在主動和被動投資組合
之間分配的不同,可以得到二者之間的邊界(邊界上的每個點反映了兩者的一種組合)。當
過圖上代表無風險資產(收益為 7%)的直線與該邊界相切時,就得到了最優風險投資組合。
風險厭惡係數不同將會改變最後的最優投資組合在直線上的位置。本例中無風險資產的投資
比例為 38.8%。
Active-Passive Exercise:主動-被動練習
Portfolio return:投資組合收益
Portfolio risk:投資組合風險
Risk-free:無風險
Passive:被動
Active:主動
8.3 風格分析(
風格分析(Style Analysis)
)
風格分析(style analysis)是最近發展起來的,基於收益的,投資基金評價方法。夏普
(1992)在九十年代初期率先建立了一個“資產類因素模型”,並根據風格(Style)和選
擇(Selection)來評價不同基金的業績。風格分析可以看作得到組合的逆過程。
投資基金可以分配到許多不同的國內市場(例如股票、債券和票據)和國外市場(例如
貨幣、外國股票和商品)。其中的每個市場還可以包括許多不同種類的資產。對於局外投資
者而言,通常不能得到一個特定基金所投資資產的詳細資訊。因為不同市場資產的業績是不
同的,所以,一方面很難分辨出每個市場對整個投資組合的收益所作貢獻的大小,另一方面
也很難分辨出每個市場中不同資產的貢獻大小。但是,可以得到該基金的收益資料,從而可
以進行風格分析。
風格分析是用一些已知的指數(其收益是可以得到)構建基準投資組合,然後將投資基
金的主動投資組合的業績與該基準組合進行比較。理論上,這些指數應該能反映不同資產類
別的活動性,這些指數應該是唯一和完全的,並且所包含資產報價是公開的,這樣一來,我
們就可以“被動地”追蹤這些指數。 (例如,夏普選擇了 12 個能包括美國投資基金投資選
擇的指數,並保證這些指數之間的重疊部分儘量少。)
用 f1、f2…fn 表示 n 種被動指數的收益,則用這 n 種指數對第 i 種投資基金進行風格分
析所用的公式為:
ri = [bi1 f1 + bi 2 f 2 + L + bin f n ] + ei
其中 ri 是第 i 種基金的收益,bij 是第 i 種基金在第 j 種指數中的權重,ei 是收益中不能用
上述因數解釋的部分。
把上面的收益多因素模型改變一下形式,轉化為基金收益和指數收益之差:
ei = ri − [bi1 f1 + bi 2 f 2 + L + bin f n ]
其中括弧中的部分可以看作是一個投資組合的收益。
夏普認為應該選擇合適的權重 bij 使得“追蹤誤差”ei 最小化,或者使 ei 的方差(它是
權重的二次函數)最小化。因為這些指數構成了一個投資組合,所以相應的權重之和應該為
1,並且每個指數的權重應該在 0-1 之間。
(對於基金來說,後面的那個約束條件可以修改為
允許賣空資產。)最優化之後得到的權重被稱為風格權重,並且與其相應的指數共同構成基
準投資組合。我們稱由各種指數按照相應最優風格權重構成的基金與原有基金的風格是相同
的。
可以用二次規劃來最小化樣本期內的追蹤誤差,並得到相應的風格權重。利用 Excel
中的規劃求解過程(選擇“工具
工具”,然後點擊“規劃求解
工具 規劃求解”)可以在工作表中很容易實現上
規劃求解
述計算。
可以通過計算基金收益的方差中由所選擇的風格模型解釋的比例大小來判斷風格分析
的效果。這與回歸分析中經常用到的決定係數 R2 類似,對於第 i 種基金的計算公式如下:
8.4 簡單風格分析
8.5 滾動時段風格分析
滾動時段風格分析
前面一節中定義的風格實際上是整個研究期間內的風格平均值,要注意到風格是隨時間
不斷變化的。另一種分析方法是對於一系列連續的時期進行一系列的風格分析,這樣我們可
以 看出 隨著時 間的 變化, 風格 是否一 致。這 種滾 動時 段的風 格分析 有時 被稱 為暴露
(Exposure)分析。
如圖 8.7 所示,我們分別對前 24 個月、第 7-30 月等時間段的收益進行了風格分析,得
到了 7 個風格分析的時序資料(每次分析與前面的分析都有 18 個觀測是相同的)。
跟上一節相比,使用試算表計算時需要格外注意的是:計算每次風格分析的誤差方差時
要正確選擇相應的誤差項(如計算前 24 個月的誤差方差時要選擇相應的 1-24 月的誤差值,
而不要選擇 2-25 月等)。為了做到這一點,可以用 Excel 中建議的格式使用 INDEX 命令,
從而為方差計算公式選擇正確的開始和結束單格。單格 M23 給出了每次風格分析中計算誤
差方差的公式,其中開始月份列在 J6,結束月份列在 J7 中:
Exposure Analysis:暴露分析
圖 8.8 在滾動時段分析中改變風格權重
我們可以用暴露權重(從過去的 24 個月的資料估計得到)構造一個基準投資組合,並
比較該組合和主動基金在當月的業績。月末就可以比較主動基金和它的暴露基準組合的收益
情況,兩者業績的差異被稱為當月的選擇收益(Selection Return)
。這個選擇收益度量了在
該風格部門裏選擇的股票的影響和當月對基金所作的動態調整引起不同部門相應權重變化
的影響。例如,一個基金中某部門業績較好的股票的比重較大時將為其帶來正面影響,而增
加業績不好部門的頭寸將為其帶來負面影響。對一些月份的資料進行上述分析,就可以得到
該主動基金的累積選擇收益。夏普給出了如何用 t-檢驗來檢驗平均選擇收益的顯著性。
8.6 風格權重的置信區間
到現在為止,已經估計了風格權重(分別在簡單和滾動的基礎上) ,但是仍然不知道這
些權重的估計值是否顯著不為 0。為了使用統計方法來檢驗這一點,需要計算風格權重估計
值的標準差。
理論狀態下,風格分析中使用的指數應該是相互獨立的,因此任意指數的收益與其他指
數的收益不相關。實際上,指數一般包括多種可用資產,因此有時候與其他指數相關性較高,
不滿足理論假設。現在需要做的是從風格分析中去掉那些與其他指數過於相似的指數(替
代),這樣餘下指數的相關性就大大降低了。例如,開始分析的時候可能有 8 種指數,而經
過逐步篩選將剔除 4 種相關性較強的指數,最後可能利用互補性最強的 4 種指數進行風格
分析。
判斷指數之間替代性或互補性的一種方法是計算不同指數收益的相關係數矩陣。那些容
易被其他指數複製的指數與其他指數的相關性很強。如圖 8.9 所示,指數 3,6 和 8 與其他
四種指數的相關係數都在 0.5 以上。與之相反,那些很難複製的指數與其他指數的相關性較
差。例如,指數 1 和 2 與其他指數的相關係數都在 0.25 以下。
Correlation Matrix for Style Index Returns:風格指數收益的相關係數矩陣
圖 8.9 風格指數收益的相關係數矩陣
風格分析是在有約束的線性回歸基礎上發展起來的,因此,應該可以找到風格權重的置
信區間。這可以通過用其他的指數來估計該指數的風格來實現(Lobosco 和 DiBartolomeo
於 1997 首先指出了這一點)。上述風格的估計過程中沒有權重進行約束(除權重之和必須
為 1 之外),因此對於每個指數都會帶來一個無法解釋的波動率。這與前面介紹的評估基金
業績的風格模型有較大差別:那個模型中,為了得到所估計的風格權重的標準差(和置信區
間),首先給出了模型的主動標準差。這些都展示在圖 8.10 和 8.11 中。
需要這樣一張試算表,它把指數收益矩陣自動分為兩部分:B 列是選定的單個指數的收
益 j ;D 到 J 列是餘下那些指數的收益。用單格 B10 中的 j*值和 INDEX 命令把選定的單個
*
指數分離出來。這裏用陣列的形式來返回收益陣列中選定單格的數值。上面的這些步驟用公
式表示在 B21 中就是:
利用對每個指數分別求得的主動標準差,估計最初對該基金進行風格分析時得到的風格
權重的標準差。單格 AB16 中的標準差公式為:
本模組包括四種業績評價方法所需要的函數。本模組僅僅把試算表中的函數直接轉化為
程式。
其中有一個函數的作用是從收益矩陣中刪除一行並得到維數減少的矩陣,這樣我們就可
以計算風格係數的置信區間了。本質上,該函數是對原有收益矩陣一行一行的完全複製,跳
過需要刪除的那一行(用虛擬變數 jadj)
:
Function StyleSubMatrix(indxmat, jstar)
’returns style index returns matrix less column j*
Dim i As Integer, j As Integer, jadj As Integer, nr As Integer, nc As Integer
Dim Submat() As Variant
nr = indxmat.Rows.Count
nc = indxmat.Columns.Count
ReDim Submat(nr, nc - 1)
jadj = 0
For j = 1 To nc – 1
If j >= jstar Then jadj = 1
For i = 1 To nr
Submat(i, j) = indxmat(i, j + jadj)
Next i
Next j
StyleSubMatrix = Submat
End Function
8.8ModuleM 中的宏
風格分析的二次規劃公式比求有效組合的二次規劃公式要略微簡單一些。這兩個公式為
權重設定了上下限,但是風格分析中沒有等價於滿足目標收益要求的等式約束。Style1 的副
程式主要是規劃求解的一個簡單應用,它直接使用了規劃求解中的函數。SolverAdd 函數給
出了約束條件,而用 SolverOk 解決:
Sub Style1()
Range(“change1”).Value = 0.1
Range(“A1”).Select
SolverReset
Call SolverAdd(Range(“constraint1”), 3, Range(“con1min”))
Call SolverAdd(Range(“constraint1”), 1, Range(“con1max”))
Call SolverOk(Range(“target1”), 2, 0, Range(“change1”))
Call SolverSolve(True)
SolverFinish
Call Chart1
Application.ScreenUpdating = True
End Sub
Chart1 副程式是用巨集錄製器編寫的,它主要用圖表嚮導在一張新的工作表上作圖。
程式最後兩行的作用是用資料標籤的形式顯示數值並且減少圖表的背景色彩。這些程式都是
用巨集錄製器編寫的,這要比邊看幫助和使用說明邊寫程式簡便得多。注意:這段程式可以
單獨使用,也可以在 Style1 中作為副程式調用。
Sub Chart1()
Charts.Add
ActiveChart.ChartWizard Source:=Sheets(“Style1”).Range(“chart1s”),_
Gallery:=xlColumn, Format:=6, PlotBy:=xlRows,_
CategoryLabels:=1, SeriesLabels:=0,HasLegend:=2, Title:=_
“Style Analysis”, CategoryTitle:= “”, ValueTitle:= “”, ExtraTitle_
:= “”
ActiveChart.ApplyDataLabels Type:=xlShowValue, LegendKey:=False
ActiveChart.PlotArea.Interior.ColorIndex = xlNone
End Sub
副程式 Style2 僅僅是規劃求解函數的重複應用。應該注意在初始化之後,規劃求解是
如何在迴圈之前建立起來的。每次迴圈將調用 SolverSolve 進行下一次風格分析,然後將求
得的權重複制到輸出區域。這裏注意語句 Range(“exp0”).Offset(iter, 1)中的 Offset 是如何在
輸出區域內迴圈使用的。
Sub Style2()
Dim iter As Integer, niter As Integer, rstep As Integer
Range(“exp17”).ClearContents
Range(“change2”).Value = 0.1
Range(“A1”).Select
SolverReset
Call SolverAdd(Range(“constraint2”), 3, Range(“con2min”))
Call SolverAdd(Range(“constraint2”), 1, Range(“con2max”))
Call SolverOk(Range(“target2”), 2, 0, Range(“change2”))
rstep = 6
niter = 7
iter = 1
Do While iter <= niter
Range(“smonth2”).Value = 1 + (iter - 1) * rstep
Call SolverSolve(True)
SolverFinish
Range(“constraint2”).Copy
Range(“exp0”).Offset(iter, 1).PasteSpecial Paste:=xlValues
iter = iter + 1
Loop
Call Chart2
Application.ScreenUpdating = True
End Sub
接下來的副程式 Style3 和 Style4 的編寫方法,與上面介紹的兩段副程式類似。
小結
本章從兩個不同視角研究了投資組合業績的評價方法。第一視角的研究方法不是很細
緻,主要是在前面一章的理論基礎之上發展的傳統業績評價方法。第二視角則根據多因素模
型進行風格分析,並給出更為準確的判斷標準。
傳統的評價方法是根據投資組合收益和風險的歷史資料對組合進行簡單排序。這些方法
很容易用試算表實現,但是它們是由單因素(CAPM)模型發展出來的,也缺乏統計上的說
服力和準確性。
基於部分股票的價格是不合理的假設基礎之上,特雷納和布萊克根據 CAPM 模型給出
了“主動-被動”模型。該模型主要的任務是將主動投資組合與市場組合結合起來,構建一
個最優風險投資組合。可以看到,第 6 章中提到的常見組合問題可以用來解決在“主動-被
動”模型中遇到的問題。
在建立 CAPM 模型後的幾十年裏,學者們為了找到可以反映風險回報的、不同於β值
的其他評價指標做了不計其數的實證研究。為了發現市場上潛在的定價偏差(如規模、市淨
率),又發展出來一些更為專業的指標(如大盤股、小盤股、價值和成長) 。這些研究成果推
動了多因素模型的發展,進一步為建立更好的投資組合業績評價基準打下基礎。
本章介紹了風格分析的方法,它是一種以多因素模型為基礎的主動投資策略的評價方
法。這種方法需要用二次規劃來解決問題(就像在第 6 章那樣),具體的實現過程可以使用
Excel 工作表中的規劃求解或者是宏。可以對一段時期進行風格分析,但更為有用的是對一
系列連續的流動時期進行風格分析,這樣可以發現風格模式(Style Pattern)隨時間的變動
情況。
與傳統的評價方法不同,利用風格分析可以進行統計推斷。在對標準風格分析進行修改
的基礎上,可以給出風格權重的置信區間。同樣可以檢驗一個主動基金隨時間變化的
Selection Return 在統計上的顯著性。
從二十世紀五、六十年代創建的投資組合最優化和資產定價理論到九十年代的風格分
析,在這些理論的發展過程中,夏普做出了很大貢獻-他發展了 CAPM 模型和風格分析。正
如我們在附注的試算表中看到的那樣,這是理論和實際應用的一次完美結合,幫助我們更全
面認識了股票。
參考文獻
Bodie, Z., A. Kane and A. J. Marcus, 1996, Investments, 3rd Edition, Richard E. Irwin,
Englewood Cliffs, NJ.
Lobosco, A. and D. DiBartolomeo, 1997, “Approximating the Confidence Intervals For
Sharpe Style Weights”, Financial Analysts Journal, July/Aug, 80-85.
Sharpe, W. F., 1992. “Asset Allocation: Management Style and Performance
Measurement”, Journal of Portfolio Management, Winter, 7-19.
Treynor, J. and F. Black, 1973, “How To Use Security Analysis To Improve Portfolio
Selection”. Journal of Business, 46, 66-86.
第 9 章 股票期權介紹
9.1 布萊克-舒爾斯公式的起源
布萊克 舒爾斯公式的起源
費希爾·布萊克(1989)曾進寫過一篇短文介紹他和邁倫。舒爾斯怎樣得出著名的布萊
克-舒爾斯公式,為了強調其對現代金融學的傑出貢獻,這裏重點介紹其中的一些觀點。在
他們的分析中,核心思想是可以用一定數量的股票和一份期權構造一個完全對沖的組合。術
語“對沖(hedge)”的含義是,由於期權價值的變動可以抵消股票價格的變動,因此組合資
產的價值在一段較短時間內不隨股票價格的變化而變化。因此,對沖投資組合也是一種無風
險組合。
接下來,在 1965 年發表的論文中提出了資產定價模型(CAPM),許多研究機構設法
將它運用於股票以外的其他領域,如債券,企業現金流,以及認股權證(warrant)等。當
時(1965)的認股權證市場(由企業發行的一種長期期權)發展迅速,遠甚於 OTC 市場短
期期權。
學者們首先估計認股權證在到期日的預期收益,然後將其折現來得到其價格,這種方法
忽略了股票的預期收益以及合理的折現率。布萊克發現認股權證的價值由股票的總風險決定
而不是由股票的預期收益決定。
布萊克和舒爾斯發現,股票的預期收益等於確定狀況下的無風險利率,因此,期權的預
期收益也可以用這個利率折現得到。他們的手稿(1970 年)提出了著名的布萊克-舒爾斯公
式,但當時卻被《政治經濟雜誌(Journal of Political Economy)》拒絕!在默頓·米勒和吉
恩·法馬的幫助下,文章才在 1971 年 8 月被接收,但要求作進一步的修改。文章最終發表在
《政治經濟雜誌》1973 年 5/6 月期刊上。同樣在 1973 年,這不僅是巧合,芝加哥期權交
易所(Chicago Board Option Exchange)成立,交易 16 家公司的股票看漲期權。
現在看來,布萊克-舒爾斯公式其實並不複雜,但是它在期權定價理論方面得到廣泛應
用,而且邁倫·舒爾斯和羅伯特·默頓也因此在 1997 年 10 月獲得諾貝爾經濟學獎,這些足以
說明它的重要性。可惜布萊克在 1996 年去世,因此未能享受這一殊榮。
簡要介紹完布萊克-舒爾斯公式的歷史後,接下來看一看實際的布萊克-舒爾斯公式。
9.2 布萊克-舒爾斯公式
布萊克 舒爾斯公式
布萊克-舒爾斯公式可以直接給歐式期權定價,但它也可以為其他一些期權定價(歐式
期權的特點是僅能在到期日執行) 。股票部分已經提到過,假定期權標的股票對數收益服從
正態分佈。假設期權(標的股票的即期價格為 S)是一個看漲期權,期限為 T,只有在到期
日才能執行,執行價格為 X。那麼在 T 時刻,期權的收益為:
max(S T − X ,0)
S T 是標的股票在 T 時刻的價格,是一個服從某種概率分佈的隨機變數。
通常可以將股票價格的運動看成是一個隨機過程,或者更準確的說,是幾何布朗運動(這
種股票價格運動模型可以參看赫爾的第 10 章)。使用數學語言,這意味著隨機變數 S T 可以
寫成隨機的形式:
S T = S exp(YT ) = S exp( µ T − εσ T )
µ T = ( µ − 0.5σ 2 )T , σT = σ T
樣服從正態分佈,即股票的對數收益服從正態分佈。
在布萊克-舒爾斯分析方法中,看漲期權可以與一定數量的標的股票構成完全對沖的無
風險組合。因此這個組合的收益必須等於無風險收益。用一個偏微分方程(應用數學中常見
的熱擴散方程)表示。該方程的解就是布萊克-舒爾斯公式。
歐式看漲期權(不支付紅利)的布萊克-舒爾斯定價公式為:
c = SN (d 1 ) − X exp(−rT ) N (d 2 )
其中, S 為股票的即期價格, X 為期權在 T 時刻的執行價,r 為複利計算的無風險利率,因
裏, d 1 和 d 2 可以表示為:
d 2 = ln( S X ) + (r + 0.5σ 2 ) σ T
d 2 = ln( S X ) + (r − 0.5σ 2 ) σ T
我們將在第 11 章更加深入的分析布萊克-舒爾斯公式。注意,股票的期望收益 µ 並沒有出現
在公式中。在我們完全理解對沖組合的重要性後,就會明白其中的原因了。
9.3 對沖投資組合(
對沖投資組合(Hedge Portfolios)
)
在布萊克-舒爾斯公式中一個令人感到驚訝的地方是,股票的期望收益 µ 沒有出現在運
算式中。然而,這可由下面來解釋,可以創建對沖投資組合,且公式中使用無風險利率。但
是,術語“對沖投資組合”的確切含義是什麼呢?
布萊克-舒爾斯看漲期權公式可以寫成下面的形式:
c = hS − B ,其中 h = N (d 1 ) , B = X exp(− rT ) N (d 2 )
等式右邊的投資組合,包括一定數量的股票和無風險貸款,它可以完全複製左邊的看漲期權
(該變數即“複製組合(replicating-portfolio)”)
。 布萊克-舒爾斯公式顯示,看漲期權的
價值必須等於複製組合的淨投資值。
入 h 數量的股票,賣出一份看漲期權,即可構造出一個固定價值為 B 的對沖組合。我們用 h
票數量。
假設在某一時段,股票價格的變動只是簡單地以一個確定的比率上漲或下跌,即簡單的
單期二叉樹過程。例如:假設在 t=0 時刻,股票的即期價格為 100(S) ,在 t=1 時刻,股
價如果上漲,則為 115(上漲比率為 1.15);股價如果下跌,則為 95(下跌比率為 0.95)。
如果期權在 t=1 時刻的執行價格為 100,那麼在到期日,期權的收益要麼為 15(股價上漲) ,
要麼為 0(股價下跌),見圖 9.1。
注意,目前並不知道股票上漲或下跌的概率。但是,如果買入 0.75 份的股票,而賣出
1 份看漲期權,這個對沖組合將得到一個確定的收益 71.25(上漲時為 0.75×115-15;下跌時
為 0.75×0.95)。由於組合的價值不依賴於股票的最終價格,即它是無風險的,因此該組合在
這個時段必須獲得無風險收益,如 5%。所以將 t=1 時刻的收益折現到 t=0 時刻的折現因數
應為 1 1.05 。使淨投資運算式(0.75*100-c)與折現收益( 71.25 1.05 )相等,可以求得期
圖 9.1 股票價格變動的單期二叉樹模型
因此,對沖比率為測量期權價格變動相對股票價格變動的比率。
圖 9.2 股票、看漲期權及對沖組合在單期二叉樹模型中的符號表示
9.4 風險中性定價
對沖組合的存在使得我們可以運用風險中性定價方法來計算期權價格。在風險中性的世
界裏,所有的投資者都對風險無所謂,因此所有的資產(並不限於布萊克-舒爾斯分析中的
對沖組合)可以通過對其預期收益折現來定價。注意,這裏並沒有說所有資產的風險都是相
同的,或者真的無風險,只是說在採用這種定價方法時可以假設投資者是風險中性的。
在風險中性的世界裏,期權的價格等於其預期收益按無風險利率折現的現值,即:
更加清楚地看出這一點:
上面方括號中的運算式就代表期權的期望收益。 N ( d 2 ) 則表示期權在風險中性條件下被執
行的概率。
在接下來的章節中,將會不斷出現有關風險中性條件下的期權價格計算。例如,在第
10 章,二叉樹將會提供一種計算期望收益的結構,而在第 12 章,蒙特卡羅模擬和數值積分
技術都提供了計算期望收益的代替方法。
9.5 風險中性定價的單期二叉樹模型
前面已經討論了在風險中性條件下的定價問題,當時只簡單地假設股票的變動是單期二
叉樹過程。在風險中性條件下,所有的資產都有相同的期望收益,因此股票和債券的期望收
益相同。然而,債券可以帶來確定的固定收益,比如說 5%,而與股票的收益無關。假設股
價上漲時股票的收益為 15%,而股價下跌時收益為-5%。接下來就是要找到股價上漲和下跌
的隱含概率,使得股票的期望收益與債券相等。
資產的期望收益是其各種可能收益的加權平均,記股價上漲的概率為 p,則股票的期望
收益為:
(15%) p + (−5%)(1 − p )
結果取決於 p 值的大小。如果假設 p=0.5,則股票的期望收益為 0.5,正好與債券相同。我
們稱此時的 p 值(0.5)為風險中性下的隱含上漲概率。
結合圖 9.2 中的符號,如果股票在 t=0 時刻的價格為 S,而在 t=1 時刻,股價上漲時為
uS,概率為 p;股價下跌時為 dS,概率為 1-p,則股票在 t=1 時刻的期望收益為:
uSp + dS (1 − p )
其中 u 和 d 分別為股票價格的相對變化量。如果單期的無風險利率為 r,則根據風險中性定
價,可以得到:
隱含概率為 p = [exp(rτ ) − d ] [u − d ] 。)
得到了隱含概率(implied probabilities)後,就可以利用它們求其他資產進行風險中性
定價。看漲期權的價格其實就是期權加權平均收益的現值(或折現值) 。如果期權的執行價
格為 100,則股價為 115 時收益為 15,而股價為 95 時收益為 0。因此,該期權的期望收益
為 0.5×15=7.5。用無風險折現因數對其折現(使用前面提到的單期折現因數 1 1.05 )
,可以
得到期權的價格為 7.14,這與前面用對沖組合得到的結果一致。
風險中性定價方法適用於所有資產,而不僅僅是無風險資產。相應的股票現值為[(115)
×0.5+(95)×0.5]=100.0。
很明顯,多期二叉樹是對單期二叉樹方法的改進,它會給出一個更精確的股票終值
( ST )
,也更加接近股票價格的分佈。例如,如果期權的有效期是三個月,那麼一個兩期二
叉樹將有三個不同終值,一個九期二叉樹將提供十個不同終值,即 n 期二叉樹將提供(n+1)
個不同終值。對於一個九期二叉樹,每期代表 1/3 個月。我們需要知道二叉樹每期時段的長
短,股票價格向上(或向下)運動的概率,以及價格在經過九期變化後的累積效果是否與我
們假設的股價分佈模型一致。終值服從二項概率分佈,當期數增加,離散的二項分佈將逐步
接近連續的正態分佈。增加期數的目的是為了用二叉樹模擬前面提到的隨機過程,也就是假
設股票價格服從的幾何布朗運動。
通過對某一時段股價變化建模,可以用一個多期二叉樹來模擬布萊克-舒爾斯方法中的
正態分佈。由於該方法廣泛地用於對各種期權定價,因此二叉樹定價的基本方法將在下一章
做深入分析。
9.6 期權平價關係(
期權平價關係(Put-Call Parity)
)
前面的布萊克-舒爾斯公式計算的是看漲期權價格。和看漲期權一樣,也有看跌期權,
它提供一種在到期日能夠以執行價 X 出售資產的權利。在經過時段 T 後看跌期權的收益為:
max( X − S T ,0)
歐式看漲期權和看跌期權(僅能夠在到期日執行)之間存在一種非常有名的關係,被稱為看
漲期權和看跌期權的平價關係,如果看漲期權和看跌期權的標的股票(當前價格為 S)相同,
且執行價也相同,則有關係式:
c + X exp(− rT ) = p + S
其中, p 是看跌期權的價格。右邊看跌期權和股票的組合完全複製了一看漲期權和負債的
組合。這意味著看漲期權的定價公式很容易應用於看跌期權。因此,布萊克-舒爾斯關於看
跌期權的定價公式為(標的股票沒有紅利):
p = − SN (− d 1 ) + X exp(− rT ) N (− d 2 )
注意,看跌期權的對沖比率等於 − ( N ( − d1 )) = ( N ( d1 ) − 1) ,為負值,而看漲期權的對沖比
率是 N ( d1 ) ,為正值。
一般不推薦用兩個不同的公式來計算看漲期權和看跌期權的價格。偏向通過試算表和一
個帶參數‘iopt’的 VBA 函數來計算看漲期權和看跌期權的價格,當參數為 1 時計算看漲
期權,為-1 時計算看跌期權,這比複製看漲期權公式,然後作微小修改得出的看跌期權公
式要好一些。
9.7 紅利(
紅利(Dividends)
)
初期的布萊克-舒爾斯公式並不考慮紅利,但是默頓擴展了這個公式,將紅利納入考慮
範圍,並用於給其他期權定價,如外匯期權等。默頓在模型中將紅利處理成一個連續的年紅
和 d 2 的運算式也作相應的修改。
在風險中性條件下,沒有紅利收入的股票只能得到無風險收益 r。如果股票有紅利,它
的總收益仍然為 r,但是該收益被分為兩部分,(r-q)為股票價格收益,q 為紅利收益。紅利
將降低看漲期權的價值,因為在執行時,部分資產(紅利)已經流失掉了。相反地,紅利會
增加看跌期權的價值,因為在執行時已損耗了資產的一部分價值。
9.8 美式期權的特徵
美式期權能夠在到期日或到期日前的任何一天執行。這使得二叉樹方法更能滿足實際需
要,因為它可以很方便地處理期權提前執行的問題。而布萊克-舒爾斯公式則只能給歐式期
權定價,因為它處理不了提前執行的問題。
提前執行是否能提高期權的價值,這取決於紅利。例如,即使標的股票沒有紅利,提前
執行美式看跌期權也是合理的。這種看跌期權一般會在股價大幅度下跌或利率上漲之後被執
行。而對於沒有紅利的看漲期權,提前執行則是不明智的;但對於有紅利的股票,提前執行
期權則可能會獲得較多的紅利收入。
二叉樹方法在每一個節點上拿歐式期權的價格與立即執行期權所得的回報作比較,這樣
就可以得到美式期權的價格了。因此,二叉樹方法為美式期權提供了一個最理想的執行策
略,關於美式期權定價將在第 10 章的後半部分介紹。
9.9 數值方法
計算統計期望值是所有期權定價數值方法的核心。隨著二叉樹期數的增加,正態分佈與
二項分佈會越來越接近,正是利用這一點,二叉樹方法為揭示布萊克-舒爾斯公式背後的原
理作出了重要貢獻。利用二叉樹對股票價格運動過程建模,能夠計算期權有效期內所有中間
節點的收益。然後結合期權定價過程的“倒推(backward)”特性,就很容易為美式期權
定價了。實際上,二叉樹方法是準確並有效地為美式期權定價的基礎。第 10 章將集中介紹
二叉樹理論,包括構建樹的不同方法,如何利用二叉樹為期權定價,以及以布萊克-舒爾斯
公式為基準,測試不同樹的準確性。
二叉樹方法還可以看成是一種有效生成股票價格運動軌跡的方法。雖然,二叉樹丟失了
一些資訊(例如,丟失了一些特殊的運動軌跡),但大大提高了效率。
對於依賴路徑的期權,還可以用一些其他的數值方法,最典型的是蒙特卡羅模擬。對於
標準期權,蒙特卡羅模擬用服從正態分佈的隨機變數來生成到期日的股票價格。與標準期權
的二叉樹方法相比,蒙特卡羅模擬的效率較低,因為它需要用亂數類比大量路徑(為了提高
樹 的 精 確 度 )。 可 以 在 類 比 時 使 用 ‘ 對 偶 變 數 ( antithetic variates ) ’ 或 ‘ 准 隨 機
(quasi-random)’數來提高效率,後者尤其有效。而對於更加複雜的期權,蒙特卡羅類
比需要記錄所有路徑上的中間股票價格,這樣就可以為奇異期權(此類期權的收益由標的資
產價格運動的特殊路徑決定)定價。第 12 章將集中討論蒙特卡羅模擬。
數值方法將布萊克-舒爾斯分析的應用範圍從歐式期權定價擴展到美式期權定價(用二
叉樹方法) ,並進一步到路徑依賴期權定價(用蒙特卡羅模擬) 。自 80 年代中期以來,個人
電腦的處理能力得到迅猛發展,使得試算表如 Excel 能夠利用內嵌函數計算累積正態分佈的
概率。第 10 至 13 章中試算表的所有分析解幾乎都能立即算出。例如,第 10 章的二叉樹定
價(即使有 1000 期)結果能夠在 15 秒內得出,而一個計算標準期權價格的蒙特卡羅模擬
(10000 次試驗)使用 Excel 也不到 45 秒。對絕大多數標準期權來說,二叉樹方法(特別
是使用萊森和賴默方法)和蒙特卡羅模擬都能為其準確而有效地定價。
9.10 波動率和非正態股票收益
有關期權定價的最後一章(第 13 章)將集中討論波動率,它是定價時要考慮的最重要
因素,還將討論當前處理非正態分佈的方法。
布萊克-舒爾斯公式中,唯一沒有直接給出的參數是股價未來的波動率。儘管可以用股
價的歷史資料給出未來波動率的一個預測值,但未來波動率的資訊應該隱含在期權的市場價
值中。因此可以通過布萊克-舒爾斯公式反推得到。隱含波動性是指能使布萊克-舒爾斯期權
價格與期權市場價格相等的波動水準。因此,期權交易與波動率關係密切。如果交易者認為
真實波動率將大於隱含波動率,那麼他會認為期權價格被市場低估了(反之亦然) 。
布萊克-舒爾斯公式建立在股票對數收益服從正態分佈的基礎上。但由於偏度和峰度的
存在,實際股票收益的分佈與嚴格的正態分佈有所偏離。這會影響二叉樹定價的精度。第
13 章將提出一些方法來解決非正態分佈的問題,特別是魯賓斯坦方法,它採取標準二叉樹
來處理非正態問題。
小結
看漲期權是一種以協議執行價買入資產的權利。而看跌期權則是一種以協議執行價出售
資產的權利。歐式期權只能在到期日執行,而美式期權可以在到期日及到期日之前的任意時
刻執行。
股票期權的價格取決於標的股票的當前價格、執行價格、到期日、股價波動率,以及無
風險利率(和期權到期前的紅利)。
單期二叉樹模型是最簡單的期權定價方法。採用複製投資組合的方法,可以得到對沖比
率和期權價值。無須對股價上漲或下跌的概率作任何假設。
布萊克-舒爾斯定價公式給出了歐式期權定價的解析解,它假設股票的對數收益服從正
態分佈。
在布萊克-舒爾斯分析中,需定價的期權與一定數量的股票構成對沖投資組合。對沖比
率確保該組合是無風險的,期權價值的變化將完全抵消股票價格的變化。
布萊克-舒爾斯期權定價分析同樣可以用來計算‘隱含’或‘風險中性’概率,從而使
風險中性定價成為可能。利用這些概率,期權的價值等於它期望收益(在風險中性條件下)
用無風險利率折現的現值。
參考文獻
Black.F.,1989,”How We Came Up With The Option Formula”, Journal of Portfolio
Management,Winter,4-8.
Bodie,Z.,A.Kane and A.J.Marcus,1996,Investment,3rd edition,Richard D.Irwin,Englewood
Cliffs,NJ.Hull,J.C.,2000,Options,Futures and Other Derivatives,Prentice Hall,New Jersey.
第 10 章 二叉樹
最初引入二叉樹是為了提供一種簡單的方式來理解布萊克-舒爾斯分析。在布萊克-舒爾
斯分析中,通過用二項分佈近似對數收益的正態分佈,可以方便地利用二叉樹給股價過程建
模。
在風險中性的條件下,可以通過構建對沖組合來為期權定價。這時需要計算期權收益的
期望值。用三種不同的方法來構建二叉樹(使用不同的參數),並將它們作對比(用提出者
的名字命名:JR 樹,Jarrow 和拉德;CRR 樹,考克斯,羅斯和魯賓斯坦;LR 樹,萊森和
賴默) 。每種方法的價格相對變化量及其概率都是不同的。先以歐式期權為例,用 JR 樹給
其定價,然後介紹有名的 CRR 樹。在討論完二叉樹定價計算的值近似收斂於布萊克-舒爾斯
期權價格後,再簡要介紹 LR 樹。選擇不同的參數組合似乎很困難,但選擇最佳參數會比其
他參數有效的多。通過用不同模型對歐式期權定價發現,利用 LR 樹計算出的價格與由布萊
克-舒爾斯公式得出的值很接近(即使在期數很少的情況下)。
二叉樹因能為美式期權定價而出名,美式期權可以在到期日前(包括到期日)的任意中
間時刻執行。這裏將演示怎樣改進 CRR 樹使之能對美式期權定價。赫爾(2000)教科書在
第 9 章以及第 16 章前面部分介紹了用二叉樹方法給歐式和美式期權定價的相關背景知識。
但是它完全基於 CRR 樹。
10.1 二叉樹介紹
二叉樹是前面介紹的單期二叉樹的擴展。例如,如果一個樹有九期,在每一期股價都有
向上或向下運動兩種可能,則它的最終位置將由這些向上或向下運動的序列決定。股價從最
( )
初值到終值,共有 512 = 2 條路徑,雖然只有一條路徑到達股價的極值節點(即股票最高
9
N (d1 ) 和 N (d 2 ) 的精確二項估計值。因此在到期日股票價格樹總是以執行價為中心,並且
消除了在其他兩種方法中,隨著期數的增加,期權價值不完全收斂的問題。因此,LR 樹可
以看作是樹方法中的布萊克-舒爾斯分析。
OPTION1.xls 工作簿中包含了二叉樹方法的實現過程。通過一些小型價格樹例子來演
示三種方法的計算過程。這些實現都是基於 VBA 函數的,它們還可以為那些不需要在表格
中顯示中間節點的大型樹定價。
10.2 簡化的二叉樹
價經過九期變化得到的 10 個不同終值。這些值是用前面的九期價格變化量相加得到,每期
變化量都是 1/3。每個終值的實際概率可以用二項分佈計算得到。參數的選擇(股價變化幅
佈)。這樣,就可以用一個簡單的離散二項隨機遊走模型的極限——連續隨機過程來對股票
價格進行建模了。
= IF ($ A18 < C $8, OFFSET (C18, 0, −1) − $C $5, OFFSET (C18,1, −1) + $C $5)
在條件運算式之後,第一個運算式表示如果價格下跌,將比它最近的左單格(同一行中)的
數值少 1/3(在單格 C5 中)
,如果價格上漲,那麼將比其相鄰對角線上的值多 1/3。OFFSET
函數指向相對位移的(先沿行,後沿列)的單格。
既然價格上漲和下跌的概率相等(因此,所有上升下降序列出現的概率相等) ,那麼基
於二叉樹的概率分佈可以由到達終值節點的路徑數決定。在單格 C22 中,給出了路徑的數
量(見圖 10.2),所用的公式為=COMBIN($C$4,C22),其中$C$4 是二叉樹的期數,C22
是價格向上運動的期數。在單格 I22 中給出了其概率,公式為=G22*($C$6^$C$4), $C$6
這個例子是為下一節的 JR 樹打基礎,它為股票價格運動過程建模,從而得到期權的收
益。這裏有兩點需要修正:首先股票價格的變化量是一個乘數,而不是一個加數,另外,需
要重新調節終值節點的範圍(在此均值為 0,方差為 1),使之匹配股票收益的要求回報率
和波動率。
10.3 JR 二叉樹
在 JR 樹中,股價運動過程兩項組成,第一項是風險中性的漂移項(drift term),第二項
則是基於簡單二叉樹波動率(volatility)的波動項。漂移項已由 Jarrow 和拉德決定,並且股價
上漲和下跌的概率相等,這能夠確保在風險中性的世界中股票具有(r-q)的期望回報率。
JR 樹的參數可以表示為:
S i , n = u i d n −i S
這個公式具有遞迴性。因此,每一期的新股價僅僅依賴於前一期的股票價格和價格變化乘
下公式:
=IF($A30<C$20,$G$10*OFFSET(C30,0,-1),IF($A30=C$20,$G$9*OFFSET(C30,1,-1),""))
這個公式與上一節使用的公式非常相似,只是價格運動乘數 G10(下跌)和 G9(上漲)是與
前項相乘的。由於在單格中使用了嵌套條件語句 IF,因此公式可以處理第三種可能性,將
對角線上方的單格($A30>C$20)填充為空值“”。拷貝 C30 中的公式就可生成餘下的樹
節點(並能擴展為更大的樹) 。通過觀察偶數期的中間單格(D29,F28……) ,你能看到 JR
但這個條件通常滿足]
由於討論的是歐式期權,因此僅僅需要關心股價的終值,即 K 列中的數值。可以用下
面的公式得到看漲期權對應於每個終期價格的收益:
最後兩項給出了任一序列的概率( 1 2 9 )
,COMBIN 函數給出了每一個看漲期權收益的路徑
數。於是 10 個終期收益及其相關概率如下:
狀態 9 8 7 6 5 4 3 2 1 0
期權收益 60.1646.2033.4921.93 11.41 1.84 0 0 0 0
概率 0.0020,0180.0700.1640.2460.2460.164 0.0700.018 0.002
期權收益的期望值是各個收益的加權平均,並用無風險利率折現得到風險中性定價。因
此,單格 G15 中折現後期權價格的公式為:
=EXP(-D6*D12)*SUMPRODUCT(K35:K44,K49:K58)
其中,EXP(-D6*D12)是基於 0.5 年無風險利率的折現因數。
因此,用九期 JR 樹得到的看漲期權價格為 9.75(比較圖 10.3 中單格 G17,由布萊克-
舒爾斯公式得到的價格為 9.73)。幸運的是,隨著期數的增加,由 JR 樹得到的期權價格收
斂於布萊克-舒爾斯價格(這部分內容將在 10.6 中討論)。順便說一句,G17 中的布萊克-
舒爾斯價格是通過用戶定義 VBA 函數 BSOptionValue 得到的,代碼放在 Module1 模組中。
關於程式的解釋將在第 11 章提到,那時將詳細討論布萊克-舒爾斯公式的細節問題。
期權標的股票的 JR 價格樹由以下的 10 個值組成,並附有其相關概率:
狀態 9 8 7 6 5 4 3 2 1 0
股票價
155.16141.20128.49116.93106.41 96.84 88.12 80.20 72.98 66.41
格
概率 0.002 0,018 0.070 0.164 0.246 0.246 0.164 0.070 0.018 0.002
股票收益近似服從對數正態分佈。利用表中的價格和概率,很容易算出分佈的一階矩 M1 和
二階矩 M2(見單格 K9 和 K10)。通過 M1 和 M2,可以利用公式(見 7.7 節)計算股票對
數價格(服從正態分佈)的均值和方差(M 和 V)。這些矩的值放在圖 10.3 的 K 列中,M1
和 M2 是用區域 K21:K30 中的股票終期價格計算得到的,而 M 和 V 則利用公式計算得到。
可以將 JR 樹得到的結果與布萊克-舒爾斯公式要求的股票對數價格的均值和方差作比較。
可以看到,理論價格與利用二叉樹方法得到的價格相當吻合。
通過驗證可以知道,M1(股票價格的均值)是從 S=100 開始,以增長因數 1.02531
增長的,這個增長因數等於 exp[(r-q)T]。
JREuro 模型同樣能為看跌期權定價。只要將 D16 中“iopt”參數賦值為-1,那麼看漲
期權就會變成看跌期權。股價樹與原來的一樣。但期權收益在股價跌倒執行價 X 以下的情
況下才等於 0。通過引入一個參數(iopt=1 代表看漲期權,iopt=-1 代表看跌期權)
,可以將
看漲期權和看跌期權的收益公式合併為同一個運算式:
10.4 CRR 樹
ln u = σ δt ln u = −σ δt
這些參數反映期間 δt 內的股票價格變化波動率,但不是整個期間的變化波動率。在圖 10.5
的單格 G9 中,計算 u 的公式為:
=EXP(D13*SQRT(G6))
在 G10 中,d 的計算公式為 1/u。
10.5 二項分佈近似與布萊克-舒爾斯公式
二項分佈近似與布萊克 舒爾斯公式
迄今為止我們注意到,在試算表中,使用二叉樹和布萊克-舒爾斯得出的期權價格非常
接近。CRRTheory 表進一步揭示兩者之間的關係,它顯示了怎樣用一個離散的二項分佈來
替代連續的正態分佈 N(d)。這種分佈近似可應用于歐式期權。其中要用到一個‘互補的
(complementary)’二項分佈函數 Φ ,它等於 1 減去通常的二項分佈函數。布萊克-舒爾
斯公式中的每一格 N(d)都可以用互補二項分佈函數 Φ 替代。
圖 10.7 中顯示的是與前一章相同的歐式看漲期權,但定義了兩個新的參數。資料 a
(E14)表示為使股票價格最後處於‘實值狀態’的最小上漲次數,也就是最終股價應大於
X 的次數。在圖 10.6 中(特別是單格 K26) ,可以清楚地看到四次上漲可以得到最終股價
95.40,它大於執行價 95。實際上,E14 中的數值 4 由考克斯和魯賓斯坦給出的公式計算得
到。
p ' = pu exp [ (r − q )δ t ]
其中 exp[( r − q )δt ] 的值在單格 E8 中給出。
到現在為止,所有的二叉樹都限制在九期範圍內(考慮到空間的大小)。但我們感興趣
的是,當到期時間固定而期數增加時,由二叉樹得到的期權價格是否更準確。在不重新建立
大型二叉樹的情況下,一個簡單的方法是使用前面提到的,並在表 CRRTheory 中演示過的
簡單期權定價公式。在期數不斷增加的情況下,將這個公式計算的結果與布萊克-舒爾斯期
權價格作比較,從而研究這個模型的收斂性。
下面用一張模擬運算表來說明,分別用不同期數(B15)的簡單 CRR 期權定價公式(B17)
和布萊克-舒爾斯公式(B20)來計算期權的價格,然後用圖形將結果顯示出來。如圖 10.8
所示。
在區域 J4:L12 中建立模擬運算表的具體操作如下。例如,在 K4 中輸入公式=B20,
在 L4 中輸入公式=B17。在單格 J5 至 J12 中輸入不同的期數,從 16 到 128,增量為 16。
然後建立類比運算表,表格區域設為 J5:J12,列輸入單格設為 B5,於是就得到表格資料。
然後在 XY 圖中畫出模擬運算表的輸出結果,就能看出隨著期數的增加,CRR 二叉樹計算
出的期權價格在布萊克-舒爾斯期權價格附近振盪。
期權價格隨著期數的增加而上下振盪,這種情況在 JR 樹中也能看到,其產生的原因是
二叉樹的參數沒有與期權執行價相聯繫。而當執行價格和初期股票價格一致時(也就是 B5
變為 100),就不再是振盪了,而是單調收斂。單這僅僅是一個特例。
對於任意給定的期數,存在唯一的二叉樹來描述股價運動過程。隨著期數的增加,執行
價格相對節點位置會不斷變化。這將改變二叉樹近似價格和真實布萊克-舒爾斯價格之間誤
差項的符號。
10.7 LR 樹
計算公式為:
=PPNormInv(G8,D15)
d = b(1 − p ') (1 − p )
改變執行價格 D5,並檢驗試算表中修正後的樹,可以看到股價樹在到期日確實以 X 為中心。
選定參數後,LR 的定價過程就與其他二叉樹模型一樣了(見圖 10.10) 。先計算期權收
益,然後對其折現並求期望值,就得到期權的價格。在本例中,LR 樹給出了歐式看漲期權
的價格 9.724(G15),這個結果與布萊克-舒爾斯期權價格 0.726(G17)非常相似。
【參照書中第 178 頁的圖 10.10】
由於二叉樹定價模型不僅可以處理在到期日執行的情況,也可以處理在中間節點執行的
情況,因此,它是為美式期權定價的重要數值方法。對於美式看跌期權來說,提前執行常常
會增加看跌期權的價值。表 CRRTree 既可以為歐式期權(不能提前執行)定價,也可以為
美式期權(可以提前執行)定價。計算結果很容易作比較。
為了演示,假設 CRRTree 表中的期權是看跌期權,也就是給 D16 賦值-1。圖 10.13 顯
示,不能提前執行的看跌期權價格為 2.40(H15),而可以提前執行的期權價格為 2.54(H17)。
即使在沒有紅利的情況下,能夠提前執行仍然對看跌期權有好處。由於布萊克-舒爾斯公式
只適用于歐式期權,因此它只能作為歐式期權定價的基準。
Option Payoff:期權收益
圖 10.14 中 49 行到 58 行給出了這些期權收益。假設不能提前執行,相關的期權收益
都在第九期實現(K49 到 K58 中) 。通過計算期權的期望收益,並用無風險利率折現得到的
價格,就得到這種歐式看跌期權的價格。如前所述,歐式看跌期權的價格為 2.40(H15) (見
圖 10.13)。
為了給美式期權定價,不僅需要知道在第九期執行時收益,還需要知道中間任一階段的
期權收益。可以用終期期權收益(K 列,圖 10.15)計算第 8 期的期望期權價格,記住要用
無風險利率對其折現。計算期望值時使用 CRR 概率以確保風險中性的假設成立。將第 9 期
上式先計算期權收益的期望值,然後將其折現到前一期。這種計算期望收益並將其折現的過
程被稱為“逐期倒推(stepping back)”過程。
雖然對於美式期權而言提前執行是可能的,但實際上,如果股票的紅利為 0,對於看漲
期權來說是不值得提前執行的。然而,如果看漲期權的標的股票有紅利,則提前執行是可能
的。作為練習,將上面的看跌期權改為看漲期權,然後求出在紅利為多大時,提前執行才有
價值。可以發現,只有在紅利相當大的情況下,美式看漲期權和歐式看漲期權的價格才會出
現明顯的差異。
OPTION1 中有一些用戶定義函數的代碼,它們實現了本章討論的大多數二叉樹期權定
價計算。採用 CRR 樹和 LR 樹為期權定價的主要函數放在 Module0 中。其中最重要的公式
有 CRRTheory 表 中 用 到 的 BinEuroOptionValue 函 數 , 以 及 Compare 表 中 用 到 的
BinOptionValue 函數。
在二叉樹用於存放期權收益的陣列中,我們讓陣列元素從 0 開始編號(而不是常用的
1),二叉樹的起始期數也是從 0 開始的,這些規則通過 VBA 模組頂部的 Option Base 0 語
句中設定。另外,我們將模組頁命名為 Module0。
BinOptionValue 函數可以分別用 CRR 二叉樹(imod=1)和 LR 二叉樹(imod=2)為
美式或歐式期權定價。代碼很容易讀懂,只需設定期權的類型(如果是歐式看漲期權,則 iopt
=1,iea=1)以及定價方法(如 CRREuro 表中演示的 CRR 樹)就可以了。定價過程中反
復將向量陣列 vvec()定義成有十個元素的 Variant 類型,元素從 vvec(0)到 vvec(9),並用語
句 ReDim(nstep)來設定維數。
股價樹的終期期權收益通過下面公式得到:
小結
二叉樹提供了一種實用的方法來為股價運動過程建模。終期價格的離散分佈可以用布萊
克-舒爾斯分析中假設的連續對數正態分佈來近似。
用二叉樹為股票期權定價,先要計算期權的收益期望值(用風險中性概率為每個期權收
益加權),然後利用無風險利率對其折現。
二叉樹定價的高效性(相對于蒙特卡羅模擬)來自於股價樹中多條路徑的重組。
通過選擇不同的參數構建不同類型的二叉樹(例如 JR 樹,CRR 樹,LR 樹)。JR 樹中
股價向上和向下運動的概率相等,每一期變化的幅度中包含有漂移項和波動項。CRR 樹的
變化幅度可以反映波動率,但沒有與均值有關的漂移項。為了反映股價的漂移項,需將股價
上漲和下跌的概率設置成不同值,而從保證價格向上漂移(通常情況下) 。LR 樹的終期價格
是以期權執行價為中心的,它的概率和變化幅度參數都很複雜。
用三種不同類型的二叉樹方法對歐式期權定價,其結果表明,LR 二叉樹只需較少的期
數就可以得到與布萊克-舒爾斯期權價格很接近的估計值。
二叉樹方法很容易處理期權提前執行的情況,因此可以用其為美式期權定價。
參考文獻
Cox,J. ,S. Ross and M. Rubinstein, 1979, “Option Pricing: A Simplified Approach”, Journal
of Financial Economics, 7, 229-264
Cox, J. and M. Rubinstein, 1985, Options Markets, Prentice Hall, New Jersey.
Hull, J. C., 2000, Option, Futures and Other derivatives, Prentice Hall, New jersey
Jarrow, R. A. and A. Rudd,1983,Option Pricing, Richard D. Irwin,Englewood Cliffs,NJ
Leisen, D. R. J. and M. Reimer, 1996, “binomial Models for Option Valuation-Examining
and Improving Convergence”, Applied Mathematical Finance,3,319-343
Wilmott, P., S. Howison and J. Dewynne, 1996, The Mathematics of financial Derivatives,
Cambridge University Press, Cambridge.
第 11 章 布萊克-舒爾斯公式
布萊克 舒爾斯公式
儘管二叉樹提供了一種容易理解期權定價原理的方法,但有解析解的布萊克-舒爾斯公
式仍然是歐式期權定價理論的中心內容。它的強大之處在於它是用一個公式來為期權定價,
而且它可以確定複製組合的對沖比率(hedge ratio)。本章將推導布萊克-舒爾斯公式,並將其
擴展到有連續紅利的情況,由此可以為外匯期權和期貨期權定價。還將推導出對沖參數
(hedge parameter),因此,可以創建出一個在股價變化條件下價值不變的對沖組合。
赫爾教科書(2000)的期權部分是第 11 章內容的最好參考教材(第 11 章推導並解釋
布萊克-舒爾斯公式,第 12 章討論在存在連續紅利情況下對布萊克-舒爾斯公式的修正,並
用其對外匯期權和期貨期權定價,第 13 章討論‘希臘參數(greeks)’和 delta 對沖係數)
。
演示不同布萊克-舒爾斯定價公式的模型放在工作簿 OPTION.xls 中,並附有許多有用的定
價函數。
11.1 布萊克-舒爾斯公式
布萊克 舒爾斯公式
[ ]
d 1 = ln( S / X ) + (r − q + 0.5σ 2 σ T
[ ]
d 1 = ln( S / X ) + (r − q − 0.5σ 2 σ T
為了便於解釋布萊克-舒爾斯公式各項內容的意義,可以聯想到看漲期權的複製組合形式,
被執行的概率。
利用期權平價關係,看跌期權在支付連續紅利情況下的布萊克-舒爾斯定價公式為:
p = − S exp(− qT ) N (− d 1 ) + X exp(−rT ) N (− d 2 )
它可以寫成如下形式:
圖 11.1 中是前面用過的看漲期權實例,以及布萊克-舒爾斯定價所需的計算。最初計算
時,常用多項式來近似累積正態分佈概率。現在,可以用 Excel 的 NORMSDIST 函數直接
中。由於它們都是概率值,所以取值範圍介於 0 和 1 之間。
圖 11.1 表 BS 中的布萊克-舒爾斯期權定價過程
單格 E5 中的布萊克-舒爾斯公式為:
=B4*B16*E11-B5*B15*E16
其中,B15 和 B16 中的是兩個折現因數,而 E11 和 E16 中的則是累積正態分佈值,它們都
是計算過程的中間值。E5 中看漲期權的價格為 9.73。也可以用用戶定義函數 BSOptionValue
計算布萊克-舒爾斯期權價格,結果放在 E8 中,相關代碼將在 11.7 中討論。
是 0.9851*0.7291)。期權在風險中性世界裏被執行的概率為 N ( d 2 ) ,即 0.680。
對於相同標的股票的看跌期權,H5 中的布萊克-舒爾斯定價公式為:
=B4*B16*(E11-1)-B5*B15*(E16-1)
看漲期權定價公式的第一項是 N ( d1 ) ,由於正態分佈的對稱性,看跌期權定價公式的第一
項則為 − N ( − d1 ) = N ( d1 ) − 1 。因此看漲期權公式中的 E11 被(E11-1)代替。用同樣的方法
11.3 外匯(
外匯(Currencies)
)和商品(
和商品(Commodities)
)期權
到目前為止,所有的討論都集中在股票期權方面。事實上,基於連續紅利收益的布萊克
-舒爾斯分析框架同樣可以用於為外匯和商品期貨期權定價。我們已經知道,對於連續紅利
收益率為 q 的股票看漲期權,布萊克-舒爾斯定價公式為:
c = S exp(− RT ) N (d 1 ) − X exp(−rT ) N (d 2 )
這就是加曼-科爾哈根公式(加曼和科爾哈根,1983)。圖 11.2 顯示的是 Currency 表中的一
個外匯看漲期權定價例子,它的外匯利率為 4%。期權價格為 0.0044(E11) 。這個例子由
用戶定義函數 BSOptionValue 通過適當的參數計算得到。
圖 11.2 還演示了一種由布萊克(1976)提出的代替方法。他建議將外匯期權的價格用遠期
11.4 計算期權的
計算期權的‘
期權的‘希臘’
希臘’參數
11.5 對沖組合
計算對沖參數是構造對沖組合必不可少的一步。利用前面用於計算‘希臘’參數的看漲
期權,我們來構造兩個零投資對沖組合(zero-investment hedge portfolios)。所謂零投資組
合,是指相對於股價的變化,組合價值的變化非常微小。第一個是 delta 對沖組合,也就是
說,它可以對沖掉股票價格的微小變化(被稱為 delta 風險)。另一個是 delta-gamma 對沖
組合,它用於對沖股票價格的較大變化,此時 gamma 值會發生改變(被稱為 gamma 風險) 。
將看漲期權定價公式(c=hS-B)寫成 0=hS-B-c 的形式,由此可以得到一個零投資組合,
它包括一些借入資金,用來購買一定數量的股票並出售一份看漲期權。由於這個組合是零投
資組合,因此在每一期股價 S 發生微小變化時,這種數量關係必須保持平衡。在 delta 中性
(delta-neutral)的情況下,購買的股票數量必須等於組合中看漲期權的 delta 值。構造 delta
中性組合的目的在於用期權價值的變化來抵消股票價值的變化。
0 = hS − c1 + nc 2
Hedge performance:對沖表現
Portfolio value:投資組合價值
Share price:股票價格
【參照書中第 192 頁的圖 11.7】
11.6 布萊克-舒爾斯公式的正式推導
布萊克 舒爾斯公式的正式推導
由於布萊克-舒爾斯公式在本章中處於中心地位,因此有必要對它的推導(採用尼爾森
方法,1992)作一個簡要的說明。前面已經提到,有連續紅利收益的股票看漲期權定價公
式為:
要得到這個公式,必須假設股票在到期日 T 的對數收益服從正態分佈。這意味著隨機變數 S T
佈變數。
在風險中性概率測度 Q 下,看漲期權的價值等於其期望收益的折現值,即:
µ T = (r − q − 0.5σ 2 )T σT = σ T
即:
Z T = [YT − µ T ] σ T
因此 Z T ~N(0,1)。
這與 N ( d 2 ) 的運算式相同,由此得到布萊克-舒爾斯公式的第二項。
布萊克-舒爾斯公式第一項的期望值則比較複雜,因為條件期望的兩側都有隨即變數
S T 。要推導布萊克-舒爾斯公式,需要用到關於對數正態和正態變數的兩個結論,一個大家
很熟悉,另一個則比較陌生。
E[ S T | S T > X ] = E[ S T ]N (d ) d = V − [ln( X ) − M ] / V
其中 X 是一個數值,N()是累積標準正態分佈函數。條件期望被一個普通期望值和一
V = σ 2T ,因此:
E Q [ S T | S T > X ] = E Q [ S T ]N { V − [ln( X ) − M ] / V }
= E Q [ S T ]N {σ T − [ln( X / S ) − (r − q − 0.5σ 2 )T ] / σ T }
= E Q [ S T ]N (σ T + d 2 )
= E Q [ S T ] N ( d1 )
下一步使用大家比較熟悉的關於對數正態分佈的一個結論:如果 YT 是一個服從正態分
E Q [ S T ] = SE Q [exp(YT )]
= S exp( M + 0.5V )
= S exp[( r − q )T ]
由此可得到布萊克-舒爾斯公式的第一項 S exp( − qT ) N ( d 1 ) 。
在以上的推導中,能夠看出 d1 ( = d 2 + σ T )和 d 2 間的關係。由於期權僅在股價大於執
行價 X 的條件下才會執行,所以這種關係是反映股價分佈被截尾情況下的一種調整,且調
整幅度與股價增量的標準差有關。
11.7 Module1 中的用戶定義函數
。函數 BSDTwo 返回 d 2 值,
X,利率 r,紅利率 q,以年計的有效期(tyr)及波動率(sigma)
輸入參數與前者類似。
將這些‘中間’函數與 BSOptionValue 函數分開編寫的目的,是為了使計算過程更加
還有一些語句用來確保程式能夠識別並截獲一些不合理的資料(如負的股價) ,返回一個錯
誤值(在此為-1) 。
BSOptionValue 函數通過參數‘iopt’來區別看漲期權和看跌期權,值為 1 時處理看漲
期權,值為-1 時處理看跌期權。由於存在期權平價關係,看漲期權和看跌期權的定價公式
除了在符號上有區別外,其他地方都是一樣的。分別為看漲期權和看跌期權定價時,變數
NDOne 和 NDTwo 的符號須作改變,就像定價公式那樣。相關代碼如下所示:
Function BSOptionValue(iopt,S,X,r,q,tyr,sigma)
’ returns the Black-Scholes value(iopt=1 for call,-1 for put;q=div yld)
’ uses BSDOne fn
’ uses BSDTwo fn
Dim eqt,ert,NDOne,NDTwo
eqt=Exp(-q*tyr)
ert=Exp(-r*tyr)
if S>0 And X>0 And tyr>0 And sigma>0 Then
NDOne=Application.NormaSDist(iopt*BSDOne(S,X,r,q,tyr,sigma))
NDTwo=Application.NormaSDist(iopt*BSDTwo(S,X,r,q,tyr,sigma))
BSOptionValue=iopt*(S*eqt*NDOne-X*ert*NDTwo)
Else
BSOptionValue=-1
Endif
End Function
為遠期和期貨期權定價的函數只是 BSOptionValue 函數的改進版本,它需要用變數 rfgn 表
示外匯利率:
Function BlackOptionValue(iopt,F,X,r,rfgn,tyr,sigma)
’ returns Black option value for forwards
’ uses BSOptionValue fn
Dim S
S=F*Exp((rfgn-r)*tyr)
BlackOptionValue=BSOptionValue(iopt,S,X,r,rfgn,tyr,sigma)
End Function
計算每個對沖參數的函數可以直接複製試算表中的公式。有一個複合函數 BSOptionGreeks
可以用來計算所有的對沖參數,以避免一些不必要的重複代碼。它通過 IF 語句來判斷整型
變數 igreek 要求返回的是哪一個參數:
Function BSOptionGreeks(greek,iopt,S,X,r,q,tyr,sigma)
’ returns BS option greeks (depends on value of igreek)
’ returns delta(1),gamm(2),rho(3),theta(4) or vega(5)
’ iopt=1 for call,-1 for put; q=div yld
’ uses BSOptionValue fn
’ uses BSDOne fn
’ uses BSDTwo fn
’ uses BSNdashDone fn
Dim eqt,c,c1,c1d,c2,d,g,v
eqt=Exp(-q*tyr)
c=BSOptionValue(iopt,S,X,r,q,tyr,sigma)
c1=Application.NormaSDist(iopt*BSDOne(S,X,r,q,tyr,sigma))
c1d=BSNdashiDOne(S,X,r,q,tyr,sigma)
c2=Application.NormaSDist(iopt*BSDTwo(S,X,r,q,tyr,sigma))
d=iopt*eqt*c1
g=c1d*eqt/(S*sigma*Sqr(tyr))
v=-1
if igreek=1 Then v=d
if igreek=2 Then v=g
if igreek=3 Then v=iopt*X*tyr*Exp(-r*tyr)*c2
if igreek=4 Then v=r*c-(r-q)*S*d-0.5*(sigma*S)^2*g
if igreek=5 Then v=S*Sqr(tyr)*c1d*eqt
BSOptionGreeks=v
End Function
小結
為歐式期權定價的布萊克-舒爾斯公式可以擴展用來處理有連續紅利收益情況下的期權
定價問題。只需在公式中用 S exp(-qT)代替 S 即可。在實際中,股票並不能提供連續的紅
利收益。但可將其他一些類型的資產近似作為支付連續紅利的股票看待,因此,這種修改後
的版本擴大了布萊克-舒爾斯公式的應用範圍。布萊克-舒爾斯框架同樣適用於為外匯和期貨
期權定價。
期權的 delta 值是期權價格相對於股價的變化率。通過 delta 值,可以構造短期的 delta
中性投資組合。但由於組合的 delta 值會隨時間變化,因此組合中標的股票的頭寸需要不斷
調整以達到新的平衡。
期權價格相對於其他因素的敏感度(如波動率,有效期和收益率等)同樣可以計算得到。
它們統稱為‘希臘’參數,它們對構建對沖組合很重要。
參考文獻
Black,F., 1976, “The Pricing of Commodity Contracts,” Journal of Financial Economics, 3,
167-179.
Garman, M. B. and S. W. Kohlhagen, 1983, “Foreign Currency Option Value,” Journal of
International Money and Finance, 2, 231-237
Hull, J. C., 2000, Options, Futures and Other Derivatives, Prentice Hall, New York.
Nielsen, L. T., 1992, “Understanding N(d1) and N(d2): Risk-Adjusted Probabilities in the
Black-Scholes Model,” INSEAD Working Paper 92/71/FIN.
第 12 章 歐式期權定價的其他數值方法
本章將討論兩種用於為歐式期權定價的數值方法(蒙特卡羅模擬和數值積分(numerical
integration))
。它們可以代替二叉樹方法來計算期望值。但對美式期權,仍建議用二叉樹方
法給標準期權定價。
蒙特卡羅模擬是一種非常成熟的技術,它廣泛運用於各種領域。但對於期權定價來說,
期權定價時, 普通隨機抽樣蒙特卡羅模擬的效率相對較低(特別是與二叉樹方法相比較)。
例如,為了使抽樣誤差減少一半就需要 4 倍數的類比試驗。因此,最近在金融領域出現的
准隨機序列技術(quasi-random number sequences),以及電腦性能的提高,大大推進了
蒙特卡羅模擬的應用。類比方法被認為是為路徑依賴(path-dependent)期權定價的最好數
值方法。關於類比的相關背景資料請閱讀赫爾(2000)書中的期權部分(第 16 章) 。
本章首先用普通蒙特卡羅模擬為歐式看漲期權定價,然後使用對偶變數(antithetic
variates)類比,最後使用准隨機序列進行模擬,並將它們作比較。使用對偶變數的目的是
通過減小類比結果的標準差來提高估計的效率。准隨機抽樣能進一步有效控制模擬結果的隨
機性。這三種方法在 OPTION3.xls 的不同表中實現,第四張表中給出結果比較。
接下來演示數值積分方法。前面已經間接提到過,布萊克-舒爾斯期權定價公式來源於
連續積分。 (正如在第九章中提到的,該公式是通過解一個偏微分方程得到的) 。二叉樹提供
了一種離散近似方法,而在此將使用中值定律更直接地進行數值積分。
12.1 蒙特卡羅模擬介紹
蒙特卡羅模擬介紹
蒙特卡羅模擬進行期權定價的核心在於生成股票價格的隨機過程。9.2 節中,在期權到
期的 T 時刻,標的股票價格的隨機方程為:
ST = S exp(YT ) = S exp( µT + εσ T )
權的收益依賴於 ST 在風險中性世界裏的期望值,因此對於風險中性定價,股票的收益率
的 ST 隨機方程為:
S T = S exp[( r − q − 0.5σ 2 )T + εσ T ]
其中 ε 服從標準正態分佈。上式中的股價運動過程與前面二叉樹定價中的一樣。
蒙特卡羅模擬隨機產生一組股價終值 ST 的樣本值,即類比試驗。然後為每一個樣本值
計算期權收益並記錄下來。產生足夠多的樣本值後,就可以得到期權收益的分佈,通常需要
計算分佈的均值和標準差。模擬試驗的代數平均值常用來估計期權收益分佈的期望值,然後
用無風險利率對其折現來得到看漲期權的價格。
圖 12.1 為 OPTION.xls 工作簿中 MC1 表的一部分,表中歐式期權的有效期是六個月,
其標的資產是連續紅利收益率為 3%的股票。表中有 36 個期權收益的模擬試驗,用它們可
以估計出期權收益期望值的折現。
S T = S exp[( r − q − 0.5σ 2 )T + εσ T ]
為了將其轉換為單格公式的形式,有必要先計算出 T 時刻的風險中性漂移項和波動率,也
=$B$4*EXP($B$16+C22*$B$17)
相應的期權收益為(H22)
:
=MAX($E$4*(E22-$B$5),0)
E4 中存放的是參數 iopt,它用來區分看漲期權和看跌期權。
計算模擬出的 36 個期權收益的平均值,然後折現即可得到看漲期權價值的估計量
(E9)。用於折現的風險中性因數(exp(-rT))放在 B18 中。
圖 12.1 顯示,期權價格的蒙特卡羅估計值(12.85)與布萊克-舒爾斯期權價格有較大
的差異。E10 中,期權價值估計值的標準差(模擬期權收益的標準差除以模擬次數的平方根)
相對較大(這就是蒙特卡羅估計值與布萊克-舒爾斯期權價格有較大差異的原因) 。為了提高
蒙特卡羅估計的準確度,有必要增加模擬試驗的次數。
在 Excel 中按下 F9,就可以產生另外 36 個模擬值,並得到一個不同的蒙特卡羅期權價
格以及相應的估值標準差。對於看跌期權,單格公式同樣適用。將參數 iopt(E4 中)改為
-1,就可以計算看跌期權的蒙特卡羅估計值,可將它與布萊克-舒爾斯期權價格作比較。
12.2 對偶變數(
對偶變數(Antithetic Variables)
)類比
除了增加模擬試驗的次數,另一個提高蒙特卡羅估計精度的方法是使用所謂的‘對偶’
變數。對偶變數方法用一對負相關變數來生成一對負相關類比樣本。如果將每對結果取平均
值,則模擬結果的可變性將比普通隨機樣本小。
將 H 列中的 36 個模擬結果取平均值,然後用無風險利率折現即可得到看漲期權的價值
(B18),如表 MC1 中所示。
MC2 中的情況基本與普通蒙特卡羅模擬一樣。但應該注意,MC2 中蒙特卡羅類比(使
用對偶變數)估值的標準差要比 MC1 表中的小的多。
12.3 准隨機抽樣(
准隨機抽樣(Quasi-Random Sampling)
)模擬
實際應用中,不加控制的隨機變數顯得過於隨機。例如,一個均勻分佈的隨機序列經常
聚在一堆。解決這種聚集現象的方式之一是產生一個隨機序列,使之均勻的分佈於單位間隔
中。准隨機序列以確定的方式提前設定一組數,從而消除亂數的聚集現象。唯一的技巧是在
選擇新數時不要選擇已經入選的資料。用准隨機抽樣意味著樣本估計值的誤差與 1 / n 而不是
1 / n 成比例,n 為樣本容量。QMC 表(用 QMC 表示 Quasi-蒙特卡羅)中顯示了生成准
隨機序列的結果,並介紹一種將其轉化為標準正態變數的改進方法。該方法使用福勒序列而
不是均勻隨序列,並使用了由莫羅提出的修正轉化方法。莫羅將傳統的博克斯-馬勒轉換方
法做了改進,因為一些正態分佈函數的反函數容易打亂福勒序列的均勻間隔。生成福勒序列
並將其轉化為正態分佈變數是通過 VBA 用戶定義函數實現的。這些函數的代碼,以及
Module1 模組頁中的其他用戶定義函數將在 12.7 節解釋。關於福勒序列,需要特別說明的
4
是,為了與實際相符合,福勒序列是從 2 (16)開始的,以避免初始值問題(start-up
。
problem)
在圖 12.3 中,第 22 行的資料為第一次類比試驗的結果,其中 B22 為第一個准亂數,
它在 FaureBase2 函數輸入值為 16 的情況下產生。C22 使用 MoroNormSInv 函數將其轉化
為標準正態變數。股票價格(E22)和期權收益(H22)的計算與 MC1 表中相同,E9 中給
出了期權價值,其標記為‘QMC value’。該估計值為 8.95(標準差為 1.69,見 E10) ,它
與布萊克-舒爾斯公式得到的 9.73 並不是很接近。但在 12.4 節,將看到使用准隨機抽樣方
法的最大好處是,隨著模擬次數的增加,所得的結果收斂於真實資料的速度是最快的。
注意,按下 F9 重新計算時,表中資料沒有變化。福勒序列是完全確定的,而不是隨機
的,因此,名稱‘准隨機’在此顯得並不恰當。因此有必要用不同次數的模擬試驗來得到不
同的 QMC 價格和標準差。
與前面的表類似,該定價同樣適用於看跌期權。只需改變參數 iopt 的值(-1)即可得到
看跌期權的 QMC 估計值,可以將估計值與布萊克-舒爾斯公式所得值進行比較。
准隨機抽樣可以看作是分層抽樣(stratified sampling)的發展。對分層抽樣來說,間
隔將分的更細,並有一定數量的樣本隨機分佈在每個間隔中,故在小間隔內會存在資料聚集
現象。而在准亂數序列中卻沒有任何隨機因素,因為對序列中的每一個值,它的相對位置已
經預先確定。
12.4 模擬方法比較
對於前面提到的三種抽樣方法,隨著模擬試驗次數的增加,觀察看漲期權價值的收斂性
是很有必要的。圖 12.4 列出了模擬次數從 100 增加到 2000 時的對比結果。布萊克-舒爾斯
價格提供了一個基準值(由函數 BSOptionValue 計算得到,位於 F 列)
。G 列中的看漲期權
價值是用控制抽樣法(通過對偶變數)由函數 MCOptionValue 計算得到的。H 列中的資料
則是用准隨機抽樣方法用函數 QMCOptionValue 計算得到的。
大多數教科書都認為估計對沖參數的最好方法是使用有限差分近似(finite difference
approximations),每次近似,輸入參數的一個微小改變,都需要一個額外的類比試驗。這
種方法得到的是一個有偏估計,並且消耗時間。
布羅迪和格拉瑟曼(1996)提出了怎樣在一次模擬試驗下得到直接的順向估計值。這
種估計是無偏的, 且比有限差分近似更快得到結果。用戶定義函數 QMCOptionGreek135
(參數為 igreek)中包含有這些公式的代碼,存放於 Module1 中。函數使用准隨機正態變
數(-qrandns),並調用 FaureBase2 函數以及 MoroNormSInv 函數。可返回 delta 值
(igreek=1),rho 值(igreek=3)或者 vega 值(igreek=5)。
12.6 數值積分
數值積分是另一種眾所周知的可用于期權定價的數值方法。在此只介紹最簡單一種積分
程式,即擴展的中值定律(midpoint rule)。該方法將區間分為一組等寬的間隔(假設寬度
的概率用間隔 h 與該間隔中值的標準正態密度函數值的乘積來近似。用該概率對期權收益
加權平均,就可以得到期權的期望收益。由此可以看出,數值積分的這種形式與二叉樹中期
望值的計算非常相似,只是在這裏使用的是正態分佈函數。
應的期權價值,這兩者的乘積可以期權收益的期望值。
圖 12.7 概率及收益值,二者構成期望收益
上面的例子只是用數值積分方法為簡單的期權定價,它相當的簡單。數值積分真正盛行
的原因是它可以為收益依賴於多種資產的期權定價。
為了方便試算表計算,已經編寫好了用戶定義函數來實現本章討論所有數值方法。12.4
節中已經見過 MCOptionValue 函數和 QMCOptionValue 函數,還比較了兩者的相對收斂速
度。以下主要討論它們的代碼。
MC2 表中的 MCOptionValue 函數使用了一個迴圈結構來進行一系列類比試驗。變數
‘sum’用來存儲期權收益的和,這裏使用對偶變數方法得到兩個股票價格。股票價格依賴
於時間‘tyr’內的漂移項(用變數‘rnmut’表示),以及波動率(用‘sigt’表示)。直接
類比股票對數價格可能速度更快,但為了清楚起見,我們仍然模擬股票價格。代碼的關鍵部
分如下所示:
Rnmut=(r-q-0.5*sigma^2)*tyr
sig=sigma*Sqr(tyr)
sum=0
For i=1 To nism
Randns=Application.NormSlnv(Rnd)
S1=S*Exp(rnmut+randns*sigt)
S2=S*Exp(rnmut-randns*sigt)
payoff1=Application.Max(iopt*(S1-X),0)
payoff2= Application.Max(iopt*(S2-X),0)
sum=0
For i=1 To nsim
qrandns=MoroNormSlnv(Faure1Base2(i+iskip))
S1=S*Exp(rnmut+qrandns*sign)
sum=sum+Application.Max(iopt*(S1-X),0)
Next i
QMCOptionValue=Exp(-r*tyr)*sum/nsim
QMCOptionGreek135 函數使用布羅迪和格拉瑟曼公式計算三個希臘參數(delta,rho,
vega )。 Gamma 不 是 一 個 亂 數 , 它 是 確 定 的 , 可 以 用 前 面 BSOptionGamma 函 數
(OPTION2.xls 工作簿中)中的相同公式計算得到。正如前面提到的,用模擬出的期權價
值,以及 delta 和 gamma 估計值,就可以計算出 theta 參數:
ert=Exp(-r*tyr)
rumut=(r-q-0.5*sigma^2)*tyr
sigt=sigma*Sqr(tyr)
r1=(r-q+0.5*sigma^2)*tyr
iskip=(2^4)-1
greek=0
vg=-1
For i=1 To nsim
Qrandns=MoroNormSlnv(Faure1Base2(i+iskip))
S1=S*Exp(rnmut+qrandns*sigt)
If(igreek=1 And Sgn(iopt*(S1-X))=1)Then greek=greek+S1
If(igreek=3 A nd Sgn(iopt*(S1-X))>=1)Then greek=greek+S1
If(igreek=5 A nd Sgn(iopt*(S1-X))>=1)Then greek=greek+S1*(Log(S1/S)-r1)
Next i
If igreek=1 Then vg=ert*(greek/S)/nsim
If igreek=3 Then vg=ert*X*tyr*greek/nsim
If igreek=5 Then vg=ert*(greek/sigma)/nsim
QMCOptionGreek135=vg
NIOptionValue 函數在一個迴圈內建立股價運動過程,並計算數值積分的和。注意在迴圈後
兩個成份(S 和 h)是如何插入的。
Function NIOptinValue(iopt,S,X,r,q,tyr,sigma,msd,nint)
’ values option using numerical integration
Dim rnmut,sigt,h,sum,zi,payi
Dim i As integer
rumut=(r-q-0.5*sigma^2)*tyr
sigt=sigma*Sqr(tyr)
h=2*msd/nint
sum=0
For i=0 To nint -1
zi=-msd+(i+0.5)*h
payi=Application.Max(iopt*(Exp(rnmut+zi*sigt)-X/S),0)
sum=sum+payi*Application.NormDist(zi,0,1,False)
Next i
NIOptionValue=Exp(-r*tyr)*h*S*sum
End Function
小結
本章以布萊克-舒爾斯歐式期權定價公式為基礎,介紹了另外兩種用於計算期權價值期
望值的方法。
蒙特卡羅模擬從風險中性世界裏的股價運動路徑中抽樣。計算每一條路徑的期權收益,
然後求其代數平均值,最後用無風險利率折現來對估計期權價值。
與二叉樹定價方法相比,蒙特卡羅模擬法得到的估計值誤差較大。蒙特卡羅抽樣必須生
成很多路徑,因為與二叉樹不同,它的路徑不能重組。
可以用減少方差的技術來控制隨機抽樣,如用對偶變數來減少估計誤差。准隨機抽樣以
確定的方式預先設定序列中的數值,它消除了隨機變數中的聚集現象。取樣的方式就像這些
為類比樣本個數。
數值積分法是可用于對期權定價的另外一種方法,當期權的收益依賴于多種資產時,這
種定價方法尤其有效。
參考文獻
Broadie, M. and P. Glasserman, 1996, “Estimating Security Prices Using Simulation”,
Management Science, 42(2), 269-285.
Hull, J. C., 2000, “Options, Futures and Other Derivatives”, Prentice Hall, New Jersey.
Moro, B. 1995, “The Full Monte”, Risk, 8(2), 57-58
第 13 章 非正態分佈和隱含波動率
布萊克-舒爾斯期權定價公式假設對數股價收益服從正態分佈。首先,再次強調該假設
的重要性,即利用對數股價收益正態分佈的均值和方差,可以給出布萊克-舒爾斯公式的另
外一種表達形式。布萊克-舒爾斯公式也可以用對數正態分佈(股價的分佈)的前兩階距
(monments)表示。
應用布萊克-舒爾斯公式時,除了期權有效期內股票收益的波動率外,其他參數都是已
知的。給定波動率一個具體數值,通過公式得出一個期權價值,同樣,對該過程可以進行反
向計算。即,給定一個期權價格的市場觀測值,可以計算布萊克-舒爾斯公式中的隱含波動
率。找隱含波動率(或者 ISD,表示隱含標準差)的過程可以通過手工反復試驗得出,改進
的方法就是讓該試驗過程自動化。這裏將討論確定初值的不同方法,以及通過牛頓-拉夫森
迭代尋找一個較佳的 ISD(隱含標準差)估計值。
理論界常常對期權定價中怎樣允許偏離嚴格正態分佈的情況比較感興趣。我們在此討論
兩種修正,一種是可選擇的分析公式,另一種是可選擇的二叉樹。第一種情況通常設定股價
服從一個逆 gamma(RG)分佈,而不是常見的對數正態分佈;第二種情況保持了股價的
對數正態分佈,但允許對數收益的高階矩(偏度和峰度)與嚴格正態分佈有差異。試驗表明,
對數股價收益是典型的肥尾(峰度大於 3)和偏度現象。
本章最後介紹由期權市場價格產生的隱含波動率曲線,它用於反映對數收益分佈在不同
假設下的波動情況, 而不是用於預測波動率。
除了赫爾(第 17 章)關於波動率曲線的討論外,標準文獻並不沒有本章所討論的專題。
更詳細的內容需要查閱相關的專業論文。然而,工作簿 OPTION4.xls 中的所有計算過程都
編成了用戶定義函數程式。
13.1 非正態分佈假設下的布萊克-舒爾斯
非正態分佈假設下的布萊克 舒爾斯 公式
S exp[(r − q )T ] ,因此關於歐式看漲期權的布萊克-舒爾斯公式可以寫成:
d 2 = [ M − ln( X )] / V = d 1 − V
符號 c( LN ) 表示公式中使用了分佈的矩。
定價公式(對數正態情況下的布萊克-舒爾斯公式)同樣能表示成股價對數正態分佈的矩形
式,即:
c( LN ) = exp(−rT )[ M 1N (d1 ) − XN (d 2 )]
c( RG ) = exp( − rT )[ M 1g1 − Xg 2]
的值為 9.64(H3)
,於布萊克-舒爾斯定價值 9.73 相比。RG 和布萊克-舒爾斯定價之間的差
距只有在期權出現虛值(out of the money),即 S 相對較小時才會比較明顯。為了驗證這
點,可以將 B4 中的股價由 100 降到 75,並注意得出的期權價格。這裏,B17,H17,E20
和 F20 值都需要重新計算,每次計算可通過 F2 和回車鍵實現。
13.2 隱含波動率(
隱含波動率(Implied Volatility)
)
下面,利用布萊克-舒爾斯公式估計市場中不同期權價格的隱含波動率。簡單依靠反復
試驗就可以得到與觀察期權價格相匹配的隱含波動率。有多種不同的實現方法:Excel 的單
變數求解,柯拉多和米勒(1996)近似,馬納斯特和凱勒法(1982)或用戶定義函數,分
別介紹如下。
圖 13.2 中,標準看漲期權的詳細資訊都已列出(B4 到 B12),由用戶定義函數
BSOptionValue 計算的期權價值為 9.73。假設觀測到的該期權市場價值為 15.00, 接下來的
任務是通過一系列 B12 的估計值找到一個與布萊克-舒爾斯定價為 15.00 相匹配的隱含波動
率。可以手工完成,也可以通過 Excel 功能表工具中的單變數求解完成,用單變數求解命令
時,目標單格為 B15,目標值為 15,可變單格為 B12,解得實際的隱含波動率為 41.28%。
以上的單變數求解法可以用一個用戶定義函數 BSOptionISDGoalSeekNR 來複製。該
函數記下每次波動率估計值的當前誤差(運用該估計值得到的期權價格與實際價格的差)和
定價函數相對於波動率的斜率。定價函數相對於波動率的斜率(一階倒數 dc/d σ )與 vega
的作用相同(在 11.4 中討論的一個期權希臘參數) 。使用斜率來提高後續猜測的精確性,此
方法被稱為牛頓-拉夫森方法。在一定的精度要求下,很容易由一個迴圈完成牛頓-拉夫森方
法的編程,直至得到期權價格的觀測值 。BSOptionISDGoalSeekNR 的具體代碼將在 13.5
節中介紹。
柯拉多和米勒(1996)給出了一個用於近似計算隱含波動率的解析公式。首先,把 N(d)
近似地表示成線形函數,並將這個近似的線形函數代入布萊克-舒爾斯公式,與看漲期權價
格觀測值一起得到一個二次方程式。在保持布萊克-舒爾斯公式輸入參數和觀測看漲期權價
格的情況下,解上述方程即可得到一個關於隱含波動率的近似值。我們用柯拉多和米勒方法
解的近似值作為 BSOptionISDGoalSeekNR 函數中牛頓-拉夫森迭代的初試值。
在期權執行價格和股票當前價格比較接近的情況下,這種估計是比較精確的。如果執行
價為 95,期權觀測值為 15,由柯拉多和米勒法得出的值為 41.10%(H4),同樣情況下,
由 BSOptionISDGoalSeekNR 公式得到的結果為 41.28%。然而,對於一些極端的情況,這
種線形近似的方法將失去作用。例中,設置 B12 等於 20%,觀測期權價格 B17 為 7.7。calc1
的值(柯拉多和米勒法的一個中間結果)在這種情況下為負(單格 H9),該近似法無效。
對於這種情況,馬納斯特和凱勒(1982)提出了一種方法,用於給單變數求解(Goal Seek
提供一個有效的初值。這些初值(稱為種子值)是這樣選擇的,要滿足 N ( d1 ) 或 N ( d 2 ) 等
於 0.5,並指出,在有解的條件下,從這個種子值開始計算一定能得到正確的隱含波動率。
對於上述柯拉多和米勒法失效的情況(觀測的期權價格為 7.7)
,可以使用 55.24%作為馬納
斯特和凱勒的種子值,用此作為初值,通過牛頓-拉夫森迭代,可以產生連續改進的隱含波
動率估計值,最終達到正確的結果 9.9%。
13.3 調整偏度(
調整偏度(Skewness)
)和峰度(
和峰度(Kurtosis)
)
研究人員特別關心對數收益比布萊克-舒爾斯公式中假設正態分佈具有更大的高階矩時
的期權定價問題。魯賓斯坦(1998)給出怎樣調整二叉樹,使其產生給定偏度和峰度的分
佈。該方法實現起來分兩步,這裏用圖 13.3(Edge 表的一部分)中關於歐式期權的例子來
說明。首先,利用所謂的埃奇沃思因數產生一個離散分佈(調整後的二項分佈),此分佈具
有給定的偏度和峰度。第二步,利用股價分佈(調整後的二項分佈)和埃奇沃思概率計算期
權收益的期望值。
圖 13.3 在給定偏度和峰度條件下產生埃奇沃思分佈
由於篇幅原因,這裏僅用一個 16 期的二叉樹來說明埃奇沃思期權定價方法。魯賓斯坦建議,
為了達到精確結果,至少需要 100 期。將期數定義為輸入參數,使用用戶定義函數
EdgeworthEuroOption,很容易對期權進行定價。該函數的使用見單元 J36。
13.4 波動率曲線(
波動率曲線(The Volatility Smile)
)
如果將埃奇沃思分佈定價法得到的看漲期權價值與布萊克-舒爾斯定價法得到的價值進
行比較,其結果可以用於說明所謂的“波動率曲線”。波動率曲線是指期權的隱含波動率與
執行價格的函數圖。如果布萊克-舒爾斯公式中關於分佈的假定完全成立,那麼,觀測到的
波動率曲線應該是一條直線。工作簿 OPTION.xls 中的表 Smile 是對該方法的說明,圖 13.6
為 Smile 表的部分內容。
上一節中,利用 16 期埃奇沃思定價法,在峰度偏大,波動率為 20%的情況下得到看漲
期權定價為 9.37。定價結果存於表 Smile 的單格 J10 中,取名 EDGE(S,X, σ )用以標識定
價方法和參數。如圖 13.6 中的單格 J13 所示,在波動率為 18.45%的情況下,布萊克-舒爾
斯公式得到事實上價結果也是 9.37。此隱含波動率(即 18.45%,標識為 EDGE ISD)是在
將期權價格設定為埃奇沃思定價結果值的條件下,由函數 BSOptionISDGoalSeekNR 計算
得到的(單格 J12) 。
因此,兩種不同的假設條件得到了相同的定價結果:服從嚴格正態分佈股價波動率為
18.45%,或對數收益的峰度偏大時,相應的股價波動率為 20.00%。因此,期權觀測值的差
異不僅僅反映了未來波動率估計的差異程度,更多反映了對數股價收益偏離嚴格正態分佈的
程度。
圖 13.7 BS 和埃奇沃思假設條件下的波動率比較
利用埃奇沃思分佈計算不同執行價格下的看漲期權價值(列 G) ,相應的隱含波動率通
過函數 BSOptionISDGoalSeekNR 求得(列 J)
。圖 13.8 即為隱含波動率與執行價格的函數
圖,即波動率曲線。
如圖 13.6 所示,通過選擇適當的偏度和峰度參數值,利用埃奇沃思期權定價法,就能
畫出如圖 13.8 所示的波動率曲線圖。選擇不同的參數值,利用埃奇沃思期權定價法可以畫
出不同形狀的波動率曲線圖。
這裏有兩個函數,強調了布萊克-舒爾斯公式中假設股票收益服從對數正態分佈的重要
性 。 第 一 個 函 數 名 為 LNOptionValue0 , 使 用 正 態 分 佈 的 矩 。 第 二 個 函 數 名 為
LNOptionValue,使用對數正態分佈的矩。
Function LNOptionValue(iopt,M1,M2,r,tyr)
’ returns lognormal option value(iopt=1 for call,-1 for put)
’ uses LNOptionValue0 fn
Dim M,V
M=2*Log(M1)-0.5*Log(M2)
V=Log(M2)-2*Log(M1)
LNOptionValue=LNOptionValue0(iopt,M,V,X,tyr)
End Function
BSOptionISDGoalSeekNR 函數使用柯拉多和米勒估計值作為初始點進行牛頓-拉夫森
迭代(下面程式中用 sigmanow 表示)。當柯拉多和米勒方法失效(sigmanow=-1)時,使
用馬納斯特和凱勒給出的種子值進行計算:
atol=0.0001
sigmanow=BSOptionSDEstimate(iopt,S,X,r,q,tyr,optprice)
’ when above fails,start from Manaster & Koehler seed value
if sigmanow<=0 Then sigmanow=Sqr(2*Abs(Log(S/X)+(r-q)*tyr)/tyr)
Do
fval=BSOptionValue(iopt,S,X,r,q,tyr,sigmanow)-optprice
fdashval= BSOptionValue(iopt,S,X,r,q,tyr,sigmanow)
sigmanow=sigmanow-(fval/fdashval)
Loop While Abs(fval)>atoll
BSOptionISDGoalSeekNR=sigmanow
函數 EdgeworthEuroOptionValue 相對於表 Edge 來說是一個比較綜合的函數,附加了
對概率密度函數的非負(由 PDFnonneg 標識)和單眾數(由 PDFmodes 標識)檢驗。不
滿足時,用格拉姆-查利展開替代埃奇沃思展開。如果檢驗仍不能通過,就返回值-1。
For j=1 To n
xvec(j)=(2*(j-1)-nstep)/Sqr(nstep)
bvec(j)=Application.combin(nstep,j-1)*((0.5)^nstep)
Next j
’ Edgeworth expansion used for pdf
For j=1 To n
xj=xvec(j)
c=1+skewco*(xj^3-3*xj)/6+(kurtco-3)*(xj^4-6*xj^2+3)/24
c=c+skewco^2*(xj^6-15*xj^4+45*xj^2-15)/72
fvec(j)=c*bvec(j)
Next j
it1=PDFnonneg(fvec)
it2=PDFmodes(fvec)
if it1<0 Or it2>1.5 Then
’ use Gram-Charlier expansion for pdf instead
For j=1 To n
xj=xvec(j)
c=1+skewco*(xj^3-3*xj)/6+(kurtco-3)*(xj^4-6*xj^2+3)/24
fvec(j)=c*bvec(j)
Next j
it1=PDFnonneg(fvec)
it2=PDFmodes(fvec)
End if
if it1=<0 Or it2>1.5 Or kurtco<3 Then
’ method fails as pdf has non-negative entries or is not unimodal
ve=-1
Else
’ minor adjustments to fvec and xvec
frvec=PDFrescale(fvec)
xsvec=Xvecstd(xvec,frvec)
另外,還要調整密度函數,並將期權收益期望的折現值作為計算出的二叉樹期權價值。
魯賓斯坦指出二叉樹期數應在 100 以上才能滿足期權定價需要。
小結
在布萊克-舒爾斯期權定價公式中,只有波動率是不能直接測量的。然而,我們可以計
算隱含波動率,即,利用該公式得出期權市場觀測價格時的隱含波動率。可以使用 Excel
提供的單變數求解工具,但更好的方法是直接利用這裏給出的用戶定義函數。
布萊克-舒爾斯公式假設股票價格 S T 服從對數正態分佈,事實上,實證研究表明,該分
佈存在厚尾和不對稱性(即,存在過大的峰度和偏度)現象。魯賓斯坦給出一種方法,即調
整二叉樹法,使之產生具有給定偏度和峰度的分佈。用此方法,可以產生不同的關於股價樹
的離散概率分佈(埃奇沃思分佈),且前 4 階矩相匹配。
雖然正態分佈是期權定價的基礎,但期權交易中仍存在偏離正態的情況。因此,有必要
繪製波動率曲線圖。當股票價格 S T 不服從對數正態分佈時,隱含波動率將偏離由布萊克-
舒爾斯公式給出的值。將波動率作為期權執行價格函數進行作圖,得到的就是波動率曲線圖。
參考文獻
Corrado, C. J. and T. W. Miller, 1996, “A Note on a Simple, Accurate Formula to Compute
Implied Standard Deviations”, Journal of Banking and Finance, 20, 595-603.
Manaster, S. and G. Koehler, 1982, “The Calculation of Implied Variances from the
Black-Scholes Model”, journal of Finance, 37(1), 227-230.
Milevsky, M. A. and S. E. Posner, 1998, “Asian Options: The Sum of Lognormals and the
Reciprocal Gamma Distribution”, Journal of Financial and Quantitative Analysis, 33(3),
409-422.
Rubinsten, M., 1998, “Edgeworth Binomial Trees”, Journal of Derivatives, 5(3), 20-27,
(also see correcton: 5(4), 6).
第 14 章 債券期權定價介紹
由於要處理利率期限結構問題,債券期權定價要比股票衍生證券定價複雜。利率期限結
構描述了利率與債券到期期限之間的關係。利率期限結構是根據市場上不同到期期限債券的
價格估計出來的。這個估計過程比較複雜,因為大部分債券含有一系列的利息支付(一般是
每年兩次)並在到期時支付本金。但是也有一部分債券在發行期間不支付票息,這就是我們
熟知的零息票債券。
在為債券期權定價時,有三種處理利率期限結構的方法:(i)忽略期限結構;(ii)對期限
結構進行建模;(iii)擬合期限結構。債券期權定價從嘗試採用布萊克-舒爾斯公式(第一種方
法)發展到連續利率模型(第二種方法) ,現在更受關注的是擬合期限結構的離散利率模型
(第三種方法) 。
本章內容分為三部分,首先討論利率期限結構以及如何選擇適當的貼現因數為附息債
券現金流定價,然後介紹如何利用一個簡單的利率二叉樹來模擬零息票債券的價格,最後介
紹布萊克債券期權定價公式,此公式忽略利率期限結構,並假設債券未來的價格服從對數正
態分佈。
第 15 章介紹利率模型,主要是 Vasicek 與考克斯,英格索爾和羅斯(CIR)的暫態利
率模型。這些隨機模型產生一組利率,根據這些利率就可以為不同到期期限的零息票債券定
價。這些模型的優點是它們給出了零息票債券期權價值的解析解,由此可以為附息債券期權
定價。
最簡單的形式 Vasicek 模型和 CIR 模型就是一個可能的期限結構,但是這個期限結構
往往跟市場中能觀察的期限結構不一致。第 16 章有關擬合期限結構方面的內容展示了如何
利用二叉樹對利率分佈進行建模,從而正確地給零息票債券定價(也搭建了波動率的期限結
構)。構建了兩個簡單的二叉樹,其中一個假設利率服從對數正態分佈,而另外一個假設服
從正態分佈。構建一個簡單的布萊克,德曼和托伊(BDT)樹。BDT 樹是在簡單的對數正
態樹的基礎上發展而來,並廣受從業者的歡迎,因此可以用它來說明零息票債券期權的定價。
儘管為債券期權定價是一個複雜的過程,但剛開始應該熟悉期權定價。定價的過程中
有兩個重要的部分:根據期權在執行時的收入計算風險中性期望值以及使用數值方法(例如
二叉樹)。
為了使說明更簡單,這裏將期限結構模型局限于單因數模型,並只採用市場上可觀測
的零息票債券收益率和波動率。除了在 BDT 樹的例子中引入離散的利息支付以外,一般假
設利息支付是連續的。
這些模型可以在 Excel 檔 BOND1 和 BOND2 中實現。所用到的 Excel 技巧大部分都是
我們熟悉的,同時還會在附息債券期權定價和構造利率樹的過程中使用單變數求解。由於大
部分公式都比較複雜,因此使用用戶定義函數來實現會更簡單有效,讀者可以在工作簿的
Module 表中找到這些用戶定義函數。
相關內容可參見 Bodie 等人(1996),關於第 13,14 章可以閱讀《債券價格和收益》
以及《利率期限結構》等書籍,還可以參考赫爾(2000)的文章以及《利率衍生品》第 21
章。另外一篇期權的參考文章是克盧洛和斯特裏克蘭(1998)。書中還有部分較新的內容,
包括利用 CIR 模型為債券期權定價(涉及到非中心卡方分佈) 。
14.1 利率期限結構
圖 14.1 零息票債券價格,相應的到期收益率和遠期利率
零息票債券價格可以轉換為相應的零息票債券的連續複利收益率,它們之間有以下的
關係:
p=(1) exp ( − rt )
其中 p 是零息票債券價格, t 是債券的到期期限,債券的面值為 1, r 則是相應的零息收益
率。(這裏用零息收益率代表零息票債券價格暗含的各個期限的利率水準,從 0 時刻到 t 時
刻。)單格公式在 F5 單格中。一系列不同到期期限的收益率組成了所謂的利率期限結構。
例如,一年期的零息收益率為 6.08%,而 10 年期的零息收益率為 6.89%。與一年期的零息
收益率不同,其他的零息收益率跨越了多個時期。
期限結構中的資訊也可以用一系列的遠期利率來表示,如 H 列所示。H6 單格中 6.14 %
的遠期利率表示暗含的第二年的借債利率(一年期) ,它是根據一年期和兩年起的零息票債
券價格算出來的。零息收益率和遠期利率的關係展示在圖 14.2 中(見工作簿的圖表 1) 。這
樣,利率期限結構中的資訊可以通過三種途徑來顯示:利用零息票債券價格,零息收益率和
遠期利率。
Maturity:到期日
圖 14.2 零息票債券價格暗含的零息收益率和遠期利率(圖 1)
14.2 附息債券的現金流和到期收益率
圖 14.3 根據零息票債券價格給附息債券定價並計算到期收益率
利用零息票債券價格(D 列)可計算現金流的現值,而債券的現值是這些單個現金流現
值的簡單加總(在 F 列) 。總和是 0.857(在 F20 單格)
,這一數值應該等於債券的市場價
格。
根據市場價格(H24 中的初始現金支出)和一系列的現金流入(如 H 列所示) ,可以直
接計算附息債券的到期收益率。到期收益率的定義是所有債券現金流(包括初始現金流出)
的內部收益率。它可以用 Excel 中的 IRR 函數直接計算。實際上,IRR 函數返回離散情況
下的債券利率收益率。這個收益率可以轉換為連續複利收益率,如單格 H20 中所列的公式:
= LN(1+IRR(H24:H34))
在 J 列,債券的現金流都是用到期收益率進行折現的,如單格 J20 所示,總和仍然是
0.857。
計算到期收益率並不複雜。但問題是,它是否適合於為債券的現金流定價。當使用到
期收益率的時候,假設不同時刻收到的現金支付都可以用同一個利率進行折現。而且,對於
市場上不同的附息債券,會估計出不同的到期收益率(儘管它們的到期期限一樣)。因此,
最好使用隨期限改變而改變的利率,而這就是所謂的利率期限結構。
14.3 二叉樹
由於債券定價非常依賴於不確定的利率,因此就需要能夠描述利率未來狀況的模型。
和在股票期權定價過程中使用二叉樹描述股票價格的隨機性質一樣,可以構造二叉樹模型來
描述利率的不確定性。債券期權可以通過利率樹來定價。該方法可由圖 14.4 說明。利率樹
中的短期利率(B46:E49 單格)反映了零息收益率在未來四年的情況。第一個時期的利率
為 6.08%(即一年期債券的零息收益率) ,在第二個時期,利率被假設為 7.17%或者 5.11%,
出現這兩種情況的概率相等。如此類推。目標是使得四年期零息票債券的理論價格(A52
單格)與四年期零息票債券的市場價格(D8 單格)對應起來。
在這個簡化的例子當中,二叉樹中的短期利率被假設是已知的,在同一時點以相同的
概率向上或者向下變動(B39 和 B40 單格) 。與股票期權定價的過程相似,這些利率也可以
為現金流定價。 (第 16 章將討論這些利率如何包含了零息收益率波動的假設。這裏假設這
部分分析過程已經完成。)
在第四年年末,四年期零息票債券現金流的價值等於它的面值,無論到時的短期利率
是多少。最終的現金流(在單格 E52 到 E56 中,對應著每一個路徑)在二叉樹相應路徑的
利率下,被折現回原點。
例如,折現到前一個時期,計算公式在單格 D52 中:這裏利用了一個依賴於相應單格
所示利率的折現率(E46)而不像在股票期權定價中使用固定的折現率。複製這個公式,順
著二叉樹往前倒推,就得到四年期零息票債券的價格 0.777。
利用二叉樹為零息票債券定價
這個例子的關鍵點在於:可以構建一個能與期限結構(這裏表現為零息收益率)對應
的利率二叉樹。
14.4 布萊克的債券期權定價公式
第一個對零息票債券期權進行定價的方法是由布萊克(1976)提出的。在期貨期權定
價的章節中(11.3 節)已經提到過這個公式。布萊克假設在期權到期時,這期債券價格服
從對數正態分佈。這使得修正的布萊克-舒爾斯公式可以應用。
在圖 14.5 中,布萊克公式用於為一個四年期的期權(T=4)定價,期權的標的物是面
值為 1,剩餘到期期限為 10 年(s=10)的零息票債券。在單格 B64 中,債券未來的理論價
格是用面值乘上 10 年期與 4 年期零息票債券價格的比值得到的,單格中的公式是:
=B61*(B63/B62)。
期貨期權中的公式是一致的,這樣可以計算得到看漲期權的價值為 0.038。
這裏所說明的布萊克公式只是債券期權定價的一種最簡單的方法,並且它只適用於執
行期限相對於債券到期期限比較短的情況。接下的兩章中,將會介紹更多債券期權定價的複
雜方法。
14.5 久期和凸性
零息票債券把債券價值和到期收益率聯繫起來,因為對於這種特殊的情況,債券的到
期期限與債券現金流的重心恰好對應。久期,即現金流(利息支付和本金支付)現值的加權
平均,代表了債券現金流的重心位置(以年來表示)。對於附息債券來說,債券價值和到期
收益率之間再沒有直接的聯繫。但是,可以通過久期(這裏作斜率或者價值與收益率的一階
導數)和凸性(看作曲率或者價值和收益率的二階導數)去衡量由於債券收益率變化一個單
位所引起的債券價值發生的變化程度。
圖 14.6 計算久期
但是有一點要提醒讀者的是,這種分析假設利率期限結構是平行移動的,但實際的情
況往往不是這樣的,這也是這種估計方法的重要缺陷。儘管存在這樣的問題,但是久期和凸
性仍然被從業人員廣泛使用,這也是本章介紹它們的原因。例如,債券的到期期限為 10 年,
票面利率為 5%,現在的到期收益率為 7.04%(離散利息支付) ,其計算列在表 14.6 中。麥
考利(Macaulay)久期的計算是單個現金流現值(在 I91 單格中)的總和除以債券的現值
(H91 單格中)。也可以通過 VBA 用戶定義函數中 Chua 的債券久期公式 Chua Bond
Duration (Chua,1984)進行計算。而從業人員一般使用修正久期,即麥考利久期除以 1 與
到期收益率的和。當參數 imod 取 1 時 Chua Bond Duration 函數返回修正久期的值(見 B95
單格) 。
下面,我們利用修正久期(B95 單格)和凸性(B97 單格)說明如何估算當到期收益
率發生一定變化時債券價值所發生的變化,見表 14.7。債券凸性的計算比久期要複雜,但
是可以通過用戶定義函數 Black Orszag Convexity(布萊克和 Orszag,1996)進行計算。
B101 單格中的公式假設債券價值變化的百分比等於到期收益率的變化乘上修正久期的負數
後,再加上到期收益率變化的平方與凸性一半的乘積。如果到期收益率增加 0.01(B99 單
格),債券價格會下降 7.06%,到 0.7962(單格 H110,即到期收益率變化為 8.04%後債券
現金流的現值之和) 。這樣,當假設收益率曲線發生平行移動的情況下,久期和凸性能夠很
好的估計債券價值發生的變化。
14.6 符號
稱作零息票債券價格。注意, P ( 0, s ) 也可以看作一個折現因數,這個折現因數等於
小結
本章中,用‘收益率’這個詞描述了一個時間段的年利率。還通過例子說明如何根據
零息票債券的市場價格來計算其收益率。這些收益率又稱為‘零息收益率’,為利率期限結
構估計值。
通常,債券是有中間利息支付的,而它們現在的市場價格反映了預期現金流(包括每
期的利息支付和最後的本金)的價值。過去,現金流的到期收益率(內部收益率)被看作是
一種定價的手段。但是在現在看來,現金流的折現率應該使用零息收益率而不是帶有武斷性
質的到期收益率。
最早的債券期權定價方法是布萊克提出的,這個方法中使用的公式中含有債券未來的
價格,是在原來布萊克-舒爾斯公式的基礎上擴展而來的。然而,這種方法暗含的假設是不
傾向於持有債券,特別是在某些限制的情況下。
為了給第 16 章做準備,我們展示了利率二叉樹如何對應一個給定的期限結構。假設這
樣的利率樹可以建立,那麼它們就是我們所熟悉的數值方法,從而可以為債券期權定價。
參考文獻
Black, F., 1976, “The Pricing of Commodity Contracts”, Journal of Financial Economics, 3,
167-179.
Blake, D. and J. M. Orszag, 1996, “A Closed-Form Formula for Calculating Bond
Convexity”, Journal of Fixed Income, June, 88-91.
Bodie, Z., A. Kane and A. Marcus, 1996, Investments, 3rd edition, Richard D. Irwin,
Englewood Cliffs, Nj. Chua, J. H., 1984, “A Closed-Form formula for Calculating Bond
Duration”, Financial Analysts Journal, May/June, 76-78.
Clewlow, L. and C. Strickland, 1998, Implementing Derivatives Models, John Wiley &
Sons, Chichester.
Hull, J. C., 2000, Options, Futures and Other Derivatives, Prentice Hall, New Jersey.
第 15 章 利率模型
本章主要內容是通過利率模型給零息票債券定價。此方法假定,短期利率的變化可以
通過隨機模型來描述,此隨機模型產生一個零息票債券價格的期限結構。通過利率模型,可
以得到一個零息票債券價格的解析解。Jamshidian(1989)給出了零息票債券價格如何被
用於為零息票債券期權定價,從而進一步為附息債券期權定價。
本章將重點放在兩個主流模型上,分別是 Vasicek(1977)模型與考克斯,英格索爾和
羅斯(CIR;1985)模型。這兩個模型都假設(暫態)短期利率 r 的風險中性過程是隨機的,
並只有一個不確定性來源(單因數)。隨機過程包括漂移和波動率兩個參數,它們只與短期
利率 r 有關,與時間無關。短期利率模型包括好幾個參數,不同參數組合能產生不同的利率
期限結構形狀。
兩個利率模型都有所謂的均值回復性質,即短期利率有回復到潛在利率水準的趨勢。
這個性質是根據市場利率變動形式歸納出來的。兩個模型的不同之處在於對波動率的方法
上。先從 Vasicek 模型開始,然後考慮 CIR 模型。BOND1 檔中的試算表(Vasicek 和 CIR
工作表)有相同的格式,使用同一數值例子。
dr = a (b − r )dt + σ r dz
這樣,在時間增量 dt 過程中,短期利率的微小變動 dr 以 a 的速率回復到均值水準 b 。
第二項波動項包含了不確定性, dz 代表了一個正態分佈,期均值為 0,方差是 dt 。短期利
在給股票期權定價時,基本的方法就是獲得風險中性世界中期權未來收益的期望折現
值。同樣的,股票現在的價格可以對等的看作風險中性世界中它未來價值的期望折現值。將
同樣的原則應用到債券和債券期權未來的收益上。在一個零息票債券期權的例子中,在 s
時刻等於 1 元的價值,其在 t 時刻的對應值可以表示為:
( )
P ( t , s ) = E Q exp − ∫ r ( u )du 1
Q
這裏積分的時間間隔是從下限 t 到上限 s,符號 E 表示風險中性期望。
對於股票期權來說,利率被假設為固定的,因此短期利率積分一項可以拿到期望括弧
數。
對於零息票債券期權來說,模型描述的短期利率公式必須包含在 P ( t , s ) 的期望運算式
中。由於短期利率的不確定性,因此它不能被提到期望括弧的外邊。
在 Vasicek 模型假定下,可以解出積分的解析解,從而給出零息票債券的價格,即:
P ( t , s ) = A ( t , s ) exp − B ( t , s ) r ( t )
這裏 r ( t ) 是短期利率在 t 時刻的值
{ }
B ( t , s ) = 1 − exp − a ( s − t ) / a
({ ( )}
A ( t , s ) = exp ( B ( t , s ) − ( s − t ) ) a 2b − σ r / 2 / a 2 − σ r B ( t , s ) / 4a
2 2 2
)
在 a = 0 的特殊情況中,A 和 B 的運算式可以簡化為:
B ( t , s ) = ( s − t ) 和 A(t , s ) = exp σ r2 ( s − t ) / 6
3
這些數值在試算表中都很容易計算。表 15.1 為從 BOND1 文件的 Vasicek 工作表中摘
錄了部分內容。
Vasicek Model:Vasicek 模型
年的美國一月期國庫券收益率資料估算出來的。
在圖 15.1 的例子中,短期利率的初始值為 6%,而潛在的利率回復水準為 0.0866
(8.66%)
,列在 B6 單格中。模型可以給出相應的零息票債券的價格,從現在到 10 年末的
如圖 15.2 所示,零息收益率的期限結構可以出現三種可能的形狀,主要依賴於 B7 單
格中短期利率的現值。可能出現的形狀包括單調上升(當 r 比 R ( ∞ ) 小時),駝峰和單調下
降(當 r 比 b 大時)
。可以通過改變工作簿中 r 的值來檢驗以上的關係。例如,當調整 B7 的
值為 9%時,這個圖形會顯示單調下降的期限結構,而將 B7 改為 8.05%時,會產生一個駝
峰狀的期限結構。
Vasicek 利率模型的一個缺陷是有時候它會產生負的利率。見圖 15.3 中顯示的例子,
此圖是 B5 單格 a = 0.3 情況下 Vasicek 模型類比的情況。這個問題在 CIR 模型中不會出現。
但是,在轉入 CIR 模型之前,先來看看如何利用 Vasicek 模型為零息票債券期權定價。
Short rate:短期利率
給出了 M 和 V 的具體公式,這兩個公式在債券期權定價中與債券未來的價格有密切的聯繫。
一個歐式看漲期權,其執行價格為 X,執行日期為 T,標的物為 s 年到期本金為 L 的零
息票債券。在 0 時刻,這個期權的價格可以用以下公式來表示:
c = P ( 0, T ) exp ( M + 0.5V ) N ( d1 ) − XN ( d 2 )
其中: M = ln LP ( 0, s ) / P ( 0, T ) − 0.5σ P2
V = σ P2
d 2 = M − ln ( X ) / V
d1 = d 2 + V
σ P = v ( 0, T ) B (T , s )
。而計算波動率 σ P ,M 和 V 需要一些中間的計算
過在 E6 單格改變相應的到期期限來計算)
Jamshidian 也推導出一個更一般的模型為附息債券期權定價。重要的思路就是根據期
權執行期之後的附息債券現金流,將附息債券期權分拆為多個零息票債券期權。對於一個執
行期限為四年,標的物為 10 年期附息債券的期權來說,需要考慮第 5 年到第 10 年的利息
支付以及最後到期的本金支付。在圖 15.5 中,相關的現金流列在 E51 到 E56 的單格中,總
。現在需要找到一個折現利率(比如 r * )
量是 1.30(面值加上執行期之後的六次利息支付)
*
讀者可以確認一下所計算出來的 r (18.30%,見 E46 單格)確實使得債券支付的現值
*
值時使用的是原來的短期利率(這裏是 6%),而不是 r 。
dr = a ( b − r ) dt + σ rdz
這裏的短期利率的波動率 σ r = σ r 隨著短期利率開方的增加而增加。這個模型防止
了負利率的出現(只要參數值滿足關係式 2ab ≥ σ )。
2
P ( t , s ) = A ( t , s ) exp − B ( t , s ) r ( t )
這裏 r ( t ) 是 r 在 t 時刻的值。函數 B ( 0, s ) 和 A ( 0, s ) 的形式稍微有些不同,包含了一個新
附息債券期權執行價格一致。
圖 15.8 展示了定價過程。單格 E47 中的利率是 20.31%,是根據 Jamshidianrstar 函數
計算的。附息債券期權的價值是單個零息票債券期權價值的總和,最後得到的數值是 0.212
(單格 H44 中)。(在 Vasicek 模型中,期權的價值稍微低一點,為 0.206,見圖 15.5。)
下面的函數用到以上函數計算出來的零息票債券價格,計算對數正態參數 M 和 V。後
邊幾行代碼與 OPTION2 檔中的 LNOption Value0 函數相同,零息票價格替換折現因數。
Function VasicekZeroOption Value(iopt,L,X,a,b,rnowyr,optyr,zeroyr,sigma)
‘ returns the Vasicek zero-coupon bond option value
‘ uses VasicekCIRZero Value fn
Dim P0T,P0s,voT,BTs,sigmao,M,V,d2,d1,Nd1,Nd2
P0T=VasicekCIRZero Value (1,a, b, r, nowyr, optyr, sigma)
P0s=VasicekCIRZero Value (1,a, b, r, nowyr, zeroyr, sigma)
If a=0 Then
v0T=sigma*Sqr(optyr-nowyr)
BTs=zeroyr-optyr
Else
v0T=Sqr(sigma^2*(1-Exp(-2*a*(optyr-nowyr)))/(2*a))
BTs=(1-Exp(-a*(zeroyr-optyr)))/a
End If
sigmap=v0T*BTs
M=Log(L*P0s/P0T)-0.5*sigmap*2
V=sigmap^2
d2=(M-Log(X))/Sqr(V)
d1=d2+Sqr(V)
Nd1=Application.NorSDist(iopt*d1)
Nd2=Application.NormSDist(iopt*d2)
VasicekZeroOption Value=P0T*iopt*(Exp(M+0.5*V)*Nd1-X*Nd2)
End Function
下面的函數試圖通過試數法來找出折現利率,使得期權到期後的債券支付現值總和等於
期權的執行價格。由於缺少斜率的計算公式,這裏用另外一個公式代替斜率:
Function Jamshidianstar (imod,L,cL,X,a,b,rtest,optyr,zeroyr,coupyr,sigma,radj)
‘ replicates Goal Seek to find rstar in Vasicek or CIR coupon option value
‘ uses VasicekCIRBondnpv fn
DIM atol, rnow, fr1, fr, fdashr
atol=0.0000001
rnow=rtest
Do
fr1=VasicekCIRBondnpv(imod,L,cL,a,b,rnow+radj,optyr,zeroyr,coupyr,sigma)-X
fr=VasicekCIRBondnpv(imod,L,cL,a,b,rnow,optyr,zeroyr,coupyr,sigma)-X
fdashr=(fr1-fr)/radj
rnow=rnow-(fr/fdashr)
Loop While Abs(fr)>atol
Jamshidianrstar=rnow
End Function
下面的公式給出了非中心卡方分佈的近似形式,可參見施羅德(1989)的論文。
(注意,
在他的論文中,公式(10)中列出了 c3,正確的情況應該是 N(c3))
。
Function CIRSankaranQ(z,nu,kappa)
‘ component for CIR Option Valuation(see Schroder)
Dim n,k,h,p,m,c1,c2,c3
n=nu
k=kappa
h=1-(2/3)*(n+k)*(n+3*k)/(n+2*k)^2
p=(n+2*k)/(n+k)^2
m=(h-1)*(1-3*h)
c1=1-h+0.5*(2-h)*m*p
c2=1-h*p*c1-(z/(n+k))^h
c3=c2/(h*Sqr(2*p*(1+m*p)))
CIRSankaranQ=Application.NormSDist(c3)
End Function
小結
參考文獻
Chan, K.C., G. A. and Karolyi, F. A. Longstaff and A. B. Sander, 1992, “An Empirical
Comparison of Alternative Models of the Short-Term Interest Rate”, Journal of Finance,
47, 1209-1227.
Cox, J. C., J. E. Ingersoll and S. A. Ross, 1985, “A Theory of the Term Structure of Interest
Rates”, Econometrica, 53, 385-407.
Jamshidian, F., 1989, “Computing the Constant Elasticity of Variance Option Pricing
Formula”, Journal of Finance, 44, 211-219.
Vasicek, O. A., 1977, “An Equilibrium Characterization of the Term Structure”, Journal of
Financial Economics, 5,177-188.
第 16 章 擬合利率期限結構
16.1 對數正態分佈利率樹
圖 16.1 展示了不同期限的零息票債券價格(還有由此得到的當前的利率期限結構)和
波動性。計算出來的利率樹與零息票債券價格和利率波動性一致,列在 B48:E51 單格中。
實際上,為了示範這種一致性,H 和 J 列中的債券價格和波動性是根據利率樹反推出來的。
下面說明利率樹是如何被構建的。
圖 16.1 最終的利率樹,與零息票債券價格和波動性一致
圖 16.2 展示了與圖 16.1 相同的市場訊息,包括零息票債券價格和短期利率的波動性。
同時表中還有一個兩期的利率樹和一個兩期的價格樹,標的物是兩年期的債券,面值為 1。
每一個時期都為一年。
圖 16.2 零息票債券價格和收益率,以及短期利率的波動率
在對數正態樹中,每一個時間點 i 上,臨近的兩個利率(往上和往下)之間有以下的關
係:
ln(ru / rd ) = 2σ (i )
就可以利用兩期的短期利率樹對兩期的零息票債券的現金流進行定價。債券的定價在零息票
債券樹中進行,這裏假設利率往上和往下的概率是一樣的,而折現因數就是短期利率樹中的
利率。
例如,假設現在的一年期利率為 6.08%(B12 單格中)
,短期利率在下一期以相同的概
圖 16.4 用單變數求解函數完成短期利率樹,並保證與零息票債券價格一致
通過兩個向量的表示,可以更加簡便地描述短期利率樹。X 向量代表每個時刻短期利率
如果計算一種稱為阿羅-德布勒的價格樹來代替對應債券價格而建立利率樹模型,其效
率將會更高。但是,重複使用單變數求解函數是一種更容易地理解建立樹過程的方法。
到此,得到了一個短期利率二叉樹(對應現在的零息票債券期限結構和利率波動率),
可以對債券期權進行定價。
16.2 正態利率二叉樹
ru − rd = 2σ (i )
期利率的波動率(H7:H9 單格)
。在此之後,建立利率樹的過程與前面的工作表完全相同
(參見圖 16.5)
。
圖 16.5 在利率服從正態分佈的假設基礎上建立短期利率樹
【246 頁圖二】
圖 16.6 正態分佈假設下的利率樹
16.3 BDT 樹
下面介紹的布萊克,德曼和托伊(BDT)樹是在簡化的對數正態樹基礎上發展而來的。
但有一點不同,利率樹對應的是零息票收益率的波動性而不是對數短期利率的波動性。
在 LnNormal 工作表中有以下關係式:
ln(ru / rd ) = 2σ (i )
這個公式通過短期利率的波動性連結了二叉樹節點上的兩個短期利率。在 BDT 工作表中,
建立了 BDT 模式的對數正態樹,並有以下關係式:
ln( yu / yd ) = 2σ R (i )
這個關係式將 BDT 樹中的收益率和零息票收益率的波動性連接起來了。
這裏有兩點要注意的:第一,在前面的例子中,先給定短期利率的波動率然後將利率
與利率漂移項對應起來,現在這個過程被一個最優化過程取代了,最優化過程嘗試同時對應
波動率和漂移項;第二,這個最優化過程所給出的結果不一定與零息票債券價格嚴格對應。
在圖 16.7 中,我們說明了如何利用 Jamshidian(1991)方法去對應 BDT 樹中的零息
收益率和波動率。BDT 工作表中有兩個不同的部分:E 列到 H 列對應零息票收益率,而 K
到 N 列既對應零息收益率也對應收益率波動率。在這個工作表中,利率是在離散複利形式
下計算的。
克盧洛和 Stricklan(1998)通過阿羅-德布勒狀態價格對樹的構建過程給出了一個更詳
細的結果。首先最關心的是明確 BDT 樹和簡單的對數正態樹之間的區別,其次才確保所構
建的樹與零息票債券價格和收益率波動率嚴格對應。
利用圖 16.7 的佈局,建立了一個四期的 BDT 樹,對應零息票債券的價格 0.7770(H7
單格)
。對比之下,初始狀態的二叉樹(通過猜測 Pu 的初始值區域 F9:H11)給 4 年期零息
Pu 和 Pd 向量是對應零息票債券價格和收益率波動率的充分必要條件。 Pu 和 Pd 向量代
保證與收益率波動性保持一致。短期利率和零息票債券價格的二叉樹結果在 32 到 42 行,L
到 P 列的表格中列出。
通過 Jamshidian 方法和時間間隔為 1 年的所構造的零息票債券價格樹與 4 年期的零息
建立短期利率二叉樹的目的是為了建立零息票債券價格二叉樹,從而為零息票債券期
權定價。ZCBOption 工作表中使用了 BDT 樹,為一個四年期的歐式和美式看跌期權定價,
其標的物為一個 10 年期的零息票債券。
如圖 16.8 所示,使用一系列零息票債券收益率(第 8 行的 zvec)和收益率波動率(第
9 行 sigvec)直到第 10 年。通過用戶定義陣列函數 BDTKvec(第 15 行)和 BDTXvec(第
16 行)獲得短期利率樹。從第 0 到第 3 步的數值與前面 BDT 工作表的短期利率樹的結果一
致。然後,用短期利率樹建立一個期權標的債券的價格樹(圖 16.9) 。二叉樹給出債券的價
值為 0.5042(B36 單格)對應於 0.5020(L13)的市場價格。
之後,期權的定價過程與股票期權相似。在執行日當天,期權的收益狀況通過零息票
債券價格和執行價格計算得出,然後順著二叉樹倒推到現在就可以得到期權的價值。二叉樹
中假設往上和往下變化的概率都為 0.5,使用利率二叉樹中的相應利率作為折現率。
圖 16.8-ZCBOption 工作表中債券期權定價的短期利率樹
PU 向量被用於產生 K 和 X 向量,從而給出短期利率樹:
Function BDTKvec(pucvec,pdvec)
' from Pu and Pd vectors to approximation vector k in BDT
' see Jamshidian(1991)
Dim i As Integer, n As Integer
Dim kvec() As Integer
n=Application.Count(puvec)
ReDim kvec(n)
kvec(1)=((1/puvec(1))-1)/((1/pdvec(1))-1)
For i=2 To n
kvec(i)=((puvec(i-1)/puvec(i)-1)/((pdvec(i-1)/pdvec(i)-1)
Next i
BDTKvec=kvec
End function
Function BDTXvec(puvec,pdvec,kvec)
' from Pu and Pd vectors to approximation vector X in BDT
' see Jamshidian(1991)
Dim Prvec0
Dim i As Integer, n As Integer
Dim xvec() As Variant
n=Application.Count(puvec)
ReDim Xvec(n)
Xvec(1)=((1/0.5*(puvec(1)+pdvec(1))))-1)/(0.5*(1+1/kvec(1)))
For i=2 To n
xvec(i)=(((puvec(i-1)+pdvec(i-1)))/(puvec(i)+pdvec(i)))-1)/((0.5*(1+1/kvec(i)))^i)
Next i
BDTXvec=xvec
End Function
小結
建立二叉樹的過程解釋了為什麼債券期權定價比股票期權定價複雜得多。但是,對應
利率期限結構已經成為金融市場債券期權定價實務中的先決條件。幸運的是,在股票期權定
價中我們已經廣泛的使用風險中性定價和二叉樹。本章的重點是推導利率二叉樹的迭代方法
上。用於說明如何為零息票債券期權定價的 BDT 樹方法是深受從業者歡迎的。
參考文獻
本附錄提供了另外一些用戶定義函數,這些函數用於短期預測、ARIMA 建模、樣條、
特徵值和特徵向量計算。每個應用部分都有簡要的介紹。在本附錄中,相應的 VBA 函數比
試 算 表 本 身 更 重 要 , 這 些 程 式 可 以 在 VBE 代 碼 視 窗 運 行 。 本 章 相 應 的 工 作 簿 叫
OTHERFNS.xls。
預測
在 4Cast 工作表中的函數都是基於時間序列分析的,特別是用於分析產品以往的月銷
售資料。時間序列預測方法假設現在的銷售模型在將來繼續有效,因此這些模型在短期預測
中比長期預測更有效。銷售資料通過不同的方法進行“平均”,即保證最近的資料比很早以
前的資料賦予更大的權重。短期預測就是將最近的平均值作為下一期的資料。
首先,可以通過目測和其他的技巧來檢驗資料服從什麼模型。如果資料是圍繞一個平均
“水準”進行波動,那麼這個模型假設有以下形式:
data=level+error (A 類)
如果資料表現出一種趨勢(平均水準隨時間變動) ,那麼模型有以下形式:
data=level+trend+error (B 類)
如果資料圍繞一個跟季節有關的固定因素變動,那麼模型假設有以下形式:
data=(level+trend)×seasonal_factor+error (C 類)
這裏季節因素的均值為 1。
在決定了資料適用的模型以後,就可以選擇方法和參數來進行逐期的預測。根據歷史
資料,可以預測下一期資料的平均值。對於 A 類資料來說,可以通過移動平均的方法進行
預測,而另外一種方法就是用指數加權平均。指數加權平滑方法在這三類模型中都可以採
用。用戶定義函數 Esvec,ESHoltvec 和 ESWintervec 返回各類資料類型的指數平滑預測
值。每個函數都需要輸入資料(指 dvec)和不同的參數值。
指數平滑預測所採用的公式如下:
新預測值= α *data+(1- α )*(舊預測)
平滑常數 α (在 0 與 1 之間)決定了預測值隨新資料改變的速度。
4Cast 工作表包含了三個不同類型的銷售資料(A 類在 B 列中,B 類在 I 列中,C 類在
O 列中) 。
首先觀測 A 類銷售資料, D 列給出了銷售的六期移動平均預測值,在 F 列給出平滑常
數 α =0.1 的指數移動平均預測值。函數 MAvec 根據輸入值(B11:B34)給出計算結果
(D11:D34) ,這個過程中使用了轉置函數對輸出結構進行了轉置。F 列中的輸出結果是根
據 Esvec 函數計算的,輸入資料在 B11:B34,F5,F3 單格中,同樣使用了轉置函數。
用戶定義函數(如 Mavec,ESvec 等等)的代碼從變數的初始值開始計算,然後通過
不斷更新數列的平均值進行預測。代碼中的主要變數都含有 vec——fvec 代表預測,lvec 代
表每期的平均值(level) ,tvec 代表每期的趨勢值(trend) 。每個向量都是 n 維的。對於季
節性資料,需要將第 i 期轉換為相應的季節,並用用戶定義函數中的 MMod 指明。
所有這些模型都假設未來銷售水準可以根據過去的資料進行預測。例如,移動平均是
一個有限資料點的等權重平均方法。指數平滑中資料的權重是一個呈幾何級數變化的數列。
在上述兩種方法中,都是通過對歷史資料的組合來預測未來,而權重則依賴於相應的方法。
與之成對比的是,博克斯-詹金斯的方法(下一節介紹)通過決定最優的權重來進行預測。
ARIMA 模型
樣條
特徵值和特徵向量
儘管特徵值在物理和工程學中扮演著重要角色,但是他們在金融領域的主成分估計中
也是相當重要的。一個典型的應用就是將風險(通過資產收益的方差和協方差矩陣來表示)
分解為一系列的線性獨立變數(主成分或者特徵向量)。特徵值反映了不同特徵向量所引起
的風險比例。
儘管對於大型的矩陣有更好的方法,但雅各比方法在計算實對稱矩陣方面簡單有效。
這種方法可以將輸入矩陣(實對稱)經過一輪變換以後轉換為對角陣。每一次變化都保持對
角元素(最後會變為特徵值)的和不變,同時減少非對角元素的平方和。這個過程直到平方
和低於某個數值時停止(這個值為 10-19,稱為容忍水準) 。
函數 Eigenvaluesevec(在 Module D1 中)是主要的程式,而中間的函數都是進行雅
各比轉換。首先,計算轉換角(通過 Jacobivec 函數) ,然後建立轉換矩陣(在 JacobiPmat
函數中),最後得到更新後的輸入矩陣(JacobiAmat 函數) 。主程序的每一次迴圈產生一個
新的輸入矩陣,並計算非對角元素的平方和。當達到容忍水準時,輸入矩陣的對角元素被作
為特徵值。
相應的特徵向量的計算(在 EigenvectorsEmat 函數中)有相似的過程,但還需要另外
一個矩陣(開始時為一個單位陣)進行更新。當達到容忍水準時,特徵向量就是這個矩陣的
列向量。
參考文獻
Box, G.E.P. and G.M.Jenkins, 1984, Time Series Analysis: Forecasting and Control,
Molden Day, San Francisco, CA
Pecar, B., 1994, Business Forecasting for Management, McGraw-Hill, Maidenhead