Strasmore Research
Leren Matt ConnorDoor Matt Connor

Zelfgehoste A-share quant-werkbank uitgelegd

Een zelfgehoste A-share quant-werkbank voert screening en backtesting uit op uw eigen systeem. Ontdek waarvan de werking afhangt en de vier essentiële punten voor uw controle.

Een zelfgehoste A-share quant-werkbank

Een zelfgehoste A-share quant-werkbank is één webpagina die de markt screent, een lijst met namen monitort, backtests uitvoert en een post-market review schrijft, op een machine die u zelf beheert in plaats van op de terminal van een broker. Eén MIT-gelicentieerd project, tickflow-stock-panel, verpakt dit alles achter één enkele poort en had in augustus tweeduizendzesentwintig ongeveer tweeduizendachthonderd GitHub-sterren verzameld. De lijst met functies is het makkelijkst te lezen. De onderliggende laag bepaalt of dit alles het volgende kwartaal nog steeds werkt.

Waaruit een zelf-gehoste A-share quant-werkbank bestaat

De architectuur is compact genoeg om in één oogopslag te overzien. Gebaseerd op de code en documentatie van de commit van augustus 2026, ziet deze er als volgt uit:

  • Een webpagina gebouwd in React en TypeScript.
  • Een Python-service, FastAPI, met een scheduler die data op basis van een timer ververst.
  • Een lokale opslag: Parquet-bestanden op schijf, bevraagd met DuckDB en berekend met Polars.
  • Een backtesting-engine, vectorbt, die naar die bestanden verwijst.
  • Een vendor SDK die elke koers ophaalt die het panel tekent.

Let op wat ontbreekt. Niets in die stack maakt verbinding met een beurs. Het panel rekent; de vendor levert. "Zelf-gehost" beschrijft waar de code draait en zegt niets over waar de cijfers vandaan komen. Het bezitten van de ruwe bars is de taak van de laag daaronder, een lokaal A-share marktdata-meer, en dat is wat alles daarboven vervangbaar maakt.

Wat de gratis laag van de databron omvat

Eén omgevingsvariabele bepaalt wat het dashboard kan inzien. Laat de vendor-sleutel leeg en het project draait in wat de documentatie de None-modus noemt: historische dagkoersen van een gratis endpoint, waarbij de huidige sessie één tot twee uur na de sluiting binnenkomt. Vul de sleutel in en de toegang wordt geopend op basis van de betaalde laag. Dit is een bruikbare gratis laag voor end-of-day-werkzaamheden en een harde grens voor alles wat intraday is, onder voorwaarden die de leverancier bij elke verlenging kan herzien.

De beheerder is duidelijk over de regeling:

Dit project is uitsluitend bedoeld voor studiedoeleinden en kwantitatief onderzoek en vormt geen beleggingsadvies. Backtestresultaten bieden geen garantie voor toekomstige rendementen.
Dit project is een persoonlijk open-source initiatief en geen officieel product van TickFlow.
README, shy3130/tickflow-stock-panel, gelezen op 13 augustus 2026

In het Nederlands: het project is bedoeld voor studie en kwantitatief onderzoek, het "vormt geen beleggingsadvies", backtestresultaten zijn geen indicatie voor toekomstige rendementen en het is "een persoonlijk open-source project, geen officieel TickFlow-product". Dat is de blijvende les van dit hele genre. Zero-ops haalt het operationele werk bij u weg. Het laat de afhankelijkheid precies waar deze was: u huurt data van een bedrijf dat nooit heeft ingestemd met het ondersteunen van dit dashboard. De README beperkt het gebruik bovendien tot studie en onderzoek, terwijl het licentiebestand MIT is.

Waarom een commit-SHA vastleggen in plaats van een versienummer

Een commit-SHA is de vingerafdruk van veertig tekens die git toekent aan elke opgeslagen wijziging. Het benoemt permanent één exacte staat van de code.

Bij lezing op dertien augustus tweeduizend zesentwintig bevatte de repository niets op de GitHub Releases-pagina. Er zijn wel eenendertig versietags aanwezig, van v0.1.31 tot en met v0.1.88, met hiaten in de nummering en zonder bijbehorende toelichtingen. De nieuwste tag verwees naar een commit van eenendertig juli tweeduizend zesentwintig, terwijl de default branch inmiddels was gevorderd tot werk van zes augustus tweeduizend zesentwintig. Een tag die achterloopt op de branch en geen toelichting bevat, vertelt u niet wat u krijgt.

Noteer daarom de SHA. De head van de default branch op zes augustus tweeduizend zesentwintig was ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33. Check die commit uit en leg deze vast naast elke conclusie die u trekt uit de backtests. Zes weken later zegt "ik heb de nieuwste versie gedraaid" helemaal niets.

