20212329實驗四《Python程式設計》Python綜合實踐報告
20212329實驗四《Python程式設計》Python綜合實踐報告
課程:《Python程式設計》
班級:2123 姓名:陳鵬宇 學號:20212329 實驗日期:2022年5月28日 必修/選修:公選課一、實驗內容
二、成果預測
三、專案過程
四、問題及解決方案
五、實際效果
六、課程總結
七、感想及建議
一、實驗內容
Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
課代表和各小組負責人收集作業(原始碼、視訊、綜合實踐報告)
注:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現。
批閱:注意本次實驗不算做實驗總分,前三個實驗每個實驗10分,累計30分。本次實踐算入綜合實踐,打分為25分。
評分標準:
(1)程式能執行,功能豐富。(需求提交原始碼,並建議錄製程式執行的視訊)10分
(2)綜合實踐報告,要體現實驗分析、設計、實現過程、結果等資訊,格式規範,邏輯清晰,結構合理。10分。
(3)在實踐報告中,需要對全課進行總結,並寫課程感想體會、意見和建議等。5分
(4)如果沒有使用華為雲服務(ECS或者MindSpore均可),本次實踐扣10分。
二、專案背景
對股市具有深刻了解的證券分析人員根據股票行情的發展進行的對未來股市發展方向以及漲跌程度的預測行為。這種預測行為只是基於假定的因素為既定的前提條件為基礎的。
三、專案過程
機器學習在股票價格預測中有著重要的應用。在這個機器學習專案中,我們將討論預測股票的回報。這個非常複雜的任務有不確定性。
爬取股票歷史資料記錄
1.配置python環境,登入baostock官網,爬取資料,查詢程式碼對應股票的歷史K線資料以及日期、程式碼、開盤價、日最高價、日最低價、收盤價,前日收盤價、成交量、成交額等引數。
2.獲取滬深300成分股,將結果集輸出到csv檔案和xlsx檔案,登出系統。
3.將資料集分為兩組:訓練集和測試集,訓練集遠多於測試集(訓練集:用來訓練模型或確定模型引數;驗證集:用來做模型選擇;測試集:檢驗最終選擇最優的模型效能如何。驗證集不是必須有的,資料集較小隻需要有訓練集和測試集)。分別設定開始時間和結束時間(超過會自動截止)
1 import baostock 2 import pandas 3 import openpyxl4 from sklearn import linear_model 5 import numpy 6 import matplotlib.pyplot 7 from sklearn.metrics import r2_score 8 9 stock='sh.600519' #可選擇股票 10 11 print('login respond error_code:'+baostock.login().error_code) 12 print('login respond error_msg:'+baostock.login().error_msg) 13 14 bqh = baostock.query_history_k_data_plus(stock, 15 "date,code,open,high,low,close,preclose,volume,amount,turn,pctChg", 16 start_date='2020-01-01', end_date='2021-01-01') 17 print('query_hushen300 error_code:'+bqh.error_code) 18 print('query_hushen300 error_msg:'+bqh.error_msg) 19 hushen300_stocks = [] 20 while (bqh.error_code == '0') & bqh.next(): 21 22 hushen300_stocks.append(bqh.get_row_data()) 23 result = pandas.DataFrame(hushen300_stocks, columns=bqh.fields) 24 result.to_csv("訓練集.csv") 25 result.to_excel("訓練集.xlsx") 26 27 bqh = baostock.query_history_k_data_plus(stock, 28 "date,code,open,high,low,close,preclose,volume,amount,turn,pctChg", 29 start_date='2022-03-01', end_date='2029-7-20')#超過會自動截止到最新日期 30 print('query_hushen300 error_code:'+bqh.error_code) 31 print('query_hushen300 error_msg:'+bqh.error_msg) 32 hushen300_stocks = [] 33 while (bqh.error_code == '0') & bqh.next(): 34 35 hushen300_stocks.append(bqh.get_row_data()) 36 result = pandas.DataFrame(hushen300_stocks, columns=bqh.fields) 37 result.to_csv("測試集.csv") 38 result.to_excel("測試集.xlsx") 39 40 baostock.logout()
處理資料
4.在Excel中處理資料,將日期中的"-"刪去,轉換為純數字以能作為做迴歸時或重新排序(重新排序會導致訓練集與測試集日期資料誤差過大)
5.將Excel中的資料按列存入列表中,注意不能直接使用:
1 date1 = pandas.read_excel('訓練集.xlsx', usecols='B') 2 open1 = pandas.read_excel('訓練集.xlsx', usecols='D') 3 high1 = pandas.read_excel('訓練集.xlsx', usecols='E') 4 low1 = pandas.read_excel('訓練集.xlsx', usecols='F') 5 close1 = pandas.read_excel('訓練集.xlsx', usecols='G') 6 preclose1 = pandas.read_excel('訓練集.xlsx', usecols='H') 7 volume1 = pandas.read_excel('訓練集.xlsx', usecols='I') 8 amount1 = pandas.read_excel('訓練集.xlsx', usecols='J') 9 turn1 = pandas.read_excel('訓練集.xlsx', usecols='K') 10 pctchg1 = pandas.read_excel('訓練集.xlsx', usecols='L') 11 12 date2 = pandas.read_excel('測試集.xlsx', usecols='B') 13 open2 = pandas.read_excel('測試集.xlsx', usecols='D') 14 high2 = pandas.read_excel('測試集.xlsx', usecols='E') 15 low2 = pandas.read_excel('測試集.xlsx', usecols='F') 16 close2 = pandas.read_excel('測試集.xlsx', usecols='G') 17 preclose2 = pandas.read_excel('測試集.xlsx', usecols='H') 18 volume2 = pandas.read_excel('測試集.xlsx', usecols='I') 19 amount2 = pandas.read_excel('測試集.xlsx', usecols='J') 20 turn2 = pandas.read_excel('測試集.xlsx', usecols='K') 21 pctchg2 = pandas.read_excel('測試集.xlsx', usecols='L')
這樣輸出其非列表,無法做迴歸,使用迴圈分別讀取每列的每一行元素以形成列表為散點圖做準備。
1 pre = pandas.read_excel("訓練集.xlsx", usecols=[1]) 2 pre_list = pre.values.tolist() 3 date1 = [] 4 for s_list in pre_list: 5 date1.append(s_list[0]) 6 pre = pandas.read_excel("訓練集.xlsx", usecols=[3]) 7 pre_list = pre.values.tolist() 8 open1 = [] 9 for s_list in pre_list: 10 open1.append(s_list[0]) 11 pre = pandas.read_excel("訓練集.xlsx", usecols=[4]) 12 pre_list = pre.values.tolist() 13 high1 = [] 14 for s_list in pre_list: 15 high1.append(s_list[0]) 16 pre = pandas.read_excel("訓練集.xlsx", usecols=[5]) 17 pre_list = pre.values.tolist() 18 low1 = [] 19 for s_list in pre_list: 20 low1.append(s_list[0]) 21 pre = pandas.read_excel("訓練集.xlsx", usecols=[6]) 22 pre_list = pre.values.tolist() 23 close1 = [] 24 for s_list in pre_list: 25 close1.append(s_list[0]) 26 pre = pandas.read_excel("訓練集.xlsx", usecols=[7]) 27 pre_list = pre.values.tolist() 28 preclose1 = [] 29 for s_list in pre_list: 30 preclose1.append(s_list[0]) 31 pre = pandas.read_excel("訓練集.xlsx", usecols=[8]) 32 pre_list = pre.values.tolist() 33 volume1 = [] 34 for s_list in pre_list: 35 volume1.append(s_list[0]) 36 pre = pandas.read_excel("訓練集.xlsx", usecols=[9]) 37 pre_list = pre.values.tolist() 38 amount1 = [] 39 for s_list in pre_list: 40 amount1.append(s_list[0]) 41 pre = pandas.read_excel("訓練集.xlsx", usecols=[10]) 42 pre_list = pre.values.tolist() 43 turn1 = [] 44 for s_list in pre_list: 45 turn1.append(s_list[0]) 46 pre = pandas.read_excel("訓練集.xlsx", usecols=[11]) 47 pre_list = pre.values.tolist() 48 pctchg1 = [] 49 for s_list in pre_list: 50 pctchg1.append(s_list[0]) 51 pre = pandas.read_excel("測試集.xlsx", usecols=[1]) 52 pre_list = pre.values.tolist() 53 date2 = [] 54 for s_list in pre_list: 55 date2.append(s_list[0]) 56 pre = pandas.read_excel("測試集.xlsx", usecols=[3]) 57 pre_list = pre.values.tolist() 58 open2 = [] 59 for s_list in pre_list: 60 open2.append(s_list[0]) 61 pre = pandas.read_excel("測試集.xlsx", usecols=[4]) 62 pre_list = pre.values.tolist() 63 high2 = [] 64 for s_list in pre_list: 65 high2.append(s_list[0]) 66 pre = pandas.read_excel("測試集.xlsx", usecols=[5]) 67 pre_list = pre.values.tolist() 68 low2 = [] 69 for s_list in pre_list: 70 low2.append(s_list[0]) 71 pre = pandas.read_excel("測試集.xlsx", usecols=[6]) 72 pre_list = pre.values.tolist() 73 close2 = [] 74 for s_list in pre_list: 75 close2.append(s_list[0]) 76 pre = pandas.read_excel("測試集.xlsx", usecols=[7]) 77 pre_list = pre.values.tolist() 78 preclose2 = [] 79 for s_list in pre_list: 80 preclose2.append(s_list[0]) 81 pre = pandas.read_excel("測試集.xlsx", usecols=[8]) 82 pre_list = pre.values.tolist() 83 volume2 = [] 84 for s_list in pre_list: 85 volume2.append(s_list[0]) 86 pre = pandas.read_excel("測試集.xlsx", usecols=[9]) 87 pre_list = pre.values.tolist() 88 amount2 = [] 89 for s_list in pre_list: 90 amount2.append(s_list[0]) 91 pre = pandas.read_excel("測試集.xlsx", usecols=[10]) 92 pre_list = pre.values.tolist() 93 turn2 = [] 94 for s_list in pre_list: 95 turn2.append(s_list[0]) 96 pre = pandas.read_excel("測試集.xlsx", usecols=[11]) 97 pre_list = pre.values.tolist() 98 pctchg2 = [] 99 for s_list in pre_list: 100 pctchg2.append(s_list[0])
計算大量資料的線性迴歸並計算擬合度,擬合度高於0.8則採用,低於0.1則不採用。
而後分為兩種方法:
①尋找日期與其他引數的迴歸關係並預測出其他引數的未來數值,再尋找其他引數和收盤價的迴歸關係,利用預測出的其他引數的未來數值預測收盤價未來數值(多元迴歸)
1 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 2 myline = numpy.linspace(20200102, 20201231) 3 matplotlib.pyplot.scatter(date1, open1) 4 matplotlib.pyplot.plot(myline, mymodel(myline)) 5 matplotlib.pyplot.show() 6 print(r2_score(open1, mymodel(date1))) 7 8 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 9 myline = numpy.linspace(20200102, 20201231) 10 matplotlib.pyplot.scatter(date1, high1) 11 matplotlib.pyplot.plot(myline, mymodel(myline)) 12 matplotlib.pyplot.show() 13 print(r2_score(high1, mymodel(date1))) 14 15 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 16 myline = numpy.linspace(20200102, 20201231) 17 matplotlib.pyplot.scatter(date1, low1) 18 matplotlib.pyplot.plot(myline, mymodel(myline)) 19 matplotlib.pyplot.show() 20 print(r2_score(low1, mymodel(date1))) 21 22 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 23 myline = numpy.linspace(20200102, 20201231) 24 matplotlib.pyplot.scatter(date1, close1) 25 matplotlib.pyplot.plot(myline, mymodel(myline)) 26 matplotlib.pyplot.show() 27 print(r2_score(close1, mymodel(date1))) 28 29 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 30 myline = numpy.linspace(20200102, 20201231) 31 matplotlib.pyplot.scatter(date1, preclose1) 32 matplotlib.pyplot.plot(myline, mymodel(myline)) 33 matplotlib.pyplot.show() 34 print(r2_score(preclose1, mymodel(date1))) 35 36 mymodel = numpy.poly1d(numpy.polyfit(date1, volume1, 1)) 37 myline = numpy.linspace(20200102, 20201231) 38 matplotlib.pyplot.scatter(date1, volume1) 39 matplotlib.pyplot.plot(myline, mymodel(myline)) 40 matplotlib.pyplot.show() 41 print(r2_score(volume1, mymodel(date1))) 42 43 mymodel = numpy.poly1d(numpy.polyfit(date1, amount1, 1)) 44 myline = numpy.linspace(20200102, 20201231) 45 matplotlib.pyplot.scatter(date1, amount1) 46 matplotlib.pyplot.plot(myline, mymodel(myline)) 47 matplotlib.pyplot.show() 48 print(r2_score(amount1, mymodel(date1))) 49 50 mymodel = numpy.poly1d(numpy.polyfit(date1, turn1, 1)) 51 myline = numpy.linspace(20200102, 20201231) 52 matplotlib.pyplot.scatter(date1, turn1) 53 matplotlib.pyplot.plot(myline, mymodel(myline)) 54 matplotlib.pyplot.show() 55 print(r2_score(turn1, mymodel(date1))) 56 57 mymodel = numpy.poly1d(numpy.polyfit(date1, pctchg1, 1)) 58 myline = numpy.linspace(20200102, 20201231) 59 matplotlib.pyplot.scatter(date1, pctchg1) 60 matplotlib.pyplot.plot(myline, mymodel(myline)) 61 matplotlib.pyplot.show() 62 print(r2_score(pctchg1, mymodel(date1)))
由所得散點圖迴歸直線及擬合度可得:開盤價、日最高價、日最低價、收盤價、前日收盤價能與日期擬合線性關係,其擬合度都在0.9左右。然後用開盤價、日最高價、日最低價、收盤價、前日收盤價等測試資料來測試模型,以檢驗是否給出相同的結果。
1 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 2 r2 = r2_score(open2, mymodel(date2)) 3 print(r2) 4 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 5 r2 = r2_score(high2, mymodel(date2)) 6 print(r2) 7 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 8 r2 = r2_score(low2, mymodel(date2)) 9 print(r2) 10 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 11 r2 = r2_score(close2, mymodel(date2)) 12 print(r2) 13 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 14 r2 = r2_score(preclose2, mymodel(date2)) 15 print(r2) 16 mymodel = numpy.poly1d(numpy.polyfit(date1, volume1, 1)) 17 r2 = r2_score(volume2, mymodel(date2)) 18 print(r2) 19 mymodel = numpy.poly1d(numpy.polyfit(date1, amount1, 1)) 20 r2 = r2_score(amount2, mymodel(date2)) 21 print(r2) 22 mymodel = numpy.poly1d(numpy.polyfit(date1, turn1, 1)) 23 r2 = r2_score(turn2, mymodel(date2)) 24 print(r2) 25 mymodel = numpy.poly1d(numpy.polyfit(date1, pctchg1, 1)) 26 r2 = r2_score(pctchg2, mymodel(date2)) 27 print(r2)
結果表明該模型適合測試集,即確信可以使用該模型預測未來值。可以開始預測新值了。
接下來用同樣的方法尋找其他引數和收盤價的迴歸關係,得出開盤價,最高價,最低價,前日收盤價能與收盤價擬合線性關係,其擬合度都在1左右。之後測試模型,擬合度比較高表示模型還不錯,可以預測了。
1 want_date=int(input()) 2 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 3 r2 = r2_score(open2, mymodel(date2)) 4 future_open=mymodel(want_date) 5 6 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 7 r2 = r2_score(high2, mymodel(date2)) 8 future_high=mymodel(want_date) 9 10 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 11 r2 = r2_score(low2, mymodel(date2)) 12 future_low=mymodel(want_date) 13 14 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 15 r2 = r2_score(close2, mymodel(date2)) 16 future_close=mymodel(want_date) 17 18 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 19 r2 = r2_score(preclose2, mymodel(date2)) 20 future_preclose=mymodel(want_date) 21 22 mymodel = numpy.poly1d(numpy.polyfit(open1, close1, 1)) 23 r2 = r2_score(open2, mymodel(close2)) 24 future_close1=mymodel(future_open) 25 mymodel = numpy.poly1d(numpy.polyfit(high1,close1 , 1)) 26 r2 = r2_score(high2, mymodel(close2)) 27 future_close2=mymodel(future_high) 28 mymodel = numpy.poly1d(numpy.polyfit(low1, close1, 1)) 29 r2 = r2_score(low2, mymodel(close2)) 30 future_close3=mymodel(future_low) 31 mymodel = numpy.poly1d(numpy.polyfit(preclose1, close1, 1)) 32 r2 = r2_score(preclose2, mymodel(close2)) 33 future_close4=mymodel(future_preclose) 34 print((future_close+future_close1+future_close2+future_close3+future_close4)/5)
②將Excel的前日收盤價替換為明日收盤價,空出最後一行的單元格(不計入迴歸計算中),尋找其他引數與明日收盤價的迴歸關係並利用已知引數預測。(避開日期差的問題)
該方法與第一種方法大體步驟一致,與未來收盤價擬合度高的引數是開盤價,最高價,最低價,收盤價,擬合度都在0.9左右並對這四個模型進行測試。
1 pre = pandas.read_excel("訓練集.xlsx", usecols=[7]) 2 pre_list = pre.values.tolist() 3 futclose1 = [] 4 for s_list in pre_list: 5 futclose1.append(s_list[0])
1 mymodel = numpy.poly1d(numpy.polyfit(open1, futclose1, 1)) 2 myline = numpy.linspace(1500, 2600) 3 matplotlib.pyplot.scatter(open1, futclose1) 4 matplotlib.pyplot.plot(myline, mymodel(myline)) 5 #matplotlib.pyplot.show() 6 #print(r2_score(futclose1, mymodel(open1))) 7 8 mymodel = numpy.poly1d(numpy.polyfit(high1, futclose1, 1)) 9 myline = numpy.linspace(1600, 2600) 10 matplotlib.pyplot.scatter(high1, futclose1) 11 matplotlib.pyplot.plot(myline, mymodel(myline)) 12 #matplotlib.pyplot.show() 13 #print(r2_score(futclose1, mymodel(high1))) 14 15 mymodel = numpy.poly1d(numpy.polyfit(low1, futclose1, 1)) 16 myline = numpy.linspace(1500, 2500) 17 matplotlib.pyplot.scatter(low1, futclose1) 18 matplotlib.pyplot.plot(myline, mymodel(myline)) 19 #matplotlib.pyplot.show() 20 #print(r2_score(futclose1, mymodel(low1))) 21 22 mymodel = numpy.poly1d(numpy.polyfit(close1, futclose1, 1)) 23 myline = numpy.linspace(1500, 2600) 24 matplotlib.pyplot.scatter(close1, futclose1) 25 matplotlib.pyplot.plot(myline, mymodel(myline)) 26 #matplotlib.pyplot.show() 27 #print(r2_score(futclose1, mymodel(close1))) 28 29 openx=float(input("輸入今日開盤價:\n")) 30 highx=float(input("輸入今日最高價:\n")) 31 lowx=float(input("輸入今日最低價:\n")) 32 closex=float(input("輸入今日收盤價:\n")) 33 mymodel = numpy.poly1d(numpy.polyfit(open1, futclose1, 1)) 34 r2 = r2_score(open2, mymodel(close2)) 35 future_close1=mymodel(openx) 36 mymodel = numpy.poly1d(numpy.polyfit(high1,futclose1 , 1)) 37 r2 = r2_score(high2, mymodel(close2)) 38 future_close2=mymodel(highx) 39 mymodel = numpy.poly1d(numpy.polyfit(low1, futclose1, 1)) 40 r2 = r2_score(low2, mymodel(close2)) 41 future_close3=mymodel(lowx) 42 mymodel = numpy.poly1d(numpy.polyfit(close1, futclose1, 1)) 43 r2 = r2_score(futclose2, mymodel(close2)) 44 future_close4=mymodel(closex) 45 print("預測明日收盤價為:") 46 print((future_close4+future_close3+future_close2+future_close1)/4)
上傳至碼雲
在華為雲上執行
完整程式碼
1 import baostock 2 import pandas 3 import openpyxl 4 from sklearn import linear_model 5 import numpy 6 import matplotlib.pyplot 7 from sklearn.metrics import r2_score 8 9 stock='sh.600519' #可選擇股票 10 11 print('login respond error_code:'+baostock.login().error_code) 12 print('login respond error_msg:'+baostock.login().error_msg) 13 14 bqh = baostock.query_history_k_data_plus(stock, 15 "date,code,open,high,low,close,preclose,volume,amount,turn,pctChg", 16 start_date='2020-01-01', end_date='2021-01-01') 17 print('query_hushen300 error_code:'+bqh.error_code) 18 print('query_hushen300 error_msg:'+bqh.error_msg) 19 hushen300_stocks = [] 20 while (bqh.error_code == '0') & bqh.next(): 21 22 hushen300_stocks.append(bqh.get_row_data()) 23 result = pandas.DataFrame(hushen300_stocks, columns=bqh.fields) 24 result.to_csv("訓練集.csv") 25 result.to_excel("訓練集.xlsx") 26 27 bqh = baostock.query_history_k_data_plus(stock,"date,code,open,high,low,close,preclose,volume,amount,turn,pctChg", 28 start_date='2022-03-01', end_date='2029-7-20')#超過會自動截止到最新日期 29 print('query_hushen300 error_code:'+bqh.error_code) 30 print('query_hushen300 error_msg:'+bqh.error_msg) 31 hushen300_stocks = [] 32 while (bqh.error_code == '0') & bqh.next(): 33 34 hushen300_stocks.append(bqh.get_row_data()) 35 result = pandas.DataFrame(hushen300_stocks, columns=bqh.fields) 36 result.to_csv("測試集.csv") 37 result.to_excel("測試集.xlsx") 38 39 baostock.logout() 40 41 42 43 44 pre = pandas.read_excel("訓練集.xlsx", usecols=[1]) 45 pre_list = pre.values.tolist() 46 date1 = [] 47 for s_list in pre_list: 48 date1.append(s_list[0]) 49 pre = pandas.read_excel("訓練集.xlsx", usecols=[3]) 50 pre_list = pre.values.tolist() 51 open1 = [] 52 for s_list in pre_list: 53 open1.append(s_list[0]) 54 pre = pandas.read_excel("訓練集.xlsx", usecols=[4]) 55 pre_list = pre.values.tolist() 56 high1 = [] 57 for s_list in pre_list: 58 high1.append(s_list[0]) 59 pre = pandas.read_excel("訓練集.xlsx", usecols=[5]) 60 pre_list = pre.values.tolist() 61 low1 = [] 62 for s_list in pre_list: 63 low1.append(s_list[0]) 64 pre = pandas.read_excel("訓練集.xlsx", usecols=[6]) 65 pre_list = pre.values.tolist() 66 close1 = [] 67 for s_list in pre_list: 68 close1.append(s_list[0]) 69 pre = pandas.read_excel("訓練集.xlsx", usecols=[7]) 70 pre_list = pre.values.tolist() 71 preclose1 = [] 72 for s_list in pre_list: 73 preclose1.append(s_list[0]) 74 pre = pandas.read_excel("訓練集.xlsx", usecols=[8]) 75 pre_list = pre.values.tolist() 76 volume1 = [] 77 for s_list in pre_list: 78 volume1.append(s_list[0]) 79 pre = pandas.read_excel("訓練集.xlsx", usecols=[9]) 80 pre_list = pre.values.tolist() 81 amount1 = [] 82 for s_list in pre_list: 83 amount1.append(s_list[0]) 84 pre = pandas.read_excel("訓練集.xlsx", usecols=[10]) 85 pre_list = pre.values.tolist() 86 turn1 = [] 87 for s_list in pre_list: 88 turn1.append(s_list[0]) 89 pre = pandas.read_excel("訓練集.xlsx", usecols=[11]) 90 pre_list = pre.values.tolist() 91 pctchg1 = [] 92 for s_list in pre_list: 93 pctchg1.append(s_list[0]) 94 pre = pandas.read_excel("測試集.xlsx", usecols=[1]) 95 pre_list = pre.values.tolist() 96 date2 = [] 97 for s_list in pre_list: 98 date2.append(s_list[0]) 99 pre = pandas.read_excel("測試集.xlsx", usecols=[3]) 100 pre_list = pre.values.tolist() 101 open2 = [] 102 for s_list in pre_list: 103 open2.append(s_list[0]) 104 pre = pandas.read_excel("測試集.xlsx", usecols=[4]) 105 pre_list = pre.values.tolist() 106 high2 = [] 107 for s_list in pre_list: 108 high2.append(s_list[0]) 109 pre = pandas.read_excel("測試集.xlsx", usecols=[5]) 110 pre_list = pre.values.tolist() 111 low2 = [] 112 for s_list in pre_list: 113 low2.append(s_list[0]) 114 pre = pandas.read_excel("測試集.xlsx", usecols=[6]) 115 pre_list = pre.values.tolist() 116 close2 = [] 117 for s_list in pre_list: 118 close2.append(s_list[0]) 119 pre = pandas.read_excel("測試集.xlsx", usecols=[7]) 120 pre_list = pre.values.tolist() 121 preclose2 = [] 122 for s_list in pre_list: 123 preclose2.append(s_list[0]) 124 pre = pandas.read_excel("測試集.xlsx", usecols=[8]) 125 pre_list = pre.values.tolist() 126 volume2 = [] 127 for s_list in pre_list: 128 volume2.append(s_list[0]) 129 pre = pandas.read_excel("測試集.xlsx", usecols=[9]) 130 pre_list = pre.values.tolist() 131 amount2 = [] 132 for s_list in pre_list: 133 amount2.append(s_list[0]) 134 pre = pandas.read_excel("測試集.xlsx", usecols=[10]) 135 pre_list = pre.values.tolist() 136 turn2 = [] 137 for s_list in pre_list: 138 turn2.append(s_list[0]) 139 pre = pandas.read_excel("測試集.xlsx", usecols=[11]) 140 pre_list = pre.values.tolist() 141 pctchg2 = [] 142 for s_list in pre_list: 143 pctchg2.append(s_list[0]) 144 145 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 146 myline = numpy.linspace(20200102, 20201231) 147 matplotlib.pyplot.scatter(date1, open1) 148 matplotlib.pyplot.plot(myline, mymodel(myline)) 149 matplotlib.pyplot.show() 150 print(r2_score(open1, mymodel(date1))) 151 152 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 153 myline = numpy.linspace(20200102, 20201231) 154 matplotlib.pyplot.scatter(date1, high1) 155 matplotlib.pyplot.plot(myline, mymodel(myline)) 156 matplotlib.pyplot.show() 157 print(r2_score(high1, mymodel(date1))) 158 159 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 160 myline = numpy.linspace(20200102, 20201231) 161 matplotlib.pyplot.scatter(date1, low1) 162 matplotlib.pyplot.plot(myline, mymodel(myline)) 163 matplotlib.pyplot.show() 164 print(r2_score(low1, mymodel(date1))) 165 166 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 167 myline = numpy.linspace(20200102, 20201231) 168 matplotlib.pyplot.scatter(date1, close1) 169 matplotlib.pyplot.plot(myline, mymodel(myline)) 170 matplotlib.pyplot.show() 171 print(r2_score(close1, mymodel(date1))) 172 173 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 174 myline = numpy.linspace(20200102, 20201231) 175 matplotlib.pyplot.scatter(date1, preclose1) 176 matplotlib.pyplot.plot(myline, mymodel(myline)) 177 matplotlib.pyplot.show() 178 print(r2_score(preclose1, mymodel(date1))) 179 180 mymodel = numpy.poly1d(numpy.polyfit(date1, volume1, 1)) 181 myline = numpy.linspace(20200102, 20201231) 182 matplotlib.pyplot.scatter(date1, volume1) 183 matplotlib.pyplot.plot(myline, mymodel(myline)) 184 matplotlib.pyplot.show() 185 print(r2_score(volume1, mymodel(date1))) 186 187 mymodel = numpy.poly1d(numpy.polyfit(date1, amount1, 1)) 188 myline = numpy.linspace(20200102, 20201231) 189 matplotlib.pyplot.scatter(date1, amount1) 190 matplotlib.pyplot.plot(myline, mymodel(myline)) 191 matplotlib.pyplot.show() 192 print(r2_score(amount1, mymodel(date1))) 193 194 mymodel = numpy.poly1d(numpy.polyfit(date1, turn1, 1)) 195 myline = numpy.linspace(20200102, 20201231) 196 matplotlib.pyplot.scatter(date1, turn1) 197 matplotlib.pyplot.plot(myline, mymodel(myline)) 198 matplotlib.pyplot.show() 199 print(r2_score(turn1, mymodel(date1))) 200 201 mymodel = numpy.poly1d(numpy.polyfit(date1, pctchg1, 1)) 202 myline = numpy.linspace(20200102, 20201231) 203 matplotlib.pyplot.scatter(date1, pctchg1) 204 matplotlib.pyplot.plot(myline, mymodel(myline)) 205 matplotlib.pyplot.show() 206 print(r2_score(pctchg1, mymodel(date1))) 207 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 208 r2 = r2_score(open2, mymodel(date2)) 209 print(r2) 210 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 211 r2 = r2_score(high2, mymodel(date2)) 212 print(r2) 213 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 214 r2 = r2_score(low2, mymodel(date2)) 215 print(r2) 216 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 217 r2 = r2_score(close2, mymodel(date2)) 218 print(r2) 219 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 220 r2 = r2_score(preclose2, mymodel(date2)) 221 print(r2) 222 mymodel = numpy.poly1d(numpy.polyfit(date1, volume1, 1)) 223 r2 = r2_score(volume2, mymodel(date2)) 224 print(r2) 225 mymodel = numpy.poly1d(numpy.polyfit(date1, amount1, 1)) 226 r2 = r2_score(amount2, mymodel(date2)) 227 print(r2) 228 mymodel = numpy.poly1d(numpy.polyfit(date1, turn1, 1)) 229 r2 = r2_score(turn2, mymodel(date2)) 230 print(r2) 231 mymodel = numpy.poly1d(numpy.polyfit(date1, pctchg1, 1)) 232 r2 = r2_score(pctchg2, mymodel(date2)) 233 print(r2) 234 235 print("請輸入日期:\n") 236 rate=0 237 want_date=int(input()) 238 while(want_date>20210000): 239 want_date=want_date-10000 240 rate=rate+1 241 want_date=want_date+rate*100 242 mymodel = numpy.poly1d(numpy.polyfit(date1, open1, 1)) 243 r2 = r2_score(open2, mymodel(date2)) 244 future_open=mymodel(want_date) 245 246 mymodel = numpy.poly1d(numpy.polyfit(date1, high1, 1)) 247 r2 = r2_score(high2, mymodel(date2)) 248 future_high=mymodel(want_date) 249 250 mymodel = numpy.poly1d(numpy.polyfit(date1, low1, 1)) 251 r2 = r2_score(low2, mymodel(date2)) 252 future_low=mymodel(want_date) 253 254 mymodel = numpy.poly1d(numpy.polyfit(date1, close1, 1)) 255 r2 = r2_score(close2, mymodel(date2)) 256 future_close=mymodel(want_date) 257 258 mymodel = numpy.poly1d(numpy.polyfit(date1, preclose1, 1)) 259 r2 = r2_score(preclose2, mymodel(date2)) 260 future_preclose=mymodel(want_date) 261 262 mymodel = numpy.poly1d(numpy.polyfit(open1, close1, 1)) 263 r2 = r2_score(open2, mymodel(close2)) 264 future_close1=mymodel(future_open) 265 mymodel = numpy.poly1d(numpy.polyfit(high1,close1 , 1)) 266 r2 = r2_score(high2, mymodel(close2)) 267 future_close2=mymodel(future_high) 268 mymodel = numpy.poly1d(numpy.polyfit(low1, close1, 1)) 269 r2 = r2_score(low2, mymodel(close2)) 270 future_close3=mymodel(future_low) 271 mymodel = numpy.poly1d(numpy.polyfit(preclose1, close1, 1)) 272 r2 = r2_score(preclose2, mymodel(close2)) 273 future_close4=mymodel(future_preclose) 274 print((future_close+future_close1+future_close2+future_close3+future_close4)/5) 275 276 277 ###################################################### 278 279 280 pre = pandas.read_excel("訓練集.xlsx", usecols=[7]) 281 pre_list = pre.values.tolist() 282 futclose1 = [] 283 for s_list in pre_list: 284 futclose1.append(s_list[0]) 285 pre = pandas.read_excel("測試集.xlsx", usecols=[7]) 286 pre_list = pre.values.tolist() 287 futclose2 = [] 288 for s_list in pre_list: 289 futclose2.append(s_list[0]) 290 291 mymodel = numpy.poly1d(numpy.polyfit(open1, futclose1, 1)) 292 myline = numpy.linspace(1500, 2600) 293 matplotlib.pyplot.scatter(open1, futclose1) 294 matplotlib.pyplot.plot(myline, mymodel(myline)) 295 #matplotlib.pyplot.show() 296 #print(r2_score(futclose1, mymodel(open1))) 297 298 mymodel = numpy.poly1d(numpy.polyfit(high1, futclose1, 1)) 299 myline = numpy.linspace(1600, 2600) 300 matplotlib.pyplot.scatter(high1, futclose1) 301 matplotlib.pyplot.plot(myline, mymodel(myline)) 302 #matplotlib.pyplot.show() 303 #print(r2_score(futclose1, mymodel(high1))) 304 305 mymodel = numpy.poly1d(numpy.polyfit(low1, futclose1, 1)) 306 myline = numpy.linspace(1500, 2500) 307 matplotlib.pyplot.scatter(low1, futclose1) 308 matplotlib.pyplot.plot(myline, mymodel(myline)) 309 #matplotlib.pyplot.show() 310 #print(r2_score(futclose1, mymodel(low1))) 311 312 mymodel = numpy.poly1d(numpy.polyfit(close1, futclose1, 1)) 313 myline = numpy.linspace(1500, 2600) 314 matplotlib.pyplot.scatter(close1, futclose1) 315 matplotlib.pyplot.plot(myline, mymodel(myline)) 316 #matplotlib.pyplot.show() 317 #print(r2_score(futclose1, mymodel(close1))) 318 319 openx=float(input("輸入今日開盤價:\n")) 320 highx=float(input("輸入今日最高價:\n")) 321 lowx=float(input("輸入今日最低價:\n")) 322 closex=float(input("輸入今日收盤價:\n")) 323 mymodel = numpy.poly1d(numpy.polyfit(open1, futclose1, 1)) 324 r2 = r2_score(open2, mymodel(close2)) 325 future_close1=mymodel(openx) 326 mymodel = numpy.poly1d(numpy.polyfit(high1,futclose1 , 1)) 327 r2 = r2_score(high2, mymodel(close2)) 328 future_close2=mymodel(highx) 329 mymodel = numpy.poly1d(numpy.polyfit(low1, futclose1, 1)) 330 r2 = r2_score(low2, mymodel(close2)) 331 future_close3=mymodel(lowx) 332 mymodel = numpy.poly1d(numpy.polyfit(close1, futclose1, 1)) 333 r2 = r2_score(futclose2, mymodel(close2)) 334 future_close4=mymodel(closex) 335 print("預測明日收盤價為:") 336 print((future_close4+future_close3+future_close2+future_close1)/4)
四、問題及解決方案
1.使用beautifulsoup爬取股票資訊僅能捕獲當天的資訊
解決:①通過pandas_datareader庫的方法爬取股市資料(pandas_datareader是一個能讀取各種金融資料的庫)②引入baostock庫(提供大量準確、完整的證券歷史行情資料、上市公司財務資料)
2.pandas寫入excel提示FutureWarning: As the xlwt package is no longer maintained
解決:由於xlwt軟體包不再維護,xlwt引擎將在未來版本的pandas中刪除。這是pandas中唯一支援xls格式寫入的引擎。安裝openpyxl並改為寫入xlsx檔案。
3.Matlab執行檔案時報告在當前資料夾或MATLAB路徑中未找到檔案。
解決:MATLAB不推薦使用 csvread
。
M = csvread(
將逗號分隔值 (CSV) 格式化檔案讀入陣列filename
)M
中。該檔案只能包含數值。
M = csvread(
從行偏移量filename
,R1
,C1
)R1
和列偏移量C1
開始讀取檔案中的資料。例如,偏移量R1=0
、C1=0
指定檔案中的第一個值。
4.生成xlsx檔案列寬不足完全顯示資料 解決:引入openyxl庫以設定列寬具體數值,*或調整自適應列寬(未能實現) 5.MATLAB訓練時長過長,容易因mu值過高而結束訓練導致模型的資料集過少,擬合度達不到要求 解決:不使用MATLAB,在Python中匯入matplotlib.pyplot模組、scipy庫、stats模組,在Python中尋找回歸關係並繪製線性迴歸線。
M = csvread(
僅讀取行偏移量filename
,R1
,C1
,[R1
C1
R2
C2
])R1
和R2
及列偏移量C1
和C2
界定的範圍。另一種定義範圍的方法是使用電子表格表示法(例如'A1..B7'
)而非[0 0 6 1]
。
五、實際效果
六、課程總結
“人生苦短,我用Python!”python是一門非常有潛力的高階語言,完全面向物件的語言,歷經多年的發展,其在程式設計上發揮著越來越大的作用。從print(“hello world”)到做期末作業的大專案,在這學期中,通過選修python課上的基礎知識學習,我對python也的認識也相較於第一學期更加深入。在本學期同時學習python和C,難免想將二者做對比:python的語句更簡潔,更通俗易懂,利用縮排設定語句巢狀更清晰,而且python的變數不需要提前去定義,為pythoner創造了極度舒適的程式設計環境,而C語言步驟繁瑣,利用{}來設定語句巢狀會有些許不直觀,但for迴圈等方面C語言還是更勝一籌。而隨著近幾年來的發展,python的受歡迎度也越來越高,而它的運用的領域也是越來越多,比如機器學習和大資料等領域,python都是在其中扮演者重要的角色。內容過多不再一一贅述,簡單列舉些Python的用法:
1、列表相當於動態陣列,元組相當於靜態陣列。
2、字典型別十分方便,在python直接以基本資料型別的方式實現。
3、變數不用定義型別,直接賦值即可。
4、python中沒有自增運算子和自減運算子。
5、身份運算子is與==有區別,is比較兩個變數的身份(記憶體地址)是否相等,==比較兩個變數的值是否相等。
6、集合是無序的,所以{1,2,3}=={3,2,1}為true;元組和列表是有序的,所以(1,2.,3)==(3,2,1)為false。
7、python依靠縮排區分程式碼塊,而不是{ }。
8、if-else語句、while語句中有冒號:。
9、只存在形式上的常量,將變數名全大寫當作常量。
10、沒有switch,可以用elif代替,相當於else if。
11、while可以與else搭配使用,for也可以與else搭配,但很少使用。
12、for迴圈的格式是for target_list in expression_list,迴圈時target_list會自增,其他語言中for(int i=0;i<=10;i++)可以用for x in range(0,10)代替。
13、range(0,10)表示0到9。range(0,10,2)將步長設為2,表示的是0、2、4、6、8。range(10,0,-1)表示的是10到1。
range()格式為range(start, stop[, step]),
start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5);
stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5;
step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1);
關於匯入:
14、在一個資料夾裡建立_init_.py,可以使python將該資料夾當作一個包。匯入模組使用import,可以加上as關鍵詞。
15、匯入模組中單個或多個變數可以使用form … import …(此處可用萬用字元*)。匯入某一模組時會執行該模組的所有程式碼。要注意避免迴圈匯入。
16、每個模組有內建的變數:__name__是模組的完整名稱,__package是模組所在的包的名稱,__file__是模組的絕對路徑,__doc__是該模組的註釋內容。但是入口檔案的__name__會被強制更改為__main__,入口檔案也不屬於任何包,file也會變成自身檔名而不是絕對路勁。
17、邏輯運算子and、or、not用於操作和返回布林值,但非布林型別的值也可以被認為是布林值從而使用邏輯運算子,邏輯運算子也可以返回非布林型別的值,等同於其他語言中先用if語句做判斷,然後確定返回某一個值。int、float型別的值不為零則認為是True,字串不為空也被認為是True。當操作值不是布林值時,and與or的返回規律如下:先判斷該表示式返回的布林值是True還是False,再在操作值中尋找能轉化為該布林值的值,該值即為表示式真正返回的值;若兩個操作值都符合條件,則and返回後面的值,or返回前面的值。如1 and 2返回2,1 or 2 返回1。Python中沒有&與|。
關於函式:
18、python中定義函式時不用指定函式返回值的型別,通通用def。引數列表可以沒有,列表中的變數也不需要定義型別。後面依然要帶上冒號:。區分程式碼塊依然靠縮排而非{}。
19、函式的返回結果可以是多個,可以使用return A,B。接受返回值時可以直接用多個變數接受
20、序列解包是python一大特點。執行d=1,2,3,python會自動將d整合為一個序列(陣列),變成[1,2,3]。再執行a,b,c=d, python會自動將序列解包,相當於a=1,b=2,c=3。
21、在呼叫函式時,可以在函式的引數列表中利用表示式賦值(順序可以與定義函式時的形參順序不同)
22、在定義函式時,可以在引數列表中定義預設引數,例如def add(x,y=1):……,呼叫時只需要輸入一個引數值即可。注意定義和呼叫時在順序上預設引數必須在非預設引數的後面,呼叫時也可以用關鍵字引數修改預設值。
23、python中也遵循變數作用域的規則,但不存在塊級作用域,因此for迴圈中定義的變數可以直接在迴圈外呼叫。
24、python中全域性變數的作用域是所有模組。
關於類:
25、例項化一個類時不需要用new,如student=Student(),而非student= new Student()。
26、在類中,變數分為例項變數和類變數,方法分為例項方法、類方法和靜態方法。
27、定義類時,定義類中的例項方法無論是否需要傳參,引數列表都必須有self。定義類中的類方法無論是否需要傳參,引數列表都必須有cls,並在方法的上一行加上@classmethod
28、建構函式的模板為def __init__(self):……, 建構函式的呼叫也是自動的,同樣,在定義建構函式時修改引數列表,在建構函式給成員變數賦值,可以在例項化傳入不同的初始值。
29、在定義例項方法時,訪問例項變數用self.變數名,訪問類變數用self.__class__.變數名;在類外,訪問物件的例項變數用物件名.變數名,訪問類變數用類名.變數名。
30、在定義類方法時,訪問類變數用cls.變數名。在類外呼叫類方法時用類名.方法名或者物件名.方法名(建議前者)。
31、定義靜態方法要在上一行加@staticmethod。
32、類中變數名和方法名以雙下劃線__開頭則為私有的,否則為公開的(建構函式除外)。Python中沒有public和private。
33、關於繼承,在定義子類的括號里加入父類的名稱即可繼承。子類的建構函式需要顯式地通過super呼叫父類的建構函式相比較C、Java這種大型語言,Python輕便、靈巧而且入門比較快。
……
……
七、感想及建議
這一學期跟隨著王老師學習了python,收穫頗豐,受益匪淺。王老師的教學水平很高,總是能將複雜晦澀抽象的東西簡單化,讓我對其有更加深入的理解,聽過王老師講的最到的一個詞就是“例如”。此外,王老師平易近人,始終帶著微笑給我們傳授知識,表白、刷屏、爬取美女圖片的程式碼更是“實用性”極強,這讓我十分喜歡上王老師的課,在獲取知識的同時收穫快樂。因為大一上學期的自學python讓我有了一定基礎,在課程前期的學習中比較輕鬆。但隨著學習內容的深入,我開始漸漸有些難以跟上老師教學的步伐了。由於基礎不夠紮實,總是會遇到各種各樣的問題,雖然雲班課中的教學資源非常充足,但過多的視訊學習資源同時讓人生畏,難以提起學習積極性來。在上課時,我總覺得有些知識點還沒弄透就學到了下一章節,對於基礎不好的同學不夠友好。所以希望王老師能夠調整上課節奏速度,對於前幾節較為基礎的課來說可以加快速度,而後來難度較大的課可以放慢節奏,同時佈置一些練習題以鞏固學習成果,使同學們查漏補缺。在這個磕磕絆絆的學習過程中,跟隨著老師的腳步,對python各個方面的內容都進行了一定方面的學習,進行了很多的程式設計實踐,雖然沒有完成很龐大的專案,但是在課程學習的過程中,我掌握了許許多多的知識,收穫非常大,也體會到了python寫指令碼、做專案的快樂。對於我來說,能夠親手實現一些以前從來沒有編寫過的程式確實是滿滿的成就感。最後,希望自己能夠在以後的時間中,繼續學習python,寫出更多實用的程式,在python學習之路上繼續前行,感謝王老師的辛勤付出及一個學期的陪伴。
在Python之前,資料分析主流軟體有Matlab、R、SAS,一些對於科學運算需求不高的公司用Excel也可以完全滿足需求。在這一學期課程中,我在學習python的同時也在瞭解大資料分析、人工智慧、神經網路等當下熱門的內容,學習MATLAB和qt應用程式開發框架,我對機器學習有很大的興趣,希望以後能在學習機器學習的同時對Python的造詣更深一步。在我看來Python語言的特點就是簡單易上手,在寫Python的過程中,感覺就像在寫一篇英語作文。只要懂一些class、def的含義,很多程式碼很容易看懂,而且也很容易寫的出來,相比較C或者Java這種重型語言,Python的簡單性是具有很大的優勢的。雖然Python很簡單,但是從身邊朋友的學習Python路徑來看,對於很多專業名詞很是頭疼,而且很多程式設計書對於讀者並不友好。在一開始的時候我也飽受專業語言的困擾,感覺就像在讀天書,看啥看不懂,寫啥都報錯。因此,對於入門的同學來說,只有一個建議:練!實踐出真知,而且通過自己的程式設計,在不斷調bug的過程中,其實也是自己不斷對概念的理解加強的過程。因為對於本來計算機基礎較差的同學來說,很多名詞是無法解釋清楚的,一個概念會帶來更多的概念解釋,而解釋的太少或者過於具象化反而會束縛未來程式設計的想法。