其实这是一个数据库部署和算法优化的问题,只是您的提问方式把它封装成了一个看似Quant的问题。类似的困境在很多其它领域也有。我这里把你的问题梳理一下,然后变成一个纯计算机问题,并提出我自己的解决方案。同时我相信在我梳理后,知乎上更多的数据处理大牛可以来拓展思路。
我自己曾经接触过的最大的一个数据是1986年1月1号到2011年12月31号的美国三大市场(NYSE,NASDAQ及AMEX)中所有股票的每日收盘数据,总共有48,796,680条记录,裸数据大小在2.5GB左右。数据从Wharton Research Data Stream (WRDS)获得,最开始的格式是CSV。
我当时的研究要对每个月的所有股票进行因子分析(Factor Analysis)来验证几个假设,最开始我打算使用R来做,因为一般小规模数据R做起来很方便,R你不熟悉没有关系,你可以理解为运算速度和编程思想类似Matlab的一个统计专用语言。很快我发现把这些数据全部读取进来就要花费巨量的时间,更不要说一个月一个月的运算了。当时手头有别的事情,因此我暂缓了这个研究。
后来有一天跟原来在Lehman Brother做Quant的一个朋友聊天,说到这个挑战,他建议我用MySQL来部署,然后通过数据库查询来加速特定月、特定公司的数据抓取。我当时豁然开朗,之前我使用数据库很多,但是由于大部分时间研究工作不用这么大数据,所以完全没有往这方面考虑。另一个原因是写数据库级别的研究代码要比纯R+CSV或者Matlab+CSV/Mat麻烦很多,我心理上回避这种思路。
之后老板催得急,我就开始具体化了,最后我使用Python+NumPy+SciPy+SQLite的架构,然后对SQLite进行了大量的索引、缓存等优化,最后使得整个code可以在10个小时内跑完。但是代价就是,我需要自己写程序计算线性回归的R Square、t-Stat等在Matlab、R中非常容易实现的任务。最终Python代码有2000行左右。
这个研究结束后,我又思考了很久这个问题,我觉得有两个补充的思路:
第一、分解数据:需要根据具体情况分析,比如我的研究,其实可以把大CSV原始数据拆解成每年每个月的(以yyyyMM.csv的格式储存),那子文件的数据量就可以降一到两个数量级,这样就可以用Matlab来处理,同时也间接完成了索引的工作。
第二、如果数据实在是非常巨型(100GB+),我建议采用非关系型数据库(MonoDB等)来处理。如果你有兴趣,可以看伯克利今年开的一门公开课:Big Data,来进一步学习:
UC Berkeley Course Lectures: Analyzing Big Data With Twitter
另外,说到专门的处理大型数据的软件,如果你要自己编程的操作性强,我觉得Q语言是一个,Morgan Stanley内部都是用Q来处理大型数据的研究问题,速度非常快。但是我觉得国内用的人应该很少,你要查中文资料应该也不方便,仅供参考。
— 完 —
本文作者:袁浩瀚
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 13 个回答,查看全部。
延伸阅读:
在数据分析、挖掘方面,有哪些好书值得推荐?
数据分析/挖掘工作的疑惑?