懶惰之最|GitHub 實測

收盤後整理報告:用 FinanceToolkit 補齊通道欄位,再接成圖表

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

重點摘要

  • 收盤後整理報告,可把公開價格表交給 FinanceToolkit 計算,再用 Matplotlib 將四欄表繪圖。
  • 本次將35筆證交所公開收盤資料轉成35列、4欄的布林通道輸出。
  • 三條通道各有16筆非空值,與獨立pandas計算在四位小數精度內一致。
  • 圖表由Matplotlib另行產生;本次API資料僅回傳至2026-10-22,不能宣稱是今天資料。
  • 結論: 實測可把自備收盤表轉為布林通道CSV,再另接繪圖。
  • 適合: 願意使用Python整理公開資料報表的人
  • 不適合: 期待下載後就能按按鈕看圖的人
實測項目 結果
輸入 35筆證交所公開收盤資料
資料日期 2026-09-01至2026-10-22
查詢日 2026-10-27
參數 20筆窗口、2倍母體標準差
輸出 35列4欄;通道各16筆非空值
繪圖 Matplotlib依輸出CSV另行繪製

收盤後整理報告,從證交所下載的表格只有日期和價格,報告需要的三條通道線卻還沒準備好。FinanceToolkit 可以負責計算,但能不能直接吐出一張圖?這次把取資料、計算與繪圖接起來,確認每一步實際產生什麼,讓想整理自己報表的人知道要準備哪些東西。它是 Python 工具,並不是開啟後就能按選單操作的看盤網站。

下載

原始碼來自 JerBouma/FinanceToolkit,受測版號 2.3.0,提交為 10ead1aa4949d5b30780b12f93442a54380b6697。專案要求 Python 3.11 以上、低於 3.16;本次使用 Python 3.12.14。測試設備是 Mac mini M4 Pro(12 核、64GB)。建議先在專用 Python 虛擬環境操作。

git clone https://github.com/JerBouma/FinanceToolkit.git
cd FinanceToolkit
git checkout 10ead1aa4949d5b30780b12f93442a54380b6697
python -m venv .venv
. .venv/bin/activate
python -m pip install . matplotlib

設定

本文示範資料是證交所公開資料。查詢日為 2026-10-27,使用個股日成交資訊的 2026 年 9 月與 10 月資料,2330 只作示範輸入。兩個月合計 35 筆,資料日期為 2026-09-01 至 2026-10-22。證交所最新全市場快照也回傳 10 月 22 日;另查 10 月 23 日,回覆沒有符合條件的資料。因此這裡只能確認 API 回傳到哪一天,無法確認最新交易日資料完整性,不能把這份表當成今天資料。

這次直接把自己的表格交給 Technicals 計算,沒有使用專案 README 裡的金融資料商金鑰。把以下內容存成 fetch_demo.py;執行時會留下原始 JSON,方便核對日期與欄位。

import json
from pathlib import Path
import requests
for month in ['20260901', '20261001']:
    response = requests.get('https://www.twse.com.tw/exchangeReport/STOCK_DAY',
        params={'response':'json','date':month,'stockNo':'2330'}, timeout=30)
    response.raise_for_status()
    data=response.json()
    if data.get('stat') != 'OK':
        raise RuntimeError(data.get('stat'))
    Path('twse-'+month+'.json').write_text(json.dumps(data,ensure_ascii=False),encoding='utf-8')
    print(month,len(data['data']),data['data'][-1][0])

跑起來

再將下面程式存成 calculate.py。它把民國日期轉為西元日期,移除價格裡的逗號,並明確指定使用未還原的收盤欄位 Close。window=20 表示累積二十筆觀測,不是二十個日曆天;num_std_dev=2 是本次輸入參數,沒有解讀價格方向。輸出保留日期,方便接回原本報表。

import json,time
from pathlib import Path
import pandas as pd
from financetoolkit.technicals.technicals_controller import Technicals
rows=[]
for month in ['20260901','20261001']:
 d=json.loads(Path('twse-'+month+'.json').read_text())
 for r in d['data']:
  y,m,day=r[0].split('/')
  rows.append({'Date':f'{int(y)+1911}-{m}-{day}','Close':float(r[6].replace(',',''))})
df=pd.DataFrame(rows).set_index('Date').sort_index()
df.index=pd.PeriodIndex(df.index,freq='D')
df.to_csv('input.csv')
history=pd.concat({'Close':df.rename(columns={'Close':'2330'})},axis=1)
t=time.perf_counter()
technicals=Technicals(['2330'],{'daily':history})
bands=technicals.get_bollinger_bands(close_column='Close',window=20,num_std_dev=2)
bands.to_csv('bands.csv')
print('FinanceToolkit 2.3.0 | 20 observations | 2 standard deviations')
print('Input rows:',len(df),'| dates:',str(df.index.min()),'to',str(df.index.max()))
print('Columns:',list(bands.columns))
print('Output:',bands.shape)
print(bands.tail(2).to_string())
print('CSV saved: input.csv, bands.csv')
python fetch_demo.py
python calculate.py
實測項目 這次結果
輸入收盤資料 35 筆
輸出表格 35 列、4 欄
欄位 收盤價、下緣、中線、上緣
三條通道有值的列數 各 16 列

輸出四欄表的實際錄影畫面

表格已經有了,但圖不是 FinanceToolkit 自動附上的介面。下面存成 plot_demo.py,讓 Matplotlib 讀取真正輸出的 CSV,另存 plot.png。影片裡另有為閱讀重繪的圖,同樣取自這份輸出,並非原生看盤畫面。

import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
bands=pd.read_csv('bands.csv',header=[0,1],index_col=0).dropna(how='all')
bands.index=pd.to_datetime(bands.index)
plt.style.use('dark_background')
ax=bands.droplevel(1,axis=1).plot(figsize=(9,6),color=['#eff5f8','#4edfc5','#64a9ff','#ffd077'],linewidth=2)
ax.set_title('FinanceToolkit output | TWSE 2330 demo')
ax.set_xlabel('Source dates: 2026-09-01 to 2026-10-22')
plt.tight_layout();plt.savefig('plot.png',dpi=160)
print('Created plot.png from bands.csv | matplotlib chart, not native interface')
python plot_demo.py

Matplotlib 依實測 CSV 畫出的圖,非工具原生介面

常見問題

為什麼前面是空白? 二十筆窗口還沒湊滿,本次前 19 筆通道欄位空白,後面才各有 16 筆。這次另外用 pandas 的平均與母體標準差核對,三條通道均在四位小數精度內一致。本次也以 Python 標準函式庫獨立逐列核對 48 個通道值,最大絕對差約 0.000048,符合 CSV 四位小數精度。

為什麼我得到不同圖? 請先對照資料日期、使用收盤或還原收盤欄位、窗口與標準差參數。本次明確使用 Close,不讓工具套用預設的 Adj Close;專案方法的窗口預設是 14,本次明確改為 20。這些輸入不同,圖自然不同。

適合誰? 已有資料整理流程、願意照教學執行 Python,想把計算接進自己報表的人。不適合期待下載後立刻按按鈕看圖的人。這次只測自備公開資料的布林通道計算與繪圖,其他資料來源、財報與完整功能沒有驗證。

專案:FinanceToolkit。授權:MIT。資料來源:證交所個股日成交資訊與證交所 OpenAPI。

測試設備:Mac mini M4 Pro(12 核、64GB)。內容依實際執行結果撰寫,數據為撰寫當時的實測值。

← 金融工具區|所有實測