Webentwicklung und Datenengineering

Assetklassen-Backtester

Der Backtester stellt Aktienindizes, Bitcoin, Gold, Immobilien, Anleihen, Rohstoffe und Geldmarkt auf derselben Kapitalbasis gegenüber. Inflation, TER und Steuern bleiben zunächst aus und lassen sich bei Bedarf in den Einstellungen zuschalten.

PHP 8.3 MySQL 8.0 Datenengineering Chart.js
Assetklassen-Backtester mit mehreren Anlageklassen im Gesamtvergleich
Der öffentliche Vergleich arbeitet mit gespeicherten Tages-, Monats- und Quartalswerten.

Anlageklassen auf derselben Kapitalbasis

Der Backtester zeigt, wie sich dasselbe Startkapital in Aktienindizes, Bitcoin, Gold, Immobilien, Anleihen, Rohstoffen und Geldmarkt entwickelt hätte. Besucher wählen Zeitraum, Kapital und Vergleichsreihen. Die Seite berechnet Endwert, Rendite, CAGR, Drawdown und weitere Risikokennzahlen aus den gespeicherten Beobachtungen.

Die Browserseite ruft keine Finanzanbieter auf. PHP lädt die Werte aus MySQL, berechnet die Vergleichsreihen und liefert ein festes JSON-Format. Dadurch bleiben API-Keys, Rohantworten und Providerlogik auf dem Server.

Aktueller Datenumfang: Börsentägliche, kalendertägliche, monatliche und quartalsweise Reihen ab 2016. Historische Fremdwährungswerte werden mit dem jeweiligen Referenzkurs in Euro umgerechnet.

Was der Backtester berechnet


Wie die Daten in den Backtester kommen

Tägliche Marktwerte

Indizes, Bitcoin, Gold und Fonds

CoinGecko liefert Bitcoin in Euro, FRED den S&P 500 und GoldAPI den Goldpreis. MSCI World, DAX, EURO STOXX 50 sowie die Fonds-Proxys für globale Anleihen und Rohstoffe laufen über getrennte Yahoo-Parser. USD- und GBP-Werte werden mit dem passenden EZB-Referenzkurs in Euro umgerechnet.

Amtliche Reihen

Immobilien, Geldmarkt und Inflation

US-Immobilienpreise kommen von der FHFA über FRED, deutsche Immobilienpreise und europäische Inflation von Eurostat. Die EZB stellt den zusammengesetzten €STR-Index bereit, die New York Fed den SOFR-Index und das BLS den US-Verbraucherpreisindex.

Erträge und Revisionen

Dividenden und neue Veröffentlichungen

Die S&P-500-Dividendenrendite wird monatlich aus der freigegebenen Multpl-Tabelle übernommen. Hinterlegte Jahreswerte ergänzen MSCI World, DAX und EURO STOXX 50. Jeder Lauf prüft nur den passenden Rückblick, damit verspätete Veröffentlichungen und Revisionen ankommen, ohne die importierte Historie auszutauschen.

Historische CSV-Dateien und laufende Provider ↓ Parser, Datumsprüfung und historische EUR-Umrechnung ↓ MySQL-Upsert mit Revisionen, Fälligkeiten und Locks ↓ Dividenden-, Kosten-, Steuer- und Inflationsmodell ↓ JSON-API, Marktübersicht und Chart.js

Aufbau und Betrieb

Backend: Provideradapter liefern ein gemeinsames Beobachtungsformat. Ein Validierungsdienst prüft Datum, Währung, positive Werte und Duplikate. Repositories kapseln Datenbankabfragen; Services übernehmen Synchronisierung und Berechnung.

Datenbank: Getrennte Tabellen speichern Quellen, Anlageklassen, Beobachtungen, Dividendenwerte, Sync-Zustände und protokollierte Läufe. Indizes beschleunigen Bereichsabfragen und die Suche nach fälligen Jobs.

Frontend: Vanilla JavaScript verwaltet Zeitraumregler, Renditesortierung, Vergleichsreihen und die Schalter für Inflation, TER und Steuern. Optionale Modelle bleiben nach einem neuen Seitenaufruf aus. Chart.js liegt lokal auf dem Server; Live-Regionen und textliche Chart-Zusammenfassungen ergänzen die Diagramme.

Betrieb: STRATO stellt PHP 8.3 und MySQL 8.0 bereit. FileZilla überträgt Dateien, SSH startet Tests und Importe. Ein externer HTTPS-Zeitplaner ruft den täglichen Update-Endpunkt mit einem geheimen Header auf.


Was ich umgesetzt habe

Anforderungsanalyse

Ich habe die Spezifikation in konkrete Aufgaben für Daten, API, Oberfläche, Sicherheit und Betrieb zerlegt. Funktionen ohne fertige Berechnung habe ich bewusst deaktiviert.

Datenengineering

Ich habe Minuten-, Tages-, Börsen- und Wechselkursdaten über Datum, Zeitzone und Revision zusammengeführt. Die fertigen CSV-Dateien habe ich mit Prüfsummen abgesichert.

Finanzmethodik

Ich habe Preisentwicklung, Dividenden und Mietcashflow getrennt gerechnet. Inflation, TER und Steuern greifen nur nach einer bewussten Auswahl; Fremdwährungswerte nutzen den Referenzkurs des jeweiligen Tages.

PHP und APIs

Ich habe das PHP-Backend in Provider, Domänenobjekte, Repositories und Services aufgeteilt. Die öffentlichen Endpunkte prüfen alle Eingaben und liefern ein einheitliches JSON-Format.

MySQL

Ich habe das MySQL-Schema mit idempotenten Upserts, Quellrevisionen, Datumsindizes, Sync-Cursor und auslaufenden Locks aufgebaut.

Debugging

Ich habe beim Debugging die STRATO-CGI-Abweichungen, einen PDO-Parameterfehler, einen falsch eingetragenen CoinGecko-Key und unklare HTTP-Fehler behoben.

Tests

Ich habe Tests für Rendite, CAGR, Drawdown, Dividenden, Mietcashflow, Inflation, TER, Steuern, Parser, CSV-Import, Request-Sicherheit, Backoff, Locks und logarithmische Charts geschrieben.

Deployment

Ich habe die Anwendung ohne Buildsystem auf Shared Hosting bereitgestellt. Uploads, Datenbankimporte, Servertests und tägliche Aktualisierungen laufen über SFTP, SSH, phpMyAdmin und einen externen Cron-Dienst.


Fehler, die in der Entwicklung sichtbar wurden


Was ich bei diesem Projekt gelernt habe

Ein Finanzchart ist erst der letzte Schritt. Der größere Teil der Arbeit steckt in Quellenwahl, Tagesbildung, historischer Währungsumrechnung, Datenrechten und einem Import, der bei Wiederholungen keine Werte beschädigt.

Shared Hosting setzt eigene Grenzen. PHP verhält sich dort nicht immer wie eine lokale CLI, und ein fehlender Hosting-Cronjob braucht einen sicheren Ersatz. Die Anwendung musste unter diesen Bedingungen testbar und wartbar bleiben.

Die laufenden Quellen schließen an die importierte Historie an und dürfen vorhandene Daten nicht überschreiben. Tägliche, monatliche und quartalsweise Reihen folgen deshalb getrennten Prüfintervallen.