Tax Tracker

SkillCommerce & finance

Automatic tax tracking for all trades. Calculate capital gains, generate tax reports, and optimize tax liability.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Tax Tracker skill

What this skill tells your AI

The instructions your AI receives, as published by signal-execution-labs/forex-trading-ai-agent in skills/tax-tracker/SKILL.md and read by ahel’s review.

Vollautomatisches Steuer-Tracking für alle Trading-Aktivitäten.

Overview

  • Trade Import - Automatischer Import von allen Exchanges
  • Gain Calculation - FIFO, LIFO, HIFO Methoden
  • Tax Optimization - Tax-Loss Harvesting Vorschläge
  • Report Generation - Steuerberichte für DE/AT/CH

🤖 AUTO-PILOT MODE

# ~/.kit/config/tax-tracker.json
{
  "auto_pilot": {
    "enabled": true,
    "sync_interval_hours": 24,
    "methods": {
      "crypto": "FIFO",
      "stocks": "FIFO"
    },
    "tax_loss_harvesting": {
      "enabled": true,
      "threshold_eur": 500,
      "require_approval": true
    },
    "reports": {
      "auto_generate": true,
      "schedule": "monthly",
      "formats": ["pdf", "csv"]
    },
    "notifications": {
      "tax_deadline_reminder": true,
      "large_gain_alert": 1000
    }
  },
  "jurisdiction": "DE",
  "tax_year": 2026
}

Tax Rules (Germany)

AssetHaltefristSteuersatz
Crypto1 Jahr steuerfreibis 45% + Soli
AktienKeine25% Abgeltungssteuer
ETFsKeine25% + Teilfreistellung

Commands

Import All Trades

python3 -c "
import ccxt
import json
import os
from datetime import datetime

exchanges_config = json.load(open(os.path.expanduser('~/.kit/exchanges.json')))
all_trades = []

for name, cfg in exchanges_config.items():
    try:
        exchange = getattr(ccxt, name)(cfg)
        # Fetch all trades (may need pagination)
        trades = exchange.fetch_my_trades('BTC/USDT', limit=100)
        for t in trades:
            all_trades.append({
                'exchange': name,
                'symbol': t['symbol'],
                'side': t['side'],
                'amount': t['amount'],
                'price': t['price'],
                'cost': t['cost'],
                'fee': t['fee']['cost'] if t['fee'] else 0,
                'timestamp': t['timestamp'],
                'date': datetime.fromtimestamp(t['timestamp']/1000).isoformat()
            })
        print(f'✅ {name}: {len(trades)} trades imported')
    except Exception as e:
        print(f'⚠️ {name}: {e}')

print(f'\\n📊 Total: {len(all_trades)} trades')
# Save: json.dump(all_trades, open('trades_2026.json', 'w'), indent=2)
"

Calculate Capital Gains (FIFO)

python3 -c "
from collections import defaultdict
from datetime import datetime, timedelta

# Example trades
trades = [
    {'side': 'buy', 'amount': 1.0, 'price': 40000, 'date': '2025-01-15', 'asset': 'BTC'},
    {'side': 'buy', 'amount': 0.5, 'price': 45000, 'date': '2025-06-01', 'asset': 'BTC'},
    {'side': 'sell', 'amount': 0.8, 'price': 50000, 'date': '2026-02-01', 'asset': 'BTC'},
]

# FIFO calculation
holdings = defaultdict(list)  # asset -> [(amount, price, date)]
gains = []

for trade in sorted(trades, key=lambda x: x['date']):
    asset = trade['asset']

    if trade['side'] == 'buy':
        holdings[asset].append({
            'amount': trade['amount'],
            'price': trade['price'],
            'date': datetime.fromisoformat(trade['date'])
        })

    elif trade['side'] == 'sell':
        sell_amount = trade['amount']
        sell_price = trade['price']
        sell_date = datetime.fromisoformat(trade['date'])

        while sell_amount > 0 and holdings[asset]:
            lot = holdings[asset][0]

            # Calculate how much from this lot
            used = min(lot['amount'], sell_amount)

            # Calculate gain
            proceeds = used * sell_price
            cost_basis = used * lot['price']
            gain = proceeds - cost_basis

            # Check holding period (Germany: 1 year = tax free for crypto)
            holding_days = (sell_date - lot['date']).days
            tax_free = holding_days >= 365

            gains.append({
                'asset': asset,
                'amount': used,
                'proceeds': proceeds,
                'cost_basis': cost_basis,
                'gain': gain,
                'holding_days': holding_days,
                'tax_free': tax_free
            })

            # Update lot
            lot['amount'] -= used
            sell_amount -= used

            if lot['amount'] <= 0:
                holdings[asset].pop(0)

print('🧾 CAPITAL GAINS REPORT (FIFO)')
print('=' * 60)

total_gain = 0
taxable_gain = 0

