cash_flow_analysis 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -15
- data/Rakefile +11 -0
- data/cash_flow_analysis.gemspec +1 -1
- data/lib/cash_flow_analysis.rb +0 -3
- data/lib/cash_flow_analysis/version.rb +1 -1
- metadata +6 -9
- data/lib/cash_flow_analysis/calculation_error.rb +0 -8
- data/lib/cash_flow_analysis/calculator/xirr.rb +0 -29
- data/lib/cash_flow_analysis/util/objective_function.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6733d7147f9960c3406bc16a6d0cadfc47d2f13b
|
4
|
+
data.tar.gz: 6a596b24bb14ce9a3e6590ff0c27a84c5298d737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b452a60589f5a23eb56cca2ee89ec4412e88222bad6dc8ebce1239de2689b1b46bfe9259df7d693b29c286babc2aabbef92abab7431a9db49ab48ea9663856f
|
7
|
+
data.tar.gz: 8c9f9383465b66516ea18401994a1179c44a8da34a1b02ba9ab03a9e7e24ebd3b02ac7da937fcfced10f270be6e89961a67459c10fdd2ef43979c69e03d59518
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# CashFlowAnalysis
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/hightower/cash_flow_analysis.svg?branch=master)](https://travis-ci.org/hightower/cash_flow_analysis)
|
4
|
+
|
3
5
|
Ruby implementation of various financial analysis functions.
|
4
6
|
|
5
7
|
## Installation
|
@@ -40,21 +42,6 @@ CashFlowAnalysis::Calculator::Payment.calculate(10000, 60, 0.025)
|
|
40
42
|
# 323.5339590005929
|
41
43
|
```
|
42
44
|
|
43
|
-
### XIRR
|
44
|
-
|
45
|
-
Calculates the [XIRR](http://en.wikipedia.org/wiki/Internal_rate_of_return), assuming irregularly timed cash flows.
|
46
|
-
|
47
|
-
```
|
48
|
-
items = []
|
49
|
-
items << OpenStruct.new(date: Date.new(2008, 1, 1), amount: -10000)
|
50
|
-
items << OpenStruct.new(date: Date.new(2008, 3, 1), amount: 2750)
|
51
|
-
items << OpenStruct.new(date: Date.new(2008, 10, 30), amount: 4250)
|
52
|
-
items << OpenStruct.new(date: Date.new(2009, 2, 15), amount: 3250)
|
53
|
-
items << OpenStruct.new(date: Date.new(2009, 4, 1), amount: 2750)
|
54
|
-
CashFlowAnalysis::Calculator::Xirr.calculate(items)
|
55
|
-
# 0.373362533517793504136316860945228...
|
56
|
-
```
|
57
|
-
|
58
45
|
### XNPV
|
59
46
|
|
60
47
|
Calculates the [XNPV](http://en.wikipedia.org/wiki/Net_present_value), assuming irregularly timed cash flows.
|
data/Rakefile
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
2
3
|
|
4
|
+
desc "Run all specs in spec/"
|
5
|
+
task :spec do
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
7
|
+
t.fail_on_error = true
|
8
|
+
t.pattern = "./spec/**/*_spec.rb"
|
9
|
+
t.rspec_opts = %w[--color]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
task default: [:spec]
|
data/cash_flow_analysis.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler", "
|
21
|
+
spec.add_development_dependency "bundler", ">= 1.7"
|
22
22
|
spec.add_development_dependency "pry", "~> 0"
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "rspec", "~> 3.2"
|
data/lib/cash_flow_analysis.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
require "cash_flow_analysis/version"
|
2
|
-
require "cash_flow_analysis/calculation_error"
|
3
2
|
require "cash_flow_analysis/calculator/cagr"
|
4
3
|
require "cash_flow_analysis/calculator/payment"
|
5
|
-
require "cash_flow_analysis/calculator/xirr"
|
6
4
|
require "cash_flow_analysis/calculator/xnpv"
|
7
|
-
require "cash_flow_analysis/util/objective_function"
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cash_flow_analysis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hightower
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.7'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,12 +85,9 @@ files:
|
|
85
85
|
- bin/setup
|
86
86
|
- cash_flow_analysis.gemspec
|
87
87
|
- lib/cash_flow_analysis.rb
|
88
|
-
- lib/cash_flow_analysis/calculation_error.rb
|
89
88
|
- lib/cash_flow_analysis/calculator/cagr.rb
|
90
89
|
- lib/cash_flow_analysis/calculator/payment.rb
|
91
|
-
- lib/cash_flow_analysis/calculator/xirr.rb
|
92
90
|
- lib/cash_flow_analysis/calculator/xnpv.rb
|
93
|
-
- lib/cash_flow_analysis/util/objective_function.rb
|
94
91
|
- lib/cash_flow_analysis/version.rb
|
95
92
|
homepage: https://github.com/hightower/cash_flow_analysis
|
96
93
|
licenses:
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require "bigdecimal/newton"
|
2
|
-
|
3
|
-
module CashFlowAnalysis
|
4
|
-
module Calculator
|
5
|
-
module Xirr
|
6
|
-
extend Newton
|
7
|
-
|
8
|
-
# Calculates the {http://en.wikipedia.org/wiki/Internal_rate_of_return XIRR}, assuming irregularly timed cash flows.
|
9
|
-
#
|
10
|
-
# @param cash_flow_items [Array] items which have `#date` ([Date]) and `#amount` ([Numeric]) properties
|
11
|
-
# @return [Numeric] the XIRR for the cash flow
|
12
|
-
def self.calculate(cash_flow_items)
|
13
|
-
return nil if cash_flow_items.map(&:amount).none? { |amount| amount >= 0 }
|
14
|
-
return nil if cash_flow_items.map(&:amount).none? { |amount| amount < 0 }
|
15
|
-
|
16
|
-
objective_function = Util::ObjectiveFunction.new(Xnpv, cash_flow_items)
|
17
|
-
discount_rate_vector = [objective_function.one]
|
18
|
-
|
19
|
-
begin
|
20
|
-
nlsolve(objective_function, discount_rate_vector)
|
21
|
-
rescue RuntimeError => ex
|
22
|
-
raise CalculationError.new(ex)
|
23
|
-
end
|
24
|
-
|
25
|
-
discount_rate_vector.first
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module CashFlowAnalysis
|
2
|
-
module Util
|
3
|
-
class ObjectiveFunction
|
4
|
-
def eps
|
5
|
-
BigDecimal.new("1.0e-16")
|
6
|
-
end
|
7
|
-
|
8
|
-
def zero
|
9
|
-
BigDecimal.new("0.0")
|
10
|
-
end
|
11
|
-
|
12
|
-
def one
|
13
|
-
BigDecimal.new("1.0")
|
14
|
-
end
|
15
|
-
|
16
|
-
def two
|
17
|
-
BigDecimal.new("2.0")
|
18
|
-
end
|
19
|
-
|
20
|
-
def ten
|
21
|
-
BigDecimal.new("10.0")
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize(calculator, cash_flow_items)
|
25
|
-
@calculator = calculator
|
26
|
-
@cash_flow_items = cash_flow_items
|
27
|
-
end
|
28
|
-
|
29
|
-
def values(discount_rates)
|
30
|
-
[calculator.calculate(discount_rates.first.round(15), cash_flow_items)]
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
attr_reader :calculator
|
36
|
-
attr_reader :cash_flow_items
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|