返回
計算回報的最佳方法
假設您要計算單期收益。設
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 連結還包含矢量化程式碼,此程式碼非常相似,並且快速檢查似乎使用相同數量的寄存器(
xmm0
、xmm1
和xmm2
循環記帳寄存器)。出於財務目的,雙數就足夠精確了。您在返回計算中可能遇到的捨入差異可以忽略不計,小於
1e-10
所有合理數字。獲得正確的數據更為重要。但是,即使您擁有正確的數據,數據中的任何噪音(例如買賣價差)也會淹沒浮點誤差。除法時浮點錯誤會爆炸。在任何情況下,通過除法返回可能是一個壞主意,因為它們很容易為 0。總結
我不會擔心這個。性能差異可以忽略不計,如果不是,您應該同時測量兩者。浮點錯誤不應該受到傷害,最好專注於獲取好的數據。