将F#中的财务期限函数转换为C#

将F#中的财务期限函数转换为C#,f#,duration,financial,F#,Duration,Financial,我的任务是将一些用F#编写的特定财务函数迁移到C# 我正在使用的F#库非常优秀(),但是环境因素阻止了使用需要部署的无限制权限将CLR程序集部署到SQL Server 我遇到问题的具体函数是MacAuley持续时间公式。我是F#的新手,如果F#专家能解释下面的代码片段,我将不胜感激: let aggrFunction acc index = let x5 = float index - 1. + x1 let x6 = pow x3 x5

我的任务是将一些用F#编写的特定财务函数迁移到C# 我正在使用的F#库非常优秀(),但是环境因素阻止了使用需要部署的无限制权限将CLR程序集部署到SQL Server

我遇到问题的具体函数是MacAuley持续时间公式。我是F#的新手,如果F#专家能解释下面的代码片段,我将不胜感激:

    let aggrFunction acc index =
        let x5 = float index - 1. + x1
        let x6 = pow x3 x5
        ( x6 <> 0.) |> elseThrow "x6 must be different from 0)"
        let x7 = (100. * coupon / frequency) / x6
        let a, b = acc
        a + x7 * x5, b + x7
    let term2, term4 = aggrBetween 1 (int n) aggrFunction (0., 0.)
let aggrFunction acc index=
设x5=浮动指数-1+x1
设x6=pow x3 x5
(x6 0.|>elseThrow“x6必须不同于0)”
设x7=(100.*优惠券/频率)/x6
设a,b=acc
a+x7*x5,b+x7
设term2,term4=1(int n)聚合函数(0,0.)之间的聚合
我最好的C#尝试看起来是这样的,并且返回了错误的结果(我正在并排运行这两个函数)。顺便说一句,频率是一个枚举,因此是强制转换

    double term2 = 0;
    double term4 = 0;
    for (int i = 0; i <= n ; i++)
    {
        var x5 = i - 1 + x1;
        var x6 = Math.Pow(x3, x5);
        if (x6 == 0)
        {
            throw new Exception("x6 must be different from 0)");
        }
        var x7 = (100D * coupon/(int) frequency) / x6;
        term2 += (x7*x5);
        term4 += x7;
    }
double term2=0;
双项4=0;

对于(int i=0;我注意到for循环以0开始,但F#中的聚合以1?频率开始应该是一个浮点数。老实说,如果你没有说这是你正在计算的Macaulay持续时间,我也不会猜到;代码看起来仍然相当不可读。从你的代码来看,你似乎对以下情况感兴趣:n息票支付随时间变化是恒定的。在这种情况下,麦考利持续时间有一个明确的公式,无需循环。例如,请参阅David Luemberger的《投资科学》。记录在案,获取Excel财务函数的最佳位置是现在这里,而不是MSDN: