# daily_stock_analysis forks almost as much as it stars, and that is the design

> An MIT-licensed Python system that runs an LLM over a watchlist across six markets on a schedule and pushes a decision dashboard to WeCom, Feishu, Telegram, Discord, Slack or email. It installs with no keys at all, and the README is unusually blunt about how long that lasts.

**ZhuLinsen/daily_stock_analysis** — LLM 驱动的多市场股票智能分析系统：多源行情、实时新闻、决策看板与自动推送，支持零成本定时运行。 LLM-powered multi-market stock analysis system with multi-source market data, real-time news, decision dashboard, automated notifications, and cost-free scheduled runs.

- Repository: https://github.com/ZhuLinsen/daily_stock_analysis
- Website: https://dsa.zhulinsen.tech
- Stars: 65,790 · Forks: 54,905
- Language: Python
- License: MIT
- Published: 2026-08-08 · Updated: 2026-08-18 · Language: en
- Canonical page: https://hysenlabs.com/projects/zhulinsen-daily-stock-analysis

## Zero-config works today, and the README does not promise next month

The default configuration needs no keys at all. AkShare, Baostock and YFinance ship in the box, and the project describes that as running with zero configuration. The same paragraph then withdraws the promise: those free sources are subject to upstream rate limiting, interface changes and network fluctuation, and their stability is not guaranteed. For long-term scheduled runs, batch analysis or steadier quotes, the recommendation is to configure token-based sources such as TickFlow, Tushare or Longbridge. Finding that stated plainly is rare and useful. The consequence is a specific operational one. A zero-config install can work on day one and start returning gaps on day thirty, and the documented fix is to buy a token rather than to change code. Budget for that before relying on an unattended schedule, because a scheduled job that quietly produces thinner reports is worse than one that stops.

```bash
python main.py --debug
python main.py --dry-run
python main.py --stocks 600519,hk00700,AAPL,2330.TW
python main.py --market-review
python main.py --schedule
python main.py --serve-only
```

The dry run flag is the one to reach for first, since it is how you find out whether a source is answering before a schedule depends on it.

## The data providers are an ordered fallback chain with priorities in requirements.txt

Read requirements.txt and the architecture falls out of it, because every quote source carries its priority in a comment. efinance is priority 0, AkShare is priority 1, Tushare and Pytdx are priority 2, Baostock is priority 3, YFinance is priority 4, and Longbridge is priority 5 as the Docker and Linux fallback. TickFlow and a Futu SDK sit alongside them, the latter for a read-only portfolio import. Two supporting libraries explain behaviour you would otherwise have to infer. tenacity is present for retry with exponential backoff, and sqlalchemy provides ORM access, so a run is written down rather than printed and lost. The consequence for a user is that a missing field is rarely a hard failure. When a token source lacks permission for a field the pipeline falls back and the report is thinner rather than empty, which is the right behaviour in production and an irritating one when you are trying to work out why a particular number moved.

## Longbridge is pinned twice because a glibc wall splits it

One dependency carries two pins and a comment explaining why, which is the most informative line in the file. On Linux with Python below 3.12 the requirement is longbridge 0.2.74. Everywhere else, meaning other platforms or Python 3.12 and above, it is longbridge 4.x with an upper bound below 5. The comment states that the Longbridge 4.x Linux wheels require manylinux 2.39 while Docker uses bookworm with glibc 2.36. That arithmetic is the entire problem. On Linux with a modern Python you get the 4.x line, and the container the project recommends is built on a glibc too old for those wheels. The fields Longbridge is configured to fill in are the Hong Kong and United States ones, including volume ratio, turnover rate and PE. Those are exactly the fields that quietly disappear when the environment lands on the wrong side of the pin, and the report looks complete either way.

## Whether the job runs at all comes down to one pinned calendar library

The scheduled run defaults to 18:00 Beijing time on every working day and skips non-trading days, with the A-share, Hong Kong and United States holidays named explicitly. Deciding that is the job of exchange-calendars, which requirements.txt pins at 4.13.0 or higher and annotates with a warning that the 4.5.x line is incompatible with the Timedelta behaviour in pandas 3. So a calendar library upgrade can break the trading-day check, and the trading-day check is the gate in front of everything else the project does. The consequence is a dependency risk sitting upstream of the analysis rather than inside it. If that pin is relaxed carelessly the failure mode is not a crash in a report. It is a job that fires on a public holiday, or skips a real trading day, and both of those look like a data problem to whoever reads the output.

