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

news2024/9/23 11:14:13

文章目录

  • 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 ARMA
    from 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 = None
    for param in parameters:
        try:
            model = ARMA(endog=data, order=(param[0], param[1])).fit()
        except ValueError:
            print("参数错误:", param)
            continue
        aic = model.aic
        if aic < best_aic:  # 选取最优的aic
            best_aic = model.aic
            result = (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      Smallest
 1%     -.023384        -.35985
 5%    -.0115851       -.349373
10%    -.0078976       -.325249       Obs             613,849
25%    -.0037067       -.324942       Sum of Wgt.     613,849

50%     .0000567                      Mean           .0004866
                        Largest       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.15

                             v5
-------------------------------------------------------------
      Percentiles      Smallest
 1%     .0073016       4.68e-07
 5%     .0112397       7.22e-07
10%     .0135353       7.84e-07       Obs             613,849
25%     .0180452       8.21e-07       Sum of Wgt.     613,849

50%     .0248626                      Mean           .0282546
                        Largest       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.coloradmin.cn/o/931303.html

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

相关文章

加油站抽烟烟火智能识别算法

加油站抽烟烟火智能识别系统通过yoloopencv网络模型图像识别分析技术&#xff0c;加油站抽烟烟火智能识别算法识别出抽烟和燃放烟火的情况&#xff0c;并发出预警信号以提醒相关人员&#xff0c;减少火灾风险。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的…

大彩串口屏使用记录

写在最前面 屏幕型号 DC10600M070 IDE VisualTFT&#xff08;官方&#xff09; VSCode&#xff08;lua编程&#xff09; 用之前看一下官方那个1小时的视频教程就大概懂控件怎么用了&#xff0c;用官方的软件VisualTFT很简单 本文只是简单记录遇到的一些坑 lua编辑器 VisualTF…

DOCKER容器中安装JDK1. 8 详细步骤

1、首先检查DOCKER环境是否安装成功 docker version在命令输入docker version命令显示如上图所示&#xff0c;则说明docker容器已经安装成功了&#xff0c;下面只需要根据步骤一步步操作即可在docker容器安装JDK。 2、通过DOCKER SEARCH命令查找远程镜像 docker search jdk3…

南京邮电大学操作系统实验报告一(Linux系统及进程创建)

文章目录 一、实验目的二、实验内容三、实验步骤&#xff08;附程序原码&#xff09;四、运行结果及其结果分析 一、实验目的 掌握Linux 操作系统的操作和使用;掌握Linux 下C 语言的编辑、编译、运行的全过程;掌握进程创建系统调用的使用。 二、实验内容 熟悉Linux 运行环境…

uview ui 查看版号

版本查询2种方式 有两种方式可以查询到正在使用的uView的版本&#xff1a; // 通过console.log打印的形式 console.log(uni.$u.config.v);// 可以查阅uView的配置文件得知当前版本号&#xff0c;具体位置为&#xff1a; /uview-ui/libs/config/config.js

实现文件上下文管理(__enter__和__exit__)

目录 一、上下文管理协议 二、模拟open 三、优点 python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5502 我们知道在操作文件对象的时候可以这么写 with open(a.txt) as f:代码块 上述叫做上下文管理…

Redis初始以及安装

"梦却了无影踪&#xff0c;梦仍不曾改动" 初始Redis (1) Redis是什么&#xff1f; 要认识、学习一个软件&#xff0c;最重要的途径无一是去该软件的官方文档里瞅瞅、转悠转悠。 从官方文档的介绍中得知&#xff0c;Redis是一种工作于内存&#xff0c;…

神奇小队之我爱画画

《神奇小队之我爱画画》&#xff0c;是南通神笔动漫科技有限公司2022年推出的原创系列动画剧集。 南通神笔动漫创立于2020年4月&#xff0c;公司专注于2-12岁儿童内容策划、运营文创企业。公司主要运营动漫IP《神奇画笔》&#xff0c;项目于2020年创立《神奇画笔》儿童IP&…

GBU812-ASEMI逆变器专用整流桥GBU812

编辑&#xff1a;ll GBU812-ASEMI逆变器专用整流桥GBU812 型号&#xff1a;GBU812 品牌&#xff1a;ASEMI 芯片个数&#xff1a;4 封装&#xff1a;GBU-4 恢复时间&#xff1a;&#xff1e;50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;200A 正向电流&…

【LeetCode-中等题】48. 旋转图像

文章目录 题目方法一&#xff1a;使用辅助数组矩阵 行列的规律方法二&#xff1a;原地修改 递推公式 题目 方法一&#xff1a;使用辅助数组矩阵 行列的规律 public void rotate(int[][] matrix) {int n matrix.length;int[][] matrix_new new int[n][n];for(int i 0 ; i<…

探索AIGC人工智能(Midjourney篇)(一)

文章目录 案例图片 Midjourney注册 创建Discord账号 下载客户端 添加Midjourney到自己的服务器 用Midjourney画一只会飞的鸭子 Midjourney绘画指令 Midjourney绘画指令_激发Midjourney的创造力 Midjourney绘画指令_Seed指令 Midjourney光线关键词&#xff0c;打造震撼…

深入剖析Kubernetes之容器技术概念入门篇

文章目录 进程层面隔离与限制容器镜像 容器本身没有价值&#xff0c;有价值的是“容器编排”。 也正因为如此&#xff0c;容器技术生态才爆发了一场关于“容器编排”的“战争”。而这次战争&#xff0c;最终以 Kubernetes 项目和 CNCF 社区的胜利而告终。 容器&#xff0c;到底…

Linux常用命令_网络命令、关机重启命令

文章目录 1. 网络命令1.1 网络命令: write1.2 网络命令: wall1.3 网络命令: ping1.4 网络命令: ifconfig1.5 网络命令: mail1.6 网络命令: last1.7 网络命令: lastlog1.8 网络命令: traceroute1.9 网络命令: netstat1.10 网络命令: setup1.11 挂载命令 2. 关机重启命令2.1 shut…

基于Java+SpringBoot+Vue前后端分离线上辅导班系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

移植U8g2图形库—驱动OLED显示(模拟IIC)

目录 1. 所需器件工具 2. IO端口配置 3. 移植步骤 3.1 精简c源码 3.1.1 去掉无用的驱动文件 3.1.2 精简u8g2_d_setup.c 3.1.3 精简u8g2_d_memory.c 3.2 创建函数 3.2.1 创建回调函数 3.2.2 创建测试函数 4. 添加u8g2源码到工程 4.1 项目文件配置 4.2 主函数main.c…

xsschallenge通关(11-15)

level 11 老规矩&#xff0c;先查看源码&#xff0c;做代码审计&#xff1a; <?php ini_set("display_errors", 0); $str $_GET["keyword"]; $str00 $_GET["t_sort"]; $str11$_SERVER[HTTP_REFERER]; $str22str_replace(">&quo…

[C++][C#]yolox TensorRT C++ C#部署

YOLOX是一种新型的高性能探测器&#xff0c;由开发者Zheng Ge、Songtao Liu、Feng Wang、Zeming Li和Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。与YOLOV5和YOLOV8相比&#xff0c;YOLOX具有更高的性能和更好的平衡&#xff0c;在速度和精度方面都表现出优越…

无涯教程-机器学习 - 数据统计

在进行机器学习项目时&#xff0c;通常无涯教程会忽略两个最重要的部分&#xff0c;分别是 数学 和 数据 。这是因为知道ML是一种数据驱动的方法&#xff0c;并且ML模型只会产生与提供给它的数据一样好的或坏的输出。 在上一章中&#xff0c;讨论了如何将CSV数据上传到ML项目中…

GMP原理与调度

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

Leetcode81. 搜索旋转排序数组 II

已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nu…