簡體   English   中英

在高性能財務應用程序中進行緩存

[英]Caching in a high-performance financial application

我正在編寫一個應用程序,其目的是優化交易策略。 為了簡單起見,僅假設我們有一個交易策略說“在此輸入”,然后假設另一個策略說“如果在交易中在這里離開”,然后讓我們有兩個模型:一個說我們應該承擔多少風險(如何如果我們站在市場的錯誤一邊,我們將損失多少錢;另一方則說我們應該獲得多少利潤(即,如果市場同意,我們將獲得多少利潤)。

為簡單起見,我將歷史已實現的交易稱為報價。 這意味着如果我“輸入第28勾號”,這意味着我將以該交易的價格在數據集中進行第28次交易時輸入一筆交易。 刻度按時間順序存儲在我的數據集中。

現在,假設整個數據集上的輸入策略有500個輸入。 對於每個條目,我可以預先計算出確切的條目刻度。 我還可以為每個入口點計算由出口策略確定的出口點(同樣是刻度號)。 對於每個條目,我還可以預先計算模型化的虧損和利潤,以及這些虧損或利潤本應受到的滴答聲。 剩下要做的最后一件事是計算首先發生的事情,即退出戰略,虧損退出或盈利退出。

因此,我遍歷交易數組並計算exitTick [i] = min(exitTickByStrat [i],exitTickByLoss [i],exitTickByProfit [i])。 整個過程非常緩慢(假設我這樣做了1億次)。 我懷疑高速緩存未命中是主要原因。 問題是:能否以某種方式使其更快? 我必須遍歷4個非平凡長度的數組。 我提出的一個建議是將數據分為四個元組,即具有一組結構(entryTick,exitOnStrat,exitOnLoss,exitOnProfit)。 由於更好的緩存可預測性,這可能會更快,但是我不能肯定地說。 到目前為止,為什么我還沒有進行測試,是因為在我看來,采樣探查器似乎不可靠,而檢測探查器卻無法以某種方式對我的應用程序的發行版二進制文件起作用(我嘗試過英特爾的探查器)。

因此,最后的問題是:可以使這個問題變得更快嗎? 什么是用於帶有發行二進制文件的內存配置文件的最佳分析器? 我在Win7,VS2010上工作。

編輯:非常感謝所有人。 我試圖盡可能簡化我的原始問題,因此造成了混亂。 只是為了確保其可讀性-目標是指預期/已實現的利潤,止損是指預期/已實現的虧損。

優化器是蠻力的。 所以,我有一些策略設置(例如指標周期,等等),然后是最小/最大breakEvenAfter / breakEvenBy,然后是公式,以刻度為單位給出了止損/目標值。 這些公式也是優化的對象。 因此,我有一個像

for each in params
{
   calculateEntries()
   for each in beSettings
   {
      precalculateBeData()
      for each in targetFormulaSettings
      {
          precalculateTargetsAndRespectiveExitTicks
          for each in stopFormulaSettings
          {
              precalulcateStopsAndRespectiveExitsTicks
              evaluateExitsAndDetermineImprovement()
          }
       }
    }
}

因此,我會盡可能地預先計算內容,並且僅在需要時才進行計算。 在30秒鍾內,計算將用25秒鍾在validateExitsAndDetermineImprovement()函數中,該函數執行我在原始問題中描述的操作,即選擇min(exitOnPattern,exitOnStop,exitOnTarget)。 我需要調用該函數100M次的原因是因為我擁有所有參數組合的100M個組合。 但是在最后一個for周期內,僅exitOnStops數組發生了變化。 如果有幫助,我可以發布一些代碼。 我感謝所有評論!

我對交易策略了解不多,但是我通常會做一些優化。 好吧,有很多優化方法。 就像容器的類型,使用不同的min函數(我認為boost具有比stl庫更快的函數),請嘗試減少相同的計算量,等等。 您也可以通過使用更快的函數來提高速度或重新設置算法來進行優化。

為了進行分析,我在Win7 x64下使用GlowCode,發布版本也可以。

也許我完全誤解了您的系統,但是:
您“預先計算”的是什么,何時以及為什么要進行 1億次???

我不知道這是否會幫助你,但它可以顯著簡化系統-有2種共同的交易策略:(說明是我,而不是官方)
1)“定點退出”-交易發生時,所有退出點均計算一次,並定期根據市場狀況/價格進行檢查。
2)“可變點退出”-當市場移動時,退出點將重新計算(通常是為了鎖定更多的利潤/減少虧損)。

在情況1)中,實際計算僅發生一次,因此應該非常
在情況2)中,每次都會進行計算,但是可以通過許多不同的方式進行優化-其中之一是您可以存儲以退出點為索引的交易,而只能獲取並重新計算接近實際市場情況的交易。

我不確定您指的是哪個緩存未命中? 您的數據緩存? CPU緩存?

因此,經過一些工作后,我了解了Alexandre C的建議。當我運行緩存未命中性能分析時,我發現在對EvaluateExits()函數進行的1500萬次調用中,我只有30K緩存未命中,因此不能妨礙該函數的性能通過緩存。 因此,我不得不“開始相信” VTune實際上正在產生有效的結果,盡管很奇怪。 由於對VTune輸出的分析與當前線程的名稱不匹配,因此我決定啟動一個新線程 謝謝大家的意見和建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM