iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
1
AI & Data

量化交易30天系列 第 14

量化交易30天 Day14 - 串接券商API做交易(一) IB + IbPy

  • 分享至 

  • xImage
  •  

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

寫了幾個策略之後呢,當訊號觸發的時候,就該下單啦,除了手動用電腦軟體或是APP下單,國內外的券商也有提供API下單的功能,有了API下單之後,就可以把各種交易策略寫好,然後執行程式去自動交易啦!

因為筆者是用Interactive Brokers(簡稱IB)做交易,所以這篇會以IB的API服務做為範例,一步步地說明怎麼使用API下單。當然還有蠻多券商也都有API下單的服務,只是筆者剛好是使用IB。

IB Trader Workstation(TWS)

TWS是IB的電腦版交易平台,讓使用者可以下單、研究、觀看市場資訊...等等。詳細介紹可以看官網,這次要介紹的API就是要來用程式去控制TWS,達到自動化交易的功能。

要使用這個軟體的話,會需要有IB的帳戶,然後它有一個模擬帳戶的功能,叫做Paper Trading Account,就是可以讓你用這個帳戶嘗試API的功能,熟悉之後再去實際交易。

TWS的畫面大概長這樣,左下角可以看到Order(委託單),右上角則是有Portfolio,它有很多功能,這邊就不一一介紹。

IbPy - Interactive Brokers Python API

雖然IB官方也有自己原生的API,但是我研究了一下發現它需要花蠻多時間才能熟悉的,所以這次使用IbPy就好。IbPy是IB的第三方API,是對原生的IB API做了一些簡化及封裝,我自己使用IbPy很快就可以成功下單,所以這次就先用這個做示範,當然如果要很複雜的功能,應該還是用官方的API會比較好。

安裝IbPy

官方的GitHub有詳細的內容可以參考喔。不過反正就是一行安裝,蠻簡單的。

pip install IbPy2

使用IbPy下單

  • 初始設定
    先把一些會用到的模組及函數寫好
# 先import 契約/下單/連接/訊息模組
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import Connection, message

# 處理server訊息用
def error_handler(msg):
    print("Server Error: %s" % msg)

def reply_handler(msg):
    print("Server Response: %s, %s" % (msg.typeName, msg))
    
# 撰寫契約規格,就是說明你要買賣什麼商品
def create_contract(symbol, sec_type, exch, prim_exch, curr):
    contract = Contract()
    # 商品代號
    contract.m_symbol = symbol
    # 商品種類:例如STK代表STOCK
    contract.m_secType = sec_type
    contract.m_exchange = exch
    contract.m_primaryExch = prim_exch
    contract.m_currency = curr
    return contract

# 撰寫委託單,跟在APP下單一樣,要告訴券商你要下哪一種單(市價單/限價單...),交易量多少,你要買還是賣
def create_order(order_type, quantity, action):
    order = Order()
    order.m_orderType = order_type
    order.m_totalQuantity = quantity
    order.m_action = action
    return order

# 初始化order id,因為對API來說,它會為每一筆委託單建立一個單號,因此在下單的時候,假設第一筆編號是1,那第二筆的編號就不能是1。
order_id = 1
  • 下單
    下單之前,有幾個參數要在TWS設定一下,詳細請看官網說明,其中有兩個參數是下面會用到的,分別是port跟Master API client id。
if __name__ == "__main__":
    
    # 連線至TWS登入中的帳戶
    tws_conn = Connection.create(port=7497, clientId=1)
    tws_conn.connect()

    # 連線錯誤的提示訊息
    tws_conn.register(error_handler, 'Error')

    # 將server傳來的訊息都丟給上面寫的handler
    tws_conn.registerAll(reply_handler)

    # 撰寫契約,SMART指的是IB的Smart routing服務,就是請IB去找最好的價格這樣,細節有點複雜,但不影響下單
    contract = create_contract('GOOG', 'STK', 'SMART', 'SMART', 'USD')

    # 撰寫委託單
    order = create_order('MKT', 1, 'BUY')

    # 下單
    tws_conn.placeOrder(order_id, contract, order)
    time.sleep(5)

    # 斷開連接
    tws_conn.disconnect()
    
    # 建立下一個委託單號,不一定要用增加1的方式,只要不重複即可
    order_id += 1
  • 回到TWS看看是否有成功委託
    可以看到orders裡面多了一條BUY的單,就是剛剛用API下的,代表已經成功送出囉,這樣就完成一次下單了,算是還蠻容易的。

本篇總結
有了下單功能,等於是完成量化交易的最後一哩路了,只要把之前寫的策略串接進來,就可以實現自動交易的功能囉,接下來就可以自行開發啦。
這篇講了海外券商IB的程式下單方式,不過它主要是投資海外股票用的工具,相信在台灣還是有許多投資人是交易台股的,所以接下來幾篇就要來介紹台股的程式下單工具拉,請繼續收看。

P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。

筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day13 - backtrader回測框架實作(四) Observers模組
下一篇
量化交易30天 Day15 - 串接券商API做交易(二) 台股歷史tick及分K
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
45168
iT邦新手 5 級 ‧ 2020-12-22 22:25:34

您好,請問如何用 ibpy 查詢 tws 的持倉部位(account position)
謝謝 !

我要留言

立即登入留言