如何使用Window Join快速估計個股交易成本

ca83f9c95f74b7261ebbbafe3c6e5da0.jpeg

交易本身對市場會產生影響,尤其是短時間內大量交易,會影響金融資產的價格。一個訂單到來時的市場價格和訂單的執行價格通常會有差異,這個差異通常被稱爲交易成本。在量化交易的策略回測部分,不考慮交易成本或者交易成本估計不合理,容易導致回測和實盤結果有較大的差異。本文將介紹如何在分佈式時序數據庫DolphinDB中,如何使用asof join和window join快速估計每個股票的交易成本。

需要的數據包括含有逐筆交易的交易表trades和包含level 1報價的quotes表。它們分別包含以下字段:

trades

Symbol:股票代碼

Time:時間

Trade_Volume:交易量

Trade_Price:交易價格

quotes

Symbol:股票代碼

Time:時間

Bid_Price:買方報價

Offer_Price:賣方報價

實驗中用到的數據都是從紐約證券交易所獲取,大家可以從NYSE的ftp下載。參考附錄1。


計算股票的交易成本,我們需要找到一個基準價格,通常會把與實際交易最近的一次報價的中間價作爲基準價。這意味着要對交易記錄表和買賣報價表進行連接。但是,成交和買賣報價的發生時間不可能完全一致,因此不能使用常用的等值連接(equal join)。DolphinDB提供了兩種專門爲時序數據設計的連接方式:asof join和window join。我們將使用這兩種連接方式來計算股票的交易成本。


第一種方法:使用asof join

使用交易發生前(包括交易時刻)的最近一次報價的中間加作爲基準。使用交易金額做加權平均。乘上10000是爲了把結果轉化成basis points。函數aj用於兩個表的asof join,前兩個參數分別是兩個需要join的數據表,第三個參數是join的字段。join的時候首先按股票分組,每個組之內再按照時間行進asof join。右表數據(quotes表)必須保證每個股票組內的記錄是按照最後一個連接字段(time)升序排列的。

TC = select sum(Trade_Volume*abs(Trade_Price-(Bid_Price+Offer_Price)/2))/sum(Trade_Volume*Trade_Price)*10000 as cost from aj(trades,quotes,`Symbol`Time) group by symbol


第二種方法:使用window join

如果你覺得單次報價的偶然性比較大,我們可以取交易前一段時間的報價的均值或中值作爲基準價。下面的例子取交易前10ms的報價均值作爲基準。pwj是prevailing window join的縮寫,該函數比起aj多了兩個參數。新增的第三個參數指定相對的時間窗口。因爲時間單位是納秒,-10000000:0 表示從交易的發生時刻到前10ms的窗口。新增的第4個參數是每個窗口中需要計算的一系列聚合函數。

TC = select sum(Trade_Volume*abs(Trade_Price-(Bid_Price+Offer_Price)/2))/sum(Trade_Volume*Trade_Price)*10000 as cost from pwj(trades,quotes,-10000000:0,<[avg(Offer_Price) as Offer_Price, avg(Bid_Price) as Bid_Price]>,`Symbol`Time) group by symbol

asof join和window join是DolphinDB專門爲時序數據設計的連接方式,不僅簡化了時序數據的操作,大大減少了代碼量。以上面的交易成本計算爲例,僅僅使用了1行SQL代碼就完成了所有個股的交易成本計算。

DolphinDB database 對兩種連接方式實現做了大量的優化,運行速度極快。我們以2016年10月24日紐約證券交易所的股票交易數據和買賣報價數據爲例。股票交易表有8023只股票共2700萬條交易記錄,買賣報價表有7000萬條記錄。如此龐大的數據量,使用第一種方法,DolphinDB執行耗時僅470多毫秒;使用第二種方法,DolphinDB執行耗時僅825毫秒,速度極快。

最後我們看看結果是不是make sense。觀察一下三個股票的交易成本:GS(高盛),TSLA(特斯拉),AAPL(蘋果)。

select * from TC where symbol in `GS`TSLA`AAPL

第一種方法的結果:

symbol	cost
AAPL	0.5446
GS	1.2678
TSLA	16.6456

第二種方法的結果:

symbol	cost
AAPL	0.535
GS	1.1543
TSLA	18.1025

感興趣的 朋友 可以 到官網下載DolphinDB database 試用版計算股票的交易成本。


附錄1.生成樣本數據

訪問ftp://ftp.nyxdata.com/Historical%2Data%20Samples/Daily%20TAQ%20Sample/並且下載EQY_US_ALL_TRADE_20161024.gz和EQY_US_ALL_NBBO_20161024.gz兩個文件,然後把它們解壓,保存在/DolphinDB/Data目錄下,把兩個文件的最後一行刪除,因爲最後一行是用來標記文件結尾的。

sed -i '$ d' EQY_US_ALL_TRADE_20161024
sed -i '$ d' EQY_US_ALL_NBBO_20161024

接着,執行下面的腳本。

DATA_DIR = "./DolphinDB/Data"
PTNDB_DIR = DATA_DIR+"/NYSETAQSeq"
db = database(PTNDB_DIR, SEQ, 16)
 
Trades = loadTextEx(db, `Trades, DATA_DIR + "/EQY_US_ALL_TRADE_20161024”,'|')
Quotes = loadTextEx(db, `Quotes, DATA_DIR + "/EQY_US_ALL_NBBO_20161024",'|')

表Trades包含2016年10月24日美國股市的所有交易數據。表Quotes包含同一天的全國最佳買賣報價(NBBO)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章