首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#计算条件返回

C#计算条件返回
EN

Stack Overflow用户
提问于 2013-11-15 19:58:56
回答 1查看 268关注 0票数 1

我的问题是关于计算有条件返回加班。这是有点难以描述,如果有些部分不清楚,请让我澄清。我有一个C# WinForm应用程序,它读取两个系列的数据,一个是产品返回号超时,另一个是索引返回号超时。当指数回报率为正数时,我称之为“上涨市场”。我创建了一个子列表来存储与每个“向上市场”对应的所有产品返回号,另一个子列表存储与每个“下行市场”对应的所有产品返回号。

代码语言:javascript
运行
复制
for (int i = 0; i < ProductReturnRawData.Count; i++)
{
   if (primaryIndexReturnRawData[i] >=  0)
   {
      upMarketWealth.Add(1 + ProductReturnRawData[i] / 100);
   }

   else if (primaryIndexReturnRawData[i] < 0)
   {
      downMarketWealth.Add(1 + ProductReturnRawData[i] / 100);
   }
}

在创建upMarketWealth列表之后,我使用另一个函数来计算在市场上涨的情况下产品的回报。

代码语言:javascript
运行
复制
private double check_period_upMarket(
    List<double> upMarketWealth, int months, int go_back = 0)
{
   double return_calc = 1;
   for (int i = upMarketWealth.Count - 1 - go_back; 
        i > upMarketWealth.Count - (1 + months + go_back); i--)
   return_calc *= upMarketWealth[i];
   return Math.Pow(return_calc, 12.0 / upMarketWealth.Count) - 1;
}

最后,我将这个check_period_upMarket函数称为:

代码语言:javascript
运行
复制
StatsTable[Tuple.Create(period, "Up-Market Return")] = 
    check_period_upMarket(upMarketWealth, 12);

在这里,我想知道在过去的12个月里,市场上涨了多少个月(upMarketWealth.Count假设给了我答案),以及当市场上涨时产品的年化回报率。

我手工计算Excel上的数字,它与这段代码的结果不匹配。

实例:指数在过去12个月内的回报{-0.08 0.95 -1.34 -2.36 3.25 5.24 -0.88 -0.38 0.39 0.48 0.73 0.57 }产品回报在同期{-0.03 0.12 -0.06 -2.03 1.15 2.06 0.35 0.47 1.65 -0.20 0.79 1.17 }。

所以upMarket列表应该有{0.12,1.15,2.06,1.65,-0.20,0.79,1.17}。创建财富列表

代码语言:javascript
运行
复制
upMarketWealth.Add(1 + ProductReturnRawData[i] / 100); 

然后

代码语言:javascript
运行
复制
return_calc *= upMarketWealth[i];
return Math.Pow(return_calc, 12.0 / upMarketWealth.Count) - 1;

正确的答案应该是12.16%,而代码有10%。请帮我找出这里的错误。如果有什么不清楚的地方,请问我澄清。

EN

回答 1

Stack Overflow用户

发布于 2013-11-15 22:22:56

如前所述,代码根本无法工作,只能抛出IndexOutOfRangeException

问题在于,通过构建upMarketWealthdownMarketWealth列表,您可以有效地缩小数据--忽略不分别为“向上”或“向下”的条目几个月。相反,您应该将一个1.0放到列表中。另一方面,check_period_upMarket中的for循环不尊重此行为,并计算不正确的界限。此外,结束时的Math.Pow调用错误地假定列表中的项目计数与“向上”月数相对应。相反,这应该作为一个参数传入。

生成预期输出的最小示例:

代码语言:javascript
运行
复制
private double check_period_upMarket(List<double> upMarketWealth, int upMonths, int months, int go_back = 0)
{
    double return_calc = 1;
    for (int i = upMarketWealth.Count - 1 - go_back; i > upMarketWealth.Count - 1 - go_back - months; i--)
    {
        return_calc *= upMarketWealth[i];
    }
    return Math.Pow(return_calc, 12.0 / upMonths) - 1;
}

void Main()
{
    List<double> primaryIndexReturnRawData = new List<double> {-0.08, 0.95, -1.34, -2.36, 3.25, 5.24, -0.88, -0.38, 1.39,  0.48, 0.73, 0.57 };
    List<double> ProductReturnRawData = new List<double> {     -0.03, 0.12, -0.06, -2.03, 1.15, 2.06,  0.35,  0.47, 1.65, -0.20, 0.79, 1.17 };

    List<double> upMarketWealth = new List<double>();
    List<double> downMarketWealth = new List<double>();

    int upMonths = 0;
    int downMonths = 0;

    for (int i = 0; i < ProductReturnRawData.Count; i++)
    {
        if (primaryIndexReturnRawData[i] >=  0)
        {
            upMarketWealth.Add(1 + ProductReturnRawData[i] / 100);
            downMarketWealth.Add(1.0);
            upMonths++;
        }
        else if (primaryIndexReturnRawData[i] < 0)
        {
            upMarketWealth.Add(1.0);
            downMarketWealth.Add(1 + ProductReturnRawData[i] / 100);
            downMonths++;
        }
    }

    Console.WriteLine(check_period_upMarket(upMarketWealth, upMonths, 12));
    // output: 0.121499259430152
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20009563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档