Excel 的 ACCRINT 背後的算法是什麼?
這個問題最初發佈在 Stackoverflow 上:
作為 Formula.js 項目的一部分,我正在嘗試重新實現 Excel 的 ACCRINT 函式(在 JavaScript 中,但語言應該無關緊要)。我一直在嘗試找到它應該如何工作的正確描述(尤其是關於first_interest參數),但找不到任何東西。
有趣的是,Excel、Google 電子表格、Apple Numbers、Gnumeric 和 OpenOffice 在實現它的方式上都存在分歧,儘管 Excel 的所有三個主要版本(Win、Mac、Web)似乎都彼此一致。可以在此部落格文章中找到更多上下文。
可以在這裡找到數十個測試案例和我目前的(有缺陷的)實現。
任何幫助(程式碼、虛擬碼或描述)將不勝感激!
更新:需要明確的是,該問題與日期計數約定無關,我們使用 David Wheeler 的 YEARFRAC 虛擬碼實現了該約定,該偽程式碼本身已通過超過 3200 萬次測試驗證,涵蓋所有五個基本選項。問題來自參數,似乎沒有人真正理解。據我們所知,這個參數被許多替代電子表格簡單地忽略了,包括 OpenOffice(它在原始碼中被註釋掉了)。而且這個參數的行為確實很奇怪。如果您使用 Excel 並更改它的值,您會看到它會更改 ACCRINT 函式給出的結果,但方式看起來很混亂。嘗試更改
first_interest``first_interest
日期相差一個世紀,您會看到應計利息發生變化,但變化不大。我真的無法理解這一點。如果有人可以的話,我會全力以赴,因為 ACCRINT 必須用於計算每年數十億或數万億美元的利息,而且我覺得很有趣的是,除了微軟的少數人似乎沒有人知道它應該如何工作…
看看 Excel Financial Functions for .Net,看起來有可用的原始碼:
Excel 中使用的計算應計利息的公式是 100% 正確的(但天數慣例不是)。不正確且未充分考慮的是必須用於您嘗試評估其應計利息的特定資產的確切天數慣例。
這裡有幾點可能會導致您的錯誤:
- 我強烈建議您使用任何語言(無論是編譯的還是腳本化的)為您的 switch 語句實現列舉以實現日期計數約定,以避免未來使用者產生歧義或錯誤;不要使用整數或字元串,因為它是錯誤的重要來源。
- 在您的連結中,您是如何得出用於衡量您的計算是正確還是不正確的“必需”值?
- 您是否實施了銀行假期計劃?您是否考慮過每個市場的此類銀行假期可能不同,甚至有時同一市場中不同交易所的不同。我根本沒有在您的原始碼中看到任何關於銀行假期的會計資訊。是這個問題嗎?當您查看以下連結時,為什麼要注意這一點很重要:
- http://en.wikipedia.org/wiki/Date_rolling