计算机竞赛 基于大数据的股票量化分析与股价预测系统

文章目录

  • 0 前言
  • 1 课题背景
  • 2 实现效果
  • 3 设计原理
    • QTCharts
    • arma模型预测
    • K-means聚类算法
    • 算法实现关键问题说明
  • 4 部分核心代码
  • 5 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于大数据的股票量化分析与股价预测系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题背景

基于大数据的股票可视化分析平台设计,对股票数据进行预处理,清洗以及可视化分析,同时设计了软件界面。

2 实现效果

价格可视化
在这里插入图片描述
魔梯访问与指标计算

在这里插入图片描述
聚类分析
在这里插入图片描述

3 设计原理

QTCharts

简介

QtCharts是Qt自带的组件库,其中包含折线、曲线、饼图、棒图、散点图、雷达图等各种常用的图表。而在地面站开发过程中,使用折线图可以对无人机的一些状态数据进行监测,更是可以使用散点图来模拟飞机所在位置,实现平面地图的感觉。

使用Qt
Charts绘制,大概可以分为四个部分:数据(QXYSeries)、图表(QChart)、坐标轴(QAbstractAXis)和视图(QChartView)。这里就不一一给大家介绍了,下面给大家说一下QtCharts的配置安装。

QtCharts模块的C++类

在这里插入图片描述

arma模型预测

简介

ARMA模型,又称为ARMA
(p,q)模型。其核心思想就是当前正如名字所显示的,整个模型的核心就是要确定p和q这两个参数。其中,p决定了我们要用几个滞后时期的价格数据,而q决定了我们要用几个滞后时期的预测误差。

在这里插入图片描述

简单来说,ARMA模型做了两件事。一是基于趋势理论,用历史数据来回归出一个当前的价格预测,这个预测反映了自回归的思想。但是这个预测必然是有差异的,所以ARMA模型根据历史的预测误差也回归出一个当前的误差预测,这个预测反映了加权平均的思想。用价格预测加上误差预测修正,才最终得到一个理论上更加精确的最终价格预测。

比起简单的自回归模型或者以时间为基础的简单趋势预测模型,ARMA模型最大的优势,在于综合了趋势理论和均值回归理论,理论上的精确度会比较高。

    '''自回归滑动平均模型'''from statsmodels.tsa.arima_model import ARMAfrom itertools import product​     ```
def myARMA(data):p = range(0, 9)q = range(0, 9)parameters = list(product(p, q))  # 生成(p,q)从(0,0)到(9,9)的枚举best_aic = float('inf')result = Nonefor param in parameters:try:model = ARMA(endog=data, order=(param[0], param[1])).fit()except ValueError:print("参数错误:", param)continueaic = model.aicif aic < best_aic:  # 选取最优的aicbest_aic = model.aicresult = (model, param)return result
```

K-means聚类算法

基本原理

k-Means算法是一种使用最普遍的聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果就越好。该算法不适合处理离散型属性,但对于连续型属性具有较好的聚类效果。

聚类效果判定标准

使各个样本点与所在簇的质心的误差平方和达到最小,这是评价k-means算法最后聚类效果的评价标准。

在这里插入图片描述

算法实现步骤

1)选定k值

2)创建k个点作为k个簇的起始质心。

3)分别计算剩下的元素到k个簇的质心的距离,将这些元素分别划归到距离最小的簇。

4)根据聚类结果,重新计算k个簇各自的新的质心,即取簇中全部元素各自维度下的算术平均值。

5)将全部元素按照新的质心重新聚类。

6)重复第5步,直到聚类结果不再变化。

7)最后,输出聚类结果。

算法缺点

虽然K-Means算法原理简单,但是有自身的缺陷:

1)聚类的簇数k值需在聚类前给出,但在很多时候中k值的选定是十分难以估计的,很多情况我们聚类前并不清楚给出的数据集应当分成多少类才最恰当。

2)k-means需要人为地确定初始质心,不一样的初始质心可能会得出差别很大的聚类结果,无法保证k-means算法收敛于全局最优解。

