计算年百分比(需要继承代码的一些帮助)

2023-12-13

我正在制作一个应用程序,为客户提供大致的贷款报价(稍后由其他后台系统计算)。 我从我们为其制作计算器的金融公司收到了一些代码。 我的问题是我不理解计算年百分比率(包括启动费和月费)的代码部分。

他们可能正在使用这种方法,但我不能真正告诉:http://www.efunda.com/math/num_rootfinding/num_rootfinding.cfm#Newton_Raphson

代码工作正常,但我真的很讨厌在我不完全理解和/或信任的代码上构建应用程序。 最终的答复将是执行相同操作的源代码,但带有注释和易于理解的变量名称(我并不是真正例外:-) 欢迎所有想法 - 也许有人有解释它的文章的链接。

(请注意,我绝不是数学或金融奇才)

[snip]
int n = numberOfPayments;
double a = (amount / (monthlyPayment * Math.Pow(n, 2)) - (monthlyPayment / amount));
double d = 0;
if (a == 0)
{
    d = 0;
}
else
{
    for (int qq = 0; qq < 20; qq++)
    {
        double b = amount + (monthlyPayment / a) * (1 - (Math.Pow((1 + a), -n)));
        double c = amount + (monthlyPayment / a) * ((n * (Math.Pow((1 + a), (-n - 1)))) - ((1 - (Math.Pow((1 + a), -n))) / a));
        d = a - (b / c);
        double aa = a;
        double dd = d;
        a = d;
        if (Math.Abs(aa - dd) < Math.Pow(10, -5)) { break; }
    }
}
double apr = ((Math.Pow((1 + d), 12)) - 1) * 100;
apr = Math.Round(apr * 100) / 100;
[/snip]

该代码确实使用了牛顿拉夫森方法,尽管我不知道它到底在计算什么;您可能复制了错误的部分。事实上,如果您想计算给定贷款金额、每月还款额和月数的年利率,那么您几乎已经完全解决了这个问题,只是您可能不知道该函数是什么is正在寻找其根源,这是可以理解的,这是一个绊脚石。

正在搜索的值称为内部收益率(IRR) 没有封闭形式;你必须以困难的方式计算它或使用数值方法。计算年百分比率是 IRR 的一个特例,其中所有付款均等且贷款按期限偿还。这意味着等式如下:

P 是本金/贷款金额,m 是每月还款额,i 是利率,N 是月数

0 = P - Sum[k=1..N](m*(1+i)^(-k))

我们必须解决 i。上式等价于:

P = Sum[k=1..N](m*(1+i)^(-k))
P = m * Sum[k=1..N]((1+i)^(-k))  // monthly payments all the same
P/m = Sum[k=1..N]((1+i)^(-k))

有一些公式可以得到右侧总和的封闭形式,从而得出以下等式,该等式将我们已知的所有数量(期限、贷款和每月还款额)联系起来,并且更容易处理:

monthlyPayment = loanAmount * interestRate * ((1 + interestRate)^numberOfPayments)/(((1 + interestRate)^numberOfPayments) - 1)

为了减少输入,让:

  • P 是本金/贷款金额
  • m 是定期付款金额
  • N 是付款总数

所以我们要求根的方程是:

F(x) = P * x * ((1 + x)^N)/(((1 + x)^N) - 1) - m 

要使用牛顿-拉夫森方法,我们需要first 衍生物F 相对于 x:

F_1(x) = P * ( (1 + x)^N/(-1 + (1 + x)^N) - ((N * x * (1 + x)^(-1 + 2*N))/(-1 + (1 + x)^N)^2) + (N * x * (1 + x)^(-1 + N))/(-1 + (1 + x)^N) )

以下代码在Groovy进行正确的计算:

numPay = 360
payment = 1153.7
amount = 165000
double error = Math.pow(10,-5)
double approx = 0.05/12 // let's start with a guess that the APR is 5% 
double prev_approx

def F(x) {
  return amount * x * Math.pow(1 + x,numPay)/(Math.pow(1 + x,numPay) - 1) - payment
}

def F_1(x) {
  return amount * ( Math.pow(1 + x,numPay)/(-1 + Math.pow(1 + x,numPay)) - numPay * x * Math.pow(1 + x,-1 + 2*numPay)/Math.pow(-1 + Math.pow(1 + x,numPay),2) + numPay * x * Math.pow(1 + x,-1 + numPay)/(-1 + Math.pow(1 + x,numPay))) 
}


