首先恭喜你猜对了,他们骗你的。
想在交易行业中做一个优秀的Quant,编程水平可能会在两个方面制约你的发展。至少,在我这个计算机科班出身的人看来,这是非常明显的问题。你知道,每当我看到新来的编程小白Quant,
一定要很真诚地告诉他,只有找到那个命中注定的编程师傅,才能成为一名真正的Quant。
好了,故事开场前,最后说明一点。以下仅针对交易行业。卖方的衍生品定价和风控等我不熟悉,不发表意见。
~~~~~~~~~~~~~~
一,性能不足
交易这一行是真真正正的大数据行业。一个交易所一天产生的数据轻松上几十GB无压力。如果你做跨交易所的交易,这个数字还要翻几番。想想在这样的情况下,一个月的数据量有多大,一年呢?这么大的数据量,如果你的编程功底不扎实,跑一次回测可能就要几个小时甚至几天,就算你有再好的想法,这么慢的反馈也足够把你的灵感扼杀在摇篮里了。
这还不是最糟的。更坏的可能是,你写出来的程序根本无法处理这么大的数据量,要么内存不够用,要么计算时间太长以至于根本无法操作。
必须说,这种情况,后果很严重。
举一个例子。有一次我有一个同事用Python写了一个分析程序,有一个bug产生严重的内存泄漏,导致回测的时候才跑几天的数据,程序就崩溃了。更糟的是算法写的比较复杂,他根本无从下手查出问题所在。问题交给我以后,我只做了一点很简单的改动,对每天的处理开一个单独的进程处理,结束的时候关闭进程就会释放所有内存,问题就解决了。很多时候这种问题对编程高手来说只是小事一桩,但对编程经验不足的人来说却是天大的难题。
另外,现在的确在不断涌现出新的大数据技术,让人们可以更方便快捷的做处理。但是那些还远未到能直接运用到交易数据分析上的程度。非常大的可能是,你需要去理解这些技术的工作原理,然后对你手里的交易数据做适当的转换,才能利用这些技术来分析数据。而这些都是和编程水平直接挂钩的。
二,信息受限
做Quant最重要的能力是发现数据中的规律。但如果你只能拿到二手数据,很多原始信息都被过滤掉了,而你连那些信息长什么样子都没见过,又怎么能去分析其中的规律呢?
这绝不是危言耸听,还是看实例。高频交易最好的数据是直接从交易所收下来的最原始的数据,这个数据包含所有订单操作(增,删,改,成交)的记录,是研究市场微结构的最佳选择。而这种数据的格式往往是特殊的二进制编码,而且要进行特定的重构,才能还原出交易的过程(增删改都是动作,需要作用在对应的数据结构上),没办法直接用数学软件做分析。
有一次,我的一个纯金融背景的Quant同事想要分析一些这样的数据,但他处理不了那种原始格式(Matlab显然是干不了这种事的),只好找我帮他。但我当时自己手里还有无数的任务在处理,没有太多时间,只能做最简单的处理,最后只把成交记录提取出来写成容易识别的格式给他。这样他拿到的数据里那些增删改的记录全都被过滤掉了,那他显然不可能去做任何关于这些记录的分析。
没错,对于一个Quant来说,当他受制于人的那一刻,就已经注定了是一场悲剧。
同样的事情,如果是我自己会怎么做呢?内嵌Java虚拟机进Mathematica或者R,底层解码用Scala,直接在程序内转成容易处理的数据结构,Mathematica/R建模,作图,方案确定以后直接把Scala程序传到云服务器上跑回测。整个流程可以一气呵成,不需要麻烦任何人,更重要的是,我手里的信息是完全的,所以可以分析任何我感兴趣的数据。
事实上,很多时候,秘密就隐藏在这些最原始的数据里。
~~~~~~~~~~~~~~
上面说了这么多,是不是意味着必须像计算机系同学一样,从头苦学所有计算机专业课呢?
当然不是。计算机专业的很多技能,像是操作系统,网络通信,编译器,多线程之类,都跟Quant的工作没什么关系,如果你对那些不熟悉,不用怕。
但是基本的数据结构和算法,是应该扎实掌握的。你应该知道数组,链表,哈希表这些数据结构的原理和区别,能够自己实现一些基本的搜索,排序算法,这会帮助你能正确的估算程序运行时间和需要的内存等资源,出现性能瓶颈的时候也可以自己分析。
对一些进程间通信的方式,比如文件,socket,或者共享内存,应该有基本的理解,这会让你能够组合不同的工具(比如Excel和C++)来实现复杂的功能,很多时候这些小组合会让你事半功倍。
有的同学希望推荐一些这方面的入门书籍,我思来想去,还是决定推荐这本经典的《
Introduction to Algorithms》和《
Computer Systems - A Programmer’s Perspective》。我承认这两本大部头看起来有一些难度,但是,
请大家努力学(hui)习(dao)。即使你只是简单的通读一遍,相信也会受益匪浅。
对编程语言也要多了解一些,特别是如果你没听说过函数式语言(
Functional programming),最好去学一下。这对Quant工作是有极大帮助的。
问题中提到的那几样C++功能,class/iostream/reference都是最基本的概念,只掌握这些是远远不够的。不过我也不建议一开始就拿C++试刀,就算是计算机科班出身,也没几个人能真正精通C++,做Quant又何必和自己过不去呢?去学一下Python或者Scala吧,这些比C++友好的多。对于Quant来说,他们才是传说中你等的那个人。
~~~~~~~~~~~~~~
最后说说那些trader为什么会说不需要太高深的编程水平。很简单,公司招人是需要你产出的,招你进来的时候编程水平是什么样他们心里有数,自然不会要求你做力所不及的事情。如果你满足于一直给别人打下手,只去做别人安排好的工作,出了问题找IT部门(如果有的话)解决,那保持现状也是可以的。
只是这样显然很难成为一名优秀的Quant。
走上Quant这条路,要有不断学习新技能的觉悟。像我们这些计算机出身的人,也要去补之前没学过的数学和金融。大家的背景不同,起点优势不同,但是努力的方向是一致的。
只有打通任督二脉的那一天,你才会成为真正的英雄。
到那时,你才不会再被代码困扰,只因为你心中已然无码。
若上天再给你一次机会面对那个意中人,
请记得告诉她:
只是因为在人群中多看了你一眼
再也没能忘掉你容颜
祝你幸福。
(全剧终)
~~~~~~~~~~~~~~
注:
有人问到我提到的分析软件组合。Mathematica, R, Java/Scala这三者可以任两者组合互通,我有时甚至三者连起来用。参考资料请看:
J/Link User Guide rJava - Low-level R to Java interface这当然不是唯一的技术栈。此间精髓仅在于灵活运用计算机知识进行组合搭配,打造最适合自己需要的终极大杀器。