3)对离群点敏感。

4)结果不稳定(受输入顺序影响)。

5)时间复杂度高O(nkt),其中n是对象总数,k是簇数,t是迭代次数。

算法实现关键问题说明

K值的选定说明

根据聚类原则:组内差距要小,组间差距要大。我们先算出不同k值下各个SSE(Sum of
squared
errors)值,然后绘制出折线图来比较,从中选定最优解。从图中,我们可以看出k值到达5以后,SSE变化趋于平缓,所以我们选定5作为k值。

在这里插入图片描述

初始的K个质心选定说明

初始的k个质心选定是采用的随机法。从各列数值最大值和最小值中间按正太分布随机选取k个质心。

关于离群点

离群点就是远离整体的,非常异常、非常特殊的数据点。因为k-
means算法对离群点十分敏感,所以在聚类之前应该将这些“极大”、“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。离群点的判定标准是根据前面数据可视化分析过程的散点图和箱线图进行判定。

4 部分核心代码

#include "kmeans.h"
#include "ui_kmeans.h"kmeans::kmeans(QWidget *parent) :QDialog(parent),ui(new Ui::kmeans)
{this->setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);ui->setupUi(this);
}kmeans::~kmeans()
{delete ui;
}void kmeans::closeEvent(QCloseEvent *)
{end_flag=true;
}void kmeans::on_pushButton_clicked()
{end_flag=false;//读取数据QFile sharpe("sharpe.txt");sharpe.open(QIODevice::ReadOnly|QIODevice::Text);std::vector<std::array<double,2>> data;while(!sharpe.atEnd()){QStringList linels=QString(sharpe.readLine()).split(',');qreal mean=linels[3].toDouble();qreal sd=linels[4].toDouble();if(mean>-0.06&&mean<0.06&&sd<0.12)data.push_back({mean,sd});}std::random_shuffle(data.begin(),data.end());sharpe.close();//聚类ui->pushButton->setText("聚类中...");QApplication::processEvents();auto labels=std::get<1>(dkm::kmeans_lloyd(data,9));ui->pushButton->setText("开始");QApplication::processEvents();//作图QChart *chart = new QChart();//chart->setAnimationOptions(QChart::SeriesAnimations);//chart->legend()->setVisible(false);QList<QScatterSeries*> serieses;QList<QColor> colors{QColor(Qt::black),QColor(Qt::cyan),QColor(Qt::red),QColor(Qt::green),QColor(Qt::magenta),QColor(Qt::yellow),QColor(Qt::gray),QColor(Qt::blue),QColor("#A27E36")};for(int i=0;i<9;i++){QScatterSeries *temp = new QScatterSeries();temp->setName(QString::number(i));temp->setColor(colors[i]);temp->setMarkerSize(10.0);serieses.append(temp);chart->addSeries(temp);}chart->createDefaultAxes();/*v4
-------------------------------------------------------------Percentiles      Smallest1%     -.023384        -.359855%    -.0115851       -.349373
10%    -.0078976       -.325249       Obs             613,849
25%    -.0037067       -.324942       Sum of Wgt.     613,84950%     .0000567                      Mean           .0004866Largest       Std. Dev.      .0130231
75%     .0041332        1.28376
90%     .0091571        1.52169       Variance       .0001696
95%     .0132541        2.73128       Skewness       95.21884
99%     .0273964        4.56203       Kurtosis       28540.15v5
-------------------------------------------------------------Percentiles      Smallest1%     .0073016       4.68e-075%     .0112397       7.22e-07
10%     .0135353       7.84e-07       Obs             613,849
25%     .0180452       8.21e-07       Sum of Wgt.     613,84950%     .0248626                      Mean           .0282546Largest       Std. Dev.      .0213631
75%     .0343356         3.2273
90%     .0458472        3.32199       Variance       .0004564
95%     .0549695        4.61189       Skewness       68.11651
99%     .0837288        4.75981       Kurtosis       11569.69*/QValueAxis *axisX = qobject_cast<QValueAxis *>(chart->axes(Qt::Horizontal).at(0));axisX->setRange(-0.06,0.06);axisX->setTitleText("平均值");axisX->setLabelFormat("%.2f");QValueAxis *axisY = qobject_cast<QValueAxis *>(chart->axes(Qt::Vertical).at(0));axisY->setRange(0,0.12);axisY->setTitleText("标准差");axisY->setLabelFormat("%.2f");ui->widget->setRenderHint(QPainter::Antialiasing);ui->widget->setChart(chart);int i=0;auto labelsiter=labels.begin();for(auto &&point : data){if(end_flag)return;serieses[*labelsiter]->append(QPointF(point[0],point[1]));i++;labelsiter++;if(i%1000==0){QApplication::processEvents();}}
}void kmeans::on_pushButton_2_clicked()
{end_flag=true;
}

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GMP原理与调度

