乐趣区

关于dolphindb:如何使用Window-Join快速估计个股交易成本

交易自身对市场会产生影响,尤其是短时间内大量交易,会影响金融资产的价格。一个订单到来时的市场价格和订单的执行价格通常会有差别,这个差别通常被称为交易成本。在量化交易的策略回测局部,不思考交易成本或者交易成本预计不合理,容易导致回测和实盘后果有较大的差别。本文将介绍如何在分布式时序数据库 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    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)。

退出移动版