说明
(这是对之前用QT分析大文件的时候做的一些整理,仅提供参考,也有很多不足之处,希望读者可以指正。)
对这样一个股票的数据文件进行分析,计算出涨跌额、涨跌幅、夏普比率等。
数据文件如下:
数据结构如下
列名 | 类型 | 描述 | 示例 |
---|---|---|---|
date | datetime | 交易日期 | 2006-04-20 |
symbol | string | 股票代码 | sh600004 |
open | float | 开盘价 | 2.94 |
high | float | 最高价 | 2.94 |
low | float | 最低价 | 2.88 |
close | float | 收盘价 | 2.89 |
volume | float | 成交量 | 7889751.0 |
outstanding_share | float | 流动股本 | 476000000.0 |
turnover | float | 换手率=成交量/流动股本 | 0.0165751071428514 |
分析
通常对于一般的文件进行分析,不过是通过高级编程语言IO接口来将文件内的数据读入内存,然后对内存中的数据进行分析即可。但是对于大文件的分析,通过直接读写文件是不可行的,比如几个G大小的文件的分析,如果要先把数据读入内存然后再对内存里的数据进行分析,这就对内存的要求比较高,显然,一般我们不会采取这样的做法。
例如要对1GB的文件依据某一项来进行排序,我们可以先将其分割为5个大小为200MB的文件,然后对这5个文件分别进行外排序,此处我采用归并+快排的方式来进行排序,最后再将这5个文件进行两两归并。(实践可知这种方式可行,但并不是最优。读者可以自行使用最优的方式)
计算涨跌额和涨跌幅
-
计算涨跌额
涨跌额 = 今日收盘价 – 昨日收盘价
将文件中的每个数据按照逗号分割为一个个数据项,然后将这一天数据项的收盘价提取出来减去前一天数据项的收盘价,即可得出。
(用EditPlus打开时的模样) -
计算涨跌幅
涨跌幅 = (涨跌额 / 昨日收盘价)* 100%
将计算出的涨跌额与前一天的收盘价相比计算出涨跌额
外排序
实现思想:二路归并+快排
将200MB的数据文件分割为大小为含有200条数据的数据文件,然后再对这个小数据文件进行快速排序,这时这些数据文件已为排好序的文件,然后再将这些数据文件两两归并 , 比如400个已排好的数据文件,1与400归并排序写入1中删除400,2与399归并排序写入2中并删除399,3与398…200与201归并,此时再进行一次归并:1与200、2与199、…、100与101经过几次的归并,只剩下一个数据文件,然后再对第二个200MB、第三个200MB、第四第五个进行归并得到5个有序文件,再对5个有序文件进行归并,得到一个最终的有序文件。
-
数据文件
-
分割大文件
-
分割成微量文件
将zn_resultN.csv分成若干个大小只有500个数据的merge_sort_num.csv
merge_sort_num.csv为进行快排的单位文件
-
归并单位文件
merge_sort_num进行二路归并,两两归并
最终归并成zn_resultN.csv
-
子文件zn_result_num.csv归并整个按照日期排序的大文件zn_result_final.csv
-
进行涨跌幅排序
将zn_result_final.csv中的同一天的所有数据取出来,按照涨跌幅从大到小排序
排序结果存入final.csv中
查找
查找并不难,根据关键字进行查找即可,这里的关键字就是股票代码,而此条件中需要查找的是某一月份涨跌幅最大的topK只股票,这个是基于上一条而实现的。既先对时间进行排序,然后在同一时间的情况下再依据涨跌幅进行排序(具体实现原理参照上一条,而具体实现后面会附有代码包,读者可以自行下载。)。
查询2021年01 月14日 top 10的数据
计算夏普比率
根据计算出的涨跌额和涨跌幅算出夏普比率
读出zn_result_ratio.csv 计算出夏普比率 存入sharpeRatio.csv
另存一个文件sharpeRatio.csv
可视化
输入年份,在sharpeRatio.csv中查找出在这个年份夏普比率最大的十只股票,并将其规定日期的数据可视化。
代码包和数据文件
https://pan.baidu.com/s/1oCcHJspPayHb-AsGg2vVug
链接
提取码:i23e
结束语
代码比较简陋,系统也不健全,只为了完成相应的功能,所以没有那么高的要求,读者可以自行健全功能。