7

Formula.jsプロジェクトの一環として、 Excel のACCRINT関数を再実装しようとしています (JavaScript ですが、言語は関係ありません)。どのように機能するのか (特にパラメーターに関して) 適切な説明を見つけようとしましたが、first_interest何も見つかりませんでした。

興味深いことに、Excel、Google Spreadsheets、Apple Numbers、Gnumeric、および OpenOffice は、Excel の 3 つのメジャー バージョン (Win、Mac、Web) がすべて互いに一致しているように見えますが、実装方法についてはすべて意見が一致していません。このブログ投稿で、さらにいくつかのコンテキストを見つけることができます。

数十のテスト ケースと現在の (欠陥のある) 実装は、ここにあります。

どんな助けでも大歓迎です!

更新: 明確にするために、この問題は5 つの基本オプションすべてをカバーする 3200 万を超えるテストで検証されたYEARFRACの David Wheeler の疑似コードを使用して実装した日カウント規則とは関係ありません。この問題は、誰も本当に理解していないように見えるパラメーターに起因します。私たちが知る限り、このパラメーターは、OpenOffice を含む多くの代替スプレッドシートでは単純に無視されます (ソース コードではコメント化されています)。そして、このパラメーターは実際には奇妙な方法で動作します。Excel を使用してその値を変更すると、ACCRINT関数によって得られる結果が変化することがわかりますが、その方法は混沌としているように見えます。を変更してみてくださいfirst_interestfirst_interest1 世紀までに日付を記入すると、未収利息が変化することがわかりますが、それほどではありません。私は本当にそれを理解することはできません。誰かができるなら、私はすべての耳です...

4

2 に答える 2

0

QuantitativeFinanceのPhilHは、この.NETライブラリを見つけました。これは、すべてのFinancial Functionsにクリーンルームの実装を提供し、2つを除くすべてがテストに合格したようです(実際には201,349のテストケース)。これらにはACCRINTが含まれます。コードはクリエイティブ・コモンズ表示の下でライセンスされています。F#で書かれていますが、かなり明確です。ACCRINTのコードは、bonds.fsファイルにあります。これをJavaScriptに移植して、Excelが返すものと同じ結果が得られるかどうかを確認します。これについてはもうすぐ...

于 2013-01-22T13:54:04.690 に答える
0

これはphpにあります(私は思う):このページから

  /**
   *    ACCRINT
   *
   *    Returns the discount rate for a security.
   *
   *    @param    mixed    issue        The security's issue date.
   *    @param    mixed    firstinter    The security's first interest date.
   *    @param    mixed    settlement    The security's settlement date.
   *    @param    float    rate        The security's annual coupon rate.
   *    @param    float    par            The security's par value.
   *    @param    int        basis        The type of day count to use.
   *                                        0 or omitted    US (NASD) 30/360
   *                                        1                Actual/actual
   *                                        2                Actual/360
   *                                        3                Actual/365
   *                                        4                European 30/360
   *    @return    float
   */
public static function ACCRINT($issue, $firstinter, $settlement, $rate, $par=1000, $frequency=1, $basis=0) {
      $issue        = self::flattenSingleValue($issue);
      $firstinter    = self::flattenSingleValue($firstinter);
      $settlement    = self::flattenSingleValue($settlement);
      $rate        = (float) self::flattenSingleValue($rate);
      $par        = (is_null($par))    ? 1000    : (float) self::flattenSingleValue($par);
      $frequency    = (is_null($frequency))    ? 1    : (int) self::flattenSingleValue($frequency);
      $basis        = (is_null($basis))    ? 0        : (int) self::flattenSingleValue($basis);

      //    Validate
      if ((is_numeric($rate)) && (is_numeric($par))) {
          if (($rate <= 0) || ($par <= 0)) {
              return self::$_errorCodes['num'];
          }
          $daysBetweenIssueAndSettlement = self::YEARFRAC($issue, $settlement, $basis);
          if (!is_numeric($daysBetweenIssueAndSettlement)) {
              return $daysBetweenIssueAndSettlement;
          }
          $daysPerYear = self::_daysPerYear(self::YEAR($issue),$basis);
          if (!is_numeric($daysPerYear)) {
              return $daysPerYear;
          }
          $daysBetweenIssueAndSettlement *= $daysPerYear;

          return $par * $rate * ($daysBetweenIssueAndSettlement / $daysPerYear);
      }
      return self::$_errorCodes['value'];
  }    //    function ACCRINT()
于 2013-01-21T20:15:34.330 に答える