整理台股收盤表不想重寫公式?TA-Lib 安裝、計算與空白欄位實測
📌 數據僅限本工具現階段參考用。本文只示範工具怎麼安裝、設定、執行,不是投資建議,也不推薦任何股票。
重點摘要
- 本次 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 環境後,安裝預先編譯的套件,避免混入舊套件。
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,重跑前務必核對日期。
以下保留實測時的月份,方便重現;日後操作請自己調整日期。沒有額外設定檔,代號與月份放在網址參數中。
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,日期欄位是民國年。程式只讀取收盤價欄,移除千分位逗號,再轉成浮點數;沒有把假日補成交易日,也沒有自行調整股價。

跑起來
把下面內容存成 calculate.py,與兩份 JSON 放在同一個資料夾。它依日期排序、移除重複日期,計算五日平均、十日平均及十四期 RSI,最後把尚無數值的欄位寫成空白。
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())
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。這裡只確認工具完成計算及匯出,不替欄位數字下判斷。完整終端機錄影包含表格開頭與最後三列,可以對照日期及空白位置。

常見問題
前四格空白,是執行失敗嗎? 這次 SMA5 的前四筆尚未湊足五筆輸入,所以沒有數值;第五筆開始才出現結果。不要直接把空白填成零,本例刻意保留空白,讓後續整理的人看得出資料尚不足。
安裝時找不到相符套件? 本次沒有遇到安裝錯誤;本文實測的是 Python 3.12.14 的套件組合。若你的系統找不到二進位套件,先核對 Python 版本及系統架構,不要把本次成功當作所有環境都已驗證。
影片裡的圖,是 TA-Lib 自帶的介面嗎? 不是。TA-Lib 本例完成的是 CSV 計算流程;影片金融版的收盤價、五日與十日平均線,是把這份實際 CSV 重繪成圖方便說明,不是套件提供的看盤網站。適合已經會執行 Python、想把指標欄位接進報表的人;若只想直接打開網站看圖,本篇流程並不省事。我的用法會是把這段計算接到既有資料整理步驟,省去重寫公式。
專案與授權:TA-Lib Python,BSD-2-Clause。資料來源:證交所個股日成交資訊、證交所 OpenAPI。查詢與實測日期:2026/10/27。