println "initial guess $approx"
for (k=0;k<20;++k) {
       prev_approx = approx
       approx = prev_approx - F(prev_approx)/F_1(prev_approx)
       diff = Math.abs(approx-prev_approx)
       println "new guess $approx diff is $diff"
       if (diff < error) break
}

apr = Math.round(approx * 12 * 10000)/100 // this way we get APRs like 7.5% or 6.55%
println "APR is ${apr}% final approx $approx "

我没有使用提供的代码,因为它有点模糊(而且它对我不起作用)。我从牛顿-拉普森和每月抵押​​贷款支付方程的定义中得出了这一点。近似值收敛得非常快(2 或 3 次迭代内达到 10^-5)

注意:我无法为首次提到一阶导数的文本正确插入此链接:http://www.wolframalpha.com/input/?i=d/dx(+x+*+((1+%2B+x)^n)/(((1+%2B+x)^n)+-+1)+-m+)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算年百分比(需要继承代码的一些帮助) 的相关文章

  • Optiver Realized Volatility:Introduction to financial concepts and data - [中文翻译]

    Introduction to financial concepts and data Optiver波动率预测概述评估时间线预测时间线 金融概念与数据介绍订单簿 Order Book 交易 xff08 Trade xff09 做市与市场效
  • 信用卡评分笔记

    信用卡评分语言 R语言 python 信用卡评分模型 ROC曲线 lift曲线 lorenz曲线 logistic回归 ROC IV WOE gini KS lift
  • 信用卡评分模型(R语言)

    信用卡评分 2016年1月10日 一 数据准备 1 问题的准备 目标 要完成一个评分卡 通过预测某人在未来两年内将会经历财务危机的可能性来提高信用评分的效果 帮助贷款人做出最好的决策 背景 银行在市场经济中起到至关重要的作用 他们决定谁在什
  • 风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)

    本笔记源于CDA DSC课程 由常国珍老师主讲 该训练营第一期为风控主题 培训内容十分紧凑 非常好 推荐 CDA数据科学家训练营 一 风控建模流程以及分类模型建设 1 建模流程 该图源自课程讲义 主要将建模过程分为了五类 数据准备 变量粗筛
  • 如何在 Eclipse 中访问内部 Java 包?

    我有一个使用 Java 11 或 Java 10 在 Eclipse 中打开的旧 Java 8 项目 Eclipse 现在正确地抱怨无法访问的包 例如 com apple laf AquaComboBoxUI 从命令行编译时 我可以通过添加
  • “为了钱,总是小数”?

    嗯 规则 对于金钱来说 总是小数 不适用于 Microsoft 开发团队内部 因为如果是 Namespace Microsoft VisualBasic Assembly Microsoft VisualBasic in Microsoft
  • 将标量和数组元素传递给需要数组的过程

    我有一些遗留的 Fortran 77 代码 我试图至少在不发出警告的情况下进行编译 不禁用警告 有些子例程调用会传递一个标量 而子例程需要一个数组 因为标量被用作大小为 1 的数组 所以这不会导致任何问题 但是使用英特尔编译器 如果我启用接
  • 将旧版 VB6 函数调用转换为 .NET 的实用程序 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个实用程序 工
  • R:如何访问tibble中的tibble?

    我正在读哈德利的 http r4ds had co nz tibbles html 然而 我仍然很难在小标题中引用小标题 gt library tidyquant gt f lt tq get F get key ratios gt f A
  • 与旧系统的 CQRS

    我希望将一个具有清晰域模型的相对较新的基于 Web 的应用程序转换为更多 CQRS 风格的系统 我的新应用程序本质上是对现有旧系统的增强替代 我的组织中的现有系统共享一组通用数据库 这些数据库由整个公司孤岛中存在的无数应用程序 通过混沌方法
  • 在 PHP 中,如何将过程代码包装在类中?

    我有一大块遗留的 php 代码 我需要与之交互 如下所示 legacy php function foo function bar 我希望能够将这些遗留函数包装在一个类中或以某种方式 require once 而不污染该全局命名空间或更改原
  • 免费 API 或类似工具可获取股票的下一个收益日期 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 API 或类似的 API 我可以在其中获取股票的下一个 即将到来的 收益日期 我已经用
  • 将单元测试添加到遗留代码[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您是否曾经在事后向遗留代码中添加过单元测试 代码有多复杂 存根和模拟所有内容有多困难 最终的结果值得吗 我发现最好的方法是逐步添加单元测试 而不
  • 如何将好的代码与遗留/怪异模式代码分开

    给定一些实现某些广泛协议或类似协议 例如 FTP 的库 我如何将符合标准的代码与仅需要能够与不那么符合标准的系统配合的代码分开 一个很好的例子 恕我直言 像 jQuery 这样的库必须考虑所有这些浏览器的特性 必须保持遗留兼容性的项目也可能
  • 将 cout 和 stdout 重定向到 C++ 中的字符串以进行单元测试

    我正在努力在单元测试下获取一些遗留代码 有时感知现有程序行为的唯一方法是从控制台输出 我在网上看到很多关于如何将 stdout 重定向到 C 中的另一个文件的示例 但是有没有办法可以将其重定向到内存中的流 以便我的测试不必依赖于磁盘 我希望
  • 清理遗留代码“header spaghetti”

    任何清理 标题意大利面 的推荐做法 这会导致极其严重的后果 编译时间慢 Linux Unix GCC 中是否有相当于 pragma Once 的东西 发现与此相关的冲突消息 Thanks 假设您熟悉 包含防护 ifdef 在标头开头 加快构
  • 如何在多线程环境中使用旧的单线程 C++ 库

    我有一个旧的 C 库 它是为在单线程环境中使用而设计的 该库公开了用于初始化的接口 这改变了库的内部数据结构 以及仅读取数据和进行计算的用法 我的目标是在 Windows 多线程应用程序中使用这个库 不同的线程调用使用不同数据初始化的 dl
  • 遗留代码中的泛型

    我们有相当多的代码刚刚跳转到 Java 5 我们一直在那些打算在 Java 5 版本中发布的组件中使用泛型 但是剩下的代码当然充满了原始代码类型 我已将编译器设置为生成原始类型错误并开始手动清除它们 但按照目前的速度 这将需要very很长时
  • GNUPLOT 绘制 5 天的财务周

    我已经寻找了一段时间 以找出如何从财务图中删除一周中的几天 但没有成功 我需要该图仅包含一周中的几天并完全忽略周末 以便财务图表中没有 2 天的差距 我有 CSV 格式的开盘 低 收盘 高数据 并且缺少周末数据 它绘制得很好 但我找不到如何
  • 在 numpy 中获取日志返回的最有效方法是什么

    构建日志返回序列的最快且最优雅的解决方案是什么 问题主要在于映射一个函数 该函数将第 i 个和第 i 1 个元素作为数组中每个元素的输入 对于函数和简单数组 我可以定义日志返回 如下所示 import numpy as np ar np r

随机推荐

  • 如何转换为模板类型?

    在 gdb 中 如果你有一个指向某个东西的指针 你可以在打印它之前对其进行转换 例如 这有效 print int 0xDEADBEEF 但是 如何打印std vector
  • 为什么 Map 不能在 chrome/node 中进行子类化?

    所以 ES 6 给我们带来了Maps 而且不会太快 为了实现我自己的邪恶目的 我希望对 Map 进行子类化 我尝试了以下操作 为了清楚起见 进行了缩写 function Foo return Map apply this slice cal
  • 添加突出显示不适用于 Elasticsearch 2.3.3 中的 has_child 查询

    当我使用 hasChildQuery 时 一切正常 但是当我添加addHighlightedField 方法 它不起作用 以下是我的代码 TermsLookupQueryBuilder terms QueryBuilders termsLo
  • 从 Angular 中的自定义表单组件访问 FormControl

    我的 Angular 应用程序中有一个自定义表单控制组件 它实现了ControlValueAccessor界面 但是 我想访问FormControl实例 与我的组件关联 我正在使用反应式形式FormBuilder并使用提供表单控制formC
  • Gnuplot 工作流程涉及多重绘图的拟合循环

    我想在 gnuplot 中执行以下操作 读取我的文件 这些文件被方便地标记为 filenameN txt 其中 N 是第 N 个文件 使用 aN bN 将一些多项式 fN x 拟合到数据中 并使用 multiplot 将所有这些绘制在单个图
  • 有反向映射功能吗?

    在 clojure 中 您可以将函数映射到值序列 是否有一个内置函数可以将单个值作为参数映射到一系列函数 map inc 1 2 3 4 gt 2 3 4 5 reverse map inc dec str 1 gt 2 0 1 rever
  • 什么是spark.python.worker.memory?

    谁能给我更准确地描述这个 Spark 参数以及它如何影响程序执行 我无法从文档中确切地看出这个参数 在幕后 的作用 该参数影响 Python 工作线程的内存限制 如果Python工作进程的RSS大于内存限制 那么它会将数据从内存溢出到磁盘
  • setNeedsLayout 与 setNeedsUpdateConstraints 和 layoutIfNeeded 与 updateConstraintsIfNeeded

    我知道自动布局链基本上由 3 个不同的过程组成 更新约束 布局视图 这是我们计算帧的地方 display 我不完全清楚的是两者之间的内在区别 setNeedsLayout and setNeedsUpdateConstraints 来自苹果
  • 使用 python 和请求进行 Instagram 身份验证

    我需要为我的项目创建 Instagram 登录表单 我已经编写了这段代码 但它不能正常工作 我需要在请求后获取 sessionid cookie def authorize inst url https www instagram com
  • 如何合并两个数据库,具有相同的数据,但具有不同的主键,且没有重复的字段?

    我有两个 mdb 文件 如果需要的话 我还可以将其转换为 MySQL 数据库 如何将这两个不同的数据库合并为一个 这个想法是从两个数据库获取所有信息并将其合并为一个 而不复制任何客户端 问题是两个bds都有相同的客户端和不同的客户端 但是客
  • 防伪令牌适用于用户“”,但当前用户是“用户名”

    我正在构建一个单页应用程序并遇到防伪令牌问题 我知道为什么会出现这个问题 只是不知道如何解决 当发生以下情况时我收到错误 未登录用户加载对话框 带有生成的防伪令牌 用户关闭对话框 用户登录 用户打开相同的对话框 用户在对话框中提交表单 防伪
  • nuspec contentFiles 未添加到项目中

    我有一个网络项目 mvc5 项目 json inside 另外 我有一个 nuget 包 在这个包中 除了 dll 引用之外 我有一些内容文件 cshtml 文件 css javascript 等 有 2 个目标需要实现 将包安装到项目后
  • Python 硒和验证码

    我有一个抓取机器人 每当遇到验证码时我都想停止它 以免惹恼网站 但是selenium找不到它 driver find element by xpath id recaptcha anchor 这是 chrome 给我的 xpath ERRO
  • Tailwind CSS,不尊重类优先级

    我有以下元素 td class td 它的所有类名都是通过组件自动生成的 除了最后一个 min w 0 Since min w 0是列出的最后一个类名 我希望它能够覆盖min w 10rem 列出的第 1 类名称 然而 由于某种原因 min
  • 将数据框中的每一列转换为单独的数据框

    假设我有一个包含 10 列的数据框 其中 10 列中的每一列代表一个单独的时间序列 我想将每个时间序列 或数据帧的每一列 存储在单独的数据帧中 我尝试使用 allocate columnname df i 其中 i 是 for 循环中的变量
  • 在android中的EditText上输入时如何过滤ListView数据

    我有一个ListView and a EditText 如何在输入内容时过滤 ListView 数据EditText Add TextWatcher to EditText addTextChangedListener In onTextC
  • 将收件箱和已发送短信与所有短信区分开来

    我正在开发一个 Android 应用程序 在我的应用程序中 我必须列出所有对话 并且我完成了该部分 每个对话都包含发送到该号码的所有短信 所以我必须将收件箱和已发送短信与所有短信区分开来 我知道以下 api 可用于查找收件箱和已发送短信 c
  • 通过悬停另一个元素使一个元素可见(不带 :hover-property)

    好吧 问题是这样的 我有这三个 DIV div div div div div div 这三个 DIV 不可见 display none 位于页面上完全不同的位置 div div div div div div 我想做的是 如果我将鼠标悬停
  • 如何获得类型依赖于隐式参数的方法参数?

    trait JsonOps J type ObjectFields def partitionObjectFields fields ObjectFields fieldNames List String ObjectFields Obje
  • 计算年百分比(需要继承代码的一些帮助)

    我正在制作一个应用程序 为客户提供大致的贷款报价 稍后由其他后台系统计算 我从我们为其制作计算器的金融公司收到了一些代码 我的问题是我不理解计算年百分比率 包括启动费和月费 的代码部分 他们可能正在使用这种方法 但我不能真正告诉 http