章節目錄
1 : 個股日成交資訊爬蟲
2 : 進行資料處理
3 : 製作第一支自動化爬蟲程式
4 : 計算技術指標
✦ 1 : 個股日成交資訊爬蟲
1-1 安裝爬蟲套件
在進行證交所爬蟲之前,需要安裝幾個常用的爬蟲套件,建議指定版本,方便教學和自行練習可以無縫接軌。
安裝套件版本:
requests==2.27.1
pandas==1.3.5
pandas_ta==0.3.14b
1-2 爬取2330台積電股價
到證交所
➨ 選擇交易資訊
➨ 個股日成交資訊
按右鍵點選檢查
(或直接ctrl+shift+I
) ➨ 選擇Network
➨ 輸入股票代號:2330
➨ 點選查詢
點選STOCK_DAY
➨ 複製URL
並確認Request Method
➨ 複製Payload
參數
import requests
import pandas as pd
url = 'https://www.twse.com.tw/zh/exchangeReport/STOCK_DAY' # Request URL
payload = {
'response': 'json', # 資料型式為json
'date': '20230213', # 查詢時的日期(可自由更改)
'stockNo': '2330' # 查詢的股票代號
}
r = requests.post(url,data=payload) # Request Method為post
r
# 輸出值:
# <Response [200]> # 表示連線成功
col = r.json()['fields'] # 將columns名稱存起來
col
# 輸出值:
# ['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數']
df = pd.DataFrame(r.json()['data'],columns=col) # 使用pd將爬下來的data轉成DataFrame的格式方便使用
df
✦ 2 : 進行資料處理
2-1 將日期改成西元
方便起見建議將爬下來的數據都轉成西元格式,我們先取出日期這行數據並查看它的資料格式
df['日期']
# 輸出值:
0 112/02/01
1 112/02/02
2 112/02/03
3 112/02/06
4 112/02/07
5 112/02/08
6 112/02/09
7 112/02/10
8 112/02/13
Name: 日期, dtype: object
目前日期的dtype為object
(字串),所以需要先轉成數值後將年分+1911再轉成datetime
(時間)的格式
dates = pd.to_datetime([str(int(date[:3])+1911)+'/'+date[4:] for date in df['日期']]) # 使用list+for迴圈的縮寫法
dates
# 輸出值:
DatetimeIndex(['2023-02-01', '2023-02-02', '2023-02-03', '2023-02-06','2023-02-07', '2023-02-08', '2023-02-09', '2023-02-10',
'2023-02-13'],dtype='datetime64[ns]', freq=None)
可以發現dtype已經變成datetime64[ns]
,接下來用dates取代原本的日期
df['日期'] = dates
df
2-2 將數字轉成數值格式
首先查看df內每個columns的資料型式
df.dtypes
# 輸出值:
日期 datetime64[ns]
成交股數 object
成交金額 object
開盤價 object
最高價 object
最低價 object
收盤價 object
漲跌價差 object
成交筆數 object
dtype: object
全部皆為object
(字串),所以需要將除了日期以外的columns都改成float
(數值)
df[df.columns[1:]] = df[df.columns[1:]].applymap(lambda s:pd.to_numeric(s.replace(',','').replace('+','')))
# df[df.columns[1:]]為選取除了日期以外的columns
# replace可將字串中的特殊符號替換掉,這邊將逗號(,)和正號(+)替換成空值
# lambda為簡化版的def函式,冒號左邊為input,冒號右邊可看成return出來的output
df.dtypes
# 輸出值:
日期 datetime64[ns]
成交股數 int64
成交金額 int64
開盤價 float64
最高價 float64
最低價 float64
收盤價 float64
漲跌價差 float64
成交筆數 int64
dtype: object
成功將數字從字串的格式轉成數值的格式囉~~
✦ 3 : 製作第一支自動化爬蟲程式
3-1 寫成def函式
假設想改爬其它股票的價格要再重新執行上面步驟不是很麻煩嗎?所以我們可以將上面的程式碼模組化,未來要爬取資料只需要輸入日期和股票代號就可以一併將日期、數字都轉變成我們需要的格式囉~
def crawl_stock_price(stock_id,date): # 設定2個變數
url = 'https://www.twse.com.tw/zh/exchangeReport/STOCK_DAY'
payload = {
'response': 'json',
'date': str(date),
'stockNo': str(stock_id)
}
r = requests.post(url,data=payload)
col = r.json()['fields']
df = pd.DataFrame(r.json()['data'],columns=col)
df['日期'] = pd.to_datetime([str(int(date[:3])+1911)+'/'+date[4:] for date in df['日期']])
df[df.columns[1:]] = df[df.columns[1:]].applymap(lambda s:pd.to_numeric(s.replace(',','').replace('+','')))
df = df.set_index('日期') # 設定日期為dataframe的index
return df # 記得要加return才能輸出output
3-2 一鍵爬取歷史股價
只需要將stock_id和date丟入def函式就可以成功取得data囉~
stock_id = '2002'
date = '20221201'
price = crawl_stock_price(stock_id,date)
price
✦ 4 : 計算技術指標
4-1 取得RSI指標
這邊跟大家分享一個非常好用的技術指標套件,有非常多種常用的技術指標可供選擇,只要在ta.後面按tab
就可以顯示可用的指標,在括弧裡面按shift+tab
就可以顯示需丟入的參數有哪些
首先計算RSI,input丟入收盤價
、時間參數
import pandas_ta as ta
rsi5 = ta.rsi(price['收盤價'],5)
rsi10 = ta.rsi(price['收盤價'],10)
rsi5,rsi10
4-2 取得KD指標
計算KD值需input最高價
、最低價
、收盤價
ta.kdj(price['最高價'],price['最低價'],price['收盤價'],5)
詳細程式碼可點擊快速爬取證交所個股資訊
建議可以照著寫,學習效果會更棒哦!
結論
本單元示範如何爬取證交所的個股日成交資訊,並將爬下來的數據進行資料清理,將日期轉成時間格式,以及將字串轉成數值,最後分享超好用的技術指標套件!
如果想複習pandas的人可以參考前一篇:
超實用Python數據分析 | 掌握Pandas資料科學技巧