exonio 0.4.1 → 0.5.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +1 -1
- data/README.md +21 -2
- data/lib/exonio.rb +8 -2
- data/lib/exonio/financial.rb +39 -0
- data/lib/exonio/helpers.rb +28 -0
- data/lib/exonio/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4e5b35139265ba594d5146efee24fd9511a8b4
|
4
|
+
data.tar.gz: 31addf7c1d0e5d28a49b27d8537a713e2c12651d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c082906456fc5cc853a11f6fc70f45886920053d662322a4b686122b849152875b19d011cbd4078229d17de419a7f939282b92270c9ed6834eefe7bf72b64b62
|
7
|
+
data.tar.gz: d98d28a9b7705a7dfe6343d9fb3bc26f6a689aed5e39272e24879349b75278ddaf25b616f0e75a7f426d612cdbe969d4f7f5edd6fded4b09b4740727b2524ea3
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -43,6 +43,19 @@ By convention, the negative sign represents cash flow out (i.e. money not
|
|
43
43
|
available today). Thus, saving $100 a month at 5% annual interest leads
|
44
44
|
to $15,692.93 available to spend in 10 years.
|
45
45
|
|
46
|
+
### IRR
|
47
|
+
|
48
|
+
Suppose one invests 100 units and then makes the following withdrawals at regular (fixed)
|
49
|
+
intervals: 39, 59, 55, 20. Assuming the ending value is 0, one's 100 unit investment
|
50
|
+
yields 173 units; however, due to the combination of compounding and the periodic
|
51
|
+
withdrawals, the "average" rate of return is neither simply 0.73/4 nor (1.73)^0.25-1.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095
|
55
|
+
```
|
56
|
+
|
57
|
+
So, the internal rate of return is 28.09%
|
58
|
+
|
46
59
|
### IPMT
|
47
60
|
|
48
61
|
What is the interest part of a payment in the 8th period (i.e., 8th month),
|
@@ -65,6 +78,14 @@ Exonio.nper(0.07 / 12, -150, 8000) # ==> 64.07334877066185
|
|
65
78
|
|
66
79
|
So, over 64 months would be required to pay off the loan.
|
67
80
|
|
81
|
+
### NPV
|
82
|
+
|
83
|
+
Calculates the Net Present Value of an investment
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
Exonio.npv(0.281, [-100, 39, 59, 55, 29]) # ==> -0.00661872883563408
|
87
|
+
```
|
88
|
+
|
68
89
|
### PMT
|
69
90
|
|
70
91
|
What is the monthly payment needed to pay off a $200,000 loan in 15
|
@@ -113,9 +134,7 @@ There's a lot of formulas to be implemented, including:
|
|
113
134
|
* AMORLINC
|
114
135
|
* DB
|
115
136
|
* DDB
|
116
|
-
* IRR
|
117
137
|
* MIRR
|
118
|
-
* NPV
|
119
138
|
* PPMT
|
120
139
|
* SLN
|
121
140
|
* SYD
|
data/lib/exonio.rb
CHANGED
data/lib/exonio/financial.rb
CHANGED
@@ -144,6 +144,45 @@ module Exonio
|
|
144
144
|
next_guess
|
145
145
|
end
|
146
146
|
|
147
|
+
# Calculates the net present value of an investment based on a
|
148
|
+
# series of periodic cash flows and a discount rate.
|
149
|
+
#
|
150
|
+
# @param discount [Float] The discount rate of the investment over one period
|
151
|
+
# @param cashflows [Array] The first future cash flow + additional future cash flows
|
152
|
+
#
|
153
|
+
# @return [Float]
|
154
|
+
#
|
155
|
+
# @example
|
156
|
+
# Exonio.npv(0.281, [-100, 39, 59, 55, 20]) # ==> -0.00661872883563408
|
157
|
+
#
|
158
|
+
def npv(discount, cashflows)
|
159
|
+
total = 0
|
160
|
+
|
161
|
+
cashflows.each_with_index do |cashflow, index|
|
162
|
+
total += cashflow / (1 + discount) ** (index + 1)
|
163
|
+
end
|
164
|
+
|
165
|
+
total
|
166
|
+
end
|
167
|
+
|
168
|
+
# Calculates the internal rate of return on an investment based on a
|
169
|
+
# series of periodic cash flows.
|
170
|
+
#
|
171
|
+
# @param cashflows [Array] An array containing the income or payments
|
172
|
+
# associated with the investment
|
173
|
+
#
|
174
|
+
# @return [Float]
|
175
|
+
#
|
176
|
+
# @example
|
177
|
+
# Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28094842116...
|
178
|
+
#
|
179
|
+
def irr(values)
|
180
|
+
func = Helpers::IrrHelper.new(values)
|
181
|
+
guess = [ func.zero ]
|
182
|
+
nlsolve( func, guess)
|
183
|
+
guess[0]
|
184
|
+
end
|
185
|
+
|
147
186
|
private
|
148
187
|
|
149
188
|
# This method was borrowed from the NumPy rate formula
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Exonio
|
2
|
+
module Helpers
|
3
|
+
class IrrHelper
|
4
|
+
values = {
|
5
|
+
eps: '1.0e-16',
|
6
|
+
one: '1.0',
|
7
|
+
two: '2.0',
|
8
|
+
ten: '10.0',
|
9
|
+
zero: '0.0'
|
10
|
+
}
|
11
|
+
|
12
|
+
values.each do |key, value|
|
13
|
+
define_method key do
|
14
|
+
BigDecimal.new(value)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(transactions)
|
19
|
+
@transactions = transactions
|
20
|
+
end
|
21
|
+
|
22
|
+
def values(x)
|
23
|
+
value = Exonio.npv(x[0].to_f, @transactions)
|
24
|
+
[ value ]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/exonio/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exonio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafael Izidoro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- exonio.gemspec
|
89
89
|
- lib/exonio.rb
|
90
90
|
- lib/exonio/financial.rb
|
91
|
+
- lib/exonio/helpers.rb
|
91
92
|
- lib/exonio/version.rb
|
92
93
|
homepage: http://github.com/noverde/exonio
|
93
94
|
licenses: []
|