iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
永豐金融APIs

深入解析 Shioaji API系列 第 10

Day 10 - Subscribe 訂閱盤中報價資訊(Stocks)

本篇重點

  • api.quote.subscribe簡介
  • 訂閱個股盤中tick資訊
  • 訂閱個股盤中bidask資訊

api.quote.subscribe簡介

官方說明文件:https://sinotrade.github.io/tutor/market_data/streaming/stocks/
對於程式交易,會需要在盤中的時候取得盤中的報價或成交資訊。雖然在盤中,也是可以用snapshots或kbars來取得盤中資訊,但在取得這類資訊時,不管對伺服器端或是客戶端,都是比較佔用資源的。透過subscribe,你可以訂閱多個金融商品的報價或成交資訊,也可以針對回傳的內容,撰寫對應的執行動作(程式)。
另外,跟其它報價資訊相比,目前subscribe是一個連線最多可以訂閱200個內容。

api.quote.subscribe(
    contract: shioaji.contracts.Contract, #contract金融商品資訊
    quote_type: shioaji.constant.QuoteType = <QuoteType.Tick: 'tick'>, #報價類型,預設為tick資料
    intraday_odd: bool = False, #盤中零股,預設為False,即現股資料
    version: shioaji.constant.QuoteVersion = <QuoteVersion.v0: 'v0'>, #報價資訊類型,預設為v0版
)

若要取消訂閱,可呼叫api.quote.unsubscribe,使用方式及參數與subscribe相同

subscribe在使用上,stock跟future沒有差別,但在回傳的資訊上有些微的不同,所以此部份會把stock跟future分開說明,此篇先說明stock個股的部份。
而QuoteVersion有分v1和v0版,v0版是簡易的報價內容,v1版是詳細的報價內容,以下也會分別說明v0版及v1版的使用方式及報價內容。

訂閱個股盤中tick資訊

如同之前所介紹的,tick是指成交的報價內容,所以只要有成交,就會回傳一筆資料。
訂閱個股盤中tick v1版報價資訊,範例如下:

from shioaji import TickSTKv1, Exchange #從shioaji模組,匯入TickSTKv1及Exchange物件
from threading import Event #threading模組,匯入Event物件
#訂閱個股盤中tick資訊
api.quote.subscribe(
    api.Contracts.Stocks["2330"], 
    quote_type = sj.constant.QuoteType.Tick, # or 'tick'
    version = sj.constant.QuoteVersion.v1 # or 'v1'
)

Event().wait() #盤中執行程式時,若看不到quote_callback的執行結果,請加入此行
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.on_tick_stk_v1()
def quote_callback(exchange: Exchange, tick:TickSTKv1):
    print(f"Exchange: {exchange}, Tick: {tick}") #將報價資訊內容輸出至console中

Tick QuoteVersion.v1,quote_callback的執行結果

Exchange.TSE Tick(code='2330', datetime=datetime.datetime(2021, 9, 24, 11, 19, 42, 535354), open=Decimal('591'), avg_price=Decimal('593.06'), close=Decimal('596'), high=Decimal('597'), low=Decimal('590'), amount=Decimal('596000'), total_amount=Decimal('5626423000'), volume=1, total_volume=9487, tick_type=1, chg_type=2, price_chg=Decimal('8'), pct_chg=Decimal('1.36'), bid_side_total_vol=7328, ask_side_total_vol=2159, bid_side_total_cnt=1654, ask_side_total_cnt=489, closing_oddlot_shares=0, fixed_trade_vol=0, suspend=0, simtrade=0, intraday_odd=0)

Tick QuoteVersion.v1的報價內容說明

屬性 說明
code '2330' 股票代碼
datetime datetime.datetime(2021, 9, 24, 11, 19, 42, 535354) 時間
open Decimal('591') 開盤
avg_price Decimal('593.06') 均價
close Decimal('596') 成交價
high Decimal('597') 最高
low Decimal('590') 最低
amount Decimal('596000') 成交金額
total_amount Decimal('5626423000') 總成交金額
volume 1 成交量
total_volume 9487 總成交量
tick_type 1 tick類型
chg_type 2 變動類型
price_chg Decimal('8') 變動金額
pct_chg Decimal('1.36') 變動百分比
bid_side_total_vol 7328 買盤成交總量,單位:張
ask_side_total_vol 2159 賣盤成交總量,單位:張
bid_side_total_cnt 1654 買盤成交筆數
ask_side_total_cnt 489 賣盤成交筆數
closing_oddlot_shares 0 盤後零股成交股數
fixed_trade_vol 0 盤後定價成交量
suspend 0 是否為暫停交易
simtrade 0 是否為試撮
intraday_odd 0 是否為盤中零股

訂閱個股盤中tick v0版報價資訊,範例如下:

