我們在非撮合回測模式下,因為無法獲知交易價格當時的真實盤口價差、掛單數(shù)量,常主觀設定一個滑點均值,比如針對螺紋鋼等合約,設置 1 跳,針對某些交易不活躍的品種,設置 2 跳。 但是這種近乎拍腦袋的方法并不精確。我們今天嘗試通過簡單的輔助工具,實現(xiàn)盡可能接近準確的 tick 級別滑點設置,代碼已寫好,不用編程也可獲得結果。 一、“過價成交”與“撮合成交”主流程序化交易軟件如 TB、文華財經、MC 等,提供了“過價成交”這種限價單來模擬歷史交易,只要價格在近日 k 線區(qū)間以內,都模擬本次交易成交。這種方法效率高,回測簡便,可以實現(xiàn)大周期k線頻率下的 bar 內交易。 一些精確的回測系統(tǒng),如某些交易者自己開發(fā)的系統(tǒng)可以實現(xiàn) tick 級別撮合回測,但是速度極慢,如果進行多組回測(如參數(shù)優(yōu)化場景)難以應對。 所以兩種模式都有優(yōu)劣,針對不同場景應該有不同選擇側重。 二、通過調取tick價格,獲知盤口真實情況我們的計算需要獲取大量 tick 數(shù)據(jù),才能滿足最近一個階段,比如 1 年的滑點細節(jié),所以 tb 等軟件提供的 tick 數(shù)據(jù)并不夠用。較為穩(wěn)妥的方案是,通過聚寬獲取免費數(shù)據(jù),并在其在線式研究平臺 python 環(huán)境下,不用開發(fā)模型,直接分析數(shù)據(jù)。 以聚寬為例,獲取 tick 數(shù)據(jù)的核心函數(shù)是:
我們看到該函數(shù)需要傳入的參數(shù)有:
針對部分編程愛好者,我們簡單解讀程序,如果沒興趣也可直接跳過本段。首先針對一次獲取多個合約的需求,我們定義的函數(shù),應該允許在 security 合約代碼字段傳輸多個品種,所以函數(shù)也針對 security 字段來建立一個 for 循環(huán)。 循環(huán)內獲得交易時間日期、獲得該品種 minpoint(最小波動量,以便統(tǒng)一結果量剛為跳數(shù))。通過 get_ticks 函數(shù)獲得每日價格,計算得到['a1_p'] 減去 ['b1_p']這個字段,這就是每天的 tick 級別買賣價差。 緊接著計算一個每日均值:spread_mean,這樣我們獲得了每個品種每日滑點, dict 套 dict 數(shù)據(jù)格式。為了讓你不在聚寬購買研究內存,我們做了內存清理。 考慮到某些 tick 錯誤數(shù)據(jù),可能導致 tick 級別買賣價差過大,我們在最終繪圖的 dataframe 中做了過濾,大于 10 跳的部分都刪除,小于 0 跳的部分也刪除(理論上 ask 一定高于 bid,所以不應該出現(xiàn)負值)。 future_basic_info 函數(shù)僅用于獲取合約單位,報價單位,和 MinPoint 最小變動價格,這是一個將聚源數(shù)據(jù)庫封裝接口后的函數(shù),原接口非常難用,所以封裝一遍,這個函數(shù)在期貨模型里也可以用。 三、不同板塊品種滑點初探運行時首先要傳入品種簡稱,如這樣,我們傳入黑色系的幾個品種: test_ins_list = ['RB','HC','I','J','ZC'] 然后將這個品種 list,傳入主函數(shù) cal_mean_spread,并傳入要查詢的截至日期,和日期長度(如這里查詢截止 3 月 8 日數(shù)據(jù),過去 220 天):
結果如下: 我們看到,黑色系品種,鐵礦石滑點最為穩(wěn)定,螺紋鋼其次,他們的買賣價差均值都在 1 左右。焦炭可能由于波動量大,某些時候,可以達到較高的滑點,但是仔細觀察坐標軸,全日均值的極值點,還是在 1.5 以內,并沒有很大的沖擊成本。 有色金屬中,銅鋁鋅穩(wěn)定在 1 跳左右,這些品種雖然趨勢不好做,但是可能套保和套利盤較多,流動性不成本問題。pb 鉛較高,依然穩(wěn)定在 1.5 以內,ni 鎳常會沖擊到 2 個滑點,畢竟其價格高,雖然趨勢活躍,但是接近 10 萬元的價格產生幾個 10 元的價差,還是很合理的。sn 錫比較夸張了,4~5 個滑點是常有的,也是我虧錢最多的品種,值得紀念。 農產品的穩(wěn)定性超乎我們之前的偏見,雖然趨勢不強,但是交易活躍,盤口流動性并不成問題,沒有出現(xiàn)顯著斷檔,本次測試的大部分品種都在 1 跳左右,2 跳以內的滑點。這應該也是套利和做市商的功勞,特別是后者提供連續(xù)流動性更為重要。 化工品中,除除了 PP 表現(xiàn)活躍,其他幾位同學還湊合。滑點基本在 1.2 個以內,所以還是那句老話,其實商品期貨的滑點并不是很高,尤其是每日平均滑點。雖然我常和朋友開玩笑說這里“池淺王八多”,但畢竟 40 個品種分享 5000 億保證金,加上每年 200 萬億的交易額(2018 年數(shù)據(jù)),流動性還是充裕的。 金融期貨情況有些不可控,股指期貨被閹割后,流動性有時候成問題,這也是很多日內模型無法運轉的原因,我們觀察發(fā)現(xiàn) IC 流動性長期不足,滑點較大。在股指期貨逐步放開后,可以控制在平均 4 跳,而之前則有可能到 8~10 跳。IF 和IH 可以控制在平均 2~3 跳,之前也要 4 跳左右。反而是國債期貨的流動性很棒,可以控制在 2 跳之內。 但是這里提醒各位讀者:不同的價格,跳數(shù)含義完全不同。高價品種出現(xiàn)較高跳數(shù)完全合理,其本質上對應的沖擊成本價值,和低價成本出現(xiàn) 1 到 2 跳效果類似。比如在 NI 鎳品種設置 5 跳的一個日內模型表現(xiàn)尚可,在 I 鐵礦上如果加到 2 跳滑點,就會嚴重折損效果,因為鐵礦 1 跳對應 50 元,鎳 1 跳對應 10 元。 四、多頭滑點和空頭滑點多頭和空頭忍受的滑點是不同的,我們在行情軟件上,看到的價格實際上是本文的 get_tick 函數(shù)提取到的 current 價格,而你的模型一般會按照此價格計算,如果達到條件,就報單,緊接著就是判斷是否成交的過程,報單價格太低肯定不行,先價格優(yōu)先,還要時間優(yōu)先。所以報單價格要足夠高(買入為例)。 我們深入到股指期貨內部,分別使用['a1_p'] - ['current']計算買入滑點,使用['current'] - ['b1_p']計算賣出滑點,得到結果如下: 我們選擇了 2 月 25 日這個大漲日,測試IF主力合約的滑點情況,該函數(shù)深入到每日內,可以看到情況依然樂觀,充裕的流動性讓買賣滑點大部分集中在 -5 跳到 +10 跳區(qū)間內,但是在快速變動的行情中,滑點也快速增加到 10 跳以上,也有可能是我們的行情并非 tick 而是每秒 2 個快照導致的,此時追價交易就有點可怕了。 空頭滑點比多頭略小,畢竟是大漲行情中,做空容易,但是差異很小,在極端變化時,滑點依然被拉的比較大,需要警惕。我們提醒大家一些日內突破模型,在某些關鍵點位上,滑點會比你想象中更大,而在其他價位上,滑點又很小,甚至吃到負滑點。 文件已經保存成為一個《滑點測試——powered by 量化投資訓練營.ipynb》python代碼記事本,傳到聚寬研究平臺,即可運行。感謝南開大學劉健濤同學完成了其中主要代碼設計。本次我們沒有分析訂單深度,你可以在程序上改版獲得。 點擊【閱讀原文】,文末獲取完整源代碼~ |
|