一直以來,Python/ target=_blank class=infotextkey>Python 都在量化金融領域扮演著至關重要的角色。得益于 Python 強大的庫和工具,用戶在處理金融數據、進行數學建模和機器學習時變得更加便捷。但作為一種解釋性語言,相對較慢的執行速度也限制了 Python 在一些需要即時響應的場景中的應用。
同時,由于 GIL(Global Interpreter Lock)的存在,在應對多線程和 CPU 密集型任務時,Python 始終無法充分發揮出硬件性能和并行執行任務的優勢。
歷時2年,DolphinDB 開發了可以識別 Python 語言的全新腳本引擎 Python Parser,它讓用戶可以用自己最熟悉的 Python 語法實現計算邏輯,并在 DolphinDB 的計算框架上高效運行,享受到 DolphinDB 高性能和分布式的計算能力。想要體驗“高性能+分布式 python ”的朋友,歡迎掃描下方二維碼試用。
在這里,我們挑選了6個具有代表性的因子,用 Python Parser 進行了實現,并對比DolphinDB 和 Python 的實現進行了簡單性能測試,為大家提供一些參考。
測試環境測試數據
- 2023 年單個交易所某日的 level-2 全天數據 快照數據:24,313,086 行 × 62 列 [約 20.6 GB] 逐筆成交:108,307,125 行 × 19 列 [約 11.0 GB] 逐筆委托:141,182,534 行 × 16 列 [約 11.6 GB]
以下為各因子計算邏輯描述,點擊鏈接可獲取詳細腳本。
雙均線因子
雙均線是根據兩條周期不一樣的均線的相對位置來跟蹤趨勢的一種方法,本測試中我們使用雙均線交叉的方式來判斷買賣方向:
- 短周期均線從下向上突破長周期均線時,意味著當前時間段具有上漲趨勢,突破點就是常說的金叉,是股票的買入信號,在代碼里,使用前一短均值小于前一長均值且當前短均值大于當前長均值的方式來判斷金叉,賦予信號值為 1;
- 短周期均線從上向下跌破長周期均線時,意味著當前時間段具有下跌趨勢,跌破點就是常說的死叉,是股票的賣出信號,在代碼里,使用前一短均值大于前一長均值且當前短均值小于當前長均值的方式來判斷金叉,賦予信號值為 -1。
在這里我們使用簡單移動平均(Simple Moving Average),其中 n 為窗口大小:
因子計算示例代碼請點擊鏈接獲取!
十檔凈委買增額
十檔凈委買增額因子指的是在有效十檔范圍內買方資金總體增加量,即所有買價變化量的總和,計算公式如下:
其中 level10_Difft 表示 t 時刻的十檔凈委買增額;bidi,t 表示 t 時刻的第 i 檔買方報價;bidQtyi,t 表示 t 時刻的第 i 檔買方掛單數量;指示函數 I 表示報價是否在有效釋放范圍內。
有效十檔范圍內表示不考慮已不在十檔范圍內的檔位,即表示只考慮以下區間的檔位:
最后,對過去 n 時間窗口內的十檔凈委買增額求和。
價格變動與一檔量差的回歸系數
回歸模型:
其中,
- ΔPt 表示 t 時刻的價格變動;lastPricet 表示 t 時刻的最新價格;
- NVOLt 表示 t 時刻的買賣一檔量差;bidQty1,t 表示 t 時刻的買方一檔掛單筆數;askQty1,t 表示 t 時刻的賣方一檔掛單筆數;
- α 表示截距;λ 表示斜率;εt 表示 t 時刻的殘差。
其中回歸系數 λ 為目標因子值。
主動成交量占比
主動成交占比即主動成交量占總成交量的比例,其計算公式如下:
其中 tradeQtyi 表示 i 時刻的成交量;actVolumet 表示 t 時刻起的前 lag 筆訂單的主動成交量之和;totalVolumet 表示 t 時刻起的前 lag 筆訂單的總成交量;指示函數 I 含義如下:
早盤買賣單大小比
早盤買賣單大小比即早盤時間段買入訂單平均委托量占賣出訂單平均委托量的比例的對數,其計算公式如下:
其中 openBidVol 表示早盤時間段買入訂單平均委托量;openAskVol 表示早盤時間段賣出訂單平均委托量;orderQtyt 表示 t 時刻的委托量;
Ibid 是指示函數,當訂單為買方委托單時值為 1,否則為 0;Iask 是指示函數,當訂單為賣方委托單時值為 1,否則為 0。
委托量加權平均委托價格
委托量加權平均委托價格是將多筆委托單的委托價格按各自的委托量加權而算出的平均價格,其計算公式如下:
其中 vwapt 表示 t 時刻起的前 lag 筆委托單的委托量加權平均委托價格;orderQtyi 表示 i 時刻委托單的委托量;orderPricei 表示 i 時刻委托單的委托價格。