# 不想一天一天複製證交所？用 twstock 一行讀回台股日資料

- 網址：https://blog.valenvan.uk/posts/mlouielu-twstock.html
- 發布日期：2026-11-04
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：mlouielu/twstock（https://github.com/mlouielu/twstock），MIT 授權
- 測試版本：twstock 1.5.1
- 實測影片：https://www.youtube.com/watch?v=Q5fDRwWrIMA
- 分類：金融工具區（https://blog.valenvan.uk/finance.html）

> 📌 數據僅限本工具現階段參考用。本文只示範工具怎麼安裝、設定、執行，不是投資建議，也不推薦任何股票。

## 重點摘要

- 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，安裝時會一併裝好。

```bash
pip install twstock
```

我是從原始碼安裝的版本（1.5.1）：

```bash
git clone https://github.com/mlouielu/twstock
cd twstock
pip install -e .
```

從原始碼安裝（含依賴）約 5.3 秒。授權為 MIT。

## 設定

不需要金鑰，也不用登入任何帳號。資料來源是證交所與櫃買中心的公開日成交資料。本文示範資料就是證交所公開資料，資料日期為 2026 年 11 月 3 日（最近一個完整交易日）。示範用的 2330、6223 只是輸入範例。

第一次使用若遇到找不到代號，可以更新代號表：

```bash
twstock -U
```

證交所對請求頻率有限制（README 提醒每 5 秒最多 3 次），連續抓很多檔時請自行放慢。

## 跑起來

指定代號、讀回資料、算五日均價與乖離值：

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

![指定 2330 讀回 31 列的輸出](https://blog.valenvan.uk/img/mlouielu-twstock-article_1.png)

要更長的區間，用 `s.fetch_from(2026, 9)` 從指定年月抓到現在。我另外直接呼叫證交所 STOCK_DAY 介面取得同一段（9、10、11 月）資料，逐筆比對：

| 項目 | twstock | 證交所直接取得 |
|---|---|---|
| 筆數 | 41 | 41 |
| 開盤價 | 41 筆相符 | 基準 |
| 收盤價 | 41 筆相符 | 基準 |
| 成交量 | 41 筆相符 | 基準 |

![與證交所逐筆比對的輸出](https://blog.valenvan.uk/img/mlouielu-twstock-article_2.png)

命令列也能用，一次列出多檔最近五天的最高、最低與收盤（6223 為櫃買）：

```bash
twstock -s 2330 6223
```

以上數字僅作為本工具現階段的輸出參考。

## 常見問題

- **代號打錯怎麼辦？** `Stock('9999')` 會丟出 `StockIDNotFoundError`，訊息提示先用 `twstock -U` 更新代號表；代號確實不存在就只是打錯。
- **回來的列數為什麼是 31，不是整個月？** 預設只抓最近的一段日資料；要更長區間用 `fetch_from(年, 月)`。
- **抓太快被擋？** README 提醒證交所每 5 秒最多 3 個請求，多檔連續抓時請在中間加等待。這點我沒有刻意測到被擋，只在比對時每月之間等了 2 秒。
- **哪些我沒測？** 分鐘線、財報、即時報價；twstock 自帶的其他分析函式本文也沒有涵蓋。

## 結論與連結

適合：想自己用 Python 拉證交所日資料、不想手動複製的人。不適合：需要即時報價或財報的人。

專案：https://github.com/mlouielu/twstock（MIT）
