Quantcast
Channel: Bogleheads.org
Viewing all articles
Browse latest Browse all 6337

Non-US Investing • Future value after taxes (in Germany)

$
0
0
Updated the code to include advance_tax and base_interest_rate (Vorabpauschale mit Basiszins), tax_exempt_amount (Sparerfreibetrag), exemption_rate (Teilfreistellung), distribution_fraction (the part of total return that gets distributed and taxed yearly, set it to zero for accumulating ETFs!), inflation_rate and two different assets, namely stocks and bonds. Please code review, if interested! Did my best (GPT-aided), but no warranties of any kind. Please send me a note, if you notice substantial errors. Feel free to ask questions.

Code:

#!/usr/bin/env python# These functions calculate future portfolio values before and after German taxes and inflation# Abbreviations/Explanations# Abkürzungen/Erläuterungen# Dist_TRY# Dist_TaxedReinvestedYearly# only distributions taxed and reinvested yearly with tax exempt amount and advance tax, capital gains untaxed# nur Ausschüttungen jährlich besteuert und reinvestiert, mit Sparerfreibetrag, Teilfreistellung und Vorabpauschale, Kapitaleträge nicht besteuert# Dist_TRY_Cap_ET# Dist_TaxedReinvestedYearly_CapGains_EndTaxed# distributions annually taxed and reinvested with tax exempt amount and advance tax,# capital gains taxed after investment period# Ausschüttungen jährlich besteuert und reinvestiert, mit Sparerfreibetrag, Teilfreistellung und Vorabpauschale,# Kapitaleträge nach Investitionszeitraum besteuert# Berechne Vorabpauschaledef calculate_advance_tax(investment_at_beginning_of_year, annual_return, distribution, tax_rate, exemption_rate, base_interest_rate):    advance_tax_basis = investment_at_beginning_of_year * base_interest_rate * 0.7    advance_tax = advance_tax_basis * (tax_rate * (1 - exemption_rate))    return 0.0 if base_interest_rate <= 0.0 or annual_return <= 0 or distribution > advance_tax_basis else advance_tax# Berechne Steuer auf Ausschüttungen unter Berücksichtigung von Sparerfreibetrag und Teilfreistellungdef calculate_tax_with_tax_exempt_amount_and_exemption_rate(future_value, return_rate, distribution_fraction, tax_rate, exemption_rate, tax_exempt_amount, inflation_rate = 0):    return max(future_value * (return_rate - inflation_rate) * distribution_fraction - tax_exempt_amount, 0) * (tax_rate * (1 - exemption_rate))def calculate_annual_real_return(real_future_value, return_rate, inflation_rate):    return real_future_value * (return_rate - inflation_rate)def calculate_annual_real_return_Dist_TRY(real_future_value_Dist_TRY, return_rate, distribution_fraction, tax_rate, exemption_rate, tax_exempt_amount, base_interest_rate, inflation_rate):    return real_future_value_Dist_TRY * (return_rate - inflation_rate) \    - calculate_tax_with_tax_exempt_amount_and_exemption_rate(real_future_value_Dist_TRY, return_rate, distribution_fraction, tax_rate, exemption_rate, tax_exempt_amount, inflation_rate) \    - calculate_advance_tax(real_future_value_Dist_TRY, real_future_value_Dist_TRY * return_rate, real_future_value_Dist_TRY * return_rate * distribution_fraction, tax_rate, exemption_rate, base_interest_rate)def calculate_future_values(initial_investment, return_rate, distribution_fraction, tax_rate, exemption_rate, tax_exempt_amount, base_interest_rate, years, inflation_rate = 0):    # all future values get initialized with initial_investment    initial_values = [initial_investment for _ in range(3)]    real_future_value, \    real_future_value_Dist_TRY, \    real_future_value_Dist_TRY_Cap_ET, \    = initial_values    real_capital_gains_Dist_TRY = 0    for year in range(years):        # Calculate annual returns        annual_real_return = calculate_annual_real_return(real_future_value, return_rate, inflation_rate)        annual_real_return_Dist_TRY = calculate_annual_real_return_Dist_TRY(real_future_value_Dist_TRY, return_rate, distribution_fraction, tax_rate, exemption_rate, tax_exempt_amount, base_interest_rate, inflation_rate)        # Update future_values with annual returns        real_future_value += annual_real_return        real_future_value_Dist_TRY += annual_real_return_Dist_TRY        # Update capital gains        real_capital_gains_Dist_TRY += real_future_value_Dist_TRY * (return_rate - inflation_rate) * (1 - distribution_fraction)    #end of loop    # calculate capital gains taxed at the beginning of the first period after investment period for tax exempt amount not being used up    real_future_value_Dist_TRY_Cap_ET = real_future_value_Dist_TRY \    - real_capital_gains_Dist_TRY * (tax_rate * (1 - exemption_rate))    # return all the future_values    return (        real_future_value,        real_future_value_Dist_TRY,        real_future_value_Dist_TRY_Cap_ET,        )#Asset class independent parameters:tax_rate = 0.2638 # Steuersatz (Kapitalertragssteuer + Soli), mit Kirchensteuer ca. 0.28tax_exempt_amount = 1000 # Sparerfreibetragyears = 30 # Investitionszeitrauminflation_rate = 0.00base_interest_rate = 0.0255 # Basiszins der Vorabpauschaleyears = 30 # Investitionszeitraum#Asset class dependent parameters: Stock-ETFinitial_investment_stock = 80000 # Anfangsinvestitionreturn_rate_stock = 0.07 # jährliche Renditedistribution_fraction_stock = 0.25 # Anteil der Ausschüttungen am Gesamtertragexemption_rate = 0.30 # Teilfreistellungsquotereal_future_value_stock, \real_future_value_Dist_TRY_stock, \real_future_value_Dist_TRY_Cap_ET_stock, \= calculate_future_values(initial_investment_stock, return_rate_stock, distribution_fraction_stock, tax_rate, exemption_rate, tax_exempt_amount, base_interest_rate, years, inflation_rate)#Asset class dependent parameters: Bond-ETFinitial_investment_bond = 20000 # Anfangsinvestitionreturn_rate_bond = 0.035 # jährliche Renditedistribution_fraction_bond = 1.0 # Assumption Bond-ETFexemption_rate = 0.0 # Teilfreistellungsquotereal_future_value_bond, \real_future_value_Dist_TRY_bond, \real_future_value_Dist_TRY_Cap_ET_bond, \= calculate_future_values(initial_investment_bond, return_rate_bond, distribution_fraction_bond, tax_rate, exemption_rate, tax_exempt_amount, base_interest_rate, years, inflation_rate)stock_fraction = initial_investment_stock / (initial_investment_stock + initial_investment_bond)bond_fraction = 1 - stock_fractionportfolio_return = stock_fraction * return_rate_stock + bond_fraction * return_rate_bondreal_future_value = real_future_value_stock + real_future_value_bondreal_future_value_Dist_TRY = real_future_value_Dist_TRY_stock + real_future_value_Dist_TRY_bondreal_future_value_Dist_TRY_Cap_ET = real_future_value_Dist_TRY_Cap_ET_stock \+ real_future_value_Dist_TRY_Cap_ET_bondprint(f"Future portfolio values after {years} years of {round(100*portfolio_return,2)}% initial annual portfolio return (no rebalancing) and {round(100*inflation_rate,2)}% inflation")print("Dist_TRY: distributions taxed and reinvested yearly")print("Cap_ET: capital gains taxed in period after investment period to use up tax exempt amount")print(f"Real future portfolio value: {real_future_value}")print(f"Real future portfolio value Dist_TRY: {real_future_value_Dist_TRY}")print(f"Real future portfolio value Dist_TRY Cap_ET: {real_future_value_Dist_TRY_Cap_ET}")

Statistics: Posted by tre3sori — Thu Jan 18, 2024 6:27 am — Replies 5 — Views 768



Viewing all articles
Browse latest Browse all 6337

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>