# 整理台股收盤表不想重寫公式？TA-Lib 安裝、計算與空白欄位實測

- 網址：https://blog.valenvan.uk/posts/ta-lib-ta-lib-python.html
- 發布日期：2026-10-27
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：TA-Lib/ta-lib-python（https://github.com/TA-Lib/ta-lib-python），BSD-2-Clause 授權
- 測試版本：TA-Lib 0.8.2 / Python 3.12.14 / NumPy 2.5.4
- 實測影片：https://www.youtube.com/shorts/mIYCh1ubeP4
- 分類：金融工具區（https://blog.valenvan.uk/finance.html）

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

## 重點摘要

- 本次 TA-Lib 0.8.2 安裝含相依套件與版本檢查約 5.8 秒。
- 本次使用證交所 2026/09/01 至 2026/10/22 的 35 筆公開收盤資料。
- 本次成功匯出 35 列資料、5 欄的 CSV，包含 SMA5、SMA10 與 RSI14。
- 本次 SMA5、SMA10 與 RSI14 開頭分別保留 4、9、14 格空白。
- **結論：** 本次完成公開資料轉指標CSV，未測試畫圖。
- **適合：** 已經用 Python 整理報表、需要指標欄位的人
- **不適合：** 想直接開啟現成看盤網站、不打算操作 Python 的人

| 實測項目 | 結果 |
|---|---|
| 安裝指令 | 約5.8秒 |
| 輸入 | 35筆證交所收盤資料 |
| 輸出 | 35列資料、5欄CSV |
| 資料日期 | 2026/09/01–2026/10/22 |

每次下載收盤資料，還要另外補平均公式，換一份報表又做一次。這次測的是把這段計算交給 TA-Lib：先準備公開資料，讓它回傳數列，再存成自己熟悉的表格。它是 Python 套件，本文不是點兩下就能操作的看盤網站教學。

## 下載

從專案的官方 GitHub README 找到 PyPI 安裝方式。本次受測版本為 TA-Lib 0.8.2，使用 Python 3.12.14、NumPy 2.5.4；讀者可先用相同 Python 版本重現。測試設備為 Mac mini M4 Pro（12 核、64GB）。建立乾淨的 Python 環境後，安裝預先編譯的套件，避免混入舊套件。

```bash
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --only-binary=:all: TA-Lib==0.8.2 numpy==2.5.4 requests==2.34.2
```

本次從建立環境到安裝、列出版本，整個指令約 5.8 秒。這包含下載相依套件，不是所有電腦都會得到同樣時間；網路與快取狀況也會影響結果。實測有取得二進位套件，沒有另外編譯 C 函式庫。

## 設定

本文示範資料是**證交所公開資料**，不是券商帳號資料，也不需要付費金鑰。股票代號 2330 只是示範輸入。資料範圍為 2026/09/01 至 2026/10/22，共 35 筆日收盤資料；本次查詢時間是 2026/10/27 凌晨。證交所個股月資料與 OpenAPI 全市場日資料回傳的最新日期皆為 10/22，重跑前務必核對日期。

以下保留實測時的月份，方便重現；日後操作請自己調整日期。沒有額外設定檔，代號與月份放在網址參數中。

```bash
curl -fLsS --max-time 40 'https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20260901&stockNo=2330' -o sep.json
curl -fLsS --max-time 40 'https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20261001&stockNo=2330' -o oct.json
```

先確認兩份 JSON 的 stat 都是 OK，日期欄位是民國年。程式只讀取收盤價欄，移除千分位逗號，再轉成浮點數；沒有把假日補成交易日，也沒有自行調整股價。

![證交所公開資料的日期與示範收盤欄](https://blog.valenvan.uk/img/ta-lib-ta-lib-python-article_1.png)

## 跑起來

把下面內容存成 calculate.py，與兩份 JSON 放在同一個資料夾。它依日期排序、移除重複日期，計算五日平均、十日平均及十四期 RSI，最後把尚無數值的欄位寫成空白。

```python
import json,csv,time
from pathlib import Path
import numpy as np
import talib
rows=[]
for name in ('sep.json','oct.json'):
 d=json.load(open(name));assert d['stat']=='OK'
 rows+=d['data']
rows=sorted({r[0]:r for r in rows}.values(),key=lambda r:r[0])
values=np.array([float(r[6].replace(',','')) for r in rows],dtype=float)
t0=time.perf_counter()
ma5=talib.SMA(values,timeperiod=5)
ma10=talib.SMA(values,timeperiod=10)
rsi=talib.RSI(values,timeperiod=14)
ms=(time.perf_counter()-t0)*1000
with open('indicators.csv','w') as f:
 w=csv.writer(f);w.writerow(['Date','Close','SMA5','SMA10','RSI14'])
 for r,c,a,b,z in zip(rows,values,ma5,ma10,rsi):
  w.writerow([r[0],c]+['' if np.isnan(x) else round(float(x),2) for x in (a,b,z)])
print('TA-Lib',talib.__version__)
print('INPUT',len(rows),'daily closes; latest',rows[-1][0])
print('SMA5 leading blanks',int(np.isnan(ma5).sum()))
print('SMA10 leading blanks',int(np.isnan(ma10).sum()))
print('RSI14 leading blanks',int(np.isnan(rsi).sum()))
print('OUTPUT indicators.csv',len(rows),'rows, 5 columns')
print('Calculation milliseconds',round(ms,3))
print(Path('indicators.csv').read_text())
```

```bash
python calculate.py
head -6 indicators.csv
tail -3 indicators.csv
```

| 實測項目 | 結果 |
| --- | --- |
| 受測套件 | TA-Lib 0.8.2 |
| 輸入 | 35 筆收盤價 |
| 輸出 | 35 列資料、5 欄，另有標題列 |
| SMA5 開頭空白 | 4 格 |
| SMA10 開頭空白 | 9 格 |
| RSI14 開頭空白 | 14 格 |

輸出欄位依序為 Date、Close、SMA5、SMA10、RSI14。這裡只確認工具完成計算及匯出，不替欄位數字下判斷。完整終端機錄影包含表格開頭與最後三列，可以對照日期及空白位置。

![實際匯出的 CSV，開頭暖身區與最後三列](https://blog.valenvan.uk/img/ta-lib-ta-lib-python-article_2.png)

## 常見問題

**前四格空白，是執行失敗嗎？** 這次 SMA5 的前四筆尚未湊足五筆輸入，所以沒有數值；第五筆開始才出現結果。不要直接把空白填成零，本例刻意保留空白，讓後續整理的人看得出資料尚不足。

**安裝時找不到相符套件？** 本次沒有遇到安裝錯誤；本文實測的是 Python 3.12.14 的套件組合。若你的系統找不到二進位套件，先核對 Python 版本及系統架構，不要把本次成功當作所有環境都已驗證。

**影片裡的圖，是 TA-Lib 自帶的介面嗎？** 不是。TA-Lib 本例完成的是 CSV 計算流程；影片金融版的收盤價、五日與十日平均線，是把這份實際 CSV 重繪成圖方便說明，不是套件提供的看盤網站。適合已經會執行 Python、想把指標欄位接進報表的人；若只想直接打開網站看圖，本篇流程並不省事。我的用法會是把這段計算接到既有資料整理步驟，省去重寫公式。

專案與授權：[TA-Lib Python](https://github.com/TA-Lib/ta-lib-python)，BSD-2-Clause。資料來源：[證交所個股日成交資訊](https://www.twse.com.tw/zh/trading/historical/stock-day.html)、[證交所 OpenAPI](https://openapi.twse.com.tw/)。查詢與實測日期：2026/10/27。
