2012-10-04 32 views
0

我在撰寫一個應用程序,其目的是優化交易策略。爲了簡單起見,假定我們的交易策略是「進入此處」,然後是另一個說「如果在交易時退出」,然後讓我們有兩個模型:一個說我們應該承擔多大的風險(如何如果我們處於市場的錯誤方面,我們會失去很多),另一個則說我們應該獲得多少利潤(即如果市場同意,我們將獲得多少利潤)。在高性能財務應用程序中緩存

爲了簡單起見,我會參考歷史已實現的交易蜱。這意味着如果我「在tick 28上輸入」,這意味着我將以該交易的價格在我的數據集中進行第28次交易時進行交易。滴答按時間順序存儲在我的數據集中。

現在,想象整個數據集的入口策略會出現500個條目。對於每個條目,我可以預先計算確切的輸入刻度。我還可以計算退出策略爲每個入口點確定的退出點(再次作爲刻度編號)。對於每一個條目,我也可以預先計算損失和利潤的模型,以及這些損失或利潤會被擊中的時刻。要做的最後一件事是計算先發生的事情,即退出策略,退出退出或退出贏利。

因此,我遍歷交易數組並計算exitTick [i] = min(exitTickByStrat [i],exitTickByLoss [i],exitTickByProfit [i])。整個過程都很慢(假設我做了100M次)。我懷疑緩存未命中是主要的罪魁禍首。問題是:這可以以某種方式更快嗎?我必須遍歷一些非平凡長度的4個數組。我提出的一個建議是將數據分組爲四個元組,即具有一個像(entryTick,exitOnStrat,exitOnLoss,exitOnProfit)這樣的結構數組。由於更好的緩存可預測性,這可能會更快,但我無法肯定地說。爲什麼我目前還沒有測試過,儀表分析器在某些方面不適用於我的應用程序的發佈二進制文件,而採樣分析器似乎對我來說不可靠(我試過英特爾的分析器)。

所以最後的問題是:這個問題可以做得更快嗎?使用發佈二進制文件進行mem分析的最佳性能分析器是什麼?我在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秒內,計算在evaluateExitsAndDetermineImprovement()函數中花費了25秒,這個函數就是我在原始問題中所描述的,即picks min(exitOnPattern,exitOnStop,exitOnTarget)。我需要調用函數100M次的原因是因爲我有100M組合的所有參數。但是在最後一個週期內,只有exitOnStops數組發生了變化。如果有幫助,我可以發佈一些代碼。感謝所有的評論!

+5

「我懷疑緩存未命中是主要的罪魁禍首」:不要懷疑。測量。如果你在Linux下使用CacheGrind,如果你在windows下,改變操作系統。 –

回答

0

因此,在做了一些工作之後,我瞭解了Alexandre C的建議。當我運行緩存未命中概要分析時,我發現在evaluateExits()函數的15M調用中,我只有30K緩存未命中,函數不能被緩存阻礙。因此,我必須「開始相信」VTune實際上產生了有效的結果,雖然很奇怪。由於對VTune輸出的分析與當前線程的名稱不匹配,我決定啓動一個新的thread。謝謝大家的意見和建議。

0

也許我完全誤解你的系統,但是:
它是什麼,你「預先計算」以及何時爲什麼 100M次???

我不知道這是否會幫助你,但它可以顯著簡化系統 - 有2種共同的交易策略:(說明是我和官員)
1)「定點退出」 - 當交易發生的所有出口點都會計算一次,並且會根據市場狀況/價格定期進行覈對。
2)「可變點退出」 - 當市場移動時,重新計算出口點(通常鎖定更多利潤/減少損失)。

在情況1)實際計算中只發生一次,所以應該是非常快速
在情況2)計算將每天都在發生的時間,但它可以在許多不同的方式進行優化 - 其中之一是那您可以將您的交易存儲在退出點索引中,只能獲得並重新計算與實際市場情況接近的交易。

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

+0

你好Germann,我編輯我原來的帖子爲了更加清晰。謝謝! –

1

我對交易策略瞭解不多,但我通常會做一些優化。那麼,有很多優化方法。 喜歡,容器的類型,使用不同的最小功能(我認爲boost比stl庫有一個更快的功能),嘗試減少相同的計算等。 你也可以通過使用更快的函數來獲得速度,或通過重新調整算法進行優化。

爲了剖析我在Win7 x64下使用GlowCode,並且它也可以用於發佈版本。

+0

謝謝,我會研究GlowCode。 –

+0

我認爲(假設所有的功能都執行得相當快),這只是因爲計算的數量巨大,需要很長時間。 即。你說完成大約需要30秒,執行100M迭代,這意味着0.0003毫秒/步。因此,我看到的唯一優化是以某種方式減少迭代次數。 編輯:也許具體的代碼可以幫助我們 – Fred

+0

嗨弗雷德。謝謝回覆。英特爾profiler輸出表示,每次運行約30秒鐘5秒鐘的時間用於從數組中獲取數據的函數(如prelcalcedValues [tradeIndex] [profitIndex]),這就是爲什麼我認爲緩存未命中是主要問題的原因。我將用GlowCode進行配置文件,如果我找到新的東西,我會很高興發佈解決方案。謝謝! –