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

ca83f9c95f74b7261ebbbafe3c6e5da0.jpeg

交易自己對市場會產生影響,尤爲是短期內大量交易,會影響金融資產的價格。一個訂單到來時的市場價格和訂單的執行價格一般會有差別,這個差別一般被稱爲交易成本。在量化交易的策略回測部分,不考慮交易成本或者交易成本估計不合理,容易致使回測和實盤結果有較大的差別。本文將介紹如何在分佈式時序數據庫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)。

相關文章
相關標籤/搜索