Example 4.asof join




非同时连接(asof join)对于时间序列数据分析非常方便。假设我们需要连接两个表:包含交易价格的股票交易表和包含报价和询价的股票报价表。我们想要获得每个股票当时的行情。换而言之,在股票交易表的时间戳没有出现在股票报价表的情况下,我们想要得到某个股票最近的报价。DolphinDB的 asof join 是用于高效处理这些非同时连接任务。


以下例子中的数据从NYSE网站获取。访问ftp://ftp.nyxdata.com/Historical%20Data%20Samples/Daily%20TAQ%20Sample/并下载两个文件:EQY_US_ALL_TRADE_20161024.gz和EQY_US_ALL_NBBO_20161024.gz。把它们解压保存为C:/DolphinDB/Data/文件夹下的csv文件,并执行以下脚本,把数据保存在DolphinDB分区表中。



PTNDB_DIR = "C:/DolphinDB/Data"

dbName = database(PTNDB_DIR + "/NYSE", RANGE, string('A'..'Z') join `ZZZZ)

Trades = loadTextEx(dbName, `Trades, `Symbol, PTNDB_DIR + "/EQY_US_ALL_TRADE_20161024.csv",'|')

Quotes = loadTextEx(dbName, `Nbbo, `Symbol, PTNDB_DIR + "/EQY_US_ALL_NBBO_20161024.csv",'|')



Trades包含2016年10月24日的所有美国股票交易记录。表Quotes包含2016年10月24日的全国最佳买卖报价(NBBO)。首先,我们把表Trades和表Quotes左连接。



t1=select Time, Symbol, Trade_Volume, Trade_Price, Bid_Price, Offer_Price as QuoteTime from lj(Trades, Quotes, `Symbol`Time)




在表t1中,大多数股票交易记录没有匹配的股票报价。


现在对表Trades和表Quotes进行asof join:



t2=select Time, Symbol, Trade_Volume, Trade_Price, Bid_Price, Offer_Price, Quotes.Time as QuoteTime from aj(Trades, Quotes, `Symbol`Time)




在表t2中,所有记录都与股票报价匹配,可能是同一时间的交易或者如果同一时间没有报价,有可能是最后一次报价。





Download source code here.