## Sentiment is a US-only source, so most watchlists have no social input

The social sentiment row covers Reddit, X and Polymarket, is marked optional, and applies to United States stocks only. Nothing else in the stack fills that gap: the news search integrations are general web search services rather than anything market-specific. For an A-share, Hong Kong, Japanese, Korean or Taiwan listing, the sentiment line in the dashboard is therefore written without a dedicated social source behind it. That is a real difference between the report you get for a United States listing and the one you get for a Shanghai listing, and it is invisible from the output, since the format is identical either way. The dashboard also carries a separate market review for the main indices, which means the index level commentary and the per-stock sentiment line rest on different data foundations and should not be read as coming from the same place.

## Futu import is IPv4 only, and a custom Tushare URL forwards your token

Two entries in the environment template carry security weight. The Futu OpenD integration is restricted to IPv4, and the template warns that when Docker connects to the host's OpenD you must not use the container's own 127.0.0.1, which in practice means host networking or a routable host address. The import is also scoped: it reads only long positions, only in active real accounts of the normal and master types, and only for the A-share, Hong Kong and United States markets. Separately, Tushare accepts a custom base URL for networks that cannot reach the official endpoint, and the template says plainly that a non-official address means the token and all request content pass through that third party's server. That is a reasonable trade for a public watchlist and a poor one for a private gateway, so it belongs in a decision rather than in a template you copy without reading.

## Buy, hold and sell with a score, and no stated calibration

The dashboard this project pushes is a set of judgements: a buy, hold or sell label, a numeric score, a trend reading, entry and exit levels, risk alerts and catalysts. The worked example in the documentation shows scores in the thirties, forties and sixties attached to those labels, which is enough to show the shape of the output and not enough to judge it. Nothing in the visible documentation says how the score is computed, what the bands mean, or how the model was asked to arrive at them, and the full guide points to a trading discipline section rather than to a scoring specification. Read the number as a compressed model opinion that sits next to the risk lines, not as a value to act on. The more useful part of the output is the risk alert list, because that is the section naming what would invalidate the call rather than restating it.

## Conclusion

Adopt daily_stock_analysis if you want a scheduled, push-delivered read on a personal watchlist and are willing to fork it, because with 54,905 forks against 65,790 stars the project's own usage pattern is to copy it and adjust the list. Do not adopt it expecting a signal you can trade from: the buy, hold and sell labels and their numeric scores are model output, and nothing in the visible documentation says how the score is computed. Two things to settle before the first scheduled run. Decide whether the built-in free quote sources are good enough, because the README says their stability is not guaranteed and the documented fix is a paid token. And check the exchange-calendars pin, since that library decides whether the job runs on a given day at all.

## FAQ

### What does daily_stock_analysis do?

It analyses a watchlist of stocks with an LLM and pushes a decision dashboard to WeCom, Feishu, Telegram, Discord, Slack or email on a schedule. The report carries a core conclusion, a score, a trend reading, buy and sell levels, risk alerts, catalysts and an action checklist, and there is also a web and desktop workbench with history, backtesting and holdings.

### Does daily_stock_analysis need paid API keys?

Not for the core. AkShare, Baostock and YFinance are built in and run with zero configuration, though the README says their stability is not guaranteed. Token sources such as TickFlow, Tushare and Longbridge are recommended for long-term scheduled or batch runs. The GitHub Actions path does require at least one AI model key and at least one notification channel.

### Which markets does daily_stock_analysis cover?

A-shares, Hong Kong, United States, Japan, Korea, Taiwan, and ETFs, covering quotes, K-lines, technical indicators, news, announcements and fundamentals. The social sentiment source is the exception: it covers Reddit, X and Polymarket and is limited to United States stocks.

### How do I run daily_stock_analysis on a schedule?

The default is 18:00 Beijing time every working day, skipping non-trading days including A-share, Hong Kong and United States holidays. You can fork the repository and enable the GitHub Actions workflow after setting the required secrets, or run it locally with the schedule flag. The trading-day decision depends on a pinned exchange-calendars release.

## Sources

- [Official documentation](https://dsa.zhulinsen.tech)
- [Official README](https://github.com/ZhuLinsen/daily_stock_analysis#readme)
- [Project repository](https://github.com/ZhuLinsen/daily_stock_analysis)
- [Release notes](https://github.com/ZhuLinsen/daily_stock_analysis/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/zhulinsen-daily-stock-analysis
