1 个不稳定版本
0.0.0 | 2020年5月25日 |
---|
#27 在 #period
485KB
5K SLoC
finance-solution
finance-solution 是一个用于时间价值金融问题的库。 💸
以下人员可能会发现这个库很有用
- 金融学生,他们想使用比简易手持计算器更好的工具来解决金融问题。使用这个库还可以减少人为错误,并提供比 Excel 更好的输出和数据展示。
- 新开发者,他们想通过金融主题学习 Rust。
- 经验丰富的 Rust 开发者,他们想了解更多关于金融的知识。
- 严肃的 Rust 开发者,他们想构建金融软件,并更喜欢依赖于经过严格测试的库,而不是重新发明轮子,花费数百小时开发和测试自己的库。
目前,这个库针对以下基本金融方程式
- 简单时间价值公式 -- 包括
present_value
、future_value
、rate
和periods
(在 Excel 中称为 NPER)。 - 现金流时间价值公式 -- 包括
present_value_annuity
、future_value_annuity
、net_present_value
和payment
(在 Excel 中称为 PMT)。 - 利率转换 -- 包括所有
apr
、ear
和epr
之间的转换,还包括连续复利转换(apr_continuous
、ear_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()
函数在分析 payment
和 cashflow
信息时特别有帮助。
使用 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