De gedocumenteerde start bestaat uit twee regels: kopieer het voorbeeld-omgevingsbestand naar .env en voer vervolgens docker compose up --build uit, waarmee het paneel op poort drieduizend achttien wordt geserveerd. Dit zijn de instructies van de beheerder bij die specifieke commit en geen gegarandeerd werkend pad; de build haalt images op en vereist netwerktoegang die op deze pagina niet is getest. De ontwikkelroute (./dev.sh, of .\dev.ps1 op Windows) vereist Python 3.11 of nieuwer, Node 20 of nieuwer, en de pakketbeheerders uv en pnpm.

Wat de LLM-strategiefunctie verstuurt en waarheen

Strategiegeneratie, commentaar op individuele aandelen en het schrijven van de review zijn optioneel. Laat AI_API_KEY leeg en het gehele oppervlak blijft inactief. Vul het in en u stelt tevens AI_PROVIDER (een OpenAI-compatibel eindpunt, of Ollama), AI_BASE_URL, AI_MODEL en AI_DAILY_TOKEN_BUDGET in, wat de aanroepen stopt zodra het dagelijkse token-budget is verbruikt.

De richting van het dataverkeer is van belang. Uw prompt, en alle context die het paneel daaraan toevoegt, verlaat uw machine richting het eindpunt dat u heeft geconfigureerd. Richt de basis-URL op een gehoste API en het verzoek gaat naar dat bedrijf; richt deze op een runtime binnen uw eigen netwerk en de data blijft binnenshuis. Het zelf hosten van het paneel betekent niet dat u het model zelf host. Sleutels bevinden zich in een platte tekst .env in de hoofdmap van het project en kunnen ook worden bewerkt via de instellingenpagina, achter een dashboardwachtwoord van minimaal zes tekens. Onze notitie over door LLM gegenereerde alfa-factoren behandelt waar door machines geschreven strategieën doorgaans tekortschieten.

Houdt de backtester rekening met handelskosten?

De backtester adverteert met T+1-afwikkeling, commissies, slippage en stop-losses. Het bestaan van deze instellingen is echter niet hetzelfde als het daadwerkelijk inschakelen ervan. Een backtest die orders uitvoert tegen de slotkoers met nul kosten, suggereert dat handelen gratis is. Dat is niet zo. Een basis point is één honderdste van één procent. Het onderstaande paneel meet het gemiddelde verschil tussen de best bid en de best offer, in basis points, voor zes Amerikaanse noteringen gedurende één uur rond het middaguur op 17 juni 2026.

QueryDe kosten van het overbruggen van de spread: gemiddelde quoted spread, zes US listings, 17 juni 2026 rond het middaguur
De exacte SQL achter elk getal
SELECT
    ticker                                                                       AS symbol,
    round(avg(toFloat64(ask_price) - toFloat64(bid_price))
          / avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2)   AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
  AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-17 16:00:00', 'UTC')
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bps
Run this yourself

De meest liquide naam in het paneel, SPY, noteerde gedurende dat uur gemiddeld 0.29 bps. De minst liquide, F, noteerde 6.98 bps. Wanneer u dit verschil twee keer overbrugt, één keer bij aankoop en één keer bij verkoop, bedragen de kosten voor een round trip ongeveer het dubbele van het getoonde cijfer, exclusief commissies.

Timing is net zo kostbaar als de keuze van het instrument. Het volgende paneel neemt een van deze noteringen en meet de koersbeweging binnen één minuut, gemiddeld over blokken van een half uur gedurende dezelfde dag.

QueryKoersbeweging binnen één minuut: KO, naar New Yorkse tijd, 17 juni 2026
De exacte SQL achter elk getal
SELECT
    formatDateTime(
        toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
        '%H:%i')                                                                 AS et_time,
    round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1)  AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
  AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
  AND window_start <  toDateTime('2026-06-17 21:00:00', 'UTC')
  AND volume > 0
  AND close > 0
GROUP BY et_time
ORDER BY et_time
Run this yourself

Het paneel opent om 08:00, vóór de reguliere handelssessie, waarbij de gemiddelde minuut-bar een beweging van 0 bps liet zien: de minuten waarin überhaupt werd gehandeld, bleven op één koers staan. Het laatste blok, 16:30, bevindt zich na het slot en bedroeg gemiddeld 4.2 bps. Een backtest kiest één punt uit elk van deze bereiken en bestempelt dit als de uitvoeringskoers. Bekijk de curve in plaats van alleen de eindpunten: dezelfde aanname is in sommige uren genereus en in andere uren nadelig. A-share regels voegen daar nog een extra dimensie aan toe, aangezien T+1 ervoor zorgt dat aandelen die vandaag zijn gekocht pas in de volgende sessie kunnen worden verkocht, en dagelijkse koerslimieten kunnen een gemodelleerde exit volledig onmogelijk maken. Onze handleiding voor een reproduceerbare backtest laat zien wat een verdedigbare opzet registreert, en look-ahead bias behandelt de andere manier waarop een ogenschijnlijk solide curve onbetrouwbaar kan worden.

Aangepast of niet: de vraag naar herkomst

