量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。
之前在shioaji下單的部份,關於委託單送出之後server回傳的訊息,似乎沒有很清楚地去了解到底回傳了什麼內容,這邊就要來看懂下單訊息、取消委託單訊息、更新委託單訊息,反正只要委託單內容有改變,server就會回傳一個OrderState,告訴我們這張單發生什麼事。
這邊就來讀下單後server回傳的訊息,這邊要先記住這張單我把它命名叫做trade,等一下要取消或是改價量的時候會需要。
In
contract = api.Contracts.Stocks.TSE.TSE2330
order = api.Order(price=400,
quantity=1,
action="Buy",
price_type="LMT",
order_type="ROD",
account=api.stock_account
)
trade = api.place_order(contract, order)
Out
OrderState.TFTOrder {
"operation":{
"op_type":"New", # 表示這張單是新建立的
"op_code":"00",
"op_msg":""
},
"order":{ # 委託單資訊
"id":"d6caaa23",
"seqno":"628330",
"ordno":"IK148", # 委託書號
"action":"Buy", # 買賣方向
"price":400.0, # 價位
"quantity":1, # 數量
"order_cond":"Cash", # 交易型態
"order_type":"ROD", # 下單類型;ROD代表當日有效單
"price_type":"LMT" # 限價單
},
"status":{ # 委託單狀態
"id":"d6caaa23",
"exchange_ts":1600924398,
"modified_price":0,
"cancel_quantity":0
},
"contract":{ # 商品規格
"security_type":"STK", # 商品種類;STK表示個股
"exchange":"TSE", # 交易所
"code":"2330", # 商品代號
"symbol":"",
"name":"",
"currency":"TWD"
}
}
上面那張單的物件叫做trade,所以要取消這張單的話,可以這樣寫:
In
api.cancel_order(trade)
Out
OrderState.TFTOrder {
"operation":{
"op_type":"Cancel", # 表示要取消這張單
"op_code":"00",
"op_msg":""
},
"order":{ # 委託單資訊
"id":"d6caaa23",
"seqno":"628330",
"ordno":"IK148",
"action":"Buy",
"price":400.0,
"quantity":1,
"order_cond":"Cash",
"order_type":"ROD",
"price_type":"LMT"
},
"status":{ # 委託單狀態
"id":"d6caaa23",
"exchange_ts":1600924411,
"modified_price":0,
"cancel_quantity":1 # 已取消數量,因為這張單只委託一張,所以會是1
},
"contract":{ # 商品規格
"security_type":"STK",
"exchange":"TSE",
"code":"2330",
"symbol":"",
"name":"",
"currency":"TWD"
}
}
有時候將委託單送出之後,會需要修改價格,這時候就可以使用update功能
In
api.update_order(trade=trade, price=410)
Out
OrderState.TFTOrder {
"operation":{
"op_type":"UpdatePrice", # 更新價格
"op_code":"00",
"op_msg":""
},
"order":{
"id":"b2476784",
"seqno":"628536",
"ordno":"IK168",
"action":"Buy",
"price":410.0, # 已經改價了
"quantity":3,
"order_cond":"Cash",
"order_type":"ROD",
"price_type":"LMT"
},
"status":{
"id":"b2476784",
"exchange_ts":1600924520,
"modified_price":0,
"cancel_quantity":0
},
"contract":{
"security_type":"STK",
"exchange":"TSE",
"code":"2330",
"symbol":"",
"name":"",
"currency":"TWD"
}
}
原本上面這張單的quantity是3,如果想要減少1張,可以這樣寫
In
# qty是指要減少的數量
api.update_order(trade=trade, qty=1)
Out
OrderState.TFTOrder {
"operation":{
"op_type":"UpdateQty", # 更新數量
"op_code":"00",
"op_msg":""
},
"order":{
"id":"b2476784",
"seqno":"628536",
"ordno":"IK168",
"action":"Buy",
"price":400.0,
"quantity":3,
"order_cond":"Cash",
"order_type":"ROD",
"price_type":"LMT"
},
"status":{
"id":"b2476784",
"exchange_ts":1600924636,
"modified_price":0,
"cancel_quantity":1 # 取消的數量
},
"contract":{
"security_type":"STK",
"exchange":"TSE",
"code":"2330",
"symbol":"",
"name":"",
"currency":"TWD"
}
}
本篇總結
Shioaji的功能到這篇其實大概就講完了,真的是蠻多功能的,接下來幾篇就要來把這些功能串接起來啦,從接收報價,資料導入策略,一直到下單,會使用一個範例策略實做,請繼續收看囉。
P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。
筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。