不想一天一天複製證交所?用 twstock 一行讀回台股日資料
📌 數據僅限本工具現階段參考用。本文只示範工具怎麼安裝、設定、執行,不是投資建議,也不推薦任何股票。
重點摘要
- twstock 從原始碼安裝(含 lxml、requests)約 5.3 秒,Python 3.12.14 上跑得起來。
- 指定 2330 讀回 31 個交易日,最後一天是 2026-11-03,含開高低收、成交量與成交筆數。
- 另外直接向證交所取得 2330 九至十一月共 41 筆,與 twstock 的開盤、收盤、成交量逐筆比對,41 筆全部相符。
- 櫃買代號 6223 也能讀,twstock -s 2330 6223 一行同時列出兩檔最近五天的最高、最低與收盤。
- 結論: 想自己拉證交所日資料的人,這是省事的起點;數字僅供本工具現階段參考。
- 適合: 想用 Python 取得台股日資料、不想手動複製貼上的人
- 不適合: 需要即時報價、分鐘線或財報的人
| 實測項目 | 結果 |
|---|---|
| 安裝時間 | 約 5.3 秒 |
| 2330 預設讀回列數 | 31 列(最後一天 2026-11-03) |
| 九至十一月逐筆比對 | 41 筆,開盤/收盤/成交量全部相符 |
| 代號打錯 | StockIDNotFoundError |
想看台積電最近一個月的收盤價,最直接的做法是打開證交所網頁,一個月一個月切換,再把數字複製貼到試算表。查一檔還好,查兩三檔、每週都要更新,就很容易煩。
twstock 是一個 Python 套件,直接向證交所(上市)與櫃買中心(上櫃)取得日成交資料。我拿它實際跑了一遍:安裝約 5 秒,指定 2330 就讀回 31 個交易日;再另外直接向證交所取同一段資料逐筆比對,九到十一月共 41 筆,開盤、收盤、成交量全部相符。以下是完整步驟。
下載
需要 Python 3(本文用 3.12.14)。套件依賴 lxml 與 requests,安裝時會一併裝好。
pip install twstock
我是從原始碼安裝的版本(1.5.1):
git clone https://github.com/mlouielu/twstock
cd twstock
pip install -e .
從原始碼安裝(含依賴)約 5.3 秒。授權為 MIT。
設定
不需要金鑰,也不用登入任何帳號。資料來源是證交所與櫃買中心的公開日成交資料。本文示範資料就是證交所公開資料,資料日期為 2026 年 11 月 3 日(最近一個完整交易日)。示範用的 2330、6223 只是輸入範例。
第一次使用若遇到找不到代號,可以更新代號表:
twstock -U
證交所對請求頻率有限制(README 提醒每 5 秒最多 3 次),連續抓很多檔時請自行放慢。
跑起來
指定代號、讀回資料、算五日均價與乖離值:
from twstock import Stock
s = Stock('2330')
d = s.data[-1]
print(len(s.data), 'rows, last day', d.date.date())
print('open', d.open, 'high', d.high, 'low', d.low, 'close', d.close)
print('volume', d.capacity, 'trades', d.transaction)
print('5-day MA', s.moving_average(s.price, 5)[-1])
print('bias 5/10', s.ma_bias_ratio(5, 10)[-1])
實際輸出:
31 rows, last day 2026-11-03
open 2300.0 high 2335.0 low 2280.0 close 2295.0
volume 46137336 trades 518606
5-day MA 2367.0
bias 5/10 -19.5

要更長的區間,用 s.fetch_from(2026, 9) 從指定年月抓到現在。我另外直接呼叫證交所 STOCK_DAY 介面取得同一段(9、10、11 月)資料,逐筆比對:
| 項目 | twstock | 證交所直接取得 |
|---|---|---|
| 筆數 | 41 | 41 |
| 開盤價 | 41 筆相符 | 基準 |
| 收盤價 | 41 筆相符 | 基準 |
| 成交量 | 41 筆相符 | 基準 |

命令列也能用,一次列出多檔最近五天的最高、最低與收盤(6223 為櫃買):
twstock -s 2330 6223
以上數字僅作為本工具現階段的輸出參考。
常見問題
- 代號打錯怎麼辦?
Stock('9999')會丟出StockIDNotFoundError,訊息提示先用twstock -U更新代號表;代號確實不存在就只是打錯。 - 回來的列數為什麼是 31,不是整個月? 預設只抓最近的一段日資料;要更長區間用
fetch_from(年, 月)。 - 抓太快被擋? README 提醒證交所每 5 秒最多 3 個請求,多檔連續抓時請在中間加等待。這點我沒有刻意測到被擋,只在比對時每月之間等了 2 秒。
- 哪些我沒測? 分鐘線、財報、即時報價;twstock 自帶的其他分析函式本文也沒有涵蓋。
結論與連結
適合:想自己用 Python 拉證交所日資料、不想手動複製的人。不適合:需要即時報價或財報的人。
專案:https://github.com/mlouielu/twstock(MIT)