就在幾天之前,經歷了一年時間斷斷續續的堅持,《Implementing QuantLib》的初步翻譯工作告一段落。撰寫此文作為總結和紀念。
《Implementing QuantLib》譯后記
初心
我還在讀研究生的時候,為了實踐某些計算金融學的課題自學了 C++ 語言(當時 C++ 大概是“老派 quant”最為推崇的工具性語言,現在“新派 quant”可能都轉向 python 了),進而接觸到當時就已經久負盛名的 QuantLib。
剛開始使用 QuantLib 時就遇到了 Luigi 在書中指出的問題:缺乏相應文檔的弊端開始顯示,我對這個庫的整體架構一無所知,函數之間的調用關系似懂非懂,類之間的繼承關系不清不楚,更棘手的是當時沒有遇到任何中英文文獻幫助我解決上述問題。
后來事情出現了好轉,我讀到了名為《QuantLib 實現》的翻譯文章(對不起,我已經記不起譯者的名字了),並了解到 Luigi 正在撰寫相關文檔描述 QuantLib 的整體設計和實現細節,盡管當時文檔的內容還非常有限。
直到 2013 年,我得知 Luigi 開始在其網站以博客的形式連載這些文檔。當時我曾計划,等 Luigi 差不多寫完,我就開始着手翻譯工作,因為我主觀上覺察到先前的那位譯者似乎中斷了翻譯計划。
但是我高估了意大利人寫書的效率,Luigi 的寫作進度非常緩慢。隨后互聯網政策發生變化,發布連載的網站一度需要“科學上網”才能登錄,不幸的是當時我還沒掌握這門技藝:)
一兩年之后我習得秘技,重新登陸網站,發現 Luigi 的寫作轉移到了 leanpub 上。當然,還是沒寫完。接着就是漫長的等待。
瞎忙
在沒有着手翻譯的時間里,我也沒閑着,瞎忙了很多事情。
我曾經試圖將一個有點年頭的 C++ 矩陣計算庫改寫成全模板實現的。對,就像 Eigen 那樣的。為此,我閱讀了一些有關模板技術的書和博客,比如《C++ 模板全覽》和《模板元編程》。為了更好地設計,我閱讀了設計模式相關的書,比如 GoF 的《設計模式》和《Head First 設計模式》。為了更好更好地設計,我閱讀了領域驅動設計相關的書,比如《領域驅動設計》和《實現領域驅動設計》,這時候我發現設計的瓶頸在於領域知識的缺乏。為了更好更好更好地設計,我復習了一遍“矩陣計算”的知識。
瞎忙的過程中我深感提高效率的重要性,為此我刻意尋找和掌握能夠提高效率的工具。為了編輯數學公式,我掌握了初步的 latex 語法;為了提高文字編輯的效率,我成為了 markdown 的擁躉;為了加速學習和復習的速度,我開始使用思維導圖,並嘗試了“思維導圖驅動”的學習技巧,有點兒成功。
再后來我放棄了,我發現自己陷入了哲學家窘境:在不斷在追求更抽象、更本質的問題的過程中迷失了最初的問題。
在那之后,我告別了 C++,轉而投向 python 和 R。用更輕便的工具解決更實際的問題。不過依然試圖通過 swig 和老情人保持着若即若離的關系。
值得慶幸的是,我在陷入哲學家窘境時收獲的經驗和知識意外地幫助了我理解 QuantLib 的設計細節和宏觀架構。當然,掌握的提高效率的小技能也大有裨益。
收獲
2017 年 8 月份,《Implementing QuantLib》的第一個完成版本發布,我的工作在這之后的 11 月份開始。歷時一年多的翻譯工作,多少有些收獲。
最直接的,我得到了一個約十三萬字(不包括代碼,僅漢字)的中譯本手稿。順便說一句,我主觀上感覺自己的行文受到了影響,也許是翻譯時要揣摩原作者語氣的關系,我自己的語言習慣在向原作者靠攏,要知道 Luigi 非常喜歡在描述專業內容時插科打諢、引經據典。不過,我更想說的是那些比較抽象的收獲。
- 成為領域專家
要寫出公認專業的算法和軟件,首先要成為特定領域的專家,而不是相反,那樣的話容易陷入哲學家窘境。所以,首要的是去學習,從現成的工具着手,從最簡單的問題着手,先成為一個專家再說。
- 設計模式與知識結構
如果要成功的應用設計模式描述領域問題,那么設計模式所表現出的結構應該和這一領域的知識結構相契合。
舉個具體的例子,QuantLib 的核心目的是為一系列金融工具的定價提供一個統一的框架,那么,什么是“定價”?依我的理解,所謂定價就是計算未來預期現金流的貼現值,關鍵詞有這么幾個:計算、預期、現金流、貼現。
這幾個關鍵詞正好描述了定價問題的知識結構,計算的方式可以分為解析解法、數值解法和隨機模擬解法,等等;預期可以指風險中性測度下的期望,或是當前期限結構隱含的均衡結果,等等;現金流可以是固定的(固息債)也可以是隨機的(浮息債和期權);貼現則整個就是期限結構選擇的問題。每一個關鍵詞都可以成為一個龐雜的研究課題。QuantLib 目前的設計正是將上述幾塊的知識抽象成模塊,再細分成類,將方法封裝進類,最后用“配置類實例”的方式將這幾若干實例組合成為一個用於定價計算綜合實例(基本上就是策略模式)。
也可以反過來思考,要想理解一個領域的知識結構(前提是已經入門),發現新的細節,就去看這個領域相關的軟件庫是怎么架構的(最好是 OOP 的)。我關於定價本質的理解正是在研究 QuantLib 架構之后獲得啟發的,同時也見識到了許多未嘗接觸過的新課題,比如局部波動率和多曲線貼現。
- 設計模式與純數學
設計模式與應用數學結合的成功案例啟發我在純數學領域思考模式的存在,比如從基類與派生類的角度看待各種概念之間的關系,基本上是基於集合的想法;以及試圖發現證明與計算過程中的共性,一種類似設計模式的東西。我希望找到模式,以幫助人們更快、更高效、甚至更機械地掌握復雜的知識結構。
不過目前還沒有任何成果:(
彩蛋
Luigi 非常熱衷於在書中以雙關語的形式引經據典,從古典到流行,從神話到科幻,幾乎無所不包。這些埋藏的文化彩蛋通常是一些歐美文化圈的人才能熟知的典故,對於漢語文化圈的人來講可能非常陌生,甚至不知所雲。比如這個,第 7 章中出現的“curiouser and curiouser”,這句話是一個彩蛋,它最著名的出處是《愛麗絲夢游仙境》(第 2 章的第 1 句話,愛麗絲發出的一句驚嘆)。不過這里用作雙關語,用來形容“奇異(Curiously)遞歸模板模式”中讓人費解的繼承關系。
這種彩蛋很難發現,是吧。
在翻譯的過程中,我竭盡所能發現盡可能多的彩蛋,考證其出處、注解其語義。尋找彩蛋的過程讓耗時枯燥的翻譯工作妙趣橫生,這完全超出了我的預料。
目前的統計數據,共找到 52 個彩蛋,均以譯注的形式呈現出來,隨着校訂工作的開始,可能還有更多的彩蛋被發現。
展望
下一步的工作,首先是進行校訂,解決一些歷史遺留問題。
接着,效仿歐美教授們的做法,計划在一個小圈子里面進行試讀,征集修改意見。
最后,當然是希望作為正式出版物出現在書店貨架上。不過,在走到這一步之前,它還只是 My Precious!(注:這是個彩蛋)