群益 API 串接教學:Python 自動下單入門

你有沒有過這種經驗——盯著盤面等進場訊號,結果上個廁所回來就錯過了?或是明明設好停損,手一抖就把單砍在最低點?

如果你已經有一套自己的交易邏輯,想讓電腦幫你執行,那群益 Capital API 就是你的起點。這篇文章會帶你從零開始,用 Python 串接群益 API,完成自動下單的第一步。

什麼是群益 Capital API?

群益 Capital API 是群益期貨提供的程式交易介面,讓你可以透過程式碼直接連線到群益的交易系統。簡單來說,就是把「你用滑鼠點下單」這個動作,變成「程式自動幫你下單」。

它的底層是 COM 元件(SKCOM),支援 C#、VB.NET、Python 等語言(實際支援語言版本以群益官方文件為準)。對大多數自學的交易者來說,Python 是最友善的選擇——語法簡潔、套件豐富,學習曲線比較平。

Capital API 能做的事包括:

誰適合用 API 做交易?

不是每個人都需要用 API,先確認你屬於哪一種:

適合用 API 的人

不太適合用 API 的人

API vs MultiCharts vs 手動下單比較

這三種方式各有優缺點,看看哪個最適合你現在的狀況:

比較項目 Capital API(Python) MultiCharts 手動下單
開發自由度 最高,想做什麼都行 中等,受限於 PowerLanguage
上手難度 高(需要 Python 基礎) 中等(語法較簡單)
回測功能 需自己建(用 pandas、backtrader) 內建,圖形化操作
執行速度 多數情況下足以因應一般程式交易需求(實際受網路與系統負載影響) 快(透過群益串接) 看手速
月租費用 免費 月租費用 免費
適合對象 工程師、量化交易者 想快速上手程式交易的人 一般散戶
多策略管理 容易(自己寫架構) 可以但較麻煩 困難
外接資料庫 方便(MySQL、MongoDB) 有限 不支援

申請 API 使用權限

使用 Capital API 之前,你得先完成幾個步驟:

  1. 開立群益期貨帳戶:這是前提。還沒開戶的話,可以透過線上開戶,大約 2~3 個工作天就能完成。
  2. 簽署 API 使用同意書:登入群益期貨官網,進入「憑證與 API」專區,線上簽署同意書。
  3. 下載 API 元件:在群益官網的「Capital API」專區下載最新版的 SKCOM 安裝檔。目前最新版本是 2.13.58(2026 年 4 月更新),實際版本以群益官方文件為準。
  4. 安裝憑證:開啟群益的憑證管理工具,匯入你的個人憑證。這步很重要,沒有憑證就無法登入 API。

開發環境建置

Capital API 的 COM 元件只支援 Windows,所以你需要一台 Windows 電腦。以下是建議的環境設定:

系統需求

安裝 Python 環境

如果你電腦還沒有 Python,到 python.org 下載安裝,記得勾選「Add Python to PATH」。

接著開啟命令提示字元,安裝必要套件:

pip install comtypes
pip install pandas
pip install numpy

comtypes 是關鍵套件,讓 Python 能跟群益的 COM 元件溝通。pandasnumpy 是處理資料用的,之後做回測也會用到。

安裝 SKCOM 元件

  1. 從群益官網下載 SKCOM 安裝檔(.exe)
  2. 系統管理員身分執行安裝——這點很重要,不然 COM 元件註冊會失敗
  3. 安裝完成後,開啟「元件管理員」確認 SKCOMLib 已經註冊成功

Python 連線基礎:載入元件與登入

環境準備好了,來寫第一支程式。Capital API v2 的正確初始化方式分兩步:先用 GetModule 載入 DLL,再以 型別介面 建立物件(這是官方範例的標準寫法,不可省略):

import comtypes.client
import os

# 步驟 1:載入 SKCOM.dll,讓 Python 認識所有型別
# DLL 放在 py 檔同目錄;或填入完整路徑
dll_path = os.path.join(os.path.dirname(__file__), "SKCOM.dll")
comtypes.client.GetModule(dll_path)

# 步驟 2:匯入自動產生的型別模組
import comtypes.gen.SKCOMLib as sk