GMP原理和调度 1.Golang"调度器"的由来1.1单进程时代不需要调度器1.2多进程/线程时代有了调度器需求1.3协程来提高cpu利用率 1.Golang"调度器"的由来 1.1单进程时代不需要调度器 早期的操作系统每个程序就是一个进程&#xff0c;直到一个程序运行完毕&am…

pandas由入门到精通-数据透视表

采集的数据存储后通常会分为多个文件或数据库,如何将这些文件按需拼接,或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引,stack,unstack,seet_index,reset_index等帮助重构数据,数据的拼接如merge,join,concat,combine_first等帮助连接数据,以及数据透视表…

1.7 【MySQL】常用存储引擎

MySQL 支持非常多种存储引擎&#xff0c;我这先列举一些&#xff1a; 存储引擎 描述 ARCHIVE 用于数据存档&#xff08;行被插入后不能再修改&#xff09; BLACKHOLE 丢弃写操作&#xff0c;读操作会返回空内容 CSV 在存储数据时&#xff0c;以逗号分隔各个数据项 FEDE…

微信小程序发布迭代版本后如何提示用户强制更新新版本

在点击小程序发布的时候选择&#xff0c;升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal

深度学习9:简单理解生成对抗网络原理

目录 生成算法 生成对抗网络&#xff08;GAN&#xff09; “生成”部分 “对抗性”部分 GAN如何运作&#xff1f; 培训GAN的技巧&#xff1f; GAN代码示例 如何改善GAN&#xff1f; 结论 生成算法 您可以将生成算法分组到三个桶中的一个&#xff1a; 鉴于标签&#…

火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 短视频正在成为越来越多人发现世界的窗口&#xff0c;其背后的创作者生态建设是各大短视频 APP 不可忽视的重要组成部分。 为了激励更多优质内容生产&#xff0c;某…

iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合

效果图 需求&#xff0c;由于视图层级的原因&#xff0c;需要对图片分开进行磨砂&#xff0c; 然后组合在一起 如图&#xff0c;上下两部分&#xff0c;上下两个UIImageVIew大小相同&#xff0c;都是和图片同样的大小&#xff0c;只是上面的UIimageVIew 只展示上半部份 &#…

初识【类和对象】

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的…

stm32之9.中断优先级配置

主函数main.c #include <stm32f4xx.h> #include "led.h" #include "key.h"#define PAin(n) (*(volatile uint32_t *)(0x42000000 (GPIOA_BASE0x10-0x40000000)*32 (n)*4)) #define PEin(n) (*(volatile uint32_t *)(0x42000000 (GP…

pytorch里面的nn.AdaptiveAvgPool2d

今天遇到nn.AdaptiveAvgPool2d((None, 1)) AdaptiveAvgPool2d函数详细解释&#xff1a; 2D自适应平均池化&#xff08;2D adaptive average pooling&#xff09;是一种对输入信号进行二维平均池化的操作&#xff0c;输入信号由多个输入平面&#xff08;input planes&#xff0…

为什么学嵌入式还要学单片机和人工智能?

