# 想自己用 Python 算 KD、MACD？stockstats 實測：欄位名稱一取就有

- 網址：https://blog.valenvan.uk/posts/jealous-stockstats.html
- 發布日期：2026-11-06
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：jealous/stockstats（https://github.com/jealous/stockstats），NOASSERTION 授權
- 測試版本：0.6.10（PyPI）
- 實測影片：https://www.youtube.com/shorts/5cpFpJr0qPg
- 分類：金融工具區（https://blog.valenvan.uk/finance.html）

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

## 重點摘要

- 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）。

```bash
python3 -m venv v && v/bin/pip install stockstats
```

## 設定

套件本身不抓資料，要自己準備一份有 open、high、low、close、volume 欄位的日資料。我照讀者自己也拿得到的方式，向證交所公開的日成交資訊（STOCK_DAY）取得 2330 九、十、十一月三個月，共 43 天，存成 2330.csv。證交所的日期是民國年，要先換成西元；數字帶千分位逗號，要先去掉。示範代號 2330 只是輸入示範。

```bash
curl -s "https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20261101&stockNo=2330"
```

## 跑起來

用 `wrap` 把 pandas 資料表包起來，之後直接用欄位名稱取指標：

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

![讀入 2330 日資料並取指標欄位](https://blog.valenvan.uk/img/jealous-stockstats-article_1.png)

欄位名稱就是指標名稱加參數，例如 `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 |

![自己照公式算一遍](https://blog.valenvan.uk/img/jealous-stockstats-article_2.png)

這次只驗了 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
