Why python ,not java
我们选用Java作为API语言是因为……我们只会Java——这并不是一句单纯的玩笑话。
在API设计之初,我们的确想过用Python,然而最初的创始人(我和@licco-li)对于Python几乎完全不了解,而我们(主要是我)当时天真地认为Java自从JDK1.8开始从语法层面跟Python几乎没有明显的劣势,所以用Java来写一套量化交易API只是没人敢想而不是做不出来。于是决定先用Java来写这一套名为“Market Hammer”的算法引擎及API。
当然为了实现一个完整的量化平台,光有一个引擎是不行的。后台还有撮合引擎、风险值计算器、数据源等模块,还有一系列支撑平台的调度模块,总共30余万行代码(自动生成的有约10万行,主要是通信框架,类似现在的gRPC,只不过当时它还没有出现。我们自己实现了一套Netty+ProtoBuffer+gRPC的类似物——不是定制——以满足高性能要求)。这些都是现在平台性能的关键:当你选择股票的数量在100个以下时,不管回测时段选的是1年还是10年,回测速度几乎没有区别。因为主要瓶颈不在回测运行上。我们以后还会进一步优化编译这个步骤,已经有方案,大概还可以节约0.5秒左右。
这一切看起来很美,但是……
近期我们请了一些实习生来帮我们开发一些基本的策略,并发在论坛上供大家学习参考。直到上个月中,我们发现了Java语言的局限性。Java的局限性并不在于语言本身,而是在于它的社区,确切地说,是科学计算的社区。
Java诞生的目的是为了工程,所以它是强类型+静态类型的语言。而Python一开始就是为科学计算准备的,它是强类型+动态类型的语言。强类型保证了数据的严谨性(如 s = "1" + 1会报错,而不会返回2),动态类型又使得开发比较简便,当然牺牲了一大部分类型推导能力及性能,使得它不适合做复杂的系统工程。
后来各大投行开始从经济上支持Python的科学计算社区,使得Python的科学工具栈无比强大。如果Java也有Python的工具栈,Python一行搞定的事情Java也不需要两行,然而Java就是没有。
我个人非常想将Java推向科学计算领域,因为它相对于C++来说,性能上并不吃亏,而语言本身比C/C++简单太多(GC就不提了因为C++11开始也有了),非常适合科学计算使用——只要有合适的工具搞定编译和运行。然并卵。Python已经在那里,并且很强大,我不能凭一己之力,Ricequant也不能凭一个平台之力来改变这个现状。不能硬来,只能妥协,所以我们将推出Python版本的API,包括基于Jupyter(IPython Notebook)的研究平台,以及基于Python的API(背后仍然调用Java以保证性能及稳定性)。以后我们会同时维护两套API,各有各的工具链,也各有优势。
直到某一个平台的用户数降到0。