public GMWBRider(Person person, Annuities annuity) { int growthYears = Math.Max(accumulation, person.retirementDate - DateTime.Now.Year); if (annuity.annuityTime == AnnuityTime.Immediate) { growthYears = 0; } benifitBase = FutureValue.GetFutureValue(annuity.initialAmount, rollUp, growthYears); annualIncome = (benifitBase * minimumPercentage) * (1 - fee); annuity.distributionsBeforeTax = annualIncome; annuity.gmwb = true; annuity.yearsOfPayments = (int)Math.Round(benifitBase / annualIncome); if (annuity.annuityTax == AnnuityTax.Qualified) { annuity.exclusionRatio = annuity.initialAmount / benifitBase; } else { annuity.exclusionRatio = 0; } }
public GLWBRider(Person person, Annuities annuity) { annuity.glwb = true; if (annuity.annuityTime == AnnuityTime.Immediate) { growthYears = 0; benifitBase = annuity.initialAmount; } else { growthYears = Math.Max(accumulation, person.retirementDate - DateTime.Now.Year); benifitBase = FutureValue.GetFutureValue(annuity.initialAmount, rollUp, growthYears); } //Limits should be imposed on the user to not allow glwb if they are out of the range annuities allow try { lifetimeWithdrawlRate = (LifeExpectancy.glwbTable[person.age + growthYears]); } catch (IndexOutOfRangeException exception) { Console.WriteLine(exception); lifetimeWithdrawlRate = 0; } annualIncome = (lifetimeWithdrawlRate * benifitBase) * (1 - fee); annuity.distributionsBeforeTax = annualIncome; if (annuity.annuityTax == AnnuityTax.Qualified) { annuity.exclusionRatio = annuity.initialAmount / benifitBase; } else { annuity.exclusionRatio = 0; } }
//calculates how much money a variable annuity will payout for a given year private List <double> VariableCalc(double carloRate) { List <double> currentYear = new List <double>(); double currentAmount = initialAmount; lumpSumAtRetirement = FutureValue.GetFutureValue(initialAmount, carloRate, yearsToRetirement); currentYear.Add(initialAmount); if (annuityTime == AnnuityTime.Deferred) { for (int j = 0; j < yearsToRetirement; j++) { currentAmount += lumpSumAtRetirement / yearsToRetirement; currentYear.Add(currentAmount); } } distributionsBeforeTax = PaymentCalculator.GetPayments(currentAmount, carloRate, yearsOfPayments); if (glwb) { yearsOfPayments += 100; } for (int j = 0; j < yearsOfPayments; j++) { currentAmount += currentAmount * carloRate; if (gmwb || glwb) { currentAmount -= distributionsBeforeTax; currentAmount = Math.Max((currentAmount - distributionsBeforeTax), (rider.annualIncome)); } else { currentAmount -= distributionsBeforeTax; currentAmount = Math.Max(0, currentAmount); } currentYear.Add(currentAmount); } return(currentYear); }
public void Deferred() { yearsOfPayments = Math.Min((int)annuityLife, (int)retireLife); lumpSumAtRetirement = FutureValue.GetFutureValue(initialAmount, rate, accumulationYears); }