Architectuur
De platformarchitectuur van Whitefield bestaat uit 10 componenten, verdeeld over twee omgevingen: een lokale machine voor de trading engine en een cloudplatform voor beleggers en paper trackers.
Zie Het Plan voor de samenvatting.
Ecosysteemtopologie
| # | Component | Omgeving | Technologie | Maandelijkse kosten |
|---|---|---|---|---|
| 1 | Helios Engine | Lokaal | Python 3.12, Polars | — |
| 2 | ETL Sync | Lokaal | Python 3.12, psycopg3 | — |
| 3 | IB Gateway | Lokaal (toekomst: Droplet) | Docker, IB Gateway API | — |
| 4 | Investor App | Cloud (App Platform) | Laravel 12, PHP 8.4, Filament v3 | ~$12 |
| 5 | Tracking App | Cloud (App Platform) | Laravel 12, PHP 8.4 | ~$12 |
| 6 | Vue Frontend | Cloud (App Platform) | Vue 3.5+, Vite, TypeScript | (via Laravel) |
| 7 | Publieke Site | Cloud (App Platform) | Astro 5.x | Gratis |
| 8 | Queue Workers | Cloud (App Platform) | Laravel 12, PHP 8.4 | ~$5 |
| 9 | PostgreSQL | Cloud (DigitalOcean) | PostgreSQL 16+ | ~$15 |
| 10 | Postmark | Cloud (SaaS) | Email API | Variabel |
| Totale infrastructuur | ~$44/mo |
AFM-light isolatie
Er zijn twee gescheiden Laravel-applicaties: één voor het investeerdersplatform en één voor performance tracking. Dat is geen technische hobby, maar het sterkste isolatiemodel binnen AIFM-light:
- Gescheiden codebases:
whitefield/investor/enwhitefield/tracking/zijn onafhankelijke Laravel-applicaties - Gescheiden databases:
helios_investorenhelios_trackop dezelfde managed PostgreSQL-instantie. Geen cross-database queries. - Gescheiden deployments: Elke app is een onafhankelijke App Platform service
- Geen cross-linking: Geen “upgrade naar belegger” knop, geen gedeelde sessies
Monorepo-structuur
helios/├── lib/ # Trading engine (Python)│ ├── portfolio/ # Backtestmotor, slippage, commissies│ ├── signals/ # Signaalextractie en roll-forward│ └── analysis/ # Audit scripts, statistiek├── whitefield/ # Investeerdersplatform│ ├── investor/ # Laravel investor app│ ├── tracking/ # Laravel tracking app│ ├── frontend/ # Vue SPA (dual build target)│ ├── www/ # Publieke site (Astro)│ └── docs/ # Documentatiesite (Starlight)├── packages/ # Gedeelde packages│ ├── php/ # Composer path repositories│ └── js/ # npm workspaces├── knowledge-base/ # Alle onderzoeksdocumenten├── tests/ # Python unit tests (2390+)└── scripts/ # HulpscriptsDe monorepo-aanpak met domeingebaseerde top-level split (helios/ voor intern, whitefield/ voor publiek, packages/ voor gedeeld) houdt engine, platform en documentatie bij elkaar.
Dataflow: eenrichtingsverkeer
Helios Engine (lokaal) │ ▼ ETL push (wekelijks) │Cloud PostgreSQL (DigitalOcean) │ ▼ Laravel leest │Investor/Tracking DashboardKernregel: eenrichtingsverkeer. De engine pusht data naar de cloud. De cloud pusht niets terug. De engine weet niet dat beleggers bestaan. Dat houdt de koppeling klein en het risico beheersbaar.
Risicoprofielarchitectuur
Het fonds start met één risicoprofiel: Normal.
| Attribuut | Waarde |
|---|---|
| Profiel | Normal |
| SRI-indicator | 5 (22,95% VEV) |
| Actieve systemen | System 1 + System 2 + System 3 |
| Status | Enige profiel bij lancering |
De profile_id foreign key zit al in alle 9 accounting- en engine-tabellen. Daardoor kan multi-profielondersteuning later worden toegevoegd zonder schemawijzigingen. Toekomstige profielen, zoals Defensief of Agressief, vragen wel elk om een aparte engine-run met andere parameters.
Profielwissel: vereist volledige aflossing plus nieuwe inschrijving (60-90 dagen frictie). Dat voorkomt profiel-hopping.
20 architectuurbeslissingen
Kernbeslissingen per deliverable
| # | Beslissing | Onderbouwing |
|---|---|---|
| 1 | Monorepo: domein-gebaseerde split | Engine vs. investeerder-facing |
| 2 | Twee gescheiden Laravel apps | AFM-light isolatie |
| 3 | Eenrichting ETL: lokaal naar cloud | Engine onbewust van beleggers |
| 4 | Wekelijkse batch-sync | Ontmoedigt gokgedrag |
| 5 | Truncate-and-reload met advisory locking | Idempotente re-runs |
| 6 | psycopg3 COPY protocol | Snelste PostgreSQL bulk insert |
| 7 | IBKR = primaire NAV (belt-and-suspenders) | Door derde partij geverifieerde waarde |
| 8 | Unit-based NAV met equalisatie HWM | Enkele NAV/unit voor alle beleggers |
| 9 | Onveranderlijk unit-grootboek (trigger-enforced) | Correcties via CORRECTION entries |
| 10 | Maandelijks NAV-venster + 30-dagen opzegtermijn | Anti-timing maatregelen |
| 11 | EUR-only investeerderspresentatie | USD-portefeuille geconverteerd |
| 12 | Management fee: maandelijkse NAV-aftrek | Post-fee NAV zichtbaar |
| 13 | Performance fee: maandelijkse opbouw, jaarlijkse kristallisatie | HWM-gebaseerd |
| 14 | profile_id FK in alle tabellen | Multi-profiel zonder schema-wijzigingen |
| 15 | Profielwissel = aflossing + nieuwe inschrijving | 60-90 dagen frictie |
| 16 | 3-maanden vertraagde trade-transparantie | Voorkomt front-running |
| 17 | Vue SPA: enkel codebase, twee build targets | Geen duplicatie |
| 18 | Gedeelde packages via Composer/npm | Code-hergebruik zonder koppeling |
| 19 | NUMERIC precisie overal (nooit float) | Financiele nauwkeurigheid |
| 20 | Reconciliatie drie tiers: ok/waarschuwing/fout | 0,1% ok, >1% blokkeert NAV-publicatie |
Database topologie
Twee databases, één managed instance
Twee databases draaien op dezelfde DigitalOcean Managed PostgreSQL-instantie:
| Database | Applicatie | Tabellen | Doel |
|---|---|---|---|
helios_investor | Investor App | Fondsboekhouding, NAV, units, engine-data, reconciliatie | Echt beleggen |
helios_track | Tracking App | Paper tracking portefeuilles, engagement-metrics | Virtueel volgen |
Geen cross-database queries. Geen gedeelde tabellen. Geen foreign keys tussen databases. De scheiding is volledig.
Fondsboekhouding Schema
9 kerntabellen met profile_id FK:
risk_profiles— risicoprofielconfiguratieinvestors— beleggerregistratienav_history— NAV per profiel per maandunit_transactions— onveranderlijk unit-grootboekinvestor_hwm— high-water mark per belegger per profielfund_requests— inschrijvingen en aflossingenengine_equity_snapshots— equity-curve per profielengine_holdings— actuele positiesengine_trades— handelsgeschiedenis