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 levels

Done 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.

  1. 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.
  2. 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.
  3. Confidence — three steps, high / medium / low. If the price is a stale value or only some of the indicators arrived, high is blocked from appearing at all. This run came back medium.

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.

  1. Sign up and get a key — sign up → My → issue a key under Connections
  2. Take the numbers out as they are — ideal_buy 219.01 · stop_loss 218.90 · take_profit 230.00
  3. 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)
  4. 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
  5. 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

What fell short

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.