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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

目錄TOC\o"1-3"\h\u289301引言 基于Python的股票數據分析系統(tǒng)設計作者:劉一平指導老師:陳學明(海南師范大學物理與電子工程學院,海口,571158)摘要:隨著數字經濟的不斷深入拓展,股票數據的深入分析和預測逐漸變?yōu)橥顿Y者關注的重點。此項研究利用Python語言爬取股票數據,通過顯示K線圖對數據進行量化及可視化。再使用移動平均線分析、線性回歸及時間序列自回歸的三種算法,預測得出未來股票的上漲概率。綜合考慮不同算法的優(yōu)點,使預測結果更全面,為投資者提供一定價值的參考。在數字經濟化的趨勢下,數據分析在金融界的使用正在逐漸增多。本此設計希望通過對股票數據進行分析預測,為投資者提供更加精確和高效的決策意見。關鍵詞:python;股票;數據可視化;股市預測1引言1.1研究意義股票市場由于不穩(wěn)定、波動等原因可能使投資者面臨著各種各樣的風險,對股票進行深入細致的分析將幫助投資者更便捷地了解股票,并減少其投資風險。在信息技術飛速發(fā)展,大數據,人工智能等先進技術被廣泛運用的今天,可以幫助投資者快速,精準地發(fā)現(xiàn)并把握投資中潛在的風險與機會。綜合不同數據源進行研究分析可以發(fā)現(xiàn)股票的未來走向,這將給投資方帶來更廣闊的選擇空間。在金融科技(FinTech)的演進中,股票數據分析起到了不可或缺的作用,它為金融領域的創(chuàng)新和轉型提供了推動力。在大數據,人工智能和機器學習技術手段的推動下,金融機構能夠研發(fā)更加智能有效的投資工具與交易系統(tǒng),從而提高服務水平與競爭力。Python是一種強大且易學易用的編程語言之一,也是股票數據分析中優(yōu)選的工具。Python具有豐富的數據分析庫(如Pandas、NumPy、Matplotlib等)和人工智能庫(如TensorFlow、PyTorch等),能夠支持數據獲取,清洗和分析,直至模型訓練和預測的每一個環(huán)節(jié),對股票數據分析具有有力的技術支持。所以探討如何將Python運用到股票數據分析中,無論從理論上還是從實踐上都有很大的意義。1.2研究現(xiàn)狀目前,Python在股票數據分析領域具有廣泛的應用,它提供了豐富的處理庫,如Pandas、NumPy和Quandl等。投資者可以使用這些庫來從各種數據源(如YahooFinance、AlphaVantage等)獲取股票價格、交易量、財務報表等數據,并進行數據清洗、格式化和整合。何雨峰,許超,黃蘭運用Python爬蟲技術獲取數據,使用DEA方法構建CCR模型進行數據分析,對不同財務狀況的中小企業(yè)在融資過程的優(yōu)勢做出比較,為企業(yè)融資提出建議REF_Ref29873\r\h[1]。李雪采用多線程Python網絡爬蟲技術對股吧內的相關信息進行爬取,并對測度網絡輿情方法進行改進,通過基于情感詞典法的文本挖掘技術進行數據分析,構建“關注度”“情緒得分”和“意見分歧”共3個網絡輿情指數REF_Ref29912\r\h[2]。Python中的一些庫的提供了強大的繪圖功能,如Matplotlib、Seaborn和Plotly,可以將股票數據以圖表、折線圖、柱狀圖等形式直觀地展示出來,幫助投資者直觀地理解市場趨勢和規(guī)律。李思佳用Python實現(xiàn)了股票交易的大數據可視化分析,其中著重剖析了特斯拉汽車與比亞迪這二個股票在最近五年內的股價、成交額等的具體變動情形。該成果便于相關人士在融資流程中更靈活的對股票交易數據進行分類,為股票投資提供決策支持REF_Ref29951\r\h[3]。王子豪通過使用Python,對股價信息進行了可視化管理,從信息可視化理論出發(fā),提出了優(yōu)質高效的大數據信息,并利用數據挖掘方法對微軟、蘋果、谷歌等企業(yè)多只股價趨勢展開了深入研究REF_Ref30036\r\h[4]。Python在量化交易和算法交易方面有著廣泛的應用。通過使用量化交易框架如Zipline、Backtrader和PyAlgoTrade等,投資者可以快速開發(fā)和測試各種交易策略,并利用機器學習和人工智能技術進行模型訓練和優(yōu)化,實現(xiàn)自動化交易和風險管理。梁國鵬,劉力軍通過對量化交易系統(tǒng)展開研究,對現(xiàn)有交易策略進行分析并根據其存在的不足進行改進,以此實現(xiàn)量化交易系統(tǒng)的有效運行,進行回測來指導投資者并為其帶來超額收益REF_Ref30075\r\h[5]。譚軍龍,李慧瑩提出一種基于Python的量化投資交易系統(tǒng)的設計,用于個人投資者的自動化量化交易REF_Ref30104\r\h[6]。魏玉嬌選取了交通銀行、中國銀行、中信銀行三只股票的日交易數據為樣本,利用Python進行了量化通道策略及其與配對交易結合的實證研究REF_Ref30140\r\h[7]。利用Python的機器學習庫如Scikit-learn、TensorFlow和PyTorch等,投資者可以構建各種預測模型和分類算法,用于股票價格預測、市場情緒分析和風險評估等方面。尹清通過Python中的機器學習算法分析攜出用戶特征,建立易攜出用戶模型預測,提前定位易攜出客戶,進行維穩(wěn)挽留,有效降低了攜出用戶的概率REF_Ref30219\r\h[8]。孟平,龍華秋研究領域包括對流量特性的獲取以及有關機器學習方法的描述,首先通過從日常捕獲的流量中來獲取相應的特性,接著通過對機器學習模型的評估,來快速確定對其是否存在威脅性.然后經過使用數據集對機器學習的模型進行評價,其準確率可以達到99%REF_Ref30294\r\h[9]。張凱姣借助Python平臺設計并實現(xiàn)了基于模塊化設計的成紗質量預測系統(tǒng),設計了預測模塊,數據處理模塊以及可視化模塊,并且提供了便捷的GUI界面REF_Ref30333\r\h[10]。1.3研究內容構建一個股票數據分析與預測系統(tǒng),該系統(tǒng)能夠實現(xiàn)以下功能:(1)股票數據爬取:通過網絡爬蟲技術得到股票市場歷史價格數據及K線圖,保證數據及時完整。(2)數據處理及特征提取:將爬取的股票數據經過清洗,加工并提取特征,從而構造出一個高效的特征集合來訓練模型。(3)機器學習模型搭建:采用了移動平均線分析法,趨勢回歸線分析法和時間序列自回歸分析法3種不同傳統(tǒng)學習方法,將特征提取得到的股票數據建模并加以分析,從而預測出未來股票價格的變化趨勢。(4)系統(tǒng)界面設計:設計用戶友好的界面,將數據分析和預測結果直觀地呈現(xiàn)給用戶,提供可視化的股票價格走勢圖表,以提高用戶的體驗感和使用便捷度。1.4設計思路及方法本研究首先通過爬蟲技術從財經網站獲取股票數據。然后,利用Python的Pandas庫對數據進行清洗和預處理,包括缺失值處理、異常值檢測和數據標準化等步驟REF_Ref3070\r\h[13]。通過對股票數據進行量化和可視化,提取了包括開盤價、收盤價、最高價、最低價、成交量等在內的多個特征值,并顯示出該只股票的K線圖,使用戶可以更直觀高效地讀取股票數據。另外在展示K線圖時,用戶可以自由縮放時間軸,查看不同時間段的股票走勢。然后,選取了移動平均線,趨勢線,基于歷史數據的分析三種算法進行模型訓練。移動平均線是一種平滑股價波動的方法,能夠消除短期價格波動帶來的噪聲,凸顯價格走勢的長期趨勢。趨勢線則是一種描繪股價走勢的方法,可以直觀地顯示價格變化的趨勢。基于歷史數據的分析方法則利用股票價格的歷史數據來預測未來價格走勢。通過對訓練集的學習,各模型能夠預測未來一段時間內的股票價格上漲的概率。最后,將所有程序功能合并開發(fā)全新的頁面,方便用戶的使用。流程如圖1-1-4所示:圖1-4-4系統(tǒng)流程圖2相關技術介紹2.1Python語言Python是一種面向對象的解釋型計算機程序設計語言,易于學習,語法簡潔優(yōu)雅,支持動態(tài)類型,且功能強大,具有豐富的標準庫和第三方庫。標準庫是Python自帶的工具庫,由Python官方作者開發(fā)和發(fā)布,比如os,time等,在Python安裝后即可使用。第三方庫是全球Python開發(fā)者共同創(chuàng)建并貢獻出的工具庫,需另行安裝方可應用,例如Pandas、Flask、sk-learn等。得益于Python的廣泛流行和開發(fā)者社區(qū)的活躍性,諸多第三方庫應運而生,助力實現(xiàn)多樣化的功能。2.2Pandas庫Pandas是公認的數據分析領域的一個核心工具,在Python各大數據分析庫當中占據著舉足輕重的地位。它強大,豐富的數據組織和管理能力,使得它成為功能強大,切實可行的數據管理平臺。它向用戶展示一個高效,靈活,易懂的數據架構,使應對各種數據市場更加簡明,直觀,快捷。Pandas有處理下列類型資料的功能:(1)數據與SQL或Excel的表格有相似之處。(2)時間序列數據中的有序與無序(具有非固定的頻率)。(3)帶有行和列標簽的矩陣數據。(4)各種不同類型的觀察和統(tǒng)計數據集。Pandas這個數據處理庫主要呈現(xiàn)了兩種關鍵的數據結構:Series(一維)和DataFrame(二維),這兩種結構能夠處理金融、統(tǒng)計、社會科學、工程等多個領域中的大量關鍵案例REF_Ref4053\r\h[14]。3.3Tushare數據接口庫Tushare作為Python數據接口庫沒有任何費用和開放性,專門用于收集與金融有關的資料。該平臺向投資者,開發(fā)者以及數據分析師們提供豐富的股票,期貨,基金及其他金融市場信息,推薦數據有助于投資者對市場進行風險評估,制定交易策略以及支持投資決策。Python開發(fā)環(huán)境下的Tushare操作十分直觀方便,使用者能夠很容易獲得股票,指數,基金以及其他與金融有關的信息,或通過API接口與Thrift接口實現(xiàn)數據查詢與合作操作。簡而言之,Tushare實質上是一個方便獲取股票、期貨、基金等金融信息的工具,并且是完全免費的。Tushare公司提供與金融市場有關的多種資料。這些資料對評估市場風險,制定交易策略和支持決策過程大有幫助。3.4NumPy庫NumPy是Python語言的一種擴展型程序庫,給使用者帶來了強大的向量和矩陣運算能力。利用這些工具,使用者可以更容易地完成最優(yōu)化、線性代數、統(tǒng)計微分、插值運算、特殊方程、傅里葉變換、信號處理和圖像處理以及常微分方程計算等科研與工程技術領域中常用的運算工作。所以,NumPy在提升運算質量與便捷性領域起到了巨大作用。NumPy是一個開源的Python科學計算基礎數據庫,它是SciPy、Pandas等軟件的數據處理的基礎。它的主要特征及作用有以下方面:(1)強大的N維數組對象ndarray:這是一個類似于列表的數組對象,它描述了相同類型元素的集合。另外,它具有矢量運算、復雜廣播能力等快速、省時的多維數組特點,給使用者提供一種有效的數據處理手段。(2)標準數學函數庫:為快速操作整組數據提供功能,不需要寫循環(huán),也就是內置并行操作功能。在系統(tǒng)執(zhí)行一定的計算并有多個核心的情況下,NumPy將自動并行計算從而顯著提高計算的效率。(3)實用功能:包括線性代數,傅里葉變換,隨機生成函數,以及其他實用的功能,給各種計算帶來方便的運算。(4)數組與矩陣運算:NumPy可直接進行數組與矩陣運算而不需要循環(huán)以減少用戶寫代碼的復雜性。3股票數據獲取及預處理3.1爬蟲可行性爬蟲是一種在FOAF社區(qū)中廣受歡迎的術語。它會按照預先設定的規(guī)則,自動地抓取網絡信息中的程序或腳本。爬蟲的原理類似于人類在網絡環(huán)境中的做法,如通過網頁瀏覽和點擊網絡鏈接等多種方式來獲取網頁中的信息和數據。爬蟲系統(tǒng)會預先建立標準,例如特定URL中的圖形和核心詞匯的出現(xiàn)次數,再自動識別網站的信息,抓取并解讀其中的內容。在網絡上,爬蟲在數據收集中至關重要。在搜索引擎、數據審查、價格控制、社交媒體監(jiān)督等多個情鏡中,它的地位都是不容忽視的。搜索引擎可以利用網絡爬蟲技術來搜集網絡上的資料,同時創(chuàng)建相應的索引,這可以讓用戶迅速地找到到他們所需的內容。數據分析專家可以通過采取爬蟲方法來搜集眾多的數據,并且深入挖掘和解析這些數據,進而揭示其背后的深層次價值。3.2爬取數據的流程Tushare是一個面向金融數據的Python第三方庫,提供了豐富的金融數據接口,可以獲取股票、基金、期貨等市場數據。以下是使用Tushare進行數據爬取的一般流程:圖3-2-1Tushare爬蟲流程3.3爬蟲重要程序(1)獲取接口token。在使用Tushare接口之前,首先需要獲取一個獨特的接口token。打開Tushare官方網站(/),注冊并登錄賬戶。登錄成功后,請點擊頁面右上角的個人頭像,進入用戶中心。在用戶中心頁面,點擊一個名為“接口token”的選項,即可獲取專屬接口token。圖3-3-1Tushare接口獲得(2)導入庫并設置token。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareastspro=_api('4e0c27861ed60fd7d119dd3493aeafca4603c36e8cfbac912c99bc18')(3)獲取股票數據,以下程序爬取為深市A股2023年到2024年的歷史數據,可以根據不同需要調整從而獲得目標數據。daily=_bar('000001.SZ',start_date='2023-04-13',end_date='20240416')daily.index=daily.trade_datedaily=daily.rename(index=pd.Timestamp)3.4數據預處理Python中進行爬蟲后的數據預處理通常包括以下步驟:(1)數據清洗:清洗數據是指將數據中的缺失值、重復值以及異常值等處理完畢,保證數據的質量。在Python環(huán)境下,可以使用pandas庫清洗數據,其中使用dropna()功能去除數據缺失值,通過使用drop_duplicates()函數來消除重復數據,并運用條件判斷或統(tǒng)計方法來識別和處理異常數據。(2)數據轉換所謂數據轉換是指將數據從一種形式轉換為另一種形式,將日期時間轉換為標準形式,將數據類型轉換為適合分析需要的形式。可利用pandas庫中to_datetime()功能把日期時間字符串變換成日期時間格式、用astype()功能把數據類型變換成指定類型等等。(3)數據標準化數據標準化就是把數據按一定標準縮放到量綱與范圍一致,便于后續(xù)分析與建模的過程。常用標準化方法有Z-score標準化,Min-Max標準化等。可以使用sklearn庫中的StandardScaler和MinMaxScaler進行數據標準化操作。(4)特征提取:所謂特征提取,就是從原始數據中抽取對分析與建模有幫助的特征。可針對特定問題采用不同特征提取方法如文本數據關鍵詞特征提取和時間序列數據周期性特征提取。(5)合并數據:如果爬取的數據分散在多個文件或多個數據源中,需要將這些數據進行合并再進行分析。可以使用pandas庫中的merge()函數或concat()函數進行數據合并操作。(6)其他預處理操作:根據一些具體情況可能還需要進行其他預處理操作,比如處理文本中的數據的分詞、去除停用詞,處理圖像數據的縮放、裁剪等。再獲取數據,把數據格式化成mplfinance的標準格式,取重要數據并重命名。部分代碼如下所示: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數據量化及可視化在購買股票的時候,可以使用歷史數據來對當前的股票的走勢進行預測,這就需要對股票的數據進行獲取并且進行一定的分析,人們是比較喜歡圖形化的界面的,因此,在這里采用一種可視化的方法來實現(xiàn)股票數據的分析。4.1基本界面設置(1)設置程序輸出界面的長寬比例,字體大小格式等。部分代碼如下所示:self.number_get.setFixedSize(350,70)my_color=mpf.make_marketcolors(up='r',down='g',edge='inherit',wick='inherit',volume='inherit')(2)plot()函數通過兩個屬性color和linestyle設置線段顏色和線段樣式,通過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線圖設計這里需要用到的庫是mplfinance,mplfinance是一款基于matplotlib的金融數據可視化分析模塊,它的前身是mpl_finance,相較于mpl_finance,mplfinance做了許多簡化,使其在使用上更為便捷。mplfinance為我們提供了豐富的圖表類型,如K線圖、技術指標圖等,可以輕松地將復雜的市場數據轉化為直觀的圖表,便于我們觀察和分析市場走勢。Ta-lib庫專門用于金融市場數據的技術分析。其中集成了許多計算技術指標功能,例如IFI,KDJ,OBV。這些指標都采用特殊算法,可以很方便地計算出各種指標,然后對市場的動態(tài)有一個比較全面的掌握,也為制定交易策略提供了一定的借鑒,從而促進收益水平的提高。除了上述功能外,Ta-lib還擁有識別K線形狀的能力,它可以自動識別多種常見的K線形狀,為投資者的決策提供了強大的支持。這里首先利用Ta-lib對各項技術指標及K線形態(tài)進行統(tǒng)計,再借助于mplfinance對數據進行可視化處理。這能夠更加直觀的了解市場數據趨勢及特點,以便于更好的投資分析。除此之外,這兩個數據庫也兼容Python編程語言,能夠輕松地與其他Python數據庫進行集成,從而提供更多的功能和可能性。部分代碼如下所示:(1)初始化交互式K線圖對象,歷史數據作為唯一的參數用于初始化對象。self.data=dataself.style=my_style(2)設置初始化的K線圖顯示區(qū)間起點為0,即顯示第0到第99個交易日的數據(前100個數據),設置ax1圖表中顯示的均線類型。self.idx_start=0self.idx_range=100self.avg_type='ma'self.indicator='macd'初始化figure對象,在figure上建立三個Axes對象并分別設置好它們的位置和基本屬性,在figure上預先放置文本并設置格式,文本內容根據需要顯示的數據實時更新,這里可以生成當天的股票數據信息,并顯示在界面最上方,如圖所示。圖4-2-2當天股票數據顯示部分代碼如下: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-納斯達克指數ETF基金',**title_font)self.t2=fig.text(0.12,0.90,'開/收:',**normal_label_font)(4)添加K線圖重疊均線,根據均線類型添加移動均線或布林帶線。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)添加指標,根據指標類型添加MACD或RSI或DEMA。以MACD指標為例: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)根據最新的參數,重新繪制整個圖表:all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range](8)最終得到的K線圖如下圖4-2-2所示,圖中有類似蠟燭的陽線和陰線,分別代表上漲和下跌,還有布林指標折線圖,由上、中、下三條線組成,分別是上軌線、中軌線和下軌線,另外還有最下方的成交量bar圖,X軸為股票日期數據,Y軸為成交數據。這些指標都是判斷股票波動的重要數據。圖4-2-2K線圖5預測模型的實現(xiàn)5.1移動平均線分析移動平均線(MovingAverage,MA)是股票分析中常用的一種技術,用于平滑價格數據,以便更清晰地看到價格趨勢。通過對過去一段時期股票平均價格的測算,對今后價格走勢進行預測。這里選取了5日、10日、20日和60日的移動平均線作為比較基準,目的是為了評估短期與長期內的價格走勢。當短期移動平均線向上突破長期移動平均線時,我們通常認為這是一個買進的信號,意味著股票價格可能繼續(xù)上漲。反之,當短期移動平均線向下突破長期移動平均線時,我們認為這是一個賣出信號,暗示股票價格可能出現(xiàn)下跌。簡單移動平均線(SimpleMovingAverage,SMA)的計算公式如下:SMAn=1其中,SMAn是窗口大小為n的簡單移動平均線,Pi是第i天的價格,n是移動平均線的窗口大小。移動平均線是一種遲滯性指標,這意味著它無法預測市場的即時變化。因此,需要將移動平均線與其他技術指標相結合,以提高預測的準確性。部分實現(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趨勢線分析趨勢線分析(TrendLineAnalysis)采用擬合數據的線性模型來預測未來的價格走勢。在編寫代碼時,采用了線性回歸模型(LinearRegression)來對價格數據進行擬合。線性回歸是一種統(tǒng)計分析方法,通過建立自變量(如時間、歷史價格等)與因變量(未來價格)之間的線性關系,來預測股票價格的未來走勢。對近一年來的股票數據進行回歸分析就可得到預測未來股價的線性方程,根據這個方程來判斷漲跌的可能性。線性回歸的基本原理如下:線性回歸模型是基于最小二乘法構建的,其基本目標是尋找到一條直線,使這條直線的自變量與因變量之間的預測值與實際值的殘差平方和達到最小。在這里,線性回歸模型就是求解直線方程y=wx+b中的斜率w和截距b。線性回歸模型在金融領域的優(yōu)勢主要體現(xiàn)在以下幾個方面:1.穩(wěn)定性:線性回歸模型具有較強的穩(wěn)定性,所以可以在不同的金融市場環(huán)境下保持較好的預測效果。2.實用性:線性回歸模型對數據的要求相對比較低,即使數據量有限,它也可以構建出具有較高預測能力的模型。3.易于操作:線性回歸模型的構建和預測過程比較簡單,并且易于操作,這可以幫助投資者快速做出決策。要使用線性回歸模型預測股票價格,需要收集近一年來的股票數據,如時間、歷史價格等信息。然后利用這些數據進行回歸分析,進而求解線性方程y=wx+b。得到線性方程,再根據該方程預測未來股價的走勢。如果預測值與實際值的殘差平方和較小,則說明線性回歸模型對股票價格的預測具有較高的準確性。部分代碼實現(xiàn)如下:X=df_filled[['close']].dropna()#確保沒有NaN值y=df_filled['close'].dropna()X=X.shift(1)#將'close'列向上移動一位,作為自變量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基于歷史數據的統(tǒng)計分析時間序列ARIMA(自回歸積分移動平均)模型是一種用于分析和預測時間序列數據的統(tǒng)計模型。結合了自回歸(AR),差分(I)和移動平均(MA)的概念,可以捕捉時間序列數據中的趨勢和周期性REF_Ref5372\r\h[15],模型過程如圖5-3-1所示。圖5-3-1ARIMA操作過程首先,采用ADF檢驗(AugmentedDickey-FullerTest)來驗證時間序列數據的穩(wěn)定性。ADF檢驗旨在檢驗自變量中某一個或者某幾個變量單位根的存在性,也就是考察時間序列的非平穩(wěn)性。時間序列分析是一種專為處理時間序列數據而設計的統(tǒng)計手段,它通過對歷史數據的時間序列特性進行分析,以預測未來數據可能出現(xiàn)的變動。在時間序列分析領域,自回歸模型是一種經常被采用的方法,其主要是通過建立過去數據與未來數據的自回歸聯(lián)系來預估未來股票的價格走勢。如果ADF檢驗的結果表明數據是非平穩(wěn)的,代碼將使用ARIMA模型(自回歸積分滑動平均模型)來擬合數據。ARIMA模型是一種用于時間序列預測的模型,它可以同時考慮數據的自回歸特性(AR),差分操作(I),和移動平均特性(MA)。ARIMA模型的一般形式是ARIMA(p,d,q),其中p是自回歸項的階數,d是進行差分的次數,q是移動平均項的階數。在代碼中,使用了ARIMA(1,2,4)模型。如果模型擬合成功,即殘差序列是平穩(wěn)的,那么使用模型的擬合值和實際值的比較來計算上漲概率(up_prob_arima)。如果擬合值大于實際值,則認為上漲概率高。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綜合股票預測值在股票市場預測中,我們常常采用多種預測模型以提高預測的準確性。上述三種預測模型分別是基于移動均線分析,趨勢線分析和歷史數據的統(tǒng)計分析的。為了更全面地評估股票的上漲概率,這里用均值的方法將這三種預測模型的結果進行綜合。代碼實現(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股票分析預測系統(tǒng)的應用測試6.1系統(tǒng)操作說明圖6-1-1系統(tǒng)操作流程6.2運行結果測試本次以2024年4月15日A股深市中鼎股份(000887.SZ)這只股票為例測試股票分析系統(tǒng)的應用結果:(1)運行代碼后按下鍵盤上的“A鍵”可以得到一個有著“輸入股票代碼”的窗口,可以在窗口里輸入深市任意一只股票代碼,結果如圖6-2-1所示:圖6-2-1輸入股票代碼窗口(2)在輸入框里輸入中鼎股份這個股票代碼,點擊“Enter鍵”,可以得到這只股票近一年的K線圖,這個圖由價格波動線,平均日線,成交量線等組成,且圖像上有開盤價,收盤價,漲幅,平均日價,交易額,最高價,最低價信息等,用戶可以對股票波動有一個直觀清晰的認識。輸出的K線圖如下圖6-2-2所示:圖6-2-2K線圖在K線圖這個頁面,可以用右上角的功能鍵進行選取放大等,可以更清楚地觀察一段時間的K線,如下圖6-2-3所示:圖6-2-3K線圖放大接著點擊鍵盤“M”鍵,可以得到基于SMA算法的股票上漲概率約為56.5%,如下圖6-2-4所示:圖6-2-4SMA算法預測值窗口(5)點擊鍵盤“T”鍵,可以得到基于趨勢線算法的股票上漲概率約為76.6%,如下圖6-2-5所示:圖6-2-5趨勢線分析算法預測值窗口(6)點擊鍵盤“R”鍵,可以得到基于歷史數據統(tǒng)計分析的股票上漲概率約為64.1%,如下圖6-2-6所示:圖6-2-6ARIMA算法預測值窗口(7)點擊“C”鍵,可以得到綜合分析的股票上漲概率約為62.5%,如下圖6-2-7所示:圖6-2-7綜合概率預測值窗口7總結本實驗選取近一年的股票數據,采用了三種不同的算法進行分析:移動平均線、線性回歸以及時間序列的自回歸,并得出相應的上漲概率,通過求均值的方式計算出了綜合上漲概率。這種方法綜合考慮了不同算法的優(yōu)點,使預測結果更全面準確。然而,由于采用的是傳統(tǒng)分析方法,未涉及深度學習等先進技術,因此預測結果可能存在一定的誤差。需要注意的是,股市波動變幻莫測,任何預測方法都無法保證100%的準確性。因此,投資者在使用本分析預測系統(tǒng)時,應謹慎參考預測結果,并結合其他因素進行綜合判斷。參考文獻何雨峰,許超,黃蘭.基于數據包絡方法的中小企業(yè)融資優(yōu)勢分析[J].中國集體經濟,2020(5):98-100.李雪.網絡輿情測度及其對銀行業(yè)系統(tǒng)性風險的影響研究[D].吉林:長春工業(yè)大學,2023.李思佳.基于Python的股票數據可視化分析——以新能源汽車行業(yè)為例[J].河北軟件職業(yè)技術學院學報,2021,23(3):15-18.王子豪.股票數據初探——移動平均與燭狀圖分析[J].中小企業(yè)管理與科技(上旬刊),2021,(01):111-112+115.梁國鵬,劉力軍.基于Python的量化交易系統(tǒng)設計與實現(xiàn)[J].現(xiàn)代信息科技,2021,5(8):86-89,94.DOI:10.19850/ki.2096-4706.2021.08.025.譚軍龍,李慧瑩.基于Python的量化投資交易系統(tǒng)的設計和實現(xiàn)[J].中國戰(zhàn)略新興產業(yè),2021(27):41-42.DOI:10.12230/j.issn.2095-6657.2021.27.027.魏玉嬌.基于Python的量化投資通道突破策略的應用研究[J].品牌研究,2021(23):265-267,281.DOI:10.3969/j.issn.1671-1009.2021.23.081.尹清.基于Python機器學習算法的易攜出客戶模型研究[J].中國新通信,2022,24(16):59-61.DOI:10.3969/j.issn.1673-4866.2022.16.019.孟平,龍華秋.基于Python的機器學習入侵檢測的研究[J].網絡安全技術與應用,2019(8):40-42.張凱姣.基于Python機器學習的可視化麻紗質量預測系統(tǒng)[D].上海:東華大學,2017.AlbeladiK,ZafarB,MueenA.TimeSeriesForecastingusingLSTMandARIMA[J].InternationalJournalofAdvancedComputerScienceandApplications(IJACSA),2023,14(1).JingyiZ.RepresentativeStockAnalysisinChineseMedicalIndustryandRelevantInvestmentRecommendations[J].JournalofEconomics,FinanceandAccountingStudies,2023,5(2):139-151.游穎,程俊.基于Python語言的教學數據處理平臺設計[J].中國新技術新產品,2023,(17):26-29.DOI:10.13612/tp.2023.17.011.潘奕霖.基于用戶畫像的生活垃圾產廢模式構建研究[D].哈爾濱工業(yè)大學,2022.DOI:10.27061/ki.ghgdu.2022.002934.郭聰楠.基于ARIMAGRU模型的地面沉降分析與預測研究[D].北京建筑大學,2023.附錄主函數:importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportmplfinanceasmpfimporttushareasts#讀取示例數據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線圖對象,歷史數據作為唯一的參數用于初始化對象self.data=dataself.style=my_style#設置初始化的K線圖顯示區(qū)間起點為0,即顯示第0到第99個交易日的數據(前100個數據)self.idx_start=0self.idx_range=100#設置ax1圖表中顯示的均線類型self.avg_type='ma'self.indicator='macd'#初始化figure對象,在figure上建立三個Axes對象并分別設置好它們的位置和基本屬性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對象,在figure上預先放置文本并設置格式,文本內容根據需要顯示的數據實時更新self.t1=fig.text(0.50,0.94,'513100.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,'均價:',**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):"""根據最新的參數,重新繪制整個圖表"""all_data=self.dataplot_data=all_data.iloc[idx_start:idx_start+idx_range]ap=[]#添加K線圖重疊均線,根據均線類型添加移動均線或布林帶線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))#添加指標,根據指標類型添加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線圖上的價格文本"""#display_data是一個交易日內的所有數據,將這些數據分別填入figure對象上的文本中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)}')#根據本交易日的價格變動值確定開盤價、收盤價的顯示顏色ifdisplay_data['change']>0:#如果今日變動額大于0,即今天價格高于昨天,今天價格顯示為紅色close_number_color='red'elifdisplay_data['change']<0:#如果今日變動額小于0,即今天價格低于昨天,今天價格顯示為綠色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#切換當前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'#切換當前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#設定平移的左右界限,如果平移后超出界限,則不再平移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):#僅當鼠標滾輪在axes1范圍內滾動時起作用scale_factor=1.0ifevent.inaxes!=self.ax1:returnifevent.button=='down':#縮小20%顯示范圍scale_factor=0.8ifevent.button=='up':#放大20%顯示范圍scale_factor=1.2#設置K線的顯示范圍大小self.idx_range=int(self.idx_range*scale_factor

溫馨提示

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

評論

0/150

提交評論