finance_rb 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a3ce7fbe55b1715dc8b2b636326a1bb99eb4b8638f2a3c111e0decfe1b4d126
4
- data.tar.gz: a5568d0deadc00bdd55ffac1cb05dee7a7d8abb8bee87015d321916f59694705
3
+ metadata.gz: 98c8d72b54d7c7342331cf06086b5e5b1c5ec7c9fe9e3f60315fc78a94254885
4
+ data.tar.gz: a5ce132889634c03e72dc3c884e3549071867e3a297de2ab1a040c2627b876bd
5
5
  SHA512:
6
- metadata.gz: cd349f4f6aa4cf20fab8db9064da6b77f1199b61b927af170f491dd447cfdb3889aeea97d07de34706ca12493cfae56d1089aa8cfb2ff80e351ddd951d3e92e9
7
- data.tar.gz: fdef6ff2746503b68a2a83494b6a006f05a7216f87125a71967dfdf7de05d4dcae80563f4cfbac0cf8ce7b91c5510cfd4cc4111cbe49f6573e43dc37fc21d4f2
6
+ metadata.gz: 8938c6f7d84419716cc1ee728a372388f1956f9ab1be75c80bbbed70e744711a505aa252b19269c3655db04c1f73884280cf11cc1a483f2d4a24b64d231fbbcf
7
+ data.tar.gz: a75066c79654c3eb3812db62f5e59bd130c12b87de2229da69a3ad6ba82d116089e95807c3a204c9c93780c243cc21b92953d224c4c532a400c4e30e22986af1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.1.1] - 2021-03-30
2
+
3
+ ### Added
4
+ * Implement `Finance::Loan#fv`
5
+
1
6
  ## [0.1.0] - 2021-03-28
2
7
 
3
8
  ### Added
data/README.md CHANGED
@@ -4,14 +4,14 @@ This package is a ruby native port of the numpy-financial package with some help
4
4
 
