shioaji
29
总安装量
23
周安装量
#12865
全站排名
安装命令
npx skills add https://github.com/nicepkg/ai-workflow --skill shioaji
Agent 安装分布
claude-code
16
cursor
16
opencode
16
trae
14
codex
13
Skill 文档
Shioaji Trading API
Shioaji is SinoPac’s Python API for trading Taiwan financial markets (stocks, futures, options). Shioaji æ¯æ°¸è±éè叿ä¾ç Python 交æ APIï¼æ¯æ´å°ç£è¡ç¥¨ãæè²¨ã鏿æ¬å¸å ´ã
Official Docs 宿¹ææª: https://sinotrade.github.io/ LLM Reference: https://sinotrade.github.io/llms-full.txt
Navigation åè½å°è¦½
| Topic ä¸»é¡ | File æªæ¡ | Description 說æ |
|---|---|---|
| Preparation æºå | PREPARE.md | Account setup, API keys, testing éæ¶/éé°ç³è«/測試 |
| Contracts åç´ | CONTRACTS.md | Stocks, Futures, Options contracts è¡ç¥¨/æè²¨/鏿æ¬åç´ |
| Orders ä¸å® | ORDERS.md | Place, modify, cancel, combo orders ä¸å®/æ¹å®/åªå®/çµåå® |
| Reserve é æ¶ | RESERVE.md | Reserve orders for disposition stocks èç½®è¡é æ¶å¸æ¬¾ |
| Streaming è¡æ | STREAMING.md | Real-time tick & bidask data 峿 Tick/BidAsk è³æ |
| Market Data å¸å ´è³æ | MARKET_DATA.md | Historical, snapshot, credit, scanners æ·å²è³æ/å¿«ç §/è³å¸/ææå¨ |
| Accounting 帳å | ACCOUNTING.md | Balance, margin, P&L, trading limits é¤é¡/ä¿èé/æç/é¡åº¦ |
| Advanced é²é | ADVANCED.md | Quote binding, non-blocking, stop orders å ±å¹ç¶å®/éé»å¡/è§¸å¹ |
| Troubleshooting åé¡æè§£ | TROUBLESHOOTING.md | Common issues and solutions 常è¦åé¡è解決 |
Quick Start å¿«éå ¥é
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 ç»å ¥èæèåç¨
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 æ¨¡æ¬æ¨¡å¼
Test API without real money. ä½¿ç¨æ¨¡æ¬ç°å¢æ¸¬è©¦ APIã
import shioaji as sj
api = sj.Shioaji(simulation=True)
api.login(api_key="YOUR_KEY", secret_key="YOUR_SECRET")
Available in simulation æ¨¡æ¬æ¨¡å¼å¯ç¨åè½:
- 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 ç°¡å®ä¸å®ç¯ä¾
# 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 常ç¨å¸¸æ¸
Action è²·è³£æ¹å
sj.constant.Action.Buy # è²·é²
sj.constant.Action.Sell # è³£åº
Stock Price Type è¡ç¥¨å¹æ ¼é¡å
sj.constant.StockPriceType.LMT # Limit éå¹
sj.constant.StockPriceType.MKT # Market å¸å¹
sj.constant.StockPriceType.MKP # Range Market ç¯åå¸å¹
Futures Price Type æè²¨å¹æ ¼é¡å
sj.constant.FuturesPriceType.LMT # Limit éå¹
sj.constant.FuturesPriceType.MKT # Market å¸å¹
sj.constant.FuturesPriceType.MKP # Range Market ç¯åå¸å¹
Order Type å§è¨æ¢ä»¶
sj.constant.OrderType.ROD # Rest of Day ç¶æ¥ææ
sj.constant.OrderType.IOC # Immediate or Cancel ç«å³æäº¤å¦ååæ¶
sj.constant.OrderType.FOK # Fill or Kill å
¨é¨æäº¤å¦ååæ¶
Stock Order Lot è¡ç¥¨äº¤æå®ä½
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 ä¿¡ç¨äº¤ææ¢ä»¶
sj.constant.StockOrderCond.Cash # Cash ç¾è¡
sj.constant.StockOrderCond.MarginTrading # Margin èè³
sj.constant.StockOrderCond.ShortSelling # Short èå¸
Quote Type å ±å¹é¡å
sj.constant.QuoteType.Tick # Tick data éçæäº¤
sj.constant.QuoteType.BidAsk # Bid/Ask data äºæªå ±å¹
Account Objects 帳æ¶ç©ä»¶
# Stock account è¡ç¥¨å¸³æ¶
api.stock_account
# Futures account æè²¨å¸³æ¶
api.futopt_account
# List all accounts ååºææå¸³æ¶
api.list_accounts()
Rate Limits æµééå¶
| Category é¡å¥ | Limit éå¶ |
|---|---|
| Daily Traffic æ¯æ¥æµé | 500MB – 10GB (based on trading volume ä¾äº¤æé) |
| Quote Query è¡æ æ¥è©¢ | 50 requests / 5 sec |
| Accounting Query å¸³åæ¥è©¢ | 25 requests / 5 sec |
| Connections é£ç·æ¸ | 5 per person ID |
| Daily Logins æ¯æ¥ç»å ¥ | 1000 times |
Common Patterns å¸¸ç¨æ¨¡å¼
Subscribe 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 æ¥è©¢æå
# Stock positions è¡ç¥¨æå
positions = api.list_positions(api.stock_account)
# Futures positions æè²¨æå
positions = api.list_positions(api.futopt_account)
Cancel Order åªå®
api.cancel_order(trade)
Update Order æ¹å®
# Change price æ¹å¹
api.update_order(trade=trade, price=590)
# Reduce quantity æ¸é (can only reduce åªè½æ¸å°)
api.update_order(trade=trade, qty=1)
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 ç»åº
api.logout()