本文目錄
免責聲明:本文為程式教學與研究示範,非投資建議。文中所有績效數字皆為「假設範例」,用於說明計算邏輯,不代表任何真實策略的表現。金融交易具高度風險,可能導致本金虧損,請自行評估並自負盈虧。
你是不是也聽過「寫程式自動下單就能穩定獲利」的說法?量化交易 Python 之所以吸引人,是因為它把交易規則變成可驗證、可重複執行的程式碼。但從「寫出程式」到「穩定執行」,中間有大量工程細節與風險管理要處理。
這篇文章會帶你走過一條完整的學習路徑:建立回測系統、串接券商 API、避開新手最常踩的地雷。如果你正在找 Python 程式交易入門 的正確方式,這篇就是為你寫的。文中所有程式碼都附上版本與環境說明,請務必先在自己的電腦跑通,再考慮接上正式帳號。
為什麼用 Python 做量化交易?
選擇 Python 不是因為它最潮,而是它對新手最友善、生態系最完整。用 Excel 做回測,資料量一大就容易卡住;用 C++ 則光是編譯環境就要花不少時間。Python 從安裝到跑出第一筆回測結果,通常半小時內可以完成。
Python 在量化交易上有三大優勢:
- 套件豐富:
pandas處理資料、numpy做運算、backtrader做回測,多數功能都有成熟套件。 - 社群龐大:遇到錯誤訊息,官方文件與論壇多半能找到解法。
- 串接容易:台灣多家券商(如永豐、元大、群益)都有提供 Python API。
常見的錯誤是以為「會寫 Python」就等於「會做量化交易」。實際上,策略邏輯、風險控制、交易成本估算,往往比寫程式本身更難。
第一步:建立你的第一個回測系統(Backtrader 教學)
不管策略聽起來多厲害,沒有經過回測,它就只是一個未經驗證的假設。回測系統教學 的核心目的,是讓你在真金白銀進場前,先用歷史資料檢驗策略邏輯是否合理。
環境與版本說明
以下範例的測試環境為:
- Python 3.11
backtrader==1.9.78.123pandas==2.2.x
安裝指令:
pip install backtrader pandas
實作步驟:用 Backtrader 測試「黃金交叉」策略
以下是一個完整可執行的最小範例,包含 Cerebro 引擎、資料饋入與執行流程:
import backtrader as bt
class GoldenCross(bt.Strategy):
params = (("fast", 10), ("slow", 30),)
def __init__(self):
self.sma_fast = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.fast
)
self.sma_slow = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.slow
)
self.crossover = bt.indicators.CrossOver(self.sma_fast, self.sma_slow)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
elif self.crossover < 0:
self.close()
if __name__ == "__main__":
cerebro = bt.Cerebro()
cerebro.addstrategy(GoldenCross)
# 以 Yahoo 格式的 CSV 為例,欄位需含 Date, Open, High, Low, Close, Volume
data = bt.feeds.YahooFinanceCSVData(
dataname="2330.TW.csv",
fromdate=None,
todate=None,
)
cerebro.adddata(data)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001425) # 台股手續費 0.1425%
print(f"起始資金: {cerebro.broker.getvalue():.2f}")
cerebro.run()
print(f"期末資金: {cerebro.broker.getvalue():.2f}")
cerebro.plot()
這段程式碼的邏輯是:當 10 日均線向上突破 30 日均線時買進,向下跌破時平倉。請注意,這裡沒有列出任何實際回測績效數字,因為績效高度取決於資料區間、交易成本假設與滑價模型。若你想自己驗證,請用可公開取得的歷史資料自行執行,並把交易成本、滑價一併納入。
常見的錯誤是回測時完全忽略交易成本,導致結果嚴重高估。台股現行規定,買賣手續費為成交金額的 0.1425%(部分券商有折扣),賣出時另課證交稅 0.3%。這些都會直接吃掉策略獲利。
數據對比:Backtrader vs 其他回測工具
| 工具 | 學習曲線 | 功能完整度 | 適合對象 | 價格 |
|---|---|---|---|---|
| Backtrader | 中等 | 高 | 中階以上 | 免費 |
| 券商內建回測 | 低 | 低 | 初學者 | 免費 |
| QuantConnect | 高 | 極高 | 專業交易者 | 有免費方案 |
| TradingView Pine Script | 低 | 中 | 技術分析愛好者 | 付費方案 |
不想寫程式時的替代方案
如果你完全不想碰 Python,只想快速驗證技術指標策略,可以先用 TradingView 的 Pine Script。它的語法比 Python 簡單,內建指標也豐富。
利益揭露:本文部分連結為推廣連結(affiliate link),若你透過連結註冊付費方案,本站可能獲得回饋,這不會影響你的價格,也不影響本文的教學內容。
不過要提醒:TradingView 屬於視覺化策略驗證工具,與「量化交易 Python」的完整自動化流程(資料處理、回測引擎、券商 API 下單)是不同層次的東西。把兩者混為一談,是新手常見的誤解。
第二步:串接券商 API,讓程式自動下單
回測邏輯通過後,下一步才是讓程式實際下單。這部分除錯時間通常最長,因為各家券商的 API 規格、登入流程、憑證啟用方式都不同。
以台灣常見的永豐 Shioaji 為例,官方文件在 Shioaji 官方網站,請務必以官方最新文件為準。
環境與版本說明
- Python 3.11
shioaji(請以官方文件公告的最新版本為準)- 強烈建議先申請模擬帳號,不要一開始就接正式帳號
正確的登入與下單流程
import shioaji as sj
api = sj.Shioaji(simulation=True) # 模擬環境,正式環境請改為 simulation=False
登入:參數為 id 與 password
api.login(
id="你的身分證字號",
password="你的密碼",
)
登入後必須啟用憑證,才能進行正式下單
api.activate_ca(
ca_path="/path/to/your/ca.pfx",
ca_passwd="你的憑證密碼",
person_id="你的身分證字號",
)
取得商品合約
contract = api.Contracts.Stocks["2330"]
限價單:price_type 使用 LMT(限價),並指定價格
order = api.Order(
price=580,
quantity=1,
action=sj.constant.Action.Buy,
price_type=sj.constant.StockPriceType.LMT,
order_type=sj.constant.OrderType.ROD,
order_lot=sj.constant.StockOrderLot.Common,
)
trade = api.place_order(contract=contract, order=order)
print(trade)
api.logout()
幾個關鍵提醒
login的參數名稱是id與password,不是person_id。- 登入後必須呼叫
api.activate_ca(...),否則正式環境無法下單。 price_type的選擇會直接影響成交價:LMT是限價單,成交價不會高於你設定的價格。MKT是市價單,成交價由市場當下供需決定,可能大幅偏離你的預期。LTP是「上次成交價」限價類別,屬於限價單的一種,不是市價單。- 若你想用市價單,需明確選用市價類別,並理解滑價風險。
常見的錯誤是把 LTP 誤當成市價單,或忘記啟用憑證就下單。建議流程是:先跑模擬帳號至少一週,確認下單、改單、刪單、回報都正常,再考慮接正式帳號。
避雷防坑指南 — 量化交易新手最容易踩的 3 個地雷
以下三個地雷是量化交易入門最常見的問題,與其說「我踩過」,不如說「幾乎每個新手都會遇到」。
地雷一:過度最佳化(Overfitting)
為了讓回測曲線好看,不斷微調參數(例如把均線從 10 天改成 12 天、停損從 5% 改成 4.7%),最後的參數只是「擬合歷史雜訊」,對未來毫無預測力。
防範建議:
- 保留 20% 資料做「樣本外測試」(out-of-sample test)
- 可調參數盡量不超過 3 個
- 若回測年化報酬率高得離譜,先懷疑是過度最佳化,而不是策略神效
假設範例:若某策略在樣本內年化報酬 40%、樣本外只剩 3%,這就是典型的過度最佳化訊號。
地雷二:忽略交易成本
假設範例:某高頻當沖策略在「零成本」假設下年化報酬 35%,但若把台股手續費 0.1425%(買賣各一次)與證交稅 0.3%(賣出)計入,假設一年交易 200 次,光是成本就可能吃掉 18% 以上的報酬,實際績效會大幅縮水。
防範建議:
- 回測時務必加入手續費 0.1425%、證交稅 0.3%
- 高頻策略要額外估算滑價成本
- 用「扣成本後」的績效來評估策略是否值得上線
地雷三:情緒干擾導致手動干預
程式該停損時,你因為「覺得它會漲回來」而手動取消訂單,結果虧損擴大。這是自動交易最常見的人為破口。
防範建議:
- 設定嚴格的風控規則,例如單筆虧損超過預設比例就強制停止策略
- 初期用最小單位測試,讓自己習慣「交給程式決定」
- 把「手動干預」的條件寫進 SOP,避免臨時起意
法規遵循與資安提醒
金融交易涉及法規與個資,請注意以下幾點:
- API 憑證與密碼請勿寫死在程式碼中,改用環境變數或金鑰管理工具。
- 不要將憑證上傳到公開的 GitHub repo,這是常見的資安事故。
- 程式交易需遵守主管機關與券商規範,部分策略(如期貨高頻)可能有額外申報要求。
- 券商 API 官方文件請以官方網站為準,例如 Shioaji 官方文件、元大 API 官方網站、群益 API 官方網站。本文不保證任何第三方文件的即時正確性。
常見問題 FAQ
我完全不會 Python,可以學量化交易嗎?
可以,但需要時間。建議先學基礎語法(變數、迴圈、函式、pandas),再進入 backtrader 與 API 串接。若完全不想寫程式,可先用 TradingView 的 Pine Script 做視覺化驗證,但這與完整的 Python 自動化流程仍有落差。
利益揭露:上方連結為推廣連結,若你註冊付費方案,本站可能獲得回饋。
量化交易需要多少本金?
台股最低門檻約 10 萬元(買一張低價股),期貨則約 5 萬元起。建議新手先用模擬帳號或最小單位測試,等策略與流程都穩定後再考慮加碼。本文不建議任何具體加碼金額。
回測績效很好,為什麼實盤卻虧錢?
最常見的原因包括:
1. 回測未考慮市場流動性:策略假設每次都能成交,但實際上可能沒有足夠的買賣單。
2. 未計入交易成本與滑價。
3. 過度最佳化:參數只擬合歷史資料。
4. 人為干預:該停損時手動取消。
建議回測時加入「成交量限制」與成本模型,並保留樣本外測試。
結論:開始你的量化交易旅程
從 量化交易 Python 入門到建立自己的自動交易系統,關鍵在於:先從回測開始,再慢慢串接 API,最後用模擬帳號或最小本金測試。本文定位是「教學流程與避坑指南」,不提供任何實盤績效承諾。
如果你還在猶豫要從哪個工具開始,可以先試試 TradingView 做視覺化驗證,再進到 Python 的完整自動化流程。
利益揭露:上方連結為推廣連結,若你註冊付費方案,本站可能獲得回饋,不影響你的價格。
現在就打開你的 Python 編輯器,先用模擬資料跑通第一個回測吧。 記得:先學會不賠錢,再談賺錢。
本文僅供程式教學與研究,非投資建議。所有績效數字皆為假設範例,不代表真實策略表現。金融交易具高度風險,請自行評估並自負盈虧。