幣圈量化交易萌新看過來--帶你走近幣圈量化(三)


報錯信息

前幾篇文章我們已經了解過所謂程序化、量化交易就是一個腳本程序根據從交易所獲取到的數據,經過一系列的計算、判斷、觸發做出一些操作,操作交易所賬戶進行交易。這些獲取數據、操作賬戶的行為都是通過交易所API接口進行的。簡單說就是腳本程序和交易所交互,既然是交互那么就肯定有正常的交互、異常的交互。當發生異常交互時接口便返回了異常信息。

當然市面上的程序化、量化交易系統,亦或自行開發的程序都會有各種各樣的錯誤提示、報錯信息。這些錯誤信息並非局限於交易所API接口的報錯信息。還有諸如:程序運行時異常錯誤、配置錯誤、程序語法錯誤等。在發明者量化交易平台上,錯誤信息也大概分為幾個大類:

1、策略語法錯誤

這類錯誤最常見,通常是因為萌新不熟悉編程,學習測試階段代碼編寫有語法錯誤導致。例如:

代碼少寫了括號之類的字符。此類錯誤通常在編輯策略頁面就能看到錯誤提示,並且策略也是運行不起來的(運行時會直接報錯,如下圖)。

所以寫完策略,在平台策略編輯頁面習慣性的摟一眼,看看有沒有紅色小XX,有就肯定是有明顯錯誤了。

2、策略程序BUG導致的運行時程序異常

程序存在BUG,在程序運行時,觸發異常會導致程序異常停止,顯示此類報錯信息。

此類錯誤都會導致程序異常,程序會停止運行。

3、配置、設置不當導致的錯誤

在FMZ平台,交易對統一定義為X_Y這樣的格式,X代表交易幣的名稱,Y代表計價幣的名稱(期貨幣本位合約交易對的計價幣通常用USD表示,在前幾篇文章中有介紹)。例如BTC_USDT,如果我胡亂寫交易對,寫成BTC-USDT

在FMZ平台回測系統中報錯:

實盤中報錯:

再者,萌新經常遇到的一種錯誤:

此類錯誤是由於修改了FMZ平台賬號的密碼,導致配置的交易所對象中的API KEY失效(用戶的API KEY都是在瀏覽器端加密后配置在FMZ平台),策略無法啟動,進而報錯。

4、接口調用報錯

接口調用報錯是在運行策略時經常遇到的,往期文章中我們學習、了解到FMZ平台上的接口分為產生網絡請求的接口不產生網絡請求的接口。接口報錯不會導致策略程序停止,通常是由於接口調用異常,返回了錯誤數據,然后策略沒有做容錯,使用了錯誤數據引發的程序異常錯誤導致程序停止(容錯的概念在前幾篇文章中有提及)。這里列舉幾個產生網絡請求的接口報錯信息:

(1)、網絡超時

萌新們經常遇到的報錯信息之一,原因是使用了國內網絡的設備(自己的電腦或者國內的服務器)。由於大部分交易所都被牆,所以國內網絡基本上很多交易所都訪問不到,訪問接口都會報超時。(前幾篇文章中有提及)

(2)、http 429 錯誤

經典報錯信息之一,原因是調用交易所接口過於頻繁,超過交易所限制的頻率。(前幾篇文章中有提及)有的萌新同學可能會說,我多申請幾個交易所的API KEY或者我多申請幾個交易所賬號不就行了。我們需要知道,交易所限制接口訪問頻率通常是基於IP地址的,簡單說就是只要在一個IP地址發送的請求全部統計在這個IP地址上,超過了限制這個IP再發送請求交易所服務器就拒絕訪問了。

(3)、交易所接口業務層面的報錯

上面講的timeout、429這些是網絡層面的錯誤。交易所接口業務層面發生問題也會報錯,例如我要獲取現貨行情,但是我設置了一個不存在的交易對。我在FMZ平台的調試工具里測試,調試工具是個很方便的測試工具,非常適合實盤測試函數調用、獲取數據等需求。

