基于历史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) 其它开销,每个股票有很多标记位,例如是否已经启用,当前级别数组已用空间和最大空间等。
要进行分析比较,就需要将所有的高频数据放在内存中,我们来计算一下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) 其它开销,每个股票有很多标记位,例如是否已经启用,当前级别数组已用空间和最大空间等。
相关文章推荐
- 基于历史K线数据比较的量化选股方法及其系统分享
- 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)
- 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)
- 基于XMPP协议的低传输负载的即时通信方法及其系统 -专利
- 量化策略方法分享之数据挖掘工具——决策树算法
- 用系统NSUserDefaults方法保存历史数据
- 展示主数据的历史变化的几种业务需求及其实现方法
- 获取历史K线数据的几个方法
- VC#.NET下基于WinForm的系统登录程序解决方法
- 基于ArcSDE对影像数据的管理方法及其缺陷(原创)
- 用系统NSUserDefaults方法保存历史数据
- 基于数据兼容的软件升级方法、客户端、服务器及系统
- 网络环境下的程序挖掘方法及其程序挖掘系统
- VC#.NET下基于WinForm的系统登录程序解决方法
- 量化投资数据挖掘及其相关方法
- 一种基于精简配置系统的块设备缓存装置及其方法
- 提供文华wh3 赢智程序化历史数据导出软件 破解200根k线的限制 包含1分钟 5分钟 15分钟等各种周期
- zz VC#.NET下基于WinForm的系统登录程序解决方法
- 异步获取的表单数据后台程序没有获取的一种情况及其解决方法
- 【量化小讲堂-Python&Pandas系列06】历史数据告诉你:KDJ指标选股有效吗?