程式

OpenGamma 的 Strata - 計算成本

  • July 26, 2018

我一直在查看用 Java 編寫的開源庫Strata(由OpenGamma維護)。

現在,在檢查FX Forward PricerPayment Pricer時,我注意到了兩件事:

  1. 它的所有低級計算和結果(現值、PV01 等)都是使用CurrencyAmountMultiCurrencyAmount等類完成的。與首先使用雙數並在計算完成後使用貨幣元數據增強結果相比,這樣做的計算成本是多少?例如,每次創建一個新的 CurrencyAmount 時,都會傳遞一個內部Currency屬性,該屬性本身包含一個表示為字元串的 3 字母符號。所以似乎字元串被反复複製。
  2. 值函式呼叫接收*交易本身和市場數據提供者。然後使用交易的貨幣從市場數據提供者*那裡獲得適當的貼現因子曲線,然後從中查詢最終的貼現因子。同樣,我想知道這種恆定“曲線查找”的成本在更大範圍內是多少。為什麼不在交易中嵌入對適當貼現曲線的直接參考(或定價器,取決於實施)?因此,重複的函式呼叫(無論是現值還是 pv01)不必不斷查找市場數據圖中的曲線。也許類似於shared_ptrC++ 中的曲線。

相比之下,QuantLib 在設置引擎時將必要的市場數據對象指針嵌入到定價引擎中,並且它只對雙數進行操作,乍一看似乎更有效。顯然,不能輕易地將 QuantLib 方法並行化,而使用 Strata 可以做到這一點。

關於第 1 點,Strata 認為將貨幣與價值相關聯很重要。畢竟,沒有貨幣,價值就毫無意義。創建一個對像是有成本的CurrencyAmount(儘管如果它被快速使用和丟棄,這在垃圾收集器(“年輕一代”)中的成本最低,並且可能HotSpot可能會啟動並完全消除對象創建成本。

雖然Currency包含 a String,但不是每次都複製該字元串。Java 字元串是不可變的(它們不能更改),並且Currency也是不可變的。因此,當CurrencyAmount創建 時,Currency包含指向現有的指針,並且包含指向現有的指針String,因此沒有創建字元串或Currency

在第 2 點,Strata 遵循功能設計,其中定價者是傳遞數據的功能。這種不可變和功能性的特性是 Strata 設計的關鍵部分,特別是因為它允許簡單的並行性。

在這種情況下,定價者被傳遞交易和市場數據。定價者檢查交易以查看需要哪些市場數據。這提供了靈活性,允許定價者獲取所需的任何市場數據,而無需更改函式的 API。如果將市場數據嵌入到對像中,則需要為每次計算創建一個新對象,這是不可取的,尤其是在計算場景時(對略微變化的市場數據重複計算)。

如果市場數據查找的性能被證明是一個問題,RatesProvider可以編寫一個特殊的(介面)實現,只包含一個貨幣對的市場數據。該實現將返回曲線而不在雜湊圖中查找。然後呼叫者將負責將正確的實現傳遞給定價者。這將是與 QuantLib 中使用的最相似的方法。

免責聲明:我是 Strata 的主要作者之一。

引用自:https://quant.stackexchange.com/questions/40858