
什么是 REST API?
在之前的一段視頻中,我們提到過 API 是用來連接你自己的程序和你的交易賬戶的,用于執行開倉、平倉、止盈、止損、獲取數據等一系列操作。不過,這個描述只是一個概念。要理解 API 是什么,就需要先明白我們平時使用電腦進行交易的實際運作原理。
平時我們所說的“手動”交易,意思是我們用手指通過鼠標和鍵盤,在證券行提供的交易軟件上輸入交易指令。發出指令后,這一組指令會通過網絡發送到證券行的服務器,再由證券行的服務器發送到交易所的服務器。交易所處理后會將數據返回給證券行服務器,最后數據再返回到你的電腦上顯示出來。這就是我們平時所說的“手動”交易的整個流程。指令和數據其實都會在網絡上經過一個大循環,最后再返回到自己的電腦上。
舉個例子,你在家里用富途牛牛的桌面軟件,輸入一個買入指令,買入 1000 股騰訊。這個指令到達富途服務器后,服務器會對你的指令進行一系列檢查,例如你的賬戶是否有足夠的資金、股票是否活躍、港股是否開盤、你輸入的價格是否有誤等。如果這些檢查有問題,指令當然就不會被執行。如果沒有問題,富途就會將這個指令發送到港交所服務器。如果交易成功,港交所服務器會將確認數據發送回富途,富途再將確認信息發送回給你。
由此可見,在整個交易結構中,證券行是交易所的參與者。從技術層面來看,向交易所下單的并不是你本人,而是證券行。所以證券行就是所謂的市場中介人角色。不過,普通散戶通常不太關心這些,因為整個流程都非常快,剛才提到的所有檢查、下單、返回確認等流程,都在瞬間完成。所以最后我們很快就在軟件上看到自己的賬戶交易狀態更新了,交易完成了,一眨眼就搞定了。
對于“手動”交易來說,剛才提到的“自己的電腦”,其實就是利用富途提供的軟件來處理一系列顯示內容、發出指令、更改指令等所有操作。之所以可以用鼠標和鍵盤簡單地操作,是因為這個軟件是證券行自己開發的,所以所有功能都早已準備好,讓你可以通過鼠標和鍵盤操作。而由于整個流程的重點是與證券行的服務器溝通,如果我們想進行自動交易,我們可以自己編寫程序,將一些可以自動化的流程交給自己的程序去執行。而自己的程序要與證券行服務器溝通,就需要使用證券行服務器指定的溝通方式,這個溝通方式就是 API。全名是 Application Programming Interface。只要你編寫的程序能夠讓證券行服務器聽得懂、叫得動,就可以不需要使用鼠標和鍵盤,一樣可以讓證券行幫你進行交易。所以 API 就是一個溝通的規范,是由各個證券行自己制定的。
舉個實際例子,畫面上上下兩段代碼都是同樣的動作,都是用 210 港元買入 1000 股騰訊股票。上面是富途 API 的寫法,下面是 IB API 的寫法。注意上下兩段代碼都是用 Python 寫的,但 API 的寫法完全不同。例如股票代碼在富途 API 中會用 00700.HK,但在 IB API 中就直接用 700。又例如 IB API 會規定每個交易指令都是一個 object,但富途 API 就不需要。這些區別其實是因為兩家不同的證券行,它們各自的 IT 開發團隊都是獨立運作的,所以大家的系統設計可以完全不同,寫法不同、規則不同,所以 API 的用法也不同。
為什么存在 API?
因為大部分交易所都不會讓普通散戶直接連接,而是要經過證券行發出指令。指令需要經過重重檢查后才會到達交易所。所以要實現自動交易,就需要自己編寫程序,無論你使用什么編程語言,只要證券行的 API 接受就可以。
API 的功能取決于證券行本身提供的功能。
如果證券行本身沒有某個功能,API 就一定沒有。例如富途還沒有開通購買日本股票的功能,那么它的 API 就肯定沒有購買日本股票的功能。另一方面,即使證券行本身有這個功能,但它的 API 未必開放。例如富途的桌面軟件可以看到股票的財務報表數據,但它的 API 并沒有提供這些數據。這一點需要注意。
由于每家證券行的 API 都不同,要開始自動交易,最重要的是查看每家證券行自己編寫的 API 文檔。
即 API 的說明書,每個 API 都有。這樣你才能明白證券行的開發人員希望你如何與他們的服務器進行溝通,從而實現自動交易。
對于香港散戶來說,通過證券行 API 進行自動交易,大部分都使用 Interactive Brokers(IB)或者富途。這兩家本身就很受歡迎。
Interactive Brokers(IB)
IB 其實早在十幾年前就已經開放了 API,是零售程式交易證券行的先行者。十幾年前 IB API 只支持 C++、Java、Visual Basic 等比較舊和復雜的語言。直到四五年前才開始有官方的 Python API。由于 Interactive Brokers 本身功能強大、支持的產品種類繁多,所以它的 API 結構也相對復雜得多,新手其實不太容易上手。
富途
相比之下,富途是比較新的證券行,IT 系統也是全新的。從頭建立新系統比修改舊系統容易。而且富途本身支持的功能和產品種類比 IB 少,所以富途 API 使用起來比 IB API 更容易、更簡潔,已經支持了大部分散戶會用到的功能。對于用戶來說,最好的情況是證券行之間有競爭,有競爭才有進步。
順便提一下,主流的加密貨幣交易所(如 Binance 等)也有自己的 API。不過,加密貨幣世界有一個叫做 ccxt 的庫,可以支持大量不同的加密貨幣交易所。這與傳統金融市場的狀況有所不同。
由于每家證券行的 API 都不同,使用之前就需要查看它們自己的 API 文檔。我們快速瀏覽一下這些證券行的 API 文檔。
IB API 文檔
這份 API 文檔簡直是我初學時的噩夢,因為內容寫得非常晦澀難懂,完全不是給初學者看的。我甚至懷疑寫這份 API 文檔的人是否有語言障礙。我花了很長時間才弄清楚它的結構,現在回想起來我也不明白我最后是怎么看懂的。反正用了很長時間。
富途 API 文檔
富途的 API 叫做 Futu Open API。如果滿分是 100 分,IB API 文檔可能只有 10 分,富途那份至少有 90 分。至少看得懂。我們來看看,它每個指令都像字典一樣,有分類和定義,還有實際例子。這些例子可以直接復制粘貼到 PyCharm 中,立即看到結果。這些說明書才是給人看的,IB 那份都不知道在搞什么。
加密貨幣領域的 API
不得不提 ccxt 這個庫。由于加密貨幣世界理論上沒有證券行這個角色,FTX、Bybit、Binance 等都是交易所。這些交易所各自有自己的 API,而 ccxt 的目標是建立一個跨交易所的 API 庫,方便任何人使用,而且是開源的,免費的。目前它已經支持了上百個交易所。去它的 GitHub 你會看到,它的交易所列表一直在更新。在某種程度上,它確實起到了跨交易所 API 庫的作用,可以說是做加密貨幣的朋友一定要知道的。
由于 API 涉及到很多技術層面,為了避免嚇跑新手,我們簡單講一下重點。API 可以再細分為幾種,分別是 REST API、WebSocket 和 FIX。FIX 不是一般散戶使用的,而是銀行、對沖基金等機構投資者才會使用,技術要求很高。你可能會在 IB、SAXO 等證券行的 API 文檔中看到它們支持 FIX,但與你無關,直接跳過它。
REST API
就像平時大家瀏覽網站一樣,你點擊一個按鈕,對方的服務器就會返回你想看的內容。這是一種“踢一腳動一下”的訪問模式。大部分證券行的 API 都通過 REST API 提供歷史數據、賬戶數據等。這種模式雖然效率不高,但相對容易處理。
WebSocket
專門用于傳送實時數據。例如你的程序需要每分每秒獲取最新的市價,你不可能事先知道下一單成交是什么時候發生的,也不可能在每一單成交的那一刻立即去請求一次。所以你需要用“訂閱”的方式,向 API 提出你要監視這只股票,一旦有成交就立即將最新的價格推送給你。這種做法就是 WebSocket。
可想而知,實時數據的處理方法與歷史數據有很大區別。而兩種 API 都需要掌握,缺一不可。
要做自動交易,通過 API 發號施令只是其中一環。你需要設計的自動交易程序至少要有以下幾種元素:
Account Info Update
通過 API 獲取你的賬戶信息,判斷自己有多少購買力,或者手上持有多少股票。
Strategies Management 和 Data Management
兩者相輔相成,根據歷史數據和實時數據判斷是否需要執行開倉、平倉、止盈、止損等操作。特別是止盈止損,你一定要有最新的價格,才能知道自己賺了多少、虧了多少,從而決定是否執行交易動作。
Order Management、Logging & Messaging System
主要通過 API 發出實際交易指令,并記錄、傳送所有操作。
這幾組系統需要同時運作,系統之間要傳遞最新的數據。所以設計自動交易系統是一項大工程,也是所有新手程式交易者需要攻克的一個大難題。
最難的地方是,證券行的 API 文檔不會從架構層面教你,它們都假設讀者已經是軟件工程師,需要你自己去思考。怎么思考呢?還是那句話,有價值的技術是不會輕易分享的。有機會我們再詳細講解。
如果你已經了解了以上內容,接下來的步驟大致如下:
先開模擬交易賬戶
用模擬賬戶測試 API 功能。IB 和富途都有模擬賬戶,大多數功能與真實賬戶相同,這樣就不需要每次都用真錢來測試。
測試必用功能
測試時最重要的是測試一些必用的功能,例如獲取自己賬戶的資料、獲取實時數據、下單、改單等。等測試到一定程度,你就會明白數據流是怎么樣的。
建立系統原型
有了系統原型后,就拿去進行前向測試(forward run)一段時間。用電腦或 VPS,直接用 PyCharm、Visual Studio 等 IDE 運行一段時間。如果有任何 bug,可以在前向測試時發現,慢慢調試,有耐心,改到看不到 bug 為止。
用少量真錢測試
最后用少量真錢測試一下,就像學騎自行車一樣,慢慢就會跑得順了。
原文引自YouTube視頻:https://www.youtube.com/watch?v=xyQdvODcVSk