跳到主要內容
工程的博客

數字化金融時間序列分析

分享這篇文章

在數據庫試試這個筆記本

簡介

數據科學家、數據工程師和金融機構分析師的角色包括(但不限於)保護數以百計的數十億美元的資產價值和保護投資者免受萬億美元的影響比如閃電崩盤。這些問題背後最大的技術挑戰之一是縮放時間序列操作。蜱蟲的數據,替代數據地理空間數據或交易數據以及基本經濟數據等集合是金融機構可用的豐富數據源的示例,所有這些數據源都自然地按時間戳編製索引。解決金融領域的業務問題,如風險、欺詐和合規性,最終取決於能夠同時聚合和分析數千個時間序列。基於rdbms的舊技術在分析交易策略或對多年曆史數據進行監管分析時不容易擴展。此外,許多現有的時間序列技術使用專門的語言,而不是標準的SQL或基於python的api。

幸運的是,Apache Spark™包含大量內置功能,例如窗口,它自然地並行時間序列操作。此外,Koalas是一個開源項目,允許您通過Apache Spark使用熟悉的pandas語法執行分布式機器學習查詢,有助於將這種能力擴展到數據科學家和分析師。

在這篇博客中,我們將展示如何在數十萬個股票代碼上並行構建時間序列函數。接下來,我們將演示如何在本地IDE中模塊化函數,並使用Databricks Connect創建豐富的時間序列特性集。最後,如果您是pandas用戶,希望將規模數據準備用於金融異常檢測或其他統計分析,我們使用市場操縱示例來展示Koalas如何使規模對典型的數據科學工作流程透明。

設置時間序列數據源

讓我們從兩個傳統的金融時間序列數據集開始:交易和報價。我們模擬了本博客的數據集,這些數據是根據從交易報告機構(交易)和全國最佳出價報價(NBBO) feed(來自紐約證券交易所等交易所)收到的數據建模的。你可以在這裏找到一些示例數據:https://www.tickdata.com/product/nbbo/

本文假設基本的金融術語;更多的參考文獻,請參閱Investopedia的文檔.從下麵的數據集中值得注意的是,我們分配了TimestampType到每個時間戳,因此交易執行時間和報價更改時間已重命名為event_ts為了標準化的目的。此外,正如本文所附的完整筆記本所示,我們最終將這些數據集轉換為Delta格式,以便我們確保數據質量並保持柱狀格式,這對於下麵的交互式查詢類型是最有效的。

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 Spark™合並和聚合時間序列

今天全球金融市場上有超過60萬種公開交易的證券。鑒於我們的交易和報價數據集涵蓋了這麼多證券,我們需要一個易於擴展的工具。因為Apache Spark™為ETL提供了一個簡單的API,並且它是並行化的標準引擎,所以它是我們合並和聚合標準度量的首選工具,從而幫助我們理解流動性、風險和欺詐。我們將從合並交易和報價開始,然後聚合交易數據集,以顯示分割數據的簡單方法。最後,我們將展示如何將這些代碼打包到類中,以便使用Databricks Connect進行更快的迭代開發。用於以下指標的完整代碼在附件筆記本中。

的連接

as-of連接是一種常用的“合並”技術,它返回在左側時間戳時生效的最新右值。對於大多數時間序列分析,多種類型的時間序列在符號上連接在一起,以了解一個時間序列(如NBBO)在另一個時間序列(如交易)中特定時間的狀態。下麵的例子記錄了所有符號的每筆交易的NBBO狀態。如下圖所示,我們從初始基本時間序列(交易)開始,並合並NBBO數據集,以便每個時間戳都記錄了截至交易時間的最新買入和賣出。他說,一旦我們知道了最新的買入價和賣出價,我們就可以計算出兩者之間的差異(即價差),從而了解在哪些點上流動性可能較低(由較大的價差表示)。這種指標會影響你如何組織你的交易策略來提高你的收益α

首先,讓我們使用內置的窗口函數最後的查找按時間排序後的最後一個非空引號值。

#內部示例代碼加入方法定義分區鍵窗口partition_specWindow.partitionBy (“象征”定義排序-的ind_cd排序鍵(交易前報價)join_specpartition_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 = quotes。過濾器(坳(“象征”) = =“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”))

使用Databricks Connect進行更快的迭代開發

到目前為止,我們已經為一次性時間序列指標創建了一些基本的包裝器。然而,代碼的生產需要模塊化和測試,這最好在IDE中完成。今年,我們介紹磚連接,它提供了本地IDE開發的能力,並增強了針對動態Databricks集群進行測試的體驗。Databricks Connect用於財務分析的好處包括在小型測試數據上添加時間序列特征的能力,以及對多年曆史滴答數據執行交互式Spark查詢以驗證特征的靈活性。

我們使用PyCharm組織包裝PySpark功能所需的類,以生成豐富的時間序列特性集。這個IDE為我們提供了代碼補全、格式化標準,以及在運行代碼之前快速測試類和方法的環境。

https://www.youtube.com/watch?v=MkYAbqGDKA0

我們可以快速調試類,然後直接在筆記本電腦上運行Spark代碼,使用Jupyter筆記本電腦加載本地類,並使用可擴展的基礎設施執行交互式查詢。控製台窗格顯示了針對活動集群執行的作業。

最後,我們通過使用本地IDE,同時在最大的時間序列數據集上附加到我們的實體化時間序列視圖,從而獲得兩全其美的效果。

利用考拉來操縱市場

