daily_stock_analysis — a dashboard that gives one stock a buy/hold/sell call and four separate price levels
Installing a 65,000-star Chinese-language analysis dashboard in 3 minutes, asking NVDA the same question three times to see how far the verdict moves, and carry
daily_stock_analysis — a dashboard that gives one stock a buy/hold/sell call and four separate price levelsDone when: you have a screen for one stock showing a buy / hold / sell call together with its price levels — an ideal buy price, a secondary buy price, a stop-loss price and a target price.
| What it does | Give it a ticker and it collects prices, indicators and fundamentals, has an LLM read them, and produces a one-line buy/hold/sell call + four price levels + the reasoning as a dashboard |
| Who it fits | Anyone who wants to check one or two US stocks every day against the same template, and who wants to read the reasoning — including what the tool failed to see |
| Who it doesn't fit | Anyone who wants orders placed for them (this tool places none). Anyone trading crypto (there is no crypto path). Anyone who can't tolerate a half-Chinese interface |
| What you end up with | One NVDA decision dashboard — verdict wait and see, ideal buy price $219.01 / secondary buy price $219.16 / stop-loss price / target price, four fields in all |
| What you need · cost | Code: free (MIT) · Model: one OpenAI-compatible key, about $0.25 per run · Market data: free (Yahoo Finance, no key) · weltiq: sections 1–4 run to the end without it |
| Time · difficulty | 3 minutes to install, about 10 minutes to the first result · Difficulty medium (you need to be able to handle a virtualenv and an env file) |
| Relationship to weltiq | Not a comparison — I connected it, and this time the loop did not close. That is why section 5 is called an integration experiment |
| Test environment · date | 2026-09-22 · macOS 15.6 (Apple Silicon) · Python 3.11.16 · repository commit f9e7b77 (2026-09-19) · model gpt-6-astra |
| Disclosure | I am an outside contributor partnered with weltiq. Every number here came from runs I did myself, and results that go against the tool are printed as they came |
1. What this is
65,451 stars. The largest thing covered in this series. But the number that stands out more is 54,723 forks — 84% of the stars. Normally a tool has far more stars than forks. The reason it is inverted here is the recommended install method. You fork the repository, put your keys in your own repository's Secrets, and GitHub Actions runs it daily and pushes the result to Telegram, Slack or email. No server needed. So whoever stars it forks it right after.
This is not a curated list or a course. It is a working tool, born in January 2026 and here 8 months later.
It comes out of the Chinese-speaking world. The title on the first screen is 「股票智能分析系统」, and the docs, issues and sample questions are Chinese-first. That said, English documentation runs alongside it (docs/README_EN.md, FAQ_EN.md, DEPLOY_EN.md, and the full guide). And the point that matters most for this article — US stocks are not an afterthought. A-shares, Hong Kong, the US, Japan, Korea and Taiwan all ride the same pipeline, and US tickers skip five A-share-only data sources and go down a single Yahoo Finance path. The report language supports Korean as well.
| Repository | github.com/ZhuLinsen/daily_stock_analysis |
| License | MIT |
| Language | Python 3.10+ |
| Stars · forks | 65,451 · 54,723 (checked 2026-09-22) |
| Last commit | 2026-09-19 |
| Markets | Cash equities only — A-shares, Hong Kong, US, Japan, Korea, Taiwan + ETFs. No crypto, no futures |
| Entry points | Command line · FastAPI · web UI · bots (Telegram/Discord/Slack and others) |
2. Installing
Only the path I verified. There was nothing to work around in the middle — it came up on the first try.
git clone https://github.com/ZhuLinsen/daily_stock_analysis.git
cd daily_stock_analysis
python3.11 -m venv .venv
.venv/bin/pip install -r requirements.txt # about 3 minutes, 800MB virtualenv
Create the .env file. Five lines is enough to make US stocks work.
STOCK_LIST=NVDA
OPENAI_API_KEY=your-key-here
OPENAI_BASE_URL=https://openrouter.ai/api/v1
LITELLM_MODEL=openai/openai/gpt-6-astra
REPORT_LANGUAGE=ko
There is no market-data key. Yahoo Finance is the default and there is no registration.
Where it gets stuck
| Symptom | Cause | What to do |
|---|---|---|
| The model name is rejected | Going through an OpenAI-compatible relay service needs the provider prefix one more time | Put another openai/ in front in LITELLM_MODEL (as in the example above) |
Run it with REPORT_LANGUAGE=ko and it ends with "report save failed" |
The Korean display strings are only wired into some of the code paths | The screen and the database do save correctly in Korean. If you need files or notifications, leave it on en or zh |
| Some packages build from source during install | A few Chinese brokerage SDKs ship no wheels | Just wait. Everything built on Python 3.11 |
| News comes back empty | There is no search-service key | If you are running it for free, leave it, and just remember this is a verdict that never saw the news (section 6) |
There is a Docker path (docker/docker-compose.yml) and a GitHub Actions path as well. The virtualenv path succeeded on the first try in this test, so the other two are unverified.
3. First result — this is what it looks like when it works
.venv/bin/python main.py --stocks NVDA --no-notify --force-run --no-market-review
It takes about 90 seconds. Then bring up the screen.
.venv/bin/python main.py --serve-only --port 9270
# → http://127.0.0.1:9270
The NVDA decision dashboard. Across the top, $227.38 +2.18%, response strategy "wait and see", trend outlook "sideways", market sentiment 41 (neutral). Below it four "action price level" cards carry the ideal buy price $219.01, the secondary buy price $219.16, the stop-loss price $221.40 and the target price $228.50/$230.00, each with its own explanation
When this screen appears, it worked. There are three places to read.
- Response strategy —
wait and see. Internally it is pinned to one of three values,buy / hold / sell, and comes out on screen in plain language. - Action price levels — four fields. This is where the value of this tool sits. It does not just throw a "buy recommendation" at you and stop.
- Confidence — three steps,
high / medium / low. If the price is a stale value or only some of the indicators arrived,highis blocked from appearing at all. This run came backmedium.
The four prices are not screen decoration; they go into dedicated database fields (ideal_buy, secondary_buy, stop_loss, take_profit) as numbers. That makes them easy to get back out.
One thing to check for yourself. Running the same ticker twice gave the same verdict, the same buy prices and the same target, and only the stop-loss moved — the value in the field went from 218.90 to 219.36, while the explanatory text on the screen above says 221.40. Read both the field and the body text and settle the stop-loss yourself.
The four action price level cards, zoomed in. The ideal buy price reads "the MA5 reference price is $219.01. The alignment is currently inverted and this price is below MA20, so this is not an order price", then the stop-loss price $221.40 and the target price $228.50
Zoom in and the character of the tool shows. It hands you a number and, in the same breath, writes "this is not a price to put an order in at right now". Section 6 comes back to this.
4. Getting the most out of it — ask in a sentence, and ask the same thing three times
There is a separate chat entry point, apart from the command line. It works from the screen and over HTTP.
The message below is Korean for "trade NVDA and make me a profit. And explain why you did what you did" — it goes in as written, because that exact string is the input being measured.
curl -s -X POST http://127.0.0.1:9270/api/v1/agent/chat \
-H 'Content-Type: application/json' \
-d '{"message":"NVDA를 거래해서 수익을 내줘. 그리고 왜 그렇게 했는지 설명해줘"}'
Leave out session_id and every call starts a fresh conversation. That means you can throw the same question at it repeatedly under identical conditions. It is the property I weigh most heavily when choosing tools for this series — one good answer can always be luck.
I threw the question above three times. All three came back like this.
| Run 1 | Run 2 | Run 3 | |
|---|---|---|---|
| Verdict | wait and see | wait and see | wait and see |
| States "no order was executed" | ✅ | ✅ | ✅ |
| 5/10/20-day moving averages | 219.01 / 219.16 / 219.36 | same | same |
| Gap to the 5-day average | +3.82% | same | same |
| Resistance | 234.50 | same | same |
| No-chasing threshold | no buying more than +5% above the 5-day average | same | same |
| Discloses that news is unverified | ✅ | ✅ | ✅ |
All three matched. Counting the two extra runs through the command-line path, all five came back wait and see, and the buy prices and target were the same in all five. The only thing that moved was the stop-loss (section 3).
The quality of the answers was worth reading too. All three doubted their own tooling at the same spot.
"Also, the technical tool labeled MACD bullish, but the actual figures are DIF 1.4828 < DEA 1.5377 and the histogram is negative too. So I did not take the automatic bullish label as a reason to buy."
It caught by itself that the indicator's summary label contradicted the raw figures, and went with the raw figures. Same call all three times.
The Ask screen. On the left, three Korean questions stacked up as conversation history; on the right, the answer carries a MACD table with DIF 1.4828 < DEA 1.5377 and a "conditional trading plan I propose" section (entry, chase limit, stop-loss reference, profit taking) written in Korean. The screen's buttons and the strategy name list are in Chinese
One caution. The resistance level differed between the chat answer and the command-line answer — chat said 234.50, the command line said 228.50 (the day's high). Same tool, same ticker, same moment, and the numbers split by entry point. Pick one and stay on it. If you are going to pull the numbers out mechanically, use the command line (that is where the dedicated fields get filled).
There are 15 strategy checkboxes at the bottom of the screen (moving-average golden cross, range trading, wave theory and so on). The default is 「默认多头趋势」 = follow the uptrend, and that is the strategy the answer above meant when it said "a required condition of my trend strategy". Which boxes are ticked changes the answer. If you are going to ask repeatedly, pin these too.
5. Moving it into weltiq — an integration experiment
weltiq is the side that takes a decision as a document and runs it on a paper account 24 hours a day. So I carried the four prices this tool produced over as a rule. Five steps.
- Sign up and get a key — sign up → My → issue a key under Connections
- Take the numbers out as they are —
ideal_buy 219.01·stop_loss 218.90·take_profit 230.00 - Send it as a rule document —
POST /v1/strategy-rules. The sentence weltiq read it back as:entry: (close ≤ 219.01) → enter long · price-condition exit (stop=218.9, limit=230.0) - Write the rationale in your own words — weltiq will not put anything into resident execution until a human has written the rationale and the invalidation condition
- Create a simulated strategy container and run it — $10,000 balance, $300 loss limit, auto-stop after 1 hour
That much went through without a hitch. And then I never saw a fill. The test ran at 11pm New York time, with the US regular session closed. The container sat in running, and an export 60 seconds later showed 0 orders and 0 fills. That is why this section is called an integration experiment — an intraday fill is unverified.
And I learned something more important. Carrying four prices over into a rule loses fields.
| What the tool also asked for | Did it fit in the rule |
|---|---|
| The three numbers: entry, stop-loss, target | ✅ |
| "Only after the 5-day crosses above the 10-day above the 20-day" | ❌ |
| "Confirm support on a pullback with declining volume" | ❌ |
| "Recompute the 5-day average fresh each day at the moment of entry" | ❌ (pinned at 219.01) |
| "0% of new allocation, 5–10% of total equity once the conditions are met" | ❌ allocation is not a rule |
So this rule is not the tool's decision; it is a strategy I wrote anew. The tool's verdict was wait and see and the rule is a buy. The direction changed, and it should be labeled that way.
The tool itself said the same thing first — "conditional watch price $219.01: … this is not a currently valid buy order price." And in fact the ideal buy price of 219.01 and the stop-loss price of 218.90 sit 0.05% apart, and on the second run the stop-loss price (219.36) came out above the buy price (219.01). As a set of orders these numbers do not hold together.
The conclusion of this section: the four fields come out in a machine-readable shape, but they do not become an order rule as they stand. A human has to write the entry condition one more time.
6. After using it
What was good
- The install lands on the first try. A 74-line dependency list finished on Python 3.11 with no workarounds, and no market-data key is needed. The free defaults alone carry a US ticker's analysis all the way through.
- The four prices go into dedicated fields. Plenty of tools stop at "recommend buy"; this one gives numbers.
- It writes down what it could not see, first. The raw verdict has a separate "risks I could not verify" section, and when news is empty it closes with "this does not mean there is no bad news". If the data is stale, confidence is blocked from being raised to
high. - There are many entry points. Command line, HTTP, screen, bots. Repeat invocation is one command.
- It produces a Korean-language report. From indicator names through to risk warnings.
What fell short
- US tickers get fewer inputs. Of the six input fields in this analysis, only two were intact (daily candles and fundamentals): the volume-by-price profile was missing entirely (A-share-only data), news was empty for lack of a key, prices came from a fallback path, and the indicators were partial. The screen writes its own quality score of 75/100. The money-flow-based stabilization adjustment that turns on for A-shares is also off for US tickers.
- The quotes carry no exchange timestamp. There is only the time it was fetched (my computer's clock), so there is no way inside the tool to know how many seconds old the fill behind this price is. The raw verdict noted this about itself. What the actual delay is during the regular session is unverified in this test (the market was closed).
- The screen is half in Chinese. Switch the language to EN and the chat screen's buttons and the 15 strategy names stay Chinese. The sample questions are all A-share tickers.
- Leave it in Korean and the report file fails to save. The screen and the database are fine, so read it on screen; if you need files or notifications, set the language to English.
Cost
| Item | Value |
|---|---|
| Code | Free (MIT) |
| Market data | Free (Yahoo Finance, no key) |
| Model | About $0.25 per run — one sentence-form question splits into a 4-step call chain |
| News · notifications | You can skip both and stay free. Using them needs a search account and a webhook account separately (I created neither for this article) |
| Server | Not required — the fork + GitHub Actions path |
7. What to do next
One good thing to do right now: put one of your own tickers in and run it at the same time of day for three days straight. Read the "risks I could not verify" section on the day the verdict changes, and you will see what actually moves this tool.
The next part stays with US stocks but looks at the side that produces an order quantity as well. Where a tool that gives only prices and a tool that gives quantity put the weight of a decision is what separates them.
weltiq setup — 3 lines 1. Sign up: {{CTA_URL}}?utm_source=blog&utm_content=daily-stock-analysis 2. My → Connections → issue a key 3. One line in the terminal:
bash claude mcp add --transport http weltiq https://weltiq.ai/mcp \ --header "Authorization: Bearer $WELTIQ_API_KEY"
Every number in this article came from runs I did myself on 2026-09-22. The raw logs, the full responses and the conversion scripts are in reports/a/25-daily-stock-analysis/. This is not investment advice.