調試工具執行結果,調試工具執行和實盤執行並無區別。

Huobi	錯誤	GetTicker: Invalid ticker: {"Info":{"err-code":"invalid-parameter","err-msg":"invalid symbol","status":"error","ts":1620872079355},"High":0,"Low":0,"Sell":0,"Buy":0,"Last":0,"Volume":0,"OpenInterest":0,"Time":0}

這里的報錯信息意思就是說交易對無效(從這里看出"err-msg":"invalid symbol")。
例如此類和業務相關的報錯還有很多,比如設置杠桿時某些交易所不支持帶小數部分的杠桿值,此時杠桿值如果帶有小數部分也會導致接口調用報錯。

列舉一個不產生網絡請求的接口調用

設置期貨合約代碼

有些接口僅僅是設置系統中的某些全局變量,不產生網絡請求,例如:

但是參數傳錯,或者亂寫也是會報錯的。

但是不論哪種類型的錯誤,顯示出的報錯信息都是查找問題的關鍵信息,通常都能從報錯信息中看出問題所在。可以使用翻譯工具,翻譯報錯信息,提取關鍵信息。例如上例中的"err-msg":"invalid symbol",翻譯:“err msg”:“無效符號”。大概就知道是交易對設置錯了,因為通常都用英文symbol代表交易代碼、交易對。

回測系統

回測系統也是一個量化工具中的重點,回測系統可以方便的測試策略原型,初步測試策略中潛在的BUG、邏輯問題等。對於回測系統需要理性看待。回測系統在一定程度上是可以反映出策略的一些問題的。下面先簡單的從FMZ支持的不同策略語言層面說明一下FMZ平台上的回測系統。(關於回測系統的一些介紹,前幾篇文章中有所提及)

JavaScript

瀏覽器端回測,使用的是本機硬件資源。

Python

在托管者上回測,可以選擇具體分配到哪一個托管者上(自己部署的托管者,FMZ平台的公共托管者都行)。鑒於FMZ平台上公共托管者負載較大,建議使用本機托管者回測(這樣速度也會快些,公共托管者回測時,當任務較多超過負載,會取消一些回測任務,導致回測中斷)。

C++

和腳本語言不同,C++策略需要先編譯然后執行。C++語言的策略會在FMZ平台(服務器)先編譯(如果代碼寫的有問題,可能編譯不通過,直接彈框報錯提示)。編譯通過后在FMZ平台上(服務器)回測。

麥語言

底層實現為JavaScript,回測時同樣是在瀏覽器端回測。

可視化

底層實現為JavaScript,回測時同樣是在瀏覽器端回測。

發明者量化交易平台的回測系統回測模式分為兩種(這個不分策略語言,這個是回測設置,各種語言的策略回測都一樣)。

1、模擬級別回測
模擬級別回測簡單通俗的說就是根據K線數據模擬生成逐個時間節點的價格數據。

K線中一根柱子不是有高開低收么,構成了一個價格框架,在這個K線代表的時間范圍內,價格都在這個價格框架內,所以只要生成的價格在這個K線高開低收框架范圍內,這個模擬出來的價格就是合理的。

就好比如圖這樣模擬:

當然實際回測系統實現這個模擬的時候情況比圖上略微復雜,這里不做深究,理解模擬級別回測機制即可。知道了這個原理,就需要注意模擬級別回測的弊端了,雖然模擬級別回測速度很快(因為模擬生成的價格,並非真實的逐秒的價格一個個放出)。但是如果策略擬合了模擬的tick變動趨勢就會讓策略表現的非常優秀(但是實際情況中價格可能不是這種走勢,雖然價格都在這個K線柱的框架內)。這里用於生成模擬tick數據的K線叫做底層K線,這個K線的周期叫做底層K線周期,在策略設置頁面如圖設置:

這里設置1分鍾,意思就是使用周期為1分鍾的K線數據作為生成模擬tick的數據源。還有一點就是對於高頻策略,使用模擬級別回測顯然不太合適。但是對於趨勢策略,使用模擬級別回測還是能一定程度反映出策略的績效的。

