交易自身对市场会产生影响,尤其是短时间内大量交易,会影响金融资产的价格。一个订单到来时的市场价格和订单的执行价格通常会有差别,这个差别通常被称为交易成本。在量化交易的策略回测局部,不思考交易成本或者交易成本预计不合理,容易导致回测和实盘后果有较大的差别。本文将介绍如何在分布式时序数据库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对两种连贯形式实现做了大量的优化,运行速度极快。咱们以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 costAAPL 0.5446GS 1.2678TSLA 16.6456
第二种办法的后果:
symbol costAAPL 0.535GS 1.1543TSLA 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_20161024sed -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)。