xirr_newton_calculator 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
| @@ -13,7 +13,7 @@ class XirrNewtonCalculator | |
| 13 13 |  | 
| 14 14 | 
             
              def initialize(flows, init_rate, max_iteration=1000)
         | 
| 15 15 | 
             
               @flows = flows
         | 
| 16 | 
            -
               @x_n = init_rate | 
| 16 | 
            +
               @x_n = init_rate
         | 
| 17 17 | 
             
               @max_iteration = max_iteration
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| @@ -25,7 +25,7 @@ class XirrNewtonCalculator | |
| 25 25 | 
             
                	@x_n = next_value(@x_n)
         | 
| 26 26 | 
             
                	iteration += 1
         | 
| 27 27 | 
             
                end
         | 
| 28 | 
            -
                 | 
| 28 | 
            +
                @x_n
         | 
| 29 29 | 
             
              end
         | 
| 30 30 |  | 
| 31 31 | 
             
              private 
         | 
| @@ -39,14 +39,14 @@ class XirrNewtonCalculator | |
| 39 39 | 
             
              def dfdx(x)
         | 
| 40 40 | 
             
              	@flows[1..-1].inject(0) do |result, flow|
         | 
| 41 41 | 
             
              		diff_date = (Date.parse(flow.date.to_s) - Date.parse(@flows[0].date.to_s))/365
         | 
| 42 | 
            -
              		result += flow.amount* diff_date  | 
| 42 | 
            +
              		result += flow.amount * (-diff_date) / ((1.0 + x) ** (diff_date + 1))
         | 
| 43 43 | 
             
              	end
         | 
| 44 44 | 
             
              end
         | 
| 45 45 |  | 
| 46 46 | 
             
              def f(x)
         | 
| 47 47 | 
             
              	@f_xn = @flows.inject(0) do |result, flow|
         | 
| 48 48 | 
             
                  diff_date = (Date.parse(flow.date.to_s) - Date.parse(@flows[0].date.to_s))/365
         | 
| 49 | 
            -
              		result += flow.amount  | 
| 49 | 
            +
              		result += flow.amount / ((1 + x) ** diff_date)
         | 
| 50 50 | 
             
              	end
         | 
| 51 51 | 
             
              end
         | 
| 52 52 |  | 
| @@ -68,21 +68,21 @@ describe "XirrNewtonCalculator" do | |
| 68 68 |  | 
| 69 69 | 
             
              describe "#f" do 
         | 
| 70 70 | 
             
                it "returns 4 for x = 1" do
         | 
| 71 | 
            -
                  expect(xirr_calculator.send(:f, 1)).to eq  | 
| 71 | 
            +
                  expect(xirr_calculator.send(:f, 0.2).round(1)).to eq 2.7
         | 
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 74 | 
             
                it "returns -9.3 for x = 0.1" do
         | 
| 75 | 
            -
                  expect(xirr_calculator.send(:f, 0.1).round(1)).to eq  | 
| 75 | 
            +
                  expect(xirr_calculator.send(:f, 0.1).round(1)).to eq 3.3
         | 
| 76 76 | 
             
                end
         | 
| 77 77 | 
             
              end
         | 
| 78 78 |  | 
| 79 79 | 
             
              describe '#dfdx' do
         | 
| 80 | 
            -
                it "returns  | 
| 81 | 
            -
                  expect(xirr_calculator.send(:dfdx, 0.1).round(1)).to eq  | 
| 80 | 
            +
                it "returns -6.5 for x = 0.1" do
         | 
| 81 | 
            +
                  expect(xirr_calculator.send(:dfdx, 0.1).round(1)).to eq -6.5
         | 
| 82 82 | 
             
                end
         | 
| 83 83 |  | 
| 84 | 
            -
                it "returns  | 
| 85 | 
            -
                  expect(xirr_calculator.send(:dfdx, 1).round(1)).to eq  | 
| 84 | 
            +
                it "returns -3.1 for x = 1" do
         | 
| 85 | 
            +
                  expect(xirr_calculator.send(:dfdx, 1).round(1)).to eq -3.1
         | 
| 86 86 | 
             
                end
         | 
| 87 87 | 
             
              end
         | 
| 88 88 |  |