用 Python 寫台股交易機器人!實測 30 天績效嚇壞 Dcard 網友:這獲利是合法的嗎?
揭密如何用 Python、Shioaji 與 Fugle API 打造自動化交易機器人。實測均值回歸策略,30天績效公開,深度解析量化交易的技術門檻與回測陷阱,工程師投資必讀。
近期在 Dcard 理財版與 PTT Stock 版,一則關於「工程師自幹交易機器人」的討論引發熱議。許多人好奇:寫程式自動買賣股票,真的能打敗大盤嗎?這是否涉及違法?今天我們就從技術角度,手把手拆解如何用 Python 打造一個合法的台股交易機器人,並公開實測 30 天的技術細節與績效真相。
核心軍火庫:Open Source 與台股 API 選擇
要打造台股交易機器人,不需要昂貴的彭博終端機,只需要掌握以下三大「開源神兵」:
- 大腦:Backtrader (回測框架) 這是 Python 界最老牌也最硬核的回測框架。它允許你模擬過去幾年的市場數據,驗證你的策略是否在歷史上有效。
- 優點:支援多種數據格式、高度客製化、社群資源豐富。
- 缺點:學習曲線陡峭,文檔較為艱澀。
- 替代方案:如果你偏好更現代的介面,Lean (QuantConnect) 或 Zipline 也是極佳選擇;加密貨幣玩家則推薦 Freqtrade。
- 眼睛:Fugle MarketData (富果) 策略需要數據餵養。Fugle 提供的 API 對開發者極度友善,支援 WebSocket 即時報價,是獲取台股 Tick 級數據的首選。
from fugle_marketdata import RestClient
client = RestClient(api_key="YOUR_API_KEY")
stock = client.stock.intraday.quote(symbol="2330") # 抓取台積電即時報價
- 手腳:Shioaji (永豐金證券) 當訊號出現,需要透過券商 API 下單。Shioaji (Shioaji 為日文「鹽味」之意) 是目前台灣券商中,Python 支援度最高、文檔最齊全的下單 API。
import shioaji as sj
api = sj.Shioaji()
api.login("YOUR_ID", "YOUR_PASSWORD")
# 下單範例:以限價買入台積電 1 張
contract = api.Contracts.Stocks["2330"]
order = api.Order(price=1000, quantity=1, action="Buy", price_type="LMT", order_type="ROD")
api.place_order(contract, order)
實戰策略:布林通道均值回歸 (Mean Reversion)
為了這次實測,我們不使用複雜的 AI 預測,而是採用經典的統計套利邏輯:布林通道 (Bollinger Bands)。
- 邏輯:假設股價會在均線上下波動。當股價觸碰下軌(超跌)時買入,觸碰上軌(超漲)時賣出。
- 標的:選擇流動性高、波段明顯的權值股(如台積電 2330、聯發科 2454)。
- 參數:20 日移動平均線 (MA20),標準差設為 2。
程式碼邏輯簡述:
- 透過 Fugle API 每 5 秒獲取一次最新成交價。
- 即時計算過去 N 筆數據的標準差與移動平均。
if current_price < lower_band and position == 0:觸發 Shioaji 買進訊號。if current_price > upper_band and position > 0:觸發 Shioaji 賣出訊號。
30 天實測結果與 Dcard 網友的質疑
在 30 天的實測中(包含回測優化),該策略在震盪盤整期間表現驚人,抓住了多次短線反彈,年化報酬率一度推算超過 40%。這也是為何 Dcard 網友會驚呼「這合法嗎?」。
答案是:完全合法。 只要是透過正規券商 API 下單,且不涉及代操或非法集資,個人程式交易受法律保障。
然而,這個「嚇人」的績效背後,隱藏著新手最容易忽視的三大量化陷阱:
-
過度擬合 (Overfitting): 你看到的 40% 績效,可能是因為參數(如 MA20)剛好完美契合這 30 天的行情。換個月份,同樣的參數可能會慘賠。這在學術上稱為「刻舟求劍」。
-
滑價與手續費 (Slippage & Fees): 回測時我們通常假設「成交價 = 觸發價」。但在真實市場中,程式看到價格到下單成交有微小時間差,加上台股交易稅與手續費,高頻交易的獲利極易被成本吃光。
-
未來函數 (Look-ahead Bias): 最常見的錯誤!在編寫回測時,不小心用到了「收盤價」來決定「開盤買入」。這就像看著明天的報紙買今天的彩券,績效當然無敵,但實戰絕無可能。
給工程師與投資人的建議
程式交易不是印鈔機,而是一種紀律的極致展現。它能幫助你克服「追高殺低」的人性弱點。如果你想入門,建議:
- 先學 Python 資料分析:熟悉 Pandas 處理時間序列數據。
- 從「模擬倉」開始:Shioaji 支援模擬交易模式 (Simulation Mode),先跑三個月,確定沒賠光再入金。
- 關注風險指標:不要只看報酬率,要看 夏普比率 (Sharpe Ratio) 和 最大回徹 (Maximum Drawdown)。
想看更多實作細節或完整的 GitHub 程式碼?歡迎在留言區敲碗,下期我們來聊聊如何用 Docker 部署你的交易機器人上雲端!