我最近收到很多邮件来自希望换工作的工程师,学者和IT从业者。由于智力上的挑战和较高的报酬,计量金融最近几年成为了非常受欢迎的领域。这些邮件中经常会出现的问题像是“我需要学什么能说服面试官给我一份工作?”这是讨论如何形成一个在量化行业内获得一份工作的自学计划三部曲中的第一部。这篇文章将会讨论如何自学成为一个量化开发人员。另外两篇会集中在量化分析师和量化交易员。
在量化行业中的任何一个职位都需要有一定程度的综合化的而不是广泛的专业化。量化开发者也不列外。他们必须要融入一个拥有交易员,金融工程师和技术支持的团队,为了帮助投行定价和销售新构建的投资产品或者帮助基金开发交易基础架构和投资组合管理系统。
科学计算
最普遍的进入量化开发岗的路径是通过在理工科方面的学术背景。因为“量化开发”最核心的技术是高超的编程技术和数值算法实现。这些技术是在研究生院中物理科学或者工程的研究环境中掌握的。如果这是你的背景那么你的任务就是掌握哪些在计量金融中使用的产品和算法,因为你的算法实现和编程技能可能已经掌握的足够熟练了。
但是,如果你没有这样的背景,依然有大量的机会去成为量化开发者通过计算机的背景。至少,你需要熟悉实现算法,下面我会说明如何训练。
编程技能
首先且最重要的,一个量化开发人员是一个软件开发人员。因此其职能会%基于编程。你会发现你自己从草稿里优化交易原型或者开发交易基础架构。如果你目标是银行职位,那么你将会需要在Windows环境下使用C++,Java或者C#。如果你的目标是对冲基金,那么你需要将MATLAB或者R转换成C++或者Python。基金不太倾向于使用Java和C#,因为他们经常在UNIX环境下开发,C++和Python更适合。如果你熟悉某一个开发环境,那么你可以只强化你熟悉的软件。因此如果你熟悉Java,那你比较适合将目标放在投资银行的岗位。
假设你是一个有能力的程序员并且乐意转换到金融行业常用的软件上,那么我会建议非常熟练的掌握C++和Python,因为这将会给胜任业内各个不同部门的能力。下面是我给的成为一个优秀的C++程序员的建议:
1、通读AndrewKoening的AcceleratedC++。这本书能让你大致了解C++的语法,并且会深入讲解指针和内存管理。这是很多程序员(包括熟练Java和C#)所不熟悉的领域。为了练习语法,不能仅仅是阅读,最好是能够自己去实现里面的例子,不管是用MicrosoftVisualStudio还是在Linux/UNIX上的GCC编译器。
2、通读(建议多次)ScottMeyers的EffectiveC++。我建议了多次,但还是有必要再提一次。这本书会带你从一个C++初学者成为一个能够接受面试的进阶程序员。这本书事实上在终端上练习会更难,因为Meyers给了一些复杂的例子。一个通读本书的方法是去想在你自己的项目里如何应用这些方法。
3、如果你在工作中直接使用C++,你可能会想要这两本书之外的东西。ScottMeyers也写了一本叫做MoreEffectiveC++和EffectiveSTL。你将会需要Boost库,多线程编程以及Linux操作系统来成为一个真正的专家。
Python:
1、如果你熟练掌握C++/Java/C#,那么阅读MarkLutz的LearningPython的某些章节。特别是,可以略读4-9章,这些章节讨论Python的内置类型。10-13章讨论Python分支和循环语法,所以可以略读。但是细读14-20章是值得的,因为这些章节讨论了Python特有的特征,像是迭代/推导式以及高级的函数用法。第五和第六部分包含了命名空间和面向对象编程,以及Python的这些概念和C++/Java的区别。如果你想要成为一个出色的Python程序员,那你需要看剩下的章节。记住尽管这本有0页那么长,你只需要看那些和你背景相关的章节。
2、MarkLutz的第二本书,ProgrammingPython,事实上是在Python中写应用程序。这本书会使用第一本书中学到的语法并且让你能够开始写你自己的完整的应用程序。这本书能让你成为更好的Python软件工程师。
3、对于那些非常渴望从事量化交易的人,知道如何用Python进行数据分析是必要的。这个技能通常是在研究生院学会的,但是WesMckinney的PythonforDataAnalysis清楚的介绍了像是SciPy和pandas的库。
软件工程
在量化岗位取得优异表现需要你同时成为一个出色的程序员和出色的软件工程师。前者可以通过书籍和练习实现。但是后者只能在工作中的更大的软件开发项目中实现,通常是和其他的工程师一起完成。但是,这并不意味着这不可以被包含在自学计划中。比如,现在很容易通过网络加入开源软件项目的开发。最大的量化金融项目之一是QuantLib项目。通读这个项目的源代码能够给你一个大型C++软件项目是如何被开发的思路。
成为一个好的软件工程师,理解如果开发大型软件项目是有必要的。对于现代软件开发,需要使用版本控制,持续集成以及敏捷开发实践。下面是让你掌握这些知识的学习计划:
1、通读SteveMcConnell的CodeComplete以及RobertMartin的CleanCode。这两本书都会让你严肃的思考如何设计你的软件。比如,在你敲击键盘前你花了多少时间设计你的软件。这两本书会让你省下不少编程上浪费的时间。我会建议你尽可能多的用上书中建议来尽快改掉编程上的坏毛病。
2、在讨论好的编程技术时,DesignPatterns(也被称为”GangofFour”)是不可缺少的。这本书与C++高度相关,尽管像Python这样的脚本语言比较少。你会注意到你在你的程序中使用相似的设计。这本书帮助你决定何时何地使用这些设计。另外一个好处是其他开发人员也会注意到这些设计,使你在你的团队中受到欢迎。对于自学的人来说这有些许难,所以试着学会2-3个设计,像是Factory,Decorator和Singleton,这些被经常使用在工作中。
3、在一个由多个成员组成的团队里的大型软件项目中,使用版本控制是有必要的。自动化修正,滚回,分支/合并以及更好的测试能力意味着版本控制是无所不在的在几乎所有的软件开发机构。两个大的竞争者Git和Subversion(SVN)。我建议只需熟悉Git,因为SVN非常类似(尽管有一点更难使用),并且大多数机构正把他们的SVN替换成Git。有本免费的eBook来学习Git,ProGit,我建议你找到自己的方法。这会帮你省去大量的在开发中浪费的时间。
4、有些行业现在正转向持续集成,它能持续的测试和部署代码通过一个完全自动化测试和部署系统。尽管你能够知道大多数的CI系统如何在工作中发挥作用,但你可能想让面试官印象深刻,那你可以通过展示你在持续集成上的知识,通过PaulDuvall的书ContinuousIntegration。
数据库交互
尽管成为一个出色的程序员和软件工程师是获得面试的前提,你也会被问到关于数据存储和分析的问题。在量化开发人员的日常工作中,与数据交互是一个重要的部分。因此一定程度的掌握数据库是被期望的。如果你从来没有使用过数据存储系统,那么最好的方式去开始是理解关系数据库管理系统(RDBMS)和他们的语言-StructuredQueryLanguage(SQL)。常用的RDBMS包括MicrosoftSQLServer,Oracle和MySQL。其他的数据库类型包括NoSQL数据存储,包括10GensMongoDB和Cassandra。
最好的方式去开始学习关于RDBMS是安装开源版本(因为你可以免费下载)并且看完下面的书单。如何安装RDBMS超过了本文的范畴,但你可以试试MySQL,因为这是对冲基金常使用的数据库。SQLServer和Oracle在银行更常见。一旦你安装了数据库,跟着下面的书单来帮助你理解存储和获取数据:
1、如果你从没使用过SQL那么O’Reilly的AlanBeaulieu写的LearningSQL会是个很好的开始。它包含了所有的初学者和进阶的SQL,你会知道如何存储,获取数据并提供报告。它也会简单的讨论数据库优化。确保你通读了这本书,因为所有的内容都和量化开发的日常数据库使用相关。对于特定的数据库任务,你会想去看O’ReillySQLCookbook。作为一个量化开发人员我发现这本书出奇的好用,因为我经常把它从书架上拿下来查询特定的日期/时间或者报告查询语句。没有必要头一章一章的读这本书,但要需要知道大体的内容,并知道去哪一章找你要的内容。
2、尽管量化开发不总是是数据库管理员,但你想要知道更多的MySQL优化的话,那去看这两本书,尽管不是必要的,但在你遇到数据库有关的问题是他们非常有用:HighPerformanceMySQL和MySQLHighAvailability。
金融和数值算法
因为量化开发人员是在金融市场中工作的,所以知道一些相关的银行做的产品或者基金交易的资产是有用的。因此让你自己熟悉股票,外汇,固定收益,商品以及相关的衍生品市场是有必要。特别是作为量化开发的一部分去提供存储和获取金融数据,你要不断的去想那些数据被如何代表,存储以及获得。一旦工作,你必然会集中研究某一个领域,所以确保你最初的学习是广泛的。
更相关的知识是用在计量金融中的算法来进行资产定价和算法交易。投行衍生品定价技术集中在门特卡洛方法和有限差分方法,这些方法都依赖于概率论,统计学,数值分析和偏微分方程。这些内容都会在研究生院学到,但对于一个那些想换工作的人来说,你需要掌握这些方法如果你想要在银行中做期权定价的量化开发岗。
对于对冲基金,你更会去实现交易基础架构,无论是低频或是高频。这会包括使用MATLAB,R或者Python里的内置算法并在更快的语言中进行优化,像是C++,也会将这些算法与主要的经纪商API接口相连接并执行交易。这些技术存在一些不同。你会需要能够将不同资源的数据结合在一起,快速的重复并且得出所需的报告,以PDF格式,网络或API本身。这些技术很难直接从书本中掌握,需要几年的在科技行业的软件开发经验。
申请工作
尽管上面的书单看上去有很多的东西需要学,但只是对那些对编程完全陌生的人。但量化开发岗不是针对这样的人群的,并且我假设你拥有编程或者理工科背景。确保只去看你认为与你的职位相关的,至于其他的你可以只是花上你的闲暇时间去学习。
一旦你认为你已经准备好面试了,那你需要开始投递相关的量化岗位了。
招聘人事通常不会非常熟悉量化技术的专业术语,并且他们也不需要。但是,这意味着他们会依赖与“流行词的匹配”来筛选简历。如果你精通C++,确保要强调你精通C++,并且要提到STL,Boost和任何你做过的C++项目。不要对你的技术谦虚,但是也不要高看你的能力。在你简历上写的任何东西,都会在技术面试中被提问。
任何你参加的面试,会让你更明白雇主寻找的是什么样的人,然后你就能调整你的学习计划。