我在撰寫一個應用程序,其目的是優化交易策略。爲了簡單起見,假定我們的交易策略是「進入此處」,然後是另一個說「如果在交易時退出」,然後讓我們有兩個模型:一個說我們應該承擔多大的風險(如何如果我們處於市場的錯誤方面,我們會失去很多),另一個則說我們應該獲得多少利潤(即如果市場同意,我們將獲得多少利潤)。在高性能財務應用程序中緩存
爲了簡單起見,我會參考歷史已實現的交易蜱。這意味着如果我「在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數組發生了變化。如果有幫助,我可以發佈一些代碼。感謝所有的評論!
「我懷疑緩存未命中是主要的罪魁禍首」:不要懷疑。測量。如果你在Linux下使用CacheGrind,如果你在windows下,改變操作系統。 –