您的位置:首页 > 理论基础 > 数据结构算法

基于历史K线数据比较的量化选股方法及其系统分享(第2章 C主程序---关键数据结构)

2017-04-20 14:25 585 查看
第2章C主程序---关键数据结构

 

要进行分析比较,就需要将所有的高频数据放在内存中,我们来计算一下A股2010年至今高频数据的总量是多大。

 

假设高频数据为15分钟,30分钟,60分钟,日线一共4种类型。

每个类型的K线需要保存开盘,最高,最低,收盘,成交量,成交额六类数据。

分别用浮点型(4字节),浮点型(4字节),浮点型(4字节),浮点型(4字节),整形(4字节),长整形(8字节)来保存,则1根K线数据量为4+4+4+4+4+8=28字节(暂不考虑其它开销):

则1天内总的数据量:

15分钟线:16 * 28字节= 448字节

30分钟线:8 * 28字节 = 224字节

60分钟线:4 * 28字节 = 112字节

日线:    1 * 28字节 = 28字节

总计:812字节/天

 

A股3200支股票 812 *3200 = 2598400字节/天

2010年至今约7.5年,每年240个交易日共计1800天

那么总的数据量为 1800 * 2598400 = 4.7GB

 

这里有两种方案保存这些数据:

1)  数据放在SSD上。

2)  数据放在内存中。

 

选择不同数据存储方案会导致后续数据读取和计算方案不同:放在内存中,可以做到实时计算,速度会比较快,并且可以做到并发查询,但是比较消耗内存;放置在SSD上,需要用到的时候即使调取,这种做法速度会比较慢,但是支持更大数据量,对计算主机的内存要求不高。

 

综合考虑,目前最小15分钟粒度的情况下,采用全内存方案,8GB内存机器即可满足需求,因此设计采用将数据全部加载到内存中的方案来实现。

 

将数据全部加载到内存中后,需要考虑下面几点:

1)  快速定位需要的股票并读取数值参与计算。

2)  可以动态扩充K线数值,即实时计算和运行时动态增加。

3)  可以快速从磁盘备份和恢复数据,这个主要考虑程序的故障恢复,启动时,要近似以磁盘最高读取速度加载数据。(若采用固态盘,主程序5秒内加载完所有数据并启动)

 

基于这个思路,设计数据结构如下:

 



 

1)  股票列表采用数组,因为它基本不变,如果需要新增或减少,重建数组即可。另一个重要的原因是基于数组可以实现二分法查找,对于频繁的查询请求,迅速定位到股票代码是十分重要的性能衡量标准,利用二分法可以基本定位时间忽略不计。

2)  对于每个股票的不同K线级别,采用链表形式,即15分钟à30分钟à60分钟à日线,每种级别互补干扰,分别申请内存存放,避免采用超大块内存。

3)  每个股票的每个K线中的数据采用数组存放,即开,高,低,收,成交量,成交金额六个数值为一个数组元素,所有时间数组元素组成一个数组。在使用时,基本都是从某时间段开始顺序访问,因此采用数组可以很方便定位需要的数据;并且数组可以方便实现动态扩充,在数组元素填满后,释放、重新申请、拷贝即可。

4)  基于上述链式结构,可以将数据整块dump到文件,实现数据备份,程序启动时也可以整块直接读入内存,实现程序快速启动,数据快速恢复。

 

5)  其它开销,每个股票有很多标记位,例如是否已经启用,当前级别数组已用空间和最大空间等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息