示例#1
0
        public MonthlyContributionData GetDurationOfSavings(SavingCalculationData calculationData)
        {
            var tempRes        = GetExpectedReturn(calculationData);
            var expectedReturn = tempRes.ExpectedReturn;
            var expectedRisk   = tempRes.ExpectedRisk;

            d30 = SetD30((double)expectedReturn);

            var numOfYrs = new[] { 0, Math.Round(Math.Log((calculationData.intendedAmount * (d30 / 100) +
                                                           (calculationData.monthlySavings * 12)) / (calculationData.currentSavings * (d30 / 100) + (calculationData.monthlySavings * 12)))
                                                 / Math.Log(1 + (double)expectedReturn / 100) + 0.33), 0 }.Max();

            var totalRealSavings       = calculationData.intendedAmount * Math.Pow(1 + inflationRate, -numOfYrs);
            var riskParams             = GetInvestmentParametersBasedOnRisk(calculationData);
            var expectedRangeOfReturns = GetExpectedRangeOfReturns(calculationData);

            var maxExpectedReturn = expectedRangeOfReturns.MaxAmount;

            var maxExpectedReturnOnInterest = 12 * (Math.Pow((double)(1 + (decimal)maxExpectedReturn / 100m), (double)(1m / 12m)) - 1) * 100;
            var minExpectedReturn           = expectedRangeOfReturns.MinAmount;
            var minExpectedReturnOnInterest = 12 * (Math.Pow((double)(1 + (decimal)minExpectedReturn / 100m), (double)(1m / 12m)) - 1) * 100;

            List <AmountData> amountData = new List <AmountData>();
            List <RiskData>   riskData   = new List <RiskData>();

            for (var i = 0; i <= numOfYrs; i++)
            {
                var m                  = Math.Pow((double)(1 + (decimal)expectedReturn / 100m), i);
                var n                  = ((decimal)m - 1m) / ((decimal)d30 / 100m);
                var monetaryValue      = (calculationData.currentSavings * m) + (double)(n * (decimal)calculationData.monthlySavings * 12m);
                var worthInTodaysMoney = monetaryValue * Math.Pow((1 + 0.065), (-(1 + i)));

                var newAmountData = new AmountData
                {
                    year               = i,
                    monetaryValue      = monetaryValue,
                    worthInTodaysMoney = worthInTodaysMoney
                };

                amountData.Add(newAmountData);

                var min = calculationData.currentSavings * Math.Pow((double)(1 + (decimal)minExpectedReturn / 100m), i) +
                          (double)((decimal)(Math.Pow((double)(1 + (decimal)minExpectedReturn / 100m), i) - 1) / ((decimal)minExpectedReturnOnInterest / 100m))
                          * calculationData.monthlySavings * 12;

                var max = calculationData.currentSavings * Math.Pow((double)(1 + (decimal)maxExpectedReturn / 100m), i) +
                          (double)((decimal)(Math.Pow((double)(1 + (decimal)maxExpectedReturn / 100m), i) - 1) / ((decimal)maxExpectedReturnOnInterest / 100m))
                          * calculationData.monthlySavings * 12;

                var newRiskData = new RiskData
                {
                    year     = i,
                    min      = min,
                    expected = monetaryValue,
                    max      = max
                };
                riskData.Add(newRiskData);
            }

            return(new MonthlyContributionData
            {
                currentSavings = calculationData.currentSavings,
                monthlySavings = calculationData.monthlySavings,
                intendedAmount = calculationData.intendedAmount,

                risk = calculationData.risk,
                numOfYrs = numOfYrs,
                totalRealSavings = totalRealSavings,
                d30 = d30,

                offshoreEquity = (double)riskParams.OffshoreEquity,
                offshoreCash = (double)riskParams.OffshoreCash,
                offshoreBonds = (double)riskParams.OffshoreBonds,
                localProperty = (double)riskParams.LocalProperty,
                localEquity = (double)riskParams.LocalEquity,
                localCash = (double)riskParams.LocalCash,
                localBonds = (double)riskParams.LocalBond,

                expectedReturns = (double)expectedReturn,
                expectedRisk = (double)expectedRisk,

                maxExpectedReturn = (double)maxExpectedReturn,
                maxExpectedReturnOnInterest = maxExpectedReturnOnInterest,
                minExpectedReturn = (double)minExpectedReturn,
                minExpectedReturnOnInterest = minExpectedReturnOnInterest,
                amountData = amountData,
                riskData = riskData
            });
        }
