学习金融工程的随笔
本文在Creative Commons许可证下发表
熟悉金融工程的人都知道,金融工程需要学习许多软件和编程语言,一般的选择是matlab,C++,再加上一种统计或计量软件,如SAS、Eviews、SPSS、stata、R等,但是金融工程同时还要学习许多艰深的数学知识,需要学习的数学除了一般的高等数学外还包括测度论、随机过程、鞅过程、偏微分方程等等,还要学习经济和金融方面的大量知识。如此多需要学习的东西吓跑了一大堆人,也不符合现代科学越来越细化、专业化的要求,学的太多,学习时间不够,导致很难深入,更别谈创新了。
有鉴于此,我们有必要研究怎么把宝贵的时间用在数学基础知识和经济金融领域知识上面,至于工具软件和编程语言,能简化尽量简化,毕竟我们又不做程序员,没必要学的太深。其中统计或计量软件中最强大的无疑是SAS,那么,能不能用一种工具代替或者近似代替matlab、C++和SAS三者呢?
完全地代替显然是不现实的,只能尽可能地从最大程度上代替它们,我的选择是python。python是一种动态编程语言,语法很简洁,某种程度上类似于matlab和SAS,结合python的几种强大的科学计算类库:NumPy(主要是数学基础方面的)、SciPy(数值计算上很强大,包含NumPy)、SymPy(符号运算库)、matplotlib(绘图库)、Traits(程序界面库)等,可以近似地替代matlab、C++和SAS三者。
原因在于:
第一,python首先是一种完整的动态编程语言,虽然执行效率比不上C++,但是开发效率远远高于C++,学习成本较小,对于金融工程这种专业来讲比C++更加合适,毕竟我们自己做模型的时候更在乎的是如何快速实现模型,而不是模型运行快几秒钟,当然对于金融方面的大规模产品,还是用C++更加合适,这就是程序员的事情了,我们一般不会去编写几万行代码的程序。从这个方面来讲,python可以代替C++。
第二,python利用NumPy、Pandas、SciPy、SymPy、matplotlib等类库,可以完成matlab 90%以上的功能,欠缺的只是极特殊的函数。而且这些都是免费的,中国现在虽然盗版很严重,但是明显正在向正版化的方向发展,以后谁保证能得到免费的matlab?这些类库也在一直发展中,超过matlab只是时间问题。不仅如此,python利用它的界面库做程序界面是非常方便的,用的VB的都还记得可视化编程的爽快,python也可以实现,而且可以实现的更好,这是matlab远远不足的地方。利用这个功能,我们可以用python做好程序后发布给其他人使用,就像使用word这种程序一样,这种方便程度是目前matlab远远不及的。再比如我们要抓取网上的一些数据,利用matlab就比较麻烦,而利用python就极为简单。python可以大大加快我们研究的自动化程度和简单程度,需要的只是好好学习一段时间python而已。
第三,python代替SAS。这个方面其实python没有明显的优势,在统计功能上比不过SAS,但是利用python的好处在于:我们不需要再次学习SAS语言,特别是对于金融工程专业来讲,没有那么多时间和必要性去学习SAS,我们又不是搞专业数据统计的。SAS的大部分功能python都可以实现,不过实现起来比SAS困难一些,对于金融工程专业的人来说,选择SAS还不如选择python+R的组合,R是非常简单。python的学习比较简单,也非常值得。选择python的最大好处在于可以节省学习的时间,而且弹性较强,可以适应未来多变的需求。剩下的时间不如去好好研究下怎么在金融工程理论与应用方面创新,就不需要浪费时间在学习工具上了。
对于需要的软件技术的深度,我在这里也一并讨论之。
简单说一下吧,其实在任一行业,都有软件工程师的需求,而且要成为优秀的软件工程师,编程水平都应该是要求比较高的,一方面要深入了解行业知识,另一方面要能把相关业务通过编程实现出来,熟练掌握至少一门编程语言是必须的,假定你暂时不是在美国这类的地方做高频交易,还不需要用到FPGA, 或GPU编程(CUDA计算)这些相对另类的做法,你不会C/C++也是可以的,现在也有用JAVA来写交易策略的,用Python的也很多,R更多是用来做模型研究,国内对应的好像Matlab多些,大家都用,为了便于交流,可能也会被动地改用Matlab, 总之,这个要看团队的头怎么选择。
另一方面,个人做量化投资的事情其实很杂,经常会遇到数据的预处理,比如,加载到数据分析工具中,甚至还要做一定的数据清洗工作,这类工作可能需要编写一些特定的小程序来处理。然后才能比较方便地用Python或R或Matlab来分析,同时也可能需要对数据进行分段分区处理再合并。等模型研究完成后,就可以通过编写交易策略来验证,这个过程中需要考虑的东西就更多一些,比如实时行情的订阅,历史行情的准备,其他相关数据的预加载等,在策略的初始化工作都要预先准备好,在策略收到行情的处理逻辑中,需要考虑算法的性能和效率,可能需要比较强的
算法设计和实现的能力,甚至一些估计值的计算方法,不过好在这些大部分有前辈的论文作为参考,有些甚至有开源代码的实现,交易策略的实现中,对编程的要求是快速实现交易思路,
并且要防止各种边界错误,保证能稳定地按预期运行,尽可能地避免不必要的错误。
个人觉得还是编码规范性要好,逻辑的考虑要做到全路径覆盖,各类边界条件要考虑清楚,避免不必要的错误,另外,能自己编写一些测试用例会更好,这样每次策略修改后,能做一个基本的跑通测试,再经过仿真交易后容易快速上线。
量化交易是个相对而言有些特殊性的行业,不太像其他行业,它比较难以产品化,也就是说,交易思路可能变化很快,如果总是依赖于别人帮你实现的话,沟通成本会非常高,效率会非常低下,有个基础平台,比如在现在的大的投行,强大的IT硬件资源、软件平台、数据、各类中间件等都会让你的工作变得很容易,基本上只要专注于两件事情就好了,一是数据分析和挖掘,找到合适的交易模型;二是把交易模型在平台的SDK基础上实现出来,能通过行情驱动进行交易就OK了。
在这个基础上,需要掌握的编程水平其实要求并不是太高,主要是把自己需要的数据准备好,适当加工,在算法方面能够实现并适当优化就可以了,其他的基本上都可以通过调用现成的服务来完成,具体的细节和实现不用深入考虑,有问题还有相关团队可以随时支持。
但是我们是自己从头一个人或者一个小团队做起,需要的掌握的东西可就多了,从数据接收开始,需要了解网络通讯方面的编程知识、多线程概念、缓存,数据的加载,以及如何实现和优化一些数据的计算公式,有些策略可能还需要用到一些算法交易,像VWAP,TWAP之类对数据的预处理、速度方面都有一定的要求,因为程序实现变得复杂,多线程之类的问题跟网络纠缠在一起会导致调试工作变得很麻烦,需要比较高的程序调试技巧。
所以,我个人比较推崇统计套利。而且推崇巴老的本金安全是第一位的。这种指导思想下,权衡、取舍的东西是很多的。但是,目的是明确的,那就是要稳妥的实现个人财富的保值增值目的。