返回

計算回報的最佳方法

  • February 12, 2021

假設您要計算單期收益。設p0初始價格p1為該期間的最終價格。

最常見的公式是

(p1 - p0) / p0

但我有時也看到人們使用

(p1 / p0) - 1

在代數上,這兩種形式是等價的。但是,當您編寫電腦程式碼時,有什麼不同嗎?

從性能上看,這兩種形式都涉及一除一減,所以應該有相似的性能。(也許第一種形式只需要 3 個寄存器,而第二種需要 4 個?)

從準確性的角度來看,有什麼區別嗎?一種形式的浮點誤差是否比另一種形式低?假設正在使用 64 位浮點類型(例如 numpy float64 或 Java double)。

我不確定所使用的語言是否重要,但如果您認為可能,我現在通常使用 Python (Pandas)、R 或 Java。如果我使用 Pandas 或 R,則返回通常計算為向量運算。

語言很重要,但如果性能是一個問題,您需要確保程式碼是最佳的。單個返回計算的優化彙編程式碼如下所示(在Godbolt上):

method1(double, double):
       divsd   xmm0, xmm1
       subsd   xmm0, QWORD PTR .LC0[rip]
       ret
method2(double, double):
       subsd   xmm0, xmm1
       divsd   xmm0, xmm1
       ret
.LC0:
       .long   0
       .long   1072693248

使用的指令和寄存器的數量是相同的。我不知道應用subsd兩個寄存器或一個寄存器和數據段中的一個值之間是否有區別。所有編譯器的行為或多或少都相同,所以我想這是減 1 的快速方法。

Godbolt 連結還包含矢量化程式碼,此程式碼非常相似,並且快速檢查似乎使用相同數量的寄存器(xmm0xmm1xmm2循環記帳寄存器)。

出於財務目的,雙數就足夠精確了。您在返回計算中可能遇到的捨入差異可以忽略不計,小於1e-10所有合理數字。獲得正確的數據更為重要。但是,即使您擁有正確的數據,數據中的任何噪音(例如買賣價差)也會淹沒浮點誤差。除法時浮點錯誤會爆炸。在任何情況下,通過除法返回可能是一個壞主意,因為它們很容易為 0。

總結

我不會擔心這個。性能差異可以忽略不計,如果不是,您應該同時測量兩者。浮點錯誤不應該受到傷害,最好專注於獲取好的數據。

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