{"id":"25c3d449-82eb-4d2d-9e2e-8fabe59c5800","entityType":"agent","slug":"clawhub-zoy168-astock-unified-financial","name":"A股金融数据整合技能","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zoy168-astock-unified-financial","canonicalPath":"/agent/clawhub-zoy168-astock-unified-financial","generatedAt":"2026-10-14T06:55:09.595Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":null},"description":"A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Skill: A股金融数据整合技能 Owner: zoy168 Summary: A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Tags: A-share:2.0.0, R&D-expenses:2.0.0, akshare:2.0.0, baostock:2.0.0, china-stocks:2.0.0, financial-data:2.0.0, latest:2.0.0 Version history: v2.0.0 | 2026-05-18T15:50:19.500Z | auto astock-unified-financial 2.0.0 - Major u","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 979 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1738eactqcjggb0mpvf7hj30n86yrbr:astock-unified-financial","sourceUrl":"https://clawhub.ai/zoy168/astock-unified-financial","homepage":"https://clawhub.ai/zoy168/skills/astock-unified-financial","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zoy168/astock-unified-financial","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/zoy168/skills/astock-unified-financial","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Skill:"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":null},"stars":null,"forks":null,"downloads":979,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"2.0.0","tractionLabel":"979 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:08:34.235Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:08:34.247Z","lastCrawledAt":"2026-10-11T23:08:34.235Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:08:34.235Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.0","createdAt":"2026-05-18T15:50:19.500Z","changelog":"astock-unified-financial 2.0.0 - Major upgrade: Unified all A股行情与财务数据最佳实践、踩坑记录与常见需求为一体的终极整合指南 - 融合 Baostock 与 Akshare 两大数据源，新增对数据源选择、降级链、单位/代码格式处理、缓存与错误降级等内容的系统梳理 - 专项补充：研发费用精确查询与多级降级、公司注册属地获取、分红场景对照等关键场景 - 明确了各主流数据源的能力矩阵与优先级、常见接口踩坑及字段单位转换对策 - 提供最佳实践模板、核心工具函数与完整降级策略，支持一站式查阅和代码落地","fileCount":3,"zipByteSize":15087}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1738eactqcjggb0mpvf7hj30n86yrbr:astock-unified-financial","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-14T06:55:09.595Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zoy168-astock-unified-financial/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":null},"readme":"Skill: A股金融数据整合技能\n\nOwner: zoy168\n\nSummary: A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。\n\nTags: A-share:2.0.0, R&D-expenses:2.0.0, akshare:2.0.0, baostock:2.0.0, china-stocks:2.0.0, financial-data:2.0.0, latest:2.0.0\n\nVersion history:\n\nv2.0.0 | 2026-05-18T15:50:19.500Z | auto\n\nastock-unified-financial 2.0.0\n\n- Major upgrade: Unified all A股行情与财务数据最佳实践、踩坑记录与常见需求为一体的终极整合指南\n- 融合 Baostock 与 Akshare 两大数据源，新增对数据源选择、降级链、单位/代码格式处理、缓存与错误降级等内容的系统梳理\n- 专项补充：研发费用精确查询与多级降级、公司注册属地获取、分红场景对照等关键场景\n- 明确了各主流数据源的能力矩阵与优先级、常见接口踩坑及字段单位转换对策\n- 提供最佳实践模板、核心工具函数与完整降级策略，支持一站式查阅和代码落地\n\nArchive index:\n\nArchive v2.0.0: 3 files, 15087 bytes\n\nFiles: _meta.json (143b), skill-card.md (2352b), SKILL.md (40952b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: astock-unified-financial\nversion: 2.0\ndescription: >\n  A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、\n  已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、\n  公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。\n  本技能将分散在多个文档中的经验融合为一份自包含的完整指南。\nagent_created: true\ntags: [akshare, baostock, A股, 财务数据, 行情数据, 研发费用, 单位转换, 踩坑经验, 降级策略]\n---\n\n# A股金融数据整合技能（终极版）\n\n> **融合自**: astock-financial-data-guide / akshare-financial-data-traps / A股行情与财务数据读取经验手册  \n> **最后融合日期**: 2026-05-18\n\n---\n\n## 目录\n\n1. [数据源总览与选择策略](#1-数据源总览与选择策略)\n2. [推荐数据源组合 & 降级链](#2-推荐数据源组合--降级链)\n3. [登录模式对照](#3-登录模式对照)\n4. [Baostock 接口详解](#4-baostock-接口详解)\n5. [Akshare 接口详解](#5-akshare-接口详解)\n6. [废弃/不可用接口一览](#6-废弃不可用接口一览)\n7. [研发费用查询专项指南](#7-研发费用查询专项指南)\n8. [公司注册属地查询](#8-公司注册属地查询)\n9. [股票代码格式处理](#9-股票代码格式处理)\n10. [核心工具函数](#10-核心工具函数)\n11. [单位转换速查](#11-单位转换速查)\n12. [缓存策略](#12-缓存策略)\n13. [错误处理与重试](#13-错误处理与重试)\n14. [数据源降级策略](#14-数据源降级策略)\n15. [最佳实践模板](#15-最佳实践模板)\n16. [完整踩坑记录](#16-完整踩坑记录)\n17. [附录：各接口列名速查](#17-附录各接口列名速查)\n\n---\n\n## 1. 数据源总览与选择策略\n\n### 1.1 数据源对比\n\n| 数据源 | 类型 | 行情 | 财报 | 分红 | 行业 | 优势 | 劣势 | 是否需要API Key |\n|--------|------|------|------|------|------|------|------|----------------|\n| **Baostock** | 证券宝 | ✅日/60分K线 | ✅五大季报 | ✅ | ✅ | 稳定、免费、无需Key、数据规范 | 字段单位需确认、登录/登出模式 | ❌ |\n| **Akshare-同花顺** | Akshare | ❌ | ✅摘要/现金流/利润表 | ✅巨潮 | ❌ | 数据最全、带单位标注 | 列名可能随版本变 | ❌ |\n| **Akshare-新浪** | Akshare | ❌ | ✅财务指标/利润表 | ❌ | ❌ | 覆盖面广、研发费数据完整 | 单位不确定(元/万元)、列名含(%)需判断 | ❌ |\n| **Akshare-东方财富** | Akshare | ✅历史行情 | ✅个股信息 | ❌ | ✅ | 行情+基本面一体 | **服务器无法访问**⚠️ | ❌ |\n| **Tushare** | 第三方 | ✅ | ✅ | ✅ | ✅ | 数据全面、质量高 | **需积分+API Key** | ✅ |\n| **通达信** | 本地 | ✅ | ❌ | ❌ | ❌ | 速度极快(本地读取) | 仅行情、需安装通达信 | ❌ |\n\n### 1.2 数据源能力速查矩阵\n\n| 功能场景 | 推荐数据源(优先级) | 备注 |\n|---------|-------------------|------|\n| K线行情 | Baostock(主) → 东方财富(备) → 通达信(备) | Baostock稳定免费 |\n| 财务摘要 | 同花顺财务摘要(主) → 新浪财务指标(备) | 同花顺带单位标注 |\n| 利润表(含研发费) | 同花顺利润表(主) → 新浪利润表(备) | 同花顺带单位，新浪纯数字(元) |\n| 研发费用 | 同花顺利润表(主) → 新浪利润表(备) → 四级降级策略 | ⚠️见第7章 |\n| 分红数据 | 巨潮分红(主) → Baostock(备) | 巨潮\"每10股\"，Baostock\"元/股\" |\n| 行业分类 | Baostock(主) → 东方财富(备,可能不可达) | Baostock含industry和province |\n| 公司注册属地 | 巨潮公司概况(主) | `stock_profile_cninfo` |\n| 实时行情 | 东方财富全市场实时行情(备) | 新浪实时行情替代方案 |\n| 技术指标计算 | Baostock K线 + Numba加速 | 数据量大时用磁盘缓存 |\n\n### 1.3 踩坑优先级通道\n\n```\nLevel 1: 同花顺数据源(首选)  → parse_amount/parse_percent\nLevel 2: 新浪数据源(备用)    → safe_float + ÷1亿调单位\nLevel 3: Baostock(兜底)      → safe_float + convert_share\nLevel 4: 东方财富(降级)      → ⚠️当前服务器不可达\n```\n\n---\n\n## 2. 推荐数据源组合 & 降级链\n\n### 2.1 主力推荐组合\n\n```\n主力:      Akshare(同花顺/新浪) + Baostock(补充)\n行情:      Baostock K线 (稳定可靠)\n财报:      Akshare同花顺(主) → 新浪(备) → Baostock(兜底)\n研发费:    同花顺利润表(主) → 新浪利润表(备) → 四级降级\n分红:      Akshare巨潮(主) → Baostock(备)\n行业:      Baostock query_stock_industry\n注册属地:  巨潮 stock_profile_cninfo\n```\n\n### 2.2 降级链速查\n\n| 目标数据 | 降级链 |\n|---------|--------|\n| 研发费用 | 同花顺利润表\"研发费用\" → 新浪利润表\"研发费用\" → 同花顺备用列名 → 新浪备用列名 |\n| 净利润 | 同花顺利润表 → 新浪利润表 → Baostock profit |\n| 营收 | 同花顺利润表 → 新浪利润表 → Baostock profit |\n| 分红 | 巨潮分红 → Baostock dividend |\n| 行业 | Baostock industry → 东方财富(可能不可达) |\n| 注册地 | 巨潮 profile_cninfo → (无备用) |\n\n---\n\n## 3. 登录模式对照\n\n| 数据源 | 登录方式 | 生命周期 |\n|--------|---------|---------|\n| Baostock | `bs.login()` / `bs.logout()` | 需显式管理, 查询前必须登录 |\n| Akshare | 无需登录 | 直接调用 |\n| Tushare | `ts.pro_api('your_token')` | Token一次性设置 |\n\n**Baostock登录建议**: 在程序入口登录, 程序出口登出, 中间复用连接。换股时无需登出, 仅在切换完全不同股票或退出时登出。\n\n---\n\n## 4. Baostock 接口详解\n\n### 4.1 登录/登出\n\n```python\nimport baostock as bs\n\n# 登录\nlg = bs.login()\nif lg.error_code != '0':\n    print(f\"登录失败: {lg.error_msg}\")\n\n# 登出\nbs.logout()\n\n# ⚠️: 查询前必须登录, 查询后无需立即登出(可复用连接)\n```\n\n### 4.2 K线数据\n\n```python\n# 日线\nrs = bs.query_history_k_data_plus(\n    code=\"sh.600000\",        # baostock格式: sh.600000 / sz.000001 / bj.430047\n    fields=\"date,close,open,high,low,volume,amount,turn\",\n    start_date=\"2025-01-01\",\n    end_date=\"2025-12-31\",\n    frequency=\"d\",           # d=日线, w=周线, m=月线\n    adjustflag=\"3\"           # 1=后复权, 2=前复权, 3=不复权\n)\n\n# 60分钟线\nrs = bs.query_history_k_data_plus(\n    code=\"sh.600000\",\n    fields=\"date,time,close,open,high,low,volume,amount\",\n    start_date=\"2025-01-01\",\n    end_date=\"2025-12-31\",\n    frequency=\"60\",          # 5/15/30/60分钟\n    adjustflag=\"3\"\n)\n\n# 遍历结果\ndef bs_query_to_df(rs):\n    \"\"\"将baostock ResultData转为DataFrame\"\"\"\n    rows = []\n    while (rs.error_code == '0') and rs.next():\n        rows.append(rs.get_row_data())\n    if not rows:\n        return None\n    import pandas as pd\n    return pd.DataFrame(rows, columns=rs.fields)\n```\n\n**⚠️ 踩坑**:\n- K线返回的 close/volume 等字段都是**字符串类型**, 需手动转float\n- 60分钟线需 `fields` 含 `time` 字段\n- `adjustflag=\"3\"` 不复权时, 价格为原始价格\n\n### 4.3 财务数据(五大季报)\n\n```python\n# 盈利数据\nrs = bs.query_profit_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: totalShare, liqaShare, epsTTM, gpMargin, netProfit, roeAvg, roeDiluted\n\n# 成长数据\nrs = bs.query_growth_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: YOYEquity, YOYAsset, YOYNI, YOYEPSBasic, YOYPNI, YOYOR, YOYGR\n\n# 运营数据\nrs = bs.query_operation_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: NetProfitGrowRate, OperatingProfitGrowRate, TotalRevenueGrowRate\n\n# 现金流数据\nrs = bs.query_cash_flow_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: CAToAsset, NCAToAsset, CFOToOR\n\n# 资产负债数据\nrs = bs.query_balance_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: totalAssets, totalLiab, totalEquity, currentAssets, currentLiab\n```\n\n**⚠️ 踩坑**:\n- **totalShare单位不确定**: 实测某些版本返回\"万股\"而非\"股\", 用 `convert_share()` 自动检测\n- **所有比率字段都是小数形式**, 需×100转百分比显示\n- **quarter参数**: 1-4对应Q1-Q4, 年报为Q4\n- **空字符串/None**: 字段可能返回空字符串''或None, 需用 `safe_float()` 统一处理\n- **这些函数不接受yearType参数**\n- **totalShare无province/area/city/region字段** — 不能用于查注册属地\n\n### 4.4 分红数据\n\n```python\nrs = bs.query_dividend_data(\n    code=\"sh.600000\",\n    year=2024,\n    yearType=\"report\"    # \"report\"=按报告期, \"operate\"=按运营期\n)\n# 关键字段: dividCashPsBeforeTax(元/股), dividPreistNoTax(每10股送股), dividAistNoTax(每10股转增)\n```\n\n### 4.5 行业/基本信息\n\n```python\n# 行业分类\nrs = bs.query_stock_industry(code=\"sh.600000\")\n# 字段: industry, industryClassification, province(省份)\n\n# 注意: baostock的province字段只存在于query_stock_basic中？\n# 实测: query_stock_industry返回字段: updateDate, code, code_name, industry, industryClassification\n# 并没有province字段！注册属地请用巨潮profile_cninfo\n\n# 股票基本信息\nrs = bs.query_stock_basic(code=\"sh.600000\")\n# 字段: code, code_name, ipoDate, outDate, type, status\n\n# 交易日查询\nrs = bs.query_trade_dates(start_date=\"2025-01-01\", end_date=\"2025-12-31\")\n\n# 全部股票列表\nrs = bs.query_all_stock(day=\"2025-05-12\")\n```\n\n### 4.6 Baostock 字段速查\n\n**盈利数据(query_profit_data)**:\n\n| 字段 | 含义 | 单位 | 转换 |\n|------|------|------|------|\n| totalShare | 总股本 | 股⚠️ | `convert_share()` → 亿股 |\n| liqaShare | 流通股本 | 股⚠️ | `convert_share()` → 亿股 |\n| epsTTM | 每股收益TTM | 元/股 | 直接使用 |\n| gpMargin | 毛利率 | 小数 | ×100→% |\n| netProfit | 净利润 | 元 | ÷1亿→亿元 |\n| roeAvg | 平均ROE | 小数 | ×100→% |\n| roeDiluted | 稀释ROE | 小数 | ×100→% |\n| operatingRevenue | 营业收入 | 元 | ÷1亿→亿元 |\n\n**成长数据(query_growth_data)**:\n\n| 字段 | 含义 | 单位 | 转换 |\n|------|------|------|------|\n| YOYEquity | 净资产同比增长率 | 小数 | ×100→% |\n| YOYAsset | 总资产同比增长率 | 小数 | ×100→% |\n| YOYNI | 净利润同比增长率 | 小数 | ×100→% |\n| YOYPNI | 归母净利润同比增长率 | 小数 | ×100→% |\n| YOYOR | 营业收入同比增长率 | 小数 | ×100→% |\n| YOYGR | 营业总收入同比增长率 | 小数 | ×100→% |\n\n**分红数据(query_dividend_data)**:\n\n| 字段 | 含义 | 单位 |\n|------|------|------|\n| dividCashPsBeforeTax | 税前每股现金分红 | 元/股 |\n| dividPreistNoTax | 每10股送股数 | 股 |\n| dividAistNoTax | 每10股转增股数 | 股 |\n\n---\n\n## 5. Akshare 接口详解\n\n### 5.1 同花顺财务摘要 (`stock_financial_abstract_ths`)\n\n```python\nimport akshare as ak\n\n# 按年度\ndf = ak.stock_financial_abstract_ths(symbol=\"600000\", indicator=\"按年度\")\n# 按单季度\ndf = ak.stock_financial_abstract_ths(symbol=\"600000\", indicator=\"按单季度\")\n```\n\n**⚠️ 踩坑**:\n- 金额列带单位: 如 \"1483.91亿\"、\"4.82万亿\"、\"3391.23万\", 需用 `parse_amount()` 解析\n- 比率列带%号: 如 \"6.22%\", 需用 `parse_percent()` 解析\n- 返回DataFrame最新行在**最后**, 遍历时注意顺序\n- 列名可能因akshare版本更新而变化\n- **⚠️ 此接口没有\"研发费用\"列!** 研发费需从利润表获取\n\n### 5.2 同花顺现金流量表 (`stock_financial_cash_ths`)\n\n```python\ndf = ak.stock_financial_cash_ths(symbol=\"600000\", indicator=\"按年度\")\n```\n\n**⚠️ 踩坑**:\n- 列名极长且包含标点符号, 硬编码容易出错\n- 同一列名在不同akshare版本中可能有细微差异(空格/标点)\n\n### 5.3 同花顺利润表 (`stock_financial_benefit_ths`) ✅含研发费\n\n```python\ndf = ak.stock_financial_benefit_ths(symbol=\"600000\", indicator=\"按年度\")\n# ⚠️ 注意: 接口名是 stock_financial_benefit_ths, 不是 stock_profit_sheet_ths(已废弃)\n```\n\n**⚠️ 踩坑**:\n- 金额列带单位: 如 \"1.90亿\"、\"227.55亿\"、\"6192.32万\", 需用 `parse_amount` 解析\n- **研发费用列在此接口有!** 列名固定为 `\"研发费用\"`\n- 2017年以前的数据研发费列值可能为 `False`(布尔值), 表示该年度未单独披露\n- 报告期格式: \"2025\"(纯年份), 匹配用 `str(year) in rp`\n- 列名可能为: \"研发费用\"/\"研究开发费用\"/\"研究与开发费用\", 需多列名尝试\n\n### 5.4 新浪利润表 (`stock_financial_report_sina` symbol=\"利润表\") ✅含研发费\n\n```python\ndf = ak.stock_financial_report_sina(stock=\"000063\", symbol=\"利润表\")\n```\n\n**⚠️ 踩坑**:\n- **金额列单位为\"元\"**, 是纯数字(float), 如 `22754978000.0`, 需÷1亿转亿元\n- 报告日格式: `\"20251231\"`, 匹配年报用 `f\"{year}1231\" in rp`\n- 该接口同时返回季报和年报数据, 按报告日筛选即可\n- **研发费用列在此接口有!** 列名固定为 `\"研发费用\"`\n- 数据非常完整, 2017年以前的研发费也有(同花顺利润表可能返回False)\n\n### 5.5 新浪财务指标 (`stock_financial_analysis_indicator`)\n\n```python\ndf = ak.stock_financial_analysis_indicator(symbol=\"600000\", start_year=\"2022\")\n# 按日期索引, 每行一个报告期\n```\n\n**⚠️ 踩坑**:\n- **列名含(%)的毛利率列**: 返回值可能是百分比(如92.15)也可能是小数(如0.92), 需用 `convert_sina_percent()` 或 `abs(f) < 2` 判断\n- **列名含(元)的金额列**: 实际单位可能是\"元\"也可能是\"万元\", 不确定! 优先用 `parse_amount` 处理, `parse_amount` 返回 None 时按\"元\"÷1亿\n- 新浪数据通过日期索引访问: `df.loc[f\"{year}-12-31\"]`\n- **❌ 此接口没有\"研发费用\"列!** 研发费需从利润表获取\n\n### 5.6 巨潮分红数据 (`stock_dividend_cninfo`)\n\n```python\ndf = ak.stock_dividend_cninfo(symbol=\"600000\")\n# 关键列: 报告时间, 派息比例(每10股派息额)\n# 报告时间格式: \"2024年年报\"\n```\n\n**⚠️ 踩坑**:\n- 派息比例是\"每10股\"的金额, 需÷10转为每股分红\n- 匹配年报: `f'{year}年报' in str(row['报告时间'])`\n\n### 5.7 东方财富个股信息 (`stock_individual_info_em` ⚠️服务器不可达)\n\n```python\n# ⚠️ 以下接口从当前服务器无法访问, 仅作降级参考\ndf = ak.stock_individual_info_em(symbol=\"600000\")     # 个股基本信息\ndf = ak.stock_zh_a_hist(symbol=\"600000\", period=\"daily\",\n                         start_date=\"20250101\", end_date=\"20251231\")  # 历史行情\n```\n\n### 5.8 巨潮公司概况 (`stock_profile_cninfo`) ✅推荐用于注册地\n\n```python\ndf = ak.stock_profile_cninfo(symbol=\"600519\")\n# 含\"注册地址\"列, 值为完整地址如\"贵州省仁怀市茅台镇\"\n```\n\n### 5.9 新浪实时行情 (`stock_zh_a_spot_em` 替代方案)\n\n```python\ndf = ak.stock_zh_a_spot_em()  # 全市场实时行情\n```\n\n### 5.10 Akshare 安全调用封装\n\n```python\ndef ak_safe_call(fn, *args, default=None, **kwargs):\n    \"\"\"安全调用akshare接口\"\"\"\n    try:\n        result = fn(*args, **kwargs)\n        if result is None or (hasattr(result, 'empty') and result.empty):\n            return default\n        return result\n    except Exception as e:\n        print(f\"  [AK] 接口异常: {e}\")\n        return default\n```\n\n---\n\n## 6. 废弃/不可用接口一览\n\n> ⚠️ **直接从历史踩坑中整理, 不要再用**\n\n| 接口名 | 状态 | 替代方案 |\n|--------|------|---------|\n| `stock_profit_sheet_ths` | ❌ 已废弃(不存在) | `stock_financial_benefit_ths` |\n| `stock_financial_abstract_ths` | ❌ 无研发费列 | `stock_financial_benefit_ths` |\n| `stock_financial_analysis_indicator` | ❌ 无研发费列 | `stock_financial_report_sina` |\n| `stock_individual_info_em` | ❌ 服务器不可达(2026.05) | `stock_profile_cninfo` |\n| `stock_info_sz_name_code(indicator=...)` | ❌ 不接受indicator参数 | 不使用 |\n\n### 接口名易混提醒\n\n| 易混淆名 | 正确名 |\n|---------|--------|\n| ❌ `stock_profit_sheet_ths` | ✅ `stock_financial_benefit_ths` |\n| — | ✅ `stock_financial_report_sina(stock=\"000063\", symbol=\"利润表\")` |\n\n---\n\n## 7. 研发费用查询专项指南\n\n### 7.1 正确查询路径\n\n```\n研发费用查询只能从利润表获取\n❌ 财务摘要(stock_financial_abstract_ths)  → 无研发费列\n❌ 新浪财务指标(stock_financial_analysis_indicator) → 无研发费列\n✅ 同花顺利润表(stock_financial_benefit_ths) → 有\"研发费用\"列\n✅ 新浪利润表(stock_financial_report_sina symbol=\"利润表\") → 有\"研发费用\"列\n```\n\n### 7.2 四级降级策略\n\n```\nLevel 1: 同花顺利润表 → \"研发费用\"列(首选)\nLevel 2: 新浪利润表   → \"研发费用\"列\nLevel 3: 同花顺利润表 → 备用列名(\"研究开发费用\"/\"研究与开发费用\")\nLevel 4: 新浪利润表   → 备用列名(如列名有变化)\n```\n\n### 7.3 同花顺利润表获取研发费\n\n```python\ndf = ak.stock_financial_benefit_ths(symbol=\"000063\", indicator=\"按年度\")\nfor _, row in df.iterrows():\n    rp = str(row.get('报告期', ''))\n    if '2025' in rp:\n        rd = row.get('研发费用', '')  # 返回如 \"227.55亿\"\n        if rd is not False:          # 早期年份可能为False\n            p = parse_amount(rd)     # → 227.55 (亿元)\n        break\n```\n\n### 7.4 新浪利润表获取研发费\n\n```python\ndf = ak.stock_financial_report_sina(stock=\"000063\", symbol=\"利润表\")\nfor _, row in df.iterrows():\n    rp = str(row.get('报告日', ''))\n    if '20251231' in rp:\n        raw_val = row.get('研发费用', '')  # 返回纯数字如 22754978000.0\n        f = safe_float(raw_val)\n        rd_yi = f / 100000000               # → 227.55 亿元\n        break\n```\n\n### 7.5 研发费用完整容错代码\n\n```python\ndef get_rd_expense(pure_code, year):\n    \"\"\"获取指定股票指定年度的研发费用(亿元)\n    降级链: 同花顺利润表 → 新浪利润表\n    \"\"\"\n    # Level 1: 同花顺利润表\n    df = ak_safe_call(ak.stock_financial_benefit_ths, symbol=pure_code, indicator=\"按年度\")\n    if df is not None:\n        rd_cols = ['研发费用', '研究开发费用', '研究与开发费用']\n        for _, row in df.iterrows():\n            if str(year) in str(row.get('报告期', '')):\n                for col in rd_cols:\n                    val = row.get(col)\n                    if val is not False and val is not None:\n                        p = parse_amount(val)\n                        if p is not None:\n                            return p\n    # Level 2: 新浪利润表\n    df = ak_safe_call(ak.stock_financial_report_sina, stock=pure_code, symbol=\"利润表\")\n    if df is not None:\n        target = f\"{year}1231\"\n        for _, row in df.iterrows():\n            if target in str(row.get('报告日', '')):\n                val = row.get('研发费用')\n                f = safe_float(val)\n                if f != NO_DATA:\n                    return f / 100000000\n    return NO_DATA\n```\n\n### 7.6 验证数据\n\n| 股票 | 同花顺利润表 | 新浪利润表 | 一致性 |\n|------|------------|-----------|--------|\n| 中兴通讯000063 | 227.55亿 | 227.55亿 | ✅ |\n| 茅台600519 | 1.90亿 | 1.90亿 | ✅ |\n\n---\n\n## 8. 公司注册属地查询\n\n### 8.1 正确查询方法\n\n```python\nimport akshare as ak\nimport re\n\n# 巨潮公司概况(首选, 唯一可靠来源)\ndf = ak.stock_profile_cninfo(symbol=\"600519\")\n# 含\"注册地址\"列, 值为完整地址如\"贵州省仁怀市茅台镇\"\n\n# ⚠️ baostock的query_stock_industry无province字段!\n# 不要用baostock查注册属地\n```\n\n### 8.2 省份提取函数\n\n```python\ndef extract_province(addr):\n    \"\"\"从完整注册地址提取省份\"\"\"\n    if not addr:\n        return ''\n    # 直辖市\n    for city in ['北京', '上海', '天津', '重庆']:\n        if city in addr:\n            return city + '市'\n    # 省/自治区/特别行政区\n    m = re.search(r'([\\u4e00-\\u9fa5]+省|[\\u4e00-\\u9fa5]+自治区|[\\u4e00-\\u9fa5]+特别行政区)', addr)\n    if m:\n        return m.group(1)\n    return addr\n```\n\n### 8.3 验证数据\n\n| 股票 | 巨潮注册地址 | 提取省份 |\n|------|------------|---------|\n| 茅台600519 | 贵州省仁怀市茅台镇 | 贵州省 ✅ |\n| 中兴通讯000063 | 广东省深圳市南山区 | 广东省 ✅ |\n| 宁德时代300750 | 福建省宁德市 | 福建省 ✅ |\n| 隆基绿能601012 | 陕西省西安市 | 陕西省 ✅ |\n| 平安银行000001 | 广东省深圳市 | 广东省 ✅ |\n\n---\n\n## 9. 股票代码格式处理\n\n### 9.1 格式对照\n\n| 格式 | 示例 | 使用场景 |\n|------|------|---------|\n| 纯代码 | `600000` | 用户输入、akshare接口 |\n| Baostock格式 | `sh.600000` / `sz.000001` / `bj.430047` | baostock全部接口 |\n| 东方财富格式 | `600000` (纯代码) | akshare东方财富接口 |\n| Tushare格式 | `600000.SH` | tushare接口 |\n\n### 9.2 市场前缀规则\n\n| 开头数字 | 市场 | Baostock前缀 | Tushare后缀 | 说明 |\n|---------|------|-------------|------------|------|\n| 6, 9 | 上海证券交易所 | sh. | .SH | 9开头为科创板 |\n| 0, 3 | 深圳证券交易所 | sz. | .SZ | 3开头为创业板 |\n| 8, 4 | 北京证券交易所 | bj. | .BJ | 北交所 |\n\n### 9.3 代码识别与转换\n\n```python\ndef normalize_stock_code(raw):\n    \"\"\"统一识别股票代码, 返回 (baostock格式, 纯代码)\n    支持输入: 600000 / sh.600000 / SH600000 / 430047 / bj.430047\n    \"\"\"\n    raw = raw.strip().replace(' ', '').replace('\\uff0e', '.').replace('\\u3002', '.')\n\n    if '.' in raw:\n        parts = raw.split('.')\n        bs_code = parts[0].lower() + '.' + parts[1]\n        pure_code = parts[1]\n    elif raw.startswith('6') or raw.startswith('9'):\n        bs_code = 'sh.' + raw\n        pure_code = raw\n    elif raw.startswith('0') or raw.startswith('3'):\n        bs_code = 'sz.' + raw\n        pure_code = raw\n    elif raw.startswith('8') or raw.startswith('4'):\n        bs_code = 'bj.' + raw  # 北交所\n        pure_code = raw\n    else:\n        raise ValueError(f\"无法识别代码格式: {raw}\")\n\n    return bs_code, pure_code\n```\n\n### 9.4 注意事项\n\n1. **北交所代码(8/4开头)**: 必须映射为 `bj.` 前缀, 不能用 `sh.` 或 `sz.`\n2. **全角句号**: 用户可能输入全角句号(`．`/`。`), 需先替换为半角(`.`)\n3. **大小写**: `SH.600000` 和 `sh.600000` 等价, 统一转小写\n4. **排序陷阱**: 对\"3.10\"等字符串排序时不能用默认字符串排序, 需按数字排序:\n   ```python\n   sorted(selected, key=lambda k: tuple(int(x) for x in k.split('.')))\n   ```\n\n---\n\n## 10. 核心工具函数\n\n```python\nimport re\nimport math\n\nNO_DATA = \"无\"  # 统一无数据标记\n\n# ── safe_float ──\ndef safe_float(val, default=NO_DATA):\n    \"\"\"安全转浮点, 处理None/空串/NaN/False/超限值\"\"\"\n    if val is None or val == '' or val == 'False' or val == 'NaN':\n        return default\n    try:\n        f = float(val)\n        if math.isnan(f) or math.isinf(f) or abs(f) > 1e15:\n            return default\n        return f\n    except (ValueError, TypeError):\n        return default\n\n# ── parse_amount ──\ndef parse_amount(s):\n    \"\"\"解析带单位的金额字符串, 统一转为亿元\n    '1483.91亿' → 1483.91\n    '4.82万亿'  → 48200\n    '3391.23万' → 0.339123\n    纯数字(元)  → 原值(调用者需自行÷1亿)\n    无法解析    → None\n    \"\"\"\n    if s is None or s == '' or s == 'False':\n        return None\n    s = str(s).strip()\n    m = re.match(r'^([-\\d.]+)\\s*万亿$', s)\n    if m:\n        return float(m.group(1)) * 10000\n    m = re.match(r'^([-\\d.]+)\\s*亿$', s)\n    if m:\n        return float(m.group(1))\n    m = re.match(r'^([-\\d.]+)\\s*万$', s)\n    if m:\n        return float(m.group(1)) / 10000\n    try:\n        return float(s)  # 纯数字, 单位需调用者判断\n    except (ValueError, TypeError):\n        return None\n\n# ── parse_percent ──\ndef parse_percent(s):\n    \"\"\"解析百分比字符串\n    '6.22%' → 6.22\n    纯数字  → 原值(可能是小数也可能是百分比)\n    \"\"\"\n    if s is None or s == '' or s == 'False':\n        return None\n    s = str(s).strip()\n    m = re.match(r'^([-\\d.]+)\\s*%$', s)\n    if m:\n        return float(m.group(1))\n    try:\n        return float(s)\n    except (ValueError, TypeError):\n        return None\n\n# ── convert_share ──\ndef convert_share(val):\n    \"\"\"Baostock totalShare/liqaShare 自动单位检测与转换(→亿股)\"\"\"\n    f = safe_float(val)\n    if f == NO_DATA:\n        return NO_DATA\n    if f < 10000 and f > 0:\n        return f / 10000   # 万股→亿股\n    else:\n        return f / 100000000  # 股→亿股\n\n# ── convert_sina_percent ──\ndef convert_sina_percent(val):\n    \"\"\"新浪(%)列: 判断是小数还是百分比, 统一转为百分比\"\"\"\n    f = safe_float(val)\n    if f == NO_DATA:\n        return NO_DATA\n    if abs(f) < 2:    # 小数形式如0.92\n        f = f * 100\n    return f           # 已是百分比如92.15\n\n# ── extract_province ──\ndef extract_province(addr):\n    \"\"\"从完整注册地址提取省份\"\"\"\n    if not addr:\n        return ''\n    for city in ['北京', '上海', '天津', '重庆']:\n        if city in addr:\n            return city + '市'\n    m = re.search(r'([\\u4e00-\\u9fa5]+省|[\\u4e00-\\u9fa5]+自治区|[\\u4e00-\\u9fa5]+特别行政区)', addr)\n    if m:\n        return m.group(1)\n    return addr\n```\n\n---\n\n## 11. 单位转换速查\n\n| 源 | 原始单位 | 目标单位 | 转换方法 | 备注 |\n|----|---------|---------|---------|------|\n| 同花顺金额 | \"1483.91亿\" | 亿元 | `parse_amount()` | 自动处理万亿/亿/万 |\n| 同花顺利润表 False值 | 布尔False | — | `if val is not False:` | 视为无数据, 跳过 |\n| 新浪金额(元)列 | 不确定 | 亿元 | 先`parse_amount()`, 返回None时÷1亿 | ⚠️单位可能为万元 |\n| 新浪利润表金额 | 元(纯数字) | 亿元 | `val / 100000000` | 纯float, 必须÷1亿 |\n| Baostock金额 | 元 | 亿元 | `val / 100000000` | netProfit等 |\n| Baostock股本 | 股/万股 | 亿股 | `convert_share()` | 自动检测如果val<10000为万股 |\n| Baostock比率 | 小数 | 百分比 | `val * 100` | gpMargin/roeAvg等 |\n| 新浪比率(%)列 | 不确定 | 百分比 | `convert_sina_percent()` | `abs(f)<2`判断 |\n| 同花顺比率 | \"6.22%\" | 百分比 | `parse_percent()` | 带%号 |\n| 巨潮分红 | 每10股派息 | 每股分红 | `val / 10` | 派息比例列 |\n\n---\n\n## 12. 缓存策略\n\n### 12.1 策略选择\n\n| 场景 | 推荐策略 | 理由 |\n|------|---------|------|\n| 单股票多指标查询 | 内存字典缓存 | 数据量小, 生命周期短 |\n| 多股票回测 | 磁盘CSV缓存 | 数据量大, 需跨运行复用 |\n| 实时行情 | 不缓存 | 数据时效性要求高 |\n| 静态财务数据 | 磁盘缓存+过期时间 | 年报季度更新, 可缓存较长时间 |\n\n### 12.2 内存缓存(财务查询场景)\n\n```python\nclass FinancialDataFetcher:\n    def __init__(self):\n        self._cache = {}\n\n    def bs_query(self, func_name, year, quarter):\n        cache_key = f\"bs_{func_name}_{year}_{quarter}\"\n        if cache_key in self._cache:\n            return self._cache[cache_key]\n        # ... 查询逻辑 ...\n        self._cache[cache_key] = result\n        return result\n```\n\n### 12.3 磁盘缓存(回测场景)\n\n```python\nimport os\nimport pandas as pd\n\nCACHE_DIR = \"data_cache\"\n\ndef get_cache_path(code, start_date, end_date, freq):\n    os.makedirs(CACHE_DIR, exist_ok=True)\n    return os.path.join(CACHE_DIR, f\"{code}_{start_date}_{end_date}_{freq}.csv\")\n\ndef load_cache(path):\n    if os.path.exists(path):\n        return pd.read_csv(path, dtype=str)\n    return None\n\ndef save_cache(path, df):\n    df.to_csv(path, index=False)\n\n# 使用示例\ncache_path = get_cache_path(\"sh.600000\", \"2025-01-01\", \"2025-12-31\", \"d\")\ndf = load_cache(cache_path)\nif df is None:\n    df = fetch_from_baostock(...)\n    save_cache(cache_path, df)\n```\n\n---\n\n## 13. 错误处理与重试\n\n### 13.1 Baostock 带重试查询\n\n```python\nimport time\nimport socket\n\ndef bs_query_with_retry(fn, max_retries=3, wait_seconds=2):\n    \"\"\"带重试的baostock查询\"\"\"\n    for attempt in range(max_retries):\n        try:\n            rs = fn()\n            if rs.error_code == '0':\n                return rs\n            else:\n                print(f\"  [BS] 查询错误: {rs.error_msg}, 重试 {attempt+1}/{max_retries}\")\n        except (socket.timeout, TimeoutError, OSError) as e:\n            print(f\"  [BS] 网络异常: {e}, 重试 {attempt+1}/{max_retries}\")\n        time.sleep(wait_seconds)\n    return None\n```\n\n### 13.2 Akshare 安全调用\n\n```python\ndef ak_safe_call(fn, *args, default=None, **kwargs):\n    \"\"\"安全调用akshare接口\"\"\"\n    try:\n        result = fn(*args, **kwargs)\n        if result is None or (hasattr(result, 'empty') and result.empty):\n            return default\n        return result\n    except Exception as e:\n        print(f\"  [AK] 接口异常: {e}\")\n        return default\n```\n\n### 13.3 Baostock 结果转DataFrame\n\n```python\ndef bs_query_to_df(rs):\n    \"\"\"将baostock ResultData转为DataFrame\"\"\"\n    rows = []\n    while (rs.error_code == '0') and rs.next():\n        rows.append(rs.get_row_data())\n    if not rows:\n        return None\n    import pandas as pd\n    return pd.DataFrame(rows, columns=rs.fields)\n```\n\n---\n\n## 14. 数据源降级策略\n\n### 14.1 通用降级函数\n\n```python\ndef fetch_with_fallback(primary_fn, fallback_fn1=None, fallback_fn2=None):\n    \"\"\"带降级的数据获取: 主数据源 → 备用1 → 备用2 → \"无\" \"\"\"\n    result = primary_fn()\n    if result is not None and result != NO_DATA:\n        return result\n    if fallback_fn1:\n        result = fallback_fn1()\n        if result is not None and result != NO_DATA:\n            return result\n    if fallback_fn2:\n        result = fallback_fn2()\n        if result is not None and result != NO_DATA:\n            return result\n    return NO_DATA\n```\n\n### 14.2 推荐降级链\n\n| 目标 | 降级链 |\n|------|--------|\n| 财报 | Akshare同花顺 → 新浪 → Baostock |\n| 分红 | Akshare巨潮 → Baostock |\n| 行业 | Baostock → 东方财富(可能不可达) |\n| 研发费 | 同花顺利润表 → 新浪利润表 → 同花顺备用列名 → 新浪备用列名 |\n\n---\n\n## 15. 最佳实践模板\n\n### 15.1 FinancialDataFetcher 完整类模板\n\n```python\nimport datetime\nimport baostock as bs\n\nclass FinancialDataFetcher:\n    \"\"\"财务数据获取器 - 主力+备用双源模式\"\"\"\n\n    def __init__(self, bs_code, pure_code):\n        self.bs_code = bs_code\n        self.pure_code = pure_code\n        self._cache = {}\n        self._bs_logged_in = False\n        self.now = datetime.datetime.now()\n        # 判断\"去年\": 5月前年报可能未出, 取前年\n        self.last_year = self.now.year - 2 if self.now.month < 5 else self.now.year - 1\n        self.prev_year = self.last_year - 1\n        self.year_before = self.last_year - 2\n\n    # ── 登录管理 ──\n    def bs_login(self):\n        if not self._bs_logged_in:\n            lg = bs.login()\n            if lg.error_code != '0':\n                return False\n            self._bs_logged_in = True\n        return True\n\n    def bs_logout(self):\n        if self._bs_logged_in:\n            bs.logout()\n            self._bs_logged_in = False\n\n    def _ensure_bs_login(self):\n        \"\"\"确保已登录(在所有baostock查询前调用)\"\"\"\n        if not self._bs_logged_in:\n            self.bs_login()\n\n    # ── 通用查询(带缓存) ──\n    def bs_query(self, func_name, year=None, quarter=None):\n        self._ensure_bs_login()\n        cache_key = f\"bs_{func_name}_{year}_{quarter}\"\n        if cache_key in self._cache:\n            return self._cache[cache_key]\n        # ... 实际查询逻辑 ...\n        # self._cache[cache_key] = result\n        # return result\n```\n\n### 15.2 主循环模板\n\n```python\ndef main():\n    fetcher = None\n    bs_code = None\n\n    while True:\n        if bs_code is None:\n            bs_code, pure_code = input_stock_code()\n            fetcher = None  # 换股时重置\n\n        if fetcher is None:\n            fetcher = FinancialDataFetcher(bs_code, pure_code)\n            fetcher.bs_login()\n\n        # ... 查询逻辑 ...\n\n        action = wait_key_prompt()\n        if action == 'exit':\n            fetcher.bs_logout()\n            break\n        elif action == 'new_stock':\n            fetcher.bs_logout()\n            fetcher = None\n            bs_code = None\n        # 'same_stock': 保持fetcher复用缓存\n\n# 关键原则:\n# - fetcher在循环外创建, 换股时才重置\n# - 换股时先bs_logout()再重建\n# - 退出时bs_logout()\n# - 同一股票多次查询时复用缓存\n```\n\n### 15.3 Numba加速技术指标模板\n\n```python\nfrom numba import jit\nimport numpy as np\n\n@jit(nopython=True, cache=True, fastmath=True)\ndef calc_kd(close_prices, n=9, m1=3, m2=3):\n    \"\"\"计算KD指标 - Numba加速版\"\"\"\n    length = len(close_prices)\n    k_values = np.zeros(length)\n    d_values = np.zeros(length)\n    # ... 计算逻辑 ...\n    return k_values, d_values\n\n@jit(nopython=True, cache=True, fastmath=True)\ndef calc_rsi(close_prices, period=8):\n    \"\"\"计算RSI - Numba加速版\"\"\"\n    # ... 计算逻辑 ...\n    return rsi_values\n\n# 关键参数: RSI周期=8, KD参数 n=9, m1=3, m2=3\n```\n\n---\n\n## 16. 完整踩坑记录\n\n### 16.1 单位陷阱\n\n| 日期 | 踩坑内容 | 影响 | 解决方案 |\n|------|---------|------|---------|\n| 2026-05-12 | 新浪毛利率(%)列返回值可能是百分比也可能是小数 | 毛利率9215%而非92.15% | `abs(f)<2` 判断 |\n| 2026-05-12 | Baostock roeAvg是小数而非百分比 | ROE显示0.15%而非15% | `f*100` |\n| 2026-05-12 | Baostock totalShare单位可能是\"万股\" | 股本偏小10000倍 | 自动检测 `convert_share()` |\n| 2026-05-12 | 新浪金额列(元)实际单位可能是\"万元\" | 研发费用/营收偏差1万倍 | 优先用parse_amount |\n| 2026-05-12 | 巨潮分红\"派息比例\"是每10股 | 每股分红偏大10倍 | ÷10 |\n| 2026-05-13 | 同花顺利润表早期年份研发费返回False(布尔值) | parse_amount解析False失败 | 加`val is not False`前置判断 |\n| 2026-05-13 | 新浪利润表金额单位为元(纯数字) | 直接当亿元使用偏小1亿倍 | ÷1亿转亿元 |\n| 2026-05-13 | Baostock股本单位: 股可能为万股 | 股本偏差 | `if f<10000 and f>0`检测 |\n\n### 16.2 API陷阱\n\n| 日期 | 踩坑内容 | 影响 | 解决方案 |\n|------|---------|------|---------|\n| 2026-05-12 | 东方财富API从服务器无法访问 | stock_individual_info_em超时 | 降级到其他数据源 |\n| 2026-05-12 | 同花顺现金流表列名硬编码 | akshare升级后列名变化导致查不到 | 加try-except和模糊匹配 |\n| 2026-05-12 | baostock query_profit_data等不接受yearType参数 | 传参报错 | 不传yearType |\n| 2026-05-12 | baostock需login后才能查询 | 未登录直接查询报错 | 查询前检查登录状态 |\n| 2026-05-12 | baostock K线返回值全是字符串类型 | 数值比较/计算出错 | 手动float()转换 |\n| 2026-05-13 | 同花顺财务摘要无研发费列 | 研发费始终返回NO_DATA | 改用同花顺利润表 |\n| 2026-05-13 | 新浪财务分析指标无研发费列 | 同上 | 改用新浪利润表 |\n| 2026-05-13 | 同花顺利润表早期年份研发费返回False | parse_amount解析失败 | 加`val is not False`判断 |\n| 2026-05-13 | stock_profit_sheet_ths接口不存在 | AttributeError | 正确接口是stock_financial_benefit_ths |\n| 2026-05-13 | baostock query_stock_industry无province字段 | 无法查注册属地 | 改用巨潮 profile_cninfo |\n| 2026-05-18 | 公司查注册属地无备用方案 | profile_cninfo失败则无替代 | 暂无备用, 注意异常处理 |\n\n### 16.3 逻辑陷阱\n\n| 日期 | 踩坑内容 | 影响 | 解决方案 |\n|------|---------|------|---------|\n| 2026-05-12 | sorted()对\"3.10\"字符串排序不正确 | 3.10排在3.2前面 | 按数字排序 `key=lambda k: tuple(int(x) for x in k.split('.'))` |\n| 2026-05-12 | 分红终止条件逻辑错误 | 第1年就break,只取1年数据 | 删除提前终止条件 |\n| 2026-05-12 | PEG中g_val==0无法匹配字符串\"0\" | ZeroDivisionError | 先float()再判断 |\n| 2026-05-12 | 北交所代码(8/4开头)未处理 | 北交所股票无法查询 | 增加bj.前缀 |\n\n---\n\n## 17. 附录：各接口列名速查\n\n### A. 同花顺财务摘要 (`stock_financial_abstract_ths`)\n\n| 列名 | 含义 | 格式 |\n|------|------|------|\n| 报告期 | 年报/季报日期 | \"2024-12-31\" |\n| 基本每股收益 | EPS | 纯数字(元) |\n| 每股净资产 | BPS | 纯数字(元) |\n| 每股经营现金流 | OCF/Share | 纯数字(元) |\n| 净利润 | 净利润 | \"1483.91亿\" |\n| 营业总收入 | 营收 | \"4.82万亿\" |\n| 净资产收益率 | ROE | \"6.22%\" |\n| 净利润同比增长率 | 净利润增速 | \"15.3%\" |\n| 营业总收入同比增长率 | 营收增速 | \"12.1%\" |\n\n> ⚠️ **此接口没有\"研发费用\"列!**\n\n### B. 同花顺利润表 (`stock_financial_benefit_ths`) ✅含研发费\n\n| 列名 | 含义 | 格式 | 备注 |\n|------|------|------|------|\n| 报告期 | 年报/季报 | \"2025\"(纯年份) | 匹配: `str(year) in rp` |\n| 一、营业总收入 | 营收 | \"1720.54亿\" | 带单位 |\n| 其中：营业收入 | 营业收入 | \"1688.38亿\" | 带单位 |\n| 二、营业总成本 | 营业总成本 | \"573.71亿\" | 带单位 |\n| 其中：营业成本 | 营业成本 | \"114.89亿\" | 带单位 |\n| 销售费用 | 销售费用 | \"725.35亿\" | 带单位 |\n| 管理费用 | 管理费用 | \"83.20亿\" | 带单位 |\n| **研发费用** | **研发费用** | **\"1.90亿\"** | **✅带单位, 早期年份可能为False** |\n| 财务费用 | 财务费用 | \"-0.82亿\" | 可能为负 |\n| 三、营业利润 | 营业利润 | \"1148.09亿\" | 带单位 |\n| 五、净利润 | 净利润 | \"853.10亿\" | 带单位 |\n| 归属于母公司所有者的净利润 | 归母净利润 | \"823.20亿\" | 带单位 |\n\n> ⚠️ 接口名是 `stock_financial_benefit_ths`, **不是** `stock_profit_sheet_ths`(已废弃)\n\n### C. 新浪利润表 (`stock_financial_report_sina` symbol=\"利润表\") ✅含研发费\n\n| 列名 | 含义 | 格式 | 备注 |\n|------|------|------|------|\n| 报告日 | 报告日期 | \"20251231\" | 匹配: `f\"{year}1231\" in rp` |\n| 营业总收入 | 营收 | 172054171890.91 | 纯数字(元) |\n| 营业收入 | 营业收入 | 168838102514.79 | 纯数字(元) |\n| 营业成本 | 营业成本 | 114892277570.91 | 纯数字(元) |\n| 销售费用 | 销售费用 | 72534996000.68 | 纯数字(元) |\n| 管理费用 | 管理费用 | 8320061659.66 | 纯数字(元) |\n| **研发费用** | **研发费用** | **190112246.58** | **✅纯数字(元), ÷1亿→亿元** |\n| 财务费用 | 财务费用 | -815240284.72 | 可能为负 |\n| 营业利润 | 营业利润 | 114808950164.24 | 纯数字(元) |\n| 净利润 | 净利润 | 85310324833.67 | 纯数字(元) |\n| 归属于母公司所有者的净利润 | 归母净利润 | 82320067101.68 | 纯数字(元) |\n\n> ⚠️ 所有金额列单位均为**元**(纯float), 需÷1亿转亿元\n> ⚠️ 该接口同时返回季报+年报, 按报告日筛选即可\n\n### D. 新浪财务指标 (`stock_financial_analysis_indicator`)\n\n| 列名 | 含义 | ⚠️单位注意 |\n|------|------|-----------|\n| 销售毛利率(%) | 毛利率 | 可能是百分比或小数 |\n| 净资产收益率(%) | ROE | 同上 |\n| 每股经营性现金流(元) | OCF/Share | 元/股 |\n| 每股净资产_调整前(元) | BPS | 元/股 |\n| 主营业务收入增长率(%) | 营收增速 | 可能是百分比或小数 |\n| 净利润增长率(%) | 净利润增速 | 同上 |\n| 营业收入(元) | 营收 | 元(也可能是万元⚠️) |\n| 研发费用(元) | 研发 | 元(也可能是万元⚠️) |\n\n> ⚠️ **此接口没有\"研发费用\"列!** 上表中\"研发费用(元)\"仅作参考, 实测可能有或无\n\n### E. 同花顺现金流量表 (`stock_financial_cash_ths`)\n\n| 列名 | 含义 | 格式 |\n|------|------|------|\n| 经营活动产生的现金流量净额 | OCF | 带单位 |\n| 购建固定资产、无形资产和其他长期资产支付的现金 | CAPEX | 带单位 |\n\n### F. 巨潮分红 (`stock_dividend_cninfo`)\n\n| 列名 | 含义 | 格式 |\n|------|------|------|\n| 报告时间 | 报告期 | \"2024年年报\" |\n| 派息比例 | 每10股派息额 | 需÷10→每股分红 |\n\n---\n\n## 本技能维护说明\n\n### 经验积累机制\n\n当你经过多次尝试才得出正确结果时(例如参数格式试错、接口选择调整、发现文档未明示的约束等), 必须将经验简要追加到第16章的踩坑记录中。\n\n**记录标准**:\n- 只记录经过**2次及以上尝试**才成功的情况\n- 格式: `| 日期 | 踩坑内容 | 影响 | 解决方案 |`\n- 内容简明, 聚焦\"下次遇到同样情况该怎么做\"\n\n### 数据源状态更新\n\n- 东方财富API等不可用状态可能随时间变化, 每隔一段时间应重新验证\n- Akshare接口列名可能因版本变化, 使用前建议先打印列名验证\n\n---\n\n*文档结束 - 持续更新中*\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7d24qhb41yswmqmfw0hf70v586ysza\",\n  \"slug\": \"astock-unified-financial\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1779119419500\n}\n\nFile v2.0.0:skill-card.md\n\n## Description:\n\n为代理提供 A 股行情与财务数据读取指南，整合 Baostock/Akshare 数据源选择、代码格式、单位转换、缓存、错误处理、降级策略、研发费用和注册属地查询等实践。\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[zoy168](https://clawhub.ai/user/zoy168)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and agent workflows use this skill to choose and normalize A-share market and financial data sources, especially when working with Baostock and Akshare interfaces. It helps produce robust data retrieval guidance, code patterns, and fallback strategies for common A股 financial-data tasks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill instructs the agent to persistently edit its own instruction file after trial-and-error.\n\nMitigation: Review or remove the self-update instruction before installation and keep the installed skill directory read-only during normal use.\n\nRisk: The cache example may be reused without validating stock code, date, or frequency inputs.\n\nMitigation: Treat cache snippets as templates and validate stock-code, date, and frequency values before adapting them.\n\nRisk: Financial-data interfaces and field names may change across Akshare/Baostock versions or become temporarily unavailable.\n\nMitigation: Validate columns and data-source availability before relying on generated retrieval guidance or code in downstream workflows.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/zoy168/skills/astock-unified-financial)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, code, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include data-source selection advice, unit conversion rules, fallback chains, cache patterns, and validation reminders.]\n\n## Skill Version(s):\n\n2.0.0 (source: server release evidence and artifact _meta.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: A股金融数据整合技能 Owner: zoy168 Summary: A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Tags: A-share:2.0.0, R&D-expenses:2.0.0, akshare:2.0.0, baostock:2.0.0, china-stocks:2.0.0, financial-data:2.0.0, latest:2.0.0 Version history: v2.0.0 | 2026-05-18T15:50:19.500Z | auto astock-unified-financial 2.0.0 - Major u","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"Level 1: 同花顺数据源(首选)  → parse_amount/parse_percent\nLevel 2: 新浪数据源(备用)    → safe_float + ÷1亿调单位\nLevel 3: Baostock(兜底)      → safe_float + convert_share\nLevel 4: 东方财富(降级)      → ⚠️当前服务器不可达"},{"language":"text","snippet":"主力:      Akshare(同花顺/新浪) + Baostock(补充)\n行情:      Baostock K线 (稳定可靠)\n财报:      Akshare同花顺(主) → 新浪(备) → Baostock(兜底)\n研发费:    同花顺利润表(主) → 新浪利润表(备) → 四级降级\n分红:      Akshare巨潮(主) → Baostock(备)\n行业:      Baostock query_stock_industry\n注册属地:  巨潮 stock_profile_cninfo"},{"language":"python","snippet":"import baostock as bs\n\n# 登录\nlg = bs.login()\nif lg.error_code != '0':\n    print(f\"登录失败: {lg.error_msg}\")\n\n# 登出\nbs.logout()\n\n# ⚠️: 查询前必须登录, 查询后无需立即登出(可复用连接)"},{"language":"python","snippet":"# 日线\nrs = bs.query_history_k_data_plus(\n    code=\"sh.600000\",        # baostock格式: sh.600000 / sz.000001 / bj.430047\n    fields=\"date,close,open,high,low,volume,amount,turn\",\n    start_date=\"2025-01-01\",\n    end_date=\"2025-12-31\",\n    frequency=\"d\",           # d=日线, w=周线, m=月线\n    adjustflag=\"3\"           # 1=后复权, 2=前复权, 3=不复权\n)\n\n# 60分钟线\nrs = bs.query_history_k_data_plus(\n    code=\"sh.600000\",\n    fields=\"date,time,close,open,high,low,volume,amount\",\n    start_date=\"2025-01-01\",\n    end_date=\"2025-12-31\",\n    frequency=\"60\",          # 5/15/30/60分钟\n    adjustflag=\"3\"\n)\n\n# 遍历结果\ndef bs_query_to_df(rs):\n    \"\"\"将baostock ResultData转为DataFrame\"\"\"\n    rows = []\n    while (rs.error_code == '0') and rs.next():\n        rows.append(rs.get_row_data())\n    if not rows:\n        return None\n    import pandas as pd\n    return pd.DataFrame(rows, columns=rs.fields)"},{"language":"python","snippet":"# 盈利数据\nrs = bs.query_profit_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: totalShare, liqaShare, epsTTM, gpMargin, netProfit, roeAvg, roeDiluted\n\n# 成长数据\nrs = bs.query_growth_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: YOYEquity, YOYAsset, YOYNI, YOYEPSBasic, YOYPNI, YOYOR, YOYGR\n\n# 运营数据\nrs = bs.query_operation_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: NetProfitGrowRate, OperatingProfitGrowRate, TotalRevenueGrowRate\n\n# 现金流数据\nrs = bs.query_cash_flow_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: CAToAsset, NCAToAsset, CFOToOR\n\n# 资产负债数据\nrs = bs.query_balance_data(code=\"sh.600000\", year=2024, quarter=4)\n# 关键字段: totalAssets, totalLiab, totalEquity, currentAssets, currentLiab"},{"language":"python","snippet":"rs = bs.query_dividend_data(\n    code=\"sh.600000\",\n    year=2024,\n    yearType=\"report\"    # \"report\"=按报告期, \"operate\"=按运营期\n)\n# 关键字段: dividCashPsBeforeTax(元/股), dividPreistNoTax(每10股送股), dividAistNoTax(每10股转增)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: astock-unified-financial\nversion: 2.0\ndescription: >\n  A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、\n  已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、\n  公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。\n  本技能将分散在多个文档中的经验融合为一份自包含的完整指南。\nagent_created: true\ntags: [akshare, baostock, A股, 财务数据, 行情数据, 研发费用, 单位转换, 踩坑经验, 降级策略]\n---\n\n# A股金融数据整合技能（终极版）\n\n> **融合自**: astock-financial-data-guide / akshare-financial-data-traps / A股行情与财务数据读取经验手册  \n> **最后融合日期**: 2026-05-18\n\n---\n\n## 目录\n\n1. [数据源总览与选择策略](#1-数据源总览与选择策略)\n2. [推荐数据源组合 & 降级链](#2-推荐数据源组合--降级链)\n3. [登录模式对照](#3-登录模式对照)\n4. [Baostock 接口详解](#4-baostock-接口详解)\n5. [Akshare 接口详解](#5-akshare-接口详解)\n6. [废弃/不可用接口一览](#6-废弃不可用接口一览)\n7. [研发费用查询专项指南](#7-研发费用查询专项指南)\n8. [公司注册属地查询](#8-公司注册属地查询)\n9. [股票代码格式处理](#9-股票代码格式处理)\n10. [核心工具函数](#10-核心工具函数)\n11. [单位转换速查](#11-单位转换速查)\n12. [缓存策略](#12-缓存策略)\n13. [错误处理与重试](#13-错误处理与重试)\n14. [数据源降级策略](#14-数据源降级策略)\n15. [最佳实践模板](#15-最佳实践模板)\n16. [完整踩坑记录](#16-完整踩坑记录)\n17. [附录：各接口列名速查](#17-附录各接口列名速查)\n\n---\n\n## 1. 数据源总览与选择策略\n\n### 1.1 数据源对比\n\n| 数据源 | 类型 | 行情 | 财报 | 分红 | 行业 | 优势 | 劣势 | 是否需要API Key |\n|--------|------|------|------|------|------|------|------|----------------|\n| **Baostock** | 证券宝 | ✅日/60分K线 | ✅五大季报 | ✅ | ✅ | 稳定、免费、无需Key、数据规范 | 字段单位需确认、登录/登出模式 | ❌ |\n| **Akshare-同花顺** | Akshare | ❌ | ✅摘要/现金流/利润表 | ✅巨潮 | ❌ | 数据最全、带单位标注 | 列名可能随版本变 | ❌ |\n| **Akshare-新浪** | Akshare | ❌ | ✅财务指标/利润表 | ❌ | ❌ | 覆盖面广、研发费数据完整 | 单位不确定(元/万元)、列名含(%)需判断 | ❌ |\n| **Akshare-东方财富** | Akshare | ✅历史行情 | ✅个股信息 | ❌ | ✅ | 行情+基本面一体 | **服务器无法访问**⚠️ | ❌ |\n| **Tushare** | 第三方 | ✅ | ✅ | ✅ | ✅ | 数据全面、质量高 | **需积分+API Key** | ✅ |\n| **通达信** | 本地 | ✅ | ❌ | ❌ | ❌ | 速度极快(本地读取) | 仅行情、需安装通达信 | ❌ |\n\n### 1.2 数据源能力速查矩阵\n\n| 功能场景 | 推荐数据源(优先级) | 备注 |\n|---------|-------------------|------|\n| K线行情 | Baostock(主) → 东方财富(备) → 通达信(备) | Baostock稳定免费 |\n| 财务摘要 | 同花顺财务摘要(主) → 新浪财务指标(备) | 同花顺带单位标注 |\n| 利润表(含研发费) | 同花顺利润表(主) → 新浪利润表(备) | 同花顺带单位，新浪纯数字(元) |\n| 研发费用 | 同花顺利润表(主) → 新浪利润表(备) → 四级降级策略 | ⚠️见第7章 |\n| 分红数据 | 巨潮分红(主) → Baostock(备) | 巨潮\"每10股\"，Baostock\"元/股\" |\n| 行业分类 | Baostock(主) → 东方财富(备,可能不可达) | Baostock含industry和province |\n| 公司注册属地 | 巨潮公司概况(主) | `stock_profile_cninfo` |\n| 实时行情 | 东方财富全市场实时行情(备) | 新浪实时行情替代方案 |\n| 技术指标计算 | Baostock K线 + Numba加速 | 数据量大时用磁盘缓存 |\n\n### 1.3 踩坑优先级通道\n\n```\nLevel 1: 同花顺数据源(首选)  → parse_amount/parse_percent\nLevel 2: 新浪数据源(备用)    → safe_float + ÷1亿调单位\nLevel 3: Baostock(兜底)      → safe_float + convert_share\nLevel 4: 东方财富(降级)      → ⚠️当前服务器不可达\n```\n\n---\n\n## 2. 推荐数据源组合 & 降级链\n\n### 2.1 主力推荐组合\n\n```\n主力:      Akshare(同花顺/新浪) + Baostock(补充)\n行情:      Baostock K线 (稳定可靠)\n财报:      Akshare同花顺(主) → 新浪(备) → Baostock(兜底)\n研发费:    同花顺利润表(主) → 新浪利润表(备) → 四级降级\n分红:      Akshare巨潮(主) → Baostock(备)\n行业:      Baostock query_stock_industry\n注册属地:  巨潮 stock_profile_cninfo\n```\n\n### 2.2 降级链速查\n\n| 目标数据 | 降级链 |\n|---------|--------|\n| 研发费用 | 同花顺利润表\"研发费用\" → 新浪利润表\"研发费用\" → 同花顺备用列名 → 新浪备用列名 |\n| 净利润 | 同花顺利润表 → 新浪利润表 → Baostock profit |\n| 营收 | 同花顺利润表 → 新浪利润表 → Baostock profit |\n| 分红 | 巨潮分红 → Baostock dividend |\n| 行业 | Baostock industry → 东方财富(可能不可达) |\n| 注册地 | 巨潮 profile_cninfo → (无备用) |\n\n---\n\n## "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7d24qhb41yswmqmfw0hf70v586ysza\",\n  \"slug\": \"astock-unified-financial\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1779119419500\n}"},{"path":"skill-card.md","content":"## Description:\n\n为代理提供 A 股行情与财务数据读取指南，整合 Baostock/Akshare 数据源选择、代码格式、单位转换、缓存、错误处理、降级策略、研发费用和注册属地查询等实践。\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[zoy168](https://clawhub.ai/user/zoy168)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, analysts, and agent workflows use this skill to choose and normalize A-share market and financial data sources, especially when working with Baostock and Akshare interfaces. It helps produce robust data retrieval guidance, code patterns, and fallback strategies for common A股 financial-data tasks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill instructs the agent to persistently edit its own instruction file after trial-and-error.\n\nMitigation: Review or remove the self-update instruction before installation and keep the installed skill directory read-only during normal use.\n\nRisk: The cache example may be reused without validating stock code, date, or frequency inputs.\n\nMitigation: Treat cache snippets as templates and validate stock-code, date, and frequency values before adapting them.\n\nRisk: Financial-data interfaces and field names may change across Akshare/Baostock versions or become temporarily unavailable.\n\nMitigation: Validate columns and data-source availability before relying on generated retrieval guidance or code in downstream workflows.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/zoy168/skills/astock-unified-financial)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, code, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include data-source selection advice, unit conversion rules, fallback chains, cache patterns, and validation reminders.]\n\n## Skill Version(s):\n\n2.0.0 (source: server release evidence and artifact _meta.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Skill: A股金融数据整合技能 Owner: zoy168 Summary: A股行情与财务数据读取的终极整合技能。融合Baostock/Akshare双数据源的全部最佳实践、 已知踩坑经验、单位转换、代码格式处理、缓存策略、错误处理与降级策略、研发费用查询、 公司注册属地查询等核心场景。一站式解决A股数据读取的所有问题。 本技能将分散在多个文档中的经验融合为一份自包含的完整指南。 Tags: A-share:2.0.0, R&D-expenses:2.0.0, akshare:2.0.0, baostock:2.0.0, china-stocks:2.0.0, financial-data:2.0.0, latest:2.0.0 Version history: v2.0.0 | 2026-05-18T15:50:19.500Z | auto astock-unified-financial 2.0.0 - Major u","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":676,"uniquenessScore":63,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:08:34.247Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-14T06:55:09.595Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}