Java在量化投資等金融業的關鍵應用舉例 - oracle
隨著零售交易的出現,以及至今已執行了十多年的牛市,股票市場從未像現在這樣受歡迎。事實上,根據彭博情報公司的資料,散戶投資者現在主導著美國的股票市場,幾乎佔到了共同基金和對衝基金的總量。
計算員和金融工程師的職業前景正在飆升。著名的金融工程碩士學位課程培養出新一代的技術專家,他們揮舞著程式設計工具,使交易演算法大放異彩。我們也不要忘記2020年初大流行病導致的市場崩潰。倫敦LMAX 集團的執行長David Mercer說,這證明了系統的復原力。"就在2020年,我們的銀行交易量翻了一番,其中大部分來自於algo臺--所以現在大約85%的銀行交易量是通過algo臺來實現的。"
這就提出了金融工程的技術現狀問題:為什麼Java對股票市場的執行仍然至關重要的原因。但首先,我們要了解一點歷史。
Java在金融領域的悠久歷史
1969年,Instinet成為第一個在股市大廳之外進行金融產品交易的電子通訊網路(ECN)。在20世紀70年代,計算機化的訂單流開始出現,而在20世紀80年代,邁克爾-布隆伯格的同名終端被引入。在20世紀90年代初,現在占主導地位的金融資訊交換(FIX)協議開始作為所羅門兄弟公司和富達公司之間的資訊傳遞實驗。
到20世紀90年代末,程式設計師約書亞-萊文(Joshua Levine)在20世紀80年代從大學輟學後一直向不同的華爾街公司兜售他的軟體,他創造了一個名為Island ECN的小訂單匹配系統。Island是用FoxPro為MS-DOS 2.6版編寫的,有一個提高速度的小技巧:在建立一個新的訂單之前,檢查一下快取中是否有一個被取消的訂單的記錄。然後,復活並重新使用該記錄,以避免大量的工作。Island很快被納斯達克採用。
2002年,Instinet收購了Island,一年後,它將程式碼移植到了Java。在他的部落格上,Levine解釋說。"雖然Java版本是一些**不錯的程式碼,而且執行速度快了幾個數量級--這個[原始]程式碼特別有趣,正是因為它在如此緩慢的平臺上執行,而且非常容易閱讀,突出了這樣一個觀點:通常是架構和演算法比原始平臺速度更重要。"
(華爾街日報》記者斯科特-帕特森(Scott Patterson)在2012年出版的《暗池》(Dark Pools)一書中對萊文大加讚賞。機器交易員的崛起和對美國股市的操縱)。
Java不僅速度快得多。到21世紀初,由於其易用性、安全性、可移植性、動態類載入、執行時執行緒建立等等,Java正在徹底改變程式設計。
高頻交易(HFT)的競賽正在蓬勃發展,而基於Java的工具,如thinkorswim(現在由TD Ameritrade擁有)正在使每個人都能進行演算法交易。
2004年,高盛開始建立一個名為Caramel的Java集合框架,該框架於2012年開源,後來改名為Eclipse集合。到2011年,甲骨文公司的一份技術簡報估計,超過80%的電子交易應用程式,以及幾乎所有的FIX引擎都是用Java編寫的。
該語言的普及為金融公司創造了一個良性迴圈。"Java冠軍、總部位於倫敦的Chronicle軟體公司的執行長Peter Lawrey說:"核心Java的開發者在倫敦和其他金融中心廣泛存在,允許HFT公司挑選最適合他們需求的員工。
由Java支援的新型交易所也在不斷湧現。2010年,芝加哥氣候交易所用Java編寫,旨在進行二氧化碳抵消交易。大約在同一時間,LMAX Disruptor(今天仍然很受歡迎)利用 "機械同情 "等技術開創了加速外匯(forex)交易的新方法--對CPU在併發的執行緒程式中如何使用記憶體的理解。
另一場革命正在醞釀之中:開放原始碼軟體運動。正如許多Java雜誌的讀者所知,2007年,Sun Microsystems在GNU通用公共許可證下發布了OpenJDK。在隨後的幾年裡,開源炒股專案遍地開花。
今天,在GitHub上,你可以找到諸如Exchange-Core, Ta4j, Coin Trader, 和Chronicle Queue,等強大的基於Java的開源系統,據Lawrey說,這些系統 "被世界上的一級銀行廣泛用於交易系統的微服務之間的低延遲永續性(大約一微秒)和訊息傳遞"。
其他Java量化工具的最愛包括
- Strata,,一個分析和市場風險庫
- JQuantLib,一個量化金融框架
- 數學金融演算法的finmath庫
- 名稱明確的QuantComponents
- DRIP,其庫涵蓋了固定收益、資產配置、交易成本分析和XVA(風險)指標
Java的演變適合金融市場
幾乎在Java進入交易領域的同時,語言和執行時環境就開始發生變化,以滿足金融業的獨特需求。第一件大事是實時效能。
嚴格來說,實時性是指保證最壞情況下的響應。大多數應用程式以一般的統計術語指定效能要求,如90%的請求應在兩秒內完成。
但是,Java最初的垃圾收集器並沒有針對實時操作進行優化,而且它很容易在清理未使用的記憶體時停止所有的處理。因此,在1998年,第一個釋出的JSR是關於語言、庫和JVM的實時版本,大多數應用都被極大地改進了的垃圾收集器所服務,例如從Java 8開始的G1GC和最近的ZGC、Shenandoah GC和其他。
事實上,2021 年 3 月釋出的以下兩個 Java 16 新特性通過記憶體管理使 Java 更快:
- JEP 376:具有併發執行緒堆疊處理的ZGC 將 ZGC 執行緒堆疊處理從安全點移動到併發階段,消除了併發堆疊處理的最後一個重大瓶頸。
- JEP 387:彈性元空間更快地釋放 HotSpot JVM 的記憶體並簡化元空間程式碼以便於維護。
此外,2014 年推出的JShell使通過命令列對 Java 程式碼進行原型設計變得容易,這對於截止日期驅動的量化分析非常有用
高盛進入 GraalVM、Slang 和 Truffle
使AOT(以及許多其他事情)成為可能的最新幕後技術是GraalVM,它可以加速包括Java、Python、Ruby、JavaScript、R、C和C++等語言。但是,如果你的團隊的語言不在這個名單上呢--也許是因為你自己寫的?這就是高盛證券資料庫(SecDB)架構團隊面臨的問題,該團隊負責維護公司的定價平臺。
SecDB架構師支援一種名為Slang的內部程式語言,它對定價、風險和交易預訂至關重要。
1992年,高盛對外匯工作想用一種動態語言來編碼。有客戶的電話;我們希望能夠快速建立定價模型的原型。Slang("證券語言 "的簡稱)是一種解釋性的單執行緒語言。從語法上講,它是C和Lisp的愛情結晶,但有空格和變數名,因為我們希望它可讀。
對GraalVM和Truffle的實驗性使用,將Slang作為一種更快的JVM語言執行--Java開發者也可以維護。
Truffle語言實現框架是一個開源庫,用於構建工具和程式語言實現,作為自我修改的抽象語法樹的直譯器。
在概念驗證期間,高盛發現GraalVM能夠為Slang提供一個基礎,他們可以在Slang和C++之間切換:如果這一切都在GraalVM上執行,那可得到了一個整合的環境,你可以跨越這些界限進行剖析和除錯。這只是一個巨大的效率,非常酷。
此外,在同一次演講中,Haynes的同事Zachary Fernandez指出,GraalVM的LLVM執行時,即Sulong,"用一點點的魔法讓我大吃一驚。編寫一個類,將其編譯為LLVM位碼,將該指標交給我們現有的直譯器,然後該直譯器能夠呼叫成員函式,這將在Sulong管理的程式碼中結束--這都是非常酷的。"
Citadel 公司尋求Java專家
歸根結底,金融業的程式設計世界比Java是時髦的新語言時要多得多,這是件好事。由於更簡單的語法和大量的資料科學庫,Python和R等語言,更不用說Haskell和Julia了,已經在金融業爆炸性增長。
儘管如此,做市商和對衝基金的工作通常仍然需要強大的Java和C/C++技能,不僅要維護現有的程式碼,還要規避單執行緒語言的限制(如Python全域性直譯器鎖),建立高效能的系統,並推進到新興的金融領域,如深度學習和區塊鏈。
當被問及是否會改用其他語言和庫進行區塊鏈或機器學習時,Chronicle Software的Lawrey仍然堅持使用Java。"我們已經在Java中開發了我們的高吞吐量區塊鏈。在我們看來,這使它更容易擴充套件"。
Java擁有一個龐大的生態系統,包括執行時選項、分析器、偵錯程式、開發環境和依賴管理工具。還有一個龐大的人才庫,他說:"雖然一些較新的語言如Go、C和Kotlin有很大的興趣,但Java開發人員更廣泛,使其成為長期使用的更可靠的開發環境。"
如果你想在金融業尋找一份舒適的Java開發工作,怎麼辦?以Citadel Securities為例,該公司的招聘職位要求具備Java SE和Jakarta EE的專業知識;軟體模式和企業架構;以及Spring、Hibernate、FIX協議、Maven、Git、Jenkins、Nexus、關聯式資料庫和大資料的經驗。
對於任何高頻交易應用程式,你要證明你能寫出有記憶體效率的程式碼,Lawrey建議說:"基於值的類可以改善記憶體佔用,從而提高CPU快取的效率。雖然大多數現代計算機擁有數千兆位元組甚至數千兆位元組的記憶體,但它們仍然只有256KB的二級快取在每個CPU核,所以如果你想讓每個核儘可能快地執行,你要避免脫離二級快取--這使得記憶體仍然是一種寶貴的資源。"
而且你需要回答關於集合、多執行緒、搜尋和檢索演算法的問題,例如使用二叉樹、ArrayList和向量的相對速度。你還需要了解動量、套利、均值迴歸和統計套利的標準金融演算法。
相關文章
- mssql sqlserver in 關鍵字在值為null的應用舉例SQLServerNull
- 資料分析在金融行業中的應用行業
- 量化交易開發應用:如何搭建量化投資系統?
- Python金融數字貨幣量化投資Python
- chatGPT在金融行業的應用前景ChatGPT行業
- golang Context應用舉例GolangContext
- Oracle開發:構建強大企業級應用的關鍵Oracle
- 資料標籤與指標在金融行業的應用指標行業
- 設計模式應用舉例設計模式
- Flink 在眾安保險金融業務的應用
- 國產資料庫在金融業應用現狀如何?資料庫
- JAVA反射舉例Java反射
- 金融行業關鍵業務資料庫系統加固方案行業資料庫
- 在Java中this關鍵字的使用Java
- 深入解析Spring AI框架:在Java應用中實現智慧化互動的關鍵SpringAI框架Java
- R語言中管道符號 %>% 的應用 及 舉例R語言符號
- TDengine在弘源泰平量化投資中的實踐
- 量化投資中的特徵工程特徵工程
- AC-DMIS測量程式應用舉例
- 投資顧問等非金融機構開展資管業務也非常活躍
- AI與量化投資人才培養計劃-連線職場 助力走在金融行業前沿AI行業
- LLVM技術在GaussDB等資料庫中的應用LVM資料庫
- 知識圖譜在網際網路金融行業的應用行業
- mongoDB在網際網路金融的應用MongoDB
- 舉例說明Shadow DOM的應用場景有哪些?
- TiDB 在量化派風控系統中的應用TiDB
- 大資料處理的關鍵技術及應用大資料
- 五個關鍵問答,解讀金融App應用安全熱點話題APP
- 執行緒池的實現原始碼及應用舉例執行緒原始碼
- 輕鬆搭建基於 Serverless 的 Go 應用(Gin、Beego 舉例)ServerGo
- 正規表示式理解及簡單應用舉例
- 淺析分散式資料庫的技術框架及其在金融行業中的應用規劃分散式資料庫框架行業
- Java Stream六個使用舉例Java
- java 正規表示式 舉例Java
- Java基礎-static關鍵字和單例模式Java單例模式
- 滴滴大資料在汽車金融風控場景中的應用大資料
- 圖資料庫在中國移動金融風控的落地應用資料庫
- Oracle minus用法詳解及應用例項Oracle