Skip to content

Instantly share code, notes, and snippets.

@tonmcg
tonmcg / Table.CreateAmortization.pq
Last active January 2, 2021 09:58
M Language Finance & Accounting Functions
let
Table.CreateAmortization = let
AmortizationFunction = (initialAmount as number, interestRate as number, numberOfPeriods as number, periodicity as text, optional date as any, optional balloonPayment as number) as table =>
let
CompoundingMap = {{"Daily",365}, {"Monthly",12}, {"Quarterly",4}, {"Semi-annual",2}, {"Annual",1}},
CompoundingPeriod = List.First(List.Select(CompoundingMap, each _{0} = periodicity)){1},
Balloon = if balloonPayment is null then 0 else balloonPayment,
PeriodicInterest = interestRate / CompoundingPeriod,
TotalPeriods = numberOfPeriods * CompoundingPeriod,
Annuity = initialAmount * ((PeriodicInterest) * Number.Power(1 + (PeriodicInterest), TotalPeriods)) / (Number.Power(1 + (PeriodicInterest), TotalPeriods) - 1) - Balloon * (-PeriodicInterest) / ((1 + PeriodicInterest) - (Number.Power(1 + PeriodicInterest, TotalPeriods + 1))),