关于dolphindb:怎么导入特殊时间类型的数据

我有一个csv文件,其中工夫列前面多一个字符Z,样本数据如下所示: code,ts,close,volumeTXFL9,2019.12.17T01:54:01.001123321Z,12001,1TXO12400A0,2019.12.17T01:54:01.867000123Z,30,10UDFL9,2019.12.17T01:54:04.381321124Z,28313,1...当初我想用下列代码导入数据到DolphinDB database分布式表中,可是没胜利: dbName = "dfs://db1"path = "d:/ticks.csv"if(existsDatabase(dbName)){ dropDatabase(dbName)}db = database(dbName,VALUE,2019.09.04..2020.10.09)modaltb = table(1:0, `code`timestamp`close`volume,[SYMBOL,TIMESTAMP,DOUBLE,DOUBLE])db.createPartitionedTable(modaltb, `trade,`timestamp)schemaTb=extractTextSchema(path)update schemaTb set type=`NANOTIMESTAMP where name=`ts ;loadTextEx(dbHandle=db,tableName='trade', partitionColumns='timestamp',filename=path,schema=schemaTb)求教一下该怎么实现?

January 11, 2021 · 1 min · jiezi

关于dolphindb:干货丨DolphinDB与MongoDB在时序数据上的对比测试

DolphinDB和MongoDB都是为大数据而生的数据库。然而两者有这较大的区别。前者是列式存储的多模型数据库,次要用于结构化时序数据的高速存储、查问和剖析。后者是文档型的NoSQL数据库,可用于解决非结构化和结构化的数据,能够依据键值疾速查找或写入一个文档。MongoDB有着本人最合适的利用场景。然而市场上短少优良的大数据产品,不少用户试图应用MongoDB来存储和查问物联网和金融畛域的结构化时序数据。本测试的目标是评估MongoDB是否适宜此类海量时序数据集。 1. 测试环境本次测试在单机上进行,测试设施配置如下: 主机:DELL OptiPlex 7060 CPU:Intel(R) Core(TM) i7-8700 CPU@3.20GHZ,6核12线程 内存:32 GB (8GB x 4, 2,666 MHz) 硬盘: 2T HDD (222MB/s读取;210MB/s写入) OS:Ubuntu 18.04 LTS DolphinDB选用Linux0.89作为测试版本,所有节点最大连接数为128,数据正本设置为2,设置1个管制节点,1个代理节点,3个数据节点。 MongoDB选用Linux4.0.5社区版作为测试版本,shard集群线程数为12,所有服务器的最大连接数均为128。MongoDB的shard集群设置为1个config服务器,1个mongos路由服务器,3个分片服务器,其中config服务器设置为有1个主节点和2个从节点的replica集群,3个分片服务器均设置为有1个主节点,1个从节点,1个仲裁节点的replica集群。DolphinDB和MongoDB的参数配置请参考附录1。 2. 数据集本报告测试了DolphinDB和MongoDB在小数据量级(4.2GB)和大数据量级(62.4GB)下的性能。 对于大小两种数据集,咱们测试两种数据库在磁盘分区状况下的性能,查问工夫均蕴含了磁盘IO的工夫。为了保障测试的偏心,咱们在测试前通过linux命令:sync,echo1,2,3 | tee /proc/sys/vm/drop_caches清空页面缓存,目录缓存和硬盘缓存,随后顺次执行13条查问,并记录执行的工夫。 以下是两个数据集的表构造和分区办法: 设施传感器信息小数据集(CSV文件,4.2G, 3千万条数据) 咱们选用TimescaleDB官网提供的devices_readings_big.csv(以下简称readings数据集)和device_info_big.csv(以下简称info数据集)设施传感器数据作为小数据测试集。readings数据集蕴含3,000个设施在10,000个工夫距离(2016.11.15-2016.11.19)上的传感器信息,包含传感器工夫,设施ID,电池,内存,CPU等时序统计信息。info数据集包含3,000个设施的设施ID,版本号,制造商,模式和操作系统等统计信息。 数据起源:https://docs.timescale.com/v1.1/tutorials/other-sample-datasets 数据集共3千万 条数据(4.2G),压缩包内蕴含一张设施信息表和一张设施传感器信息记录表,表构造以及分区形式如下: readings数据集 info数据集 数据集中device_id这一字段有3000个不同的值,且在readings数据集中反复呈现,这种状况下应用string类型不仅占用大量空间而且查问效率低,DolphinDB的symbol类型能够很好地解决占用空间和效率两个问题。 咱们在 DolphinDB database 中采纳组合分区,将time字段作为分区的第一个维度,按天分为 4 个区,再将device_id作为分区的第二个维度,每天一共分 10 个区,最初每个分区所蕴含的原始数据大小约为100MB。 咱们在MongoDB中同样采纳组合分区的形式,将time作为分区的第一维度,依据日期进行范畴分区,再将设施ID作为第二分区维度,依据设施ID进行范畴分区。MongoDB的范畴分区是依据块的大小进行分区的,当数据块大小大于某个阈值,数据库会主动将一个大的数据块分为两个小的数据块,实现分区。通过测试,咱们发现当chunkSize(数据块分区阈值)为1024时,性能最佳。最终,readings数据集总共分为17个分区。 MongoDB要求分区字段必须建设索引,因而咱们建设日期+设施ID的复合索引,复合索引能够放慢查问速度,然而MongoDB在建设索引时会耗费工夫和空间。readings数据集分区建设time_1_device_id_1增序索引耗时为5分钟,占用空间大小为1.1G。建设索引的脚本如下所示: use device_ptdb.device_readings.createIndex({time:1,device_id:1}股票交易大数据集(CSV文件,62.4G,16亿条数据) 咱们选用纽约证券交易所(NYSE)提供的2007.08.07-2007.08.10四天的股市Level1报价数据(以下简称TAQ数据集)作为大数据测试集,数据集蕴含8,000多支股票在4天内的交易工夫,股票代码,买入价,卖出价,买入量,卖出量等报价信息。 数据集有4个csv文件,每个文件在14G到17G之间,总共大小为62.4G,大概16亿条数据,每个CSV文件保留一个交易日的交易信息,数据来源于(https://www.nyse.com/market-data/historical)。TAQ数据集构造如下所示: 在DolphinDB中,咱们采纳组合分区,将date字段作为分区的第一维度,每天一个分区,共四个分区,再将symbol字段作为分区的第二维度,依据范畴分区,每天分为100个分区。最初总共分为400个分区,每个分区大概40MB。 在MongoDB中同样采纳组合分区形式,分区维度与DolphinDB雷同,将chunkSize设置为1024,总共分为385个分区。 MongoDB在对TAQ数据集分区时建设date_1_symbol_1增序索引耗费的工夫为53分钟,占用空间大小为19G,建设索引的脚本如下所示: use taq_pt_dbdb.taq_pt_col.createIndex({date:1,symbol:1}3. 数据库导入导出性能比照3.1 导入性能 ...

January 5, 2021 · 2 min · jiezi

关于dolphindb:干货丨如何高速迁移MySQL数据到时序数据库DolphinDB

DolphinDB提供了两种导入MySQL数据的办法:ODBC插件和MySQL插件。咱们举荐应用MySQL插件导入MySQL数据,因为它的速度比ODBC导入更快,导入6.5G数据,MySQL插件的速度是ODBC插件的4倍,并且应用MySQL插件无需任何配置,而ODBC插件须要配置数据源。 在应用MySQL插件之前,请先参考DolphinDB装置使用指南装置DolphinDB。 1.下载插件DolphinDB装置目录/server/plugins/mysql曾经蕴含MySQL插件,用户能够间接应用该插件。如果用户须要自行编译,能够参考https://github.com/dolphindb/DolphinDBPlugin/blob/master/mysql/README_CN.md。 2.加载插件在GUI中,应用loadPlugin函数加载MySQL插件: loadPlugin(server_dir+"/plugins/mysql/PluginMySQL.txt")3.接口函数DolphinDB的MySQL插件提供了以下接口函数: connectshowTablesextractSchemaloadloadEx咱们能够通过以下两种形式调用插件的接口函数: (1)moduleName::apiFunction。例如,调用MySQL插件的connect办法。 mysql::connect(host, port, user, password, db)(2)use moduleName,而后间接调用接口函数。只有执行一次use语句后,后续调用接口函数都不须要从新执行use函数。因而,咱们个别举荐这种调用办法。 use mysqlconnect(host, port, user, password, db)3.1 connect 语法 connect(host, port, user, password, db) 参数 host是MySQL服务器的主机名。 port是MySQL服务器的端口号,默认为3306。 user是MySQL服务器中的用户名。 password是与user对应的明码。 db是MySQL中的数据库名称。 详情 创立MySQL连贯,返回MySQL的连贯句柄。咱们倡议MySQL用户的Authentication Type为mysql_native_password。 例子 连贯本地MySQL服务器中的employees数据库。 conn=connect("127.0.0.1",3306,"root","123456","employees")3.2 showTables 语法 showTables(connection) 参数 connection是connect函数返回的连贯句柄。 详情 返回一个DolphinDB类型的数据表,蕴含MySQL数据库中所有表的名称。 例子 查看employees数据库中的表。 showTables(conn);Tables_in_employeescurrent_dept_empdepartmentsdept_empdept_emp_latest_datedept_manageremployeessalariestest_datatypestitles3.2 extractSchema 语法 extractSchema(connection, tableName) 参数 connection是connect函数返回的连贯句柄。 tableName是MySQL数据库中的数据表名称。 详情 返回后果是DolphinDB类型的表。第一列是MySQL数据表中的字段名,第二列是数据导入到DolphinDB后的数据类型,第三列是MySQL中的数据类型。 例子 查看employees表中各列的数据类型。 extractSchema(conn,`employees);name type MySQL describe type emp_no LONG int(11) birth_date DATE date first_name STRING varchar(14) last_name STRING varchar(16) gender SYMBOL enum('M','F') hire_date DATE date 3.3 load ...

