民主化与砖的金融时间序列分析
2019年10月9日, 在工程的博客
介绍
数据科学家的作用,数据工程师和分析师金融机构包括(但不限于)保护数以百计的数十亿美元的价值和保护投资者的资产万亿美元的影响说,从一个闪电崩盘。最大的技术挑战之一根本尺度时间序列处理这些问题。蜱虫的数据,替代数据如地理空间或事务数据集,基本经济数据的丰富的数据源提供给金融机构,都是自然被时间戳。解决业务问题等财务风险,欺诈,和合规最终取决于能够聚合和并行分析成千上万的时间序列。老技术,RDBMS-based,不会轻易规模在分析交易策略或进行监管分析多年的历史数据。此外,许多现有的时间序列技术使用专业语言而不是标准的SQL或基于python api。
幸运的是,Apache火花™包含大量的内置功能,如窗口这自然截然不同时间序列的操作。此外,考拉,一个开源项目,允许您执行分布式机器学习查询通过Apache火花使用熟悉的熊猫语法,有助于扩展这个数据科学家和分析师。
在这个博客中,我们将展示如何构建时间序列功能并行成千上万的行情。接下来,我们将演示如何在当地的IDE和模块化的功能与砖连接创建丰富的时间序列特性集。最后,如果你是一个熊猫用户寻求规模数据准备向金融异常检测饲料或其他统计分析,我们使用一个市场操纵的例子来展示考拉使得对典型的数据扩展透明的科学工作流。
设置时间序列数据来源
让我们开始摄取一些传统金融时间序列数据集:交易和报价。我们模拟了这个博客的数据集,这是仿照数据收到贸易报告设施(交易)和全国最好的投标报价(NBBO)饲料(从纽约证券交易所等交易所)。你可以在这里找到一些示例数据:https://www.tickdata.com/product/nbbo/。
这篇文章通常假定基本财务条款;更广泛的引用,请参阅Investopedia文档。从下面的数据集是什么值得注意的是,我们分配了吗TimestampType
每一个时间戳,所以贸易执行时间和报价已经更名为改变时间event_ts
标准化的目的。此外,见完整的笔记本连接在这篇文章中,我们最终将这些数据集转换成三角洲格式以便我们确保数据质量并保持一个柱状的格式,这是最有效的交互式查询下面。
trade_schema = StructType ([StructField (“象征”StringType ()),StructField (“event_ts”TimestampType ()),StructField (“trade_dt”StringType ()),StructField (“trade_pr”倍增式())])
quote_schema = StructType ([StructField (“象征”StringType ()),StructField (“event_ts”TimestampType ()),StructField (“trade_dt”StringType ()),StructField (“bid_pr”,倍增式()),StructField (“ask_pr”倍增式())])
合并和聚合时间序列与Apache引发™
全球有超过六十万个公开交易的证券金融市场的今天。鉴于我们的贸易和引用数据集跨本卷的证券,我们需要一个工具,轻松尺度。因为Apache火花™提供了一个简单的API ETL标准引擎并行,这是我们的首选工具,合并和聚合标准指标进而帮助我们理解流动性,风险,和欺诈。我们将从交易的合并和报价,然后总交易数据集显示切片数据的简单方法。最后,我们将展示如何包这段代码分成类与砖连接更快的迭代开发。完整的代码用于以下指标的笔记本。
的连接
的连接是一种常用的“合并”技术,返回最新的正确值有效的左边时的时间戳。对于大多数时间序列分析、多种类型的时间序列连接在一起的符号来理解一个时间序列的状态(例如NBBO)在特定时间出现在另一个时间序列(如交易)。下面的例子记录的状态NBBO每贸易所有符号。如下图中看到,我们已经开始了最初的基本时间序列(交易)和合并NBBO数据集,以便每个时间戳的最新报价,并提供记录”的贸易。一旦我们知道最新的报价和报价,我们可以计算出不同(称为扩散)了解点什么流动性可能是低(大)传播。这种度量影响你如何组织你的交易策略来提高α。
首先,让我们使用内置的窗口函数去年找到最后一个非空引用值排序后的时间。
#示例代码里面加入方法#定义分区键为窗口partition_spec=Window.partitionBy (“象征”)#定义排序- - - - - -的ind_cd是一种键(报价交易之前)join_spec=partition_spec.orderBy (“event_ts”)。\rowsBetween(窗口。unboundedPreceding Window.currentRow)#使用last_value功能来得到最新有效的记录选择(去年(“收购”,真正的)。在(join_spec) .alias (“latest_bid”))
现在,我们把我们的自定义加入合并数据和附加报价。请看附呈的笔记本全部代码。
#应用定制的加入mkt_hrs_trades =交易。过滤器(坳(“象征”)= =“K”)mkt_hrs_trades_ts = base_ts (mkt_hrs_trades)quotes_ts =报价。过滤器(坳(“象征”)= =“K”)
显示器(mkt_hrs_trades_ts.join (quotes_ts))
标记VWAP反对贸易模式
我们上面合并技术,现在让我们专注于一个标准的聚合,即成交量加权平均价(VWAP),这是由体积加权平均价格。这个指标是这一趋势的风向标和价值的安全。的vwap
函数在我们包装类(在连接笔记本)显示,VWAP瀑布的交易价格高于或低于安全。特别是,我们现在可以确定时的窗口VWAP(橙色)低于贸易价格,表明股票超买。
trade_ts = base_ts (trades.select (“event_ts”的象征,“价格”点燃(One hundred.).alias (“体积”)))vwap_df = trade_ts。vwap(频率=“米”)显示器(vwap_df。过滤器(坳(符号)= =“K”)\。过滤器(坳(“time_group”).between (“09:30”,“点”))\.orderBy (“time_group”))
与砖连接更快的迭代开发
到目前为止,我们已经创建了一些基本包装一次性时间序列指标。然而,productionalization代码需要模块化和测试,这是最好的完成一个IDE。今年,我们介绍了砖连接为当地的IDE,提供的能力开发和提高经验测试集群对现场砖。砖连接金融分析的好处包括添加时间序列特性的能力在小测试数据与增加的灵活性来执行交互式火花查询多年的蜱虫历史数据验证功能。
我们使用PyCharm组织类包装PySpark所需功能生成丰富的时间序列特性集。这个IDE给我们代码完成,格式标准,和一个环境运行代码之前快速测试的类和方法。
https://www.youtube.com/watch?v=MkYAbqGDKA0
我们可以快速调试类然后运行引发代码直接从我们的笔记本电脑使用Jupyter笔记本加载本地类和执行互动查询和可伸缩的基础设施。控制台的窗格显示集群正在执行我们的工作与生活。
最后,我们得到了两个世界最好的东西通过我们当地的IDE,同时附加物化时序对我们最大的时间序列数据集。
利用市场操纵的考拉
熊猫API的标准工具,数据操作和分析在Python和深深融入到Python数据科学的生态系统,例如NumPy, SciPy matplotlib。大熊猫的一个缺点是它不容易扩展到大量数据。财务数据总是包括多年的历史数据,对聚合或合规风险分析至关重要。为了更方便,我们介绍了考拉作为一种利用熊猫api在执行引发的后端。自匹配熊猫考拉API,我们不牺牲易用性,和迁移是一个可伸缩的代码一行代码更改(见进口考拉在下一节中)。在我们展示考拉适合金融时间序列问题,让我们先从一些上下文特定金融欺诈的问题:前运行。
前运行时发生下列顺序:
- 的非公开信息交易公司意识到可能影响证券的价格
- 公司购买大量大宗订单(或大量的订单总额大骨料体积)
- 由于流动性的,证券价格上涨
- 该公司向投资者出售安全(从以前的购买)向上推动,使大量利润,迫使投资者付出更大的代价,即使非公开交易信息的安全
来源:CC0公共领域图片:https://pxhere.com/en/photo/1531985, https://pxhere.com/en/photo/847099
出于演示的目的,一个简单的例子使用农贸市场和一个苹果派业务在这里。这个例子展示了福瑞迪,一个跑步者意识到即将对苹果的需求需要苹果派全国企业和随后购买苹果农贸市场。实际上,这允许弗雷迪弗雷迪以来他的苹果溢价卖给买家造成重大影响通过购买任何其他买家之前(代表投资者)有机会购买产品。
检测运行前需要了解的订单流不平衡(见下面的图)。特别是,异常订单流不平衡将有助于确定windows运行期间前可能发生。
现在让我们使用考拉
解决方案来提高我们的生产力而操纵市场的问题。即,我们将关注以下订单流不平衡异常:
- 重复数据删除的事件在同一时间
- 滞后windows评估供应/需求增加
- 合并数据帧的总订单流不平衡
重复数据删除的时间序列
常用的时间序列数据清理涉及非难和重复数据删除。你可能会发现在高频数据重复的值(例如引用数据)。当有多个值每时间没有序列号,我们需要删除处理,后续的统计分析是有意义的。在下面的情况下,多个投标/问股票数量报告每一次,所以对于计算订单不平衡,我们要依靠一个值最大深度/时间。
进口databricks.koalas作为kskdf_src = ks.read_delta (“…”)grouped_kdf = kdf_src.groupby ([“event_ts”),as_index =假)。马克斯()grouped_kdf.sort_values (= [“event_ts”])grouped_kdf.head ()
时间序列与考拉窗口
我们删除处理时间序列,现在我们来看看窗户我们可以找到供给和需求。窗口的时间序列一般指观察切片或间隔时间。最潮流的计算(例如简单的移动平均线,)都使用时间窗口来执行计算的概念。熊猫考拉继承的简单接口获取滞后或铅值在一个窗口中使用转变
(类似于火花的滞后函数),如下显示。
grouped_kdf.set_index (“event_ts”,原地=真正的,下降=真正的)lag_grouped_kdf=grouped_kdf.shift(时间=1,fill_value=0)
lag_grouped_kdf.head ()
合并与考拉列运算时间戳和计算不平衡
现在我们已经滞后值计算,我们希望能够将这个数据集与原始时间序列的报价。下面,我们使用考拉合并
与我们的时间完成这个指数。这给我们统一视图需要供应/需求计算,导致我们的订单不平衡度规。
滞后= grouped_kdf。合并(lag_grouped_kdf,left_index=真正的right_index =真正的后缀= (”,“_lag”])滞后(“imblnc_contrib”)=滞后(“bid_shrs_qt”)*滞后(“incr_demand”)\——滞后“bid_shrs_qt_lag”)*滞后(“decr_demand”)\——滞后“ask_shrs_qt”)*滞后(“incr_supply”)\+滞后(“ask_shrs_qt_lag”)*滞后(“decr_supply”]
考拉NumPy拟合分布
我们最初的准备之后,是时候把我们的考拉数据帧格式用于统计分析。对于这个问题,我们可能总失衡的分钟或其他单位时间在继续之前,但是对于演示的目的,我们针对完整数据集运行股票“ITUB”。下面,我们我们的考拉结构转换为一个NumPy数据我们可以使用SciPy库来检测异常订单流不平衡。简单地使用to_numpy()语法分析的桥梁。
从scipy.stats进口t进口scipy.stats作为圣进口numpy作为npq_ofi_values =滞后(“imblnc_contrib”].to_numpy ()
下面,我们策划我们的订单流的分布失衡以及标记为5和第95百分位数识别事件中不平衡异常发生。看到完整的笔记本电脑代码以适应分布和创建这个阴谋。期间失衡我们与考拉只计算/ SciPy工作流将与潜在的实例运行前,市场操纵方案我们正在寻找。
下面的时间序列可视化会检索到的异常如上异常值,以橙色突出显示。在我们最后的可视化,我们使用情节
图书馆总结时间窗和频率异常的形式热图。具体来说,我们确定10:50:10——10:50:20时间作为一个潜在的问题区域从前面跑的视角。
结论
在本文中,我们已经演示了如何利用Apache火花和砖直接用于时间序列分析,通过使用窗口和包装器,并间接地使用考拉。大多数数据科学家依赖熊猫API,所以考拉帮助他们使用熊猫功能同时允许Apache火花的规模。使用火花和考拉的优点包括:时间序列分析
- 并行化的时间序列分析风险,欺诈,或合规管理用例的连接和简单的聚合
- 迭代的速度,创造丰富的时间序列特性与砖连接
- 手臂数据科学与考拉和量化团队规模数据准备而不牺牲熊猫易用性和api
试试这个笔记本今天在砖!联系我们,了解更多关于我们如BOB低频彩何帮助客户与金融时间序列的用例。