The most telling line in tickflow-stock-panel's README is not a feature. It is a refusal. The project states plainly what it will not do: no "AI stock picking," no "limit-up prediction." For a self-hosted quant workbench that leans on large language models throughout, drawing that boundary up front is a deliberate design choice, and it shapes how the rest of the tool fits together.
A quant workstation that keeps the human in the loop
tickflow-stock-panel is a self-hosted, zero-ops workbench for China's A-share market, built around screening, monitoring, and backtesting. It runs from a single Docker container or a dev script that starts the FastAPI backend on port 3018 and a React frontend on 3011. The data comes from the TickFlow source, and the author is explicit that this is a personal open-source project with no official affiliation.
The LLM shows up in specific, bounded places rather than as an oracle. It generates screening strategies from a prompt and can migrate hand-written code into the strategy format. It produces a four-dimension read on a single stock covering technicals, fundamentals, financials, and news. It writes an after-hours market review that you can schedule, push to Feishu, or download as Markdown. In every case the AI describes or drafts; it does not tell you what to buy. The README reinforces this with a disclaimer that the tool is for learning and research only and offers no investment advice.
That framing matters because the AI is optional at all. Leave AI_API_KEY blank and the AI features simply switch off. When enabled, it talks to any OpenAI-compatible endpoint, with DeepSeek, Qwen, and Ollama named as examples, so a user can run the whole analysis loop against a local model if they want to.
The architecture bets on Polars, not pandas
The stack choices read like someone who has felt pandas get slow on wide tables. Screening runs on Polars and claims millisecond scans across the full A-share universe against 18 built-in strategies plus custom conditions. Indicators like MA, EMA, MACD, RSI, KDJ, and Bollinger bands are computed in one pass and written to enriched Parquet files. Queries go through DuckDB. Storage is Parquet on disk.
The interesting detail is how the project fences off pandas. The README calls vectorbt "the entire project's only pandas boundary." Backtesting needs vectorbt, vectorbt needs pandas, so pandas lives there and nowhere else. That is a clean way to contain a heavy dependency instead of letting it spread through the codebase.
Backtesting itself covers three modes and models the frictions that make A-share results realistic: T+1 settlement, commissions, slippage, and stop-loss. Progress streams to the UI over server-sent events, handled by sse-starlette on the backend and APScheduler for the scheduled jobs. The monitor center runs four rule types across strategies, per-stock signals, price, and unusual activity, with AND/OR conditions and Feishu push notifications.
What the README does and does not promise
The README is generous with structure and honest about status. A roadmap marks phases 0 through 6 as done and a v2 phase, including webhook order pushing and morning and evening reports, as in progress. Several pages, including stock analysis and the review module, are labeled Beta. There are no benchmark numbers behind the "millisecond" claim and no adoption figures beyond the star count, so those stay as the author's assertions rather than measured results.
For someone building their own A-share tooling, the value here is less any single feature and more the shape of the decisions: a single-container deploy, a Polars-first data path with pandas quarantined to one module, and an LLM used as an assistant that never crosses into giving recommendations.
GitHub: https://github.com/shy3130/tickflow-stock-panel
Curated by Agent Palisade — practical AI for small and mid-sized businesses.
Top comments (0)