# 步驟 3:建立 COM 物件(使用型別介面,官方建議寫法)
m_pSKCenter = comtypes.client.CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
m_pSKReply  = comtypes.client.CreateObject(sk.SKReplyLib,  interface=sk.ISKReplyLib)
m_pSKOrder  = comtypes.client.CreateObject(sk.SKOrderLib,  interface=sk.ISKOrderLib)
m_pSKQuote  = comtypes.client.CreateObject(sk.SKQuoteLib,  interface=sk.ISKQuoteLib)

元件建好後,設定連線環境並登入:

# 設定環境(0=正式, 1=正式SGX, 2=測試, 3=測試SGX)
# 開發階段建議先用測試環境(值 2),確認程式無誤再切換正式
m_pSKCenter.SKCenterLib_SetAuthority(2)

# 登入(帳號為身分證字號)
login_id = os.environ.get("CAPITAL_USER")
login_pw  = os.environ.get("CAPITAL_PASS")

nCode = m_pSKCenter.SKCenterLib_Login(login_id, login_pw)

if nCode == 0:
    print("登入成功")
else:
    msg = m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
    print(f"登入失敗,錯誤碼:{nCode},原因:{msg}")

這段程式做了幾件事:

  1. GetModule 將 DLL 解析成 Python 可呼叫的型別(只需在程式啟動時執行一次)
  2. 介面型別 建立物件,確保事件回呼能正確綁定
  3. SKCenterLib_SetAuthority 選擇正式或測試環境——初期請用測試環境
  4. 登入回傳 0 表示成功,其他數字請呼叫 GetReturnCodeMessage 取得說明

⚠️ 安全提醒:帳號密碼不要直接寫在程式碼裡面。請用環境變數(os.environ)或 .env 檔管理。

接收即時報價

登入成功後,可以開始訂閱即時報價。報價採事件驅動模式:先掛上 callback class,再呼叫訂閱函式,有新成交就會自動觸發。

import pythoncom

# 報價事件 callback(繼承無需特定基底,comtypes 自動綁定)
class SKQuoteLibEvent:
    def OnConnection(self, nKind, nCode):
        if nKind == 3001:  # 連線成功
            print("報價連線成功")
            # 訂閱台指期近月(商品代碼 TXFR1)
            m_pSKQuote.SKQuoteLib_RequestStocks("0", "TXFR1")
        elif nKind == 3002:
            print(f"報價連線中斷,錯誤碼:{nCode}")

    def OnNotifyQuote(self, sMarketNo, nStockIdx):
        # 有報價更新時觸發;用索引取出完整結構
        ts = sk.STOCKINDEX()
        nCode = m_pSKQuote.SKQuoteLib_GetStockByIndex(sMarketNo, nStockIdx, ts)
        if nCode == 0:
            print(f"商品:{ts.bstrStockName}")
            print(f"成交價:{ts.nClose / 100:.0f}")   # 除以 100 還原價格
            print(f"成交量:{ts.nTQty}")

# 掛上事件
skQuoteEvent = SKQuoteLibEvent()
skQuoteEventHandler = comtypes.client.GetEvents(m_pSKQuote, skQuoteEvent)

# 啟動連線(需在 Login 成功後呼叫)
m_pSKQuote.SKQuoteLib_EnterMonitorOSQ(0)

# 持續跑訊息迴圈,讓 COM 事件能被推送
import pythoncom
while True:
    pythoncom.PumpMessages()

幾個重要細節:

委託下單實作

收到訊號後,下一步就是送出委託。注意:FUTUREORDER 的欄位型別要嚴格對應,例如價格是字串bstrPrice),口數才是整數(nQty)。

# 組成期貨委託物件
oOrder = sk.FUTUREORDER()

# 完整帳號格式:IB代號4碼 + 帳號7碼,例如 "6A3412345678"
oOrder.bstrFullAccount = "你的完整帳號"
oOrder.bstrStockNo     = "TXF"       # 台指期(不含月份,由近月自動處理)
oOrder.sBuySell        = 0           # 0=買進, 1=賣出(short 型別)
oOrder.sTradeType      = 0           # 0=ROD, 1=IOC, 2=FOK
oOrder.sDayTrade       = 0           # 0=非當沖, 1=當沖
oOrder.bstrPrice       = "22500"     # 委託價:字串型別!市價填 "0"
oOrder.nQty            = 1           # 委託口數

# 送出同步委託
# 回傳 tuple:(委託書號字串, 錯誤碼整數)
message, nCode = m_pSKOrder.SendFutureOrder(login_id, False, oOrder)

if nCode == 0:
    print(f"委託成功,書號:{message}")
