前言
在當今的金融世界中,量化金融的模式逐漸成為顯學。高盛的資料顯示:直到 2024 上半年,70% 以上的美股交易皆使用程式執行,可見程式交易的體量之大。反觀台股市場,2024 上半年因為 AI 趨勢興盛,使日均成交量達到 4200 億,不過程式交易的日均成交量卻僅有 28 億,僅占 0.6%。
程式交易真的那麼遙不可及嗎?事實上,台股的程式交易份額以年增 20% 的速度逐年上升,本文也將和大家介紹永豐金證券推出的程式交易 API:Shioaji,其使用原生 Python 環境打造的生態系統使程式碼易於撰寫,也使永豐 API 佔有台股程式交易約一半的份額。本文將帶大家透過 TQuant Lab 超級趨勢策略,結合永豐 API 快速掌握程式交易的秘訣,一同成為台股市場中程式交易的先行者吧!
超級趨勢策略簡介
超級趨勢策略以超級趨勢指標以及 ADX 指標構成。超級趨勢指標擁有上軌和下軌,當股價突破上軌,代表價格突破壓力,即將形成上漲趨勢;反之,當股價跌破下軌,代表價格跌破支撐,即將形成下跌趨勢。另一方面,ADX 指標介於 0~100,數值越大代表趨勢越強,幫助我們確立上漲趨勢與下跌趨勢的形成。
超級趨勢策略的進出場規則如下:
Long Entry:
收盤價突破上軌,代表價格突破壓力,即將形成上漲趨勢,買入該股票。
Short Entry:
收盤價跌破下軌,加上 ADX > 50,代表價格跌破支撐,形成下跌趨勢,將持股賣出。
詳細的策略說明與 TQuant Lab 的回測流程請參考:TQuant Lab 超級趨勢策略,低買高賣賺取波段價差
利用 TQuant Lab 取得每日買賣標的
編輯環境與模組需求
本文使用 Windows 11 並以 Jupyter Lab 作為編輯器。
import os import numpy as np import pandas as pd # tej_key tej_key = 'your key' api_base = 'https://api.tej.com.tw' os.environ['TEJAPI_KEY'] = tej_key os.environ['TEJAPI_BASE'] = api_base
取得股票池
根據超級趨勢指標的特性,我們希望選取具有成長性且容易形成趨勢的股票。股票池篩選流程如下:
- 使用 get_calendar 函式取得前一個交易日的日期
- 使用 get_universe 函式取得前一交易日的上市電子工業股票清單
- 使用 TEJ Tool API 篩選市值前 100 名的股票
p.s. 由於不一定每天都有標的符合超級趨勢策略的買進或賣出規則,因此本文挑選上市電子工業市值前 100 名的股票而非 TQuant Lab 超級趨勢策略中的前 10 名,使這 100 檔股票在撰文當日有標的符合交易規則,方便後續展示永豐 API 的下單功能。使用者可依自身的策略偏好設定股票池大小。
導入股票池價量資料
導入上述 100 檔股票近 3 個月的價量資料以計算超級趨勢指標與 ADX 指標。
from datetime import timedelta start = (last_date - timedelta(days=90)).strftime('%Y-%m-%d') end = last_date.strftime('%Y-%m-%d') os.environ['mdate'] = start + ' ' + end os.environ['ticker'] = ' '.join(tickers) !zipline ingest -b tquant
計算指標數值
有了價量資料,我們就能使用 CustomFactor 函式建構出我們所需的超級趨勢指標以及 ADX 指標,將其導入 Pipeline() 後即可快速計算出指標數值。
選出買賣標的
我們選取上述 Pipeline 資料表中最近一日的資料,並套用超級趨勢策略的進出場條件,即可選出當天的買賣標的,存入 buy_list, sell_list 中。
last_data = run_pipeline(make_pipeline(), last_date, last_date) buy_data = last_data[last_data['close'] > last_data['final_upperband']] buy_list = [] for i in range(len(buy_data)): stock = buy_data.index.get_level_values(1)[i].symbol buy_list.append(stock)
sell_data = last_data[(last_data['close'] < last_data['final_lowerband']) & (last_data['ADX'] > 50)] sell_list = [] for i in range(len(sell_data)): stock = sell_data.index.get_level_values(1)[i].symbol sell_list.append(stock)
永豐 API 程式交易流程
前置作業
使用 pip 即可快速安裝永豐 API:Shioaji 套件。
pip install shioaji
使用永豐 API 之前,除了在永豐金證券開戶之外,也要申請金鑰與憑證,並簽署服務條款,詳細步驟可以參考超連結內的說明文件。
登入永豐 API
本文以永豐 API 的模擬模式撰寫,導入 shioaji 套件並輸入 api_key 及 secret_key,即可登入永豐 API 的環境。
import shioaji as sj api = sj.Shioaji(simulation=True) # 模擬模式 api.login( api_key = 'your api_key', secret_key = 'your secret_key', contracts_cb=lambda security_type: print(f"{repr(security_type)} fetch done.") # 獲取商品檔 Callback )
取得當前持有標的
透過永豐 API 的 list_positions 函式,我們可以看到當前持有的部位資訊,包含:股票代碼、持有數量、平均價格、目前股價、損益等。
p.s. 第一次執行 list_positions 函式時,因為我們尚未持有部位,因此會回傳空的資料表。
positions = api.list_positions(api.stock_account) position_data = pd.DataFrame(s.dict for s in positions) position_data
將部位資訊中的 code 欄位取出,即可獲得當前持有的股票清單 hold_list。
if position_data.empty: hold_list = [] else: hold_list = position_data['code'].to_list()
設定委託回報函式
我們設定委託回報函式 order_cb,並將其傳入 set_order_callback,在下單完成後將會回傳委託資訊與成交回報訊息。
def order_cb(stat, msg): print('my_order_callback') print(stat, msg) api.set_order_callback(order_cb)
下單買賣
place_order 為永豐 API 的下單函式,下單時我們須提供商品資訊 contract 及下單資訊 order。contract 包含股票代碼,order 則包含買進或賣出、價格、張數、限市價單、掛單類型 ( ROD, IOC, FOK )、整股或零股等設定。
本文的買賣條件如下:
- 若 buy_list 的標的不在 hold_list 中,則用市價單買入一張股票
- 若 sell_list 的標的在 hold_list 中,則用市價單賣出一張股票
我們以迴圈的方式自動化下單流程,以買進為例:
for i in buy_list: print('processing %s' % i) if i not in hold_list: print('%s not in hold_list' % i) print('Ready to buy!') contract = api.Contracts.Stocks.TSE[i] order = api.Order( action = 'Buy', price = 0, # MKT, MKP will not use price parameter quantity = 1, price_type = 'MKT', # MKT or MKP order_type = 'IOC', # ROD, IOC, FOK order_lot = 'Common', # Common:整股, Fixing:定盤, Odd:盤後零股, IntradayOdd:盤中零股 account = api.stock_account ) trade = api.place_order(contract, order) trade else: print('%s in hold_list' % i) print('=' * 100)
查看已實現損益
使用 list_profit_loss 函式,搭配我們欲查詢的日期區間,即可查看股票代碼、價格、數量、損益、損益比、交易日期等已實現損益資訊。
profitloss = api.list_profit_loss(api.stock_account,'2024-10-28','2024-10-28') profitloss_data = pd.DataFrame(pnl.dict for pnl in profitloss) profitloss_data
登出永豐 API
因為永豐 API 有使用流量的限制,因此建議使用完 API 服務後順手登出 API 環境。
api.logout() # True
結論
本文藉由 TQuant Lab 結合永豐 API 選出符合超級趨勢策略的股票標的,並達成自動化下單的目標。我們可以看到程式交易的優點在於只要一開始設定好交易策略與下單環境,日後只要於再平衡日一鍵執行程式碼,就能自動下單標的並追蹤部位損益狀況,大幅減少需要人工確認買賣標的與手動下單的時間成本。
永豐 API 除了本文提及的功能之外,還有提供其他豐富的應用讓使用者探索,有興趣的朋友可以參考 shioaji 的技術手冊,讓我們一起進入程式交易的領域吧!
溫馨提醒,本次策略與標的僅供參考,不代表任何商品或投資上的建議。之後也會介紹使用 TEJ 資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。
【TQuant Lab 回測系統】解決你的量化金融痛點
全方位提供交易回測所需工具