2、實盤級別回測
說了模擬級別回測,我們再講一下實盤級別回測。簡單說實盤級別回測就是回測時真實的放出逐秒的價格數據。讓策略回溯行情中每秒的價格。這種回測模式下可以回測一些交易頻率高的策略,並且可以得到一定程度的參考價值。缺點就是實盤級別回測數據量太大,無法較大時間范圍的回測(通常時間范圍不到1天)。可以通過關閉分筆數據,降低深度數據檔位(成交逐筆數據,盤口深度數據在實盤級別回測中也有逐秒快照,所以實盤級別回測數據量龐大),來適當增大回測范圍,如圖:

發明者量化交易平台回測系統的數據來源是何處呢?回測系統默認使用的是FMZ平台的數據中心的數據,FMZ平台數據中心自動收集設定好的各個交易所各個幣種的行情數據,提供給平台上的回測系統。

1、默認使用FMZ數據中心的數據
前幾篇文章中有提及平台提供的回測數據只支持有限的交易對(全市場、全幣種回測數據是一個天文數字,全部都收集不現實,平台收集了主流交易所、主流幣種的行情數據)。

2、使用自定義數據源數據
可以使用回測頁面的選項設置自定義數據源,簡單說就是如果你自己有某個交易所的數據,可以根據FMZ平台的格式要求,提供給FMZ平台的回測系統,用於回測。

學習、測試、思考

做程序化、量化交易離不開學習測試思考。思考問題這個並不能憑空思考,那樣是低效的。解決問題、思考問題最行之有效的就是查找資料、然后動手試下思考分析,問題如果沒解決請往復以上動作。但是通常萌新遇到問題,就會感覺:

“哎呀~程序化、量化、寫策略太難了”。
“看了半天,還是懵懵的!”
“沒入門到想放棄!”
....

在FMZ平台上入門其實很簡單,首先要善於查找資料。發明者量化交易平台策略廣場、社區、文庫中有不少資料可以查閱。

然后就是動手能力,使用回測系統、調試工具可以很方便的測試,這里並不是說要測試一個完整的策略。其實你如果是完全0基礎,甚至你可以在FMZ量化的回測系統上學習JavaScript程序基礎。

這個是我經常學習JS的教程網站:runoob不僅限於JS,各種IT知識這里都能查詢、學習。比如我JS的正則表達式不知道怎么用,怎么辦?當然先查閱資料,然后動手試下咯~

我看到這樣一個例子:

我想測試下,甚至就可以用FMZ平台的回測系統測試學習。

回測系統上隨便設置一個交易所

測試以下代碼:

function IsEmail(str) {
    var reg=/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;
    return reg.test(str);
}

function main() {
    var strEmailAddress1 = "13512345678"
    Log(strEmailAddress1, " 是郵件地址么 ? ", " 回答:", IsEmail(strEmailAddress1))
    
    var strEmailAddress2 = "123456789@qq.com"
    Log(strEmailAddress2, " 是郵件地址么 ? ", " 回答:", IsEmail(strEmailAddress2))
}

看~多好的一個學習工具!比如我想學習JavaScript語言的循環邏輯怎么寫,動手試下:按數組中的順序,循環打印一個數組變量中的各個元素:

function main() {
    var arr = [{coinName: "BTC", price: 10000}, {coinName: "LTC", price: 100}, {coinName: "ETH", price: 2000}, {coinName: "ETC", price: 500}]
    for (var i = 0 ; i < arr.length ; i++) {
        Log(arr[i])
    }
}

瞬間是不是感覺學習有動力了呢!其實在FMZ上,完全可以邊看JavaScript教程,邊在回測系統上動手學習JavaScript基礎。JavaScript語法掌握的差不多了,進入下一個階段需要實際使用交易所接口獲取數據測試了,還可以使用FMZ平台的調試工具進行真實的接口測試。然后就是多思考,舉一反三,測試驗證,對比分析等。這樣學習入門就非常快了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM