Class: FinancialCalculator::Xnpv

Inherits:
Object
  • Object
show all
Defined in:
lib/financial_calculator/xnpv.rb

Overview

Calculate the net present value of a series of unequally spaced, (potentially) unequal cashflows

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rate, cashflows, dates) ⇒ FinancialCalculator::Xnpv

Create a new XNPV calculation

Parameters:

  • rate (Numeric)

    The discount (interest) rate

  • cashflows (Array<Numeric>)

    An array of cashflows

  • dates (Array<Date>)

    An array of dates representing when each cashflow occurs

Raises:

  • (ArgumentError)

    When cashflows and dates are not the same length

  • (ArgumentError)

    When dates is not an array of Date



45
46
47
48
49
50
51
52
53
# File 'lib/financial_calculator/xnpv.rb', line 45

def initialize(rate, cashflows, dates)
  validate_cashflows_dates_size(cashflows, dates)
  validate_dates(dates)

  @rate       = Flt::DecNum(rate.to_s)
  @cashflows  = cashflows.map { |cashflow| Flt::DecNum(cashflow.to_s) }.freeze
  @dates      = dates.freeze
  @result     = solve(rate, cashflows, dates)
end

Instance Attribute Details

#cashflowsArray<Numeric> (readonly)

Returns An array of cashflow amounts.

Returns:

  • (Array<Numeric>)

    An array of cashflow amounts



10
11
12
# File 'lib/financial_calculator/xnpv.rb', line 10

def cashflows
  @cashflows
end

#datesArray<Date> (readonly)

Returns An array of dates on which the cashflows occur.

Returns:

  • (Array<Date>)

    An array of dates on which the cashflows occur



14
15
16
# File 'lib/financial_calculator/xnpv.rb', line 14

def dates
  @dates
end

#rateNumeric (readonly)

Returns The rates used for calculating the present value.

Returns:

  • (Numeric)

    The rates used for calculating the present value



6
7
8
# File 'lib/financial_calculator/xnpv.rb', line 6

def rate
  @rate
end

#resultDecNum (readonly)

Returns Result of the XNPV calculation.

Returns:

  • (DecNum)

    Result of the XNPV calculation



18
19
20
# File 'lib/financial_calculator/xnpv.rb', line 18

def result
  @result
end

Class Method Details

.with_transactions(rate, transactions) ⇒ FinancialCalculator::Xnpv

Allows for creating an XNPV calculation with an array of any objects that respond to #amount and #date

Parameters:

  • rate (Numeric)

    The discount (interest) rate

  • transaction (Array<Transaction>)

    An array of Transaction objects.

Returns:

Raises:

  • (ArgumentError)


25
26
27
28
29
30
31
32
33
34
35
# File 'lib/financial_calculator/xnpv.rb', line 25

def self.with_transactions(rate, transactions)
  raise ArgumentError.new("Argument \"rate\" must be a Numeric. Got #{rate.class} instead") unless rate.is_a? Numeric
  unless transactions.all? { |t| t.is_a? Transaction }
    raise ArgumentError.new("Argument \"transactions\" must be an array of Transaction")
  end

  cashflows  = transactions.map(&:amount)
  dates      = transactions.map(&:date)

  self.new(rate, cashflows, dates)
end

Instance Method Details

#inspectObject



56
57
58
# File 'lib/financial_calculator/xnpv.rb', line 56

def inspect
  "XNPV(#{result})"
end