# 股票預測 ###### tags: 機器學習報告、python 組別:第二組 成員:韓鈞博、陳薇如、許哲瑋、唐睿鵬 組長:陳予琇 ---- #### 小組分工任務表 |Name |工作內容| |-----|--------| |陳薇如|程式修改及整合、製作部分簡報| |韓鈞博|程式初步撰寫與測試、製作部分簡報| |陳予琇|debug、簡報文字初步撰寫| |許哲瑋|debug、股市模型資料蒐集| |唐睿鵬|股市資料整理| --- ## 資料說明 ---- ### 題目背景說明 這學期對機器學習有一些基本認識後,我們開始思考有甚麼地方可以運用,剛好我們有同學有在看股票,因此我們想嘗試藉由機器學習來預測某支股票未來的漲跌情形。 ---- ### 模型資料來源 透過台灣證券交易所查詢2330台積電的股價資訊,獲得日期、成交股數、成交金額、開盤價、最高價、最低價、收盤價、漲跌價差、成交筆數等資訊,再利用Yahoo財經網站查詢該股的歷史價格,我們這組選擇區間為5年內的歷史股價資訊,認為時間足夠長遠資料夠多且不會過久導致失真。 ---- ### 初步分析觀察 我們觀察股票資料,發現我們要簡化模型所以只要收盤價,所以我們蒐集了五年的收盤價。 ---- ### 資料視覺化 觀察股王台積電五年的股價圖,以此做為訓練模型 ![](https://i.imgur.com/9t8hceF.png) ---- ### 資料前處理 用pandas作為爬蟲工具,抓取股票網頁 發現股票網址由日期及股票代碼決定,因此以爬蟲代替每天去股價網站蒐集資料 --- ## 模型選用 ---- ### 實作內容說明 ---- **爬蟲** ```python= import datetime loc_dt1=datetime.datetime.today() - datetime.timedelta(days=31) loc_dt = datetime.datetime.today() loc_dt_format = loc_dt.strftime("%Y%m%d") loc_dt_format1 = loc_dt1.strftime("%Y%m%d") ``` ---- ```python= web_this_month="https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=html&date="+loc_dt_format+"&stockNo=2330" web_last_month="https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=html&date="+loc_dt_format1+"&stockNo=2330" stock_table0 = pd.read_html(web_this_month) stock_table1 = pd.read_html(web_last_month) ``` ---- ```python=+ stock_df1= stock_table1[0] #讀取第一個表格 stock_df0 = stock_table0[0] stock_df1.columns = ["日期", "成交股數", "成交金額", "開盤價", "最高價", "最低價","收盤價","漲跌價差","成交筆數"] stock_df0.columns = ["日期", "成交股數", "成交金額", "開盤價", "最高價", "最低價","收盤價","漲跌價差","成交筆數"] rs=pd.concat( [stock_df1,stock_df0],axis=0,ignore_index = True) rs.to_csv('today.csv') ``` ---- <!-- .slide: style="text-align: left;" --> **RNN 循環神經網路(Recurrent Neural Network)** 原因:適合訓練輸入與輸出間有順序關係的模型,股票預測剛好符合 1.特性: 前面的狀態會影響現在的狀態,現在的狀態也會影響未來的狀態 ---- <!-- .slide: style="text-align: left;" --> 2.結構圖介紹: 輸入層:作為輸入的資料 隱藏層:為Ux+Wh(前一筆的) 輸出層:為輸出結果 ![](https://i.imgur.com/xLlzNDN.png =600x) ---- ```python= sequence_length = 10 #特徵資料個數 split = 0.95 #訓練資料比率 pd.options.mode.chained_assignment = None #取消顯示pandas資料重設警告 filename = 'Final_Report.csv' #台積電股市 2017.5.26-2022.5.5 df = pd.read_csv(filename) #以pandas讀取檔案 dfprice=pd.DataFrame(df['收盤價']) data_all = np.array(dfprice).astype(float) #轉為浮點型別矩陣 scaler = MinMaxScaler() data_all = scaler.fit_transform(data_all) #將數據縮放為0~1之間 data = [] for i in range(len(data_all) - sequence_length): data.append(data_all[i: i + sequence_length + 1]) #每筆data資料有11欄 reshaped_data = np.array(data).astype('float64') x = reshaped_data[:, :-1] #第1至第10個欄位為特徵 y = reshaped_data[:, -1] #第11個欄位為Label split_boundary = int(reshaped_data.shape[0] * split) #分離資料 train_x = x[: split_boundary] #訓練特徵資料 test_x = x[split_boundary:] #test特徵資料 train_y = y[: split_boundary] #訓練label資料 test_y = y[split_boundary:] #test的label資料 model = Sequential() model.add(LSTM(input_shape=(sequence_length,1),units=256,unroll=False)) #LSTM層 model.add(Dense(units=1)) #輸出層:1個神經元 model.compile(loss="mse", optimizer="adam", metrics=['accuracy']) model.fit(train_x, train_y, batch_size=100, epochs=300, validation_split=0.1,verbose=2) model.save('Stock_rnn_model.h5') #儲存模型 ``` ---- **預測圖** ```python=+ pd.options.mode.chained_assignment = None #取消顯示pandas資料重設警告 sequence_length = 10 #特徵資料個數 #test df1 = pd.read_csv('today.csv') dfprice1=pd.DataFrame(df1['收盤價']) data_all1 = np.array(dfprice1).astype(float) #轉為浮點型別矩陣 scaler = MinMaxScaler() data_all1 = scaler.fit_transform(data_all1) #將數據縮放為0~1之間 data1 = [] for i in range(len(data_all1) - sequence_length): data1.append(data_all1[i: i + sequence_length + 1]) #每筆data資料有11欄 reshaped_data1 = np.array(data1).astype('float64') x1 = reshaped_data1[:, :-1] # 第1至第10個欄位為特徵 y1 = reshaped_data1[:, -1] # 第11個欄位為label test_x = x1[:] #test特徵資料 test_y = y1[:] #test的label資料 model = load_model('Stock_rnn_model.h5') predict = model.predict(test_x) predict = np.reshape(predict, (predict.size, )) #轉換為1維矩陣 predict = scaler.inverse_transform([[i] for i in predict]) #還原 test_y = scaler.inverse_transform(test_y) #還原 plt.plot(predict, 'b:') #預測 plt.plot(test_y, 'r-') #收盤價 plt.legend(['predict', 'realdata']) plt.show() ``` ---- ### 結果評估 ---- 5/26 預測5/27股價:522.89638177 ![](https://i.imgur.com/La69Giv.jpg =600x) ---- 5/27 當日股價:530.0 預測5/30股價:516.58841014 ![](https://i.imgur.com/YqYHh7W.jpg) ---- 5/30 當日股價:547.0 預測5/31股價:526.1604555 ![](https://i.imgur.com/tPen75M.jpg) ---- 5/31 當日股價:560.0 預測6/01股價:543.97654295 ![](https://i.imgur.com/XlAUlFg.jpg =600x) ---- 6/01 當日股價:549.0 預測6/02股價:559.07982647 6/02當日股價:540.0 ![](https://i.imgur.com/xypB27d.jpg) ---- ### 改善方向 ---- <!-- .slide: style="text-align: left;" --> 希望未來可以自動更新5年趨勢資料 希望可以爬出所有公司股票 希望可以預測未來一個月趨勢 希望可以做出優秀人機介面 希望可以對所有股票做推薦 --- ## 總結 ---- <!-- .slide: style="text-align: left;" --> ### 心得 這次的報告裡我們用了許多這學期課堂中學到的知識,例如機器學習模型的建立以及神經網路的概念等等,而在嘗試製作報告的過程中,雖然有時候仍會因為遇到先前沒碰過的程式碼而有點慌亂外,也有因為股票方面知識的不足而有所疑惑,但慶幸的是,我們仍做出預想中的機器學習訓練模型。 ---- <!-- .slide: style="text-align: left;" --> ### 參考資料來源 <font size=6> 1.《Python自學聖經:從程式素人到開發者的技術與實戰大全》</font> <font size=6> 2.台積電股票資訊: https://hk.finance.yahoo.com/quote/2330.TW/history/</font> <font size=6>3.台灣證券交易所: https://www.twse.com.tw/zh/page/trading/exchange/STOCK_DAY.html</font> <font size=6>4.pandas 資料處理教學: https://www.learncodewithmike.com/2020/11/read-html-table-using-pandas.html</font> --- Thanks for Listening ![](https://i.imgur.com/Eq1WUqG.jpg =400x)
{"metaMigratedAt":"2023-06-17T01:43:02.907Z","metaMigratedFrom":"YAML","title":"股票預測","breaks":true,"disqus":"hackmd","slideOptions":"{\"transition\":\"fade\"}","contributors":"[{\"id\":\"3dadf4fa-fcc7-434c-8b62-d72875a1b313\",\"add\":6734,\"del\":2067},{\"id\":\"6e1f1bc8-73d1-41a2-952e-8d339e9327cb\",\"add\":13,\"del\":2},{\"id\":\"66282d6c-8caf-429d-9d65-9db5cfe732e2\",\"add\":1131,\"del\":254},{\"id\":null,\"add\":20,\"del\":0}]","description":"組別:第二組成員:韓鈞博、陳薇如、許哲瑋、唐睿鵬組長:陳予琇"}
    957 views