章節目錄

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資料科學技巧