Corporate actions zijn het punt waarop een screener stilletjes misleidt. Een aandeel dat tien-op-één splitst, laat op die dag een daling van negentig procent zien zonder dat iemand een cent verliest. Het onderstaande overzicht bevat de twaalf grootste forward splits op Amerikaanse beurzen tussen één januari en dertien augustus tweeduizend zesentwintig.

QueryDe twaalf grootste forward stock splits op US listings, 1 januari tot 13 augustus 2026
De exacte SQL achter elk getal
SELECT
    ticker                                                            AS symbol,
    formatDateTime(execution_date, '%b %e, %Y')                       AS effective_on,
    round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2)   AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
  AND execution_date <= toDate('2026-08-13')
  AND split_from > 0
  AND split_to > split_from
  AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12
Run this yourself

De grootste vermenigvuldigt één aandeel tot 10000, effectief per Feb 10, 2026. Ratio's van die omvang zijn niet de gebruikelijke vier-op-één; een feed voor corporate actions bevat de volledige reeks in één kolom. De kleinste van de twaalf verandert nog steeds één aandeel in 20, genoeg om een niet-aangepaste grafiek op een ineenstorting te doen lijken. Een momentum-screen die ruwe koersen leest, markeert elk van deze als een crash. Chinese feeds kennen hetzelfde probleem in hun eigen terminologie en leveren drie varianten van elke reeks: niet-aangepast, forward-adjusted en back-adjusted. Weet welke uw panel heeft geladen. Split-adjusted koershistorie doorloopt de rekenkunde.

Waar u op moet letten voordat u dergelijke systemen zelf host

  • Dataherkomst. Welke aanbieder, onder welke licentie, en of de gratis laag toereikend is voor uw beoogde gebruik.
  • Sleutelbeheer. Waar de API-keys op de schijf worden opgeslagen, wie toegang heeft tot de instellingenpagina en of de machine buiten uw eigen netwerk bereikbaar is.
  • Kostenmodellering. Of de backtester rekening houdt met commissies, slippage en de specifieke marktregels, en welke waarden deze velden bevatten als u ze ongewijzigd laat.
  • Het updatepad. De exacte commit die u heeft uitgerold, genoteerd naast uw resultaten, zodat deze maanden later reproduceerbaar zijn.

Veelgestelde vragen

Is een self-hosted A-share quant-werkstation gratis te gebruiken?

De code is MIT-gelicentieerd en gratis. De data is een afzonderlijke kwestie: als de vendor-key leeg wordt gelaten, valt dit project terug op gratis historische dagkoersen, waarbij de huidige sessie één tot twee uur na de sluiting binnenkomt. Alles wat sneller of gedetailleerder is, verloopt via de betaalde tiers van de leverancier.

Wat betekent self-hosted hier precies?

De webpagina, de scheduler, de opgeslagen bestanden en de backtester draaien allemaal op uw eigen machine of server, zonder account op het platform van een derde partij. Dit betekent niet dat de data van u is, en de optionele AI-functies blijven extern, tenzij u ze koppelt aan een model op uw eigen netwerk.

Verstuurt de LLM-functie mijn data naar een derde partij?

Wanneer deze is ingeschakeld, ja, naar het OpenAI-compatibele eindpunt dat u configureert. De functie wordt standaard uitgeschakeld geleverd: als de AI-key leeg is, verlaat er niets de machine.

Waarom een commit SHA vastpinnen in plaats van een version tag?

Op 13 augustus 2026 had deze repository geen gepubliceerde releases en geen release notes, en de nieuwste tag wees naar oudere code dan de default branch. "Latest" betekent in dat geval wat de branch bevatte op de dag dat u deze kloonde, terwijl een commit SHA exact is. Dezelfde discipline geldt voor open-source quant trading materiaal in het algemeen: pin vast wat u heeft gedraaid.

Verificatienotities

Elk architectuur- en configuratiedetail hierboven is op 13 augustus 2026 afgelezen uit de publieke repository, bij commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33, de head van de default branch, gedateerd 6 augustus 2026. De Releases-pagina bevatte niets; de tag-lijst bevatte eenendertig version tags van v0.1.31 tot v0.1.88, waarbij de nieuwste wees naar een commit van 31 juli 2026. De geciteerde regels zijn van de beheerder zelf, gekopieerd uit de README in plaats van geparafraseerd. Het startcommando voor de container is geciteerd uit die README en is hier niet uitgevoerd.

De marktpanelen betreffen Amerikaanse noteringen, vastgepind op specifieke data in het verleden zodat de cijfers constant blijven. Ze dienen hier om de twee controles te demonstreren die op elke markt van toepassing zijn, namelijk execution cost en correcties voor corporate actions, in plaats van om de Chinese markt te beschrijven.


Elk paneel hier wordt geleverd met de SQL die het heeft gegenereerd, uitklapbaar daaronder. Om dezelfde spread-controle uit te voeren op uw eigen lijst met namen voordat u er een in een screener verwerkt, kunt u hierom vragen in begrijpelijk Engels op de Strasmore-terminal.

#open-source#backtesting#screening#a-shares#self-hosted