Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Chinese A-share stock analysis via natural language using AKShare — real-time quotes, technicals, fundamentals, sectors, and derivatives.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
SKILL.md
1---2name: akshare-stock3description: A股分析全能 Skill(实时行情、技术面、基本面、板块、衍生品与跨市场),基于 akshare + 自然语言路由4metadata:5openclaw:6emoji: "📈"7requires:8python_modules: ["akshare", "pandas", "numpy"]9---1011# A股分析全能 Skill(AKShare)1213目标:在 OpenClaw 中通过自然语言触发 A 股和相关市场分析,输出适配 QQ/Telegram 的紧凑文本。1415- 运行环境:Mac + Python 3.916- akshare 路径:`/Users/molezz/Library/Python/3.9/lib/python3.9/site-packages`17- Skill 入口建议:`python3 skills/akshare-stock/main.py --query "${USER_QUERY}"`1819---2021## 1) 整体架构设计2223采用 `Router -> Service -> Analyzer -> Formatter` 四层结构,便于扩展和维护。2425### A. 目录组织(建议)2627```text28skills/akshare-stock/29SKILL.md30main.py # OpenClaw 调用入口31router.py # 意图识别 + 参数解析32schemas.py # 数据结构定义(dataclass)33formatter.py # QQ/Telegram 输出模板34services/35market_service.py # 大盘/个股行情、K线、分时、涨跌停、资金流36fundamental_service.py# 财务指标、财报、融资融券、龙虎榜37sector_service.py # 行业/概念板块、轮动、板块资金流38cross_service.py # 期货/期权、基金、可转债、港股/美股39analyzers/40kline_analyzer.py # 均线、振幅、涨跌幅、量比等41flow_analyzer.py # 主力净流入、连续性、强弱排序42rotation_analyzer.py # 板块轮动强度、持续性43adapters/44akshare_adapter.py # 封装 akshare 接口,隔离 API 变化45utils/46trading_calendar.py # 交易日判断47symbols.py # 指数/股票/板块别名映射48cache.py # 短缓存(30~120 秒)49```5051### B. 核心流程52531. `main.py` 接收自然语言 query。542. `router.py` 输出结构化意图:`intent + symbols + timeframe + metric + top_n`。553. `services/*` 拉取原始数据(只做数据获取和轻清洗)。564. `analyzers/*` 做指标计算和结论生成。575. `formatter.py` 按聊天平台压缩输出(短句、分段、emoji、重点数值)。5859### C. 关键设计点6061- **意图优先级**:先识别“任务类型”,再解析标的和参数,避免误判。62- **适配层隔离**:akshare 接口若改名,只需改 `adapters/akshare_adapter.py`。63- **容错回退**:实时接口失败时回退到最近交易日数据,并标注“非实时”。64- **缓存策略**:65- 大盘/资金流:30~60 秒66- 板块排行:60~120 秒67- 财报/财务:当天缓存68- **消息长度控制**:单条建议 <= 1000 字符;超长自动拆分 2~3 条。6970---7172## 2) 触发词设计(自然语言路由)7374建议采用“关键词 + 正则 + 别名词典”混合方式。7576### A. 意图分类(Intent)7778- `INDEX_REALTIME`:实时大盘79- `KLINE_ANALYSIS`:历史 K 线80- `INTRADAY_ANALYSIS`:分时分析81- `LIMIT_STATS`:涨跌停统计82- `MONEY_FLOW`:资金流向83- `FUNDAMENTAL`:财务指标 / 财报84- `MARGIN_LHB`:融资融券 / 龙虎榜85- `SECTOR_ANALYSIS`:行业/概念/轮动/板块资金86- `DERIVATIVES`:期货/期权87- `FUND_BOND`:基金净值 / 可转债88- `HK_US_MARKET`:港股 / 美股8990### B. 触发词样例9192- 实时大盘:`A股大盘` `上证现在多少` `沪深300实时`93- K线:`贵州茅台近60日K线` `宁德时代周线` `比亚迪月线复权`94- 分时:`看下000001分时` `平安银行今天分时走势`95- 涨跌停:`今日涨停统计` `跌停家数` `连板梯队`96- 资金流:`主力资金流入前十` `北向资金` `行业资金净流入`97- 基本面:`茅台财务指标` `宁德时代最新季报` `ROE和毛利率`98- 融资融券/龙虎榜:`中兴通讯融资融券` `今日龙虎榜`99- 板块:`行业板块涨幅榜` `概念轮动` `AI板块资金流`100- 其他市场:`IF主力合约` `300ETF期权` `基金净值` `可转债行情` `腾讯港股` `英伟达美股`101102### C. 参数抽取规则103104- 股票代码:`\b\d{6}\b`(如 `600519`)105- 日期:`YYYYMMDD` / `YYYY-MM-DD` / `今天/昨日/近N日`106- 周期:`1m/5m/15m/30m/60m/day/week/month`107- 排名:`前N`(默认 10)108- 复权:`前复权/后复权/不复权`109110---111112## 3) 各功能实现思路113114下面是“功能 -> 推荐数据 -> 分析输出”的落地框架(接口以 akshare 当前版本为准,实际以 adapter 层统一封装)。115116### 3.1 实时大盘行情(已有基础版,升级点)117118- 数据:上证、深成指、创业板、沪深300、上证50、科创50。119- 增强:加入成交额、振幅、领涨板块、北向资金当日净流入。120- 输出:`指数点位 + 涨跌幅 + 市场情绪一句话`。121122### 3.2 行情分析123124- **历史K线**:125- 数据:日/周/月 K 线(复权可选)。126- 指标:近 N 日涨跌幅、5/10/20 日均线、量能变化、波动率。127- 输出:趋势判断(多头/震荡/走弱)+ 关键位(支撑/压力)。128- **分时数据**:129- 数据:分钟级行情。130- 指标:VWAP 偏离、盘中高低点、午后资金回流。131- **涨跌停统计**:132- 数据:涨停池、跌停池、连板梯队。133- 指标:涨停家数、炸板率、最高连板、情绪评分。134- **资金流向**:135- 数据:个股/行业/市场资金流。136- 指标:主力净流入 TopN、连续净流入天数、资金集中度。137138### 3.3 基本面分析139140- **个股财务指标**:ROE、毛利率、净利率、资产负债率、经营现金流。141- **财报数据**:营收同比、净利润同比、扣非净利润同比、EPS。142- **融资融券**:融资余额、融券余额、日变动,识别杠杆偏好。143- **龙虎榜**:上榜原因、买卖前五席位净额、游资活跃度。144- 输出风格:`核心指标摘要 + 同比/环比 + 风险提示`。145146### 3.4 板块分析147148- **行业板块涨跌**:行业涨跌幅榜、成交额、上涨家数。149- **概念板块轮动**:近 5 日强度、持续性、日内切换速度。150- **板块资金流向**:行业/概念净流入排行 + 领涨龙头。151- 输出:`强势板块Top3 + 轮动结论 + 次日观察点`。152153### 3.5 其他(跨市场)154155- 期货/期权:主力合约价格、涨跌、持仓变化;期权 PCR(若可得)。156- 基金净值:开放式基金净值、估值偏离、近一周收益。157- 可转债:价格、溢价率、正股联动、成交额。158- 港股/美股:实时行情、近5日表现、与A股联动提示。159160---161162## 4) 代码示例框架(骨架)163164> 说明:以下为可直接落地的最小框架,不含完整业务细节。165166### `main.py`167168```python169#!/usr/bin/env python3170# -*- coding: utf-8 -*-171172import argparse173from router import parse_query174from services.market_service import MarketService175from services.fundamental_service import FundamentalService176from services.sector_service import SectorService177from services.cross_service import CrossService178from formatter import render_output179180181def dispatch(intent_obj):182intent = intent_obj.intent183184if intent in {"INDEX_REALTIME", "KLINE_ANALYSIS", "INTRADAY_ANALYSIS", "LIMIT_STATS", "MONEY_FLOW"}:185data = MarketService().handle(intent_obj)186elif intent in {"FUNDAMENTAL", "MARGIN_LHB"}:187data = FundamentalService().handle(intent_obj)188elif intent == "SECTOR_ANALYSIS":189data = SectorService().handle(intent_obj)190elif intent in {"DERIVATIVES", "FUND_BOND", "HK_US_MARKET"}:191data = CrossService().handle(intent_obj)192else:193data = {"ok": False, "error": "未识别请求,请补充标的或时间范围"}194195return data196197198def main():199parser = argparse.ArgumentParser()200parser.add_argument("--query", required=True, help="自然语言请求")201parser.add_argument("--platform", default="qq", choices=["qq", "telegram"])202args = parser.parse_args()203204intent_obj = parse_query(args.query)205result = dispatch(intent_obj)206text = render_output(intent_obj, result, platform=args.platform)207print(text)208209210if __name__ == "__main__":211main()212```213214### `router.py`215216```python217from dataclasses import dataclass, field218import re219220221@dataclass222class IntentObj:223intent: str224symbols: list = field(default_factory=list)225timeframe: str = "day"226days: int = 60227top_n: int = 10228date: str = ""229raw_query: str = ""230231232def parse_query(query: str) -> IntentObj:233q = query.strip()234obj = IntentObj(intent="INDEX_REALTIME", raw_query=q)235236# 1) intent237if any(k in q for k in ["K线", "日线", "周线", "月线"]):238obj.intent = "KLINE_ANALYSIS"239elif "分时" in q:240obj.intent = "INTRADAY_ANALYSIS"241elif any(k in q for k in ["涨停", "跌停", "连板"]):242obj.intent = "LIMIT_STATS"243elif "资金" in q:244obj.intent = "MONEY_FLOW"245elif any(k in q for k in ["财务", "财报", "ROE", "毛利率"]):246obj.intent = "FUNDAMENTAL"247elif any(k in q for k in ["融资融券", "龙虎榜"]):248obj.intent = "MARGIN_LHB"249elif any(k in q for k in ["板块", "行业", "概念", "轮动"]):250obj.intent = "SECTOR_ANALYSIS"251elif any(k in q for k in ["期货", "期权"]):252obj.intent = "DERIVATIVES"253elif any(k in q for k in ["基金", "净值", "可转债"]):254obj.intent = "FUND_BOND"255elif any(k in q for k in ["港股", "美股", "纳斯达克", "道琼斯"]):256obj.intent = "HK_US_MARKET"257258# 2) symbol259code_hits = re.findall(r"\b\d{6}\b", q)260if code_hits:261obj.symbols = code_hits262263# 3) topN264m = re.search(r"前\s*(\d+)", q)265if m:266obj.top_n = int(m.group(1))267268return obj269```270271### `adapters/akshare_adapter.py`272273```python274import akshare as ak275276277class AkAdapter:278def index_spot(self):279return ak.stock_zh_index_spot_sina()280281def stock_kline(self, symbol: str, period: str = "daily", start_date: str = "", end_date: str = "", adjust: str = "qfq"):282# 实际参数与函数名按本地 akshare 版本适配283return ak.stock_zh_a_hist(symbol=symbol, period=period, start_date=start_date, end_date=end_date, adjust=adjust)284285def stock_intraday(self, symbol: str, period: str = "1"):286return ak.stock_zh_a_minute(symbol=symbol, period=period)287288def limit_up_pool(self, date: str):289return ak.stock_zt_pool_em(date=date)290291def limit_down_pool(self, date: str):292return ak.stock_dt_pool_em(date=date)293```294295### `formatter.py`296297```python298from datetime import datetime299300301def render_output(intent_obj, result: dict, platform: str = "qq") -> str:302ts = datetime.now().strftime("%Y-%m-%d %H:%M")303304if not result.get("ok", False):305return f"⚠️ 请求失败\n原因: {result.get('error', '未知错误')}\n时间: {ts}"306307title = result.get("title", "A股分析")308lines = result.get("lines", [])309tips = result.get("tips", "")310311# QQ/Telegram 友好输出:短行 + 分段 + 关键数字优先312text = [f"📊 {title}", f"🕒 {ts}", ""]313text.extend(lines[:15])314if tips:315text.extend(["", f"💡 {tips}"])316text.append("\n数据源: akshare")317318# 长度保护319merged = "\n".join(text)320return merged[:1000]321```322323---324325## 输出模板建议(QQ/Telegram)326327建议统一为三段:`结论 -> 关键数据 -> 风险提示`。328329示例:330331```text332📊 A股午盘情绪333🕒 2026-02-18 11:31334335- 上证指数 3210.35(+0.62%)336- 两市成交额 6821 亿,较昨日同期 +8.4%337- 涨停 52 / 跌停 7,连板高度 4338- 主力净流入前三:证券、AI算力、汽车零部件339340💡 结论:指数偏强,情绪修复中;但午后关注高位分歧。341数据源: akshare342```343344---345346## 落地顺序(建议)3473481. 保留现有实时大盘,抽象进 `MarketService.index_realtime()`。3492. 先补齐行情分析四件套:K线/分时/涨跌停/资金流。3503. 再加基本面与板块分析(中频请求,缓存收益高)。3514. 最后接入期货/期权/基金/可转债/港美股。3525. 每个模块都先做“可读文本输出”,再逐步增加指标深度。353354该设计能保证你先快速可用,再逐步增强,不会一次性堆太多接口导致维护困难。355