使用Window Join快速估计个股交易成本
本页为一篇文章,介绍在 DolphinDB 中使用 asof join(aj)与 window join(pwj)连接逐笔交易与 Level 1 报价数据,以估计个股交易成本,并给出发布日期等基础信息。
Source: https://dolphindb.cn/blogs/283
What this page covers
- 交易成本概念与回测中估计交易成本的动机。
- 交易成本估计所需数据表:trades 与 quotes 及其字段需求。
- 方法一:使用 aj 进行 asof join 的基准价选取与 SQL 示例。
- 方法二:使用 pwj(prevailing window join)在窗口内聚合报价并给出 SQL 示例。
- 两种连接方式的价值描述与性能耗时数据。
- 示例:对 GS、TSLA、AAPL 的 cost 结果展示。
- 附录:NYSE FTP 样本数据下载、处理与导入步骤。
技能认证特训营第二期报名促销 cta
页面顶部包含活动公告与限时报名链接,并提到专属福利优惠。
- 提供“技能认证特训营第二期”的限时报名链接。
- 公告中说明报名可获得专属福利优惠。
使用Window Join快速估计个股交易成本 hero
本节给出文章标题与基础信息,包括 DolphinDB 与发布日期信息。
- 发布日期为 2021-05-14。
- 该页面内容以 DolphinDB 为主题背景。
问题背景与数据需求(trades 与 quotes) definition
本节解释交易成本概念与回测估计交易成本的必要性,并列出估计所需的数据表与字段。
- 交易成本可表述为订单到来时市场价与执行价之间的差异。
- 若不考虑或不合理估计交易成本,回测与实盘可能产生较大差异。
- 交易成本估计需要逐笔交易表 trades 与 Level 1 报价表 quotes。
- trades 表字段包括 Symbol、Time、Trade_Volume、Trade_Price。
- quotes 表字段包括 Symbol、Time、Bid_Price、Offer_Price。
方法一:asof join 估计交易成本(aj) how_it_works
本节说明以交易前最近一次报价中间价为基准价,使用 aj 做 asof join,并给出约束与 SQL 示例。
- 成交与买卖报价时间不可能完全一致,因此不能使用等值连接(equal join)。
- DolphinDB 提供 asof join 与 window join 两种时序连接方式。
- aj 函数用于对两个表执行 asof join。
- asof join 的连接字段为 Symbol 与 Time,并按股票分组后按时间进行连接。
- quotes 表需在每个股票组内按 time 升序排列。
方法二:window join(prevailing window join, pwj)估计交易成本 how_it_works
本节说明在交易前时间窗口内对报价做聚合后作为基准,并解释 pwj 的含义、窗口参数与聚合参数。
- 动机之一是减少单次报价偶然性,使用窗口内报价的均值或中值作为基准价。
- pwj 是 prevailing window join 的缩写。
- pwj 的相对时间窗口参数单位为纳秒。
- 示例窗口 -10000000:0 表示从交易时刻到前 10ms 的窗口。
- pwj 的第 4 个参数用于指定窗口内要计算的一系列聚合函数。
两种连接方式的价值与性能数据 trust_signal
本节说明两种连接方式可简化时序数据操作,并在给定 NYSE 数据规模下给出示例耗时。
- asof join 与 window join 用于简化时序数据操作并减少代码量。
- 示例中使用 1 行 SQL 完成所有个股交易成本计算。
- 性能测试数据来自 2016-10-24 的纽约证券交易所交易与报价数据。
- 测试规模包含 8023 只股票与约 2700 万条交易记录。
- 测试规模包含约 7000 万条买卖报价记录。
- 方法一(aj)示例执行耗时为 470 多毫秒。
- 方法二(pwj)示例执行耗时为 825 毫秒。
示例结果:GS、TSLA、AAPL 交易成本 case_study
本节展示查询三只股票交易成本的示例 SQL,并给出两种方法得到的 cost 结果。
- 示例查询筛选 symbol in `GS`TSLA`AAPL。
- 方法一结果示例:AAPL 的 cost 为 0.5446。
- 方法一结果示例:GS 的 cost 为 1.2678。
- 方法一结果示例:TSLA 的 cost 为 16.6456。
- 方法二结果示例:AAPL 的 cost 为 0.535。
- 方法二结果示例:GS 的 cost 为 1.1543。
- 方法二结果示例:TSLA 的 cost 为 18.1025。
下载试用版引导 cta
本节引导读者到官网下载安装 DolphinDB 试用版用于计算。
- 提供 DolphinDB 官网链接用于下载试用版。
- 链接目标为 http://www.dolphindb.com/。
附录1:生成样本数据(NYSE FTP下载与导入脚本) how_it_works
本节提供 NYSE FTP 样本数据下载路径、文件处理与 DolphinDB 导入脚本要点,并说明导入表内容。
- 样本数据可从 NYSE 的 FTP 下载,提供了对应路径。
- 样本文件名包含 EQY_US_ALL_TRADE_20161024.gz 与 EQY_US_ALL_NBBO_20161024.gz。
- 处理步骤包括解压、保存到 /DolphinDB/Data,并删除两个文件的最后一行。
- 提供 sed 命令示例用于删除文件最后一行。
- 导入脚本示例定义 DATA_DIR 与数据库目录,并创建序列库 database(..., SEQ, 16)。
- 导入脚本示例使用 loadTextEx 导入 Trades 与 Quotes。
- 样本数据表 Trades 包含 2016-10-24 美国股市的所有交易数据。
- 样本数据表 Quotes 包含同一天的全国最佳买卖报价(NBBO)。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 使用Window Join快速估计个股交易成本 | 发布日期 | 2021-05-14 | high |
| DolphinDB | 产品类型 | 分布式时序数据库 | high |
| 交易成本(概念) | 定义/描述 | 订单到来时的市场价格与订单执行价格通常会有差异,该差异通常被称为交易成本 | high |
| 量化交易策略回测 | 风险/影响 | 不考虑交易成本或估计不合理,容易导致回测与实盘结果差异较大 | medium |
| 交易成本估计所需数据 | 数据表 | 逐笔交易表 trades 与 level 1 报价表 quotes | high |
| trades 表 | 字段 | Symbol, Time, Trade_Volume, Trade_Price | high |
| quotes 表 | 字段 | Symbol, Time, Bid_Price, Offer_Price | high |
| 实验数据来源 | 获取渠道 | 纽约证券交易所(NYSE)数据,可从NYSE的ftp下载(参考附录1) | high |
| 基准价格(交易成本计算) | 常用选取方法 | 通常把与实际交易最近的一次报价的中间价作为基准价 | high |
| 交易记录与买卖报价连接 | 不能使用的连接方式 | 成交与买卖报价时间不可能完全一致,因此不能使用等值连接(equal join) | high |
| DolphinDB | 时序连接方式 | 提供两种专门为时序数据设计的连接方式:asof join 和 window join | high |
| aj 函数 | 用途 | 用于两个表的 asof join | high |
| asof join(aj) | 连接键/分组方式 | join字段为 Symbol 与 Time;join时先按股票分组,组内按时间进行 asof join | high |
| asof join(aj)右表(quotes) | 排序要求 | quotes表必须保证每个股票组内记录按最后一个连接字段(time)升序排列 | high |
| 方法一基准价 | 定义 | 使用交易发生前(包括交易时刻)的最近一次报价的中间价作为基准 | high |
| 方法一交易成本计算 | 计算细节 | 使用交易金额做加权平均;乘以10000将结果转为 basis points | high |
| 方法一SQL示例 | 查询表达式 | 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 | high |
| 方法二动机 | 原因 | 若认为单次报价偶然性较大,可取交易前一段时间报价的均值或中值作为基准价 | medium |
| pwj | 全称/含义 | prevailing window join 的缩写 | high |
| pwj 相对时间窗口参数 | 时间单位与示例窗口 | 时间单位为纳秒;-10000000:0 表示从交易发生时刻到前10ms的窗口 | high |
| pwj 第4个参数 | 用途 | 指定每个窗口中需要计算的一系列聚合函数 | high |
| 方法二SQL示例 | 查询表达式 | 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 | high |
| asof join 与 window join(DolphinDB) | 效果 | 简化时序数据操作并减少代码量;示例中使用1行SQL完成所有个股交易成本计算 | medium |
| DolphinDB 对两种连接方式的实现 | 优化与速度 | 实现做了大量优化,运行速度极快 | low |
| 性能测试数据集 | 日期 | 2016-10-24(纽约证券交易所股票交易数据与买卖报价数据) | high |
| 股票交易表(性能测试) | 规模 | 8023只股票,共2700万条交易记录 | high |
| 买卖报价表(性能测试) | 规模 | 7000万条记录 | high |
| 方法一(aj)性能 | 执行耗时 | 仅470多毫秒 | high |
| 方法二(pwj)性能 | 执行耗时 | 仅825毫秒 | high |
| 示例查询 | 查询语句 | select * from TC where symbol in `GS`TSLA`AAPL | high |
| 方法一结果(cost) | AAPL | 0.5446 | high |
| 方法一结果(cost) | GS | 1.2678 | high |
| 方法一结果(cost) | TSLA | 16.6456 | high |
| 方法二结果(cost) | AAPL | 0.535 | high |
| 方法二结果(cost) | GS | 1.1543 | high |
| 方法二结果(cost) | TSLA | 18.1025 | high |
| DolphinDB | 官网链接(下载试用版) | https://link.zhihu.com/?target=http%3A//www.dolphindb.com/ | high |
| 样本数据下载地址 | FTP路径 | ftp://ftp.nyxdata.com/Historical%2Data%20Samples/Daily%20TAQ%20Sample/ | high |
| 样本数据文件 | 文件名 | EQY_US_ALL_TRADE_20161024.gz 与 EQY_US_ALL_NBBO_20161024.gz | high |
| 样本数据准备 | 处理步骤 | 解压后保存在 /DolphinDB/Data 目录下,并删除两个文件的最后一行(标记文件结尾) | high |
| sed 命令(删除最后一行) | 命令 | sed -i '$ d' EQY_US_ALL_TRADE_20161024;sed -i '$ d' EQY_US_ALL_NBBO_20161024 | high |
| DolphinDB 导入脚本 | 目录与数据库配置 | DATA_DIR = "./DolphinDB/Data";PTNDB_DIR = DATA_DIR+"/NYSETAQSeq";db = database(PTNDB_DIR, SEQ, 16) | high |
| DolphinDB 导入脚本 | loadTextEx 调用 | Trades = loadTextEx(db, `Trades, DATA_DIR + "/EQY_US_ALL_TRADE_20161024",'|');Quotes = loadTextEx(db, `Quotes, DATA_DIR + "/EQY_US_ALL_NBBO_20161024",'|') | high |
| 表Trades(样本数据) | 内容描述 | 包含2016年10月24日美国股市的所有交易数据 | high |
| 表Quotes(样本数据) | 内容描述 | 包含同一天的全国最佳买卖报价(NBBO) | high |
| 技能认证特训营第二期 | 限时报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |