交易自己對市場會產生影響,尤爲是短期內大量交易,會影響金融資產的價格。一個訂單到來時的市場價格和訂單的執行價格一般會有差別,這個差別一般被稱爲交易成本。在量化交易的策略回測部分,不考慮交易成本或者交易成本估計不合理,容易致使回測和實盤結果有較大的差別。本文將介紹如何在分佈式時序數據庫DolphinDB中,如何使用asof join和window join快速估計每一個股票的交易成本。數據庫
須要的數據包括含有逐筆交易的交易表trades和包含level 1報價的quotes表。它們分別包含如下字段:分佈式
tradeside
Symbol:股票代碼函數
Time:時間優化
Trade_Volume:交易量spa
Trade_Price:交易價格設計
quotesblog
Symbol:股票代碼get
Time:時間it
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)。