for g in gains:
    status = '🟢 Steuerfrei' if g['tax_free'] else '🔴 Steuerpflichtig'
    print(f\"{g['asset']}: {g['amount']:.4f} | Gewinn: €{g['gain']:,.2f} | {g['holding_days']}d | {status}\")
    total_gain += g['gain']
    if not g['tax_free']:
        taxable_gain += g['gain']

print()
print(f'Gesamt-Gewinn: €{total_gain:,.2f}')
print(f'Steuerpflichtiger Gewinn: €{taxable_gain:,.2f}')
print(f'Geschätzte Steuer (42%): €{taxable_gain * 0.42:,.2f}')
"

Tax-Loss Harvesting Opportunities

python3 -c "
import ccxt

# Current holdings with cost basis
holdings = [
    {'asset': 'BTC', 'amount': 0.5, 'cost_basis': 50000, 'buy_date': '2025-08-01'},
    {'asset': 'ETH', 'amount': 2.0, 'cost_basis': 3000, 'buy_date': '2025-09-15'},
    {'asset': 'SOL', 'amount': 20, 'cost_basis': 150, 'buy_date': '2025-10-01'},
]

exchange = ccxt.binance()

print('🧾 TAX-LOSS HARVESTING OPPORTUNITIES')
print('=' * 60)

total_unrealized_loss = 0

for h in holdings:
    try:
        ticker = exchange.fetch_ticker(f\"{h['asset']}/USDT\")
        current_price = ticker['last']
        current_value = h['amount'] * current_price
        cost = h['amount'] * h['cost_basis']
        unrealized = current_value - cost

        if unrealized < 0:
            total_unrealized_loss += abs(unrealized)
            print(f\"🔴 {h['asset']}: Unrealized Loss €{unrealized:,.2f}\")
            print(f\"   Sell now to realize loss for tax offset\")
            print(f\"   Can rebuy after 30 days (wash sale rule)\")
            print()
    except:
        pass

print(f'Total harvestable losses: €{total_unrealized_loss:,.2f}')
print(f'Potential tax savings (42%): €{total_unrealized_loss * 0.42:,.2f}')
"

Generate Annual Tax Report

python3 -c "
from datetime import datetime
import json

# Mock data - load from trades file
report = {
    'year': 2026,
    'jurisdiction': 'DE',
    'summary': {
        'total_proceeds': 125000,
        'total_cost_basis': 100000,
        'total_gains': 25000,
        'tax_free_gains': 15000,
        'taxable_gains': 10000,
        'total_fees': 500,
        'estimated_tax': 4200
    },
    'by_asset': {
        'BTC': {'gains': 18000, 'taxable': 8000},
        'ETH': {'gains': 5000, 'taxable': 2000},
        'SOL': {'gains': 2000, 'taxable': 0}
    }
}

print('🧾 ANNUAL TAX REPORT 2026')
print('=' * 60)
print(f\"Jurisdiction: {report['jurisdiction']}\")
print()
print('SUMMARY')
print('-' * 60)
print(f\"Total Proceeds:     €{report['summary']['total_proceeds']:>12,.2f}\")
print(f\"Total Cost Basis:   €{report['summary']['total_cost_basis']:>12,.2f}\")
print(f\"Total Gains:        €{report['summary']['total_gains']:>12,.2f}\")
print(f\"  - Tax Free:       €{report['summary']['tax_free_gains']:>12,.2f}\")
print(f\"  - Taxable:        €{report['summary']['taxable_gains']:>12,.2f}\")
print(f\"Trading Fees:       €{report['summary']['total_fees']:>12,.2f}\")
print()
print(f\"Estimated Tax:      €{report['summary']['estimated_tax']:>12,.2f}\")
print()
print('BY ASSET')
print('-' * 60)
for asset, data in report['by_asset'].items():
    print(f\"{asset:6} | Gains: €{data['gains']:>10,.2f} | Taxable: €{data['taxable']:>10,.2f}\")
"

Auto-Pilot: Scheduled Tax Sync

python3 -c "
import json
import os
from datetime import datetime

config_path = os.path.expanduser('~/.kit/config/tax-tracker.json')

# Auto-pilot logic
def run_auto_pilot():
    config = json.load(open(config_path)) if os.path.exists(config_path) else {}
    auto = config.get('auto_pilot', {})

    if not auto.get('enabled'):
        print('⚠️ Auto-pilot disabled')
        return

    print('🤖 TAX TRACKER AUTO-PILOT')
    print('=' * 50)
    print(f'Running at: {datetime.now().isoformat()}')
    print()

    # 1. Sync trades from all exchanges
    print('📥 Syncing trades from exchanges...')
    # sync_all_trades()

    # 2. Calculate current tax position
    print('📊 Calculating tax position...')
    # calculate_gains()

    # 3. Check for tax-loss harvesting
    if auto.get('tax_loss_harvesting', {}).get('enabled'):
        print('🔍 Checking tax-loss harvesting opportunities...')
        # find_harvest_opportunities()

    # 4. Generate report if scheduled
    if auto.get('reports', {}).get('auto_generate'):
        print('📄 Generating tax report...')
        # generate_report()

    print()
    print('✅ Auto-pilot cycle complete')

run_auto_pilot()
"

Workflow

Year-End Tax Workflow

  1. Januar: Sync all previous year trades
  2. Februar: Generate preliminary report
  3. März-Mai: Submit to tax advisor / Finanzamt
  4. Laufend: Track new trades, optimize

Supported Formats

FormatUse Case
CSVImport to tax software
PDFArchive / Advisor
JSONK.I.T. internal
XLSXManual review

German Tax Calendar

DeadlineAction
31. JuliSteuererklärung ohne Steuerberater
28/29. FebSteuererklärung mit Steuerberater
LaufendVorauszahlungen (15.3, 15.6, 15.9, 15.12)

Signals

GitHub stars
136
Forks
870
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
tax-tracker
Source
github.com/signal-execution-labs/forex-trading-ai-agent