示例#2
0
        public MonthlyContributionData GetTotalAmountAfterSaving(SavingCalculationData calculationData)
        {
            var tempRes        = GetExpectedReturn(calculationData);
            var expectedReturn = tempRes.ExpectedReturn;
            var expectedRisk   = tempRes.ExpectedRisk;

            d30 = SetD30((double)expectedReturn);

            var intendedAmount = calculationData.currentSavings * Math.Pow((1 + (double)expectedReturn / 100), calculationData.numOfYears)
                                 + calculationData.monthlySavings * ((Math.Pow((1 + (double)expectedReturn / 100), calculationData.numOfYears) - 1) / (d30 / 100)) * 12;
            var totalRealSavings       = intendedAmount * Math.Pow(1 + inflationRate, -calculationData.numOfYears);
            var riskParams             = GetInvestmentParametersBasedOnRisk(calculationData);
            var expectedRangeOfReturns = GetExpectedRangeOfReturns(calculationData);

            var maxExpectedReturn           = expectedRangeOfReturns.MaxAmount;
            var maxExpectedReturnOnInterest = 12 * (Math.Pow((1 + (double)maxExpectedReturn / 100), ((double)1 / 12)) - 1) * 100;
            var minExpectedReturn           = expectedRangeOfReturns.MinAmount;
            var minExpectedReturnOnInterest = 12 * (Math.Pow((1 + (double)minExpectedReturn / 100), ((double)1 / 12)) - 1) * 100;

            List <AmountData> amountData = new List <AmountData>();
            List <RiskData>   riskData   = new List <RiskData>();

            for (var i = 0; i <= calculationData.numOfYears; i++)
            {
                var monetaryValue = calculationData.currentSavings * Math.Pow((1 + (double)expectedReturn / 100), i) + (Math.Pow((1
                                                                                                                                  + (double)expectedReturn / 100), i) - 1) / (d30 / 100) * calculationData.monthlySavings * 12;
                var worthInTodaysMoney = monetaryValue * Math.Pow((1 + 0.065), (-(1 + i)));

                var newAmountData = new AmountData
                {
                    year               = i,
                    monetaryValue      = monetaryValue,
                    worthInTodaysMoney = worthInTodaysMoney
                };

                amountData.Add(newAmountData);

                var min = calculationData.currentSavings * Math.Pow((1 + (double)minExpectedReturn / 100), i) + (Math.Pow((1
                                                                                                                           + (double)minExpectedReturn / 100), i) - 1) / (minExpectedReturnOnInterest / 100) * calculationData.monthlySavings * 12;
                var max = calculationData.currentSavings * Math.Pow((1 + (double)maxExpectedReturn / 100), i) + (Math.Pow((1
                                                                                                                           + (double)maxExpectedReturn / 100), i) - 1) / (maxExpectedReturnOnInterest / 100) * calculationData.monthlySavings * 12;

                var newRiskData = new RiskData
                {
                    year     = i,
                    min      = min,
                    expected = monetaryValue,
                    max      = max
                };
                riskData.Add(newRiskData);
            }
            return(new MonthlyContributionData
            {
                currentSavings = calculationData.currentSavings,
                monthlySavings = calculationData.monthlySavings,
                intendedAmount = intendedAmount,

                risk = calculationData.risk,
                numOfYrs = calculationData.numOfYears,
                totalRealSavings = totalRealSavings,
                d30 = d30,

                offshoreEquity = (double)riskParams.OffshoreEquity,
                offshoreCash = (double)riskParams.OffshoreCash,
                offshoreBonds = (double)riskParams.OffshoreBonds,
                localProperty = (double)riskParams.LocalProperty,
                localEquity = (double)riskParams.LocalEquity,
                localCash = (double)riskParams.LocalCash,
                localBonds = (double)riskParams.LocalBond,

                expectedReturns = (double)expectedReturn,
                expectedRisk = (double)expectedRisk,

                maxExpectedReturn = (double)maxExpectedReturn,
                maxExpectedReturnOnInterest = maxExpectedReturnOnInterest,
                minExpectedReturn = (double)minExpectedReturn,
                minExpectedReturnOnInterest = minExpectedReturnOnInterest,
                amountData = amountData,
                riskData = riskData
            });
        }