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 }); }
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 }); }