api.quote.subscribe(
    api.Contracts.Stocks["2330"], 
    quote_type = sj.constant.QuoteType.Tick, # 報價類型為Tick
    version = sj.constant.QuoteVersion.v0 # 回傳資訊版本為v0
)
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
    print(f"Topic: {topic}, Quote: {quote}")

Tick QuoteVersion.v0,quote_callback的執行結果

MKT/idcdmzpcr01/TSE/2330 {'AmountSum': [5641317000.0], 'Close': [596.0], 'Date': '2021/09/24', 'TickType': [1], 'Time': '11:23:30.154501', 'VolSum': [9512], 'Volume': [2]}

Tick QuoteVersion.v0的報價內容說明

屬性 說明
AmountSum [5641317000.0] 總成交金額
Close [596.0] 成交價
Date '2021/09/24' 日期
TickType [1] Tick類型
Time '11:23:30.154501' 時間
VolSum [9512] 總成交量
Volume [2] 成交量

訂閱個股盤中bidask資訊

bidask是指委買委賣的資訊,也就是看盤軟體中最佳五檔的資料內容
訂閱個股盤中bidask v1版報價資訊,範例如下:

api.quote.subscribe(
    api.Contracts.Stocks["2330"], 
    quote_type = sj.constant.QuoteType.BidAsk, #報價類型為BidAsk
    version = sj.constant.QuoteVersion.v1 # 回傳資訊版本為v1
)
Event().wait()
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.on_bidask_stk_v1()
def quote_callback(exchange: Exchange, bidask:BidAskSTKv1):
    print(f"Exchange: {exchange}, BidAsk: {bidask}")

BidAsk QuoteVersion.v1,quote_callback的執行結果

Exchange.TSE BidAsk(code='2330', datetime=datetime.datetime(2021, 9, 24, 11, 27, 11, 42526), bid_price=[Decimal('595'), Decimal('594'), Decimal('593'), Decimal('592'), Decimal('591')], bid_volume=[405, 245, 746, 454, 260], diff_bid_vol=[0, 0, 0, 0, 0], ask_price=[Decimal('596'), Decimal('597'), Decimal('598'), Decimal('599'), Decimal('600')], ask_volume=[121, 364, 359, 415, 657], diff_ask_vol=[-1, 0, 0, 0, 0], suspend=0, simtrade=0, intraday_odd=0)

Tick QuoteVersion.v1的報價內容說明

屬性 說明
code '2330' 股票代碼
datetime datetime.datetime(2021, 9, 24, 11, 27, 11, 42526) 時間
bid_price [Decimal('595'), Decimal('594'), Decimal('593'), Decimal('592'), Decimal('591')] 委買價
bid_volume [405, 245, 746, 454, 260] 委買量
diff_bid_vol [0, 0, 0, 0, 0] 委買量差異(增減)
ask_price [Decimal('596'), Decimal('597'), Decimal('598'), Decimal('599'), Decimal('600')] 委賣價
ask_volume [121, 364, 359, 415, 657] 委賣量
diff_ask_vol [-1, 0, 0, 0, 0] 委賣量差異(增減)
suspend 0 是否為暫停交易
simtrade 0 是否為試撮
intraday_odd 0 是否為盤中零股

訂閱個股盤中bidask v0版報價資訊,範例如下:

api.quote.subscribe(
    api.Contracts.Stocks["2330"], 
    quote_type = sj.constant.QuoteType.BidAsk, #報價類型為BidAsk
    version = sj.constant.QuoteVersion.v0 # 回傳資訊版本為v0
)
Event().wait()
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
    print(f"Topic: {topic}, Quote: {quote}")

BidAsk QuoteVersion.v0,quote_callback的執行結果

QUT/idcdmzpcr01/TSE/2330 {'AskPrice': [596.0, 597.0, 598.0, 599.0, 600.0], 'AskVolume': [124, 381, 358, 416, 656], 'BidPrice': [595.0, 594.0, 593.0, 592.0, 591.0], 'BidVolume': [407, 246, 745, 454, 260], 'Date': '2021/09/24', 'Time': '11:28:01.797097'}

Tick QuoteVersion.v0的報價內容說明

屬性 說明
AskPrice [596.0, 597.0, 598.0, 599.0, 600.0] 委賣價
AskVolume [124, 381, 358, 416, 656] 委賣量
BidPrice [595.0, 594.0, 593.0, 592.0, 591.0] 委買價
BidVolume [407, 246, 745, 454, 260] 委買量
Date '2021/09/24' 日期
Time '11:28:01.797097' 時間

上一篇
Day 09 - Kbars 轉換及儲存至資料庫
下一篇
Day 11 - Subscribe 訂閱盤中報價資訊(Futures)
系列文
深入解析 Shioaji API30

尚未有邦友留言

立即登入留言