0 前言
?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 基于大數(shù)據(jù)的股票量化分析與股價(jià)預(yù)測(cè)系統(tǒng)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
1 課題背景
基于大數(shù)據(jù)的股票可視化分析平臺(tái)設(shè)計(jì),對(duì)股票數(shù)據(jù)進(jìn)行預(yù)處理,清洗以及可視化分析,同時(shí)設(shè)計(jì)了軟件界面。
2 實(shí)現(xiàn)效果
價(jià)格可視化
魔梯訪問與指標(biāo)計(jì)算
聚類分析
3 設(shè)計(jì)原理
QTCharts
簡(jiǎn)介
QtCharts是Qt自帶的組件庫(kù),其中包含折線、曲線、餅圖、棒圖、散點(diǎn)圖、雷達(dá)圖等各種常用的圖表。而在地面站開發(fā)過(guò)程中,使用折線圖可以對(duì)無(wú)人機(jī)的一些狀態(tài)數(shù)據(jù)進(jìn)行監(jiān)測(cè),更是可以使用散點(diǎn)圖來(lái)模擬飛機(jī)所在位置,實(shí)現(xiàn)平面地圖的感覺。
使用Qt Charts繪制,大概可以分為四個(gè)部分:數(shù)據(jù)(QXYSeries)、圖表(QChart)、坐標(biāo)軸(QAbstractAXis)和視圖(QChartView)。這里就不一一給大家介紹了,下面給大家說(shuō)一下QtCharts的配置安裝。
QtCharts模塊的C++類
arma模型預(yù)測(cè)
簡(jiǎn)介
ARMA模型,又稱為ARMA (p,q)模型。其核心思想就是當(dāng)前正如名字所顯示的,整個(gè)模型的核心就是要確定p和q這兩個(gè)參數(shù)。其中,p決定了我們要用幾個(gè)滯后時(shí)期的價(jià)格數(shù)據(jù),而q決定了我們要用幾個(gè)滯后時(shí)期的預(yù)測(cè)誤差。
簡(jiǎn)單來(lái)說(shuō),ARMA模型做了兩件事。一是基于趨勢(shì)理論,用歷史數(shù)據(jù)來(lái)回歸出一個(gè)當(dāng)前的價(jià)格預(yù)測(cè),這個(gè)預(yù)測(cè)反映了自回歸的思想。但是這個(gè)預(yù)測(cè)必然是有差異的,所以ARMA模型根據(jù)歷史的預(yù)測(cè)誤差也回歸出一個(gè)當(dāng)前的誤差預(yù)測(cè),這個(gè)預(yù)測(cè)反映了加權(quán)平均的思想。用價(jià)格預(yù)測(cè)加上誤差預(yù)測(cè)修正,才最終得到一個(gè)理論上更加精確的最終價(jià)格預(yù)測(cè)。
比起簡(jiǎn)單的自回歸模型或者以時(shí)間為基礎(chǔ)的簡(jiǎn)單趨勢(shì)預(yù)測(cè)模型,ARMA模型最大的優(yōu)勢(shì),在于綜合了趨勢(shì)理論和均值回歸理論,理論上的精確度會(huì)比較高。
'''
自回歸滑動(dòng)平均模型
'''
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("參數(shù)錯(cuò)誤:", param)
continue
aic = model.aic
if aic < best_aic: # 選取最優(yōu)的aic
best_aic = model.aic
result = (model, param)
return result
K-means聚類算法
基本原理
k-Means算法是一種使用最普遍的聚類算法,它是一種無(wú)監(jiān)督學(xué)習(xí)算法,目的是將相似的對(duì)象歸到同一個(gè)簇中。簇內(nèi)的對(duì)象越相似,聚類的效果就越好。該算法不適合處理離散型屬性,但對(duì)于連續(xù)型屬性具有較好的聚類效果。
聚類效果判定標(biāo)準(zhǔn)
使各個(gè)樣本點(diǎn)與所在簇的質(zhì)心的誤差平方和達(dá)到最小,這是評(píng)價(jià)k-means算法最后聚類效果的評(píng)價(jià)標(biāo)準(zhǔn)。
算法實(shí)現(xiàn)步驟
1)選定k值
2)創(chuàng)建k個(gè)點(diǎn)作為k個(gè)簇的起始質(zhì)心。
3)分別計(jì)算剩下的元素到k個(gè)簇的質(zhì)心的距離,將這些元素分別劃歸到距離最小的簇。
4)根據(jù)聚類結(jié)果,重新計(jì)算k個(gè)簇各自的新的質(zhì)心,即取簇中全部元素各自維度下的算術(shù)平均值。
5)將全部元素按照新的質(zhì)心重新聚類。
6)重復(fù)第5步,直到聚類結(jié)果不再變化。
7)最后,輸出聚類結(jié)果。
算法缺點(diǎn)
雖然K-Means算法原理簡(jiǎn)單,但是有自身的缺陷:
1)聚類的簇?cái)?shù)k值需在聚類前給出,但在很多時(shí)候中k值的選定是十分難以估計(jì)的,很多情況我們聚類前并不清楚給出的數(shù)據(jù)集應(yīng)當(dāng)分成多少類才最恰當(dāng)。
2)k-means需要人為地確定初始質(zhì)心,不一樣的初始質(zhì)心可能會(huì)得出差別很大的聚類結(jié)果,無(wú)法保證k-means算法收斂于全局最優(yōu)解。
3)對(duì)離群點(diǎn)敏感。
4)結(jié)果不穩(wěn)定(受輸入順序影響)。
5)時(shí)間復(fù)雜度高O(nkt),其中n是對(duì)象總數(shù),k是簇?cái)?shù),t是迭代次數(shù)。
算法實(shí)現(xiàn)關(guān)鍵問題說(shuō)明
K值的選定說(shuō)明
根據(jù)聚類原則:組內(nèi)差距要小,組間差距要大。我們先算出不同k值下各個(gè)SSE(Sum of
squared
errors)值,然后繪制出折線圖來(lái)比較,從中選定最優(yōu)解。從圖中,我們可以看出k值到達(dá)5以后,SSE變化趨于平緩,所以我們選定5作為k值。
初始的K個(gè)質(zhì)心選定說(shuō)明
初始的k個(gè)質(zhì)心選定是采用的隨機(jī)法。從各列數(shù)值最大值和最小值中間按正太分布隨機(jī)選取k個(gè)質(zhì)心。
關(guān)于離群點(diǎn)
離群點(diǎn)就是遠(yuǎn)離整體的,非常異常、非常特殊的數(shù)據(jù)點(diǎn)。因?yàn)閗-means算法對(duì)離群點(diǎn)十分敏感,所以在聚類之前應(yīng)該將這些“極大”、“極小”之類的離群數(shù)據(jù)都去掉,否則會(huì)對(duì)于聚類的結(jié)果有影響。離群點(diǎn)的判定標(biāo)準(zhǔn)是根據(jù)前面數(shù)據(jù)可視化分析過(guò)程的散點(diǎn)圖和箱線圖進(jìn)行判定。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-807208.html
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;
//讀取數(shù)據(jù)
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("標(biāo)準(zhǔn)差");
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 最后
?? 選題指導(dǎo), 項(xiàng)目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/python/README.md文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-807208.html
到了這里,關(guān)于【計(jì)算機(jī)畢設(shè)選題】基于大數(shù)據(jù)的股票量化分析與股價(jià)預(yù)測(cè)系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!