akshare-stock-analysis
Given a stock name or code, auto-detect its market, fetch 6-month daily K-line, plot candlestick + MA/Bollinger/MACD/RSI/ATR with multi-timeframe confirmatio...
Description
name: stock-kline-analysis description: Given a stock name or code, auto-detect its market, fetch 6-month daily K-line, plot candlestick + MA/Bollinger/MACD/RSI/ATR with multi-timeframe confirmation, and deliver structured analysis with trend, momentum, valuation context, portfolio-relative strength, and event-aware risk notes.
Stock K-Line Analysis Skill
Use this skill when the user gives a stock name or code and wants K-line output and/or analysis, e.g.:
- "Analyze 600519"
- "K-line and trend for 贵州茅台"
- "How is AAPL doing?"
- "Compare 000001 and 600036 by relative strength"
Defaults (baked-in)
| Parameter | Default |
|---|---|
| Market | Auto-detect; only ask if unresolvable or genuinely ambiguous |
| K-line period | Daily (primary) + Weekly & Monthly for multi-timeframe |
| Time range | Last 6 months (today − 182 days) for daily; auto-extend for weekly/monthly |
| Price adjust | qfq for A-share; none for HK/US |
| Indicators | MA5/MA20/MA60, Bollinger Bands (20,2), MACD (12/26/9), RSI-14, ATR-14 |
| Language | Bilingual: Chinese label + English explanation |
User overrides these defaults at any time.
Market Auto-Detection Rules
| Code pattern | Inferred market |
|---|---|
| 6-digit starting with 6 | A-share Shanghai |
| 6-digit starting with 0 or 3 | A-share Shenzhen |
| 5-digit starting with 0 | HK (prefix 0) |
| 4–5 chars, letters | US (NYSE/NASDAQ) |
| Name only | Search A-share first, then HK; disambiguate if needed |
If detection confidence is low, list top-2 candidates and ask once.
AkShare API Reference
| Market | AkShare function |
|---|---|
| A-share daily | ak.stock_zh_a_hist(symbol, period="daily", start_date, end_date, adjust="qfq") |
| A-share real-time | ak.stock_zh_a_spot_em() (network may fail — wrap in try/except) |
| HK daily | ak.stock_hk_daily(symbol, adjust="qfq") |
| US daily | ak.stock_us_daily(symbol, adjust="qfq") |
| A-share symbol list | ak.stock_info_a_code_name() |
| Financial indicators | ak.stock_financial_analysis_indicator(symbol, start_year) — EPS, ROE, margins (use this; stock_a_lg_indicator does NOT exist) |
| Latest earnings summary | ak.stock_yjbb_em(date="YYYYMMDD") — EPS, revenue, net profit YoY, industry |
| Industry PE | ak.stock_industry_pe_ratio_cninfo(symbol) |
| Macro calendar | ak.news_economic_baidu() — date column is datetime.date objects; data may be stale (up to ~2 months behind current date) |
Scripts
All implementation code lives in scripts/ next to this file. You can run a full analysis end-to-end with:
python .github/skills/stock-kline-analysis/scripts/run_analysis.py 000063
python .github/skills/stock-kline-analysis/scripts/run_analysis.py 贵州茅台
python .github/skills/stock-kline-analysis/scripts/run_analysis.py AAPL --out-dir /tmp/reports
| Script | Purpose |
|---|---|
scripts/run_analysis.py |
CLI orchestrator — runs all steps end-to-end |
scripts/fetch_kline.py |
Step 2 — multi-timeframe K-line fetch with retry/fallback |
scripts/indicators.py |
Step 3 — compute MA/BB/MACD/RSI/ATR for all timeframes |
scripts/chart.py |
Step 4 — 4-panel matplotlib chart (K线+BB | Vol | MACD | RSI-14) |
scripts/valuation.py |
Step 5 — fetch EPS/revenue/ratios and compute PE/PB |
scripts/events.py |
Step 7 — macro events with hardcoded fallback calendar |
Each script has a __main__ smoke-test (e.g. python fetch_kline.py 000063).
Workflow
Step 1 — Resolve Identifier
- Apply market auto-detection rules to the raw input.
- If code is numeric and 6-digit, run
ak.stock_info_a_code_name()to confirm name. - If name is given, filter symbol list for closest match.
- If ambiguous (>1 high-confidence match), show max 3 options and ask.
- If unresolvable, report clearly and stop.
Completion check: one confirmed {code, name, market} tuple before fetching any data.
Step 2 — Fetch K-Line Data
See scripts/fetch_kline.py — fetch_all_timeframes(code, adjust="qfq") returns (df_daily, df_weekly, df_monthly), all normalized.
Key implementation notes (do NOT get wrong):
stock_zh_a_histreturns 12 Chinese-named columns — always use explicitrename(col_map), never positional assignment.- Windows: daily = last 182 days, weekly = last 365 days, monthly = last 3 years.
from scripts.fetch_kline import fetch_all_timeframes
df_daily, df_weekly, df_monthly = fetch_all_timeframes(code)
Fallback logic:
- On network error, retry once.
- If daily fetch is empty: report (suspended / delisted / wrong symbol / holiday) and stop.
- Weekly/monthly failures: skip that timeframe and note it in output.
Completion check: len(df_daily) > 20 and all OHLCV columns present and non-null.
Step 3 — Compute Indicators
See scripts/indicators.py — add_indicators(df) and add_tf_indicators(df_weekly, df_monthly).
Critical notes:
bb_width=(upper − lower) / mid * 100— result is a percentage (e.g. 12.7, not 0.127).- RSI must use a standalone helper; do not chain
.diff()twice on the same series. - Support/resistance stored in
df.attrs["support"]/df.attrs["resistance"].
from scripts.indicators import add_indicators, add_tf_indicators
df_daily = add_indicators(df_daily)
df_weekly, df_monthly = add_tf_indicators(df_weekly, df_monthly)
If fewer than 60 bars exist on daily, use all available and note the limitation. Bollinger Bands require minimum 20 bars.
Step 4 — Build K-Line Chart
Primary path — matplotlib (4-panel: K线+布林带 | 成交量 | MACD | RSI-14):
See scripts/chart.py — plot_kline(df, code, name, out_path, market_label, dpi) returns the saved path.
mplfinanceis NOT installed in the base environment.chart.pycallsmatplotlib.use("Agg")at module level — always import before pyplot.
from scripts.chart import plot_kline
chart_path = plot_kline(df_daily, code=code, name=name, market_label="A股",
out_path=f"{code}_kline.png")
Fallback (text table — only if matplotlib is also unavailable), latest 20 bars:
date close MA20 BB_up BB_low RSI14 ATR%
2026-02-10 15.38 14.90 16.20 13.60 58.3 1.4%
...
Step 5 — Valuation Context
See scripts/valuation.py — fetch_valuation(code) and compute_pe_pb(result, last_close).
ak.stock_a_lg_indicatorandak.stock_a_indicator_lgdo not exist — usestock_yjbb_em+stock_financial_analysis_indicatorinstead (both implemented invaluation.py).
from scripts.valuation import fetch_valuation, compute_pe_pb
val = fetch_valuation(code)
val = compute_pe_pb(val, last_close=float(df_daily["close"].iloc[-1]))
# val keys: eps, revenue, revenue_yoy, net_profit, net_profit_yoy,
# book_value_per_share, roe, gross_margin, industry,
# report_date, fin_df, pe_ttm, pb
For HK/US: skip valuation section or note it as unavailable.
Report:
- Current PE (TTM, computed from EPS), PB.
- ROE and net profit margin.
- Revenue/profit YoY growth from latest report.
- Industry classification.
- Note: historical PE percentile not available without
stock_a_lg_indicator; skip that sub-bullet and state the reason.
Step 6 — Portfolio / Relative Strength Mode
Activated when user provides multiple symbols (e.g. "compare 600519 and 000858").
- Fetch 6-month daily data for all symbols (same window as default).
- Compute normalized 6-month return (base=100 on start date).
- Compute 20-day rolling volatility and ATR% for each symbol.
- Rank by: return, Sharpe-proxy (return/vol), RSI, and ATR% (lower = more stable).
- Produce a comparison table and identify the relative leader.
Single-symbol mode: compare to its own industry index if identifiable.
Step 7 — Event-Aware Risk Overlay
See scripts/events.py — fetch_events(lookback_days, lookahead_days, min_importance) returns a list of formatted strings.
news_economic_baidu()date column isdatetime.dateobjects — compare natively. Data lags 4–8 weeks;events.pyalways appends a hardcoded China macro calendar (PMI, Two Sessions, earnings windows) regardless of API success.
from scripts.events import fetch_events
event_lines = fetch_events() # returns list[str] ready to print
Overlay on analysis:
- Note any major macro event dates near current price levels.
- Flag the applicable earnings season window relative to today.
- Highlight price behavior around large news days visible in the K-line.
If event API is unavailable, note it and manually annotate the known calendar dates above.
Step 8 — Deliver Structured Output
Return in this exact order:
[Symbol Summary]
名称/代码: e.g. 贵州茅台 (600519) · A-Share Shanghai
分析区间: 2025-09-12 → 2026-03-12 (daily 6M, qfq-adjusted)
多周期确认: Weekly trend: Uptrend | Monthly trend: Consolidation
[K-Line Snapshot]
最新收盘: ¥1,580.00
1日涨跌: +1.2% (+18.80)
MA5 / MA20 / MA60: ¥1,572 / ¥1,540 / ¥1,490 (排列多头 Bullish stack)
布林带 Bollinger: Upper ¥1,640 | Mid ¥1,540 | Lower ¥1,440 (Width: 12.7%)
ATR-14 (波动幅): ¥22.4 / day (1.4% of price — moderate volatility)
20日区间: ¥1,420 – ¥1,610
成交量 vs 20日均: +35% (放量)
[Technical View — 技术面]
趋势 Trend: Daily Uptrend — MA5 > MA20 > MA60, price above all MAs
Weekly confirm: above weekly MA20 ✓
Monthly confirm: testing monthly MA20 resistance ⚠
动量 Momentum: 5D: +3.1% | 10D: +5.8% | 20D: +8.2% | Ann.Vol: 18%
MACD: MACD line above signal, histogram expanding → bullish momentum
RSI-14: 68 — approaching overbought; momentum still intact
布林挤压 BB Squeeze: Width 12.7% — expanding (breakout in progress, not overextended)
支撑 Support: ¥1,490 (MA60 + BB lower + prior swing low)
阻力 Resistance: ¥1,640 (BB upper) / ¥1,650 (6M high zone)
ATR止损参考: Trailing stop = last close − 1.5×ATR = ¥1,580 − ¥33.6 ≈ ¥1,546
[Valuation — 估值]
PE (TTM): 28x — 3-year 40th percentile (moderate)
PB: 8.2x
行业 PE 中位: 25x (white spirits industry) → slight premium to peers
[Relative Strength] (if multi-symbol mode)
Symbol 6M Return Vol Sharpe RSI ATR% Rank
600519 +22% 18% 1.22 68 1.4% 1st ← Leader
000858 +14% 21% 0.67 55 1.7% 2nd
[Event Overlay — 事件]
- 2026-03-15: NPC economic policy announcement (macro risk)
- 2026-04-30: Q1 earnings release window (re-rating trigger)
- No major gap days observed in 6M K-line window.
[Risk & Watchpoints — 风险]
- 多单失效: If price closes below MA20 (¥1,540) on volume → trend weakening
- 布林下轨破位: Price below BB lower (¥1,440) = volatility expansion to downside
- 超买风险: RSI near 70; daily overbought but weekly RSI 58 = room still exists
- ATR止损: Position sizing reference — 1 ATR = ¥22.4; adjust size accordingly
- 突破条件: Break above BB upper (¥1,640) + volume >+50% avg → momentum continuation
Quality Criteria
- Market mapping is stated and auditable.
- All indicator values are computed from actual fetched data, not estimated.
- Valuation section states data source and percentile basis.
- Event overlay explicitly covers ±30 days around analysis date.
- No language implying guaranteed price direction or investment advice.
- If any section fails (e.g. valuation API times out), skip it with an explicit note.
Example Prompts
- "Use stock-kline-analysis to analyze 600519."
- "Use stock-kline-analysis for 贵州茅台 — show K-line with Bollinger Bands, MACD, RSI, and ATR stop-loss."
- "Use stock-kline-analysis on AAPL — multi-timeframe trend: are daily/weekly/monthly aligned?"
- "Use stock-kline-analysis to compare 600036 and 601318 by relative strength and ATR-based risk."
- "Use stock-kline-analysis for 000858 — show Bollinger squeeze and flag any upcoming earnings event."
- "Use stock-kline-analysis for TSLA — is price near Bollinger upper band? What does ATR say about position sizing?"
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!