24 technologieen zijn geevalueerd, geselecteerd en version-pinned. De grote keuzes zijn gemaakt. Er zijn geen verdere technologiebeslissingen nodig.
Zie Het Plan voor de samenvatting.
Overzicht per categorie
Engine (Lokaal)
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Python | 3.12 | Kernprogrammeertaal | Ecosysteem voor kwantitatieve financien, met goede Polars-compatibiliteit |
| Polars | Gepind | DataFrame-bibliotheek | 83x sneller dan Pandas voor dict-lookup-patronen in dagelijkse backtest |
| NumPy/SciPy | Gepind | Wiskundige berekeningen | Regressie, statistiek, optimalisatie |
| Norgate Data | — | Historische aandelendata | Split-correcties, delisting-handling, survivorship-vrije dataset |
| Parquet | — | Opslagformaat | Kolom-georienteerd, 10x kleiner dan CSV en snel te filteren |
Backend (Cloud)
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Laravel | 12 | PHP web framework | Hoge ontwikkelsnelheid, Filament admin panel, Eloquent ORM |
| PHP | 8.4 | Server-side taal | Volwassen ecosysteem, DigitalOcean ondersteuning |
| PostgreSQL | 16+ | Database | NUMERIC precisie, advisory locking, managed op DigitalOcean |
| Filament | v3 | Admin panel | Investor management, NAV publicatie, fondsverzoeken |
| psycopg3 | Gepind | PostgreSQL driver (Python) | COPY protocol voor snelste bulk insert, async ondersteuning |
Frontend
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Vue | 3.5+ | SPA framework | Reactieve UI, enkel codebase met twee build targets |
| Vite | Gepind | Build tool | Snelle HMR, VITE_API_URL voor dual-target builds |
| TypeScript | — | Typeveiligheid | Voorkomt runtime-fouten in financiele berekeningen |
| Livewire | 3 | Reactive componenten | Server-side rendering zonder apart JS framework (admin) |
| Alpine.js | Gepind | Lichtgewicht JS | Eenvoudige interacties zonder framework-overhead |
| TailwindCSS | 3 | Utility-first CSS | Snelle prototyping, consistent ontwerp |
Charts
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Lightweight Charts | Gepind | Financiele grafieken | TradingView bibliotheek, professionele equity curves en candle charts |
Publieke Sites
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Astro | 5.x | Statische site-generator | Nul JavaScript in productie, snelle laadtijden |
| Starlight | 0.31+ | Documentatiesite | Zijbalknavigatie, MDX ondersteuning, ingebouwd zoeken |
E-mail
| Technologie | Versie | Rol | Onderbouwing |
|---|
| Postmark | — | Transactionele e-mail | Helios Letter, meldingen en hoge afleveringspercentages |
Hosting en Infrastructuur
| Technologie | Versie | Rol | Onderbouwing |
|---|
| DigitalOcean App Platform | — | Managed containers | Eenvoudige deployment, ~$44/mo totaal |
| Cloudflare | — | DNS, CDN, Access | Gratis tier, Cloudflare Access voor docs.whitefield.com |
Mobiel
| Technologie | — | Rol | Onderbouwing |
|---|
| Progressive Web App (PWA) | — | Mobiele toegang | Geen native app bij lancering, browser-gebaseerd |
Totaalkosten infrastructuur
| Component | Maandelijks |
|---|
| Investor App (App Platform) | ~$12 |
| Tracking App (App Platform) | ~$12 |
| Queue Workers | ~$5 |
| PostgreSQL (Managed) | ~$15 |
| Publieke Site (Astro) | Gratis |
| Docs Site (Starlight) | Gratis |
| Cloudflare | Gratis |
| Totaal | ~$44/mo (~EUR 44) |
Versiepinning en lockfiles
Versiebeheerstrategie
Alle afhankelijkheden zijn version-pinned met lockfiles:
- Python:
pyproject.toml met exacte versies, uv.lock voor reproduceerbare omgevingen
- PHP/Laravel:
composer.lock met exacte versies per package
- JavaScript/Vue:
package-lock.json met exacte versies
- Astro/Starlight:
package-lock.json met specifieke overschrijvingen (sitemap 3.3.0 voor zod v4 incompatibiliteit)
Versiepinning voorkomt onverwachte breaking changes en maakt builds reproduceerbaar.
Astro 5-compatibiliteit
legacy.collections: true vereist voor Astro 5 content collection compatibiliteit met Starlight
- Sitemap 3.3.0 override om zod v4 incompatibiliteit te vermijden
- Astro 5.1.8 + Starlight 0.31.1 vastgelegd
Performance-patronen
Optimalisaties in de engine
-
Dict lookups boven DataFrame.filter(): fast_lookup: dict[ticker][date] -> row_dict voor O(1)-toegang in de dagelijkse backtestloop. DataFrame.filter() is O(n) per aanroep — de dict-aanpak gaf 83x versnelling.
-
Checkpoint resumption: de dagelijkse backtest slaat indicatoren, posities, pending orders en equity-reeks op. Daarmee voorkom je volledige herberekening vanaf 1999.
-
Indicator caching: indicator_cache.pickle met SHA-256 config-hash invalidatie. Voorkomt herberekening van 900+ aandelenindicatoren bij ongewijzigde configuratie.
-
Parquet opslagformaat: Kolom-georienteerd formaat dat 10x kleiner is dan CSV en snelle kolomselectie en filtering ondersteunt.