January 4, 2021 · 2 min · jiezi

关于dolphindb:随机森林算法实现的性能对比测试scikitlearnSpark-MLlibDolphinDBxgboost

随机森林是罕用的机器学习算法,既能够用于分类问题,也可用于回归问题。本文对scikit-learn、Spark MLlib、DolphinDB、xgboost四个平台的随机森林算法实现进行比照测试。评估指标包含内存占用、运行速度和分类准确性。本次测试应用模仿生成的数据作为输出进行二分类训练,并用生成的模型对模仿数据进行预测。 1. 测试软件本次测试应用的各平台版本如下: scikit-learn:Python 3.7.1,scikit-learn 0.20.2 Spark MLlib:Spark 2.0.2,Hadoop 2.7.2 DolphinDB:0.82 xgboost:Python package,0.81 2. 环境配置CPU:Intel(R) Xeon(R) CPU E5-2650 v4 2.20GHz(共24核48线程) RAM:512GB 操作系统:CentOS Linux release 7.5.1804 在各平台上进行测试时,都会把数据加载到内存中再进行计算,因而随机森林算法的性能与磁盘无关。 3. 数据生成本次测试应用DolphinDB脚本产生模仿数据,并导出为CSV文件。训练集均匀分成两类,每个类别的特色列别离遵从两个核心不同,标准差雷同,且两两独立的多元正态分布N(0, 1)和N(2/sqrt(20), 1)。训练集中没有空值。 假如训练集的大小为n行p列。本次测试中n的取值为10,000、100,000、1,000,000,p的取值为50。 因为测试集和训练集独立同散布,测试集的大小对模型准确性评估没有显著影响。本次测试对于所有不同大小的训练集都采纳1000行的模仿数据作为测试集。 产生模仿数据的DolphinDB脚本见附录1。 4. 模型参数在各个平台中都采纳以下参数进行随机森林模型训练: 树的棵数:500最大深度:别离在4个平台中测试了最大深度为10和30两种状况划分节点时选取的特色数:总特色数的平方根,即integer(sqrt(50))=7划分节点时的不纯度(Impurity)指标:基尼指数(Gini index),该参数仅对Python scikit-learn、Spark MLlib和DolphinDB无效采样的桶数:32,该参数仅对Spark MLlib和DolphinDB无效并发工作数:CPU线程数,Python scikit-learn、Spark MLlib和DolphinDB取48,xgboost取24。在测试xgboost时,尝试了参数nthread(示意运行时的并发线程数)的不同取值。但当该参数取值为本次测试环境的线程数(48)时,性能并不现实。进一步察看到,在线程数小于10时,性能与取值成正相干。在线程数大于10小于24时,不同取值的性能差别不显著,尔后,线程数减少时性能反而降落。该景象在xgboost社区中也有人探讨过。因而,本次测试在xgboost中最终应用的线程数为24。 5. 测试后果测试脚本见附录2~5。 当树的数量为500,最大深度为10时,测试后果如下表所示: 当树的数量为500,最大深度为30时,测试后果如下表所示: 从准确率上看,Python scikit-learn、Spark MLlib和DolphinDB的准确率比拟相近,略高于xgboost的实现;从性能上看,从高到低顺次为DolphinDB、Python scikit-learn、xgboost、Spark MLlib。 在本次测试中,Python scikit-learn的实现应用了所有CPU核。 Spark MLlib的实现没有充沛应用所有CPU核,内存占用最高,当数据量为10,000时,CPU峰值占用率约8%,当数据量为100,000时,CPU峰值占用率约为25%,当数据量为1,000,000时,它会因为内存不足而中断执行。 DolphinDB database 的实现应用了所有CPU核,并且它是所有实现中速度最快的,但内存占用是scikit-learn的2-7倍,是xgboost的3-9倍。DolphinDB的随机森林算法实现提供了numJobs参数,能够通过调整该参数来升高并行度,从而缩小内存占用。详情请参考DolphinDB用户手册。 xgboost罕用于boosted trees的训练,也能进行随机森林算法。它是算法迭代次数为1时的特例。xgboost实际上在24线程左右时性能最高,其对CPU线程的利用率不如Python和DolphinDB,速度也不迭两者。其劣势在于内存占用起码。另外,xgboost的具体实现也和其余平台的实现有所差别。例如,没有bootstrap这一过程,对数据应用无放回抽样而不是有放回抽样。这能够解释为何它的准确率略低于其它平台。 6. 总结Python scikit-learn的随机森林算法实现在性能、内存开销和准确率上的体现比拟平衡,Spark MLlib的实现在性能和内存开销上的体现远远不如其余平台。DolphinDB的随机森林算法实现性能最优,并且DolphinDB的随机森林算法和数据库是无缝集成的,用户能够间接对数据库中的数据进行训练和预测,并且提供了numJobs参数,实现内存和速度之间的均衡。而xgboost的随机森林只是迭代次数为1时的特例,具体实现和其余平台差别较大,最佳的利用场景为boosted tree。 ...

December 31, 2020 · 4 min · jiezi

关于dolphindb:数据库交易回测系列三多因子Alpha策略最佳因子权重

在本系列二(多因子Alpha策略回测)中,咱们对美股市场的4个量化因子进行了回测。在这里,咱们将应用 DolphinDB database 内置的quadprog函数,对各个因子的权重进行均值方差优化,以决定最佳因子权重。 本系列二提供的脚本执行结束后,数据表factorPnl会存有每个因子每天的收益。以下脚本基于数据表factorPnl。 retMatrix=matrix(select C0, C1, C2, C3 from factorPnl)H = cross(covar, retMatrix, retMatrix)f=-0.25*each(avg, retMatrix)A=-(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 $4:4)b=-0.1*1 1 1 1 Aeq=matrix([1],[1],[1],[1]) beq=[1]result=quadprog(H, f, A, b, Aeq, beq)result[1]这段代码解决了以下优化问题: 这里咱们的指标函数为最大化(1/4冀望收益 – 1/2方差),同时保障四个因子的权重之和为1,并且每个因子最小权重为10%。 H是四个因子收益率的方差-协方差矩阵。请留神这里的H,A和Aeq必须是列数相等的矩阵; f,b和beq必须是向量。A是负的单位矩阵,与b一起应用,保障每个因子权重大于10%。对于quadprog函数细节请参考DolphinDB用户开发文档quadprog。 result[1]给出基于给定优化条件的最佳因子权重。后果如下: [0.3612, 0.1, 0.438804, 0.1]在本系列二提供的脚本中, signalNames = `signal_mom`signal_vol`signal_beta`signal_size因而,最佳权重为36.1%的动量因子,10%的稳定率因子,43.9%的beta因子和10%的市值因子。 以上计算应用了所有历史期间的数据。也可选用最近10年的数据进行计算,只需对以上脚本的第一行代码做如下改变: retMatrix=matrix(select C0, C1, C2, C3 from factorPnl where date>=2007.01.01)后果如下: ...

December 30, 2020 · 1 min · jiezi

关于dolphindb:干货丨如何用时序数据库寻找相似的历史k线

有网友发问应该用什么样的数据库/数据结构/算法来计算某支股票的类似K线? 具体的问题形容是,假如给出某股某段行情K线(单位/日),从任何其余股票历史中匹配出与之最为类似的某段历史K线,并给出类似度值(单位/%),并以此排序,获取最为类似的N个后果。 咱们能够应用k线的间隔以及股票日回报的相关性来掂量k线类似度,应用Tushare提供的沪深股票2008年到2017年的日线行情数据来做试验。如何把Tushare数据导入到 DolphinDB database 能够参考教程如何应用DolphinDB解决Tushare金融数据。 Tushare提供的沪深股票日线行情数据蕴含以下字段: 名称 形容ts_code 股票代码trade_date 交易日期open 开盘价high 最高价low 最低价close 收盘价pre_close 昨收价change 涨跌额pct_change 涨跌幅vol 成交量(手)amount 成交额(千元)上面将以漫步者(股票代码为002351.SZ)为例,介绍如何在历史数据中,找出与漫步者2016年9月1日到2016年9月30日最为类似的10段历史k线。 首先,把漫步者2016年9月1日到2016年9月30日的日线行情数据加载到内存。 code="002351.SZ"//漫步者edifier=select * from loadTable("dfs://daily_line","hushen_daily_line") where ts_code=code,date(trade_date) between 2016.09.01:2016.09.30把股票数据加载到内存中。 num=exec count(*) from edifierstock=select * from loadTable("dfs://daily_line","hushen_daily_line")1.应用k线的间隔掂量类似度 两段k线之间的间隔能够用股票日回报的差的平方和来计算。间隔越小示意k线的类似度越高。 def square_sum(x,y):sum2(x-y)corrTable1=select ts_code,move(date(trade_date),num-1)as beginDate,date(trade_date) as endDate,moving(square_sum{edifier.pct_change},pct_change,num) as distance from stock context by ts_code下面代码应用的moving是DolphinDB的模板函数,示意在大小为num,边界为beginDate和endDate的滚动窗口中计算两段k线之间的间隔。square_sum{edifier.pct_change}是DolphinDB中的局部利用,用于固定函数的局部参数。 找出与漫步者2016年9月1日到2016年9月30日最为类似的10段历史k线。 mostCorrelated1=select * from corrTable1 where isValid(distance),rank(distance,true) between 0:10 order by distancets_code beginDate endDate distance300073.SZ 2016.08.02 2016.08.29 67.024600995.SH 2017.07.06 2017.08.02 70.8713600549.SH 2010.12.17 2011.01.14 73.514600627.SH 2008.07.07 2008.08.07 73.59600367.SH 2010.12.17 2011.01.14 76.447600867.SH 2011.07.28 2011.08.24 76.5449002253.SZ 2010.05.21 2010.06.22 79.2845002382.SZ 2015.01.06 2015.02.02 79.5101300266.SZ 2014.07.07 2014.09.17 80.1772600706.SH 2017.06.05 2017.07.14 80.5079定义一个函数getReturn,取出类似股票在beginDate和endDate之间的日回报。 ...

