- Daily Stock Analysis (股票智能分析系统)
- Skill by
- ara.so
- — Daily 2026 Skills collection.
- LLM-powered stock analysis system for A-share, Hong Kong, and US markets. Automatically fetches quotes, news, and fundamentals, generates AI decision dashboards with buy/sell targets, and pushes results to WeChat/Feishu/Telegram/Discord/Email on a schedule via GitHub Actions — zero server cost.
- What It Does
- AI Decision Dashboard
-
- One-line conclusion + precise buy/sell/stop-loss prices + checklist per stock
- Multi-market
-
- A-shares (CN), HK stocks, US stocks + indices (SPX, DJI, IXIC)
- Data sources
-
- AkShare, Tushare, YFinance for quotes; Tavily/SerpAPI/Brave for news
- LLM backends
-
- Gemini, OpenAI, Claude, DeepSeek, Qwen via LiteLLM (unified)
- Push channels
-
- WeChat Work, Feishu, Telegram, Discord, DingTalk, Email, PushPlus
- Automation
-
- GitHub Actions cron schedule, no server needed
- Web UI
-
- Portfolio management, history, backtesting, Agent Q&A
- Agent
- Multi-turn strategy Q&A with 11 built-in strategies (MA crossover, Elliott Wave, etc.) Installation Method 1: GitHub Actions (Recommended, Zero Cost) Step 1: Fork the repository https://github.com/ZhuLinsen/daily_stock_analysis Step 2: Configure Secrets ( Settings → Secrets and variables → Actions ) Required — at least one LLM key: GEMINI_API_KEY # Google AI Studio (free tier available) OPENAI_API_KEY # OpenAI or compatible (DeepSeek, Qwen, etc.) OPENAI_BASE_URL # e.g. https://api.deepseek.com/v1 OPENAI_MODEL # e.g. deepseek-chat, gpt-4o AIHUBMIX_KEY # AIHubMix (recommended, covers Gemini+GPT+Claude+DeepSeek) ANTHROPIC_API_KEY # Claude Required — stock list: STOCKS # e.g. 600519,300750,AAPL,TSLA,00700.HK Required — at least one notification channel: TELEGRAM_BOT_TOKEN TELEGRAM_CHAT_ID FEISHU_WEBHOOK_URL WECHAT_WEBHOOK_URL EMAIL_SENDER / EMAIL_PASSWORD / EMAIL_RECEIVERS DISCORD_WEBHOOK_URL Step 3: Trigger manually or wait for cron Go to Actions → stock_analysis → Run workflow Method 2: Local / Docker git clone https://github.com/ZhuLinsen/daily_stock_analysis cd daily_stock_analysis cp .env.example .env
Edit .env with your keys
pip install -r requirements.txt python main.py Docker: docker build -t stock-analysis . docker run --env-file .env stock-analysis Docker Compose: docker-compose up -d Configuration .env File (Local)
LLM - pick one or more
GEMINI_API_KEY=your_gemini_key OPENAI_API_KEY=your_openai_key OPENAI_BASE_URL=https://api.deepseek.com/v1 OPENAI_MODEL=deepseek-chat AIHUBMIX_KEY=your_aihubmix_key
Stock list (comma-separated)
STOCKS=600519,300750,AAPL,TSLA,00700.HK
Notification
TELEGRAM_BOT_TOKEN=your_bot_token TELEGRAM_CHAT_ID=your_chat_id
Optional settings
REPORT_TYPE=full # simple | full | brief ANALYSIS_DELAY=10 # seconds between stocks (avoid rate limiting) MAX_WORKERS=3 # concurrent analysis threads SINGLE_STOCK_NOTIFY=false # push each stock immediately when done NEWS_MAX_AGE_DAYS=3 # ignore news older than N days Multi-Channel LLM (Advanced) LLM_CHANNELS=gemini,deepseek,claude LLM_GEMINI_PROTOCOL=google LLM_GEMINI_API_KEY=your_key LLM_GEMINI_MODELS=gemini-2.0-flash,gemini-1.5-pro LLM_GEMINI_ENABLED=true LLM_DEEPSEEK_PROTOCOL=openai LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 LLM_DEEPSEEK_API_KEY=your_key LLM_DEEPSEEK_MODELS=deepseek-chat LLM_DEEPSEEK_ENABLED=true Stock Grouping (Send Different Stocks to Different Emails) STOCK_GROUP_1=600519,300750,000858 EMAIL_GROUP_1=investor1@example.com STOCK_GROUP_2=AAPL,TSLA,NVDA EMAIL_GROUP_2=investor2@example.com Market Review Mode MARKET_REVIEW=cn # cn | us | both
cn = A-share three-phase review strategy
us = US Regime Strategy (risk-on/neutral/risk-off)
both = both markets
Key Commands (CLI)
Run full analysis immediately
python main.py
Analyze specific stocks only
STOCKS
600519 ,AAPL python main.py
Run web dashboard
python web_app.py
Access at http://localhost:5000
Run with Docker (env file)
docker run --env-file .env stock-analysis python main.py
Run schedule mode (waits for cron, then runs)
SCHEDULE_RUN_IMMEDIATELY
true python main.py GitHub Actions Workflow The workflow file .github/workflows/stock_analysis.yml runs on schedule:
Default schedule - customize in the workflow file
on : schedule : - cron : '30 1 * * 1-5'
9:30 AM CST (UTC+8) weekdays
workflow_dispatch :
manual trigger
To change schedule: Edit .github/workflows/stock_analysis.yml cron expression. To add secrets via GitHub CLI: gh secret set GEMINI_API_KEY --body " $GEMINI_API_KEY " gh secret set STOCKS --body "600519,300750,AAPL,TSLA" gh secret set TELEGRAM_BOT_TOKEN --body " $TG_TOKEN " gh secret set TELEGRAM_CHAT_ID --body " $TG_CHAT_ID " Code Examples Programmatic Analysis (Python)
Run analysis for specific stocks programmatically
import asyncio from analyzer import StockAnalyzer async def analyze ( ) : analyzer = StockAnalyzer ( )
Analyze a single A-share stock
result
await analyzer . analyze_stock ( "600519" )
Moutai
print ( result [ 'conclusion' ] ) print ( result [ 'buy_price' ] ) print ( result [ 'stop_loss' ] ) print ( result [ 'target_price' ] ) asyncio . run ( analyze ( ) ) Custom Notification Integration from notifier import NotificationManager notifier = NotificationManager ( )
Send to Telegram
await notifier . send_telegram ( token = os . environ [ 'TELEGRAM_BOT_TOKEN' ] , chat_id = os . environ [ 'TELEGRAM_CHAT_ID' ] , message = "📈 Analysis complete\n600519: BUY at 1680, SL: 1620, TP: 1800" )
Send to Feishu webhook
await notifier . send_feishu ( webhook_url = os . environ [ 'FEISHU_WEBHOOK_URL' ] , content = analysis_report ) Using the Agent API import requests
Ask the stock agent a strategy question
response
requests . post ( 'http://localhost:5000/api/agent/chat' , json = { "message" : "600519现在适合买入吗?用均线金叉策略分析" , "stock_code" : "600519" , "strategy" : "ma_crossover"
ma_crossover, elliott_wave, chan_theory, etc.
} ) print ( response . json ( ) [ 'reply' ] ) Backtest Analysis Accuracy import requests
Trigger backtest for a stock
response
requests . post ( 'http://localhost:5000/api/backtest' , json = { "stock_code" : "600519" , "days" : 30
evaluate last 30 days of AI predictions
} ) result = response . json ( ) print ( f"Direction accuracy: { result [ 'direction_accuracy' ] } %" ) print ( f"Take-profit hit rate: { result [ 'tp_hit_rate' ] } %" ) print ( f"Stop-loss hit rate: { result [ 'sl_hit_rate' ] } %" ) Import Stocks from Image (Vision LLM) import requests
Upload screenshot of stock list for AI extraction
with open ( 'watchlist_screenshot.png' , 'rb' ) as f : response = requests . post ( 'http://localhost:5000/api/stocks/import/image' , files = { 'image' : f } ) stocks = response . json ( ) [ 'extracted_stocks' ]
Returns: [{"code": "600519", "name": "贵州茅台", "confidence": 0.98}, ...]
Web Dashboard Features Start the web app: python web_app.py Route Feature / Today's analysis dashboard /portfolio Holdings management, P&L tracking /history Past analysis reports (bulk delete supported) /backtest AI prediction accuracy backtest /agent Multi-turn strategy Q&A /settings LLM channels, notification config /import Import stocks from image/CSV/clipboard Supported Stock Formats
A-shares (6-digit code)
600519 # 贵州茅台 300750 # 宁德时代 000858 # 五粮液
HK stocks (5-digit + .HK)
00700.HK # 腾讯控股 09988.HK # 阿里巴巴
US stocks (ticker)
AAPL TSLA NVDA
US indices
SPX # S&P 500 DJI # Dow Jones IXIC # NASDAQ Built-in Trading Rules Rule Config No chasing highs DEVIATION_THRESHOLD=5 (%, auto-relaxed for strong trend) Trend trading MA5 > MA10 > MA20 bullish alignment required Precise targets Buy price, stop-loss, take-profit per stock News freshness NEWS_MAX_AGE_DAYS=3 (skip stale news) Checklist Each condition marked: ✅ Satisfied / ⚠️ Caution / ❌ Not Met Troubleshooting Analysis runs but no push received:
Check notification config
python -c "from notifier import test_all_channels; test_all_channels()"
Verify secrets are set (GitHub Actions)
gh secret list LLM API errors / rate limiting: ANALYSIS_DELAY=15 # increase delay between stocks MAX_WORKERS=1 # reduce concurrency LITELLM_FALLBACK_MODELS=gemini-1.5-flash,deepseek-chat # add fallbacks AkShare data fetch fails (A-shares): pip install akshare --upgrade
A-share data requires Chinese network or proxy
YFinance US stock data issues: pip install yfinance --upgrade
US stocks use YFinance exclusively for consistency
GitHub Actions not triggering: Check Actions are enabled: Settings → Actions → General → Allow all actions Verify cron syntax at crontab.guru Check workflow file exists: .github/workflows/stock_analysis.yml Web auth issues (admin password):
If auth was disabled and re-enabled, current password required
Reset via environment variable
WEB_ADMIN_PASSWORD=new_password Multi-worker deployment auth state:
Auth toggle only applies to current process
Must restart all workers to sync state
docker-compose restart Report Types REPORT_TYPE=simple # Concise: conclusion + key prices only REPORT_TYPE=full # Complete: all technical + fundamental + news analysis REPORT_TYPE=brief # 3-5 sentence summary Full report includes: 一句话核心结论 (one-line core conclusion) 技术面分析 (technical: MA alignment, chip distribution) 基本面 (valuation, growth, earnings, institutional holdings) 舆情情报 (news sentiment, social media — US stocks) 精确买卖点位 (precise entry/exit levels) 操作检查清单 (action checklist) 板块涨跌榜 (sector performance boards) LLM Priority Order Gemini → Anthropic → OpenAI/AIHubMix/Compatible AIHubMix is recommended for single-key access to all major models without VPN: AIHUBMIX_KEY=$AIHUBMIX_KEY # covers Gemini, GPT, Claude, DeepSeek