#period #rate #value #solution #formula #payment #convert

finance-solution

一个提供详细解决方案和美观打印表格的金融时间价值函数库

1 个不稳定版本

0.0.0 2020年5月25日

#27#period

MIT 许可证

485KB
5K SLoC

finance-solution

finance-solution 是一个用于时间价值金融问题的库。 💸

以下人员可能会发现这个库很有用

  • 金融学生,他们想使用比简易手持计算器更好的工具来解决金融问题。使用这个库还可以减少人为错误,并提供比 Excel 更好的输出和数据展示。
  • 新开发者,他们想通过金融主题学习 Rust。
  • 经验丰富的 Rust 开发者,他们想了解更多关于金融的知识。
  • 严肃的 Rust 开发者,他们想构建金融软件,并更喜欢依赖于经过严格测试的库,而不是重新发明轮子,花费数百小时开发和测试自己的库。

目前,这个库针对以下基本金融方程式

  • 简单时间价值公式 -- 包括 present_valuefuture_valuerateperiods(在 Excel 中称为 NPER)。
  • 现金流时间价值公式 -- 包括 present_value_annuityfuture_value_annuitynet_present_valuepayment(在 Excel 中称为 PMT)。
  • 利率转换 -- 包括所有 aprearepr 之间的转换,还包括连续复利转换(apr_continuousear_continuous)。

示例

一个商业伙伴将在3年后给你4000美元。你在市场上的回报率是5%。这笔交易对你现在来说价值多少?

使用 present_value() 返回 f64 类型的值

let future_value = 4_000;
let periods = 3;
let rate = 0.05;
let pv = present_value(rate, periods, future_value);
dbg!(pv);

// PRINTS TO TERMINAL:
// pv = 3455.350394125904 

该包还提供了用于四舍五入的辅助函数,例如 round_4,用于四舍五入到四位小数。有关更多详细信息,请参阅 round

对于上述相同的问题,您可以使用 _solution 函数查看更好的输出并提供附加功能。

使用 present_value_solution() 返回一个自定义的 "solution" 结构体

let future_value = 4_000;
let periods = 3;
let rate = 0.05;
let answer = present_value_solution(rate, periods, future_value);
dbg!(answer);

// PRINTS TO TERMINAL:
// answer = TvmSolution {
//    calculated_field: PresentValue,
//    rate: 0.05,
//    periods: 3,
//    fractional_periods: 3.0,
//    present_value: 3455.350394125904,
//    future_value: 4000.0,
//    formula: "3455.3504 = 4000.0000 / (1.050000 ^ 3)",
//    formula_symbolic: "pv = fv / (1 + r)^n",
//}

如果您想探索计算过程中的每个周期发生了什么,您可以使用任何解决方案输出的 .series() 方法

使用 present_value_solution().series() 返回每个周期的 vec

let future_value = 4_000;
let periods = 3;
let rate = 0.05;
let answer = present_value_solution(rate, periods, future_value);
dbg!(answer.series());

// PRINTS TO TERMINAL:
// answer.series() = TvmSeries(
//     [
//         TvmPeriod {
//             period: 0,
//             rate: 0.0,
//             value: 3455.3503941259037,
//             formula: "3455.3504 = 3628.1179 / 1.050000",
//             formula_symbolic: "value = {next period value} / (1 + r)",
//         },
//         TvmPeriod {
//             period: 1,
//             rate: 0.05,
//             value: 3628.117913832199,
//             formula: "3628.1179 = 3809.5238 / 1.050000",
//             formula_symbolic: "value = {next period value} / (1 + r)",
//         },
//         TvmPeriod {
//             period: 2,
//             rate: 0.05,
//             value: 3809.523809523809,
//             formula: "3809.5238 = 4000.0000 / 1.050000",
//             formula_symbolic: "value = {next period value} / (1 + r)",
//         },
//         TvmPeriod {
//             period: 3,
//             rate: 0.05,
//             value: 4000.0,
//             formula: "4000.0000",
//             formula_symbolic: "value = fv",
//         },
//     ],
// )

要将每个周期以表格格式查看,请使用 .print_table() 方法。

使用 present_value_solution().series().print_table() 返回一个美观打印的表格

use num_format::{Locale};

let future_value = 4_000;
let periods = 3;
let rate = 0.05;
let answer = present_value_solution(rate, periods, future_value);
dbg!(answer.series().print_table());
// or use .print_table_locale() to specify your formatting preferences.
dbg!(answer.series().print_table_locale(&Locale::en, 4));

// PRINTS TO TERMINAL:
// period    rate       value
// ------  ------  ----------
//      0  0.0000  3,455.3504
//      1  0.0500  3,628.1179
//      2  0.0500  3,809.5238
//      3  0.0500  4,000.0000

在上面的表格中,您可以指定地区,如果您更喜欢不同的货币格式。例如,您的国家可能更喜欢 8.532,11 而不是 8,532.11。美观打印的表格可以轻松地复制粘贴到电子表格中。

.print_table() 函数在分析 paymentcashflow 信息时特别有帮助。

使用 payment_solution().series().print_table() 返回一个美观打印的表格

let present_value = 13_000;
let periods = 5;
let rate = 0.08;
let answer = payment_solution(rate, periods, present_value, 0);
dbg!(answer.series().print_table());

// PRINTS TO TERMINAL:
// period  payments_to_date  payments_remaining    principal  principal_to_date  principal_remaining     interest  interest_to_date  interest_remaining
// ------  ----------------  ------------------  -----------  -----------------  -------------------  -----------  ----------------  ------------------
//      1       -3,255.9339        -13,023.7356  -2,215.9339        -2,215.9339         -10,784.0661  -1,040.0000       -1,040.0000         -2,239.6695
//      2       -6,511.8678         -9,767.8017  -2,393.2086        -4,609.1425          -8,390.8575    -862.7253       -1,902.7253         -1,376.9443
//      3       -9,767.8017         -6,511.8678  -2,584.6653        -7,193.8078          -5,806.1922    -671.2686       -2,573.9939           -705.6757
//      4      -13,023.7356         -3,255.9339  -2,791.4385        -9,985.2464          -3,014.7536    -464.4954       -3,038.4893           -241.1803
//      5      -16,279.6695              0.0000  -3,014.7536       -12,999.0000              -0.0000    -241.1803       -3,279.6695              0.0000

如上表所示,finance-solution 库不仅提供了问题(-3,255.9339)的答案,还详细地展示了每个周期发生的情况。

使用 finance-solution 的好处

这个库经过数百小时的设计,旨在使其易于使用、简单和准确。

亮点包括

  • finance-solution 提供了 f64 函数,几乎所有函数都可以通过在函数名后添加 _solution 来提供更有帮助的输出,并添加了额外的功能。我们强烈建议您在可能的情况下使用 _solution 函数!
  • _solution 结构体只增加了微小的代码执行时间,12-30 纳秒...如在我们的 benches 部分所示。
  • 所有公式都经过严格的测试,包括单元测试、集成测试和 "对称性" 测试。
  • 当可能时,函数参数遵循一致的排序,例如 "rate, periods, ...",这样用户就可以几乎猜出参数的排序。
  • _solution().series().print_table() 的表格输出允许用户指定地区以进行特定货币的格式化,输出可以轻松地复制粘贴到电子表格中(Excel、Google Sheet 等)。
  • 在存储库的 examples 文件夹中提供了示例问题,使用户能够了解如何使用 finance-solution 解决财务问题。
  • 函数具有内置的断言、panic和甚至warn!日志,以防止用户犯下常见错误,尤其是在比率方面。
  • 函数旨在易于使用,因此用户可以提供f64或f32或u32或i8... 任何数值格式的货币都可以被函数接受,并转换为f64,以便于用户使用。
  • 功能参数,如比率期数,被严格限制为f64的比率和u32的期数。期数不允许为负,并且期数大于2000可能导致计算机固有的浮点表示错误,因此我们在我们认为输入可能导致最终输出不准确的情况下提供了warn!。是否启用警告日志由用户决定。

此crate的待办事项

我们有要包含在此crate中的项目清单

  • 内部收益率(IRR)
  • 修正内部收益率(MIRR)
  • 加权平均资本成本(WACC)
  • 现值和未来值年金表(变化利率和现金流)
  • 回收期
  • 盈利指数
  • 投资回报率
  • 摊销
  • 每期支付金额(PPMT)
  • 每期利息支付金额(IPMT)
  • 永续年金
  • 累计本金(CUMPRINC)
  • 累计利息支付(CUMIPMT)
  • 债券
  • 投资回报率(ROI)
  • 72法则(及相关函数)
  • 直线法(SLN)
  • 扩展净现值(XNPV)
  • 扩展内部收益率(XIRR)

依赖项

~4-13MB
~133K SLoC