5
5
  The functions in this package are a scalar version of their vectorised counterparts in the [numpy-financial](https://github.com/numpy/numpy-financial) library.
6
6
 
7
- [![Release](https://img.shields.io/github/v/release/wowinter13/finance_rb.svg?style=flat-square)](https://github.com/wowinter13/finance_rb/releases) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
7
+ [![Release](https://img.shields.io/github/v/release/wowinter13/finance_rb.svg?style=flat-square)](https://github.com/wowinter13/finance_rb/releases) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Maintainability](https://api.codeclimate.com/v1/badges/bbca82ad7815794c6718/maintainability)](https://codeclimate.com/github/wowinter13/finance_rb/maintainability)
8
8
 
9
9
  Currently, only some functions are ported,
10
10
  which are as follows:
11
11
 
12
12
  | numpy-financial function | ruby native function ported? | info|
13
13
  |:------------------------: |:------------------: | :------------------|
14
- | fv | | Computes the future value|
14
+ | fv || Computes the future value|
15
15
  | ipmt | | Computes interest payment for a loan|
16
16
  | pmt | ✅ | Computes the fixed periodic payment(principal + interest) made against a loan amount|
17
17
  | ppmt | | Computes principal payment for a loan|
@@ -20,4 +20,32 @@ which are as follows:
20
20
  | rate | | Computes the rate of interest per period|
21
21
  | irr | ✅ | Computes the internal rate of return|
22
22
  | npv | ✅ | Computes the net present value of a series of cash flow|
23
- | mirr | ✅ | Computes the modified internal rate of return|
23
+ | mirr | ✅ | Computes the modified internal rate of return|
24
+
25
+ ## Installation
26
+
27
+ finance_rb is available as a gem, to install it just install the gem:
28
+
29
+ gem install finance_rb
30
+
31
+ If you're using Bundler, add the gem to Gemfile.
32
+
33
+ gem 'finance_rb'
34
+
35
+ Run `bundle install`.
36
+
37
+ ## Running tests
38
+
39
+ bundle exec rspec spec/
40
+
41
+ ## Contributing
42
+
43
+ 1. Fork it ( https://github.com/wowinter13/finance_rb/fork )
44
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
45
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
46
+ 4. Push to the branch (`git push origin my-new-feature`)
47
+ 5. Create a new Pull Request
48
+
49
+ ## License
50
+
51
+ MIT License. See LICENSE for details.
data/lib/finance/loan.rb CHANGED
@@ -5,6 +5,7 @@ module Finance
5
5
  PAYMENT_TYPE_MAPPING = { end: 0, beginning: 1 }.freeze
6
6
 
7
7
  # @return [Float] The amount of loan request (I.e. a present value)
8
+ # You can use #pv method to calculate value if param is not defined.
8
9
  # Defaults to 0.
9
10
  attr_accessor :amount
10
11
 
@@ -27,16 +28,23 @@ module Finance
27
28
  attr_accessor :duration
28
29
 
29
30
  # @return [Float] Future value.
31
+ # You can use #fv method to calculate value if param is not defined.
30
32
  # Defaults to 0.
31
33
  attr_accessor :future_value
32
34
 
35
+ # @return [Float] The (fixed) periodic payment.
36
+ # You can use #pmt method to calculate value if param is not defined.
37
+ attr_accessor :payment
38
+
39
+ # Create a new Loan instance.
33
40
  def initialize(**options)
34
41
  initialize_payment_type(options[:ptype])
35
42
  @nominal_rate = options.fetch(:nominal_rate, 0).to_f
36
43
  @duration = options.fetch(:duration, 1).to_f
37
44
  @amount = options.fetch(:amount, 0).to_f
38
45
  @future_value = options.fetch(:future_value, 0).to_f
39
- @monthly_rate = @nominal_rate / 12
46
+ @payment = options[:payment]
47
+ @monthly_rate = @nominal_rate / 12
40
48
  end
41
49
 
42
50
  # Pmt computes the payment against a loan principal plus interest (future_value = 0).
@@ -44,6 +52,8 @@ module Finance
44
52
  # a certain future value given an initial deposit,
45
53
  # a fixed periodically compounded interest rate, and the total number of periods.
46
54
  #
55
+ # Required Loan arguments: nominal_rate, duration, amount, future_value*
56
+ #
47
57
  # @return [Numeric] The (fixed) periodic payment.
48
58
  #
49
59
  # @example
@@ -69,6 +79,36 @@ module Finance
69
79
  (-future_value + amount * factor) / second_factor
70
80
  end
71
81
 
82
+ # Fv computes future value at the end of some periods (duration).
83
+ # Required Loan arguments: nominal_rate, duration, payment, amount*
84
+ #
85
+ # @param payment [Float] The (fixed) periodic payment.
86
+ # In case you don't want to modify the original loan, use this parameter to recalculate fv.
87
+ #
88
+ # @return [Float] The value at the end of the `duration` periods.
89
+ #
90
+ # @example
91
+ # require 'finance_rb'
92
+ # Finance::Loan.new(nominal_rate: 0.05, duration: 120, amount: -100, payment: -200).fv
93
+ # #=> 15692.928894335748
94
+ #
95
+ # @see http://www.oasis-open.org/committees/documents.php?wg_abbrev=office-formulaOpenDocument-formula-20090508.odt
96
+ # @see [WRW] Wheeler, D. A., E. Rathke, and R. Weir (Eds.) (2009, May).
97
+ # Open Document Format for Office Applications (OpenDocument)v1.2,
98
+ # Part 2: Recalculated Formula (OpenFormula) Format - Annotated Version,
99
+ # Pre-Draft 12. Organization for the Advancement of Structured Information
100
+ # Standards (OASIS). Billerica, MA, USA. [ODT Document].
101
+ def fv(payment: nil)
102
+ raise ArgumentError, 'no payment given' if self.payment.nil? && payment.nil?
103
+
104
+ final_payment = payment || self.payment
105
+
106
+ factor = (1.0 + monthly_rate)**duration
107
+ second_factor = (factor - 1) * (1 + monthly_rate * ptype) / monthly_rate
108
+
109
+ -((amount * factor) + (final_payment.to_f * second_factor))
110
+ end
111
+
72
112
  private
73
113
 
74
114
  def initialize_payment_type(ptype)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Finance
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
@@ -38,4 +38,36 @@ RSpec.describe Finance::Loan do
38
38
  expect(loan.pmt).to eq(17_449.90775727763)
39
39
  end
40
40
  end
41
+
42
+ describe '#fv' do
43
+ context 'with loan arguments' do
44
+ it 'calculates correct fv value' do
45
+ loan = Finance::Loan.new(nominal_rate: 0.05, duration: 120, amount: -100, payment: -100)
46
+ expect(loan.fv).to eq(15_692.928894335748)
47
+ end
48
+
49
+ context 'with :ptype' do
50
+ it 'calculates correct fv value' do
51
+ loan = Finance::Loan.new(
52
+ nominal_rate: 0.9, duration: 20, amount: 0, payment: -2000, ptype: :beginning
53
+ )
54
+ expect(loan.fv).to eq(93_105.06487352113)
55
+ end
56
+ end
57
+ end
58
+
59
+ context 'with an optional :payment argument' do
60
+ it 'calculates correct fv value' do
61
+ loan = Finance::Loan.new(nominal_rate: 0.05, duration: 120, amount: -100, payment: -200)
62
+ expect(loan.fv(payment: -100)).to eq(15_692.928894335748)
63
+ end
64
+ end
65
+
66
+ context 'w/o any payments' do
67
+ it 'raises an ArgumentError exception w/o loan arguments' do
68
+ loan = Finance::Loan.new(nominal_rate: 0.05, duration: 120, amount: -100)
69
+ expect { loan.fv }.to raise_error(ArgumentError, "no payment given")
70
+ end
71
+ end
72
+ end
41
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finance_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vlad Dyachenko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-28 00:00:00.000000000 Z
11
+ date: 2021-03-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A ruby port of numpy-financial functions. This library provides a Ruby
14
14
  interface for working with interest rates, mortgage amortization, and cashflows