QT外排序应用

2 篇文章 0 订阅
1 篇文章 0 订阅

说明

(这是对之前用QT分析大文件的时候做的一些整理,仅提供参考,也有很多不足之处,希望读者可以指正。)
对这样一个股票的数据文件进行分析,计算出涨跌额、涨跌幅、夏普比率等。
数据文件如下:
在这里插入图片描述
数据结构如下

列名类型描述示例
datedatetime交易日期2006-04-20
symbolstring股票代码sh600004
openfloat开盘价2.94
highfloat最高价2.94
lowfloat最低价2.88
closefloat收盘价2.89
volumefloat成交量7889751.0
outstanding_sharefloat流动股本476000000.0
turnoverfloat换手率=成交量/流动股本0.0165751071428514

分析

通常对于一般的文件进行分析,不过是通过高级编程语言IO接口来将文件内的数据读入内存,然后对内存中的数据进行分析即可。但是对于大文件的分析,通过直接读写文件是不可行的,比如几个G大小的文件的分析,如果要先把数据读入内存然后再对内存里的数据进行分析,这就对内存的要求比较高,显然,一般我们不会采取这样的做法。
例如要对1GB的文件依据某一项来进行排序,我们可以先将其分割为5个大小为200MB的文件,然后对这5个文件分别进行外排序,此处我采用归并+快排的方式来进行排序,最后再将这5个文件进行两两归并。(实践可知这种方式可行,但并不是最优。读者可以自行使用最优的方式)

计算涨跌额和涨跌幅

  1. 计算涨跌额
    涨跌额 = 今日收盘价 – 昨日收盘价
    将文件中的每个数据按照逗号分割为一个个数据项,然后将这一天数据项的收盘价提取出来减去前一天数据项的收盘价,即可得出。
    (用EditPlus打开时的模样)在这里插入图片描述

  2. 计算涨跌幅
    涨跌幅 = (涨跌额 / 昨日收盘价)* 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个有序文件进行归并,得到一个最终的有序文件。

  1. 数据文件在这里插入图片描述

  2. 分割大文件
    在这里插入图片描述

  3. 分割成微量文件
    将zn_resultN.csv分成若干个大小只有500个数据的merge_sort_num.csv
    merge_sort_num.csv为进行快排的单位文件
    在这里插入图片描述

  4. 归并单位文件
    merge_sort_num进行二路归并,两两归并
    最终归并成zn_resultN.csv
    在这里插入图片描述

  5. 子文件zn_result_num.csv归并整个按照日期排序的大文件zn_result_final.csv
    在这里插入图片描述

  6. 进行涨跌幅排序
    将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

结束语

代码比较简陋,系统也不健全,只为了完成相应的功能,所以没有那么高的要求,读者可以自行健全功能。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值