Skip to content

Commit

Permalink
Merge pull request #127 from provinzio/rework-evaluation-export
Browse files Browse the repository at this point in the history
Rework evaluation export
  • Loading branch information
provinzio authored May 14, 2022
2 parents 9e2d2fa + bb2dcfe commit f1ea6a1
Show file tree
Hide file tree
Showing 16 changed files with 2,491 additions and 533 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ build:
run:
python src/main.py

# Shortcut for development (developer run)
drun: format lint run

run-container:
docker run --name cointaxman -it --rm \
-v `pwd`/account_statements:/CoinTaxman/account_statements:Z \
Expand Down
109 changes: 24 additions & 85 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ CoinTaxman hilft dir dabei deine Einkünfte aus dem Krypto-Handel/-Verleih/... i
Momentan deckt der CoinTaxman nur meinen Anwendungsbereich ab.
Pull Requests und Anfragen über Issues sind gerne gesehen (siehe `Key notes for users` für weitere Informationen).

**Disclaimer: use at your own risk**
# **Disclaimer: use at your own risk**

### Currently supported countries
- Germany
Expand All @@ -23,6 +23,10 @@ Pull Requests und Anfragen über Issues sind gerne gesehen (siehe `Key notes for
- [coinbase (pro)](https://github.com/provinzio/CoinTaxman/wiki/Exchange:-coinbase)
- [Kraken](https://github.com/provinzio/CoinTaxman/wiki/Exchange:-Kraken)

It is also possible to import a custom transaction history file.
See [here](https://github.com/provinzio/CoinTaxman/wiki/Custom-import-format) for more informations.
The format is based on the awesome `bittytax_conv`-tool from [BittyTax](https://github.com/BittyTax/BittyTax).

### Requirements

- Python 3.9
Expand All @@ -32,10 +36,12 @@ Quick and easy installation can be done with `pip`.
### Usage

1. Adjust `src/config.py` to your liking
2. Add account statements from supported exchanges in `account_statements/`
1. Adjust `src/config.ini` to your liking
2. Add all your account statements in `account_statements/`
2. Run `python "src/main.py"`

If not all your exchanges are supported, you can not (directly) calculate your taxes with this tool.

Have a look at our [Wiki](https://github.com/provinzio/CoinTaxman/wiki) for more information on how to obtain the account statement for your exchange.

#### Makefile
Expand Down Expand Up @@ -80,7 +86,7 @@ Information I require are for example
Not every aspect has to be implemented directly.
We are free to start by implementing the stuff you need for your tax declaration.

I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues).
I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues) or pull request.
Your country was already requested?
Hit the thumbs up button of that issue or participate in the process.

Expand All @@ -95,7 +101,7 @@ Please provide an example account statement for the requested exchange or some o
Are you already familiar with the API of that exchange or know some other way to request historical prices for that exchange?
Share your knowledge.

I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues).
I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues) or pull request.
Your exchange was already requested?
Hit the thumbs up button of that issue or participate in the process.

Expand All @@ -106,7 +112,7 @@ Hit the thumbs up button of that issue or participate in the process.
- Add your country to the Country enum in `src/core.py`
- Extend `src/config.py` to fit your tax regulation
- Add a country specific tax evaluation function in `src/taxman.py` like `Taxman._evaluate_taxation_GERMANY`
- Depending on your specific tax regulation, you might need to add additional functionality and might want to add or edit the enums in `src/core.py`
- Depending on your specific tax regulation, you might need to add additional functionality
- Update the README with a documentation about the taxation guidelines in your country

#### Adding a new exchange
Expand All @@ -123,88 +129,21 @@ Feel free to commit details about the taxation in your country.

## Taxation in Germany

Meine Interpretation rund um die Besteuerung von Kryptowährung in Deutschland wird durch die Texte von den [Rechtsanwälten und Steuerberatern WINHELLER](https://www.winheller.com/) sehr gut artikuliert.
Meine kurzen Zusammenfassungen am Ende von jedem Abschnitt werden durch einen ausführlicheren Text von [WINHELLER](https://www.winheller.com/) ergänzt.

An dieser Stelle sei explizit erwähnt, dass dies meine Interpretation ist. Es ist weder sichergestellt, dass ich aktuell noch nach diesen praktiziere (falls ich das Repo in Zukunft nicht mehr aktiv pflege), noch ob diese Art der Versteuerung gesetzlich zulässig ist.
Meine Interpretation steht gerne zur Debatte.

### Allgemein

> Kryptowährungen sind kein gesetzliches Zahlungsmittel. Vielmehr werden sie – zumindest im Ertragsteuerrecht – als immaterielle Wirtschaftsgüter betrachtet.
>
> Wird der An- und Verkauf von Kryptowährungen als Privatperson unternommen, sind § 22 Nr. 2, § 23 Abs. 1 Nr. 2 EStG einschlägig. Es handelt sich hierbei um ein privates Veräußerungsgeschäft von „anderen Wirtschaftsgütern“. Gemäß § 23 Abs. 3 Satz 1 EStG ist der Gewinn oder Verlust der Unterschied zwischen Veräußerungspreis einerseits und den Anschaffungs- und Werbungskosten andererseits. Es muss also nur der Anschaffungspreis vom Veräußerungspreis abgezogen werden. Die Gebühren beim Handel auf den Börsen sind Werbungskosten und damit abzugsfähig.
>
> In § 23 Abs. 3 Satz 5 EStG ist zudem eine Freigrenze von 600 € vorgesehen, bis zu deren Erreichen alle privaten Veräußerungsgeschäfte des Veranlagungszeitraums steuerfrei bleiben. Wird die Grenze überschritten, muss allerdings der gesamte Betrag ab dem ersten Euro versteuert werden. Die Einkommensteuer fällt dabei nicht erst beim Umtausch von Kryptowährungen in Euro oder eine andere Fremdwährung an, sondern bereits bei einem Tausch in eine beliebige andere Kryptowährung oder auch beim Kauf von Waren oder Dienstleistungen mit einer solchen. Vergeht aber zwischen Anschaffung und Veräußerung mehr als ein Jahr (ggf. zehn Jahre nach § 23 Abs. 1 Nr. 2 Satz 4 EStG), greift die Haltefrist des § 23 Abs. 1 Nr. 2 Satz 1 EStG. In diesen Fällen ist der gesamte Veräußerungsgewinn nicht steuerbar.
>
> Zur Bestimmung der Anschaffungskosten und des Veräußerungsgewinns sowie zur Bestimmung der Einhaltung der Haltefrist wird in der Regel die sogenannte FIFO-Methode aus § 23 Abs. 1 Nr. 2 Satz 3 EStG herangezogen. Zwar schreibt das Gesetz diese First-In-First-Out-Methode nicht für Kryptowährungen vor, in der Praxis wird sie aber weitgehend angewendet. Es werden allerdings auch andere Meinungen vertreten und eine Berechnung nach der LIFO-Methode oder – zur Bestimmung der Anschaffungskosten – nach Durchschnittswerten vorgeschlagen.
[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-kryprowaehrungen.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Kryptowährung sind immaterielle Wirtschaftsgüter.
- Der Verkauf innerhalb eines Jahres gilt als privates Veräußerungsgeschäft und ist als Sonstiges Einkommen zu versteuern (Freigrenze 600 €).
- Der Tausch von Kryptowährung wird ebenfalls versteuert.
- Gebühren zum Handel sind steuerlich abzugsfähig.
- Es kann einmalig entschieden werden, ob nach FIFO oder LIFO versteuert werden soll.

Weitere Grundsätze, die oben nicht angesprochen wurden:
- Versteuerung erfolgt separat getrennt nach Depots (Wallets, Exchanges, etc.) [cryptotax](https://cryptotax.io/fifo-oder-lifo-bitcoin-gewinnermittlung/).

### Airdrops

> Im Rahmen eines Airdrops erhält der Nutzer Kryptowährungen, ohne diese angeschafft oder eine sonstige Leistung hierfür erbracht zu haben. Die Kryptowährungen werden nicht aus dem Rechtskreis eines Dritten auf den Nutzer übertragen. Vielmehr beginnen sie ihre „Existenz“ überhaupt erst in dessen Vermögen. Die Kryptowährung entsteht direkt in den Wallets der Nutzer, wobei die Wallets bestimmte Kriterien erfüllen müssen. Airdrops ähneln insofern einem Lottogewinn oder einem Zufallsfund (sog. Windfall Profits).
>
> Mangels Anschaffungsvorgangs kommt bei einer anschließenden Veräußerung eine Besteuerung nach § 23 Abs. 1 Nr. 2 Einkommensteuergesetz (EStG) nicht in Betracht. Mangels Leistungserbringung seitens des Nutzers liegen auch keine sonstigen Einkünfte i.S.d. § 22 Nr. 3 EStG vor. Damit ist der Verkauf von Airdrops steuerfrei.
[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-airdrops.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Erhalt und Verkauf von Airdrops ist steuerfrei.

### Coin Lending

> Handelt es sich bei den durch Krypto-Lending erhaltenen Zinserträgen um Einkünfte aus sonstigen Leistungen gem. § 22 Nr. 3 EStG, so gilt eine Freigrenze von 256 Euro. Beträge darüber werden mit dem perönlichen Einkommensteuersatz von 18 bis 45 % versteuert. Außerdem wäre die spätere Veräußerung gem. § 23 Abs. 1 Nr. 2 EStG der durch das Lending erlangten Kryptowährung mangels Anschaffungsvorgangs nicht steuerbar.
>
> In Deutschland ist die Besteuerung der durch das Krypto-Lending erhaltenen Zinsen jedoch nicht abschließend geklärt. Zum einem wird diskutiert, ob es sich dabei um Kapitaleinkünfte gem. § 20 Abs. 1 Nr. 7 EStG handelt, da es sich bei der Hingabe der Kryptowährung um ein klassisches, verzinsliches Darlehen handelt. Anderseits wird von Finanzämtern immer wieder angenommen, dass es sich bei den erzielten Zinserträgen durch Lending um Einkünfte aus sonstigen Leistungen gem. § 22 Nr. 3 EStG handelt.
>
> Die erhaltene Kryptowährung in Form von Zinsen ist im Zeitpunkt des Zuflusses zu bewerten. Es handele sich deshalb nicht um Kapitaleinkünfte, da die Hingabe der Kryptowährung gerade keine Hingabe von Kapital, sondern vielmehr eine Sachleistung darstelle. Begründet wird dies damit, dass sich eine Kapitalforderung auf eine Geldleistung beziehen muss, nicht aber auf eine Sachleistung, wie es bei Kryptowährungen der Fall ist.
>
> Kontrovers diskutiert wird auch, ob der Verleih einer Kryptowährung zu einer Verlängerung der Haltefrist nach § 23 Abs. 1 Nr. 2 Satz 4 EStG führt. Eine Verlängerung der Haltefrist tritt danach nur dann ein, wenn ein Wirtschaftsgut
> - nach dem 31.12.08 angeschafft wurde,
> - als Einkunftsquelle genutzt wird und
> - damit Einkünfte erzielt werden.
> Unter Nutzung als Einkunftsquelle ist zu verstehen, dass die betroffenen Wirtschaftsgüter eine eigenständige Erwerbsgrundlage bilden. Maßgeblich ist also die Frage, ob mit der Kryptowährung Einkünften erzielt werden.
>
> Beim Lending werden jedoch in der Regel keine Einkünfte aus dem Wirtschaftsgut (der Kryptowährung), sondern aus dem Verleihgeschäft erzielt (als Ertrag aus der Forderung). Weil in diesen Fällen kein Missbrauch vorliegt, kann es bei der Haltefrist von einem Jahr bleiben. Auch das Bayrische Landesamt für Steuern hat bestätigt, dass die erhaltenen Zinsen nicht Ausfluss des „anderen Wirtschaftsgutes Fremdwährungsguthaben“, sondern vielmehr Ausfluss der eigentlichen Kapitalforderungen sind.
[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-lending.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Erhaltene Kryptowährung durch Coin Lending wird im Zeitpunkt des Zuflusses als Einkunft aus sonstigen Leistungen versteuert (Freigrenze 256 €).
- Der Verkauf ist nicht steuerbar.
- Coin Lending beeinflusst nicht die Haltefrist der verliehenen Coins.

### Staking
Nach langer Unklarheit über die Besteuerung von Kryptowährung wurde am 10.05.2022 durch das Bundesministerium für Finanzen (BMF) [ein Schreiben](https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Steuerarten/Einkommensteuer/2022-05-09-einzelfragen-zur-ertragsteuerrechtlichen-behandlung-von-virtuellen-waehrungen-und-von-sonstigen-token.html) mit rechtsverbindlichen Vorgaben zur Versteuerung veröffentlicht.

> Ebenso [wie beim Coin Lending] verhält es sich bei Kryptowährungen, die für Staking oder Masternodes genutzt werden. Nutzer müssen bei proof-of-stake-basierten Kryptowährungen oder beim Betreiben von Masternodes einen bestimmten Teil ihrer Kryptowährung der Verfügungsmacht entziehen und dem Netzwerk als Sicherheit bereitstellen. Die Sicherheit des Netzwerkes wird dadurch gewährleistet, dass regelwidriges Verhalten den dem Verlust der Sicherheitsleistung (Kryptowährung) zur Folge hat. Auch in diesen Fällen werden keine Einkünfte aus dem Wirtschaftsgut selbst, sondern für das Blockieren der Verfügungsmacht, also als Ertrag aus der Forderung, erzielt. Auch hier bleibt es bei der Haltefrist von einem Jahr.
Die ursprünglich hier stehenden Vermutungen und Interpretationen meinerseits habe ich aus der aktuellen `README.md` entfernt.
Für Interessierte findet sich das in der Versionshistorie.
Dieses Tool richtet sich nach bestem Wissen nach dem BMF Schreiben.

[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-von-staking.html)
[Wörtlich zitiert vom 19.02.2021]
An dieser Stelle sei explizit erwähnt, dass ich trotzdem keine Haftung für die Anwendung dieses Programms übernehme.
Es ist weder sichergestellt, dass ich es aktuell noch nutze (falls ich das Repo in Zukunft nicht mehr aktiv pflege), noch ob die tatsächliche Umsetzung des Programms gesetzlich zulässig ist.
Issues und Pull Requests sind gerne gesehen.

Zusammenfassung:
- siehe Coin Lending
Weitere Besonderheiten die sich so nicht im BMF-Schreiben wiederfinden, sind im folgenden aufgelistet.

### Kommission (Referral System)

Wenn man denkt, dass man den Steuerdschungel endlich durchquert hat, kommt Binance mit seinem Referral System daher.
Über das Werbungs-System erhält man einen prozentualen Anteil an den Trading-Gebühren der Geworbenen auf sein Konto gutgeschrieben.
(lebenslang, logischerweise in BTC.)
Es ist also keine typische Kunden-werben-Kunden-Prämie sondern eher eine Kommission und damit bin ich mir unsicher, wie das einzuordnen ist.
### Binance Referral Rewards (Referral System)

Für das Erste handhabe ich es wie eine Kunden-werben-Kunden-Prämie in Form eines Sachwerts.
Sprich, die BTC werden zum Zeitpunkt des Erhalts in ihren EUR-Gegenwert umgerechnet und den Einkünften aus sonstigen Leistungen hinzugefügt.
Aufgrund eines fehlenden steuerlichen Anschaffungsvorgangs ist eine Veräußerung steuerfrei.
Bei Binance gibt es die Möglichkeit, andere Personen über einen Link zu werben.
Bei jeder Transaktion der Person erhält man einen kleinen Anteil derer Gebühren als Reward gutgeschrieben.
Die Einkünfte durch diese Rewards werden durch CoinTaxman als Einkünfte aus sonstigen Leistungen ausgewiesen und damit wie eine übliche Kunden-werben-Kunden-Prämie erfasst.
17 changes: 12 additions & 5 deletions config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,29 @@
COUNTRY = GERMANY
TAX_YEAR = 2021
# Missing prices are set as 0 in the database.
# Always refetching zeroes only slows down the evaluation, but at some time.
# It might be a good idea, to try to refetch missing prices.
# Always refetching zeroes only slows down the evaluation, but at some time,
# it might be a good idea, to try to refetch missing prices.
# If you calculated the mean before, this has no effect.
REFETCH_MISSING_PRICES = False
# If the price for a coin is missing, check if there are known prices before
# and after the specific transaction and use linear regression to estimate
# the price inbetween.
# Important: The code must be run twice for this option to take effect.
MEAN_MISSING_PRICES = False
# Calculate the (taxed) gains, if the left over coins would be sold right now.
# This will fetch the current prices and therefore slow down repetitive runs.
# Calculate the (taxed) gains, if the left over coins would be sold at taxation
# deadline (end of the year). If the evaluated TAX_YEAR is ongoing, this will
# fetch the current prices at runtime and therefore slow down repetitive runs.
CALCULATE_UNREALIZED_GAINS = True
# Evaluate taxes for each depot/platform separately. This may reduce your
# taxable gains. Make sure, that this method is accepted by your tax
# authority.
MULTI_DEPOT = True
# Set logging level
# DEBUG, INFO, WARNING, ERROR, FATAL
LOG_LEVEL = DEBUG
LOG_LEVEL = DEBUG
# Taxation of Airdrops is currently only partly implemented (#115).
# If True, all airdrops will be taxed as `Schenkung`.
# If False, all airdrops will be taxed as `Einkünfte aus sonstigen Leistungen`.
# Setting this config falsly will result in a wrong tax calculation.
# Please inform yourself and help to resolve this issue by working on/with #115.
ALL_AIRDROPS_ARE_GIFTS = True
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ python-dateutil==2.8.1
requests==2.25.1
six==1.15.0
urllib3==1.26.5
xlsxwriter==3.0.3
tzdata==2022.1
6 changes: 6 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ warn_return_any = True
show_error_codes = True
warn_unused_configs = True

[mypy-xlsxwriter]
ignore_missing_imports = True

[mypy-tzdata]
ignore_missing_imports = True

[flake8]
exclude = *py*env*/
max_line_length = 88
Expand Down
4 changes: 2 additions & 2 deletions src/archive_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ def append_files(basedir: Path, filenames: list[str]) -> None:

# Evaluation and log file
log.debug("Archive latest evaluation and log file")
eval_regex = re.compile(str(TAX_YEAR) + r"\_rev\d{3}\.csv")
eval_regex = re.compile(str(TAX_YEAR) + r"\_rev\d{3}\.xlsx")
evaluation = max((f for f in os.listdir(EXPORT_PATH) if eval_regex.match(f)))
log_file = evaluation.removesuffix(".csv") + ".log"
log_file = evaluation.removesuffix(".xlsx") + ".log"
log.debug("Found: %s", ", ".join((evaluation, log_file)))
append_files(EXPORT_PATH, [evaluation, log_file])

Expand Down
Loading

0 comments on commit f1ea6a1

Please sign in to comment.