Dav*_*itt 4 .net math apr calculus
好.我是这个网站的新手所以"Hello All"!好吧,我上周一直在努力解决一个棘手的问题,我很感激你能给我的任何帮助.
我知道有很多公式来计算APR,但我已经测试了很多公式,他们没有适当地处理封闭式(消费者贷款)的Odd-Days.政府试图通过在他们的真实借贷法案中公布附录J,给予我们凡人一些帮助.它可以在这里找到:https://www.fdic.gov/regulations/laws/rules/6500-3550.html
如果你很勇敢(!!),你可以看到他们提供的公式将解决APR,包括贷款的奇数天数.奇数天是贷款开始时的天数,并不是定期付款确实涵盖的,但仍在支付利息.例如,您在2012年1月20日以1,000.00美元的价格获得贷款,并且您的第一笔付款是03/01/2012.从2012年1月20日到2012年1月30日,您有10个奇数日.他们的计算所有月份都是30天.
我所希望的是具有重要微积分背景的人,他可以解释你在附录J中找到的公式.并解释他们用来解决这些公式的精算方法.我理解迭代过程.我首先尝试使用Newton-Raphson方法解决这个问题,但我的APR公式没有考虑奇数天.它在不可能出现的奇怪案例中表现得很好,但没有奇怪的日子,但却在奇数日里挣扎.
我知道阅读这份文件非常困难!我已经取得了一些进展,但有些事情我无法弄清楚他们是怎么做的.他们似乎通过魔术引入了一些东西.
无论如何,提前感谢您的帮助!:)
好吧,你不是在开玩笑说文件有点难以阅读.解决方案实际上并没有那么糟糕,具体取决于实现.我没有多次尝试使用他们各种简化的论坛,并最终使用通用公式(8)获得它.从技术上讲,这是一种简化.实际的通用公式将为period其他参数获取长度数组,并在循环中使用它们的索引.您可以使用此方法获取迭代步骤的A'和A''.奇数日由处理(1.0 + fractions*rate),如1 + f i文档中所示.费率是每个期间的费率,而不是整个apr.
public double generalEquation(int period, double payment, double initialPeriods, double fractions, double rate)
{
double retval = 0;
for (int x = 0; x < period; x++)
retval += payment / ((1.0 + fractions*rate)*Math.pow(1+rate,initialPeriods + x));
return retval;
}
Run Code Online (Sandbox Code Playgroud)
迭代的行为与文档在其示例(9)中所说的一样.
/**
*
* @param amount The initial amount A
* @param payment The periodic payment P
* @param payments The total number of payments n
* @param ppy The number of payment periods per year
* @param APRGuess The guess to start estimating from, 10% is 0.1, not 0.001
* @param partial Odd days, as a fraction of a pay period. 10 days of a month is 0.33333...
* @param full Full pay periods before the first payment. Usually 1.
* @return The calculated APR
*/
public double findAPRGEQ(double amount, double payment, int payments, double ppy, double APRGuess, double partial, double full)
{
double result = APRGuess;
double tempguess = APRGuess;
do
{
result = tempguess;
//Step 1
double i = tempguess/(100*ppy);
double A1 = generalEquation(payments, payment, full, partial, i);
//Step 2
double i2 = (tempguess + 0.1)/(100*ppy);
double A2 = generalEquation(payments, payment, full, partial, i2);
//Step 3
tempguess = tempguess + 0.1*(amount - A1)/(A2 - A1);
System.out.println(tempguess);
} while (Math.abs(result*10000 - tempguess*10000) > 1);
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,作为一般规则,使用double进行货币计算是不好的,就像我在这里所做的那样,但我正在编写一个SO示例,而不是生产代码.此外,它是java而不是.net,但它应该帮助您使用算法.