基于Python的股票數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)_第1頁(yè)
基于Python的股票數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)_第2頁(yè)
基于Python的股票數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)_第3頁(yè)
基于Python的股票數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)_第4頁(yè)
基于Python的股票數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄TOC\o"1-3"\h\u289301引言 基于Python的股票數(shù)據(jù)分析系統(tǒng)設(shè)計(jì)作者:劉一平指導(dǎo)老師:陳學(xué)明(海南師范大學(xué)物理與電子工程學(xué)院,???,571158)摘要:隨著數(shù)字經(jīng)濟(jì)的不斷深入拓展,股票數(shù)據(jù)的深入分析和預(yù)測(cè)逐漸變?yōu)橥顿Y者關(guān)注的重點(diǎn)。此項(xiàng)研究利用Python語(yǔ)言爬取股票數(shù)據(jù),通過顯示K線圖對(duì)數(shù)據(jù)進(jìn)行量化及可視化。再使用移動(dòng)平均線分析、線性回歸及時(shí)間序列自回歸的三種算法,預(yù)測(cè)得出未來股票的上漲概率。綜合考慮不同算法的優(yōu)點(diǎn),使預(yù)測(cè)結(jié)果更全面,為投資者提供一定價(jià)值的參考。在數(shù)字經(jīng)濟(jì)化的趨勢(shì)下,數(shù)據(jù)分析在金融界的使用正在逐漸增多。本此設(shè)計(jì)希望通過對(duì)股票數(shù)據(jù)進(jìn)行分析預(yù)測(cè),為投資者提供更加精確和高效的決策意見。關(guān)鍵詞:python;股票;數(shù)據(jù)可視化;股市預(yù)測(cè)1引言1.1研究意義股票市場(chǎng)由于不穩(wěn)定、波動(dòng)等原因可能使投資者面臨著各種各樣的風(fēng)險(xiǎn),對(duì)股票進(jìn)行深入細(xì)致的分析將幫助投資者更便捷地了解股票,并減少其投資風(fēng)險(xiǎn)。在信息技術(shù)飛速發(fā)展,大數(shù)據(jù),人工智能等先進(jìn)技術(shù)被廣泛運(yùn)用的今天,可以幫助投資者快速,精準(zhǔn)地發(fā)現(xiàn)并把握投資中潛在的風(fēng)險(xiǎn)與機(jī)會(huì)。綜合不同數(shù)據(jù)源進(jìn)行研究分析可以發(fā)現(xiàn)股票的未來走向,這將給投資方帶來更廣闊的選擇空間。在金融科技(FinTech)的演進(jìn)中,股票數(shù)據(jù)分析起到了不可或缺的作用,它為金融領(lǐng)域的創(chuàng)新和轉(zhuǎn)型提供了推動(dòng)力。在大數(shù)據(jù),人工智能和機(jī)器學(xué)習(xí)技術(shù)手段的推動(dòng)下,金融機(jī)構(gòu)能夠研發(fā)更加智能有效的投資工具與交易系統(tǒng),從而提高服務(wù)水平與競(jìng)爭(zhēng)力。Python是一種強(qiáng)大且易學(xué)易用的編程語(yǔ)言之一,也是股票數(shù)據(jù)分析中優(yōu)選的工具。Python具有豐富的數(shù)據(jù)分析庫(kù)(如Pandas、NumPy、Matplotlib等)和人工智能庫(kù)(如TensorFlow、PyTorch等),能夠支持?jǐn)?shù)據(jù)獲取,清洗和分析,直至模型訓(xùn)練和預(yù)測(cè)的每一個(gè)環(huán)節(jié),對(duì)股票數(shù)據(jù)分析具有有力的技術(shù)支持。所以探討如何將Python運(yùn)用到股票數(shù)據(jù)分析中,無論從理論上還是從實(shí)踐上都有很大的意義。1.2研究現(xiàn)狀目前,Python在股票數(shù)據(jù)分析領(lǐng)域具有廣泛的應(yīng)用,它提供了豐富的處理庫(kù),如Pandas、NumPy和Quandl等。投資者可以使用這些庫(kù)來從各種數(shù)據(jù)源(如YahooFinance、AlphaVantage等)獲取股票價(jià)格、交易量、財(cái)務(wù)報(bào)表等數(shù)據(jù),并進(jìn)行數(shù)據(jù)清洗、格式化和整合。何雨峰,許超,黃蘭運(yùn)用Python爬蟲技術(shù)獲取數(shù)據(jù),使用DEA方法構(gòu)建CCR模型進(jìn)行數(shù)據(jù)分析,對(duì)不同財(cái)務(wù)狀況的中小企業(yè)在融資過程的優(yōu)勢(shì)做出比較,為企業(yè)融資提出建議REF_Ref29873\r\h[1]。李雪采用多線程Python網(wǎng)絡(luò)爬蟲技術(shù)對(duì)股吧內(nèi)的相關(guān)信息進(jìn)行爬取,并對(duì)測(cè)度網(wǎng)絡(luò)輿情方法進(jìn)行改進(jìn),通過基于情感詞典法的文本挖掘技術(shù)進(jìn)行數(shù)據(jù)分析,構(gòu)建“關(guān)注度”“情緒得分”和“意見分歧”共3個(gè)網(wǎng)絡(luò)輿情指數(shù)REF_Ref29912\r\h[2]。Python中的一些庫(kù)的提供了強(qiáng)大的繪圖功能,如Matplotlib、Seaborn和Plotly,可以將股票數(shù)據(jù)以圖表、折線圖、柱狀圖等形式直觀地展示出來,幫助投資者直觀地理解市場(chǎng)趨勢(shì)和規(guī)律。李思佳用Python實(shí)現(xiàn)了股票交易的大數(shù)據(jù)可視化分析,其中著重剖析了特斯拉汽車與比亞迪這二個(gè)股票在最近五年內(nèi)的股價(jià)、成交額等的具體變動(dòng)情形。該成果便于相關(guān)人士在融資流程中更靈活的對(duì)股票交易數(shù)據(jù)進(jìn)行分類,為股票投資提供決策支持REF_Ref29951\r\h[3]。王子豪通過使用Python,對(duì)股價(jià)信息進(jìn)行了可視化管理,從信息可視化理論出發(fā),提出了優(yōu)質(zhì)高效的大數(shù)據(jù)信息,并利用數(shù)據(jù)挖掘方法對(duì)微軟、蘋果、谷歌等企業(yè)多只股價(jià)趨勢(shì)展開了深入研究REF_Ref30036\r\h[4]。Python在量化交易和算法交易方面有著廣泛的應(yīng)用。通過使用量化交易框架如Zipline、Backtrader和PyAlgoTrade等,投資者可以快速開發(fā)和測(cè)試各種交易策略,并利用機(jī)器學(xué)習(xí)和人工智能技術(shù)進(jìn)行模型訓(xùn)練和優(yōu)化,實(shí)現(xiàn)自動(dòng)化交易和風(fēng)險(xiǎn)管理。梁國(guó)鵬,劉力軍通過對(duì)量化交易系統(tǒng)展開研究,對(duì)現(xiàn)有交易策略進(jìn)行分析并根據(jù)其存在的不足進(jìn)行改進(jìn),以此實(shí)現(xiàn)量化交易系統(tǒng)的有效運(yùn)行,進(jìn)行回測(cè)來指導(dǎo)投資者并為其帶來超額收益REF_Ref30075\r\h[5]。譚軍龍,李慧瑩提出一種基于Python的量化投資交易系統(tǒng)的設(shè)計(jì),用于個(gè)人投資者的自動(dòng)化量化交易R(shí)EF_Ref30104\r\h[6]。魏玉嬌選取了交通銀行、中國(guó)銀行、中信銀行三只股票的日交易數(shù)據(jù)為樣本,利用Python進(jìn)行了量化通道策略及其與配對(duì)交易結(jié)合的實(shí)證研究REF_Ref30140\r\h[7]。利用Python的機(jī)器學(xué)習(xí)庫(kù)如Scikit-learn、TensorFlow和PyTorch等,投資者可以構(gòu)建各種預(yù)測(cè)模型和分類算法,用于股票價(jià)格預(yù)測(cè)、市場(chǎng)情緒分析和風(fēng)險(xiǎn)評(píng)估等方面。尹清通過Python中的機(jī)器學(xué)習(xí)算法分析攜出用戶特征,建立易攜出用戶模型預(yù)測(cè),提前定位易攜出客戶,進(jìn)行維穩(wěn)挽留,有效降低了攜出用戶的概率REF_Ref30219\r\h[8]。孟平,龍華秋研究領(lǐng)域包括對(duì)流量特性的獲取以及有關(guān)機(jī)器學(xué)習(xí)方法的描述,首先通過從日常捕獲的流量中來獲取相應(yīng)的特性,接著通過對(duì)機(jī)器學(xué)習(xí)模型的評(píng)估,來快速確定對(duì)其是否存在威脅性.然后經(jīng)過使用數(shù)據(jù)集對(duì)機(jī)器學(xué)習(xí)的模型進(jìn)行評(píng)價(jià),其準(zhǔn)確率可以達(dá)到99%REF_Ref30294\r\h[9]。張凱姣借助Python平臺(tái)設(shè)計(jì)并實(shí)現(xiàn)了基于模塊化設(shè)計(jì)的成紗質(zhì)量預(yù)測(cè)系統(tǒng),設(shè)計(jì)了預(yù)測(cè)模塊,數(shù)據(jù)處理模塊以及可視化模塊,并且提供了便捷的GUI界面REF_Ref30333\r\h[10]。1.3研究?jī)?nèi)容構(gòu)建一個(gè)股票數(shù)據(jù)分析與預(yù)測(cè)系統(tǒng),該系統(tǒng)能夠?qū)崿F(xiàn)以下功能:(1)股票數(shù)據(jù)爬?。和ㄟ^網(wǎng)絡(luò)爬蟲技術(shù)得到股票市場(chǎng)歷史價(jià)格數(shù)據(jù)及K線圖,保證數(shù)據(jù)及時(shí)完整。(2)數(shù)據(jù)處理及特征提取:將爬取的股票數(shù)據(jù)經(jīng)過清洗,加工并提取特征,從而構(gòu)造出一個(gè)高效的特征集合來訓(xùn)練模型。(3)機(jī)器學(xué)習(xí)模型搭建:采用了移動(dòng)平均線分析法,趨勢(shì)回歸線分析法和時(shí)間序列自回歸分析法3種不同傳統(tǒng)學(xué)習(xí)方法,將特征提取得到的股票數(shù)據(jù)建模并加以分析,從而預(yù)測(cè)出未來股票價(jià)格的變化趨勢(shì)。(4)系統(tǒng)界面設(shè)計(jì):設(shè)計(jì)用戶友好的界面,將數(shù)據(jù)分析和預(yù)測(cè)結(jié)果直觀地呈現(xiàn)給用戶,提供可視化的股票價(jià)格走勢(shì)圖表,以提高用戶的體驗(yàn)感和使用便捷度。1.4設(shè)計(jì)思路及方法本研究首先通過爬蟲技術(shù)從財(cái)經(jīng)網(wǎng)站獲取股票數(shù)據(jù)。然后,利用Python的Pandas庫(kù)對(duì)數(shù)據(jù)進(jìn)行清洗和預(yù)處理,包括缺失值處理、異常值檢測(cè)和數(shù)據(jù)標(biāo)準(zhǔn)化等步驟REF_Ref3070\r\h[13]。通過對(duì)股票數(shù)據(jù)進(jìn)行量化和可視化,提取了包括開盤價(jià)、收盤價(jià)、最高價(jià)、最低價(jià)、成交量等在內(nèi)的多個(gè)特征值,并顯示出該只股票的K線圖,使用戶可以更直觀高效地讀取股票數(shù)據(jù)。另外在展示K線圖時(shí),用戶可以自由縮放時(shí)間軸,查看不同時(shí)間段的股票走勢(shì)。然后,選取了移動(dòng)平均線,趨勢(shì)線,基于歷史數(shù)據(jù)的分析三種算法進(jìn)行模型訓(xùn)練。移動(dòng)平均線是一種平滑股價(jià)波動(dòng)的方法,能夠消除短期價(jià)格波動(dòng)帶來的噪聲,凸顯價(jià)格走勢(shì)的長(zhǎng)期趨勢(shì)。趨勢(shì)線則是一種描繪股價(jià)走勢(shì)的方法,可以直觀地顯示價(jià)格變化的趨勢(shì)?;跉v史數(shù)據(jù)的分析方法則利用股票價(jià)格的歷史數(shù)據(jù)來預(yù)測(cè)未來價(jià)格走勢(shì)。通過對(duì)訓(xùn)練集的學(xué)習(xí),各模型能夠預(yù)測(cè)未來一段時(shí)間內(nèi)的股票價(jià)格上漲的概率。最后,將所有程序功能合并開發(fā)全新的頁(yè)面,方便用戶的使用。流程如圖1-1-4所示:圖1-4-4系統(tǒng)流程圖2相關(guān)技術(shù)介紹2.1Python語(yǔ)言Python是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,易于學(xué)習(xí),語(yǔ)法簡(jiǎn)潔優(yōu)雅,支持動(dòng)態(tài)類型,且功能強(qiáng)大,具有豐富的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)。標(biāo)準(zhǔn)庫(kù)是Python自帶的工具庫(kù),由Python官方作者開發(fā)和發(fā)布,比如os,time等,在Python安裝后即可使用。第三方庫(kù)是全球Python開發(fā)者共同創(chuàng)建并貢獻(xiàn)出的工具庫(kù),需另行安裝方可應(yīng)用,例如Pandas、Flask、sk-learn等。得益于Python的廣泛流行和開發(fā)者社區(qū)的活躍性,諸多第三方庫(kù)應(yīng)運(yùn)而生,助力實(shí)現(xiàn)多樣化的功能。2.2Pandas庫(kù)Pandas是公認(rèn)的數(shù)據(jù)分析領(lǐng)域的一個(gè)核心工具,在Python各大數(shù)據(jù)分析庫(kù)當(dāng)中占據(jù)著舉足輕重的地位。它強(qiáng)大,豐富的數(shù)據(jù)組織和管理能力,使得它成為功能強(qiáng)大,切實(shí)可行的數(shù)據(jù)管理平臺(tái)。它向用戶展示一個(gè)高效,靈活,易懂的數(shù)據(jù)架構(gòu),使應(yīng)對(duì)各種數(shù)據(jù)市場(chǎng)更加簡(jiǎn)明,直觀,快捷。Pandas有處理下列類型資料的功能:(1)數(shù)據(jù)與SQL或Excel的表格有相似之處。(2)時(shí)間序列數(shù)據(jù)中的有序與無序(具有非固定的頻率)。(3)帶有行和列標(biāo)簽的矩陣數(shù)據(jù)。(4)各種不同類型的觀察和統(tǒng)計(jì)數(shù)據(jù)集。Pandas這個(gè)數(shù)據(jù)處理庫(kù)主要呈現(xiàn)了兩種關(guān)鍵的數(shù)據(jù)結(jié)構(gòu):Series(一維)和DataFrame(二維),這兩種結(jié)構(gòu)能夠處理金融、統(tǒng)計(jì)、社會(huì)科學(xué)、工程等多個(gè)領(lǐng)域中的大量關(guān)鍵案例REF_Ref4053\r\h[14]。3.3Tushare數(shù)據(jù)接口庫(kù)Tushare作為Python數(shù)據(jù)接口庫(kù)沒有任何費(fèi)用和開放性,專門用于收集與金融有關(guān)的資料。該平臺(tái)向投資者,開發(fā)者以及數(shù)據(jù)分析師們提供豐富的股票,期貨,基金及其他金融市場(chǎng)信息,推薦數(shù)據(jù)有助于投資者對(duì)市場(chǎng)進(jìn)行風(fēng)險(xiǎn)評(píng)估,制定交易策略以及支持投資決策。Python開發(fā)環(huán)境下的Tushare操作十分直觀方便,使用者能夠很容易獲得股票,指數(shù),基金以及其他與金融有關(guān)的信息,或通過API接口與Thrift接口實(shí)現(xiàn)數(shù)據(jù)查詢與合作操作。簡(jiǎn)而言之,Tushare實(shí)質(zhì)上是一個(gè)方便獲取股票、期貨、基金等金融信息的工具,并且是完全免費(fèi)的。Tushare公司提供與金融市場(chǎng)有關(guān)的多種資料。這些資料對(duì)評(píng)估市場(chǎng)風(fēng)險(xiǎn),制定交易策略和支持決策過程大有幫助。3.4NumPy庫(kù)NumPy是Python語(yǔ)言的一種擴(kuò)展型程序庫(kù),給使用者帶來了強(qiáng)大的向量和矩陣運(yùn)算能力。利用這些工具,使用者可以更容易地完成最優(yōu)化、線性代數(shù)、統(tǒng)計(jì)微分、插值運(yùn)算、特殊方程、傅里葉變換、信號(hào)處理和圖像處理以及常微分方程計(jì)算等科研與工程技術(shù)領(lǐng)域中常用的運(yùn)算工作。所以,NumPy在提升運(yùn)算質(zhì)量與便捷性領(lǐng)域起到了巨大作用。NumPy是一個(gè)開源的Python科學(xué)計(jì)算基礎(chǔ)數(shù)據(jù)庫(kù),它是SciPy、Pandas等軟件的數(shù)據(jù)處理的基礎(chǔ)。它的主要特征及作用有以下方面:(1)強(qiáng)大的N維數(shù)組對(duì)象ndarray:這是一個(gè)類似于列表的數(shù)組對(duì)象,它描述了相同類型元素的集合。另外,它具有矢量運(yùn)算、復(fù)雜廣播能力等快速、省時(shí)的多維數(shù)組特點(diǎn),給使用者提供一種有效的數(shù)據(jù)處理手段。(2)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)庫(kù):為快速操作整組數(shù)據(jù)提供功能,不需要寫循環(huán),也就是內(nèi)置并行操作功能。在系統(tǒng)執(zhí)行一定的計(jì)算并有多個(gè)核心的情況下,NumPy將自動(dòng)并行計(jì)算從而顯著提高計(jì)算的效率。(3)實(shí)用功能:包括線性代數(shù),傅里葉變換,隨機(jī)生成函數(shù),以及其他實(shí)用的功能,給各種計(jì)算帶來方便的運(yùn)算。(4)數(shù)組與矩陣運(yùn)算:NumPy可直接進(jìn)行數(shù)組與矩陣運(yùn)算而不需要循環(huán)以減少用戶寫代碼的復(fù)雜性。3股票數(shù)據(jù)獲取及預(yù)處理3.1爬蟲可行性爬蟲是一種在FOAF社區(qū)中廣受歡迎的術(shù)語(yǔ)。它會(huì)按照預(yù)先設(shè)定的規(guī)則,自動(dòng)地抓取網(wǎng)絡(luò)信息中的程序或腳本。爬蟲的原理類似于人類在網(wǎng)絡(luò)環(huán)境中的做法,如通過網(wǎng)頁(yè)瀏覽和點(diǎn)擊網(wǎng)絡(luò)鏈接等多種方式來獲取網(wǎng)頁(yè)中的信息和數(shù)據(jù)。爬蟲系統(tǒng)會(huì)預(yù)先建立標(biāo)準(zhǔn),例如特定URL中的圖形和核心詞匯的出現(xiàn)次數(shù),再自動(dòng)識(shí)別網(wǎng)站的信息,抓取并解讀其中的內(nèi)容。在網(wǎng)絡(luò)上,爬蟲在數(shù)據(jù)收集中至關(guān)重要。在搜索引擎、數(shù)據(jù)審查、價(jià)格控制、社交媒體監(jiān)督等多個(gè)情鏡中,它的地位都是不容忽視的。搜索引擎可以利用網(wǎng)絡(luò)爬蟲技術(shù)來搜集網(wǎng)絡(luò)上的資料,同時(shí)創(chuàng)建相應(yīng)的索引,這可以讓用戶迅速地找到到他們所需的內(nèi)容。數(shù)據(jù)分析專家可以通過采取爬蟲方法來搜集眾多的數(shù)據(jù),并且深入挖掘和解析這些數(shù)據(jù),進(jìn)而揭示其背后的深層次價(jià)值。3.2爬取數(shù)據(jù)的流程Tushare是一個(gè)面向金融數(shù)據(jù)的Python第三方庫(kù),提供了豐富的金融數(shù)據(jù)接口,可以獲取股票、基金、期貨等市場(chǎng)數(shù)據(jù)。以下是使用Tushare進(jìn)行數(shù)據(jù)爬取的一般流程:圖3-2-1Tushare爬蟲流程3.3爬蟲重要程序(1)獲取接口token。在使用Tushare接口之前,首先需要獲取一個(gè)獨(dú)特的接口token。打開Tushare官方網(wǎng)站(/),注冊(cè)并登錄賬戶。登錄成功后,請(qǐng)點(diǎn)擊頁(yè)面右上角的個(gè)人頭像,進(jìn)入用戶中心。在用戶中心頁(yè)面,點(diǎn)擊一個(gè)名為“接口token”的選項(xiàng),即可獲取專屬接口token。圖3-3-1Tushare接口獲得(2)導(dǎo)入庫(kù)并設(shè)置token。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareastspro=_api('4e0c27861ed60fd7d119dd3493aeafca4603c36e8cfbac912c99bc18')(3)獲取股票數(shù)據(jù),以下程序爬取為深市A股2023年到2024年的歷史數(shù)據(jù),可以根據(jù)不同需要調(diào)整從而獲得目標(biāo)數(shù)據(jù)。daily=_bar('000001.SZ',start_date='2023-04-13',end_date='20240416')daily.index=daily.trade_datedaily=daily.rename(index=pd.Timestamp)3.4數(shù)據(jù)預(yù)處理Python中進(jìn)行爬蟲后的數(shù)據(jù)預(yù)處理通常包括以下步驟:(1)數(shù)據(jù)清洗:清洗數(shù)據(jù)是指將數(shù)據(jù)中的缺失值、重復(fù)值以及異常值等處理完畢,保證數(shù)據(jù)的質(zhì)量。在Python環(huán)境下,可以使用pandas庫(kù)清洗數(shù)據(jù),其中使用dropna()功能去除數(shù)據(jù)缺失值,通過使用drop_duplicates()函數(shù)來消除重復(fù)數(shù)據(jù),并運(yùn)用條件判斷或統(tǒng)計(jì)方法來識(shí)別和處理異常數(shù)據(jù)。(2)數(shù)據(jù)轉(zhuǎn)換所謂數(shù)據(jù)轉(zhuǎn)換是指將數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式,將日期時(shí)間轉(zhuǎn)換為標(biāo)準(zhǔn)形式,將數(shù)據(jù)類型轉(zhuǎn)換為適合分析需要的形式??衫胮andas庫(kù)中to_datetime()功能把日期時(shí)間字符串變換成日期時(shí)間格式、用astype()功能把數(shù)據(jù)類型變換成指定類型等等。(3)數(shù)據(jù)標(biāo)準(zhǔn)化數(shù)據(jù)標(biāo)準(zhǔn)化就是把數(shù)據(jù)按一定標(biāo)準(zhǔn)縮放到量綱與范圍一致,便于后續(xù)分析與建模的過程。常用標(biāo)準(zhǔn)化方法有Z-score標(biāo)準(zhǔn)化,Min-Max標(biāo)準(zhǔn)化等??梢允褂胹klearn庫(kù)中的StandardScaler和MinMaxScaler進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化操作。(4)特征提?。核^特征提取,就是從原始數(shù)據(jù)中抽取對(duì)分析與建模有幫助的特征??舍槍?duì)特定問題采用不同特征提取方法如文本數(shù)據(jù)關(guān)鍵詞特征提取和時(shí)間序列數(shù)據(jù)周期性特征提取。(5)合并數(shù)據(jù):如果爬取的數(shù)據(jù)分散在多個(gè)文件或多個(gè)數(shù)據(jù)源中,需要將這些數(shù)據(jù)進(jìn)行合并再進(jìn)行分析。可以使用pandas庫(kù)中的merge()函數(shù)或concat()函數(shù)進(jìn)行數(shù)據(jù)合并操作。(6)其他預(yù)處理操作:根據(jù)一些具體情況可能還需要進(jìn)行其他預(yù)處理操作,比如處理文本中的數(shù)據(jù)的分詞、去除停用詞,處理圖像數(shù)據(jù)的縮放、裁剪等。再獲取數(shù)據(jù),把數(shù)據(jù)格式化成mplfinance的標(biāo)準(zhǔn)格式,取重要數(shù)據(jù)并重命名。部分代碼如下所示:data=file_namedata=data[::-1]self.data_source=file_namedata=data[['trade_date','open','close','high','low','vol','amount','pre_close','change','pct_chg']]data.columns=['date','open','close','high','low','volume','amount','pre_close','change','pct_chg']data['upper_lim']=np.round(data['pre_close']*1.10)data['lower_lim']=np.round(data['pre_close']*0.90)data['average']=np.round((data['high']+data['low'])/2)4數(shù)據(jù)量化及可視化在購(gòu)買股票的時(shí)候,可以使用歷史數(shù)據(jù)來對(duì)當(dāng)前的股票的走勢(shì)進(jìn)行預(yù)測(cè),這就需要對(duì)股票的數(shù)據(jù)進(jìn)行獲取并且進(jìn)行一定的分析,人們是比較喜歡圖形化的界面的,因此,在這里采用一種可視化的方法來實(shí)現(xiàn)股票數(shù)據(jù)的分析。4.1基本界面設(shè)置(1)設(shè)置程序輸出界面的長(zhǎng)寬比例,字體大小格式等。部分代碼如下所示:self.number_get.setFixedSize(350,70)my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')(2)plot()函數(shù)通過兩個(gè)屬性color和linestyle設(shè)置線段顏色和線段樣式,通過plt.show()方法立即顯示圖片。my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')my_style=mpf.make_mpf_style(marketcolors=my_color,figcolor='(0.82,0.83,0.85)',gridcolor='(0.82,0.83,0.85)')4.2輸出K線圖設(shè)計(jì)這里需要用到的庫(kù)是mplfinance,mplfinance是一款基于matplotlib的金融數(shù)據(jù)可視化分析模塊,它的前身是mpl_finance,相較于mpl_finance,mplfinance做了許多簡(jiǎn)化,使其在使用上更為便捷。mplfinance為我們提供了豐富的圖表類型,如K線圖、技術(shù)指標(biāo)圖等,可以輕松地將復(fù)雜的市場(chǎng)數(shù)據(jù)轉(zhuǎn)化為直觀的圖表,便于我們觀察和分析市場(chǎng)走勢(shì)。Ta-lib庫(kù)專門用于金融市場(chǎng)數(shù)據(jù)的技術(shù)分析。其中集成了許多計(jì)算技術(shù)指標(biāo)功能,例如IFI,KDJ,OBV。這些指標(biāo)都采用特殊算法,可以很方便地計(jì)算出各種指標(biāo),然后對(duì)市場(chǎng)的動(dòng)態(tài)有一個(gè)比較全面的掌握,也為制定交易策略提供了一定的借鑒,從而促進(jìn)收益水平的提高。除了上述功能外,Ta-lib還擁有識(shí)別K線形狀的能力,它可以自動(dòng)識(shí)別多種常見的K線形狀,為投資者的決策提供了強(qiáng)大的支持。這里首先利用Ta-lib對(duì)各項(xiàng)技術(shù)指標(biāo)及K線形態(tài)進(jìn)行統(tǒng)計(jì),再借助于mplfinance對(duì)數(shù)據(jù)進(jìn)行可視化處理。這能夠更加直觀的了解市場(chǎng)數(shù)據(jù)趨勢(shì)及特點(diǎn),以便于更好的投資分析。除此之外,這兩個(gè)數(shù)據(jù)庫(kù)也兼容Python編程語(yǔ)言,能夠輕松地與其他Python數(shù)據(jù)庫(kù)進(jìn)行集成,從而提供更多的功能和可能性。部分代碼如下所示:(1)初始化交互式K線圖對(duì)象,歷史數(shù)據(jù)作為唯一的參數(shù)用于初始化對(duì)象。self.data=dataself.style=my_style(2)設(shè)置初始化的K線圖顯示區(qū)間起點(diǎn)為0,即顯示第0到第99個(gè)交易日的數(shù)據(jù)(前100個(gè)數(shù)據(jù)),設(shè)置ax1圖表中顯示的均線類型。self.idx_start=0self.idx_range=100self.avg_type='ma'self.indicator='macd'初始化figure對(duì)象,在figure上建立三個(gè)Axes對(duì)象并分別設(shè)置好它們的位置和基本屬性,在figure上預(yù)先放置文本并設(shè)置格式,文本內(nèi)容根據(jù)需要顯示的數(shù)據(jù)實(shí)時(shí)更新,這里可以生成當(dāng)天的股票數(shù)據(jù)信息,并顯示在界面最上方,如圖所示。圖4-2-2當(dāng)天股票數(shù)據(jù)顯示部分代碼如下:self.fig=mpf.figure(style=my_style,figsize=(12,8),facecolor=(0.82,0.83,0.85))fig=self.figself.ax1=fig.add_axes([0.08,0.25,0.88,0.60])self.ax2=fig.add_axes([0.08,0.15,0.88,0.10],sharex=self.ax1)self.ax2.set_ylabel('volume')self.ax3=fig.add_axes([0.08,0.05,0.88,0.10],sharex=self.ax1)self.ax3.set_ylabel('macd')self.t1=fig.text(0.50,0.94,'513100.SH-納斯達(dá)克指數(shù)ETF基金',**title_font)self.t2=fig.text(0.12,0.90,'開/收:',**normal_label_font)(4)添加K線圖重疊均線,根據(jù)均線類型添加移動(dòng)均線或布林帶線。ifself.avg_type=='ma':ap.append(mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=self.ax1))elifself.avg_type=='bb':ap.append(mpf.make_addplot(plot_data[['bb-u','bb-m','bb-l']],ax=self.ax1))(5)添加指標(biāo),根據(jù)指標(biāo)類型添加MACD或RSI或DEMA。以MACD指標(biāo)為例:ifself.indicator=='macd':ap.append(mpf.make_addplot(plot_data[['macd-m','macd-s']],ylabel='macd',ax=self.ax3))bar_r=np.where(plot_data['macd-h']>0,plot_data['macd-h'],0)bar_g=np.where(plot_data['macd-h']<=0,plot_data['macd-h'],0)ap.append(mpf.make_addplot(bar_r,type='bar',color='red',ax=self.ax3))ap.append(mpf.make_addplot(bar_g,type='bar',color='green',ax=self.ax3))(6)繪制圖表:mpf.plot(plot_data,ax=self.ax1,volume=self.ax2,addplot=ap,type='candle',style=self.style,datetime_format='%Y-%m',xrotation=0)print("show")plt.draw()plt.show()(7)根據(jù)最新的參數(shù),重新繪制整個(gè)圖表:all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range](8)最終得到的K線圖如下圖4-2-2所示,圖中有類似蠟燭的陽(yáng)線和陰線,分別代表上漲和下跌,還有布林指標(biāo)折線圖,由上、中、下三條線組成,分別是上軌線、中軌線和下軌線,另外還有最下方的成交量bar圖,X軸為股票日期數(shù)據(jù),Y軸為成交數(shù)據(jù)。這些指標(biāo)都是判斷股票波動(dòng)的重要數(shù)據(jù)。圖4-2-2K線圖5預(yù)測(cè)模型的實(shí)現(xiàn)5.1移動(dòng)平均線分析移動(dòng)平均線(MovingAverage,MA)是股票分析中常用的一種技術(shù),用于平滑價(jià)格數(shù)據(jù),以便更清晰地看到價(jià)格趨勢(shì)。通過對(duì)過去一段時(shí)期股票平均價(jià)格的測(cè)算,對(duì)今后價(jià)格走勢(shì)進(jìn)行預(yù)測(cè)。這里選取了5日、10日、20日和60日的移動(dòng)平均線作為比較基準(zhǔn),目的是為了評(píng)估短期與長(zhǎng)期內(nèi)的價(jià)格走勢(shì)。當(dāng)短期移動(dòng)平均線向上突破長(zhǎng)期移動(dòng)平均線時(shí),我們通常認(rèn)為這是一個(gè)買進(jìn)的信號(hào),意味著股票價(jià)格可能繼續(xù)上漲。反之,當(dāng)短期移動(dòng)平均線向下突破長(zhǎng)期移動(dòng)平均線時(shí),我們認(rèn)為這是一個(gè)賣出信號(hào),暗示股票價(jià)格可能出現(xiàn)下跌。簡(jiǎn)單移動(dòng)平均線(SimpleMovingAverage,SMA)的計(jì)算公式如下:SMAn=1其中,SMAn是窗口大小為n的簡(jiǎn)單移動(dòng)平均線,Pi是第i天的價(jià)格,n是移動(dòng)平均線的窗口大小。移動(dòng)平均線是一種遲滯性指標(biāo),這意味著它無法預(yù)測(cè)市場(chǎng)的即時(shí)變化。因此,需要將移動(dòng)平均線與其他技術(shù)指標(biāo)相結(jié)合,以提高預(yù)測(cè)的準(zhǔn)確性。部分實(shí)現(xiàn)代碼如下:ap=[mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=ax1)short_window=10medium_window=50long_window=200df_filled=pd.DataFrame(df,columns=df.columns)df_filled['short_mavg']=df_filled['close'].rolling(window=short_window).mean()df_filled['medium_mavg']=df_filled['close'].rolling(window=medium_window).mean()df_filled['long_mavg']=df_filled['close'].rolling(window=long_window).mean()df_filled['up_prob_sma']=math.tanh((df_filled['close']/(df_filled['short_mavg']+df_filled['long_mavg']))[len(df_filled['close'])-1])5.2趨勢(shì)線分析趨勢(shì)線分析(TrendLineAnalysis)采用擬合數(shù)據(jù)的線性模型來預(yù)測(cè)未來的價(jià)格走勢(shì)。在編寫代碼時(shí),采用了線性回歸模型(LinearRegression)來對(duì)價(jià)格數(shù)據(jù)進(jìn)行擬合。線性回歸是一種統(tǒng)計(jì)分析方法,通過建立自變量(如時(shí)間、歷史價(jià)格等)與因變量(未來價(jià)格)之間的線性關(guān)系,來預(yù)測(cè)股票價(jià)格的未來走勢(shì)。對(duì)近一年來的股票數(shù)據(jù)進(jìn)行回歸分析就可得到預(yù)測(cè)未來股價(jià)的線性方程,根據(jù)這個(gè)方程來判斷漲跌的可能性。線性回歸的基本原理如下:線性回歸模型是基于最小二乘法構(gòu)建的,其基本目標(biāo)是尋找到一條直線,使這條直線的自變量與因變量之間的預(yù)測(cè)值與實(shí)際值的殘差平方和達(dá)到最小。在這里,線性回歸模型就是求解直線方程y=wx+b中的斜率w和截距b。線性回歸模型在金融領(lǐng)域的優(yōu)勢(shì)主要體現(xiàn)在以下幾個(gè)方面:1.穩(wěn)定性:線性回歸模型具有較強(qiáng)的穩(wěn)定性,所以可以在不同的金融市場(chǎng)環(huán)境下保持較好的預(yù)測(cè)效果。2.實(shí)用性:線性回歸模型對(duì)數(shù)據(jù)的要求相對(duì)比較低,即使數(shù)據(jù)量有限,它也可以構(gòu)建出具有較高預(yù)測(cè)能力的模型。3.易于操作:線性回歸模型的構(gòu)建和預(yù)測(cè)過程比較簡(jiǎn)單,并且易于操作,這可以幫助投資者快速做出決策。要使用線性回歸模型預(yù)測(cè)股票價(jià)格,需要收集近一年來的股票數(shù)據(jù),如時(shí)間、歷史價(jià)格等信息。然后利用這些數(shù)據(jù)進(jìn)行回歸分析,進(jìn)而求解線性方程y=wx+b。得到線性方程,再根據(jù)該方程預(yù)測(cè)未來股價(jià)的走勢(shì)。如果預(yù)測(cè)值與實(shí)際值的殘差平方和較小,則說明線性回歸模型對(duì)股票價(jià)格的預(yù)測(cè)具有較高的準(zhǔn)確性。部分代碼實(shí)現(xiàn)如下:X=df_filled[['close']].dropna()#確保沒有NaN值y=df_filled['close'].dropna()X=X.shift(1)#將'close'列向上移動(dòng)一位,作為自變量X['close'][0]=(X['close'][1]+X['close'][2])/2X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=2)model=LinearRegression()model.fit(X_train,y_train)df_filled['up_prob_trend']=abs(y_test/model.predict(X_test))df_filled['up_prob_trend'][len(df_filled['up_prob_trend'])-1]math.tanh(df_filled['up_prob_trend'][len(df_filled['up_prob_trend'])-1])5.3基于歷史數(shù)據(jù)的統(tǒng)計(jì)分析時(shí)間序列ARIMA(自回歸積分移動(dòng)平均)模型是一種用于分析和預(yù)測(cè)時(shí)間序列數(shù)據(jù)的統(tǒng)計(jì)模型。結(jié)合了自回歸(AR),差分(I)和移動(dòng)平均(MA)的概念,可以捕捉時(shí)間序列數(shù)據(jù)中的趨勢(shì)和周期性REF_Ref5372\r\h[15],模型過程如圖5-3-1所示。圖5-3-1ARIMA操作過程首先,采用ADF檢驗(yàn)(AugmentedDickey-FullerTest)來驗(yàn)證時(shí)間序列數(shù)據(jù)的穩(wěn)定性。ADF檢驗(yàn)旨在檢驗(yàn)自變量中某一個(gè)或者某幾個(gè)變量單位根的存在性,也就是考察時(shí)間序列的非平穩(wěn)性。時(shí)間序列分析是一種專為處理時(shí)間序列數(shù)據(jù)而設(shè)計(jì)的統(tǒng)計(jì)手段,它通過對(duì)歷史數(shù)據(jù)的時(shí)間序列特性進(jìn)行分析,以預(yù)測(cè)未來數(shù)據(jù)可能出現(xiàn)的變動(dòng)。在時(shí)間序列分析領(lǐng)域,自回歸模型是一種經(jīng)常被采用的方法,其主要是通過建立過去數(shù)據(jù)與未來數(shù)據(jù)的自回歸聯(lián)系來預(yù)估未來股票的價(jià)格走勢(shì)。如果ADF檢驗(yàn)的結(jié)果表明數(shù)據(jù)是非平穩(wěn)的,代碼將使用ARIMA模型(自回歸積分滑動(dòng)平均模型)來擬合數(shù)據(jù)。ARIMA模型是一種用于時(shí)間序列預(yù)測(cè)的模型,它可以同時(shí)考慮數(shù)據(jù)的自回歸特性(AR),差分操作(I),和移動(dòng)平均特性(MA)。ARIMA模型的一般形式是ARIMA(p,d,q),其中p是自回歸項(xiàng)的階數(shù),d是進(jìn)行差分的次數(shù),q是移動(dòng)平均項(xiàng)的階數(shù)。在代碼中,使用了ARIMA(1,2,4)模型。如果模型擬合成功,即殘差序列是平穩(wěn)的,那么使用模型的擬合值和實(shí)際值的比較來計(jì)算上漲概率(up_prob_arima)。如果擬合值大于實(shí)際值,則認(rèn)為上漲概率高。df_filled['close_diff']=df_filled['close'].diff().dropna()df_filled['close_diff'][0]=(df_filled['close_diff'][1]+df_filled['close_diff'][2])/2#print(df_filled['close_diff'])result=adfuller(df_filled['close_diff'])ifresult[1]<0.05:model_arima=ARIMA(df_filled['close_diff'],order=(1,2,4))results=model_arima.fit()df_filled['up_prob_arima']=math.tanh(abs(results.fittedvalues*100)[len(df_filled['close'])-1])else:df_filled['up_prob_arima']=05.4綜合股票預(yù)測(cè)值在股票市場(chǎng)預(yù)測(cè)中,我們常常采用多種預(yù)測(cè)模型以提高預(yù)測(cè)的準(zhǔn)確性。上述三種預(yù)測(cè)模型分別是基于移動(dòng)均線分析,趨勢(shì)線分析和歷史數(shù)據(jù)的統(tǒng)計(jì)分析的。為了更全面地評(píng)估股票的上漲概率,這里用均值的方法將這三種預(yù)測(cè)模型的結(jié)果進(jìn)行綜合。代碼實(shí)現(xiàn)如下:df_filled['final_up_prob']=(df_filled['up_prob_sma']+df_filled['up_prob_trend']+df_filled['up_prob_arima'])/3self.result=df_filledprint(self.result['up_prob_sma'][len(self.result)-1])print(self.result['up_prob_trend'][len(self.result)-1])print(self.result['up_prob_arima'][len(self.result)-1])6股票分析預(yù)測(cè)系統(tǒng)的應(yīng)用測(cè)試6.1系統(tǒng)操作說明圖6-1-1系統(tǒng)操作流程6.2運(yùn)行結(jié)果測(cè)試本次以2024年4月15日A股深市中鼎股份(000887.SZ)這只股票為例測(cè)試股票分析系統(tǒng)的應(yīng)用結(jié)果:(1)運(yùn)行代碼后按下鍵盤上的“A鍵”可以得到一個(gè)有著“輸入股票代碼”的窗口,可以在窗口里輸入深市任意一只股票代碼,結(jié)果如圖6-2-1所示:圖6-2-1輸入股票代碼窗口(2)在輸入框里輸入中鼎股份這個(gè)股票代碼,點(diǎn)擊“Enter鍵”,可以得到這只股票近一年的K線圖,這個(gè)圖由價(jià)格波動(dòng)線,平均日線,成交量線等組成,且圖像上有開盤價(jià),收盤價(jià),漲幅,平均日價(jià),交易額,最高價(jià),最低價(jià)信息等,用戶可以對(duì)股票波動(dòng)有一個(gè)直觀清晰的認(rèn)識(shí)。輸出的K線圖如下圖6-2-2所示:圖6-2-2K線圖在K線圖這個(gè)頁(yè)面,可以用右上角的功能鍵進(jìn)行選取放大等,可以更清楚地觀察一段時(shí)間的K線,如下圖6-2-3所示:圖6-2-3K線圖放大接著點(diǎn)擊鍵盤“M”鍵,可以得到基于SMA算法的股票上漲概率約為56.5%,如下圖6-2-4所示:圖6-2-4SMA算法預(yù)測(cè)值窗口(5)點(diǎn)擊鍵盤“T”鍵,可以得到基于趨勢(shì)線算法的股票上漲概率約為76.6%,如下圖6-2-5所示:圖6-2-5趨勢(shì)線分析算法預(yù)測(cè)值窗口(6)點(diǎn)擊鍵盤“R”鍵,可以得到基于歷史數(shù)據(jù)統(tǒng)計(jì)分析的股票上漲概率約為64.1%,如下圖6-2-6所示:圖6-2-6ARIMA算法預(yù)測(cè)值窗口(7)點(diǎn)擊“C”鍵,可以得到綜合分析的股票上漲概率約為62.5%,如下圖6-2-7所示:圖6-2-7綜合概率預(yù)測(cè)值窗口7總結(jié)本實(shí)驗(yàn)選取近一年的股票數(shù)據(jù),采用了三種不同的算法進(jìn)行分析:移動(dòng)平均線、線性回歸以及時(shí)間序列的自回歸,并得出相應(yīng)的上漲概率,通過求均值的方式計(jì)算出了綜合上漲概率。這種方法綜合考慮了不同算法的優(yōu)點(diǎn),使預(yù)測(cè)結(jié)果更全面準(zhǔn)確。然而,由于采用的是傳統(tǒng)分析方法,未涉及深度學(xué)習(xí)等先進(jìn)技術(shù),因此預(yù)測(cè)結(jié)果可能存在一定的誤差。需要注意的是,股市波動(dòng)變幻莫測(cè),任何預(yù)測(cè)方法都無法保證100%的準(zhǔn)確性。因此,投資者在使用本分析預(yù)測(cè)系統(tǒng)時(shí),應(yīng)謹(jǐn)慎參考預(yù)測(cè)結(jié)果,并結(jié)合其他因素進(jìn)行綜合判斷。參考文獻(xiàn)何雨峰,許超,黃蘭.基于數(shù)據(jù)包絡(luò)方法的中小企業(yè)融資優(yōu)勢(shì)分析[J].中國(guó)集體經(jīng)濟(jì),2020(5):98-100.李雪.網(wǎng)絡(luò)輿情測(cè)度及其對(duì)銀行業(yè)系統(tǒng)性風(fēng)險(xiǎn)的影響研究[D].吉林:長(zhǎng)春工業(yè)大學(xué),2023.李思佳.基于Python的股票數(shù)據(jù)可視化分析——以新能源汽車行業(yè)為例[J].河北軟件職業(yè)技術(shù)學(xué)院學(xué)報(bào),2021,23(3):15-18.王子豪.股票數(shù)據(jù)初探——移動(dòng)平均與燭狀圖分析[J].中小企業(yè)管理與科技(上旬刊),2021,(01):111-112+115.梁國(guó)鵬,劉力軍.基于Python的量化交易系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代信息科技,2021,5(8):86-89,94.DOI:10.19850/ki.2096-4706.2021.08.025.譚軍龍,李慧瑩.基于Python的量化投資交易系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[J].中國(guó)戰(zhàn)略新興產(chǎn)業(yè),2021(27):41-42.DOI:10.12230/j.issn.2095-6657.2021.27.027.魏玉嬌.基于Python的量化投資通道突破策略的應(yīng)用研究[J].品牌研究,2021(23):265-267,281.DOI:10.3969/j.issn.1671-1009.2021.23.081.尹清.基于Python機(jī)器學(xué)習(xí)算法的易攜出客戶模型研究[J].中國(guó)新通信,2022,24(16):59-61.DOI:10.3969/j.issn.1673-4866.2022.16.019.孟平,龍華秋.基于Python的機(jī)器學(xué)習(xí)入侵檢測(cè)的研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2019(8):40-42.張凱姣.基于Python機(jī)器學(xué)習(xí)的可視化麻紗質(zhì)量預(yù)測(cè)系統(tǒng)[D].上海:東華大學(xué),2017.AlbeladiK,ZafarB,MueenA.TimeSeriesForecastingusingLSTMandARIMA[J].InternationalJournalofAdvancedComputerScienceandApplications(IJACSA),2023,14(1).JingyiZ.RepresentativeStockAnalysisinChineseMedicalIndustryandRelevantInvestmentRecommendations[J].JournalofEconomics,FinanceandAccountingStudies,2023,5(2):139-151.游穎,程俊.基于Python語(yǔ)言的教學(xué)數(shù)據(jù)處理平臺(tái)設(shè)計(jì)[J].中國(guó)新技術(shù)新產(chǎn)品,2023,(17):26-29.DOI:10.13612/tp.2023.17.011.潘奕霖.基于用戶畫像的生活垃圾產(chǎn)廢模式構(gòu)建研究[D].哈爾濱工業(yè)大學(xué),2022.DOI:10.27061/ki.ghgdu.2022.002934.郭聰楠.基于ARIMAGRU模型的地面沉降分析與預(yù)測(cè)研究[D].北京建筑大學(xué),2023.附錄主函數(shù):importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareasts#讀取示例數(shù)據(jù)pro=_api('4e0c27861ed60fd7d119dd3493aeafca4603c36e8cfbac912c99bc18')daily=_bar('000001.SZ',start_date='2023-04-13',end_date='20240416')daily.index=daily.trade_datedaily=daily.rename(index=pd.Timestamp)#daily.drop(columns=['ts_code','trade_date','pre_close','change','pct_chg','amount'],inplace=True)#daily.columns=['open','high','low','close','volume']daily.sort_index(inplace=True)data=pd.read_csv('test_data.csv',index_col=0)data=dailydata.index=pd.to_datetime(data.index)my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')my_style=mpf.make_mpf_style(marketcolors=my_color,figcolor='(0.82,0.83,0.85)',gridcolor='(0.82,0.83,0.85)')#定義各種字體title_font={'fontname':'MicrosoftYaHei','size':'16','color':'black','weight':'bold','va':'bottom','ha':'center'}large_red_font={'fontname':'MicrosoftYaHei','size':'24','color':'red','weight':'bold','va':'bottom'}large_green_font={'fontname':'MicrosoftYaHei','size':'24','color':'green','weight':'bold','va':'bottom'}small_red_font={'fontname':'MicrosoftYaHei','size':'12','color':'red','weight':'bold','va':'bottom'}small_green_font={'fontname':'MicrosoftYaHei','size':'12','color':'green','weight':'bold','va':'bottom'}normal_label_font={'fontname':'MicrosoftYaHei','size':'12','color':'black','weight':'normal','va':'bottom','ha':'right'}normal_font={'fontname':'MicrosoftYaHei','size':'12','color':'black','weight':'normal','va':'bottom','ha':'left'}classInterCandle:def__init__(self,data,my_style):self.pressed=Falseself.xpress=None#初始化交互式K線圖對(duì)象,歷史數(shù)據(jù)作為唯一的參數(shù)用于初始化對(duì)象self.data=dataself.style=my_style#設(shè)置初始化的K線圖顯示區(qū)間起點(diǎn)為0,即顯示第0到第99個(gè)交易日的數(shù)據(jù)(前100個(gè)數(shù)據(jù))self.idx_start=0self.idx_range=100#設(shè)置ax1圖表中顯示的均線類型self.avg_type='ma'self.indicator='macd'#初始化figure對(duì)象,在figure上建立三個(gè)Axes對(duì)象并分別設(shè)置好它們的位置和基本屬性self.fig=mpf.figure(style=my_style,figsize=(12,8),facecolor=(0.82,0.83,0.85))fig=self.figself.ax1=fig.add_axes([0.08,0.25,0.88,0.60])self.ax2=fig.add_axes([0.08,0.15,0.88,0.10],sharex=self.ax1)self.ax2.set_ylabel('volume')self.ax3=fig.add_axes([0.08,0.05,0.88,0.10],sharex=self.ax1)self.ax3.set_ylabel('macd')#初始化figure對(duì)象,在figure上預(yù)先放置文本并設(shè)置格式,文本內(nèi)容根據(jù)需要顯示的數(shù)據(jù)實(shí)時(shí)更新self.t1=fig.text(0.50,0.94,'513100.SH-納斯達(dá)克指數(shù)ETF基金',**title_font)self.t2=fig.text(0.12,0.90,'開/收:',**normal_label_font)self.t3=fig.text(0.14,0.89,f'',**large_red_font)self.t4=fig.text(0.14,0.86,f'',**small_red_font)self.t5=fig.text(0.22,0.86,f'',**small_red_font)self.t6=fig.text(0.12,0.86,f'',**normal_label_font)self.t7=fig.text(0.40,0.90,'高:',**normal_label_font)self.t8=fig.text(0.40,0.90,f'',**small_red_font)self.t9=fig.text(0.40,0.86,'低:',**normal_label_font)self.t10=fig.text(0.40,0.86,f'',**small_green_font)self.t11=fig.text(0.55,0.90,'量(萬手):',**normal_label_font)self.t12=fig.text(0.55,0.90,f'',**normal_font)self.t13=fig.text(0.55,0.86,'額(億元):',**normal_label_font)self.t14=fig.text(0.55,0.86,f'',**normal_font)self.t15=fig.text(0.70,0.90,'漲停:',**normal_label_font)self.t16=fig.text(0.70,0.90,f'',**small_red_font)self.t17=fig.text(0.70,0.86,'跌停:',**normal_label_font)self.t18=fig.text(0.70,0.86,f'',**small_green_font)self.t19=fig.text(0.85,0.90,'均價(jià):',**normal_label_font)self.t20=fig.text(0.85,0.90,f'',**normal_font)self.t21=fig.text(0.85,0.86,'昨收:',**normal_label_font)self.t22=fig.text(0.85,0.86,f'',**normal_font)fig.canvas.mpl_connect('button_press_event',self.on_press)fig.canvas.mpl_connect('button_release_event',self.on_release)fig.canvas.mpl_connect('motion_notify_event',self.on_motion)fig.canvas.mpl_connect('key_press_event',self.on_key_press)fig.canvas.mpl_connect('scroll_event',self.on_scroll)defrefresh_plot(self,idx_start,idx_range):"""根據(jù)最新的參數(shù),重新繪制整個(gè)圖表"""all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range]ap=[]#添加K線圖重疊均線,根據(jù)均線類型添加移動(dòng)均線或布林帶線ifself.avg_type=='ma':ap.append(mpf.make_addplot(plot_data[['MA5','MA10','MA20','MA60']],ax=self.ax1))elifself.avg_type=='bb':ap.append(mpf.make_addplot(plot_data[['bb-u','bb-m','bb-l']],ax=self.ax1))#添加指標(biāo),根據(jù)指標(biāo)類型添加MACD或RSI或DEMAifself.indicator=='macd':ap.append(mpf.make_addplot(plot_data[['macd-m','macd-s']],ylabel='macd',ax=self.ax3))bar_r=np.where(plot_data['macd-h']>0,plot_data['macd-h'],0)bar_g=np.where(plot_data['macd-h']<=0,plot_data['macd-h'],0)ap.append(mpf.make_addplot(bar_r,type='bar',color='red',ax=self.ax3))ap.append(mpf.make_addplot(bar_g,type='bar',color='green',ax=self.ax3))elifself.indicator=='rsi':ap.append(mpf.make_addplot([75]*len(plot_data),color=(0.75,0.6,0.6),ax=self.ax3))ap.append(mpf.make_addplot([30]*len(plot_data),color=(0.6,0.75,0.6),ax=self.ax3))ap.append(mpf.make_addplot(plot_data['rsi'],ylabel='rsi',ax=self.ax3))else:#indicator=='dema'ap.append(mpf.make_addplot(plot_data['dema'],ylabel='dema',ax=self.ax3))#繪制圖表mpf.plot(plot_data,ax=self.ax1,volume=self.ax2,addplot=ap,type='candle',style=self.style,datetime_format='%Y-%m',xrotation=0)print("show")plt.draw()plt.show()defrefresh_texts(self,display_data):"""更新K線圖上的價(jià)格文本"""#display_data是一個(gè)交易日內(nèi)的所有數(shù)據(jù),將這些數(shù)據(jù)分別填入figure對(duì)象上的文本中self.t3.set_text(f'{np.round(display_data["open"],3)}/{np.round(display_data["close"],3)}')self.t4.set_text(f'{np.round(display_data["change"],3)}')self.t5.set_text(f'[{np.round(display_data["pct_chg"],3)}%]')self.t6.set_text(f'{display_.date()}')self.t8.set_text(f'{np.round(display_data["high"],3)}')self.t10.set_text(f'{np.round(display_data["low"],3)}')self.t12.set_text(f'{np.round(display_data["vol"]/10000,3)}')#self.t14.set_text(f'{display_data["value"]}')#self.t16.set_text(f'{np.round(display_data["upper_lim"],3)}')#self.t18.set_text(f'{np.round(display_data["lower_lim"],3)}')#self.t20.set_text(f'{np.round(display_data["average"],3)}')#self.t22.set_text(f'{np.round(display_data["last_close"],3)}')#根據(jù)本交易日的價(jià)格變動(dòng)值確定開盤價(jià)、收盤價(jià)的顯示顏色ifdisplay_data['change']>0:#如果今日變動(dòng)額大于0,即今天價(jià)格高于昨天,今天價(jià)格顯示為紅色close_number_color='red'elifdisplay_data['change']<0:#如果今日變動(dòng)額小于0,即今天價(jià)格低于昨天,今天價(jià)格顯示為綠色close_number_color='green'else:close_number_color='black'self.t3.set_color(close_number_color)self.t4.set_color(close_number_color)self.t5.set_color(close_number_color)defon_press(self,event):ifnot(event.inaxes==self.ax1)and(notevent.inaxes==self.ax3):returnifevent.button!=1:returnself.pressed=Trueself.xpress=event.xdata#切換當(dāng)前ma類型,在ma、bb、none之間循環(huán)ifevent.inaxes==self.ax1andevent.dblclick==1:ifself.avg_type=='ma':self.avg_type='bb'elifself.avg_type=='bb':self.avg_type='none'else:self.avg_type='ma'#切換當(dāng)前indicator類型,在macd/dma/rsi/kdj之間循環(huán)ifevent.inaxes==self.ax3andevent.dblclick==1:ifself.indicator=='macd':self.indicator='dma'elifself.indicator=='dma':self.indicator='rsi'elifself.indicator=='rsi':self.indicator='kdj'else:self.indicator='macd'self.ax1.clear()self.ax2.clear()self.ax3.clear()self.refresh_plot(self.idx_start,self.idx_range)defon_release(self,event):self.pressed=Falsedx=int(event.xdata-self.xpress)self.idx_start-=dxifself.idx_start<=0:self.idx_start=0ifself.idx_start>=len(self.data)-100:self.idx_start=len(self.data)-100defon_motion(self,event):ifnotself.pressed:returnifnotevent.inaxes==self.ax1:returndx=int(event.xdata-self.xpress)new_start=self.idx_start-dx#設(shè)定平移的左右界限,如果平移后超出界限,則不再平移ifnew_start<=0:new_start=0ifnew_start>=len(self.data)-100:new_start=len(self.data)-100self.ax1.clear()self.ax2.clear()self.ax3.clear()self.refresh_texts(self.data.iloc[new_start])self.refresh_plot(new_start,self.idx_range)defon_scroll(self,event):#僅當(dāng)鼠標(biāo)滾輪在axes1范圍內(nèi)滾動(dòng)時(shí)起作用scale_factor=1.0ifevent.inaxes!=self.ax1:returnifevent.button=='down':#縮小20%顯示范圍scale_factor=0.8ifevent.button=='up':#放大20%顯示范圍scale_factor=1.2#設(shè)置K線的顯示范圍大小self.idx_range=int(self.idx_range*scale_factor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論