一个量化策略在用于理论交易时,解决实时数据的程序通常为事件驱动。而研发量化策略时,须要应用历史数据进行回测,这时的程序通常不是事件驱动。因而同一个策略须要编写两套代码,不仅耗时而且容易出错。在 DolphinDB database 中,用户可将历史数据依照工夫程序以“实时数据”的形式导入流数据表中,这样就能够应用同一套代码进行回测和实盘交易。
DolphinDB的流数据处理框架采纳公布-订阅-生产的模式。数据生产者将实时数据持续地以流的模式公布给所有数据订阅者。订阅者收到音讯当前,可应用自定义函数或者DolphinDB内置的聚合引擎来解决音讯。DolphinDB流数据接口反对多种语言的API,包含C++, C#, Java, 和Python等。用户能够应用这些API来编写更加简单的解决逻辑,更好地与理论生产环境相结合。详情请参考DolphinDB流数据教程。
本文介绍replay和replayDS函数,而后应用金融数据展现数据回放的过程与利用场景。
1. 函数介绍replay
replay(inputTables, outputTables, [dateColumn], [timeColumn], [replayRate], [parallelLevel=1])replay函数的作用是将若干表或数据源同时回放到相应的输出表中。用户须要指定输出的数据表或数据源、输出表、日期列、工夫列、回放速度以及并行度。
replay函数参数概念如下:
inputTables: 单个表或蕴含若干表或数据源(见replayDS介绍)的元组。outputTables: 单个表或蕴含若干个表的元组,这些表通常为流数据表。输出表和输出表的个数统一,且一一对应,每对输出、输出表的构造雷同。dateColumn, timeColumn: string, 示意输出表的日期和工夫列,若不指定则默认第一列为日期列。若输出表中工夫列同时蕴含日期和工夫,须要将dateColumn和timeColumn设为同一列。回放时,零碎将依据dateColumn和timeColumn的设定,决定回放的最小工夫精度。在此工夫精度下,同一时刻的数据将在雷同批次输入。比方一张表同时有日期列和工夫列,然而replay函数只设置了dateColumn,那么同一天的所有数据会在一个批次输入。replayRate: 整数, 示意每秒钟回放的数据条数。因为回放时同一个时刻数据在同一批次输入,因而当replayRate小于一个批次的行数时,理论输入的速率会大于replayRate。parallelLevel: 整数, 示意读取数据的并行度。当源数据大小超过内存大小的时候,须要应用replayDS函数将源数据划分为若干个小的数据源,顺次从磁盘中读取数据并回放。指定多个读取数据的线程数可晋升数据读取速度。replayDS
replayDS(sqlObj, [dateColumn], [timeColumn], [timeRepartitionSchema])replayDS函数能够将输出的SQL查问转化为数据源,联合replay函数应用。其作用是依据输出表的分区以及timeRepartitionSchema,将原始的SQL查问依照工夫程序拆分成若干小的SQL查问。
replayDS函数参数概念如下:
sqlObj: SQL元代码,示意回放的数据,如<select * from sourceTable>。dateColumn: 字符串, 示意日期列。若不指定,默认第一列为日期列。replayDS函数默认日期列是数据源的一个分区列,并依据分区信息将原始SQL查问拆分为多个查问。timeColumn: 字符串, 示意工夫列,配合timeRepartitionSchema应用。timeRepartitionSchema: 工夫类型向量,如08:00:00 .. 18:00:00。若同时指定了timeColumn, 则对SQL查问在工夫维度上进一步拆分。单个内存表回放
单内存表回放只须要设置输出表、输出表、日期列、工夫列和回放速度即可。
replay(inputTable, outputTable, `date, `time, 10)应用data source的单表回放
当单表行数过多时,能够配合应用replayDS进行回放。首先应用replayDS生成data source,本例中指定了日期列和timeRepartitionColumn。回放调用与单个内存表回放类似,然而能够指定回放的并行度。replay外部实现应用了pipeline框架,取数据和输入离开执行。当输出为data source时,多块数据能够并行读取,以防止输入线程期待的状况。此例中并行度设置为2,示意有两个线程同时执行取数据的操作。
inputDS = replayDS(<select * from inputTable>, `date, `time, 08:00:00.000 + (1..10) * 3600000)replay(inputDS, outputTable, `date, `time, 1000, 2)应用data source的多表回放
...