想自己用 Python 算 KD、MACD?stockstats 實測:欄位名稱一取就有
📌 數據僅限本工具現階段參考用。本文只示範工具怎麼安裝、設定、執行,不是投資建議,也不推薦任何股票。
重點摘要
- stockstats 0.6.10 在全新虛擬環境連同建環境用 pip 安裝約 8 秒。
- 讀入證交所 2330 九至十一月共 43 天(最後一天 2026-11-05),用欄位名稱直接取得 5 日均線、KD、MACD。
- 5 日均線與 pandas 的 rolling 平均 39 筆全部相符;KD(9)的 K 值與手寫公式 43 筆最大差異 0.0000。
- 20 日均線前幾天不足 20 天也會給數字;打錯欄位名稱只跳出 UserWarning。
- 結論: 想快速算常見指標的人,用欄位名稱一取就有,但前幾天的數字不是完整窗口。
- 適合: 想用 Python 算均線、KD、MACD 又不想從頭寫公式的人
- 不適合: 需要即時報價、分鐘線或大量資料效能數據的人(本次未測)
| 實測項目 | 結果 |
|---|---|
| 安裝時間 | 約 8 秒 |
| 讀入天數(2330,9/1~11/5) | 43 |
| 5 日均線與 pandas 比對 | 39 筆相符 |
| KD 的 K 值與手寫公式 | 43 筆相符、最大差異 0.0000 |
| 打錯欄位名稱 | UserWarning |
看盤軟體上有 KD、MACD、均線,想自己用 Python 算一遍,卻發現每個指標的公式都要寫一大串,還要處理前幾天資料不夠的問題。有沒有一個套件,讓你直接用欄位名稱就拿到指標?算出來的數字,跟自己照公式算的又一不一樣?這篇用 stockstats 實際跑一遍。測試設備:Mac mini M4 Pro(12 核、64GB)。本文示範資料是證交所公開資料(2330 九月到十一月),資料日期到 2026-11-05(最近一個交易日)。
下載
stockstats 是開源的 Python 套件(BSD 授權),建在 pandas 上。我測的是 0.6.10,用 Python 3.12,在全新的虛擬環境裡連同建立環境一起安裝約 8 秒(pandas 3.1.1、numpy 2.5.4)。
python3 -m venv v && v/bin/pip install stockstats
設定
套件本身不抓資料,要自己準備一份有 open、high、low、close、volume 欄位的日資料。我照讀者自己也拿得到的方式,向證交所公開的日成交資訊(STOCK_DAY)取得 2330 九、十、十一月三個月,共 43 天,存成 2330.csv。證交所的日期是民國年,要先換成西元;數字帶千分位逗號,要先去掉。示範代號 2330 只是輸入示範。
curl -s "https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20261101&stockNo=2330"
跑起來
用 wrap 把 pandas 資料表包起來,之後直接用欄位名稱取指標:
import pandas as pd
from stockstats import wrap
df = wrap(pd.read_csv('2330.csv', index_col='date'))
cols = ['close', 'close_5_sma', 'kdjk', 'kdjd', 'macd', 'macds']
df[cols]
print(df[cols].tail(5).round(2).to_string())

欄位名稱就是指標名稱加參數,例如 close_5_sma 是收盤價的 5 日均線,kdjk、kdjd 是 KD 的 K 與 D,macd、macds 是 MACD 與訊號線。實測讀入 43 天,最後一天是 2026-11-05。
算出來的數字對不對?
我另外自己寫了一遍來比對:5 日均線用 pandas 的 rolling(5).mean();KD 用常見的算法(9 日的最高最低算出 RSV,K 與 D 各以 2/3 加 1/3 平滑,起始值 50)。
| 項目 | 結果 |
|---|---|
| 5 日均線,stockstats 與 pandas | 39 筆全部相符(前 4 天不足 5 天,無值) |
| KD(9)的 K 值,與手寫公式 | 43 筆全部在 0.01 內,最大差異 0.0000 |
| 最後一天 K 值 | stockstats 11.08、手寫 11.08 |

這次只驗了 5 日均線與 KD 的 K 值;MACD 與其他指標我沒有逐筆驗證,使用前建議照同樣方式抽查。
常見問題
- 前幾天資料不夠會怎樣? 5 日均線前 4 天沒有值,但 20 日均線(
close_20_sma)第一天就給了數字:前三天分別是 2440.0、2412.5、2405.0,其實是用目前有的天數去平均,不是完整的 20 天。判讀前幾列時要留意。 - 欄位名稱打錯會怎樣? 我試了
not_a_thing,會跳出 UserWarning:Invalid number of return arguments after parsing column name。 - 窗口可以改嗎? 可以,用
set_dft_window('kdjk', 5)把 KD 的天數改成 5,最後一列 K 值從 11.08 變成 14.67。 - 我沒測的部分: 其他指標、分鐘線、大量資料,這次都沒有測,不在上面的結論內。
結論
想快速算常見指標、又不想自己從頭寫公式,stockstats 用欄位名稱就能取:安裝約 8 秒,5 日均線與 KD 的 K 值跟自己照公式算的逐筆一致。要留意的是前幾天不足窗口時的數字不是完整窗口,打錯欄名只會跳警告。
- 專案:https://github.com/jealous/stockstats
- 授權:BSD