金融工学の計算(1)〜ディスカウントファクター(DF):Ruby編

前回はディスカウントファクターの計算の準備を行いましたが、もう少し付け加えておきます。
前回は、このような式

 DF = \frac{PV}{FV} = \frac{1}{(1+r)}

で、ディスカウントファクターが求まると言いましたが、じつはこれは期間が現在から1年先のディスカウントファクターになります。金利が1年分乗っているので、当然ですね。
期間を自由に求める場合、つまり  t 年のDFは、  t 年分の利息が  (1+r)^t と表せるので、

 DF = \frac{PV}{FV} = \frac{1}{(1+r)^t}

となります。

それでは、ここまでの内容をRubyで書いてみましょう。単純な内容なので、TDD(Test Driven Development)でやってみます。(と思ったのですが、結局Test Lastになってしまいました。。)

df_test.rb

require 'test/unit'
require 'df'
class DfTest < Test::Unit::TestCase
  def test_df
    assert_equal(1, df(0.1, 0)) # 現在のDFは1となるはず
    assert_equal("0.99009900990099", df(0.01, 1).to_s)
  end
end

これが通るように、メソッドdfを実装します。
df.rb

def df(r, t)
  1 / (1 + r) ** t
end

テスト結果です。

$ ruby df_test.rb
Loaded suite df_test
Started
.
Finished in 0.001078 seconds.

1 tests, 2 assertions, 0 failures, 0 errors

なぜTDDでできなかったかと言うと、本題以外の丸めの問題で、なかなかテストを通せなかったからです。(つまり、実装が通るようなテストを書かざるを得なかった。。)
ちょっと悲しいので、次回は誤差を丸めるユーティリティを作成してみます。