akshare-stock
50
总安装量
50
周安装量
#7786
全站排名
安装命令
npx skills add https://github.com/molezzz/openclaw-stock-skill --skill akshare-stock
Agent 安装分布
gemini-cli
50
github-copilot
50
codex
50
amp
50
kimi-cli
50
cursor
50
Skill 文档
Aè¡åæå ¨è½ Skillï¼AKShareï¼
ç®æ ï¼å¨ OpenClaw ä¸éè¿èªç¶è¯è¨è§¦å A è¡åç¸å ³å¸åºåæï¼è¾åºéé QQ/Telegram çç´§åææ¬ã
- è¿è¡ç¯å¢ï¼Mac + Python 3.9
- akshare è·¯å¾ï¼
/Users/molezz/Library/Python/3.9/lib/python3.9/site-packages - Skill å
¥å£å»ºè®®ï¼
python3 skills/akshare-stock/main.py --query "${USER_QUERY}"
1) æ´ä½æ¶æè®¾è®¡
éç¨ Router -> Service -> Analyzer -> Formatter åå±ç»æï¼ä¾¿äºæ©å±åç»´æ¤ã
A. ç®å½ç»ç»ï¼å»ºè®®ï¼
skills/akshare-stock/
SKILL.md
main.py # OpenClaw è°ç¨å
¥å£
router.py # æå¾è¯å« + åæ°è§£æ
schemas.py # æ°æ®ç»æå®ä¹ï¼dataclassï¼
formatter.py # QQ/Telegram è¾åºæ¨¡æ¿
services/
market_service.py # 大ç/个è¡è¡æ
ãK线ãåæ¶ãæ¶¨è·åãèµéæµ
fundamental_service.py# è´¢å¡ææ ãè´¢æ¥ãèèµèå¸ãé¾èæ¦
sector_service.py # è¡ä¸/æ¦å¿µæ¿åãè½®å¨ãæ¿åèµéæµ
cross_service.py # æè´§/ææãåºéãå¯è½¬åºã港è¡/ç¾è¡
analyzers/
kline_analyzer.py # åçº¿ãæ¯å¹
ãæ¶¨è·å¹
ã鿝ç
flow_analyzer.py # 主ååæµå
¥ãè¿ç»æ§ã强弱æåº
rotation_analyzer.py # æ¿åè½®å¨å¼ºåº¦ãæç»æ§
adapters/
akshare_adapter.py # å°è£
akshare æ¥å£ï¼é离 API åå
utils/
trading_calendar.py # äº¤ææ¥å¤æ
symbols.py # ææ°/è¡ç¥¨/æ¿åå«åæ å°
cache.py # çç¼åï¼30~120 ç§ï¼
B. æ ¸å¿æµç¨
main.pyæ¥æ¶èªç¶è¯è¨ queryãrouter.pyè¾åºç»æåæå¾ï¼intent + symbols + timeframe + metric + top_nãservices/*æååå§æ°æ®ï¼åªåæ°æ®è·ååè½»æ¸ æ´ï¼ãanalyzers/*åææ 计ç®åç»è®ºçæãformatter.pyæè天平å°å缩è¾åºï¼çå¥ãåæ®µãemojiãéç¹æ°å¼ï¼ã
C. å ³é®è®¾è®¡ç¹
- æå¾ä¼å 级ï¼å è¯å«âä»»å¡ç±»åâï¼åè§£ææ çååæ°ï¼é¿å 误å¤ã
- éé
å±é离ï¼akshare æ¥å£è¥æ¹åï¼åªéæ¹
adapters/akshare_adapter.pyã - 容éåéï¼å®æ¶æ¥å£å¤±è´¥æ¶åéå°æè¿äº¤ææ¥æ°æ®ï¼å¹¶æ 注âé宿¶âã
- ç¼åçç¥ï¼
- 大ç/èµéæµï¼30~60 ç§
- æ¿åæè¡ï¼60~120 ç§
- è´¢æ¥/è´¢å¡ï¼å½å¤©ç¼å
- æ¶æ¯é¿åº¦æ§å¶ï¼åæ¡å»ºè®® <= 1000 å符ï¼è¶ é¿èªå¨æå 2~3 æ¡ã
2) 触åè¯è®¾è®¡ï¼èªç¶è¯è¨è·¯ç±ï¼
建议éç¨âå ³é®è¯ + æ£å + å«åè¯å ¸âæ··åæ¹å¼ã
A. æå¾åç±»ï¼Intentï¼
INDEX_REALTIMEï¼å®æ¶å¤§çKLINE_ANALYSISï¼åå² K 线INTRADAY_ANALYSISï¼åæ¶åæLIMIT_STATSï¼æ¶¨è·åç»è®¡MONEY_FLOWï¼èµéæµåFUNDAMENTALï¼è´¢å¡ææ / è´¢æ¥MARGIN_LHBï¼èèµèå¸ / é¾èæ¦SECTOR_ANALYSISï¼è¡ä¸/æ¦å¿µ/è½®å¨/æ¿åèµéDERIVATIVESï¼æè´§/ææFUND_BONDï¼åºéåå¼ / å¯è½¬åºHK_US_MARKETï¼æ¸¯è¡ / ç¾è¡
B. 触åè¯æ ·ä¾
- 宿¶å¤§çï¼
Aè¡å¤§çä¸è¯ç°å¨å¤å°æ²ªæ·±300宿¶ - K线ï¼
è´µå·è å°è¿60æ¥K线å®å¾·æ¶ä»£å¨çº¿æ¯äºè¿ªæçº¿å¤æ - åæ¶ï¼
çä¸000001åæ¶å¹³å®é¶è¡ä»å¤©åæ¶èµ°å¿ - 涨è·åï¼
仿¥æ¶¨åç»è®¡è·åå®¶æ°è¿æ¿æ¢¯é - èµéæµï¼
主åèµéæµå ¥ååååèµéè¡ä¸èµéåæµå ¥ - åºæ¬é¢ï¼
è å°è´¢å¡ææ å®å¾·æ¶ä»£ææ°å£æ¥ROE忝å©ç - èèµèå¸/é¾èæ¦ï¼
ä¸å ´é讯èèµèå¸ä»æ¥é¾èæ¦ - æ¿åï¼
è¡ä¸æ¿åæ¶¨å¹ æ¦æ¦å¿µè½®å¨AIæ¿åèµéæµ - å
¶ä»å¸åºï¼
IF主åå约300ETFææåºéåå¼å¯è½¬åºè¡æè ¾è®¯æ¸¯è¡è±ä¼è¾¾ç¾è¡
C. åæ°æ½åè§å
- è¡ç¥¨ä»£ç ï¼
\b\d{6}\bï¼å¦600519ï¼ - æ¥æï¼
YYYYMMDD/YYYY-MM-DD/ä»å¤©/æ¨æ¥/è¿Næ¥ - 卿ï¼
1m/5m/15m/30m/60m/day/week/month - æåï¼
åNï¼é»è®¤ 10ï¼ - 夿ï¼
å夿/å夿/ä¸å¤æ
3) ååè½å®ç°æè·¯
ä¸é¢æ¯âåè½ -> æ¨èæ°æ® -> åæè¾åºâçè½å°æ¡æ¶ï¼æ¥å£ä»¥ akshare å½åçæ¬ä¸ºåï¼å®é 以 adapter å±ç»ä¸å°è£ ï¼ã
3.1 宿¶å¤§çè¡æ ï¼å·²æåºç¡çï¼å级ç¹ï¼
- æ°æ®ï¼ä¸è¯ãæ·±ææãå䏿¿ã沪深300ãä¸è¯50ãç§å50ã
- å¢å¼ºï¼å å ¥æäº¤é¢ãæ¯å¹ ã颿¶¨æ¿åãååèµé彿¥åæµå ¥ã
- è¾åºï¼
ææ°ç¹ä½ + 涨è·å¹ + å¸åºæ 绪ä¸å¥è¯ã
3.2 è¡æ åæ
- åå²K线ï¼
- æ°æ®ï¼æ¥/å¨/æ K 线ï¼å¤æå¯éï¼ã
- ææ ï¼è¿ N æ¥æ¶¨è·å¹ ã5/10/20 æ¥å线ãéè½ååãæ³¢å¨çã
- è¾åºï¼è¶å¿å¤æï¼å¤å¤´/éè¡/èµ°å¼±ï¼+ å ³é®ä½ï¼æ¯æ/ååï¼ã
- åæ¶æ°æ®ï¼
- æ°æ®ï¼åéçº§è¡æ ã
- ææ ï¼VWAP å离ãçä¸é«ä½ç¹ãååèµéåæµã
- 涨è·åç»è®¡ï¼
- æ°æ®ï¼æ¶¨åæ± ãè·åæ± ãè¿æ¿æ¢¯éã
- ææ ï¼æ¶¨åå®¶æ°ãç¸æ¿çãæé«è¿æ¿ãæ 绪è¯åã
- èµéæµåï¼
- æ°æ®ï¼ä¸ªè¡/è¡ä¸/å¸åºèµéæµã
- ææ ï¼ä¸»ååæµå ¥ TopNãè¿ç»åæµå ¥å¤©æ°ãèµééä¸åº¦ã
3.3 åºæ¬é¢åæ
- 个è¡è´¢å¡ææ ï¼ROEãæ¯å©çãåå©çãèµäº§è´åºçãç»è¥ç°éæµã
- è´¢æ¥æ°æ®ï¼è¥æ¶åæ¯ãå婿¶¦åæ¯ãæ£éå婿¶¦åæ¯ãEPSã
- èèµèå¸ï¼èèµä½é¢ãèå¸ä½é¢ãæ¥åå¨ï¼è¯å«æ æå好ã
- é¾èæ¦ï¼ä¸æ¦åå ãä¹°ååäºå¸ä½åé¢ãæ¸¸èµæ´»è·åº¦ã
- è¾åºé£æ ¼ï¼
æ ¸å¿ææ æè¦ + 忝/ç¯æ¯ + é£é©æç¤ºã
3.4 æ¿ååæ
- è¡ä¸æ¿å涨è·ï¼è¡ä¸æ¶¨è·å¹ æ¦ãæäº¤é¢ã䏿¶¨å®¶æ°ã
- æ¦å¿µæ¿åè½®å¨ï¼è¿ 5 æ¥å¼ºåº¦ãæç»æ§ãæ¥å 忢é度ã
- æ¿åèµéæµåï¼è¡ä¸/æ¦å¿µåæµå ¥æè¡ + 颿¶¨é¾å¤´ã
- è¾åºï¼
å¼ºå¿æ¿åTop3 + è½®å¨ç»è®º + 次æ¥è§å¯ç¹ã
3.5 å ¶ä»ï¼è·¨å¸åºï¼
- æè´§/ææï¼ä¸»ååçº¦ä»·æ ¼ãæ¶¨è·ãæä»ååï¼ææ PCRï¼è¥å¯å¾ï¼ã
- åºéåå¼ï¼å¼æ¾å¼åºéåå¼ãä¼°å¼å离ãè¿ä¸å¨æ¶çã
- å¯è½¬åºï¼ä»·æ ¼ã溢价çãæ£è¡èå¨ãæäº¤é¢ã
- 港è¡/ç¾è¡ï¼å®æ¶è¡æ ãè¿5æ¥è¡¨ç°ãä¸Aè¡èå¨æç¤ºã
4) 代ç ç¤ºä¾æ¡æ¶ï¼éª¨æ¶ï¼
说æï¼ä»¥ä¸ä¸ºå¯ç´æ¥è½å°çæå°æ¡æ¶ï¼ä¸å«å®æ´ä¸å¡ç»èã
main.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
from router import parse_query
from services.market_service import MarketService
from services.fundamental_service import FundamentalService
from services.sector_service import SectorService
from services.cross_service import CrossService
from formatter import render_output
def dispatch(intent_obj):
intent = intent_obj.intent
if intent in {"INDEX_REALTIME", "KLINE_ANALYSIS", "INTRADAY_ANALYSIS", "LIMIT_STATS", "MONEY_FLOW"}:
data = MarketService().handle(intent_obj)
elif intent in {"FUNDAMENTAL", "MARGIN_LHB"}:
data = FundamentalService().handle(intent_obj)
elif intent == "SECTOR_ANALYSIS":
data = SectorService().handle(intent_obj)
elif intent in {"DERIVATIVES", "FUND_BOND", "HK_US_MARKET"}:
data = CrossService().handle(intent_obj)
else:
data = {"ok": False, "error": "æªè¯å«è¯·æ±ï¼è¯·è¡¥å
æ çææ¶é´èå´"}
return data
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--query", required=True, help="èªç¶è¯è¨è¯·æ±")
parser.add_argument("--platform", default="qq", choices=["qq", "telegram"])
args = parser.parse_args()
intent_obj = parse_query(args.query)
result = dispatch(intent_obj)
text = render_output(intent_obj, result, platform=args.platform)
print(text)
if __name__ == "__main__":
main()
router.py
from dataclasses import dataclass, field
import re
@dataclass
class IntentObj:
intent: str
symbols: list = field(default_factory=list)
timeframe: str = "day"
days: int = 60
top_n: int = 10
date: str = ""
raw_query: str = ""
def parse_query(query: str) -> IntentObj:
q = query.strip()
obj = IntentObj(intent="INDEX_REALTIME", raw_query=q)
# 1) intent
if any(k in q for k in ["K线", "æ¥çº¿", "å¨çº¿", "æçº¿"]):
obj.intent = "KLINE_ANALYSIS"
elif "åæ¶" in q:
obj.intent = "INTRADAY_ANALYSIS"
elif any(k in q for k in ["涨å", "è·å", "è¿æ¿"]):
obj.intent = "LIMIT_STATS"
elif "èµé" in q:
obj.intent = "MONEY_FLOW"
elif any(k in q for k in ["è´¢å¡", "è´¢æ¥", "ROE", "æ¯å©ç"]):
obj.intent = "FUNDAMENTAL"
elif any(k in q for k in ["èèµèå¸", "é¾èæ¦"]):
obj.intent = "MARGIN_LHB"
elif any(k in q for k in ["æ¿å", "è¡ä¸", "æ¦å¿µ", "è½®å¨"]):
obj.intent = "SECTOR_ANALYSIS"
elif any(k in q for k in ["æè´§", "ææ"]):
obj.intent = "DERIVATIVES"
elif any(k in q for k in ["åºé", "åå¼", "å¯è½¬åº"]):
obj.intent = "FUND_BOND"
elif any(k in q for k in ["港è¡", "ç¾è¡", "纳æ¯è¾¾å
", "éç¼æ¯"]):
obj.intent = "HK_US_MARKET"
# 2) symbol
code_hits = re.findall(r"\b\d{6}\b", q)
if code_hits:
obj.symbols = code_hits
# 3) topN
m = re.search(r"å\s*(\d+)", q)
if m:
obj.top_n = int(m.group(1))
return obj
adapters/akshare_adapter.py
import akshare as ak
class AkAdapter:
def index_spot(self):
return ak.stock_zh_index_spot_sina()
def stock_kline(self, symbol: str, period: str = "daily", start_date: str = "", end_date: str = "", adjust: str = "qfq"):
# å®é
åæ°ä¸å½æ°åææ¬å° akshare çæ¬éé
return ak.stock_zh_a_hist(symbol=symbol, period=period, start_date=start_date, end_date=end_date, adjust=adjust)
def stock_intraday(self, symbol: str, period: str = "1"):
return ak.stock_zh_a_minute(symbol=symbol, period=period)
def limit_up_pool(self, date: str):
return ak.stock_zt_pool_em(date=date)
def limit_down_pool(self, date: str):
return ak.stock_dt_pool_em(date=date)
formatter.py
from datetime import datetime
def render_output(intent_obj, result: dict, platform: str = "qq") -> str:
ts = datetime.now().strftime("%Y-%m-%d %H:%M")
if not result.get("ok", False):
return f"â ï¸ è¯·æ±å¤±è´¥\nåå : {result.get('error', 'æªç¥é误')}\næ¶é´: {ts}"
title = result.get("title", "Aè¡åæ")
lines = result.get("lines", [])
tips = result.get("tips", "")
# QQ/Telegram å好è¾åºï¼çè¡ + åæ®µ + å
³é®æ°åä¼å
text = [f"ð {title}", f"ð {ts}", ""]
text.extend(lines[:15])
if tips:
text.extend(["", f"ð¡ {tips}"])
text.append("\næ°æ®æº: akshare")
# é¿åº¦ä¿æ¤
merged = "\n".join(text)
return merged[:1000]
è¾åºæ¨¡æ¿å»ºè®®ï¼QQ/Telegramï¼
建议ç»ä¸ä¸ºä¸æ®µï¼ç»è®º -> å
³é®æ°æ® -> é£é©æç¤ºã
示ä¾ï¼
ð Aè¡åçæ
绪
ð 2026-02-18 11:31
- ä¸è¯ææ° 3210.35ï¼+0.62%ï¼
- ä¸¤å¸æäº¤é¢ 6821 亿ï¼è¾æ¨æ¥åæ +8.4%
- 涨å 52 / è·å 7ï¼è¿æ¿é«åº¦ 4
- 主ååæµå
¥åä¸ï¼è¯å¸ãAIç®åãæ±½è½¦é¶é¨ä»¶
ð¡ ç»è®ºï¼ææ°åå¼ºï¼æ
绪修å¤ä¸ï¼ä½ååå
³æ³¨é«ä½åæ§ã
æ°æ®æº: akshare
è½å°é¡ºåºï¼å»ºè®®ï¼
- ä¿çç°æå®æ¶å¤§çï¼æ½è±¡è¿
MarketService.index_realtime()ã - å è¡¥é½è¡æ åæåä»¶å¥ï¼K线/åæ¶/涨è·å/èµéæµã
- åå åºæ¬é¢ä¸æ¿ååæï¼ä¸é¢è¯·æ±ï¼ç¼åæ¶çé«ï¼ã
- æåæ¥å ¥æè´§/ææ/åºé/å¯è½¬åº/港ç¾è¡ã
- æ¯ä¸ªæ¨¡åé½å åâå¯è¯»ææ¬è¾åºâï¼å鿥å¢å ææ æ·±åº¦ã
该设计è½ä¿è¯ä½ å å¿«éå¯ç¨ï¼å鿥å¢å¼ºï¼ä¸ä¼ä¸æ¬¡æ§å å¤ªå¤æ¥å£å¯¼è´ç»´æ¤å°é¾ã