December 24, 2020 · 1 min · jiezi

关于dolphindb:干货丨Orca入门指南

本文将具体介绍Orca的装置办法、基本操作,以及Orca绝对pandas的差别,用户在应用Orca编程时须要留神的细节,以便用户能写出高效的Orca代码。 装置Orca反对Linux和Windows零碎,要求Python版本为3.6及以上,pandas版本为0.25.1及以上。Orca我的项目曾经集成到DolphinDB Python API中。通过pip工具装置DolphinDB Python API,就能够应用Orca。 pip install dolphindbOrca是基于DolphinDB Python API开发的,因而,用户须要有一个DolphinDB服务器,并通过connect函数连贯到这个服务器,而后运行Orca: >>> import dolphindb.orca as orca>>> orca.connect(MY_HOST, MY_PORT, MY_USERNAME, MY_PASSWORD)如果用户曾经有现成的pandas程序,能够将pandas的import替换为: # import pandas as pdimport dolphindb.orca as pdpd.connect(MY_HOST, MY_PORT, MY_USERNAME, MY_PASSWORD)疾速入门通过传入一列值创立一个Orca Series对象。Orca会主动为它增加一个默认索引: >>> s = orca.Series([1, 3, 5, np.nan, 6, 8])>>> s0 1.01 3.02 5.03 NaN4 6.05 8.0dtype: float64通过传入一个字典创立与Orca DataFrame对象。字典中的每个元素必须是能转化为相似Series的对象: >>> df = orca.DataFrame(... {"a": [1, 2, 3, 4, 5, 6],... "b": [100, 200, 300, 400, 500, 600],... "c": ["one", "two", "three", "four", "five", "six"]},... index=[10, 20, 30, 40, 50, 60])>>> df a b c10 1 100 one20 2 200 two30 3 300 three40 4 400 four50 5 500 five60 6 600 six也能够间接传入一个pandas DataFrame以创立Orca DataFrame: ...

December 23, 2020 · 3 min · jiezi

关于dolphindb:干货丨如何使用时序数据库快速计算买方或卖方驱动交易