else:
    err = m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
    print(f"委託失敗:{err}")

幾個關鍵參數說明:

欄位名稱 型別 說明 常用值
sBuySell short 買賣方向 0 = 買進、1 = 賣出
sTradeType short 委託種類 0 = ROD、1 = IOC、2 = FOK
sDayTrade short 當沖與否 0 = 非當沖、1 = 當沖
bstrPrice 字串 委託價格(注意是字串) "22500" 為限價;"0" 為市價
nQty int 委託口數 1、2、3…

同步 vs 非同步委託SendFutureOrder 第二個參數 bAsyncOrderFalse 為同步(等委託結果後才繼續執行),True 為非同步(立即返回,結果透過 OnAsyncOrder 事件回報)。策略交易建議用非同步,避免主執行緒被阻塞。

接收委託與成交回報

送出委託之後,透過 SKOrderLib 的事件接收各種狀態回報。官方 SDK 有三種主要回報 callback:

class SKOrderLibEvent:
    def OnAccount(self, bstrLogInID, bstrAccountData):
        """登入後取得帳號清單;完整帳號 = IB代號4碼 + 帳號7碼"""
        values = bstrAccountData.split(',')
        full_account = values[1] + values[3]
        print(f"帳號:{full_account}")

    def OnProxyStatus(self, bstrUserId, nCode):
        """Proxy 連線狀態(下單通道健康度)"""
        msg = m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
        print(f"Proxy 狀態 [{bstrUserId}]: {msg}")

    def OnAsyncOrder(self, nThreadID, nCode, bstrMessage):
        """非同步委託結果(bAsyncOrder=True 時觸發)"""
        if nCode == 0:
            print(f"非同步委託成功,書號:{bstrMessage}")
        else:
            err = m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
            print(f"非同步委託失敗:{err}")

    def OnProxyOrder(self, nStampID, nCode, bstrMessage):
        """Proxy 委託回報"""
        print(f"Proxy 委託 [{nStampID}] 碼:{nCode},訊息:{bstrMessage}")

    def OnOpenInterest(self, bstrData):
        """未平倉部位回報(呼叫 GetOpenInterestGW 後觸發)"""
        print(f"未平倉:{bstrData}")

    def OnFutureRights(self, bstrData):
        """期貨權益數回報(呼叫 GetFutureRights 後觸發)"""
        print(f"權益數:{bstrData}")

# 掛上事件
skOrderEvent = SKOrderLibEvent()
skOrderEventHandler = comtypes.client.GetEvents(m_pSKOrder, skOrderEvent)

常用回報說明:

錯誤處理與常見問題

API 串接最頭痛的就是各種錯誤碼。以下是我遇過最常見的幾個:

錯誤碼 常見原因 解決方法
-1 未登入或連線中斷 重新登入,檢查網路連線
-2 帳號密碼錯誤 確認帳號密碼,注意大小寫
-21 憑證過期或未安裝 重新匯入憑證
-33 API 權限未開通 確認是否已簽署 API 同意書
3021 商品代碼錯誤 檢查商品代碼是否正確
3022 委託數量超過限制 確認帳戶的委託上限設定

以上錯誤碼僅供參考,實際錯誤碼定義以群益官方文件為準,建議搭配 SKCenterLib_GetReturnCodeMessage 取得最新說明。

建議你在程式裡面加上完善的錯誤處理:

def safe_call(func, *args, func_name="API call"):
    """包裝 API 呼叫,統一處理錯誤"""
    try:
        result = func(*args)
        # API 回傳值:0 成功,非 0 為錯誤碼
        nCode = result[1] if isinstance(result, tuple) else result
        if isinstance(nCode, int) and nCode != 0:
            msg = m_pSKCenter.SKCenterLib_GetReturnCodeMessage(nCode)
            print(f"[錯誤] {func_name} 失敗: {nCode} - {msg}")
            return None
        return result
    except Exception as e:
        print(f"[例外] {func_name}: {e}")
        return None

查詢 K 線歷史資料

除了即時報價,Capital API 也能拉取歷史 K 線——做回測驗證策略時非常好用:

class SKQuoteLibEvent:
    def OnKLineData(self, bstrStockNo, nPtr, bstrData):
        """K 線資料回報;bstrData 為 CSV 格式"""
        print(f"[{bstrStockNo}] K 線: {bstrData}")

    def OnHistoryRequestDone(self, bstrStockNo):
        """歷史資料傳輸完畢"""
        print(f"{bstrStockNo} 歷史 K 線下載完成")

