interest_days 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/.github/workflows/main.yml +3 -1
- data/.gitignore +1 -0
- data/CHANGELOG.md +5 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +7 -1
- data/README.md +5 -4
- data/interest_days.gemspec +2 -0
- data/lib/interest_days/calculation/icma_act_act.rb +71 -0
- data/lib/interest_days/calculation/us_eom_30_360.rb +3 -3
- data/lib/interest_days/calculator.rb +2 -1
- data/lib/interest_days/version.rb +1 -1
- data/lib/interest_days.rb +1 -0
- metadata +19 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 12518b1ae316f0c47b62233c4b7e48cf26653488c21028a02d0ec455013e4e41
|
|
4
|
+
data.tar.gz: 1eab20b63b6c8e62b95a952345743c90f84e079c54fc9620f5b2e33086dc5e83
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 100baf4853195b3d2fe8a81d3e71b773f038d9684c897d28e8ae715ad4bb199e3d411ecae6a55c931687a13fd0c00b92590eeb9dde36c37ba0ace8332d08ce08
|
|
7
|
+
data.tar.gz: 0db0edf6bb9fa4512f2e1c35c04e297e26f7124268d7fb82a6993f7a65a355e1d833e28cf268f5e24d81d972f7b89422306feb40520881369c91df3ac48cb479
|
data/.github/workflows/main.yml
CHANGED
|
@@ -13,7 +13,9 @@ jobs:
|
|
|
13
13
|
ruby-version: '2.7.3'
|
|
14
14
|
bundler-cache: true
|
|
15
15
|
- name: Run the default task
|
|
16
|
-
run: bundle exec rake
|
|
16
|
+
run: COVERAGE=true bundle exec rake
|
|
17
|
+
env:
|
|
18
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
17
19
|
- name: Upload coverage to Codecov
|
|
18
20
|
uses: codecov/codecov-action@v2
|
|
19
21
|
with:
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
|
|
2
|
+
## [0.5.0] / 2022-11-07
|
|
3
|
+
==================
|
|
4
|
+
* Add ICMA act/act strategy.
|
|
5
|
+
|
|
2
6
|
## [0.4.1] / 2022-04-12
|
|
3
7
|
==================
|
|
4
8
|
|
|
@@ -9,7 +13,7 @@
|
|
|
9
13
|
|
|
10
14
|
* Update readme file.
|
|
11
15
|
* Bump version to 0.4.0.
|
|
12
|
-
* Add Isda
|
|
16
|
+
* Add Isda act/act strategy. #11
|
|
13
17
|
|
|
14
18
|
## [0.3.0] / 2022-02-03
|
|
15
19
|
==================
|
data/Gemfile
CHANGED
|
@@ -8,8 +8,8 @@ gemspec
|
|
|
8
8
|
gem "rake", "~> 13.0"
|
|
9
9
|
|
|
10
10
|
group :test, :development do
|
|
11
|
-
gem "codecov", "~> 0.6.0"
|
|
11
|
+
gem "codecov", "~> 0.6.0", require: false
|
|
12
12
|
gem "rspec", "~> 3.0"
|
|
13
13
|
gem "rubocop", "~> 1.7"
|
|
14
|
-
gem "simplecov", "~> 0.21.2"
|
|
14
|
+
gem "simplecov", "~> 0.21.2", require: false
|
|
15
15
|
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
interest_days (0.
|
|
4
|
+
interest_days (0.5.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
@@ -9,11 +9,16 @@ GEM
|
|
|
9
9
|
ast (2.4.2)
|
|
10
10
|
codecov (0.6.0)
|
|
11
11
|
simplecov (>= 0.15, < 0.22)
|
|
12
|
+
coderay (1.1.3)
|
|
12
13
|
diff-lcs (1.4.4)
|
|
13
14
|
docile (1.4.0)
|
|
15
|
+
method_source (1.0.0)
|
|
14
16
|
parallel (1.20.1)
|
|
15
17
|
parser (3.0.2.0)
|
|
16
18
|
ast (~> 2.4.1)
|
|
19
|
+
pry (0.13.1)
|
|
20
|
+
coderay (~> 1.1)
|
|
21
|
+
method_source (~> 1.0)
|
|
17
22
|
rainbow (3.0.0)
|
|
18
23
|
rake (13.0.6)
|
|
19
24
|
regexp_parser (2.1.1)
|
|
@@ -64,6 +69,7 @@ PLATFORMS
|
|
|
64
69
|
DEPENDENCIES
|
|
65
70
|
codecov (~> 0.6.0)
|
|
66
71
|
interest_days!
|
|
72
|
+
pry (~> 0.13.1)
|
|
67
73
|
rake (~> 13.0)
|
|
68
74
|
rspec (~> 3.0)
|
|
69
75
|
rubocop (~> 1.7)
|
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# InterestDays
|
|
2
2
|
|
|
3
|
-
This gem
|
|
4
|
-
- Since version 0.2 interest_day gem
|
|
3
|
+
This gem provides interest day factor calculation based on ISDA conventions e.g. Isda Act 360.
|
|
4
|
+
- Since version 0.2 interest_day gem supported 30/360 US EOM and 30/360 Bond Basis conventions.
|
|
5
5
|
- Since version 0.3 the gem also supports Isda Act 364
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
@@ -22,7 +22,7 @@ Or install it yourself as:
|
|
|
22
22
|
|
|
23
23
|
## Usage
|
|
24
24
|
|
|
25
|
-
You can
|
|
25
|
+
You can simply use the InterestDays::Calculator like:
|
|
26
26
|
|
|
27
27
|
```ruby
|
|
28
28
|
calculator = InterestDays::Calculator.new(start_date: start, end_date: end, strategy: :isda_act_360)
|
|
@@ -30,7 +30,7 @@ calculator = InterestDays::Calculator.new(start_date: start, end_date: end, stra
|
|
|
30
30
|
calculator.interest_day_count_factor
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
currently there
|
|
33
|
+
currently, there are five supported conventions:
|
|
34
34
|
- :isda_act_360
|
|
35
35
|
- :isda_act_364
|
|
36
36
|
- :isda_act_365
|
|
@@ -38,6 +38,7 @@ currently there a five supported conventions:
|
|
|
38
38
|
- :isda_30_e_360
|
|
39
39
|
- :us_eom_30_360
|
|
40
40
|
- :bond_basis_30_360
|
|
41
|
+
- :icma_act_act
|
|
41
42
|
|
|
42
43
|
As often, [Wikipedia](https://en.wikipedia.org/wiki/Day_count_convention) is the best resource, so check it out to get more insights into these conventions.
|
|
43
44
|
|
data/interest_days.gemspec
CHANGED
|
@@ -31,10 +31,12 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
|
|
32
32
|
# Uncomment to register a new dependency of your gem
|
|
33
33
|
# spec.add_dependency "example-gem", "~> 1.0"
|
|
34
|
+
spec.add_development_dependency "pry", "~> 0.13.1"
|
|
34
35
|
spec.add_development_dependency "rspec", "~> 3.2"
|
|
35
36
|
spec.add_development_dependency "rubocop-rake"
|
|
36
37
|
spec.add_development_dependency "rubocop-rspec"
|
|
37
38
|
|
|
38
39
|
# For more information and examples about making a new gem, checkout our
|
|
39
40
|
# guide at: https://bundler.io/guides/creating_gem.html
|
|
41
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
40
42
|
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module InterestDays
|
|
4
|
+
module Calculation
|
|
5
|
+
# ISDA Act Act Convention calculation
|
|
6
|
+
class IcmaActAct < Base
|
|
7
|
+
DAYS_IN_YEAR = 365
|
|
8
|
+
DAYS_IN_LEAP_YEAR = 366
|
|
9
|
+
|
|
10
|
+
def day_count_factor
|
|
11
|
+
return days.fdiv(start_date_days_in_year) if start_date_and_end_date_in_same_year?
|
|
12
|
+
|
|
13
|
+
if years_in_between_factor > 1
|
|
14
|
+
return start_date_period_factor + years_in_between_factor + end_date_period_factor
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
days.fdiv(year_days_in_period)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def year_days_in_period
|
|
23
|
+
period_contains_leap_day? ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def period_contains_leap_day?
|
|
27
|
+
!leap_day.nil? && leap_day.between?(start_date, end_date)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def leap_day
|
|
31
|
+
@leap_day ||= if start_date.leap?
|
|
32
|
+
Date.new(start_date.year, 2, 29)
|
|
33
|
+
elsif end_date.leap?
|
|
34
|
+
Date.new(end_date.year, 2, 29)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def start_date_period_factor
|
|
39
|
+
(start_date_days_in_year - start_date.yday).fdiv(start_date_days_in_year)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def end_date_period_factor
|
|
43
|
+
end_date.yday.fdiv(end_date_days_in_year)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def years_in_between_factor
|
|
47
|
+
(end_date.year - start_date.year) - 1
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def start_date_period_with_leap_date?
|
|
51
|
+
start_date.leap? && start_date.month < 3
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def end_date_period_with_leap_date?
|
|
55
|
+
end_date.leap? && end_date >= Date.new(end_date.year, 2, 29)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def start_date_and_end_date_in_same_year?
|
|
59
|
+
start_date.year.eql?(end_date.year)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def start_date_days_in_year
|
|
63
|
+
start_date_period_with_leap_date? ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def end_date_days_in_year
|
|
67
|
+
end_date_period_with_leap_date? ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -8,8 +8,8 @@ module InterestDays
|
|
|
8
8
|
|
|
9
9
|
# D2 day
|
|
10
10
|
def end_date_days
|
|
11
|
-
if ((@start_date.month == 2 && @start_date.
|
|
12
|
-
(@end_date.month == 2 && @end_date.
|
|
11
|
+
if ((@start_date.month == 2 && @start_date.day == days_in_month_for(@start_date)) &&
|
|
12
|
+
(@end_date.month == 2 && @end_date.day == days_in_month_for(@end_date))) ||
|
|
13
13
|
(@end_date.day == 31 && @start_date.day >= 30)
|
|
14
14
|
RELEVANT_DAY_IN_MONTH
|
|
15
15
|
else
|
|
@@ -19,7 +19,7 @@ module InterestDays
|
|
|
19
19
|
|
|
20
20
|
# D1 day
|
|
21
21
|
def start_date_days
|
|
22
|
-
if (@start_date.month == 2 && @start_date.
|
|
22
|
+
if (@start_date.month == 2 && @start_date.day == days_in_month_for(@start_date)) || @start_date.day == 31
|
|
23
23
|
RELEVANT_DAY_IN_MONTH
|
|
24
24
|
else
|
|
25
25
|
@start_date.day
|
|
@@ -27,7 +27,8 @@ module InterestDays
|
|
|
27
27
|
isda_act_act: InterestDays::Calculation::IsdaActAct,
|
|
28
28
|
isda_30_e_360: InterestDays::Calculation::Isda30e360,
|
|
29
29
|
bond_basis_30_360: InterestDays::Calculation::Isda30e360,
|
|
30
|
-
us_eom_30_360: InterestDays::Calculation::UsEom30360
|
|
30
|
+
us_eom_30_360: InterestDays::Calculation::UsEom30360,
|
|
31
|
+
icma_act_act: InterestDays::Calculation::IcmaActAct
|
|
31
32
|
}
|
|
32
33
|
end
|
|
33
34
|
end
|
data/lib/interest_days.rb
CHANGED
|
@@ -9,6 +9,7 @@ require "interest_days/calculation/isda_act_360"
|
|
|
9
9
|
require "interest_days/calculation/isda_act_364"
|
|
10
10
|
require "interest_days/calculation/isda_act_365"
|
|
11
11
|
require "interest_days/calculation/isda_act_act"
|
|
12
|
+
require "interest_days/calculation/icma_act_act"
|
|
12
13
|
require "interest_days/calculation/isda_30_e_360"
|
|
13
14
|
|
|
14
15
|
module InterestDays
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: interest_days
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Eugen Mueller
|
|
@@ -9,8 +9,22 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2022-
|
|
12
|
+
date: 2022-11-07 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: pry
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - "~>"
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: 0.13.1
|
|
21
|
+
type: :development
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - "~>"
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: 0.13.1
|
|
14
28
|
- !ruby/object:Gem::Dependency
|
|
15
29
|
name: rspec
|
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -75,6 +89,7 @@ files:
|
|
|
75
89
|
- interest_days.gemspec
|
|
76
90
|
- lib/interest_days.rb
|
|
77
91
|
- lib/interest_days/calculation/base.rb
|
|
92
|
+
- lib/interest_days/calculation/icma_act_act.rb
|
|
78
93
|
- lib/interest_days/calculation/isda_30_e_360.rb
|
|
79
94
|
- lib/interest_days/calculation/isda_act_360.rb
|
|
80
95
|
- lib/interest_days/calculation/isda_act_364.rb
|
|
@@ -91,6 +106,7 @@ metadata:
|
|
|
91
106
|
homepage_uri: https://github.com/eugenmueller/interest_days
|
|
92
107
|
source_code_uri: https://github.com/eugenmueller/interest_days
|
|
93
108
|
changelog_uri: https://github.com/eugenmueller/interest_days/blob/v0.2.0/CHANGELOG.md
|
|
109
|
+
rubygems_mfa_required: 'true'
|
|
94
110
|
post_install_message:
|
|
95
111
|
rdoc_options: []
|
|
96
112
|
require_paths:
|
|
@@ -106,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
106
122
|
- !ruby/object:Gem::Version
|
|
107
123
|
version: '0'
|
|
108
124
|
requirements: []
|
|
109
|
-
rubygems_version: 3.
|
|
125
|
+
rubygems_version: 3.3.17
|
|
110
126
|
signing_key:
|
|
111
127
|
specification_version: 4
|
|
112
128
|
summary: Interest day calculation
|