就在几天之前,经历了一年时间断断续续的坚持,《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!(注:这是个彩蛋)

《Implementing QuantLib》译后记的更多相关文章

  1. QuantLib 金融计算

    我的微信:xuruilong100 <Implementing QuantLib>译后记 QuantLib 金融计算 QuantLib 入门 基本组件之 Date 类 基本组件之 Cale ...

  2. 《构建 QuantLib》正式出版

    <构建 QuantLib>在 leanpub.com 出版了! leanpub.com 上的购买链接:<构建 QuantLib> Luigi 发来贺电:Implementing ...

  3. 金融计算的开源库——QuantLib 学习入门

    本文在Creative Commons协议下发布. 简介 瞬息万变的金融市场开发出了太多的金融产品,产生了太多的计算问题,这对于 Fintech 来讲:无论是计算能力上的,还是软件设计上的是一个巨大的 ...

  4. Python金融行业必备工具

    有些国外的平台.社区.博客如果连接无法打开,那说明可能需要"科学"上网 量化交易平台 国内在线量化平台: BigQuant - 你的人工智能量化平台 - 可以无门槛地使用机器学习. ...

  5. [翻译]通过使用正确的search arguments来提高SQL Server数据库的性能

    原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search ...

  6. 《只是为了好玩:Linux之父林纳斯自传》

    <只是为了好玩:Linux之父林纳斯自传> 基本信息 作者: (美)Linus Torvalds    David Diamond 译者: 陈少芸 出版社:人民邮电出版社 ISBN:978 ...

  7. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  8. 在 R 中估计 GARCH 参数存在的问题

    目录 在 R 中估计 GARCH 参数存在的问题 GARCH 模型基础 估计 GARCH 参数 fGarch 参数估计的行为 结论 译后记 在 R 中估计 GARCH 参数存在的问题 本文翻译自< ...

  9. CODING 告诉你硅谷项目经理的项目管理之道(2)

    优秀的项目管理者是怎么工作的?如何帮助研发团队高效工作?这一直是 CODING 关注的重要话题,我们不断地打磨 CODING 研发管理系统来让开发更简单. 近期我们精心挑选了几篇硅谷科技公司研发管理者 ...

随机推荐

  1. quartz cron表达式demo

    1.每天0点5分开始,以后每隔15分钟启动一次,23:50停止: 0 5/15 0-23 * * * cron表达式,由于从5分开始,每15分钟执行一次,到了23点的最后一次执行时间正好是23:50. ...

  2. yarn 完美替代 npm

    众所周知,npm是nodejs默认的包管理工具,我们通过npm可以下载安装或者发布包,但是npm其实存在着很多小问题,比如安装速度慢.每次都要在线重新安装等,而yarn也正是为了解决npm当前存在的问 ...

  3. qt学习(二) buttong layout spinbox slider 示例

    开启qt5 creator 新建项目 qt widgets 改写main.cpp #include "mainwindow.h" #include <QApplication ...

  4. GPS坐标转换为百度地图坐标

    /** * GPS坐标转换为百度地图坐标 * 需要引入javabase64.jar 和json的一些包 * */ public class Gps2BaiDu { public static void ...

  5. ubuntu的命令行状态和图形化界面切换 (转)

    1.ubuntu命令状态切换到图形化界面 startx 如果命令不能识别 执行 sudo apt-get install xinit 还需要提前安装桌面环境 比如 gnome 比如 KDE 安装方法 ...

  6. asp.net 4高级程序设计( 第4版)文摘

    第一部分 核心概念 第1章 asp.net 简介 第2章 visual studio 第3章 Web窗体 3.2 web窗体处理阶段 页面框架初始化(page.init),用户代码初始化(page.l ...

  7. Introduction to Razor Pages in ASP.NET Core

    https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/ 从ASP.NET Core 2.0.0版本之后,添加了新的特性Razor p ...

  8. Myeclipse的webservice本地监听设置(一个简陋的代理)

    (1) 首先打开Myeclipse,然后选择window--->show view ---->other (2)搜索tcp,然后找到如图的样式 (3)选中,点击ok (4)弹出下图界面 ( ...

  9. Oracle学习笔记(六)

    八.函数 1.函数的作用 (1)方便数据的统计 (2)处理查询结果,让数据显示更清楚 2.函数分类(提供很多内置函数,也可自定义函数) (1)数值函数 平均值,四舍五入 a.四舍五入 表达式 roun ...

  10. swift 动画

    // //  ViewController.swift //  Anamation // //  Created by su on 15/12/9. //  Copyright © 2015年 tia ...