Explanation of NY state worksheets¶

Overview¶

The worksheets for NY state tax serve two purposes:

  1. Activate a flat tax: above $107,650, the state of New York aims to impose a flat rate on the entire income instead of utilizing the progressive tax rates, except at the very beginning of the tax brackets.

  2. Tax cliff mitigation: implementing a flat rate without adjustments would result in a substantial tax cliff at the onset of each new income bracket. For example, transitioning from 215,399 to 215,400 would incur an additional cost of 1,120 (for Single status). The worksheets addresse this issue by smoothing the cliff over the initial ~$50,000 of each tax bracket, referred to as the "ramp-up" zone.

To illustrate, let's examine the simplified tax structure for a Single status individual in New York with a taxable income exceeding 215,400 but below 1,077,550

  • We assume Adjusted Gross Income (AGI) equals taxable income for simplicity, denoted as $t$.
  • $nys\_base(t)$ represents the state tax without the worksheets logic.
  • $nys(t)$ denotes the tax amount with the inclusion of worksheets logic.

If we were to apply a flat tax rate for a taxable income $t>215400$ without considering ramp-up zone, it can be expressed as $0.0685 \cdot t$, but this is also equal to $nys\_base(t) + \mathit{base\_recapture\_amount} + \mathit{incremental\_benefit\_amount}$, see graph below.

The purpose of the worksheets is to progressively apply the $\mathit{incremental\_benefit\_amount}$ over the initial ~$50k of the bracket to smooth the tax cliff.

No description has been provided for this image

Here is the exact computation (still assuming AGI is eqaul to taxable income):

  • during the ramp-up zone $[215400, 215400+50,000]$, $$nys(t) = nys\_base(t) + \mathit{base\_recapture} + \frac{t - 215400}{50000} \cdot \mathit{incremental\_benefits}$$

given that: $$\mathit{incremental\_benefits} = 0.0685 \cdot t - nys(t) - \mathit{base\_recapture}$$ we can rewrite, as done in worksheet 8: $$nys(t) = nys\_base(t) + \mathit{base\_recapture} + \frac{t - 215400}{50000} \cdot \left( 0.0685 \cdot t - nys(t) - \mathit{base\_recapture} \right)$$

  • after the ramp-up zone, the tax is just $$nys(t) = t*0.0685 = nyst\_base(t) + \mathit{base\_recapture} + \mathit{incremental\_benefits}$$

Computation of base recapture amounts¶

The magic numbers in the worksheets 8-11 (line 6) are the base_recapture amounts, and can be computed using only the brackets and tax rates as inputs:

In [2]:
brackets = [0, 8500, 11700, 13900, 21400, 80650, 215400, 1077550, 5000000, 25000000]
rates = [0.04, 0.045, 0.0525, 0.059, 0.0597, 0.0633, 0.0685, 0.0965, 0.103, 0.109]
threshold = 107650


def compute_base_recapture():
    prev_rate = 0
    prev_base = 0
    bases = [0]
    for rate, b0, b1 in zip(rates[:-1], brackets[:-1], brackets[1:]):
        benefit = (rate - prev_rate) * b0
        base = prev_base + benefit
        if threshold < b1:
            bases.append(round(base))
        prev_base = base
        prev_rate = rate
    return bases

compute_base_recapture()
Out[2]:
[0, 526, 1646, 31817, 64317]

If we set base recapture for the worksheet 7 to 0 it would work as the other sheets.