https://github.com/nolantait/bankroll
A ruby library for calculating the time value of money with ordinary fixed annuities like mortgages
https://github.com/nolantait/bankroll
finance mortgage mortgage-calculator mortgages ruby time-value-of-money
Last synced: 2 months ago
JSON representation
A ruby library for calculating the time value of money with ordinary fixed annuities like mortgages
- Host: GitHub
- URL: https://github.com/nolantait/bankroll
- Owner: nolantait
- License: mit
- Created: 2022-02-08T14:09:14.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2022-03-02T03:57:49.000Z (about 3 years ago)
- Last Synced: 2024-09-01T04:48:38.382Z (8 months ago)
- Topics: finance, mortgage, mortgage-calculator, mortgages, ruby, time-value-of-money
- Language: Ruby
- Homepage:
- Size: 69.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Bankroll
Bankroll is a set of financial calculations for mortgages and loans.
The goal of this library is to make time value of money calculations
understandable and decomposed into well written functions.I find most financial math libraries to be somewhat opaque so hopefully
this helps when learning how to calculate mortgages and other annuity based
investments.Features:
- Uses safe math with BigDecimal through the Bankroll::Decimal api
- Handles only ordinary annuities (annuities due at the END of the period)
- Implements most excel functions using some inspiration from Exonio gem## Installation
Add this line to your application's Gemfile:
```ruby
gem 'bankroll'
```And then execute:
$ bundle install
Or install it yourself as:
$ gem install bankroll
## Usage
```ruby
# What is the monthly payment?
payment = Bankroll.payment(
periods: 360,
interest_rate: 0.01 / 12.0,
present_value: 1_000_000
).round
puts payment #=> Bankroll::Decimal["3_216.40"]# What was the original loan amount?
original_amount = Bankroll.present_value(
periods: 360, # 30 years
monthly_payment: 3_216.40,
interest_rate: 0.01 / 12.0, # 1% APR
).roundputs original_amount #=> Bankroll::Decimal["1_000_001.49"]
# What does the balance look like after a single mortgage payment?
unpaid_balance = Bankroll.unpaid_balance(
present_value: 1_000_000,
interest_rate: 0.01 / 12.0,
periods: 360,
period: 1,
payment: 3_216.40
).roundputs unpaid_balance #=> Bankroll::Decimal["997_616.94"]
# What was the interest rate?
interest_rate = Bankroll.interest_rate(
present_value: 1_000_000,
periods: 360,
payment: -3_216.40,
).round(3)puts interest_rate #=> Bankroll::Decimal["0.833e-3"]
# What is the annuity factor of a rate for n periods?
annuity_factor = Bankroll.annuity_factor(
interest_rate: 0.01,
periods: 2
).round(4)puts annuity_factor #=> Bankroll::Decimal["1.9704"]
# What is the total interest paid on a 500_000 1% mortgage
interest_paid = Bankroll.cumulative_interest(
periods: 360,
interest_rate: 0.01 / 12.0,
payment: 1_608.20,
present_value: 500_000
).roundputs interest_paid #=> Bankroll::Decimal["832.34"]
# What is the total cost of a 500_000 1% loan with interest?
total_amount = Bankroll.future_value(
present_value: 0,
interest_rate: 0.01 / 12.0,
periods: 360,
payment: 1_608.20
).roundputs total_amount #=> Bankroll::Decimal["647_846.10"]
# What is the interest payment on the 17th period of a $165,000 3% mortgage?
interest_payment = Bankroll.interest_payment(
interest_rate: 0.03 / 12.0,
periods: 360,
period: 17,
present_value: 165_000
).roundputs interest_payment #=> Bankroll::Decimal["400.96"]
# How many periods until a -$1000 account with -$100/month reaches $10_000 with
# 12% interest rate?
total_periods = Bankroll.total_periods(
interest_rate: 0.12 / 12.0,
payment: -100,
present_value: -1_000,
future_value: 10_000
)puts total_periods #=> Bankroll::Decimal["59.67"]
# What is the amortization schedule of a $165_000 3% 30 year mortgage?
amortization_schedule = Bankroll.amortization_schedule(
present_value: 165_000,
interest_rate: 0.03 / 12.0,
periods: 360
)puts amortization_schedule.payments #=> [
# Bankroll::AmortizationSchedule::Payment.new(
# payment: Bankroll::Decimal["695.65"],
# principal: Bankroll::Decimal["283.15"],
# interest: Bankroll::Decimal["412.50"],
# total_interest: Bankroll::Decimal["412.50"],
# balance: Bankroll::Decimal["164_716.85"]
# )
# ... and 359 more payments
# ]```
## Development
After checking out the repo, run `bin/setup` to install dependencies.
Then, run `rake spec` to run the tests. You can also run `bin/console` for an
interactive prompt that will allow you to experiment.To install this gem onto your local machine, run `bundle exec rake install`.
To release a new version, update the version number in `version.rb`, and then
run `bundle exec rake release`, which will create a git tag for the version,
push git commits and the created tag, and push the `.gem` file
to [rubygems.org](https://rubygems.org).## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/nolantait/bankroll.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).