This is a homework for Program-Designing II of RUC, Write with QT
Keywords: sorting, data visualization, k-means clustering
Sample data:
读入数据为csv格式,需包含前六列且顺序相同
1.简述 对股票数据进行外排序、指标计算、索引、聚类分析(可选)、可视化等处理。
2.数据集准备 利用课程提供的2021年前A股所有股票的Daily数据(每天的开盘价、最高价、最低价、收盘价、以及交易金额等)。
数据文件Stoch_China.csv中,包含了各支股票的日交易信息,文件中包含多个字段信息,各字段信息由逗号间隔,形成标准的CSV格式。文件首行,用中文存储标注了各字段(即各列)含义。 备注:节假日或者周末等非交易日没有价格数据。CSV格式可以用sublime等工具打开。
3.任务描述 3.1任务——外排序(必须使用外排序,可以用于排序的内存大小为128MB):对原文件input.txt进行外排序,排序标准是首先按照股票代码的字典序进行排序,如果股票代码相同则按照日期从小到大进行排序,输出文件取名output.txt。 比如源文件Stock_China.csv(注意在文件里字段间用逗号隔开,此图表及后图表都是示意图表,大家根据文件内容,对应处理和理解): 那么经过排序后,结果output.txt如下(注意在文件里字段间用逗号隔开): 即全部价格数据已经按照股票代码的字典序、以及按照日期从小到大排序了。
3.2 任务——想办法加快数据访问: 方案1——针对每只股票、每个月,创建一个文件,以便通过股票名称和月份就可以访问到相应数据,比如“output_000001.SZ201812.txt”,表示股票“000001.SZ”的“201812”的数据(这时候,任务1生成一批小文件)。 方案2——建立索引:针对output.txt文件,针对每只股票、每个月份的价格数据的最开始一条数据在文件里的偏移量,建立索引项,生成文件index.txt(这时候,任务1只生成一个大文件output.txt)。 提示:以二进制文件方式打开output.txt,即可正确提取和设置文件的偏移量。 比如,对于上述output.txt(实际数据比这里展示的更多,但是不影响原理解释),由于其数据里包含000001.SZ和000055.SZ两只股票各1个月的数据,于是index.txt文件的内容如下: 000001.SZ,201812,在output.txt文件里该股票该月第一条数据开始的文件偏移量 000055.SZ,201306,在output.txt文件里该股票该月第一条数据开始的文件偏移量 由于output.txt是经过排序的,index.txt也是有序的。
3.3对股票价格进行可视化:开发QT程序,由用户指定股票代码和月份,采用3.2所述技术方案的辅助,快速定位某只股票、某个月的数据,在QT界面显示该月的价格数据的K线图。 比如借助index.txt的帮助,定位某只股票、某个月第一条数据在output.txt文件中的文件偏移量,从output.txt文件依次提取该股票该月份的数据。 备注:index.txt的内容可以完全载入内存,在内存建立股票代码、月份、文件偏移量的对照表,以便快速查找。 参考QTCustomPLot编写可视化代码。
3.4 指标计算:针对output.txt文件中的每只股票的相邻天的股票价格(close),把某天价格减去前一天的价格得到差分值,除以前一天价格,得到一个百分比(即(close price today – close price yesterday)/ close price yesterday),生成diff.txt文件。这个差分值,表达的是隔天收益率。比如对于下述output.txt文件(注意在文件里字段间用逗号隔开):
经过计算生成的diff.txt的文件内容为(注意在文件里字段间用逗号隔开):
针对diff.txt文件,针对每只股票的每个月的数据,计算该月份收益率的均值、收益率的标准差。每只股票的每个月的收益率均值除以其标准差,得到夏普指数。夏普指数衡量了某只股票某个月里的单位风险的收益。均值、标准差按照如下公式进行计算: 样本数据x_1,x_2,…,x_n 均值x ̅=(x_1+x_2+⋯+x_n)/n 标准差S=√(S^2 )=√((〖(x_1-x ̅)〗^2+〖(x_2-x ̅)〗^2+⋯+〖(x_n-x ̅)〗^2)/n) 然后每只股票的每个月的收益率均值、标准差、夏普指数写入另一个文件sharpe.txt。收益率均值、标准差、以及夏普指数的计算过程如下图所示:
sharpe.txt文件的内容如下(注意在文件里字段间用逗号隔开):
备注:每只股票的第一条数据没有前一天,那么该条数据无法计算差分,如果某只股票某个月的价格数据有20条,那么差分数据有19条;此外,不同股票之间没有差分一说。
3.5 查询某个月Sharpe指数排名前30的股票:开发QT程序,用户指定某个月份,提取该月份Sharpe指数排名前30的股票,按照夏普指数从大到小排序,以柱状图显示。 采用横向的柱状图进行可视化,纵坐标是各个股票,按照夏普指数从大到小从上到下排序,横坐标是夏普指数。 备注:Sharpe.txt文件较小,直接载入内存进行后续处理即可,无需为其建立索引。
3.6 预测价格变动:预测价格变动有两种做法,具体描述如下。 (1)为了展示对比,逐天预测。根据前几天的价格数据,预测接下来1天的4个价格(开盘价,收盘价,最高价,最低价):基于output.txt文件,用户指定某个股票某个月份,请提取该月份之前的数据,预测该月份第一天的价格;然后滚动预测,即把该月份第一天的真实价格加入历史数据,预测该月份第二天的价格,……,最后在QT界面上显示实际的价格和预测的价格; 1.用户指定2021.12月份 2.提取2021.11月份数据(从output.txt) 3.预测2021.12月份第1天的价格 4.把2021.12第1天真实价格(从output.txt)加入历史数据,旧的历史数据可以淘汰 5.预测2021.12月份第2天的价格 6.把2021.12第2天真实价格(从output.txt)加入历史数据,旧的历史数据可以淘汰 7.预测2021.12月份第3天的价格 8.把2021.12第3天真实价格(从output.txt)加入历史数据,旧的历史数据可以淘汰 … … n-1.预测2021.12月份最后1天的价格 n.把2021.12最后1天真实价格(从output.txt)加入历史数据,旧的历史数据可以淘汰 2021.12月份真实数据、2021.12月份预测数据,进行可视化和对比 (2) 为了精度排名,预测整月。此预测任务的过程如下: . 大作业检查期间,由老师临时公布要预测的股票和月份。 . 大家利用已有数据(不包括此股票待预测月份的数据)和自己的程序,限时预测。 . 预测输出指定股票、指定月份中每一天的收盘价,保存为指定格式的结果文件。 . 限定时间内,上传结果文件。 . 后台统计预测精度,并做排名,统计,输出最优TopN学生。 . 最终TopN的同学,将获得大作业加分。
提示:对于采用的预测办法不做限制,可以是随机、根据前几天的涨跌天数和涨跌幅进行判断、进行线性回归等。
备注:大作业基本要求完成任务1到任务6即可。拓展功能任务7和8,将作为加分项。
3.7(可选)动画显示历史上各个月份的夏普指数top 30:开发QT程序,提取每个月的top 30夏普指数的股票,timer设置为1秒,每秒显示一个月的股票数据,从最开始的月份到最末尾的月份循环播放。 采用横向的柱状图进行可视化,纵坐标是各个股票,按照夏普指数从大到小从上到下排序,横坐标是夏普指数。 备注:Sharpe.txt文件较小,直接载入内存进行后续处理即可,无需为其建立索引。
3.8(可选)针对某个月份,提取该月份的所有股票的均值、标准差、以及夏普指数,以均值、标准差作为指标,运行K-means聚类算法(可设定K=9),计算每只股票的类簇标签,类簇标签为0-8。 开发QT程序,显示散点图,并且根据每个数据点的(每只股票该月的均值、标准差为一个数据点)所属类簇的不同,渲染不同的颜色,比如red, blue, green, brown, pink, yellow, gray, black, cyan等。 K-means算法的执行过程如下: (1)在二维平面上(收益率均值、标准差各为一个坐标轴),在有效数据范围里面生成K=9个初始点P0,P1,P2,…,P8,作为9个类簇的初始中心点; (2)根据各个数据点(即每只股票该月的均值、标准差)和K个类簇中心点的欧式距离,选择最近的类簇中心,作为这个数据点的类簇。比如某只股票该月的均值、标准差和P6的距离最近,那么则指定这个数据点的类簇为6; (3)根据分配给每个类簇的数据点,重新计算每个类簇的中心点;比如把属于类簇6的所有数据点集中起来,对收益率均值、标准差两个字段分别求平均,就是该类簇的新的中心点即P6。 (4)交替执行(2)和(3),可以设定迭代次数为10、20次;,迭代一定次数以后,算法收敛(这里不展开K-means算法的损失函数介绍)。
4.提交办法 (1)说明文件(word格式) 每个任务的实现策略,描述主要的数据结构、算法流程等; 每个任务的输入界面,以及运行结果界面。 (2)源代码(拷贝整个项目文件夹) 视频(对大作业完成情况的介绍和演示),最大时长5分钟,限制视频大小。
把(1)(2)(3)打包压缩,命名为“学号姓名.zip”提交。