# 股票預測
###### tags: 機器學習報告、python
組別:第二組
成員:韓鈞博、陳薇如、許哲瑋、唐睿鵬
組長:陳予琇
----
#### 小組分工任務表
|Name |工作內容|
|-----|--------|
|陳薇如|程式修改及整合、製作部分簡報|
|韓鈞博|程式初步撰寫與測試、製作部分簡報|
|陳予琇|debug、簡報文字初步撰寫|
|許哲瑋|debug、股市模型資料蒐集|
|唐睿鵬|股市資料整理|
---
## 資料說明
----
### 題目背景說明
這學期對機器學習有一些基本認識後,我們開始思考有甚麼地方可以運用,剛好我們有同學有在看股票,因此我們想嘗試藉由機器學習來預測某支股票未來的漲跌情形。
----
### 模型資料來源
透過台灣證券交易所查詢2330台積電的股價資訊,獲得日期、成交股數、成交金額、開盤價、最高價、最低價、收盤價、漲跌價差、成交筆數等資訊,再利用Yahoo財經網站查詢該股的歷史價格,我們這組選擇區間為5年內的歷史股價資訊,認為時間足夠長遠資料夠多且不會過久導致失真。
----
### 初步分析觀察
我們觀察股票資料,發現我們要簡化模型所以只要收盤價,所以我們蒐集了五年的收盤價。
----
### 資料視覺化
觀察股王台積電五年的股價圖,以此做為訓練模型

----
### 資料前處理
用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(前一筆的)
輸出層:為輸出結果

----
```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

----
5/27
當日股價:530.0
預測5/30股價:516.58841014

----
5/30
當日股價:547.0
預測5/31股價:526.1604555

----
5/31
當日股價:560.0
預測6/01股價:543.97654295

----
6/01
當日股價:549.0
預測6/02股價:559.07982647
6/02當日股價:540.0

----
### 改善方向
----
<!-- .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

{"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":"組別:第二組成員:韓鈞博、陳薇如、許哲瑋、唐睿鵬組長:陳予琇"}