加拿大股票API對接:多倫多證券交易所(TSX)即時行情與量化實踐

引言:為什麼是加拿大?為什麼是現在?
在全球量化交易的版圖中,多倫多證券交易所(TSX) 及其創業板(TSXV)長期處於一個微妙的位置:資源股豐富、分紅穩定、波動性獨特,但數據獲取門檻卻遠高於美股和港股。
彭博終端太貴,免費源頻遭封鎖,主流API供應商對加拿大市場的覆蓋要麼延遲嚴重,要麼只提供日線級別的「古董數據」。對於專注跨市場套利、能源板塊輪動或加拿大分紅策略的開發者而言,TSX即時行情的接入一直是「想做但不好做」的痛點。
iTick API 在2026年的版本更新中,已悄然完成對加拿大股票市場的全品種覆蓋。本文將以多倫多交易所(TSX) 為核心,手寫Python代碼,演示如何通過iTick的REST與WebSocket接口,獲取加拿大藍籌股的即時報價、歷史K線以及低延遲推送行情——全部示例均基於真實TSX證券代碼,開箱可測。
一、iTick加拿大市場支持概況
根據iTick官方文件及近期技術更新,其股票API已支持包括加拿大(TSX/TSXV) 在內的全球40+主要交易所。與美股(US)、港股(HK)類似,加拿大市場的region代碼為「CA」,證券代碼採用交易所原生代碼的統一格式。
✅ 支持的數據類型:
- 即時報價(最新價、漲跌幅、成交量)
- 即時Tick(逐筆成交)
- 即時盤口(買賣盤)
- 歷史K線(1分鐘~月線,最長15年)
- WebSocket即時推送(毫秒級)
✅ 適用場景:
- 加拿大資源股(能源、礦產)的量化監控
- TSX成分股的高股息策略自動化
- 多市場套利系統的數據基建
二、快速開始:獲取API Token
在開始代碼之前,你需要完成兩件事:
- 訪問 iTick官網 註冊帳號
- 在控制台查看API Key(註冊即可獲取免費套餐,個人開發者足夠使用)
iTick目前提供免費套餐,基本行情無限調用,這對加拿大市場的策略回測與實盤監控極具吸引力。
三、實戰一:REST API獲取TSX即時報價
我們以加拿大皇家銀行(RY)——TSX市值最大的金融股為例,演示單次查詢即時行情。
📌 代碼示例:TSX股票即時報價
import requests
import json
# 配置區域
API_TOKEN = 'your_itick_token_here' # 替換為你的真实Token
BASE_URL = 'https://api.itick.org'
def get_tsx_quote(symbol):
"""
獲取多倫多交易所(TSX)股票即時報價
:param symbol: TSX證券代碼,如 RY, ENB, BNS
"""
headers = {
'accept': 'application/json',
'token': API_TOKEN
}
# 加拿大市場region固定為CA
url = f'{BASE_URL}/stock/quote?region=CA&code={symbol}'
try:
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
data = response.json()
quote = data.get('data', {})
return quote
else:
print(f"請求失敗 | 狀態碼: {response.status_code}")
print(f"錯誤詳情: {response.text}")
return None
except Exception as e:
print(f"網路異常: {str(e)}")
return None
# 實戰調用:加拿大皇家銀行 RY
if __name__ == '__main__':
quote = get_tsx_quote('RY')
if quote:
print("=" * 60)
print(f"多倫多證券交易所 TSX - 即時行情")
print("=" * 60)
print(f"證券代碼: {quote.get('s', 'N/A')}")
print(f"最新價: {quote.get('ld', 'N/A')} CAD")
print(f"漲跌額: {quote.get('ch', 'N/A')}")
print(f"漲跌幅: {quote.get('chp', 'N/A')}%")
print(f"成交量: {quote.get('v', 'N/A')}")
print(f"開盤: {quote.get('o', 'N/A')}")
print(f"最高: {quote.get('h', 'N/A')}")
print(f"最低: {quote.get('l', 'N/A')}")
print(f"時間戳: {quote.get('t', 'N/A')}")
else:
print("未獲取到數據,請檢查Token或網路")
🔍 響應字段解析(TSX專用)
| 字段 | 含義 | 示例 |
|---|---|---|
s | 證券代碼 | RY |
ld | 最新價 | 168.32 |
ch | 漲跌 | 0.05 |
chp | 漲跌幅(百分比) | 0.45 |
o | 開盤價 | 168.05 |
h | 最高價 | 168.32 |
l | 最低價 | 167.95 |
v | 成交量 | 1000 |
t | 時間戳 | 1631234567000 |
小貼士:若你獲取的是TSXV創業板股票(如高風險礦業股),代碼格式一般為
ABC,region仍為CA,iTick會自動路由至對應交易所。
四、實戰二:WebSocket即時推送:構建TSX監控流水線
REST API適合定時查詢,但如果你想監控加拿大能源板塊的毫秒級異動,或構建低延遲的演算法交易信號,必須使用WebSocket。
📌 代碼示例:訂閱多隻TSX股票的即時報價與Tick
import websocket
import json
import threading
import time
WS_URL = "wss://api.itick.org/stock"
API_TOKEN = 'your_itick_token_here'
class TSXMonitor:
def on_message(self, ws, message):
try:
data = json.loads(message)
if 'data' in data:
payload = data['data']
symbol = payload.get('s')
typ = payload.get('type')
if typ == 'quote':
print(f"[報價] {symbol}: 最新 {payload.get('ld')} | 量 {payload.get('v')}")
elif typ == 'tick':
print(f"[成交] {symbol}: 價 {payload.get('ld')} | 量 {payload.get('v')}")
except Exception as e:
print(f"解析錯誤: {e}")
def on_open(self, ws):
print("WebSocket 已連接,正在訂閱 TSX 股票...")
sub_msg = {
"ac": "subscribe",
"params": "RY$CA,ENB$CA,ABX$CA",
"types": "quote,tick"
}
ws.send(json.dumps(sub_msg))
def on_error(self, ws, error):
print(f"錯誤: {error}")
def on_close(self, ws, code, msg):
print("連接關閉")
def start(self):
headers = {"token": API_TOKEN}
self.ws = websocket.WebSocketApp(
WS_URL, header=headers,
on_open=self.on_open, on_message=self.on_message,
on_error=self.on_error, on_close=self.on_close
)
def heartbeat():
while True:
time.sleep(30)
if self.ws.sock and self.ws.sock.connected:
self.ws.send(json.dumps({"ac": "ping", "params": str(int(time.time()*1000))}))
threading.Thread(target=heartbeat, daemon=True).start()
self.ws.run_forever()
if __name__ == '__main__':
monitor = TSXMonitor()
monitor.start()
⚙️ 技術要點說明
- 參數格式:
RY$CA——證券代碼$市場代碼,與美股AAPL$US完全一致 - 訂閱類型:
quote(報價)、tick(成交)、depth(盤口),可自由組合 - 心跳機制:每30秒發送
ping,防止連接閒置斷開 - 多標訂閱:逗號分隔,單次訂閱上限建議不超過50隻
此代碼跑通後,你可以在終端即時看到加拿大藍籌股的每一筆報價變動——這是搭建TSX量化監控面板的第一塊磚。
五、實戰三:歷史K線獲取——回測必備
任何量化策略都離不開歷史數據。iTick為加拿大股票提供長達15年的日線數據及完整的分鐘級歷史K線。
📌 代碼示例:獲取TSX股票最近20根日K線
import requests
import pandas as pd
from datetime import datetime
def get_tsx_kline(symbol, ktype=8, limit=20):
"""
獲取TSX股票歷史K線
:param symbol: 證券代碼,如 RY
:param ktype: K線類型 1=1分鐘, 2=5分鐘, 3=15分鐘, 4=30分鐘, 5=1小時, 6=2小時, 7=4小時, 8=日線, 9=週線, 10=月線
:param limit: 返回K線根數
"""
headers = {
'accept': 'application/json',
'token': 'your_itick_token_here'
}
url = f"https://api.itick.org/stock/kline?region=CA&code={symbol}&kType={ktype}&limit={limit}"
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
data = resp.json().get('data', [])
# 轉換為DataFrame便於分析
df = pd.DataFrame(data)
if not df.empty:
df.rename(columns={
't': 'timestamp',
'o': 'open',
'h': 'high',
'l': 'low',
'c': 'close',
'v': 'volume'
}, inplace=True)
# 時間戳轉換
df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
return df[['datetime', 'open', 'high', 'low', 'close', 'volume']]
else:
print(f"K線獲取失敗: {resp.status_code}")
return None
# 示例:獲取Enbridge(ENB)最近10個交易日數據
df = get_tsx_kline('ENB', ktype=8, limit=10)
if df is not None:
print(df.to_string(index=False))
你可以直接在此基礎上封裝雙均線策略、RSI擇時或波動率突破策略——數據源已就緒。
六、附錄:iTick加拿大股票代碼速查表(部分)
為了方便測試,這裡提供一組流動性較好的TSX證券代碼,均可通過上述代碼直接拉取數據:
| 公司名稱 | 代碼 | 板塊 |
|---|---|---|
| 加拿大皇家銀行 | RY | 金融 |
| 多倫多道明銀行 | TD | 金融 |
| 森科能源 | SU | 能源 |
| 加拿大自然資源 | CNQ | 能源 |
| 巴里克黃金 | ABX | 材料 |
| 惠頓貴金屬 | WPM | 材料 |
| 加拿大國家鐵路 | CNR | 工業 |
創業板(TSXV)示例:如
NGEX(礦產勘探),用法同上。
結語:加拿大市場不再是數據孤島
長期以來,TSX在全球金融API生態中處於「被遺忘的角落」。iTick此次對加拿大市場的完整覆蓋,填補了個人開發者與中小型機構在加拿大股票即時數據接入上的空白。
官方文件:https://docs.itick.org
GitHub:https://github.com/itick-org