Closed shippy closed 11 years ago
V rámci prvního implementačního nástřelu jsem si řekl, že první draft vzorce spíchnu sám.
Tady je v TeXu rovnice value at retirement = discounted dividend payment
(obrázek):
\big(\frac{1+s}{1+i}\big)^{12(R-a)}S
+ \sum_{j={12a}}^{12R} x\big(\frac{1+s}{1+i}\big)^{j-12a}
= \sum_{j=R}^{T} D(1+i)^{j}
kde
s
je průměrný roční úrok na vkladu,i
je průměrná roční inflace,a
je současný věk,R
je věk odchodu do důchodu,T
je konečný věk,S
jsou uspořené peníze do této chvíle,D
je cílová měsíční dividenda po odchodu do důchodux
je cílový měsíční vklad.Vyjádřením x
získám následující rovnici (obrázek):
x = \frac{\sum_{j={12R}}^{12T} D(1+i)^\frac{j}{12}
- \big(\frac{1+s}{1+i}\big)^{12(R-a)}S}
{12(R-a) \sum_{j={12a}}^{12R} \big(\frac{1+s}{1+i}\big)^{\frac{j}{12}-a}}
Rovnici jsem ještě netestoval, ale mám k ní sepsaný PHP kód v commitu 1c0d3ec4d5e509af14dd0fb80144afb515f8c3aa, který je možná přehlednější než LaTeX:
function getMonthlySavings($age_current, $age_retirement, $age_terminal,
$rate_inflation, $rate_interest, // yearly
$monthly_current, $monthly_desired, // income
$savings_current) {
$real_rate = (1+$rate_interest) / (1+$rate_inflation); // yearly
$desired_total = 0;
for ($i = $age_retirement; $i <= $age_terminal; $i++) {
// counting monthly inflation for simplification // += operator adds to current value
$desired_total += (12 * $monthly_desired * pow(1 + $rate_inflation, $i - $age_retirement));
}
$savings_value_at_retirement = $savings_current * pow($real_rate, $age_retirement - $age_current);
$discounting = 0;
for ($i = 12 * $age_current; $i < 12 * $age_retirement; $i++) {
$discounting += pow($real_rate, $i - 12 * $age_current);
}
$discounting *= 12*($age_retirement - $age_current);
return (($desired_total - $savings_value_at_retirement) / $discounting);
}
Chybí a dá se zlepšit:
Testování odhalilo, že vzorec je špatně; není mi úplně jasné, kde se stala chyba, ale někde je. Takže hlavní zlepšení je najít chybu.
Verze převedená na roční počítání, která dává rozumné výsledky, je následující:
S*R^{t_{work}} + \sum_{j=1}^{t_{work}} ({xR^j})
= \sum_{j=1}^{t_{retirement}} ({D(1+i)^j})
kde všechny proměnné fungují na roční bázi. Písmenka jsou stejná jako minule, jen:
t_work = age_retirement - age_current
,t_retirement = age_terminal - age_retirement
,R = (1+r)/(1+i)
. (Real rate of interest)Vyjádření pro požadovanou roční důchodovou dividendu je potom
x = \frac{\sum_{j=1}^{t_{retirement}} ({D(1+i)^j}) - S*R^{t_{work}}}
{t_{work}*\sum_{j=1}^{t_{work}} {R^j}}
To pořád není optimální. Issues:
D_real = D*(1+i)^t_work
, což asi hned půjdu udělat.)Roční důchodová dividenda ale není špatná proměnná, takže si ji asi má smysl nechat.
Vytvoření odlišných rozhraní pro měsíční a roční vstupy / výpočty je jiná issue; zavírám.
To take into current income, current savings, average expected income raise, account inflation, interest rate, target age (whether user-supplied or calculated) - and any number of other factors we can come up with.