skQuoteEvent = SKQuoteLibEvent()
skQuoteEventHandler = comtypes.client.GetEvents(m_pSKQuote, skQuoteEvent)

# 請求台指期近月 1 分鐘 K 線(最近 100 根)
# 第三參數 nType:0=1分鐘, 4=日線, 5=週線, 6=月線
# 第四參數 nOutType:0=舊格式, 1=新格式(建議用 1)
# 第五參數 nTradeSession:0=全盤, 1=AM盤
m_pSKQuote.SKQuoteLib_RequestKLine("TXFR1", 0, 100, 1, 0)

回傳的 bstrData 是逗號分隔字串,可直接用 str.split(',') 解析後存入 DataFrame 進行量化分析。

安全性注意事項

程式交易牽涉到真金白銀,安全這塊一定不能馬虎:

密碼管理

絕對不要把帳號密碼寫死在程式碼裡面。正確做法是用環境變數:

import os

login_id = os.environ.get("CAPITAL_USER")
login_pw = os.environ.get("CAPITAL_PASS")

if not login_id or not login_pw:
    raise ValueError("請設定環境變數 CAPITAL_USER 和 CAPITAL_PASS")

或者用 .env 檔搭配 python-dotenv 套件,記得把 .env 加入 .gitignore

憑證保護

下單防呆機制

在程式裡面一定要設保護機制,避免失控:

# 下單前的安全檢查
MAX_ORDER_QTY = 5        # 單筆最大口數
MAX_DAILY_ORDERS = 50    # 每日最大委託次數
daily_order_count = 0

def pre_order_check(qty, price):
    global daily_order_count

    if qty > MAX_ORDER_QTY:
        print(f"口數 {qty} 超過上限 {MAX_ORDER_QTY}")
        return False

    if daily_order_count >= MAX_DAILY_ORDERS:
        print("已達每日委託上限")
        return False

    if price <= 0:
        print("價格異常")
        return False

    daily_order_count += 1
    return True

常見問題 FAQ

是的,Capital API 完全免費提供給群益期貨客戶使用。你只需要有群益期貨帳戶,並完成 API 權限申請,就可以下載 SDK 開始開發。交易本身還是會產生手續費和交易稅,但 API 本身不收費。

手續費費率是一樣的,不會因為你用 API 下單就比較貴或比較便宜。手續費的高低取決於你跟營業員談的費率,與下單方式無關。想了解優惠費率,歡迎直接 LINE 詢問。

建議至少具備 Python 基礎語法能力,包括變數、函式、迴圈和套件安裝。如果你完全沒有程式基礎,建議先從 MultiCharts 的 PowerLanguage 開始,語法比較簡單,上手更快。等熟悉程式交易的概念後,再轉 API 也不遲。

Capital API 多數情況下足以因應一般程式交易需求,實際速度仍受網路環境與系統負載影響。如果你的策略是以分鐘 K 或 Tick 為單位,Capital API 完全可以勝任,但要做到真正的高頻交易(微秒等級)並不適合。真正的高頻交易需要專線和特殊設備,一般散戶不需要走那條路。

截至 2026 年 4 月,SKCOM 最新版本為 2.13.58,可從群益期貨官網「Capital API」專區免費下載。建議一併下載官方 Python 範例(PythonExample / PythonExampleV2)對照學習,裡面有報價、下單、帳務查詢的完整示範程式。

不行。SKCOM 是 Windows COM 元件,僅支援 Windows 10/11(64 位元)。如果你習慣用 Mac 開發,可以在 VM(如 Parallels 或 VMware)裡跑 Windows,但實務上建議直接使用 Windows 主機,穩定性比較好,也省去 VM 效能損耗的問題。

結論

群益 Capital API 是台灣期貨市場上常見的程式交易介面之一。免費、文件算完整、社群資源也不少。如果你有 Python 基礎,又有一套想自動化的交易策略,花個兩週時間上手 API 是值得的投資。

記住幾個重點:環境建好、模擬先跑、密碼別寫死、下單加防呆。做好這四件事,可以大幅降低初次使用 API 的風險與錯誤機率。

劉安清
劉安清

群益期貨營業員,專精 MultiCharts 程式交易與海外期貨。

📌 想了解更多?歡迎加入我的 LINE 好友,免費諮詢!

LINE 加好友免費諮詢
LINE 諮詢