Finance (finance v1.4.3)

Copy Markdown View Source

Financial calculations for cash-flow analysis, time value of money, depreciation, and risk.

The functions are organised into domain modules:

  • Finance.CashFlow — net present value and internal rate of return (npv, xnpv, irr, xirr, mirr).
  • Finance.TVM — time value of money (pv, fv, pmt, ipmt, ppmt, nper, rate) and amortization_schedule.
  • Finance.Rates — rate conversions (effective_annual_rate, nominal_rate, continuous_to_periodic).
  • Finance.Bonds — fixed income (price, ytm, duration, modified_duration, convexity).
  • Finance.Depreciationsln, syd, ddb, db.
  • Finance.Returns — performance and risk metrics (volatility, cagr, payback_period, discounted_payback_period, profitability_index, twr).
  • Finance.Solver — the root-finding strategy behind the rate functions, swappable via the :solver option or config :finance, solver: MySolver.

Deprecated flat API

Every function is also available directly on Finance (e.g. Finance.xirr/1), but those delegators are deprecated and will be removed in 2.0 — call the domain module instead, for example:

Finance.CashFlow.xirr([{~D[2019-01-01], -1000}, {~D[2020-01-01], 1100}])
#=> {:ok, 0.1}

Options

The rate-finding and value functions take an optional keyword list. Options are validated with nimble_options: an unknown key or bad value raises, while problems with the data come back as {:error, reason}.

  • :guess (float/0) - initial rate for the Newton-Raphson solver The default value is 0.1.

  • :tolerance (float/0) - convergence threshold on the net present value The default value is 1.0e-9.

  • :max_iterations (pos_integer/0) - cap on solver iterations before giving up The default value is 100.

  • :precision (non_neg_integer/0) - decimal places the result is rounded to The default value is 6.

  • :solver (atom/0) - module implementing the Finance.Solver behaviour (defaults to Finance.Solver.Newton)

Summary

Types

A cash-flow amount: any number, or a Decimal when that optional dependency is installed.

A cash flow on a given date. Money coming in is positive, money going out is negative.

A date, given either as a Date struct or as an Erlang-style {year, month, day} tuple.

A reason returned as {:error, reason} when the data can't yield a result.

A keyword option accepted by the rate-finding and value functions.

An annual rate of return expressed as a fraction, so 0.1 means 10%.

Functions

Types

amount()

@type amount() :: number() | Decimal.t()

A cash-flow amount: any number, or a Decimal when that optional dependency is installed.

cash_flow()

@type cash_flow() :: {date(), amount()}

A cash flow on a given date. Money coming in is positive, money going out is negative.

date()

@type date() :: Date.t() | {integer(), integer(), integer()}

A date, given either as a Date struct or as an Erlang-style {year, month, day} tuple.

error()

@type error() ::
  :mismatched_lengths
  | :insufficient_data
  | :single_signed_flow
  | :invalid_date
  | :did_not_converge
  | :undefined

A reason returned as {:error, reason} when the data can't yield a result.

option()

@type option() ::
  {:guess, number()}
  | {:tolerance, number()}
  | {:max_iterations, pos_integer()}
  | {:precision, non_neg_integer()}
  | {:solver, module()}

A keyword option accepted by the rate-finding and value functions.

rate()

@type rate() :: float()

An annual rate of return expressed as a fraction, so 0.1 means 10%.

Functions

db(cost, salvage, life, period, month \\ 12)

This function is deprecated. Use Finance.Depreciation.db/5.

See Finance.Depreciation.db/5.

db!(cost, salvage, life, period, month \\ 12)

This function is deprecated. Use Finance.Depreciation.db!/5.

See Finance.Depreciation.db!/5.

ddb(cost, salvage, life, period, factor \\ 2)

This function is deprecated. Use Finance.Depreciation.ddb/5.

See Finance.Depreciation.ddb/5.

ddb!(cost, salvage, life, period, factor \\ 2)

This function is deprecated. Use Finance.Depreciation.ddb!/5.

See Finance.Depreciation.ddb!/5.

