🧪 Skills

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

v1.0.0
❤️ 0
⬇️ 46
👁 1
Share

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

  1. Apply market auto-detection rules to the raw input.
  2. If code is numeric and 6-digit, run ak.stock_info_a_code_name() to confirm name.
  3. If name is given, filter symbol list for closest match.
  4. If ambiguous (>1 high-confidence match), show max 3 options and ask.
  5. 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.pyfetch_all_timeframes(code, adjust="qfq") returns (df_daily, df_weekly, df_monthly), all normalized.

Key implementation notes (do NOT get wrong):

  • stock_zh_a_hist returns 12 Chinese-named columns — always use explicit rename(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.pyadd_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.pyplot_kline(df, code, name, out_path, market_label, dpi) returns the saved path.

mplfinance is NOT installed in the base environment. chart.py calls matplotlib.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.pyfetch_valuation(code) and compute_pe_pb(result, last_close).

ak.stock_a_lg_indicator and ak.stock_a_indicator_lg do not exist — use stock_yjbb_em + stock_financial_analysis_indicator instead (both implemented in valuation.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").

  1. Fetch 6-month daily data for all symbols (same window as default).
  2. Compute normalized 6-month return (base=100 on start date).
  3. Compute 20-day rolling volatility and ATR% for each symbol.
  4. Rank by: return, Sharpe-proxy (return/vol), RSI, and ATR% (lower = more stable).
  5. 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.pyfetch_events(lookback_days, lookahead_days, min_importance) returns a list of formatted strings.

news_economic_baidu() date column is datetime.date objects — compare natively. Data lags 4–8 weeks; events.py always 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)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs