NAME

App::CalcAccumulatedDiscounts - Calculate multi-year discounts from a per-year discount rate

VERSION

This document describes version 0.080 of App::CalcAccumulatedDiscounts (from Perl distribution App-CalcAccumulatedDiscounts), released on 2021-07-17.

SYNOPSIS

See the included script calc-accumulated-discounts.

FUNCTIONS

calc_accumulated_discounts

Usage:

calc_accumulated_discounts(%args) -> [$status_code, $reason, $payload, \%result_meta]

Calculate multi-year discounts from a per-year discount rate.

Examples:

  • Example #1:

    calc_accumulated_discounts();

    Result:

    [
      200,
      "OK",
      [
        [
          "Disc p.a. \\ Year",
          "5y",
          "10y",
          "15y",
          "20y",
          "25y",
          "30y",
          "35y",
          "40y",
          "45y",
          "50y",
        ],
        [
          "0.25%",
          "1.2%",
          "2.5%",
          "3.7%",
          "4.9%",
          "6.1%",
          "7.2%",
          "8.4%",
          "9.5%",
          "10.7%",
          "11.8%",
        ],
        [
          "0.50%",
          "2.5%",
          "4.9%",
          "7.2%",
          "9.5%",
          "11.8%",
          "14.0%",
          "16.1%",
          "18.2%",
          "20.2%",
          "22.2%",
        ],
        [
          "0.75%",
          "3.7%",
          "7.3%",
          "10.7%",
          "14.0%",
          "17.2%",
          "20.2%",
          "23.2%",
          "26.0%",
          "28.7%",
          "31.4%",
        ],
        [
          "1.00%",
          "4.9%",
          "9.6%",
          "14.0%",
          "18.2%",
          "22.2%",
          "26.0%",
          "29.7%",
          "33.1%",
          "36.4%",
          "39.5%",
        ],
        [
          "1.25%",
          "6.1%",
          "11.8%",
          "17.2%",
          "22.2%",
          "27.0%",
          "31.4%",
          "35.6%",
          "39.5%",
          "43.2%",
          "46.7%",
        ],
        [
          "1.50%",
          "7.3%",
          "14.0%",
          "20.3%",
          "26.1%",
          "31.5%",
          "36.5%",
          "41.1%",
          "45.4%",
          "49.3%",
          "53.0%",
        ],
        [
          "1.75%",
          "8.4%",
          "16.2%",
          "23.3%",
          "29.7%",
          "35.7%",
          "41.1%",
          "46.1%",
          "50.6%",
          "54.8%",
          "58.6%",
        ],
        [
          "2.00%",
          "9.6%",
          "18.3%",
          "26.1%",
          "33.2%",
          "39.7%",
          "45.5%",
          "50.7%",
          "55.4%",
          "59.7%",
          "63.6%",
        ],
        [
          "2.25%",
          "10.8%",
          "20.4%",
          "28.9%",
          "36.6%",
          "43.4%",
          "49.5%",
          "54.9%",
          "59.8%",
          "64.1%",
          "67.9%",
        ],
        [
          "2.50%",
          "11.9%",
          "22.4%",
          "31.6%",
          "39.7%",
          "46.9%",
          "53.2%",
          "58.8%",
          "63.7%",
          "68.0%",
          "71.8%",
        ],
        [
          "2.75%",
          "13.0%",
          "24.3%",
          "34.2%",
          "42.7%",
          "50.2%",
          "56.7%",
          "62.3%",
          "67.2%",
          "71.5%",
          "75.2%",
        ],
        [
          "3.00%",
          "14.1%",
          "26.3%",
          "36.7%",
          "45.6%",
          "53.3%",
          "59.9%",
          "65.6%",
          "70.4%",
          "74.6%",
          "78.2%",
        ],
        [
          "3.25%",
          "15.2%",
          "28.1%",
          "39.1%",
          "48.4%",
          "56.2%",
          "62.9%",
          "68.5%",
          "73.3%",
          "77.4%",
          "80.8%",
        ],
        [
          "3.50%",
          "16.3%",
          "30.0%",
          "41.4%",
          "51.0%",
          "59.0%",
          "65.7%",
          "71.3%",
          "76.0%",
          "79.9%",
          "83.2%",
        ],
        [
          "3.75%",
          "17.4%",
          "31.8%",
          "43.6%",
          "53.4%",
          "61.5%",
          "68.2%",
          "73.8%",
          "78.3%",
          "82.1%",
          "85.2%",
        ],
        [
          "4.00%",
          "18.5%",
          "33.5%",
          "45.8%",
          "55.8%",
          "64.0%",
          "70.6%",
          "76.0%",
          "80.5%",
          "84.1%",
          "87.0%",
        ],
        [
          "4.50%",
          "20.6%",
          "36.9%",
          "49.9%",
          "60.2%",
          "68.4%",
          "74.9%",
          "80.0%",
          "84.1%",
          "87.4%",
          "90.0%",
        ],
        [
          "5.00%",
          "22.6%",
          "40.1%",
          "53.7%",
          "64.2%",
          "72.3%",
          "78.5%",
          "83.4%",
          "87.1%",
          "90.1%",
          "92.3%",
        ],
      ],
      {
        "table.field_aligns" => [
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
          "number",
        ],
      },
    ]
  • Modify years and discount rates to generate:

    calc_accumulated_discounts(discounts => [1, 2, 2.5], years => [5, 10]);

    Result:

    [
      200,
      "OK",
      [
        ["Disc p.a. \\ Year", "5y", "10y"],
        ["1.00%", "4.9%", "9.6%"],
        ["2.00%", "9.6%", "18.3%"],
        ["2.50%", "11.9%", "22.4%"],
      ],
      { "table.field_aligns" => ["number", "number", "number"] },
    ]

This routine generates a table of accumulated discounts over a period of several years, given the annual discount rates.

I first wrote this to see the accumulated fees when choosing mutual funds products. The moral of the story is, if you plan to hold a fund for a long time (e.g. 5-10 years or longer) you should pick funds that are low in annual fees (e.g. 1% or lower). Otherwise, the annual management fees will eat up most, if not all, your potential profits.

This function is not exported.

Arguments ('*' denotes required arguments):

  • discounts => array[float] (default: [0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75,4,4.5,5])

  • years => array[int] (default: [5,10,15,20,25,30,35,40,45,50])

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-CalcAccumulatedDiscounts.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-CalcAccumulatedDiscounts.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-CalcAccumulatedDiscounts

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2021, 2017, 2015 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.