fv(rate, nper, pmt, pv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.fv/5.

See Finance.TVM.fv/5.

fv!(rate, nper, pmt, pv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.fv!/5.

See Finance.TVM.fv!/5.

irr(amounts)

This function is deprecated. Use Finance.CashFlow.irr/1.

See Finance.CashFlow.irr/1.

irr(amounts, opts)

This function is deprecated. Use Finance.CashFlow.irr/2.

See Finance.CashFlow.irr/2.

irr!(amounts, opts \\ [])

This function is deprecated. Use Finance.CashFlow.irr!/1.

See Finance.CashFlow.irr!/2.

mirr(amounts, finance_rate, reinvest_rate, opts \\ [])

This function is deprecated. Use Finance.CashFlow.mirr/3.

See Finance.CashFlow.mirr/4.

mirr!(amounts, finance_rate, reinvest_rate, opts \\ [])

This function is deprecated. Use Finance.CashFlow.mirr!/3.

See Finance.CashFlow.mirr!/4.

nper(rate, pmt, pv, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.nper/5.

See Finance.TVM.nper/5.

nper!(rate, pmt, pv, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.nper!/5.

See Finance.TVM.nper!/5.

npv(rate, amounts)

This function is deprecated. Use Finance.CashFlow.npv/2.

See Finance.CashFlow.npv/2.

npv(rate, amounts, opts)

This function is deprecated. Use Finance.CashFlow.npv/3.

See Finance.CashFlow.npv/3.

npv!(rate, amounts)

This function is deprecated. Use Finance.CashFlow.npv!/2.

See Finance.CashFlow.npv!/2.

pmt(rate, nper, pv, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.pmt/5.

See Finance.TVM.pmt/5.

pmt!(rate, nper, pv, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.pmt!/5.

See Finance.TVM.pmt!/5.

pv(rate, nper, pmt, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.pv/5.

See Finance.TVM.pv/5.

pv!(rate, nper, pmt, fv \\ 0.0, type \\ 0)

This function is deprecated. Use Finance.TVM.pv!/5.

See Finance.TVM.pv!/5.

rate(nper, pmt, pv, fv \\ 0.0, type \\ 0, opts \\ [])

This function is deprecated. Use Finance.TVM.rate/6.

See Finance.TVM.rate/6.

rate!(nper, pmt, pv, fv \\ 0.0, type \\ 0, opts \\ [])

This function is deprecated. Use Finance.TVM.rate!/6.

See Finance.TVM.rate!/6.

sln(cost, salvage, life)

This function is deprecated. Use Finance.Depreciation.sln/3.

See Finance.Depreciation.sln/3.

sln!(cost, salvage, life)

This function is deprecated. Use Finance.Depreciation.sln!/3.

See Finance.Depreciation.sln!/3.

syd(cost, salvage, life, period)

This function is deprecated. Use Finance.Depreciation.syd/4.

See Finance.Depreciation.syd/4.

syd!(cost, salvage, life, period)

This function is deprecated. Use Finance.Depreciation.syd!/4.

See Finance.Depreciation.syd!/4.

volatility(prices, opts \\ [])

This function is deprecated. Use Finance.Returns.volatility/2.

See Finance.Returns.volatility/2.

volatility!(prices, opts \\ [])

This function is deprecated. Use Finance.Returns.volatility!/2.

See Finance.Returns.volatility!/2.

xirr(cash_flows)

This function is deprecated. Use Finance.CashFlow.xirr/1.

See Finance.CashFlow.xirr/1.

xirr(first, second)

This function is deprecated. Use Finance.CashFlow.xirr/2.

See Finance.CashFlow.xirr/2.

xirr(dates, values, opts)

This function is deprecated. Use Finance.CashFlow.xirr/3.

See Finance.CashFlow.xirr/3.

xirr!(cash_flows)

This function is deprecated. Use Finance.CashFlow.xirr!/1.

See Finance.CashFlow.xirr!/1.

xirr!(first, second)

This function is deprecated. Use Finance.CashFlow.xirr!/2.

See Finance.CashFlow.xirr!/2.

xnpv(rate, cash_flows)

This function is deprecated. Use Finance.CashFlow.xnpv/2.

See Finance.CashFlow.xnpv/2.

xnpv(rate, cash_flows, opts)

This function is deprecated. Use Finance.CashFlow.xnpv/3.

See Finance.CashFlow.xnpv/3.

xnpv!(rate, cash_flows)

This function is deprecated. Use Finance.CashFlow.xnpv!/2.

See Finance.CashFlow.xnpv!/2.