从企业用人需求的角度来看&#xff0c;许多企业在招聘嵌入式工程师时都希望其具备一定的技能要求。其中&#xff0c;熟悉STM32单片机开发、熟悉嵌入式Linux开发以及熟悉实时操作系统开发&#xff0c;如FreeRTOS等&#xff0c;是常见的要求。掌握这些技术点的课程将为学生提供更…

成都国际车展来袭:有颜值有实力 大运新能源两款车型备受关注

今年成都国际车展现场最大看点是什么&#xff1f;诸多实力车企汇聚一堂各显神通&#xff0c;形式各样的新能源车型更是吸晴无数&#xff0c;成为消费者的购车首选。老品牌、新势力的大运新能源独具匠心设计特色展台&#xff0c;旗下两款车型悦虎和远志M1重磅登场。两款车型既有…

【设备树笔记整理6】中断系统中的设备树

1 中断概念的引入与处理流程 1.1 中断处理框图 1.2 中断程序的使用 主函数() while(1) {do_routine_task(); }中断处理函数() {handle_interrupt_task(); }如何调用中断处理函数&#xff1f; 1.3 ARM对异常(中断)的处理过程 &#xff08;1&#xff09;初始化 ① 设置中断…

Apollo自动驾驶:引领未来的智能出行

自动驾驶技术正日益成为当今科技领域的焦点&#xff0c;它代表着未来出行的一大趋势&#xff0c;而Baidu公司推出的Apollo自动驾驶平台则在这一领域中展现出强大的领导地位。本文将深入探讨Apollo自动驾驶技术的关键特点、挑战以及它对未来智能出行的影响。 Apollo自动驾驶平台…

wx:for的使用和事件传参,解构赋值的应用

在页面的.js文件中创建了一个对象&#xff0c; 并且在页面的view中调用了两种不同的方法将对象中的元素显示出来&#xff01; 第2种代码要加强理解&#xff01;&#xff01;&#xff01; 小程序中的wx:if wx:elif wx:else 其实好像c语言中的 if-elif-else 在页面的.j…

一个专业级 AI 聊天浏览器,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 在 AI 模型大爆炸的今天&#xff0c;我们每天都能在技术圈见证无数个大语言模型诞生&#xff0c;其诞生速度之快&#xff0c;着实让人看得目不暇接。 对于热衷于体验、调试、评测各种大模型…

Pytorch-day08-模型进阶训练技巧

PyTorch 模型进阶训练技巧 自定义损失函数 如 cross_entropy L2正则化动态调整学习率 如每十次 *0.1 典型案例&#xff1a;loss上下震荡 1、自定义损失函数 1、PyTorch已经提供了很多常用的损失函数&#xff0c;但是有些非通用的损失函数并未提供&#xff0c;比如&#xf…

如何优化因为高亮造成的大文本(大字段)检索缓慢问题

首先还是说一下背景&#xff0c;工作中用到了 elasticsearch 的检索以及高亮展示&#xff0c;但是索引中的content字段是读取的大文本内容&#xff0c;所以后果就是索引的单个字段很大&#xff0c;造成单独检索请求的时候速度还可以&#xff0c;但是加入高亮之后检索请求的耗时…

开始MySQL之路——MySQL约束概述详解

MySQL约束 create table [if not exists] 表名(字段名1 类型[(宽度)] [约束条件] [comment 字段说明],字段名2 类型[(宽度)] [约束条件] [comment 字段说明],字段名3 类型[(宽度)] [约束条件] [comment 字段说明] )[表的一些设置]; 概念 约束英文&#xff1a;constraint 约束实…

GeoHash之存储篇

前言&#xff1a; 在上一篇文章GeoHash——滴滴打车如何找出方圆一千米内的乘客主要介绍了GeoHash的应用是如何的&#xff0c;本篇文章我想要带大家探索一下使用什么样的数据结构去存储这些Base32编码的经纬度能够节省内存并且提高查询的效率。 前缀树、跳表介绍&#xff1a; …