How to set up self-hosted A-share quant workbench
Self-hosted A-share quant workbench dey allow you run screening plus backtesting for your own machine. See the four things wey you must check before you start the setup.
Self-hosted A-share quant workbench
Self-hosted A-share quant workbench na one web page wey dey screen market, watch list of names, run backtests, and write post-market review. You dey control the machine by yourself, no be broker terminal. One MIT-licensed project, tickflow-stock-panel, pack all this one inside one single port. As of August 2026, the project don gather roughly two thousand eight hundred GitHub stars.
The technical layer
The feature list na the easy part to read. The layer wey dey underneath naim dey decide whether everything still go work by next quarter.
Wetin self-hosted A-share quant workbench dey carry
The architecture no long, you fit remember am for head. If you read the code and docs for the August 2026 commit, na dis be the setup:
- One web page wey dem build with React and TypeScript.
- One Python service, FastAPI, wey get scheduler wey dey refresh data base on timer.
- Local store: Parquet files for disk, wey you dey query with DuckDB, and dey compute with Polars.
- Backtesting engine, vectorbt, wey point go those files.
- Vendor SDK wey dey fetch every price wey the panel draw.
Observe wetin no dey there. Nothing for that stack connect direct to exchange. The panel dey compute; the vendor dey supply. "Self-hosted" dey explain where the code dey run, e no talk anything about where the numbers come from. To get the raw bars na the work of the layer wey dey down, one local A-share market data lake, and na that one make everything wey dey top am replaceable.
Wetin the free tier of the data source dey cover
One environment variable dey decide wetin the panel fit see. If you leave the vendor key blank, the project go run for wetin the docs call None mode: historical daily bars from one free endpoint, wey the current session dey land one to two hours after the market close. If you fill the key, you go get access based on your paid tier. That one na usable free tier for end-of-day work, but e be hard stop for anything intraday, based on terms wey the vendor fit change anytime dem renew.
The person wey maintain the project talk the arrangement straight:
This project na only for study and quantitative research, e no constitute any investment advice. Backtest results no represent future returns.
This project na personal open-source work, e base on TickFlow data source, e no be official TickFlow project.
README, shy3130/tickflow-stock-panel, read 13 August 2026
For English: the project na for study and quantitative research, e "no constitute investment advice", backtest results no represent future returns, and e be "open-source personal project, no be official TickFlow product". That one na the lesson wey go last for this kind of genre. Zero-ops dey comot the operations work from your desk. E still leave the dependency exactly where e dey before: you dey rent data from company wey no ever agree to support this panel. The README also limit the use to study and research, even though the licence file na MIT.
Why we dey pin commit SHA instead of version number
Commit SHA na the forty-character fingerprint wey git dey give every change wey dem save. E dey point to one exact state of the code, and e no dey change.
As we check am for 13 August 2026, the repository no get anything for im GitHub Releases page. E get thirty-one version tags, from v0.1.31 go reach v0.1.88, but some numbers missing and no notes dey attached. The newest tag point to one commit wey dem do for 31 July 2026, but the default branch don move go work wey dem do for 6 August 2026. Tag wey dey behind the branch and no get notes no fit tell you wetin you dey get.
So, write the SHA down. The head of the default branch for 6 August 2026 na ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33. Check that commit and record am join any conclusion wey you draw from the backtests. After six weeks, to talk say "I run the latest" no mean anything.
The documented start na two lines: copy the example environment file go .env, then run docker compose up --build, wey go serve the panel for port 3018. Those na the maintainer instructions for that commit, no be say na tested path; the build dey pull images and e need network access wey this page no test. The development route (./dev.sh, or .\dev.ps1 for Windows) need Python 3.11 or newer, Node 20 or newer, and the uv and pnpm package managers.
Wetin the LLM strategy feature dey send, and where e dey go
Strategy generation, single-stock commentary, and the review write-up na optional tins. If you leave AI_API_KEY blank, the whole surface go remain dark. If you fill am, you go set AI_PROVIDER (an OpenAI-compatible endpoint, or Ollama), AI_BASE_URL, AI_MODEL, and AI_DAILY_TOKEN_BUDGET, wey go stop calls once the token allowance for the day finish.
The direction wey the data dey travel matter. Your prompt, plus any context wey the panel attach to am, go comot from your machine go the endpoint wey you configure. If you point the base URL go hosted API, the request go reach that company; if you point am go runtime wey dey your own network, e go stay for house. To self-host the panel no mean say you self-host the model. Keys dey stay inside plaintext .env for the project root, and you fit edit dem from the settings page, wey dey behind dashboard password wey must get at least six characters. Our note on LLM-generated alpha factors explain where machine-written strategies dey usually fail.
The backtester dey calculate trading costs?
The backtester dey claim say e fit handle T+1, commissions, slippage, and stop-losses. But to get those switches no mean say dem dey active, and if backtest fill trade for the printed close with zero cost, e mean say you dey claim say trading dey free. E no free. One basis point na one hundredth of one percent. The panel wey dey down so measure the average gap between the best bid and the best offer, for basis points, across six US listings over one hour for midday on 17 June 2026.
The exact SQL behind every number
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_bpsThe name wey get the tightest spread for the panel, SPY, quote average 0.29 bps over that hour. The one wey widest, F, quote 6.98 bps. If you cross that gap two times, once to enter and once to comot, the round trip cost go be like double the figure wey show, before you even add commissions.
Timing dey cost as much as naming. The next panel pick one of those listings and measure how far the price move inside one minute, wey dem average into half-hour buckets across the same day.
The exact SQL behind every number
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_timeThe panel open for 08:00, before the regular session, where the average minute bar measure 0 bps of travel: the minutes wey trade at all stay on one price. The last bucket, 16:30, dey after the close and e average 4.2 bps. Backtest go pick one point from each of those ranges and call am the fill. Make you read the curve instead of just the endpoints: the same assumption fit dey generous for some hours and too hard for others. A-share rules get their own wahala, because T+1 mean say shares wey you buy today, you no fit sell am until the next session, and daily price limits fit comot the exit wey you model entirely. Our walkthrough of a reproducible backtest show wetin defensible setup dey record, and look-ahead bias explain the other way wey curve wey look clean fit spoil.
Adjusted or unadjusted: the question of origin
Corporate actions na place wey screener fit deceive person silently. Stock wey split ten-for-one go print ninety percent fall for the day even though nobody lose one kobo. The panel wey dey down so list the twelve biggest forward splits for US listings between 1 January and 13 August 2026.
The exact SQL behind every number
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 12The biggest one multiply one share into 10000, wey start for Feb 10, 2026. Ratios wey big reach that one no be the common four-for-one; corporate-action feed dey carry all the range for one column. The smallest of the twelve still turn one share into 20, e reach to make unadjusted chart look like say market don collapse. Momentum screen wey dey read raw prices go flag every one of dem as crash. Chinese feeds get the same wahala for dia own vocabulary, dem dey ship three variants of every series: unadjusted, forward-adjusted and back-adjusted. Make you know the one wey your panel load. Split-adjusted price history explain the arithmetic.
Wetin you suppose check before you self-host anytin like dis
- Data provenance. Which vendor, under which licence, and weda the free tier cover wetin you wan use am do.
- Key handling. Where the API keys dey for disk, who fit reach the settings page, and weda the machine dey exposed pass your own network.
- Cost modelling. Weda the backtester include commissions, slippage and the market own rules, and wetin those fields dey hold when you no touch dem.
- The update path. The exact commit wey you deploy, write am beside your results, so say you fit reproduce am months later.
FAQ
Self-hosted A-share quant workbench dey free to run?
The code get MIT license and e free. The data na different matter: if you leave the vendor key blank, this project go use free historical daily bars, wey the current session dey arrive one to two hours after the close. Any data wey fast pass that one or wey deep pass that one go need the vendor paid tiers.
Wetin "self-hosted" actually mean for here?
The web page, the scheduler, the stored files and the backtester all dey run for your own machine or server, without any account for person else platform. E no mean say the data na your own, and the optional AI features go stay remote unless you point dem go model wey dey your own network.
The LLM feature dey send my data go third party?
When you switch am on, yes, e go go any OpenAI-compatible endpoint wey you configure. The feature dey come disabled: if the AI key blank, nothing dey commot from the machine.
Why you dey pin commit SHA instead of version tag?
As of 13 August 2026, this repository no get published releases and no release notes, and the newest tag point go older code pass the default branch. "Latest" for that time mean wetin the branch hold the day wey you clone am, while commit SHA na exact thing. The same discipline dey run through open-source quant trading material generally: pin wetin you run.
Verification notes
Every architecture and configuration detail wey dey up so, we read am from the public repository on 13 August 2026, for commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33, the head of the default branch, dated 6 August 2026. The Releases page no list anything; the tag list hold thirty-one version tags from v0.1.31 go reach v0.1.88, the newest one point go commit wey date na 31 July 2026. The lines wey we quote na the maintainer own, we copy am from the README instead of make we paraphrase. The container start command na quote from that README and we no execute am for here.
The market panels na US listings, wey we pin to fixed past dates so the figures go stay one place. Dem dey here to show the two checks wey dey travel go any market, execution cost and corporate-action adjustment, instead of make we describe the Chinese market.
Every panel wey dey here come with the SQL wey produce am, wey you fit expand underneath. To run the same spread check across your own list of names before you wire one enter screener, ask for am for plain English for the Strasmore terminal.