{"id":25842213,"url":"https://github.com/gunnarpdx/elixir-finance","last_synced_at":"2025-03-01T05:38:21.470Z","repository":{"id":62429601,"uuid":"264866229","full_name":"GunnarPDX/Elixir-Finance","owner":"GunnarPDX","description":"🏦 A financial modeling lib for Elixir, contains functions for calculating useful stuff like EBITDA, book-value-eps, etc...","archived":false,"fork":false,"pushed_at":"2020-12-06T02:44:56.000Z","size":1893,"stargazers_count":29,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-28T22:42:17.559Z","etag":null,"topics":["finance","financial-modeling","financial-statements","investing","portfolio"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GunnarPDX.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-18T07:47:13.000Z","updated_at":"2024-11-16T07:28:39.000Z","dependencies_parsed_at":"2022-11-01T20:07:59.879Z","dependency_job_id":null,"html_url":"https://github.com/GunnarPDX/Elixir-Finance","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunnarPDX%2FElixir-Finance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunnarPDX%2FElixir-Finance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunnarPDX%2FElixir-Finance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GunnarPDX%2FElixir-Finance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GunnarPDX","download_url":"https://codeload.github.com/GunnarPDX/Elixir-Finance/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241322549,"owners_count":19944073,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["finance","financial-modeling","financial-statements","investing","portfolio"],"created_at":"2025-03-01T05:38:21.006Z","updated_at":"2025-03-01T05:38:21.456Z","avatar_url":"https://github.com/GunnarPDX.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Elixir Financial Library 🏦\n\n[![MIT License](https://img.shields.io/apm/l/atomic-design-ui.svg?)](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs)\n[![Hex.pm Version](http://img.shields.io/hexpm/v/financials.svg?style=flat)](https://hex.pm/packages/financials)\n\nA financial modeling library for elixir. Contains functions that can be used as building blocks for complex financial modeling.\n\n## Hex\n\n- Package: [Link](https://hex.pm/packages/financials)\n- Hex Docs: [Link](https://hexdocs.pm/financials/api-reference.html)\n\n## Installation\n\nThe package can be installed by adding `financial` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:financials, \"~\u003e 0.1.0\"}\n  ]\nend\n```\n\n## Usage\n\n### Params \n\nAll arguments must be decimals with the exception of \"strictly integer type\" arguments such as `days` which may be either decimal, float or int. If you are unsure just use decimals.\n\n\n### Return Values\n\nRequests return a 2-tuple with the standard `:ok` or `:error` status.\n\nAll results within `:ok` tuples are Decimals, and are string error-messages in `:error` tuples.\n\n\n#### Ex:\n```elixir\n# Use Decimals\ntotal_liabilities = D.new(\"100500700.45\")\ntotal_equity = D.from_float(30050070.77)\n\n# Successful response\n{:ok, result} = Financials.debt_to_equity(total_liabilities, total_equity)\n\n# Unsuccessful response due to argument type\n{:error, \"Arguments must be decimals\"} = Financials.debt_to_equity(123.23, \"23.45\")\n\n# Unsuccessful response due to argument value\n{:error, \"total_equity can't equal zero (Divide by zero error)\"} = Financials.debt_to_equity(total_liabilities, 0)\n```\n\n\n## Decimal Context\n- For more info check the `Decimal` hex docs [here](https://hexdocs.pm/decimal/readme.html#using-the-context).\n\n#### Using the context\n\nThe context specifies the maximum precision of the result of calculations and\nthe rounding algorithm if the result has a higher precision than the specified\nmaximum. It also holds the list of set of trap enablers and the currently set\nflags.\n\nThe context is stored in the process dictionary, this means that you don't have\nto pass the context around explicitly and the flags will be updated\nautomatically.\n\nThe context is accessed with `Decimal.Context.get/0` and set with\n`Decimal.Context.set/1`. It can also be temporarily set with\n`Decimal.Context.with/2`.\n\n```elixir\niex\u003e D.Context.get()\n %Decimal.Context{flags: [:rounded, :inexact], precision: 9, rounding: :half_up,\n  traps: [:invalid_operation, :division_by_zero]}\n\niex\u003e D.Context.set(%D.Context{D.Context.get() | traps: []})\n :ok\n\niex\u003e D.Context.get()\n %Decimal.Context{flags: [:rounded, :inexact], precision: 9, rounding: :half_up,\n  traps: []}\n```\n\n#### Precision and rounding\n\nThe precision is used to limit the amount of decimal digits in the coefficient:\n\n```elixir\niex\u003e D.Context.set(%D.Context{D.Context.get() | precision: 9})\n :ok\n\niex\u003e D.div(100, 3)\n #Decimal\u003c33.3333333\u003e\n\niex\u003e D.Context.set(%D.Context{D.Context.get() | precision: 2})\n :ok\n\niex\u003e D.div(100, 3)\n #Decimal\u003c33\u003e\n```\n\nThe rounding algorithm specifies how the result of an operation shall be rounded\nwhen it get be represented with the current precision:\n\n```elixir\niex\u003e D.Context.set(%D.Context{D.Context.get() | rounding: :half_up})\n :ok\n\niex\u003e D.div(31, 2)\n #Decimal\u003c16\u003e\n\niex\u003e D.Context.set(%D.Context{D.Context.get() | rounding: :floor})\n :ok\n\niex\u003e D.div(31, 2)\n #Decimal\u003c15\u003e\n```\n\n## Functions\n\n#### Net Income\n\n```elixir\nnet_income(total_revenues, total_expenses)\n```\n\n#### Earnings\n```elixir\nearnings(net_income, preferred_dividends)\n```\n\n#### Retained Earnings\n```elixir\nretained_earnings(beginning_period_retained_earnings, net_income, cash_dividends, stock_dividends)\n```\n\n#### Operating Cash Flow\n```elixir\nocf(operating_income, depreciation, taxes, change_in_working_capital)\n```\n\n#### Return on Revenue\n```elixir\nror(net_income, sales_revenue)\n```\n\n#### Return on Sales\n```elixir\nros(operating_profit, net_sales)\n```\n#### COGS -- Cost of Goods Sold\n```elixir\ncogs(beginning_inventory, purchases, ending_inventory)\n```\n\n#### EBIT -- Earnings Before Interest and Taxes\n```elixir\nebit(revenue, cogs, operating_expenses)\n```\n\n#### EBITA -- Earnings Before Interest, Taxes, and Amortization\n```elixir\nebita(revenue, cogs, operating_expenses, amortization)\n```\n\n#### EBITDA -- Earnings Before Interest, Taxes, Depreciation, and Amortization\n```elixir\nebitda(net_income, interest_expense, taxes, depreciation, amortization)\n```\n\n#### Receivable Turnover Ratio\n```elixir\nreceivable_turnover_ratio(net_credit_sales, average_accounts_receivable)\n```\n\n#### Accumulated Depreciation to Fixed Assets\n```elixir\naccumulated_depreciation_to_fixed_assets(accumulated_depreciation, total_fixed_assets)\n```\n\n#### Asset Coverage\n```elixir\nasset_coverage(total_assets, intangible_assets, current_liabilities, short_term_debt, total_debt)\n```\n\n#### Asset Turnover\n```elixir\nasset_turnover(net_sales, average_total_sales)\n```\n\n#### Average Inventory Period\n```elixir\naverage_inventory_period(days, inventory_turnover)\n```\n\n#### Average Payment Period\n```elixir\naverage_payment_period(average_accounts_payable, total_credit_purchases, days)\n```\n\n#### Break Even Analysis\n```elixir\nbreak_even_analysis(fixed_costs, sales_price_per_unit, variable_cost_per_unit)\n```\n\n#### Capitalization Ratio\n```elixir\ncapitalization_ratio(total_debt, shareholders_equity)\n```\n\n#### Cash Conversion Cycle\n```elixir\ncash_conversion_cycle(days_inventory_outstanding, days_sales_outstanding, days_payables_outstanding)\n```\n\n#### Cash Flow Coverage\n```elixir\ncash_flow_coverage(operating_cash_flows, total_debt)\n```\n\n#### Cash Ratio\n```elixir\ncash_ratio(cash, cash_equivalents, total_current_liabilities)\n```\n\n#### CAGR -- Compounded Annual Growth Rate\n```elixir\ncagr(beginning_investment_value, ending_investment_value, years)\n```\n\n#### Contribution Margin\n```elixir\ncontribution_margin(net_sales, variable_costs)\n```\n\n#### Current Ratio\n```elixir\ncurrent_ratio(current_assets, current_liabilities)\n```\n\n#### DPO -- Days Payable Outstanding\n```elixir\ndpo(accounts_payable, cost_of_sales, days)\n```\n\n#### Days Sales in Inventory\n```elixir\ndays_sales_in_inventory(ending_inventory, cogs)\n```\n\n#### Days Sales Outstanding\n```elixir\ndays_sales_outstanding(accounts_receivable, net_credit_sales)\n```\n\n#### Debt Ratio\n```elixir\ndebt_ratio(total_liabilities, total_assets)\n```\n\n#### Debt Service Coverage Ratio\n```elixir\ndscr(operating_income, total_debt_service_costs)\n```\n\n#### Debt to Asset Ratio\n```elixir\ndebt_to_asset(total_debt, total_assets)\n```\n\n#### Debt to Capital Ratio\n```elixir\ndebt_to_capital(total_debt, shareholders_equity)\n```\n\n#### Debt to Equity Ratio\n```elixir\ndebt_to_equity(total_liabilities, total_equity)\n```\n\n#### Debt to Income Ratio\n```elixir\ndti(total_monthly_debt_payments, gross_monthly_income)\n```\n\n#### Defensive Interval Ratio\n```elixir\ndir(defensive_assets, daily_operational_expenses)\n```\n\n#### EPS -- Earnings Per Share - Basic\n```elixir\neps_basic(earnings, shares_outstanding)\n```\n\n#### Diluted Earnings Per Share\n```elixir\neps_diluted(earnings, shares_outstanding, diluted_shares)\n```\n\n#### Pro-Forma Earnings Per Share\n```elixir\neps_pro_forma(acquirers_net_income, targets_net_income, incremental_adjustments, shares_outstanding, diluted_shares)\n```\n\n#### Book Value Earning Per Share\n```elixir\neps_book_value(total_equity, preferred_equity, shares_outstanding)\n```\n\n#### Retained Earnings Per Share\n```elixir\neps_retained(retained_earnings, shares_outstanding)\n```\n\n#### Cash Earnings Per Share\n```elixir\neps_cash(operating_cash_flow, shares_outstanding)\n```\n\n#### PE -- Price to Earnings Ratio\n```elixir\npe_ratio(price, earnings_per_share)\n```\n\n#### Price to Earnings to Growth Ratio\n```elixir\npeg_ratio(price_to_earnings, earnings_growth)\n```\n\n#### Dividend Payout Ratio\n```elixir\ndividend_payout(net_dividends, net_income)\n```\n\n#### Dividend Yield\n```elixir\ndividend_yield(cash_dividends_per_share, market_value_per_share)\n```\n\n#### DuPont Analysis\n```elixir\ndu_pont_analysis(profit_margin, total_asset_turnover, financial_leverage)\n```\n\n#### Enterprise Value\n```elixir\nev(market_capitalization, debt, current_cash)\n```\n\n#### Equity Multiplier\n```elixir\nequity_multiplier(total_assets, total_stockholders_equity)\n```\n\n#### Equity Ratio\n```elixir\nequity_ratio(total_equity, total_assets)\n```\n\n#### Expense Ratio\n```elixir\nexpense_ratio(operating_expenses, average_value_of_fund_assets)\n```\n\n#### Fixed Asset Turnover Ratio\n```elixir\nfixed_asset_turnover_ratio(net_sales, fixed_assets, accumulated_depreciation)\n```\n\n#### Fixed Charge Coverage Ratio\n```elixir\nfixed_charge_coverage_ratio(ebit, fixed_charges_before_taxes, interest)\n```\n\n#### Free Cash Flow\n```elixir\nfcf(operating_cash_flow, capital_expenditures)\n```\n\n#### Goodwill to Assets\n```elixir\ngoodwill_to_assets(goodwill, assets)\n```\n\n#### Gross Margin Ratio\n```elixir\ngross_margin_ratio(gross_margin, net_sales)\n```\n\n#### Gross Profit\n```elixir\ngross_profit(total_sales, cogs)\n```\n\n#### Interest Coverage Ratio \n```elixir\ninterest_coverage_ratio(ebit, interest_expense)\n```\n\n#### Inventory Turnover Ratio\n```elixir\ninventory_turnover_ratio(cogs, average_inventory)\n```\n\n#### Loan to Value Ratio\n```elixir\nltv(mortgage_amount, appraised_value_of_property)\n```\n\n#### Long Term Debt to Total Asset Ratio \n```elixir\nlong_term_debt_to_total_asset_ratio(long_term_debt, total_assets)\n```\n\n#### Margin of Safety\n```elixir\nmargin_of_safety(actual_sales, break_even_point)\n```\n\n#### Margin of Safety Ratio\n```elixir\nmargin_of_safety_ratio(actual_sales, break_even_point)\n```\n\n#### Margin of Revenue\n```elixir\nmargin_of_revenue(change_in_total_revenues, change_in_quantity_sold)\n```\n\n\n\n\n## Contributing\n\nOpen an issue or create a fork and submit a pull request.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgunnarpdx%2Felixir-finance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgunnarpdx%2Felixir-finance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgunnarpdx%2Felixir-finance/lists"}