Shioaji is SinoPac's Python API for trading Taiwan financial markets (stocks, futures, options). Shioaji is a Python trading API provided by SinoPac Securities, supporting Taiwan's stock, futures, and options markets.
Official Docs Official Documentation: https://sinotrade.github.io/ LLM Reference: https://sinotrade.github.io/llms-full.txt
Navigation Feature Guide
| Topic Topic | File File | Description Description |
|---|---|---|
| Preparation Preparation | PREPARE.md | Account setup, API keys, testing Account opening/API key application/testing |
| Contracts Contracts | CONTRACTS.md | Stocks, Futures, Options contracts Stock/Futures/Options contracts |
| Orders Order Placement | ORDERS.md | Place, modify, cancel, combo orders Place order/modify order/cancel order/combo order |
| Reserve Reserve | RESERVE.md | Reserve orders for disposition stocks Reserve securities and funds for disposition stocks |
| Streaming Market Data | STREAMING.md | Real-time tick & bidask data Real-time Tick/BidAsk data |
| Market Data Market Data | MARKET_DATA.md | Historical, snapshot, credit, scanners Historical data/snapshot/margin and securities/scanners |
| Accounting Accounting | ACCOUNTING.md | Balance, margin, P&L, trading limits Balance/margin/profit and loss/quota |
| Advanced Advanced | ADVANCED.md | Quote binding, non-blocking, stop orders Quote binding/non-blocking/stop trigger |
| Troubleshooting Troubleshooting | TROUBLESHOOTING.md | Common issues and solutions Common issues and solutions |
Quick Start Quick Start
Installation Installation
# pip
pip install shioaji
# uv (recommended 推薦)
uv add shioaji
# with speed optimization 速度優化版
uv add shioaji --extra speed
# Docker
docker run -it sinotrade/shioaji:latest
Login & Activate CA Login and Certificate Activation
import shioaji as sj
api = sj.Shioaji()
# Login with API Key 使用 API Key 登入
accounts = api.login(
api_key="YOUR_API_KEY",
secret_key="YOUR_SECRET_KEY"
)
# Activate CA certificate 啟用憑證 (required for placing orders 下單必須)
api.activate_ca(
ca_path="/path/to/Sinopac.pfx",
ca_passwd="YOUR_CA_PASSWORD",
)
Simulation Mode Simulation Mode
Test API without real money. Test the API using the simulation environment.
import shioaji as sj
api = sj.Shioaji(simulation=True)
api.login(api_key="YOUR_KEY", secret_key="YOUR_SECRET")
Available in simulation Features available in simulation mode:
- Quote: subscribe, unsubscribe, ticks, kbars, snapshots
- Order: place_order, update_order, cancel_order, update_status, list_trades
- Account: list_positions, list_profit_loss
- Data: short_stock_sources, credit_enquires, scanners
Simple Order Example Simple Order Example
# Get contract 取得合約
contract = api.Contracts.Stocks["2330"] # TSMC 台積電
# Create order 建立訂單
order = api.Order(
price=580,
quantity=1,
action=sj.constant.Action.Buy,
price_type=sj.constant.StockPriceType.LMT,
order_type=sj.constant.OrderType.ROD,
account=api.stock_account,
)
# Place order 下單
trade = api.place_order(contract, order)
Common Constants Common Constants
Action Buy/Sell Direction
sj.constant.Action.Buy # 買進
sj.constant.Action.Sell # 賣出
Stock Price Type Stock Price Type
sj.constant.StockPriceType.LMT # Limit 限價
sj.constant.StockPriceType.MKT # Market 市價
sj.constant.StockPriceType.MKP # Range Market 範圍市價
Futures Price Type Futures Price Type
sj.constant.FuturesPriceType.LMT # Limit 限價
sj.constant.FuturesPriceType.MKT # Market 市價
sj.constant.FuturesPriceType.MKP # Range Market 範圍市價
Order Type Order Condition
sj.constant.OrderType.ROD # Rest of Day 當日有效
sj.constant.OrderType.IOC # Immediate or Cancel 立即成交否則取消
sj.constant.OrderType.FOK # Fill or Kill 全部成交否則取消
Stock Order Lot Stock Trading Unit
sj.constant.StockOrderLot.Common # Regular 整股 (1000 shares)
sj.constant.StockOrderLot.Odd # After-hours odd lot 盤後零股
sj.constant.StockOrderLot.IntradayOdd # Intraday odd lot 盤中零股
sj.constant.StockOrderLot.Fixing # Fixing 定盤
Order Condition Margin Trading Condition
sj.constant.StockOrderCond.Cash # Cash 現股
sj.constant.StockOrderCond.MarginTrading # Margin 融資
sj.constant.StockOrderCond.ShortSelling # Short 融券
Quote Type Quote Type
sj.constant.QuoteType.Tick # Tick data 逐筆成交
sj.constant.QuoteType.BidAsk # Bid/Ask data 五檔報價
Account Objects Account Objects
# Stock account 股票帳戶
api.stock_account
# Futures account 期貨帳戶
api.futopt_account
# List all accounts 列出所有帳戶
api.list_accounts()
Rate Limits Rate Limits
| Category Category | Limit Limit |
|---|---|
| Daily Traffic Daily Traffic | 500MB - 10GB (based on trading volume based on trading volume) |
| Quote Query Market Data Query | 50 requests / 5 sec |
| Accounting Query Accounting Query | 25 requests / 5 sec |
| Connections Number of Connections | 5 per person ID |
| Daily Logins Daily Logins | 1000 times |
Common Patterns Common Patterns
Subscribe Market Data Subscribe to Market Data
# Subscribe tick data 訂閱逐筆成交
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type=sj.constant.QuoteType.Tick
)
# Subscribe bidask 訂閱五檔
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type=sj.constant.QuoteType.BidAsk
)
# Set callback 設定回調
@api.quote.on_quote
def quote_callback(topic, quote):
print(f"Topic: {topic}, Quote: {quote}")
Query Positions Query Positions
# Stock positions 股票持倉
positions = api.list_positions(api.stock_account)
# Futures positions 期貨持倉
positions = api.list_positions(api.futopt_account)
Cancel Order Cancel Order
api.cancel_order(trade)
Update Order Modify Order
# Change price 改價
api.update_order(trade=trade, price=590)
# Reduce quantity 減量 (can only reduce 只能減少)
api.update_order(trade=trade, qty=1)
Error Handling Error Handling
try:
trade = api.place_order(contract, order)
except Exception as e:
print(f"Order failed: {e}")
# Check order status 檢查訂單狀態
api.update_status(api.stock_account)
for trade in api.list_trades():
print(trade.status)
Logout Logout
api.logout()