ChrisCScott / forecaster

A personal finances forecasting tool for Canadian retirement planning
Other
1 stars 2 forks source link

Extend withdrawal behaviour based on tax liability #34

Open ChrisCScott opened 6 years ago

ChrisCScott commented 6 years ago

Currently, if there is excess tax liability in a given year, withdrawals are increased in the following year (if there is insufficient contribution room to cover it). There are no user-settings to modify this, and there are no mechanisms by which to determine how much must be withdrawn pre-tax in order to obtain the desired post-tax figure.

Provide richer means to increase withdrawals based on tax liability. For example, allow user to indicate whether withdrawals are pre-tax or post-tax and, if the latter, provide a way to determine how much must be withdrawn to cover the existing tax liability and any additional liability for the increased withdrawals.

This could be approached in a couple of ways:

  1. Predictively: Add a pre_tax_equivalent method to Tax which converts post-tax amounts to pre-tax amounts (so that the appropriate amount can then be withdrawn). We may further need to add hooks to TaxSource objects (especially Account) to determine what proportion of withdrawn amounts result in taxable income. Since this behaviour can be non-linear, it may not be practicable to do this accurately with a single call; a search algorithm may be required.
  2. After-the-fact: Make the withdrawals of the desired post-tax amount, calculate tax liability, and then add further withdrawals as required to cover tax remittance requirements (see #2 ). This may require some iteration, since additional withdrawals may increase remittances required. Consider scaling withdrawals by the taxpayers' marginal rate as a first-order estimate of required withdrawals.

Note that any overwithdrawals can be recontributed in full at the beginning of the next year, whereas underwithdrawals will impact living standard, so when in doubt favour overwithdrawals.

This is an extension of #3 and relates to #33.