- commit
- 61a54e14b4f542fa8dc0bc542417dd06eb75b8ad
- parent
- f327b687fe7d58dc8c2b6833f1d3fdc9a6847bbc
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2025-05-16 20:50
add post on tax curves
Diffstat
M | _content/posts/2022-08-06-basic-income/index.md | 2 | +- |
A | _content/posts/2025-05-16-tax-curves/curves.py | 69 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | _content/posts/2025-05-16-tax-curves/index.md | 125 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | _content/posts/2025-05-16-tax-curves/linear.png | 0 | |
A | _content/posts/2025-05-16-tax-curves/log.png | 0 | |
A | _content/posts/2025-05-16-tax-curves/pow.png | 0 |
6 files changed, 195 insertions, 1 deletions
diff --git a/_content/posts/2022-08-06-basic-income/index.md b/_content/posts/2022-08-06-basic-income/index.md
@@ -1,7 +1,7 @@ 1 1 --- 2 2 title: Basic income is not about redistribution of money 3 3 date: 2022-08-064 -1 tags: [politics]-1 4 tags: [politics, economics] 5 5 description: The discourse around basic income annoys me. 6 6 --- 7 7
diff --git a/_content/posts/2025-05-16-tax-curves/curves.py b/_content/posts/2025-05-16-tax-curves/curves.py
@@ -0,0 +1,69 @@ -1 1 from matplotlib import pyplot as plt -1 2 from matplotlib.ticker import FuncFormatter -1 3 import numpy as np -1 4 -1 5 n = 300_000 -1 6 -1 7 -1 8 def linear(x, a, b): -1 9 return a * x + b -1 10 -1 11 -1 12 def linear_marginal_rate(x, a, b): -1 13 return np.ones(len(x)) * a -1 14 -1 15 -1 16 def log(x, a, b): -1 17 return a * np.log(x / a + 1) + b -1 18 -1 19 -1 20 def log_marginal_rate(x, a, b): -1 21 return 1 / (x / a + 1) -1 22 -1 23 -1 24 def pow(x, a, b): -1 25 return np.pow(x / (a * b) + 1, a) * b -1 26 -1 27 -1 28 def pow_marginal_rate(x, a, b): -1 29 return np.pow(x / (a * b) + 1, a - 1) -1 30 -1 31 -1 32 def render(f, marginal_rate, a, b): -1 33 euro_formatter = FuncFormatter(lambda x, pos: f'{x:.0f}β¬') -1 34 percent_formatter = FuncFormatter(lambda x, pos: f'{x:.0%}') -1 35 -1 36 x = income = np.linspace(0, n, 500) -1 37 -1 38 fig, axes = plt.subplots(1, 2, sharex='row', figsize=(10, 5)) -1 39 axes[0].plot(x, x, color='grey', linestyle='dotted') -1 40 -1 41 for i, aa in enumerate(a): -1 42 y = f(x, aa, b) -1 43 m = 1 - marginal_rate(x, aa, b) -1 44 av = (x - y) / x -1 45 color = ['blue', 'green', 'red'][i] -1 46 axes[0].plot(x, y, color=color) -1 47 axes[1].plot(x, m, color=color) -1 48 axes[1].plot(x, av, color=color, linestyle='dashed') -1 49 -1 50 axes[0].set_title('After Taxes') -1 51 axes[0].xaxis.set_major_formatter(euro_formatter) -1 52 axes[0].yaxis.set_major_formatter(euro_formatter) -1 53 axes[0].set_xlim([0, n]) -1 54 axes[0].set_ylim([0, n]) -1 55 axes[0].grid() -1 56 -1 57 axes[1].set_title('Marginal/Average Tax Rate') -1 58 axes[1].yaxis.set_major_formatter(percent_formatter) -1 59 axes[1].set_ylim([-0.2, 1]) -1 60 axes[1].grid() -1 61 -1 62 plt.tight_layout() -1 63 plt.savefig(f'{f.__name__}.png') -1 64 -1 65 -1 66 if __name__ == '__main__': -1 67 render(linear, linear_marginal_rate, [0.3, 0.5, 0.7], 10_000) -1 68 render(log, log_marginal_rate, [30_000, 90_000, 400_000], 10_000) -1 69 render(pow, pow_marginal_rate, [0.5, 0.7, 0.9], 10_000)
diff --git a/_content/posts/2025-05-16-tax-curves/index.md b/_content/posts/2025-05-16-tax-curves/index.md
@@ -0,0 +1,125 @@ -1 1 --- -1 2 title: Finding the ideal tax curve -1 3 date: 2025-05-16 -1 4 tags: [economics, math] -1 5 description: "Having fun by finding better alternatives to those absurd piecewise-defined tax curves" -1 6 --- -1 7 -1 8 I recently tried to figure out income taxes and came across one of those absurd -1 9 [piecewise-defined](https://en.wikipedia.org/wiki/File:Income_Tax_Germany_2010.png) -1 10 tax curves. So I thought it might be a fun activity to figure out better -1 11 options for tax curves, without any claim to real-world merit. -1 12 -1 13 ## Basics -1 14 -1 15 We will look at functions where <math><mi>x</mi></math> is the income before -1 16 taxes and <math><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></math> is the -1 17 income after taxes. -1 18 -1 19 I am a big fan of folding some form of social security into the tax system, so -1 20 <math><mi>b</mi></math> will be the level of basic income everyone should have. -1 21 -1 22 All functions will have a single additional parameter <math><mi>a</mi></math> -1 23 that can be used to adjust the system to the current economic situation, -1 24 basically raising or lowering taxes. -1 25 -1 26 ## Linear -1 27 -1 28 The simplest model is a flat tax rate with basic income: -1 29 -1 30 <math> -1 31 <mi>π</mi><mo>(</mo><mi>π₯</mi><mo>)</mo> -1 32 <mo>=</mo> -1 33 <mi>π</mi> -1 34 <mo>⁢</mo> -1 35 <mi>π₯</mi> -1 36 <mo>+</mo> -1 37 <mi>π</mi> -1 38 </math> -1 39 -1 40  -1 41 -1 42 With this system, the marginal tax rate is constant, but the average tax rate -1 43 starts out [negative](https://en.wikipedia.org/wiki/Negative_income_tax) and -1 44 then quickly grows towards the marginal tax rate. -1 45 -1 46 ## Logarithmic -1 47 -1 48 Most real-world economies have progressive tax rates. That means: the higher -1 49 your income, the higher your marginal tax rate. The classic mathematical -1 50 function that grows to infinity but slows down while doing so is the logarithm: -1 51 -1 52 <math> -1 53 <mi>π</mi><mo>(</mo><mi>π₯</mi><mo>)</mo> -1 54 <mo>=</mo> -1 55 <mi>π</mi> -1 56 <mo>⁢</mo> -1 57 <mi>ln</mi> -1 58 <mo>(</mo> -1 59 <mrow> -1 60 <mfrac> -1 61 <mi>x</mi> -1 62 <mi>a</mi> -1 63 </mfrac> -1 64 <mo>+</mo> -1 65 <mn>1</mn> -1 66 </mrow> -1 67 <mo>)</mo> -1 68 <mo>+</mo> -1 69 <mi>π</mi> -1 70 </math> -1 71 -1 72  -1 73 -1 74 Now the marginal tax rate starts at 0% and grows towards 100%. -1 75 -1 76 The marginal tax rate is what you have to pay on any additional income you -1 77 make. The common believe is that a high marginal tax rate will disincentivize -1 78 people from earning more (=Β being more productive). That is why I wanted to -1 79 start with 0%. -1 80 -1 81 On the other end of the spectrum, I don't see any reason to stop the -1 82 progression at some arbitrary value. If a single person has some astronomical -1 83 income, sure, let them pay 99.9% marginal tax. They will still have much more -1 84 money than everyone else. -1 85 -1 86 ## Power -1 87 -1 88 Another type of functions that go up to infinity but slow down on the way are -1 89 power functions like this one: -1 90 -1 91 <math> -1 92 <mi>π</mi><mo>(</mo><mi>π₯</mi><mo>)</mo> -1 93 <mo>=</mo> -1 94 <msup> -1 95 <mrow> -1 96 <mo>(</mo> -1 97 <mrow> -1 98 <mfrac> -1 99 <mi>x</mi> -1 100 <mrow> -1 101 <mi>a</mi> -1 102 <mo>⁢</mo> -1 103 <mi>b</mi> -1 104 <mrow> -1 105 </mfrac> -1 106 <mo>+</mo> -1 107 <mn>1</mn> -1 108 </mrow> -1 109 <mo>)</mo> -1 110 </mrow> -1 111 <mi>a</mi> -1 112 </msup> -1 113 <mo>⁢</mo> -1 114 <mi>π</mi> -1 115 </math> -1 116 -1 117  -1 118 -1 119 Like with the logarithm, the marginal tax rate starts at 0% and grows towards -1 120 100%. However, it doesn't grow as quickly, which puts it somewhere in between -1 121 the logarithmic and linear versions. So this feels the most balanced. -1 122 -1 123 I also like that <math><mi>a</mi></math> has an intuitive interpretation (how -1 124 curved to curve is). So if I were ever going to be minister of finance, this -1 125 would probably be the version that my advisors would have to talk me out of.