如何使用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)。

相关文章
相关标签/搜索