给定高频交易数据以及报价数据,如何判断每笔交易是由买方驱动或是卖方驱动,是进行高频交易数据分析常常须要解决的问题。本文将介绍如何应用DolphinDB疾速计算每笔交易的驱动方,只需不到2秒钟即可对美国一天的level 1的高频交易数据进行计算并存入数据库。本文应用了非同时连贯(asof join)以及map-reduce。 本文用到的数据是含有逐笔交易的交易表trade和交易报价表nbbo。它们别离蕴含以下字段: trade Symbol:股票代码 Time:工夫 Trade_Volume:交易量 Trade_Price:交易价格 nbbo Symbol:股票代码 Time:工夫 Bid_Price:买方报价 Offer_Price:卖方报价 本文用到的数据都是从纽约证券交易所网站获取,能够从NYSE的ftp下载。下载EQY_US_ALL_TRADE_20161024.gz和EQY_US_ALL_NBBO_20161024.gz两个文件,而后把它们解压,保留在/home/DolphinDB/Data目录下,把两个文件的最初一行删除,因为最初一行是用来标记文件结尾的。 sed -i '$ d' EQY_US_ALL_TRADE_20161024sed -i '$ d' EQY_US_ALL_NBBO_20161024复制代码在DolphinDB中执行以下脚本,把数据导入到 DolphinDB database 中。本教程应用的是分布式数据库,如果想应用内存数据库,只需把dbPath批改为"",若要应用本地磁盘数据库,只需把dbPath批改为磁盘目录,比方“/home/DolphinDB/Data/EQY”。 DATA_DIR = "/home/DolphinDB/Data"login("admin","123456")dbPath= "dfs://EQY"db = database(dbPath, SEQ, 16)trade = loadTextEx(db, `trade, DATA_DIR + "/EQY_US_ALL_TRADE_20161024",'|')nbbo = loadTextEx(db, `nbbo, DATA_DIR + "/EQY_US_ALL_NBBO_20161024",'|')复制代码把分布式表加载到内存中: db=database(dbPath);trade = db.loadTable("trade")nbbo = db.loadTable("nbbo")复制代码通过map-reduce分布式计算框架,把后果保留至分布式表中。分布式表的数据在物理上散布在不同的节点,通过DolphinDB的分布式引擎,能够做对立查问。 创立分布式表trade_side,用于保留计算结果。用于保留后果的表除了蕴含trade表中的字段,还蕴含Bid_Price、Offer_Price和Side字段。 model=select top 1 * from trademodel[`Bid_Price]=0.0model[`Offer_Price]=0.0model[`Side]='B'if(existsTable(dbPath, "trade_side")) db.dropTable("trade_side")db.createPartitionedTable(model, "trade_side", "Symbol")复制代码判断每笔交易由买方或卖方驱动,咱们定义的算法如下:如果交易价格小于交易报价的平均价格,交易为卖方驱动,把Side设置为'S';如果交易价格大于交易报价的平均价格,交易为买方驱动,把Side设置为'B'。如果买方报价等于交易报价的平均价格,则把Side设置为NULL。 def saveTradeSide(t){ update t set Side = iif(Trade_Price<(Bid_Price + Offer_Price)*0.5, 'S',iif(Trade_Price>(Bid_Price + Offer_Price)*0.5, 'B',char())) update t set Side = NULL where Bid_Price >= Offer_Price or Bid_Price <= 0 loadTable("dfs://EQY", "trade_side").append!(t) return t.size()}复制代码iif(condition, x, y) ...

December 22, 2020 · 2 min · jiezi

关于dolphindb:干货丨如何使用时序数据库处理Tushare金融数据

DolphinDB是新一代的时序数据库,不仅能够作为分布式数据仓库或者内存数据库来应用,而且自带丰盛的计算工具,能够作为钻研工具或钻研平台来应用,十分实用于量化金融、物联网等畛域的海量数据分析。量化金融畛域的不少问题,如交易信号钻研、策略回测、交易成本剖析、股票相关性钻研、市场危险管制等,都能够用DolphinDB来解决。 本教程将介绍如何把Tushare的沪深股票2008年到2017年的日线行情数据和每日指标数据导入到 DolphinDB database,并应用DolphinDB进行金融剖析。Tushare是金融大数据凋谢社区,领有丰盛的金融数据,如股票、基金、期货、数字货币等行情数据,为量化从业人员和金融相干钻研人员收费提供金融数据。 1. 数据详情Tushare提供的沪深股票日线行情数据蕴含以下字段: 名称 形容ts_code 股票代码trade_date 交易日期open 开盘价high 最高价low 最低价close 收盘价pre_close 昨收价change 涨跌额pct_change 涨跌幅vol 成交量(手)amount 成交额(千元)每日指标数据蕴含以下字段: 名称 形容ts_code 股票代码trade_date 交易日期close 收盘价turnover_rate 换手率turnover_rate_f 换手率(自在流通股)volume_ratio 量比pe 市盈率(总市值/净利润)pe_ttm 市盈率(TTM)pb 市净率(总市值/净资产)ps 市销率ps_ttm 市销率(TTM)total_share 总股本(万)float_share 流通股本(万)free_share 自在流通股本(万)total_mv 总市值(万元)cric_mv 流通市值(万元)2. 创立DolphinDB数据库2.1 装置DolphinDB 从官网下载DolphinDB安装包和DolphinDB GUI. DolphinDB单节点部署请参考单节点部署。 DolphinDB单服务器集群部署请参考单服务器集群部署。 DolphinDB多物理服务器部署请参考多服务器集群部署。 2.2 创立数据库 咱们能够应用database函数创立分区数据库。 语法:database(directory, [partitionType], [partitionScheme], [locations]) 参数 _directory:_数据库保留的目录。DolphinDB有三种类型的数据库,别离是内存数据库、磁盘上的数据库和分布式文件系统上的数据库。创立内存数据库,directory为空;创立本地数据库,directory应该是本地文件系统目录;创立分布式文件系统上的数据库,directory应该以“dfs://”结尾。本教程应用分布式文件系统上的数据库。 _partitionType:_分区形式,有6种形式: 程序分区(SEQ),范畴分区(RANGE),哈希分区(HASH),值分区(VALUE),列表分区(LIST),复合分区(COMPO)。 _partitionScheme:_分区计划。各种分区形式对应的分区计划如下: 导入数据前,要做好数据的分区规划,次要思考两个因素:分区字段和分区粒度。 在日常的查问剖析中,依照日期查问的频率最高,所以分区字段为日期trade_date。如果一天一个分区,每个分区的数据量过少,只有3000多条数据,不到1兆大小,而且分区数量十分多。分布式系统在执行查问时,会把查问语句分成多个子工作发送到不同的分区。这样的分区形式会导致子工作数量十分多,而每个工作执行的工夫极短,零碎在治理工作上消耗的工夫反而大于工作自身的执行工夫,显著这样的分区形式是不合理。这种状况下,咱们按日期范畴进行分区,每年的1月1日到次年的1月1日为一个分区,这样既能晋升查问的效率,也不会造成分区粒度过小。 现有数据的时间跨度是2008-2017年,然而为了给将来的数据留出足够的空间,咱们把工夫范畴设置为2008-2030年。执行以下代码: yearRange=date(2008.01M + 12*0..22)因为日线行情和每日指标数据的分区计划雷同,因而把它们寄存在同一个数据库dfs://tushare的两个表中,hushen_daily_line用于寄存日线行情数据,hushen_daily_indicator用于寄存每日指标数据。如果须要应用内存数据库,创立数据库时把_directory_设为空;如果须要应用磁盘上的数据库,把_directory_设置为磁盘目录即可。创立数据库的代码如下: login("admin","123456")dbPath="dfs://tushare"yearRange=date(2008.01M + 12*0..22)if(existsDatabase(dbPath)){ dropDatabase(dbPath)}columns1=`ts_code`trade_date`open`high`low`close`pre_close`change`pct_change`vol`amounttype1=`SYMBOL`NANOTIMESTAMP`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLEdb=database(dbPath,RANGE,yearRange)hushen_daily_line=db.createPartitionedTable(table(100000000:0,columns1,type1),`hushen_daily_line,`trade_date)columns2=`ts_code`trade_date`close`turnover_rate`turnover_rate_f`volume_ratio`pe`pr_ttm`pb`ps`ps_ttm`total_share`float_share`free_share`total_mv`circ_mvtype2=`SYMBOL`NANOTIMESTAMP`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLEhushen_daily_indicator=db.createPartitionedTable(table(100000000:0,columns2,type2),`hushen_daily_indicator,`trade_date)3. 应用Python API把数据导入到DolphinDBTushare提供了两种罕用的数据调取形式: ...

December 21, 2020 · 4 min · jiezi

关于dolphindb:数据库交易回测系列二多因子Alpha策略回测

本系列文章将会介绍如何应用DolphinDB优雅而高效的实现量化交易策略回测。本文将介绍在华尔街广泛应用的多因子Alpha策略的回测。多因子模型是量化交易选股中最重要的一类模型,基本思路是找到某些和回报率最相干的指标,并依据这些指标,构建股票投资组合(做多正相干的股票,做空负相关的股票)。多因子模型中,独自一个因子的个股权重个别实现多空平衡(市场中性),没有裸露市场危险的头寸(beta为0,所以称之为alpha策略),能实现相对收益。多个因子之间互相正交,不便策略配置,实现回报和危险的最优控制。另外,相比于套利策略(通常能够实现更高的sharpe ratio,然而scale不好),多因子alpha策略有很好的scale,能够配置大量的资金。多因子Alpha策略在对冲基金中的应用十分广泛。 1. 生成因子 本文的重点是实现多因子Alpha策略的回测框架。因子不是重点,这部分通常由金融工程师或策略分析师来实现。为了不便大家了解,文章以动量因子、beta因子、规模因子和稳定率因子4个罕用的危险因子为例,介绍如何在 DolphinDB database 中实现多因子回测。 输出数据表inData蕴含6个字段:sym (股票代码), date(日期), close (收盘价), RET(日回报), MV(市值), VOL(交易量) def genSignals(inData){ USstocks = select sym, date, close, RET, MV from inData where weekday(date) between 1:5, close>5, VOL>0, MV>100000 order by sym, date update USstocks set prevMV=prev(MV), cumretIndex=cumprod(1+RET), signal_size=-sqrt(MV), signal_vol=-mstd(RET, 21)*sqrt(252) context by sym update USstocks set mRet = wavg(RET, prevMV) context by date update USstocks set signal_mom = move(cumretIndex,21)/move(cumretIndex,252)-1, signal_beta=mbeta(RET, mRet, 63) from USstocks context by sym return select sym, date, close, RET as ret, signal_size, signal_beta, signal_vol, signal_mom from USstocks where date>=1991.01.01}DolphinDB函数阐明: ...

December 17, 2020 · 4 min · jiezi

关于dolphindb:时序数据库交易回测系列一技术信号回测

本系列文章将会介绍如何应用DolphinDB进行交易回测。本文以挪动平均线指标为例,介绍如何在DolphinDB中实现技术信号回测。挪动平均线指标(Moving average,简称MA)属于趋势指标。在金融剖析畛域,挪动平均线是不可短少的指标工具。除了批示趋势,均线指标还能防止因为股价上涨错失清仓的机会,缩小收益的损失,及时止损,也能防止股价上涨错失买入的理论,从而取得更高的收益。 回测过程中,咱们思考两种状况:不止损回测和止损回测。 数据表须要蕴含以下字段: 股票代码:sym 日期:date 收盘价格:close 1. 定义MA信号当短期均线大于长期均线时,咱们认为这是一个MA交易信号。 def maSignal(x, shortHorizon, longHorizon){ signal = mavg(x, shortHorizon) > mavg(x, longHorizon) signal[0:min(x.size(), longHorizon - 1)] = NULL return signal}2. 不止损回测咱们定义的交易算法如下: 假如前一天的MA信号为prevSignal,当天的MA信号为signal。 (1)如果prevSignal=false,signal=true,那么买入多头头寸(long position)。 (2)如果prevSignal=true,signal=false,那么卖出空头头寸(short position)。 (3)如果不合乎以上两种状况,则放弃与前一天雷同的头寸。 def backtest(t){ t2 = select sym,date,close,prev(close) as prevClose,signal, prev(signal) as prevSignal from t context by sym update t2 set position=iif(prevSignal==false and signal==true, 1 ,iif(prevSignal==true and signal==false, -1, int())).prev().ffill() context by sym return select sym,date,close,signal,position,position*(close - prevClose) as pnl from t2 where isValid(position)}DolphinDB函数阐明: ...

December 16, 2020 · 2 min · jiezi

关于dolphindb:干货丨时序数据库分区教程二

时序数据库分区教程(一)介绍了DolphinDB Database 的几种分区形式,本文将会具体解说DolphinDB的分区准则、非凡的分区计划,让用户对DolphinDB分区数据库有更深刻的理解。 1.分区准则分区的总准则是让数据管理更加高效,进步查问和计算的性能,达到低延时和高吞吐量。 1.1 抉择适合的分区字段 DolphinDB分区字段的数据类型能够是整型、日期类型和SYMBOL类型。留神,STRING、FLOAT和DOUBLE数据类型不能够作为分区字段。 尽管DolphinDB反对TIME、SECOND、DATETIME类型字段的分区,然而在理论应用中要审慎应用,防止采纳值分区,免得分区粒度过细,将大量工夫消耗在创立或查问几百上千万个只蕴含几条记录的文件目录。 分区字段该当是在业务中相当重要的。例如在证券交易畛域,许多工作都与股票交易日期或股票代码相干,因而应用这两个字段来分区比拟正当。 1.2 分区粒度不要过大 DolphinDB单个分区反对最大记录条数是20亿条。但正当的记录条数应该远远小于这个数。一个分区内的多个列以文件模式独立存储在磁盘上,通常数据是通过压缩的。应用的时候,零碎从磁盘读取所须要的列,解压后加载到内存。如果分区粒度过大,可能会造成多个工作线程并行时内存不足,或者导致系统频繁地在磁盘和工作内存之间切换,影响性能。一个教训公式是,数据节点的可用内存是S,工作线程(worker)的的数量是W,则倡议每个分区解压后在内存中的大小不超过S/8W。假如工作内存下限32GB,8工作线程,倡议单个分区解压后的大小不超过512MB。 DolphinDB的子工作以分区为单位。因而分区粒度过大会造成无奈无效利用多节点多分区的劣势,将原本能够并行计算的工作转化成了程序计算工作。 DolphinDB是为OLAP的场景优化设计的,反对增加数据,不反对对个别行进行删除或更新。如果要批改数据,以分区为单位笼罩全副数据。如果分区过大,升高效率。DolphinDB在节点之间复制正本数据时,同样以分区为单位,分区过大,不利于数据在节点之间的复制。 综上各种因素,倡议一个分区未压缩前的原始数据大小管制在100M~1G之间。当然这个数字可结合实际状况调整。譬如在大数据利用中,咱们常常看到宽表设计,一个表白到几百个字段,然而在单个利用中只会应用一部分字段。这种状况下,能够适当放大下限的范畴。 如果发现分区粒度过大,能够采纳几种办法,(1)采纳组合分区(COMPO),(2)减少分区个数,(3)将范畴分区改为值分区。 1.3 分区粒度不要过小 分区粒度过小,一个查问和计算作业往往会生成大量的子工作,这会减少数据节点和管制节点,以及管制节点之间的通信和调度老本。分区粒度过小,也会造成很多低效的磁盘拜访(小文件读写),造成零碎负荷过重。另外,所有的分区的元数据都会驻留在管制节点的内存中。分区粒度过小,分区数过多,可能会导致管制节点内存不足。咱们倡议每个分区未压缩前的数据量不要小于100M。 譬如股票的高频交易数据若按交易日期和股票代码的值做组合分区,会导致许多极小的分区,因为许多交易不沉闷的股票的交易数据量太少。如果将股票代码的维度依照范畴分区的办法来切分数据,将多个交易不沉闷的股票组合在一个分区内,则能够无效解决分区粒度过小的问题,进步零碎的性能。 2.如何把数据平均分区当各个分区的数据量差别很大时,会造成零碎负荷不平衡,局部节点工作过重,而其余节点处于闲置期待状态。当一个工作有多个子工作时,只有最初一个子工作实现了,才会把后果返回给用户。因为一个子工作对应一个分区,如果数据分布不平均,可能会增大作业延时,影响用户体验。 为了不便依据数据的散布进行分区,DolphinDB提供了一个十分有用的函数cutPoints(X, N, [freq])。X是一个数据,N示意产生的分组数,freq是与X等长的数组,每个元素对应X中元素呈现的频率。这个函数返回具备(N+1)个元素的数组,使得X中的数据平均地散布在N个组中。 上面的例子中,须要对股票的报价数据按日期和股票代码两个维度做数据分区。如果简略的按股票的首字母进行范畴分区,极易造成数据分布不均,因为极少量的股票代码以U, V, X,Y,Z等字母结尾。倡议应用cutPoints函数依据样本数据来划分分区。 1. // 将2007.08.01这天数据导入 2. t = ploadText(WORK_DIR+"/TAQ20070801.csv") 4. // 抉择2007.08.01这天数据的股票代码的散布来计算分组规定 5. t=select count(*) as ct from t where date=2007.08.01 group by symbol 7. // 依照股票代码字母程序产生128个区间。每个区间外部的数据行数在2007.08.01这天是相当的。 8. buckets = cutPoints(t.symbol, 128, t.ct) 10. // 最初一个区间的完结边界由2007.08.01的数据决定。为排除2007.08.01之后之后有新的将最初一个区间的完结边界替换成不会呈现的最大的股票代码。 11. buckets[size(buckets)-1] = `ZZZZZ 13. //buckets的后果如下: 14. //["A",'ABA','ACEC','ADP','AFN','AII','ALTU','AMK',..., 'XEL','XLG','XLPRACL','XOMA','ZZZZZ'] 16. dateDomain = database("", VALUE, 2017.07.01..2018.06.30) 17. symDomain = database("", RANGE, buckets) 18. stockDB = database("dfs://stockDBTest", COMPO, [dateDomain, symDomain]) 除了应用范畴分区的办法,列表分区也是解决数据分布不平均的无效办法。 ...

December 15, 2020 · 2 min · jiezi

关于dolphindb:干货丨时序数据库分区教程一

1.为什么对数据进行分区?对数据库进行分区能够极大的升高零碎响应提早同时进步数据吞吐量。具体来说,分区有以下几个益处: 分区使得大型表更易于治理。对数据子集的保护操作也更加高效,因为这些操作只针对须要的数据而不是整个表。一个好的分区策略将通过只读取满足查问所需的相干数据来缩小要扫描的数据量。当所有的数据都在同一个分区上,对数据库的查问,计算,以及其它操作都会被限度在磁盘拜访IO这个瓶颈上。分区使得零碎能够充分利用所有资源。一个良好的分区计划搭配并行计算,分布式计算就能够充分利用所有节点来实现通常要在一个节点上实现的工作。 当一个工作能够拆分成几个扩散的子工作,每个子工作拜访不同的分区,就能够达到晋升效率的目标。分区减少了零碎的可用性。因为分区的正本通常是寄存在不同的物理节点的。所以一旦某个分区不可用,零碎仍然能够调用其它正本分区来保障作业的失常运行。2.分区形式DolphinDB database反对多种分区形式: 范畴分区(RANGE),哈希分区(HASH),值分区(VALUE),列表分区(LIST),复合分区(COMPO)。 范畴分区每个区间创立一个分区,是最罕用的也是举荐的一种分区形式。能够把数值在一个区间内的所有记录搁置到一个分区。哈希分区利用哈希函数对分区列操作,不便建设指定数量的分区。值分区每个值创立一个分区,例如股票交易日期,股票交易月。列表分区是依据用户枚举的列表来进行分区,比值分区更加灵便。复合分区实用于数据量特地大而且查问常常波及两个或以上的分区列。每个分区抉择都能够采纳区间,值或列表分区。例如按股票交易日期进行值分区, 同时按股票代码进行范畴分区。咱们能够应用database函数创立数据库。 语法:_database(directory, [partitionType], [partitionScheme], [locations])_ 参数 _directory:_数据库保留的目录。DolphinDB有三种类型的数据库,别离是内存数据库、磁盘上的数据库和分布式文件系统上的数据库。创立内存数据库,directory为空;创立本地数据库,directory应该是本地文件系统目录;创立分布式文件系统上的数据库,directory应该以“dfs://”结尾。本教程以创立Windows本地数据库为例。 _partitionType:_分区形式,有5种形式: 范畴分区(RANGE),哈希分区(HASH),值分区(VALUE),列表分区(LIST),复合分区(COMPO)。 _partitionScheme:_分区计划。各种分区形式对应的分区计划如下: _locations:_指定每个分区所在的节点地位。如果是分布式文件系统的数据库或者复合分区(COMPO)类型的数据库,不能应用locations参数。 2.1 范畴分区 范畴分区是由分区向量决定。分区向量示意区间,蕴含起始值,不蕴含结尾值。 在上面的例子中,数据库db有两个分区:[0,5)和[5,10)。应用函数append!在数据库db中保留表t为分区表pt,并应用ID作为分区列。 n=1000000ID=rand(10, n)x=rand(1.0, n)t=table(ID, x)db=database("dfs://rangedb", RANGE, 0 5 10)pt = db.createPartitionedTable(t, `pt, `ID)pt.append!(t);pt=loadTable(db,`pt)select count(x) from pt 2.2 哈希分区 哈希分区对分区列应用哈希函数以产生分区。哈希分区是产生指定数量的分区的一个简便办法。然而要留神,哈希分区不能保障分区的大小统一,尤其当分区列的值的散布存在偏态的时候。此外,若要查找分区列上一个间断区域的数据时,哈希分区的效率比区域分区或值分区要低。 在上面的例子中,数据库db有两个分区。应用函数append!在数据库db中保留表t为分区表pt,并应用ID作为分区列。 n=1000000ID=rand(10, n)x=rand(1.0, n)t=table(ID, x)db=database("dfs://hashdb", HASH, [INT, 2])pt = db.createPartitionedTable(t, `pt, `ID)pt.append!(t);pt=loadTable(db,`pt)select count(x) from pt 2.3 值分区 值分区用一个值代表一个分区。上面的例子定义了204个分区。每个分区示意2000年1月到2016年12月之间的一个月。 n=1000000month=take(2000.01M..2016.12M, n)x=rand(1.0, n)t=table(month, x)db=database("dfs://valuedb", VALUE, 2000.01M..2016.12M)pt = db.createPartitionedTable(t, `pt, `month)pt.append!(t)pt=loadTable(db,`pt)select count(x) from pt ...

December 14, 2020 · 1 min · jiezi

关于dolphindb:时序数据库作为量化金融研究平台的优势在哪里

大数据下 金融行业面临的四大痛点 以后整个金融市场环境日趋严厉,监管越来越严,无论是银行的批发、公司、交易或同业业务,都须要直面营销与危险的效率与准确率的问题。越来越多的金融机构都心愿依附大数据来拉动业务模式进行翻新,然而因为行业特点,存在着四大痛点。 第一个痛点是数据起源多样化,须要整合后剖析。金融行业的数据起源通常蕴含三大类:业务信息数据、行为数据和第三方数据。这些起源的数据包含结构化数据和非结构化的数据,在进行数据分析时通常须要进行肯定水平的整合,例如客户信息与客户行为数据的整合,企业外部交易信息与上下游单干企业的交易信息的整合等等。 第二个痛点是技术和业务人员各司其职,部门合作老本高。金融行业的企业通常有专门的信息中心来进行数据的治理,这些技术人才通常精通数据分析技术,但对业务中波及到的各种指标并不相熟。业务管理人员则正好相同,精通业务指标的使用,但对数据分析技术难以把握。这种场景经常导致一个剖析报告的制作须要多个部门间重复沟通,期间的工夫、人员老本微小。 第三个痛点是金融行业数据量级大,剖析性能要求高。家喻户晓,金融行业的数据量级大,通常总存储量达到TB级别,而单次计算数据量也在GB级别,大数据量下的数据分析性能很难失去保障。 第四个痛点是数据安全问题,数据权限粒度细。金融行业数据安全的重要性显而易见,对数据权限的要求从权限的调配,到数据的访问控制,都有很粗疏的标准,在进行数据分析时须要兼顾数据权限的管制。 接下来咱们以时序数据库DolphinDB database为例子,来为大家剖析时序数据库在面对金融大数据时的劣势。DolphinDB不仅能够当作分布式数据仓库或者内存数据库来应用,而且自带丰盛的计算工具,能够作为一个钻研工具或钻研平台来应用,适宜量化金融、物联网等畛域的海量数据分析。 1. 疾速的数据荡涤数据荡涤是数据分析实际中最重要也是最耗时的一环。DolphinDB的脚本语言反对多范式编程,包含命令式编程、向量化编程、函数化编程、SQL编程、RPC编程以及元编程,表达能力十分强,代码非常简洁,可疾速实现对蕴含缺省值的数据处理,面板数据的解决,数据表的透视,多个数据表的惯例连贯和非同步连贯。对于字符串和日期类型的数据,零碎提供了大量的内置函数,不便解决。尤其面对海量数据时,DolphinDB提供了十分高效的分布式解决方案。更值得一提的是,大部分解决方案能够通过SQL语句和自定义函数来实现。 2. 高效的数据导入数据分析时常常须要集成多个数据源。DolphinDB database 内置对文本文件,HDF5以及ODBC数据源的数据导入。导入工具能自动识别源数据的字段类型,包含对各种日期和工夫类型的辨认,也能够依照用户指定的数据类型进行导入。DolphinDB反对数据的并行导入,具备十分高的效率。以文本文件导入为例,性能是Pandas的10倍多。 3. 交互式剖析钻研是一个一直试错和求真的过程。交互式剖析能够大大提高研发的效率。DolphinDB采纳列式存储,充沛的利用内存,对工夫序列数据进行大量优化,分区机制灵便高效,性能相比MPP数据仓库胜出一个数量级。即使面对TB级的数据,仍能够轻松实现秒级毫秒级的低延时,非常适合交互式的数据分析。 4. 反对库内剖析DolphinDB不仅仅是一个分布式时序数据库,它还自带弱小的计算性能。除了数据检索和解决,DolphinDB还内置根本的数据分析和建模性能,包含机器学习中罕用的回归、分类等功能模块。特地值得一提的是,很多计算,能够间接在分布式数据表上实现。并行计算和分布式计算不仅放慢了运算过程,而且让数据科学家免去了将海量数据从一个零碎转移到另一个零碎的麻烦。 5. 丰盛的编程接口钻研往往会用到多种数据分析和建模工具。DolphinDB提供了Java,C#,Python,R,JSON等编程语言的接口。DolphinDB也提供了Excel的add-in插件,反对Excel和DolphinDB之间的双向数据交换。当DolphinDB无奈提供用户心愿的剖析和建模工具时,能够将荡涤过的数据导出到用户相熟的编程语言或工具,解决完的后果再传回DolphinDB。 6. 易用易保护DolphinDB从一开始就是为数据科学家和数据分析师设计的。零碎简略易用,没有专职IT团队的帮助,数据科学家也能够独立实现工作。DolphinDB尽管蕴含了数据仓库,内存数据库,分布式文件系统,分布式计算框架,流计算框架等多种性能,但外围零碎十分轻型,只有一个20几兆的可执行程序,复制到指定目录即可应用。DolphinDB能够依据数据规模的大小,部署在单个笔记本和台式机上,或者本地和云端的集群,反对Windows和Linux操作系统。DolphinDB的工作语言是即写即用的脚本语言。在一个节点上编写的自定义函数或脚本,无需编译、打包和部署,即可在整个集群中应用。这些都有利于进步研发人员的工作效率。 7. 生产环境代码重用钻研通常是在离线数据集上进行。当搬到生产环境时,出于工程、效率或者数据集的变动,往往会重写代码。譬如有些量化金融团队,会应用Matlab或Python做钻研,而后用C++重写交易系统的代码。DolphinDB除了反对离线计算,也提供了一个很高性能的实时(流)计算框架。用户在钻研环节的写的局部代码,能够在生产环境中重用。 8. 集成开发工具不便钻研DolphinDB自带的Java GUI是一个功能强大的集成开发工具(IDE),能够用于组织一个大型钻研我的项目的代码。IDE反对交互式的代码运行。用户能够不便的察看和比拟内存中的变量以及数据表(包含分布式数据表)中的数据,查找问题。IDE反对图形化的数据显示,让试验后果更加直观,易于了解。IDE的编辑器反对函数名称和函数参数的主动提醒,能够加重数据分析人员的学习老本。 欢送拜访官网并下载DolphinDB试用版 举荐专栏:DolphinDB和量化金融、DolphinDB和物联网

December 11, 2020 · 1 min · jiezi

关于dolphindb:Grafana如何连接DolphinDB

Grafana是一个开源的基于web的数据展现工具,十分善于做时序数据的动静展现。DolphinDB作为新一代的高性能时序数据库,不仅提供了Grafana的数据接口,还提供了Grafana的dolphindb-datasource插件。只有在Grafana中装置dolphindb-datasource,就能够通过图表的形式把DolphinDB Table的数据展现在Web上,特地实用于物联网中的实时性能监控、阈值预警和实时数据分析。 本教程将会介绍Grafana如何连贯DolphinDB,把DolphinDB的数据展现在Web上。 1.装置并启动DolphinDB 用户能够间接到官网下载DolphinDB(0.8及以上版本)试用版。 2.装置并启动Grafana 用户能够间接到Grafana官网下载安装Grafana,并依据官网文档启动Grafana。本教程以Grafana5.2.4为例,应用Grafana的默认配置。 3.装置dolphindb-datasource插件 3.1 从dolphindb/grafana-datasource下载插件源码. 3.2 把源码解压到Grafana的装置目录grafana-5.2.4/data/plugins下,并把文件夹名称改为dolphindb-datasource。留神,data目录在启动Grafana会主动生成。 3.3 重新启动Grafana。在浏览器地址栏中输出http://localhost:3000拜访Grafana。Grafana初始用户名和明码都是admin。登录之后,初始界面如下: 4.增加dolphindb datasource 点击“Add data source”进入增加datasource界面。 Name:datasource名称,本教程应用“test”。 Type:抉择dolphindb URL:输出DolphinDB datanode的地址,示例:http://localhost:8848 其余选项应用默认配置。点击“Save & Test”,DolphinDB datasource增加胜利。 5.数据展现 上面通过一个例子来介绍如何在Grafana中展现DolphinDB数据。 首先,在DolphinDB中创立内存表testTable,每隔1秒向表里写入数据,继续200秒。 n=100000t1=streamTable(n:0, `value`time,[DOUBLE,TIMESTAMP])share t1 as testTablet1=NULLdef writeData(){ for (i in 0:200) { data = table(rand(35..50,1) as value,now() as time) testTable.append!(data) sleep(1000) }}submitJob("jobId20180817001","writeDataToStreamingTable",writeData)在Grafana中点击左侧第二个按钮,进入如下界面: 点击“New dashboard”,进入增加dashboard界面。 抉择“Graph”,点击“Panel Title”,抉择“Edit”。 在Metrics Tab中,Data Source抉择“test”,Query中填写以下SQL语句来读取前5分钟的数据,并点击右上角保留按钮。 select gmtime(time) as time_sec,value as serie1 from testTable where time> now()-5*60*1000 ...

December 10, 2020 · 1 min · jiezi

关于dolphindb:干货丨大数据分析语言DolphinDB脚本语言概述

开发大数据利用,不仅须要能撑持海量数据的分布式数据库,能高效利用多核多节点的分布式计算框架,更须要一门能与分布式数据库和分布式计算有机交融、高性能易扩大、表达能力强、满足疾速开发和建模须要的编程语言。DolphinDB从风行的Python和SQL语言吸取了灵感,设计了大数据处理脚本语言。 提到数据库语言,咱们很容易想到规范的SQL语言。不同于规范的SQL,DolphinDB编程语言功能齐全,表达能力十分弱小,完满反对命令式编程、向量化编程、函数话编程、SQL编程、近程过程调用编程(RPC)和元编程等多种编程范式。DolphinDB编程语言的语法和表白习惯与Python和SQL十分类似,只有对Python和SQL有肯定的理解,就能轻松把握。相对而言,把握内存时序数据库kdb+的q语言难度要大得多。 DolphinDB的编程语言可能满足数据科学家疾速开发和建模的需要。DolphinDB语言简洁灵便,表达能力强,大大提高了数据科学家的开发效率。DolphinDB反对向量化计算和分布式计算,具备极快的运行速度。上面将具体介绍DolphinDB编程语言的独特之处。 1.命令式编程 与支流的脚本语言Python、JS等,还有强类型语言C、C++、Java等一样,DolphinDB也反对命令式编程。命令式编程是指通过执行一条一条的语句,实现最终目标。DolphinDB的命令式编程次要是用作下层模块的解决和调度。在大数据分析中,因为须要解决的数据量十分宏大,如果咱们采纳命令式编程逐行解决数据,效率会非常低下,性能也会有所降落。因而,咱们举荐在DolphinDB中应用其余编程形式来批量解决数据。 //DolphinDB反对对单变量和多变量进行赋值x = 1 2 3y = 4 5y += 2x, y = y, x //swap the value of x and yx, y =1 2 3, 4 5// 1到100累加求和s = 0for(x in 1:101) s += xprint s//数组中的元素求和s = 0;for(x in 1 3 5 9 15) s += xprint s//打印矩阵每一列的均值m = matrix(1 2 3, 4 5 6, 7 8 9)for(c in m) print c.avg()//计算product表中每一个产品的销售额t= table(["TV set", "Phone", "PC"] as productId, 1200 600 800 as price, 10 20 7 as qty)for(row in t) print row.productId + ": " + row.price * row.qty2.向量化编程 ...

December 10, 2020 · 5 min · jiezi

关于dolphindb:时序数据库在工业物联网中的应用

工业物联网的数据特点和痛点工业物联网的数据采集有着频率高、设施多、维度高的特点,数据量十分大,对系统的吞吐量有很高的要求。同时工业物联网往往须要零碎可能实时处理数据,对系统预警,监控,甚至反控。不少零碎还须要提供图形化终端供操作工人实时监控设施的运行,这给整个零碎带来了更大的压力。对于采集到的海量历史数据,通常还须要进行离线的建模和剖析。因而,工业物联网的数据平台有着十分刻薄的要求,既要有十分高的吞吐量,又要有较低的延时;既要可能实时处理流数据,又要可能解决海量的历史数据;既要满足简略的点查问的要求,又要满足批量数据简单剖析的要求。 传统的事务型数据库,比方SQL Server、Oracle和MySQL,无奈满足高吞吐量的数据写入和海量数据的剖析。即便数据量较小,能满足数据写入的要求,也不能同时响应实时计算的申请。 Hadoop生态提供了音讯引擎、实时数据写入、流数据计算、离线数据仓库、离线数据计算等多个部件。这些大数据系统组合起来,能够解决工业物联网的数据平台问题。但这样的计划过于宏大和臃肿,施行和运维的老本很高。 2.时序数据库的工业物联网解决方案 以DolphinDB为例,DolphinDB database 作为一个高性能的分布式时序数据库,为工业物联网的数据存储和计算提供了一个弱小的根底平台。 DolphinDB的分布式数据库能够不便的反对程度扩大和垂直扩大,零碎的吞吐量和反对的数据量能够近乎有限的扩大。DolphinDB的流计算引擎反对实时流计算解决。内置的聚合引擎能够按指定的工夫窗口大小和频率来计算各种聚合指标。聚合既能够是时间轴上(从高频到低频)的纵向聚合,也能够是多个维度的横向聚合。DolphinDB的内存数据库能够反对数据的疾速写入,查问和计算。例如聚合引擎的后果能够输入到一个内存表,承受前端BI(如Grafana)的的秒级轮询指令。DolphinDB集数据库、分布式计算和编程语言于一体,能够在库内疾速的实现简单的分布式计算,例如回归和分类。这大大放慢了海量历史数据的离线剖析和建模。DolphinDB也实现了与局部开源或商业化的BI工具的接口。不便用户可视化或监控设施数据。3.案例综述 企业的生产车间内总共有1000个传感设施,每个设施每10ms采集一次数据,为简化demo脚本,假如采集的数据仅有三个维度,均为温度。须要实现的工作包含: 将采集到的原始数据存入数据库。离线的数据建模须要用到这些历史数据。实时计算每个设施过来一分钟的平均温度指标,计算的频率为每两秒钟要进行一次。因为设施的操作工须要在最快的工夫内把握温度变动,所以前端展现界面每秒查问一次实时运算的后果并刷新温度变化趋势图。4.案例施行 4.1 零碎的功能模块设计 针对上述的案例,咱们首先要启用DolphinDB的分布式数据库,创立一个命名为iotDemoDB的分布式数据库用于保留采集的实时数据。数据库按日期和设施两个维度进行数据分区。日期采纳值分区,设施采纳范畴分区。日后清理过期数据,只有简略的删除旧的日期分区就可实现。 启用流数据公布和订阅性能。订阅高频数据流做实时计算。createStreamingAggregator函数能创立一个指标聚合引擎,用于实时计算。咱们在案例里指定计算窗口大小是1分钟,每2秒钟运算一次过往1分钟的温度均值,而后将运算后果保留到低频数据表中,供前端轮询。 部署前端Grafana平台展现运算后果的趋势图,设置每1秒钟轮询一次DolphinDB Server,并刷新展现界面。 4.2 服务器部署 在本次demo里,为了应用分布式数据库,咱们须要应用一个单机多节点集群,能够参考单机多节点集群部署指南。这里咱们配置了1个controller+1个agent+4个datanode的集群,上面列出次要的配置文件内容供参考: cluster.nodes: localSite,modelocalhost:8701:agent1,agentlocalhost:8081:node1,datanodelocalhost:8083:node2,datanodelocalhost:8082:node3,datanodelocalhost:8084:node4,datanode 因为DolphinDB零碎默认是不启用Streaming模块性能的,所以咱们须要通过在cluster.cfg里做显式配置来启用它,因为本次demo里应用的数据量不大,为了防止demo复杂化,所以这里只启用了node1来做数据订阅。 cluster.cfg: maxMemSize=2workerNum=4persistenceDir=dbcachemaxSubConnections=4node1.subPort=8085maxPubConnections=4 理论生产环境下,倡议应用多物理机集群,能够参考多物理机集群部署指南。 4.3 实现步骤 首先咱们定义一个sensorTemp流数据表用于接管实时采集的温度数据,咱们应用enableTablePersistence函数对sensorTemp表做长久化,内存中保留的最大数据量是100万行。 share streamTable(1000000:0,hardwareIdtstemp1temp2`temp3,[INT,TIMESTAMP,DOUBLE,DOUBLE,DOUBLE]) as sensorTempenableTablePersistence(sensorTemp, true, false, 1000000) 通过订阅流数据表sensorTmp,把采集的数据准实时的批量保留到分布式数据库中。分布式表应用日期和设施编号两个分区维度。在物联网大数据场景下,常常要革除过期的数据,这样分区的模式能够简略的通过删除指定日期分区就能够疾速的清理过期数据。subscribeTable函数最初两个参数控制数据保留的频率,只有订阅数据达到100万或工夫距离达到10秒才批量将数据写入分布式数据库。 db1 = database("",VALUE,2018.08.14..2018.12.20)db2 = database("",RANGE,0..10*100)db = database("dfs://iotDemoDB",COMPO,[db1,db2])dfsTable = db.createPartitionedTable(sensorTemp,"sensorTemp",tshardwareId)subscribeTable(, "sensorTemp", "save_to_db", -1, append!{dfsTable}, true, 1000000, 10) 在对流数据做分布式保留数据库的同时,零碎应用createStreamAggregator函数创立一个指标聚合引擎, 用于实时计算。函数第一个参数指定了窗口大小为60秒,第二个参数指定每2秒钟做一次求均值运算,第三个参数是运算的元代码,能够由用户本人指定计算函数,任何零碎反对的或用户自定义的聚合函数这里都能反对,通过指定分组字段hardwareId,函数会将流数据按设施分成1000个队列进行均值运算,每个设施都会按各自的窗口计算失去对应的平均温度。最初通过subscribeTable订阅流数据,在有新数据进来时触发实时计算,并将运算后果保留到一个新的数据流表sensorTempAvg中。 createStreamAggregator 参数阐明:窗口工夫,运算间隔时间,聚合运算元代码,原始数据输出表,运算后果输出表,时序字段,分组字段,触发GC记录数阈值。 share streamTable(1000000:0, timehardwareIdtempavg1tempavg2`tempavg3, [TIMESTAMP,INT,DOUBLE,DOUBLE,DOUBLE]) as sensorTempAvgmetrics = createStreamAggregator(60000,2000,<[avg(temp1),avg(temp2),avg(temp3)]>,sensorTemp,sensorTempAvg,ts,hardwareId,2000)subscribeTable(, "sensorTemp", "metric_engine", -1, append!{metrics},true) 在DolphinDB Server端在对高频数据流做保留、剖析的时候,Grafana前端程序每秒钟会轮询实时运算的后果,并刷新平均温度的趋势图。DolphinDB提供了Grafana_DolphinDB的datasource插件,对于Grafana的装置以及DolphinDB的插件配置请参考Grafana配置教程。 在实现grafana的根本配置之后,新增一个Graph Panel, 在Metrics tab里输出: select gmtime(time) as time, tempavg1, tempavg2, tempavg3 from sensorTempAvg where hardwareId = 1 这段脚本是选出1号设施实时运算失去的均匀温度表。 最初,启动数据模仿生成程序,生成模仿温度数据并写入流数据表。 数据规模: 1000 个设施,以每个点3个维度、10ms的频率生成数据,以每个维度8个Byte ( Double类型 ) 计算,数据流速是 24Mbps,继续100秒。 def writeData(){hardwareNumber = 1000for (i in 0:10000) {data = table(take(1..hardwareNumber,hardwareNumber) as hardwareId ,take(now(),hardwareNumber) as ts,rand(20..41,hardwareNumber) as temp1,rand(30..71,hardwareNumber) as temp2,rand(70..151,hardwareNumber) as temp3)sensorTemp.append!(data)sleep(10)}}submitJob("simulateData", "simulate sensor data", writeData) 点击这里下载残缺的demo脚本。

December 10, 2020 · 1 min · jiezi

关于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 symbolasof 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第一种办法的后果: ...

December 9, 2020 · 1 min · jiezi

关于dolphindb:如何在时序数据库中利用高频数据找到最相关的股票

在制订投资策略时,咱们往往会钻研股票之间的相关性。钻研个股的相关性或者个股与指数,ETF之间的相关性,从而通过对冲套利来取得稳固收益。找到最相干的股票,能够依据交易员的教训,也能够依据股票的相干信息(行业,beta,每日回报等)。 本文将介绍如何利用海量的高频数据寻找最相干的股票。 假如咱们有一个数据表quotes,蕴含以下字段: symbol:股票代码 date:日期 time:工夫 bid:买入价格 ofr:卖出价格 上面以纽约证券交易所2007年8月一个月实时报价数据的数据表quotes为例,计算股票在2007年8月1日的两两相关性。 抉择500只最具流动性的股票。留神,因为本文应用的是纽约证券交易所的数据集,所以收盘工夫是9:30-16:00。dateValue=2007.08.01num=500syms = (exec count(*) from quotes where date = dateValue, time between 09:30:00 : 15:59:59, 0<bid, bid<ofr, ofr<bid*1.2 group by Symbol order by count desc).Symbol[0:num]结构股票每分钟交易价格的矩阵。列示意股票,行示意分钟。priceMatrix = exec avg(bid + ofr)/2.0 as price from quotes where date = dateValue, Symbol in syms, 0<bid, bid<ofr, ofr<bid*1.2, time between 09:30:00 : 15:59:59 pivot by time.minute() as minute, Symbolexec和pivot by是DolphinDB编程语言的特点之一。exec与select的用法雷同,然而select子句生成的是表,exec子句生成的是向量。pivot by用于整顿维度,与exec一起应用时会生成一个矩阵。 ...

December 9, 2020 · 1 min · jiezi

关于dolphindb:如何用数据库实现动量交易策略详解

动量策略是最风行的量化策略之一。商品期货的CTA策略,绝大多数都是基于动量策略。在股票市场,动量策略也是罕用的量化因子之一。艰深地讲,动量策略就是“追涨杀跌”。上面咱们将介绍如何在DolphinDB中测试动量交易策略,并计算动量交易策略的累积回报。 DolphinDB database 是一款高性能分布式时序数据库。与其它通常的数据库不同,DolphinDB不仅能够存储和检索数据,而且具备弱小的编程和剖析性能,能够间接在数据库内实现策略回测等简单的工作,便捷且高效。 最罕用的股票动量因素是基于过来一年中扣除最近一个月的收益率。动量策略通常是一个月调整一次并且持有期也是一个月。本文的例子中,每天调整1/21的投资组合,并持有新的投资组合21天。为了简化起见,本文的回测没有思考交易成本。 假如原始数据是一个CSV文件。它蕴含以下列: PERMNO:股票代码 date:日期 PRC:每股价格 SHROUT:流通股数 RET:股票日收益 VOL:每日交易量 步骤1. 加载股票交易数据,对数据进行荡涤和过滤,而后为每只股票构建过来一年扣除最近一个月收益率的动量信号。 US = loadText("C:/DolphinDB/Data/US.csv")def loadPriceData(inData){ USstocks = select PERMNO, date, abs(PRC) as PRC, VOL, RET, SHROUT*abs(PRC) as MV from inData where weekday(date) between 1:5, isValid(PRC), isValid(VOL) order by PERMNO, date USstocks = select PERMNO, date, PRC, VOL, RET, MV, cumprod(1+RET) as cumretIndex from USstocks context by PERMNO return select PERMNO, date, PRC, VOL, RET, MV, move(cumretIndex,21)move(cumretIndex,252)-1 as signal from USstocks context by PERMNO }priceData = loadPriceData(US)步骤2. 为动量策略生成投资组合 ...

December 9, 2020 · 2 min · jiezi

关于dolphindb:最简最快的WorldQuant-101-Alpha因子实现

DolphinDB database 是一款高性能分布式时序数据库(time-series database),它特地实用于投资银行、对冲基金和交易所的定量查问和剖析,能够用于构建基于历史数据的策略测试。上面咱们将举例说明如何在DolphinDB中疾速构建简单的Alpha因子。 驰名论文 101 Formulaic Alphas 给出了世界顶级量化对冲基金之一的WorldQuant所应用的101个Alpha因子公式。很多集体和机构尝试用不同的语言来实现这101个Alpha因子。本文中,咱们例举了较为简单的Alpha #001和较为简单的Alpha #098两个因子的实现,别离应用了2行和4行DolphinDB SQL代码,堪称史上最简。 因子介绍 Alpha#001公式:rank(Ts_ArgMax(SignedPower((returns<0?stddev(returns,20):close), 2), 5))-0.5 Alpha #001的具体解读能够参考【史上最具体】WorldQuant Alpha 101因子系列#001钻研。 Alpha#98公式:(rank(decay_linear(correlation(vwap, sum(adv5,26.4719), 4.58418), 7.18088))- rank(decay_linear(Ts_Rank(Ts_ArgMin(correlation(rank(open), rank(adv15), 20.8187), 8.62571), 6.95668) ,8.07206))) 这两个因子在计算时候既用到了cross sectional的信息,也用到了大量工夫序列的计算。也即在计算某个股票某一天的因子时,既要用到该股票的历史数据,也要用到当天所有股票的信息,所以计算量很大。 须要的数据 输出数据为蕴含以下字段的table: symbol:股票代码 date:日期 volume:成交量 vwap:成交量的加权平均价格 open:收盘价格 close:收盘价格 在计算Alpha #001因子时,只须要股票代码、日期和收盘价格三个字段。 代码实现 def alpha1(stock){ t= select date,symbol ,mimax(pow(iif(ratios(close) < 1.0, mstd(ratios(close) - 1, 20),close), 2.0), 5) as maxIndex from stock context by symbol return select date,symbol, rank(maxIndex) - 0.5 as A1 from t context by date}def alpha98(stock){ t = select symbol, date, vwap, open, mavg(volume, 5) as adv5, mavg(volume,15) as adv15 from stock context by symbol update t set rank_open = rank(open), rank_adv15 = rank(adv15) context by date update t set decay7 = mavg(mcorr(vwap, msum(adv5, 26), 5), 1..7), decay8 = mavg(mrank(9 - mimin(mcorr(rank_open, rank_adv15, 21), 9), true, 7), 1..8) context by symbol return select symbol, date, rank(decay7)-rank(decay8) as A98 from t context by date }以上代码应用了DolphinDB的一些内置函数: ...

December 8, 2020 · 2 min · jiezi

关于dolphindb:DolphinDB与Elasticserach在金融数据集上的性能对比测试

Elasticsearch是一款十分风行的日志检索和剖析工具,尤其在实时性、扩展性、易用性和全文检索方面有着十分优异的综合体现。知乎上有一篇文章,Golion:降维打击!应用ElasticSearch作为时序数据库,并且获得了十分不错的成果。很多知乎用户不禁询问,Elasticsearch是否能够用于海量金融数据的存储和剖析? 为此咱们对DolphinDB和Elasticsearch在不同规模的金融数据集做了综合的比照测试。测试的内容包含I/O,磁盘空间占用,内存耗费,数据库查问(过滤查问和分组统计)4大项。测试后果没有意外,在金融数据处理畛域体现非常抢眼的时序数据库DolphinDB完胜Elasticsearch。 分组统计(聚合计算),DolphinDB的体现优于Elasticsearch 10倍左右,而且随着数据集的增大劣势更显著。特地的,当测试用例波及工夫类型字段时,DolphinDB的体现尤为突出。简略的过滤查问,DolphinDB的性能是Elasticsearch的100倍。在数据导入方面,Elasticsearch的耗时是DolphinDB的25~75倍,并且随着数据集增大,有变大的趋势。在磁盘空间占用上,DolphinDB做到了对原始数据的压缩,而Elasticsearch为了保护文档的索引等信息(不包含长期数据),在磁盘上占用了比原始数据更大的空间。总体差距在10倍左右。1. 零碎介绍1.1 DolphinDB简介DolphinDB database 是一款剖析型的分布式时序数据库,采纳列式存储,内置流数据处理引擎,并行计算和分布式计算引擎,并提供分布式文件系统,反对集群扩大。DolphinDB以C++编写,响应速度极快。提供类SQL和Python的脚本语言对数据进行操作。提供其它罕用编程语言的API,不便与已有应用程序集成。在金融畛域中的历史数据分析建模与实时流数据处理,以及物联网畛域中的海量传感器数据处理与实时剖析等场景中表现出色。 1.2 Elasticsearch简介Elasticsearch是一个基于Lucene的搜寻服务器,它是基于本地磁盘存储数据的分布式系统,并面向文档进行存储。它和传统的数据库有以下相似的比照关系: Relational DB =>Databases =>Tables => Rows => Columns Elasticsearch =>Indices=>Types=>Documents => Fields Elasticsearch集群能够蕴含多个索引(Indices),对应DolphinDB的数据库;每一个索引能够蕴含多个类型(Types),对应DolphinDB中的表;每一个类型蕴含多个文档(Documents),对应DolphinDB数据中的行;而后每个文档蕴含多个字段(Fields),对应DolphinDB中的列的概念。 2. 系统配置2.1 硬件配置本次测试的硬件配置如下: 设施:DELL OptiPlex 7060 CPU:Inter® Core™ i7-8700 CPU @ 3.20GHz,6外围12线程 内存:32GB 硬盘:2TB机械硬盘 操作系统:Ubuntu 16.04 x64 2.2 环境配置本次的测试环境为单服务器下的多节点集群。为了在单机环境下最大限度地施展出两者的性能,须要对DolphinDB以及Elasticsearch进行节点参数的设置。设置DolphinDB的数据节点的个数为4个,单个数据节点最大可用内存设置为7 GB。设置Elasticsearch的节点个数为4个,因为Elasticsearch基于Lucene,故须要调配肯定内存用于Lucene中的段被加载入内存中,这对Elasticsearch的性能也会造成很大的影响,本次测试调配8 GB内存给Lucene,并设置Elasticsearch中的单个节点的最大可用内存为6 GB,且禁止swapping。 3. 测试数据集为了更加全面地测试DolphinDB和Elasticsearch的性能,咱们应用了三个不同规模的股票数据集。数据表CN_Stock中蕴含了从2008.01.01到2017.12.31中国沪深股票的每日报价数据。数据表US_Prices中蕴含了从1990.01.02到2016.12.30美国股票市场的每日报价数据。数据表TAQ中蕴含了2007年8月份的4天美国股票市场level1的高频数据,共60.6 GB。测试数据集的详情如下表所示:测试数据集在DolphinDB和Elasticsearch中各个字段的数据类型如下所示: (1)CN_Stock表数据类型映射 (2)US_Prices表数据类型映射(3)TAQ表数据类型映射 4. 分区/分片计划DolphinDB提供了灵便的分区机制,包含值分区,范畴分区,列表分区,哈希分区和组合分区,而Elasticsearch仅反对基于哈希的分片机制。 在DolphinDB中,对于表CN_Stock,按工夫每半年作为一个分区,共分成了20个分区;对于表US_Prices,按工夫每年作为一个分区,共分成27个分区;对于表TAQ,采纳日期、股票代码组合分区形式,共100个分区。正本个数设置为1。 Elasticsearch仅容许定义分片的个数。对于表CN_Stock和表US_Prices,定义分片个数为4;对于表TAQ,定义分片个数为100。正本个数设置为1。 5. 比照测试咱们从数据库查问性能、I/O性能、磁盘占用空间、以及内存耗费等方面对DolphinDB和Elasticsearch进行了比照测试。 5.1 数据库查问性能测试DolphinDB脚本语言反对SQL语法,同时还在其根底上进行了肯定水平的扩大,性能更加弱小。而在Elasticsearch中,须要装置插件来进行SQL语句查问,同时也提供了基于JSON数据格式的DSL(Domain Specific Language特定畛域语言)语言来进行查问,本次测试采纳DSL语言。 Elasticsearch的次要利用场景为搜索引擎,它反对含糊查问,对于一般的query,Elasticsearch返回的查问hits默认仅为10条;对于聚合查问,其返回的buckets的默认大小也为10。而DolphinDB中每次查问返回的后果都是全副的后果,不存在含糊查问的状况。 在Elasticsearch的聚合查问中,返回后果中存在字段doc_count_error_upper_bound以及sum_other_doc_count,两者别离示意没有在这次聚合中返回、然而可能存在的潜在聚合后果以及这次聚合中没有统计到的文档数。这也很好的证实了Elasticsearch默认的对于数据查问操作仅仅只是对数据库中的局部数据进行含糊查问,而不是准确的查询数据库中的所有数据记录。为了将两者放在偏心的环境下进行测试,咱们须要敞开Elasticsearch的含糊查问,解决的形式是采纳Elasticsearch中的scroll接口以及定义buckets的大小来对管制Elasticsearch返回全副的查问后果。 在本次测试中,应用了DolphinDB脚本实现了DolphinDB的查问性能测试。应用了Python脚本+DSL来实现Elasticsearch的查问性能测试。 咱们对三张数据表进行了若干种罕用的SQL查问。为了减小偶尔因素对后果的影响,本次查问性能测试对每种查问操作均进行10次查问,而后对总工夫取平均值,工夫以毫秒为单位。各个测试数据集的测试脚本和后果如下表所示。 (1)CN_Stock表 DolphinDB中的查问脚本: ...

December 8, 2020 · 1 min · jiezi