pandas API是Python中數據操作和分析的標準工具,並被深度集成到Python數據科學生態係統中,例如NumPy, SciPy, matplotlib。pandas的一個缺點是它不容易擴展到大量數據。財務數據總是包含多年的曆史數據,這對於風險彙總或合規性分析至關重要。為了簡化這一點,我們引入了Koalas作為在後端執行Spark時利用pandas api的一種方式。因為Koalas API與Pandas匹配,所以我們不會犧牲易用性,並且遷移到可伸縮的代碼是一個很好的選擇一行代碼更改(請參見下一節導入考拉)。在我們展示考拉對金融時間序列問題的適應性之前,讓我們先了解一下金融欺詐中的一個特定問題:提前跑。

前跑發生在以下順序發生時:

  1. 交易公司了解可能影響證券價格的非公開信息
  2. 公司購買大量的訂單(或大量的訂單,總數量很大)
  3. 由於流動性的去除,證券價格上漲
  4. 該公司將證券出售給投資者(其價格已從上次購買中上漲),並獲得巨額利潤,迫使投資者支付更高的價格,即使證券交易的信息是非公開的

來源:CC0公共領域圖片:https://pxhere.com/en/photo/1531985, https://pxhere.com/en/photo/847099

為了說明目的,我們找到了一個使用農貿市場和蘋果派業務的簡單示例在這裏.這個例子展示了Freddy,一個跑步者,他意識到全國各地的蘋果派企業對蘋果的迫切需求,隨後在所有的農家市場購買蘋果。這實際上允許弗雷迪以溢價出售他的蘋果給買家,因為弗雷迪在其他買家(代表投資者)有機會購買產品之前購買了蘋果,造成了重大影響。

前置操作的檢測需要理解訂單流的不平衡(見下圖)。特別是,順序流不平衡的異常將有助於識別可能發生前流的窗口。

現在讓我們使用考拉包裝提高了我們的生產效率,同時解決了市場操縱問題。即,我們將重點從以下方麵來尋找有序流不平衡異常:

  • 同時對事件進行重複刪除
  • 評估供應/需求增長的滯後窗口
  • 合並數據幀以聚合訂單流失衡

時間序列去重複

常見的時間序列數據清理包括輸入和重複數據刪除。您可能會在高頻數據(如報價數據)中發現重複的值。當每次有多個沒有序列號的值時,我們需要重複數據刪除,以便後續的統計分析有意義。在下麵的例子中,每次報告多個買入/賣出股票數量,因此為了計算訂單不平衡,我們希望每次依賴一個最大深度值。

進口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 ()

時間序列窗口與考拉

我們已經重複了時間序列,現在我們來看看窗口,這樣我們就能找到供給和需求。時間序列的窗口化通常指的是查看切片或時間間隔。大多數趨勢計算(例如簡單移動平均)都使用時間窗口的概念來執行計算。Koalas繼承了簡單的pandas界麵,用於在窗口中使用滯後或領先值轉變(類似於Spark的延遲函數),如下所示。

grouped_kdf.set_index (“event_ts”,原地真正的下降真正的lag_grouped_kdfgrouped_kdf.shift(時間1, fill_value0
              lag_grouped_kdf.head ()

合並時間戳和計算不平衡與考拉列算術

現在我們已經計算了延遲值,我們希望能夠將這個數據集與原始報價時間序列合並。下麵,我們使用考拉合並用我們的時間索引來完成這個任務。這給了我們一個統一的觀點,我們需要進行供應/需求計算,從而導致我們的訂單不平衡度量。

lag = 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”的完整數據集運行。下麵,我們將Koalas結構轉換為NumPy數據集,這樣我們就可以使用SciPy庫來檢測順序流不平衡中的異常。隻需使用to_numpy()語法來橋接這個分析。

scipy.stats進口t進口scipy.stats作為進口numpy作為npQ_ofi_values =滯後[“imblnc_contrib”] .to_numpy ()

下麵,我們繪製了訂單流不平衡的分布,以及第5和第95百分位的標記,以確定發生不平衡異常的事件。請參閱完整的筆記本以獲得適合分布並創建此圖的代碼。我們剛剛用koalas/SciPy工作流計算的不平衡期間的時間將與我們正在尋找的市場操縱計劃的潛在搶先操作實例相關。

下麵的時間序列可視化將檢索到的異常值精確定位為上麵的異常值,並以橙色突出顯示。在最後的可視化中,我們使用情節庫中總結時間窗口和頻率異常的形式為熱圖。具體來說,我們確定10:50:10 - 10:50:20從前麵運行的角度來看,時間框架是一個潛在的問題區域。

結論

在本文中,我們展示了如何利用Apache Spark和Databricks直接(通過窗口和包裝器)和間接(通過使用Koalas)進行時間序列分析。大多數數據科學家依賴pandas API,因此Koalas幫助他們使用pandas功能,同時允許Apache Spark的規模。使用Spark和Koalas進行時間序列分析的優點包括:

  • 使用as-of連接和簡單聚合來並行分析您的時間序列的風險、欺詐或遵從性用例
  • 迭代更快,創建豐富的時間序列功能與Databricks連接
  • 用Koalas武裝您的數據科學和量化團隊,在不犧牲易用性和api的情況下擴展數據準備

試試這個筆記本今天在Databricks !聯係我們,了解更多關於我們如何協助客戶處理財務時間序列用例的信息。beplay体育app下载地址

免費試用Databricks
看到所有工程的博客的帖子
Baidu
map