2015-03-11

近期思考了下怎么开发量化投资系统,打算先开发出有效的统计系统,然后再研究程序自动交易, 因为自动交易肯定是难度最低的,而找出有效的交易模式是最不确定的。不过自动交易开发最有成就感,时刻勾引着我去开发。

第一个问题,选择什么语言开发?

由于我之前做网络游戏的全栈开发,接触过的也许和金融相关的知识:大规模高并发的处理、数据库开发、NPC行为树、决策机制、tcp/网络、概率,统计,线代。

不知道金融行业普遍的技术水品怎么样,不过一直作为IT业内技术领先的游戏行业,在技术开发上优于金融业还是有信心的。

客户端网络游戏大都使用C、C++作为主要开发语言,用Lua作为配置语言,或黏合C代码。但我打算完全使用LuaJit。

Lua是一种脚本语言,但是非常轻量,因此执行也非常快。Lua本身编译后只有20K,只有lua.exe和lua.dll两个文件。 和Lua相比所有其他语言都显得很笨重(特别是某些J开头的语言)。简单还带来很多好处,像学习成本低(我们都是让游戏策划写Lua的,可想而知)。

但如果因此你把Lua当作玩具就错了,Lua的语法很优雅,有Lisp的感觉,所以Torch才会那么的简洁; 更重要的是有LuaJIT这个实现,本身就很快了,有了它,使Lua变成了最快的脚本语言,没有之一,因为基本上是C级别的效率了。

Lua真的有公司作为核心使用么?国外早就开始使用Lua作为整个服务器端的主要语言,而不再是粘合或配置使用,其中我估计暴雪Wow就是。 我们自己从2009年开始就使用Lua作为服务器端的主要语言(超过95%),之后几年连客户端Lua代码也超过80%了。 我确定11年游戏业都还没这么超前, 因为那年和盛大合作时,问过他们都表示没不敢用动态语言写游戏服务器。大概14年后,很多公司开始转为用动态语言写游戏服务器了, 而且追求性能的游戏人们,首选果然就是Lua了。

总结下,为什么选择LuaJit? 因为:

  • 代码执行速度快,C级别,Lua的诞生有一部分就是故意针对Python的低效
  • 通过工具可以很简单的发现代码效率问题点,优化非常有效,速度更快
  • 可直接用ffi几乎无损性能的黏合C库,不用做额外工作
  • 代码优雅,调试方便,时间节约

基本上所有原因都是效率,有人说没必要那么讲究效率,那只是你没尝过效率的好处。 如果你有足够的计算力,可以直接无脑用大量计算碾压其他的那些量化系统,所以计算力就是一切! 再加上可以自己写cuda库,我目标是自己写的能达到业内最高的速度。

至少金融行业会越来越需要效率,而低效率闻名的Python只是在拖后腿而已。 举个例子,经常拿来比较的2500万次3*log(x) + cos(x) ^ 2计算,我电脑上python是15秒,纯Lua是6秒,而LuaJIT是0.76秒。从python里调用c库执行都要1.7秒。 虽说需要性能的地方你可以用c库来解决,但你冷不丁一个小地方就要用C库的感觉是什么?用了C库结果速度还没LuaJIT快的感觉是什么?不是吃屎是什么?用LuaJIT你可以真正只关心核心功能的效率。 20-30倍啊,科学栈多又怎么样?和这些相比,自己一个个重写根本不是事,反正用到的也就几个,只写自己需要的就行了。

你看到的这个博客就是Lua开发的。

然后是第二个问题,数据怎么处理?是否要用数据库?

考虑到分析是最重要的,对于分析系统我打算完全自己开发一套定制的数据库,以不用全部读到内存,并最大化速度为目标。 虽然以天为单位,这个可以简单的全部读到内存,然后处理。但我打算要能够处理以分钟为单位的数据。 记得哪个大牛说过最好的数据库就是定制的数据库。

数据源方面,国内我是用券商的FTP数据源;国外则是券商提供了获取的API。

分析系统以外的部分使用Redis,绝不使用糟糕的sql。这也是游戏行业的习惯。

Redis本身就是内存数据库,但相比直接内存读取,读取数据库还是要经过网络传输,慢几千倍(参考 每个程序员都应该知道的延迟数)。 所以数据库更多的作用是持久化,等到自动交易系统开发时,自动交易系统自己的数据用Redis来储存。

这么看来网络游戏行业还真是领先其他行业至少10年啊,在nosql概念还没出来前,网络游戏就讨厌sql尽量不用。在大家还 在用早期apache那种1连接1线程模式时,网络游戏就已遇到大量用户导致的c10k问题,普及epoll或iocp了。 最近lua又普及到人工智能行业了,不知道游戏行业最先喜爱的Lua是否能在将来带到所有其他行业去。


回主页