{"id":"da0ff919-130d-488b-b2b2-f619620772ae","entityType":"agent","slug":"clawhub-wangzhi43-bitsoul-stock-quantization","name":"BitSoulStockSkill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-wangzhi43-bitsoul-stock-quantization","canonicalPath":"/agent/clawhub-wangzhi43-bitsoul-stock-quantization","generatedAt":"2026-10-09T16:27:18.901Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T04:29:26.772Z","emptyReason":null},"description":"BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Skill: BitSoulStockSkill Owner: wangzhi43 Summary: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Tags: latest:1.0.30 Version history: v1.0.30 | 2026-03-21T14:11:47.695Z | auto - 强化买卖信号输出规范，新增分步输出结构（汇总表、专家评分明细、关键细节、操作建议、免责声明），并强制执行，禁止简化格式。 - 明确了买卖信号处理后，每个环节（专家评分、关键细节等）的展示要点和细节要求。 - 其他功能说明和接口调用规则与上一版保持一致。 - 本次为文档改进，不含","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 5K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s1792ymbk7nz9w3tt7dnqyezz583hvp0:bitsoul-stock-quantization","sourceUrl":"https://clawhub.ai/wangzhi43/bitsoul-stock-quantization","homepage":"https://clawhub.ai/wangzhi43/skills/bitsoul-stock-quantization","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/wangzhi43/bitsoul-stock-quantization","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/wangzhi43/skills/bitsoul-stock-quantization","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":74,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Skill: BitS"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:29:26.772Z","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-09T04:29:26.772Z","emptyReason":null},"stars":null,"forks":null,"downloads":5014,"packageName":null,"latestVersion":"1.0.30","tractionLabel":"5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:29:26.772Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T04:29:26.772Z","lastCrawledAt":"2026-10-09T04:29:26.772Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T04:29:26.772Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.30","createdAt":"2026-03-21T14:11:47.695Z","changelog":"- 强化买卖信号输出规范，新增分步输出结构（汇总表、专家评分明细、关键细节、操作建议、免责声明），并强制执行，禁止简化格式。 - 明确了买卖信号处理后，每个环节（专家评分、关键细节等）的展示要点和细节要求。 - 其他功能说明和接口调用规则与上一版保持一致。 - 本次为文档改进，不含产品接口或功能变更。","fileCount":27,"zipByteSize":149821},{"version":"1.0.29","createdAt":"2026-03-21T07:24:38.236Z","changelog":"- Improved documentation in SKILL.md with clarified environment variable precedence and configuration instructions. - Added explicit note prioritizing BITSOUL_TOKEN from environment variables over env file. - No breaking interface or logic changes in core functionality.","fileCount":27,"zipByteSize":149346},{"version":"1.0.28","createdAt":"2026-03-21T07:14:21.456Z","changelog":"- Documentation in SKILL.md reorganized for improved clarity and readability - Now uses clearer section titles, concise bullet points, and bold highlights for key terms - Removed repetitive and redundant introductory content - No functional or behavior changes to the skill itself; all updates are to documentation only","fileCount":27,"zipByteSize":149420},{"version":"1.0.27","createdAt":"2026-03-21T07:09:27.291Z","changelog":"BitSoulStockSkill 1.0.27 Changelog - Updated documentation in SKILL.md; no user-facing functional changes. - Revised references/API_FOR_LLM.md with new or corrected API information. - Made minor code updates in scripts/data_fetcher.py to improve data fetching or compatibility.","fileCount":27,"zipByteSize":149384},{"version":"1.0.26","createdAt":"2026-03-21T07:02:53.068Z","changelog":"- No code or documentation changes detected in this version. - No visible updates or new features included in this release.","fileCount":27,"zipByteSize":149495},{"version":"1.0.25","createdAt":"2026-03-21T06:57:43.968Z","changelog":"Version 1.0.25 - Updated and clarified documentation in SKILL.md, highlighting unique features and data sources. - Enhanced configuration instructions for environment variables and token management. - Improved descriptions of functionality and integration of MOE factor models and data analysis. - Expanded usage guidelines and safety boundaries. - Refined API usage documentation and output behavior. - Minor adjustments to config and script files for better maintainability.","fileCount":27,"zipByteSize":149495},{"version":"1.0.24","createdAt":"2026-03-21T04:56:09.046Z","changelog":"No changes detected in this version.","fileCount":27,"zipByteSize":149938},{"version":"1.0.23","createdAt":"2026-03-21T04:53:07.278Z","changelog":"- 新增外部网络依赖：https://finance.sina.com.cn/ - 其他功能与文档未做更改","fileCount":27,"zipByteSize":149938}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1792ymbk7nz9w3tt7dnqyezz583hvp0:bitsoul-stock-quantization","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","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-wangzhi43-bitsoul-stock-quantization/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/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-09T16:27:18.897Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wangzhi43-bitsoul-stock-quantization/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-09T04:29:26.772Z","emptyReason":null},"readme":"Skill: BitSoulStockSkill\n\nOwner: wangzhi43\n\nSummary: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\n\nTags: latest:1.0.30\n\nVersion history:\n\nv1.0.30 | 2026-03-21T14:11:47.695Z | auto\n\n- 强化买卖信号输出规范，新增分步输出结构（汇总表、专家评分明细、关键细节、操作建议、免责声明），并强制执行，禁止简化格式。\n- 明确了买卖信号处理后，每个环节（专家评分、关键细节等）的展示要点和细节要求。\n- 其他功能说明和接口调用规则与上一版保持一致。\n- 本次为文档改进，不含产品接口或功能变更。\n\nv1.0.29 | 2026-03-21T07:24:38.236Z | auto\n\n- Improved documentation in SKILL.md with clarified environment variable precedence and configuration instructions.\n- Added explicit note prioritizing BITSOUL_TOKEN from environment variables over env file.\n- No breaking interface or logic changes in core functionality.\n\nv1.0.28 | 2026-03-21T07:14:21.456Z | auto\n\n- Documentation in SKILL.md reorganized for improved clarity and readability\n- Now uses clearer section titles, concise bullet points, and bold highlights for key terms\n- Removed repetitive and redundant introductory content\n- No functional or behavior changes to the skill itself; all updates are to documentation only\n\nv1.0.27 | 2026-03-21T07:09:27.291Z | auto\n\nBitSoulStockSkill 1.0.27 Changelog\n\n- Updated documentation in SKILL.md; no user-facing functional changes.\n- Revised references/API_FOR_LLM.md with new or corrected API information.\n- Made minor code updates in scripts/data_fetcher.py to improve data fetching or compatibility.\n\nv1.0.26 | 2026-03-21T07:02:53.068Z | auto\n\n- No code or documentation changes detected in this version.\n- No visible updates or new features included in this release.\n\nv1.0.25 | 2026-03-21T06:57:43.968Z | auto\n\nVersion 1.0.25\n\n- Updated and clarified documentation in SKILL.md, highlighting unique features and data sources.\n- Enhanced configuration instructions for environment variables and token management.\n- Improved descriptions of functionality and integration of MOE factor models and data analysis.\n- Expanded usage guidelines and safety boundaries.\n- Refined API usage documentation and output behavior.\n- Minor adjustments to config and script files for better maintainability.\n\nv1.0.24 | 2026-03-21T04:56:09.046Z | auto\n\nNo changes detected in this version.\n\nv1.0.23 | 2026-03-21T04:53:07.278Z | auto\n\n- 新增外部网络依赖：https://finance.sina.com.cn/\n- 其他功能与文档未做更改\n\nv1.0.22 | 2026-03-21T04:47:32.257Z | auto\n\nBitsoulstockskill 1.0.22 Changelog\n\n- Documentation update in SKILL.md: clarified setup instructions.\n- Fixed script name typo in the initialization section (data_fectcher.py → data_fetcher).\n- Enhanced install instructions to reference the correct initialization process.\n- No changes to code or runtime behavior.\n\nv1.0.21 | 2026-03-21T04:43:17.899Z | auto\n\nBitsoulstockskill v1.0.21\n\n- Added https://raw.githubusercontent.com/ to the allowed network endpoints in configuration for improved data access.\n- Updated config.json and supporting scripts for enhanced compatibility with new data sources.\n- Other minor script and configuration refinements.\n\nv1.0.20 | 2026-03-21T04:28:40.934Z | auto\n\n- Documentation cleanup: removed detailed function and output usage instructions from SKILL.md, focusing the documentation on key setup, environment configuration, installation, and summary behavior.\n- No code or behavior changes to the skill; only SKILL.md file content has been updated for brevity and clarity.\n\nv1.0.19 | 2026-03-21T04:16:44.282Z | user\n\n- Removed the file scripts/template.py.\n- Updated and expanded the SKILL.md documentation, with revised descriptions and more detailed environment/configuration instructions.\n- Clarified token usage, configuration steps, and security boundaries.\n- Enhanced usage notes for API behaviors, factor mining logic, output conventions, and example requests.\n- Added installation and initialization instructions.\n- This update primarily consists of documentation improvements and cleanup; no feature changes to the skill’s logic.\n\nv1.0.18 | 2026-03-21T03:35:41.923Z | auto\n\n- Documentation in SKILL.md updated: clarified usage instructions and removed some implementation details.\n- No changes to core logic or features; functionality remains the same.\n- Formatting improvements in the documentation for better readability.\n\nv1.0.17 | 2026-03-21T03:30:10.261Z | auto\n\nBitSoulStockSkill 1.0.17 Changelog\n\n- Updated SKILL.md: minor edits and wording changes for clarification; removed some specific details and adjusted file format sections.\n- No functional or API changes; all updates are documentation only.\n\nv1.0.16 | 2026-03-21T03:22:36.410Z | auto\n\n- Updated SKILL.md to remove an empty bullet in the 注意事项 section, improving formatting and clarity.\n- No changes to the skill’s logic or APIs; documentation only.\n\nv1.0.15 | 2026-03-21T03:00:16.277Z | user\n\n- 增加可选环境变量 BITSOUL_CACHE_DIR，允许自定义缓存和数据存储目录，提升数据隔离和安全性。\n- 规范所有本地数据（如data.db、日志）仅可写入缓存目录及子目录，禁止访问其他目录。\n- 文档中新增关于缓存目录使用规则和安全边界的说明。\n- 其余功能和接口保持不变，兼容旧有用法。\n\nv1.0.14 | 2026-03-21T02:37:15.184Z | auto\n\n- Updated SKILL.md to remove explicit instructions for token setting actions; token set/query methods are no longer documented or required in the usage steps.\n- Clarified that token should remain valid for data access but removed code sample and process for setting token via generated code.\n- Improved safety description and simplified usage and edge case instructions.\n- No changes to core APIs or usage for real-time query, backtest, or factor mining.\n- Minor documentation corrections in SKILL.md for consistency and clarity.\n\nv1.0.13 | 2026-03-21T02:14:35.896Z | auto\n\n- Token 管理方式由本地 user.json 文件切换为环境变量（BITSOUL_TOKEN/可选 BITSOUL_TOKEN_ENV_FILE），不再写入本地凭证文件。\n- 配置说明与风险声明已更新，更加简洁明了，明确 skill 仅访问所声明环境变量，并限制本地文件及网络访问范围。\n- SKILL.md 前言配置采用 openclaw 格式，新增 emoji、依赖环境、依赖包和网络说明。\n- 调整文档结构，去除历史 token 本地存储、详细认证流程和早期执行流程描述，统一现有操作流程。\n\nv1.0.12 | 2026-03-20T16:45:30.810Z | auto\n\n- Added a credentials section, specifying user_token as a required environment variable for server authentication.\n- No changes to functionality or logic; documentation was updated to clarify configuration requirements.\n- All instructions, usage steps, and examples remain unchanged except for the addition of the credentials information.\n\nv1.0.11 | 2026-03-20T16:30:35.388Z | auto\n\n- Skill名称由 strategy-picker 调整为 BitSoulStockSkill，描述中增加了服务器地址和隐私说明。\n- 本地持久化文件说明新增 data_1.0.bin 基础数据包。\n- 配置说明中明确 base_url 为 http://139.224.210.110:80，并补充了隐私相关说明。\n- 格式、结构与示例保持一致，内容更详细，覆盖部分配置信息和依赖说明。\n- 没有功能实现上的变更，仅对 SKILL.md 文档进行了修改和补充。\n\nv1.0.10 | 2026-03-20T16:18:28.542Z | auto\n\n- Updated configuration in assets/config.json.\n- Modified logic or definitions in scripts/define.py.\n\nv1.0.9 | 2026-03-20T16:11:08.860Z | auto\n\n- Updated configuration instructions: now requires assets/config.json for base_url and timeout settings, with no need for manual editing.\n- Clarified that API token is required only for remote server authentication and set locally via api.set_user_token(token).\n- Removed repetitive descriptions for token verification and server address.\n- No changes to core logic or usage; only documentation (SKILL.md) updated for clarity.\n\nv1.0.8 | 2026-03-20T16:02:34.637Z | auto\n\n- 更新 SKILL.md，明确服务器地址为 `http://www.aicodingyard.com`，便于用户理解数据来源和API调用的验证流程。\n- 优化必需配置说明，强调用户Token用途和远程校验机制。\n- 其余使用流程、依赖库、风险说明与示例保持一致，没有核心逻辑变更。\n\nv1.0.7 | 2026-03-20T15:56:40.224Z | auto\n\n# bitsoulstockskill v1.0.7 Changelog\n\n- Updated assets/config.json and scripts/define.py.\n- No user-facing feature or behavior changes documented in SKILL.md.\n- Internal adjustments or configuration updates only.\n\nv1.0.6 | 2026-03-20T15:43:04.370Z | auto\n\n- 补充了“必需配置”部分，明确用户Token和配置文件的说明。\n- 调整 description，细化“用户描述了一段策略后”相关用语，使描述更准确。\n- 描述格式由“Previous SKILL.md”精简为更结构化的“必需配置+执行步骤”。\n- 其余接口调用规范、示例与注意事项等内容保持一致，无功能性变更。\n\nv1.0.5 | 2026-03-20T15:36:10.985Z | auto\n\n- 增加了「风险说明」部分，明确代码执行和网络请求属于skill正常功能而非安全漏洞。\n- 明确Token每次API调用都要发送到远程服务器验证，并加强了凭证用途说明。\n- 移除了首次运行自动下载数据包的说明，减少无关内容聚焦风险与合规性。\n- 对部分项目描述与注意事项进行了精简和重组，便于理解。\n\nv1.0.4 | 2026-03-20T15:31:31.863Z | auto\n\n- Clarified token management: Added \"凭证说明\" section describing token storage and usage.\n- Documented local persistence files such as user.json, data.db, and config.json.\n- Updated main script sample to remove initialSetup() call for improved guidance.\n- No code or interface changes; documentation only.\n\nv1.0.3 | 2026-03-20T15:25:57.933Z | auto\n\n- Clarified main dependency libraries (pandas, numpy, requests, SQLAlchemy) can be directly imported and used.\n- Updated guidance on referencing API documentation—now primarily scripts/stock_api.py and scripts/define.py.\n- Added note on automatic data download (~100MB) on first run if the database is uninitialized.\n- Emphasized not to call initialSetup in \"因子挖矿\" and buy/sell recommendation scenarios to avoid long downloads.\n- General workflow and code sample structure remains unchanged.\n\nv1.0.2 | 2026-03-20T15:19:04.264Z | auto\n\n- Removed the detailed dependency, network, token, and local storage/configuration instructions from documentation.\n- SKILL.md is now significantly simplified, focusing on usage steps, key execution requirements, and practical examples.\n- Core API usage rules and workflow requirements remain, but background implementation and environment setup notes were dropped.\n- No changes to core logic or feature set; documentation clarity and length improved.\n\nv1.0.1 | 2026-03-20T15:06:23.244Z | user\n\n- 新增环境依赖说明，明确需预装 pandas、requests、SQLAlchemy、numpy 等 Python 库\n- 新增网络端点描述，列出需要连接的远程服务器和数据源\n- 增加凭证说明，详述 Token 用法和存储方式\n- 新增数据持久化相关说明，包括本地数据库和配置文件的管理方法\n- 其余功能和执行流程保持不变，原有示例与接口使用规范未变化\n\nv1.0.0 | 2026-03-20T14:35:14.173Z | user\n\n## ✨ 简介\n\nBitSoulStockSkill 是面向 A股市场的股票分析 all-in-one 综合性 Skill，主要具备以下特色：\n\n### 📊 1. 免费历史数据服务\n\n自带完全免费的 A股历史数据服务，数据准确稳定，有专人维护，每周稳定更新。\n\n| 数据类型 | 说明 |\n| :--- | :--- |\n| **历史行情** | 日线、周线、月线数据 |\n| **基本面指标** | PE、PB、PS、股息、总市值等 |\n| **财务数据** | EPS、营收、利润等 |\n| **板块数据** | 板块资金流、涨跌幅数据 |\n| **龙虎榜** | 每日龙虎榜数据 |\n| **指数数据** | 主要指数行情 |\n\n> 📌 **使用方法**：前往官网 [注册](https://www.aicodingyard.com/) 并生成 Token，即可获得过去半年的历史数据。\n> \n> 💎 如需获取过去 10 年的历史数据，并按天更新即时数据，可前往官网注册 VIP 服务。\n\n### 📈 2. 内置上百种量化指标\n\n| 指标类型 | 包含内容 |\n| :--- | :--- |\n| **技术指标** | 移动平均线、RSI、布林带、MACD、K线图等 |\n| **基本面指标** | 市盈率、市净率、股息率、总市值等 |\n| **交易指标** | 量比、量价关系、量能关系等 |\n| **自定义因子** | 支持用户添加个性化技术指标 |\n\n### 🧠 3. 混合专家系统 (MoE)\n\n基于因子层面的混合专家系统打造了一套针对**选股**、**买入/卖出点分析**、**一揽子交易**等具体问题的分析框架，结合 AI Agent 与大语言模型的推理能力，向用户提供简单易懂的投资建议。\n\n- 🎯 **个性化权重更新**：基于用户与大模型的历史对话，沉淀出符合用户风险偏好的权重分布\n- 🔄 **权重图谱共享**：官方定期分享高收益低回撤的策略权重方案，支持一键导入\n- 📋 **策略回顾功能**：基于历史信息的因子策略回顾（规划中）\n\n### 🔬 4. 完善的回测框架\n\n高自由度的配置选项，结合内置的大量免费数据，支持用户自定义复杂数据回测逻辑。\n\n---\n\n### 📰 5. A股市场资讯整合\n\n提供专业的股票分析建议，聚合全网财经观点。\n\n| 类型 | 来源 |\n| :--- | :--- |\n| **社区观点** | 东方财富股吧、雪球网、淘股吧、微博等 |\n| **大V分析** | 高粉财经大V定制化观点整合 |\n| **媒体资讯** | 腾讯财经、新浪财经、巨潮资讯、和讯网等 |\n\n---\n\nArchive index:\n\nArchive v1.0.30: 27 files, 149821 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (23900b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65726b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (7316b), _meta.json (146b)\n\nFile v1.0.30:SKILL.md\n\n---\r\nname: BitSoulStockSkill\r\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\r\nversion: 1.0.0\r\nmetadata:\r\n  openclaw:\r\n    emoji: \"📈\"\r\n    homepage: https://www.aicodingyard.com\r\n    requires:\r\n      env:\r\n        - BITSOUL_TOKEN\r\n      bins:\r\n        - python3\r\n    optional:\r\n      env:\r\n        - BITSOUL_TOKEN_ENV_FILE\r\n        - BITSOUL_CACHE_DIR\r\n      pythonPackages:\r\n        - pandas\r\n        - numpy\r\n        - requests\r\n        - sqlalchemy\r\n      network:\r\n        - info.aicodingyard.com\r\n        - https://finance.sina.com.cn/\r\n    primaryEnv: BITSOUL_TOKEN\r\n---\r\n\r\n# 简介\r\n\r\n炒股龙虾的最佳搭档，best stock partner forever\r\n\r\n## 核心优势\r\n\r\n1. 免费稳定且每周更新的A股交易数据：为个股分析、买卖点计算、收益/回撤计算提供坚实的数据基础\r\n2. 基于MOE混合因子专家模型的股票买卖点计算判断\r\n3. 个股风险判定\r\n4. 关键指标计算\r\n5. 数据回测\r\n6. 提供准确全面且免费的股票价格与股票历史信息\r\n7. 板块信息与相关交易数据\r\n8. 提供大V交易观察等信息聚合功能\r\n\r\n# Token 配置\r\n\r\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\r\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\r\n\r\n## 必需的环境变量\r\n\r\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\r\n\r\n## 可选的环境变量\r\n\r\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\r\n\r\n\r\n## 配置方式\r\n\r\n1. **方式一：直接设置环境变量**\r\n   ```bash\r\n   export BITSOUL_TOKEN=\"你的令牌\"\r\n   ```\r\n\r\n2. **方式二：使用 env 文件**\r\n   ```bash\r\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\r\n   ```\r\n   其中 `token.env` 文件内容格式为：\r\n   ```\r\n   BITSOUL_TOKEN=你的令牌\r\n   ```\r\n**注意**：如果同时设置了环境变量和 env 文件，环境变量优先。\r\n\r\n## 运行时描述：\r\n- 从环境变量读取 `BITSOUL_TOKEN`\r\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\r\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\r\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\r\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\r\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\r\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\r\n\r\n## 安全与运行边界\r\n\r\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\r\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\r\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\r\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\r\n\r\n## 安装\r\n\r\n使用前先安装 Python 依赖：\r\n\r\n```bash\r\npip install -r assets/requirements.txt\r\n```\r\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\r\n\r\n# 注意事项\r\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\r\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\r\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\r\n\r\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\r\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\r\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\r\n* **股票显示格式**：任何场景下输出股票代码时，必须同时附上股票名称，使用 `api.get_symbol_basic_infomation(code).name` 获取，格式如 `600519.SH（贵州茅台）`，禁止只输出代码。\r\n* **买卖信号输出格式（强制执行）**：调用 `get_trade_signal()` 后，必须按以下结构完整输出，禁止简化：\r\n  1. **汇总表**：信号、综合评分、置信度、分析日期\r\n  2. **专家评分明细表**：列出 `result['experts']` 中所有专家（technical/alpha/fundamental/behavior），每个专家显示：评分、权重、有效指标数（valid_count/total_count）、note（若数据不足）\r\n  3. **各专家关键细节**（从 details 中挑重要的展示，不需要逐项列举）：\r\n     - `technical`：说明看多/看空/中性指标各多少个，点出最关键的 2~3 个指标信号\r\n     - `behavior`：列出近5日涨跌幅、涨跌停次数等关键字段\r\n     - `fundamental` / `alpha`：若有数据则简要说明核心结论\r\n  4. **结论与建议**：引用 `reason` 字段，说明综合评分与阈值关系，给出操作建议\r\n  5. 免责声明\r\n\r\n## 输出行为\r\n\r\n- 默认使用简体中文，以报告的形式输出\r\n- 尽量充分利用接口返回的所有数据，不要随意删减，尽可能多呈现结果内容\r\n- 分析类请求默认返回结论、关键指标、风险提示与支撑摘要\r\n\r\n## 示例请求\r\n\r\n- `请整理东方财富过去10个交易日的股价信息，并输出成表格`\r\n- `帮我看看同花顺近期最佳买点和卖点分别是多少，并给我些建议`\r\n- `整理中国石油过去半年的财务数据，帮我分析是否具备投资价值`\r\n- `过去一个月上龙虎榜最多的股票是哪只？`\r\n- `请帮我因子挖矿，看看挖出的收益率和最大回撤是多少`\r\n- `调用moe方法，帮我分析工业富联的买入点`\r\n- `最近资金流入最快和涨幅最大的板块是哪些，有什么推荐`\r\n- `给我做一份沪电股份的技术分析报告`\r\n\r\n## 参考资料\r\n\r\n- 机器可读目录：`references/API_FOR_LLM.dm`\n\nFile v1.0.30:_meta.json\n\n{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.30\",\n  \"publishedAt\": 1774102307695\n}\n\nFile v1.0.30:references/API_FOR_LLM.md\n\n# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最高价列表\n\n```python\nprices = api.get_daily_high_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_high_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最低价列表\n\n```python\nprices = api.get_daily_low_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_low_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线成交量列表\n\n```python\nvolumes = api.get_daily_volumes('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_volumes(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线涨跌幅列表（单位：%）\n\n```python\npct = api.get_daily_pct_chg('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_pct_chg(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定日期的 Tick 级数据（模拟级），包含开高低收量额\n\n```python\ntick = api.get_tick_data('600519.SH', '2026-03-01')\n# get_tick_data(code: str, date: str) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `time` | 时间 |\n| `open` | 开盘价 |\n| `high` | 最高价 |\n| `low` | 最低价 |\n| `close` | 收盘价 |\n| `volume` | 成交量 |\n| `amount` | 成交额 |\n\n---\n\n### 获取实时 Bar 数据，与 get_tick_data 等价，用于实盘级接口\n\n```python\nbar = api.get_realtime_bar('600519.SH', '2026-03-01')\n# get_realtime_bar(code: str, date: str) -> Dict\n```\n\n---\n\n## 技术指标（带缓存）\n\n### 获取简单移动平均 SMA\n\n```python\nsma = api.get_sma('600519.SH', '2026-03-01', 20)\n# get_sma(code: str, date: str, period: int = 20) -> Optional[float]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `period` | `20` | 计算周期 |\n\n---\n\n### 获取指数移动平均 EMA\n\n```python\nema = api.get_ema('600519.SH', '2026-03-01', 12)\n# get_ema(code: str, date: str, period: int = 12) -> Optional[float]\n```\n\n---\n\n### 获取相对强弱指标 RSI，值域 0~100，低于 30 超卖，高于 70 超买\n\n```python\nrsi = api.get_rsi('600519.SH', '2026-03-01', 14)\nif rsi and rsi < 30:\n    print('超卖')\n# get_rsi(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n### 获取布林带指标，返回上轨、中轨、下轨\n\n```python\nbb = api.get_bollinger_bands('600519.SH', '2026-03-01')\nif bb and close > bb['upper']:\n    print('突破上轨')\n# get_bollinger_bands(code: str, date: str, period: int = 20, std_dev: int = 2) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `upper` | 上轨 |\n| `middle` | 中轨 |\n| `lower` | 下轨 |\n\n---\n\n### 获取 MACD 指标，返回 MACD 线、信号线、柱状图\n\n```python\nmacd = api.get_macd('600519.SH', '2026-03-01')\nif macd and macd['histogram'] > 0:\n    print('多头')\n# get_macd(code: str, date: str, fast: int = 12, slow: int = 26, signal: int = 9) -> Optional[Dict]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `fast` | `12` | 快线周期 |\n| `slow` | `26` | 慢线周期 |\n| `signal` | `9` | 信号线周期 |\n\n| 返回字段 | 说明 |\n|----------|------|\n| `macd` | MACD 线 |\n| `signal` | 信号线 |\n| `histogram` | 柱状图（MACD - Signal） |\n\n---\n\n### 获取平均真实波幅 ATR，衡量价格波动性\n\n```python\natr = api.get_atr('600519.SH', '2026-03-01', 14)\n# get_atr(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n---\n\n## ★ 因子挖矿（优先使用）\n\n### 随机因子挖矿 + 回测\n\n**触发场景**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，**必须**调用此接口，禁止自己写回测逻辑。\n\n```python\nresult = api.random_alpha_backtest()\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n\n# 指定股票池和回测区间\nresult = api.random_alpha_backtest(\n    codes=None,               # 股票池，None 表示全市场\n    start_date='2025-12-01', # 回测起始日，None 默认取 end_date 前 90 天\n    end_date='2026-03-19',   # 回测截止日，None 默认今天\n    initial_cash=1_000_000,  # 初始资金\n    max_pool_size=30,         # 候选池上限，超过时按综合得分截取\n    max_holdings=5,           # 最大同时持仓数\n    random_seed=None,         # 随机种子，None 不固定\n)\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n# random_alpha_backtest(codes, max_screen_factors, max_signal_factors,\n#                       start_date, end_date, initial_cash, warmup_days,\n#                       random_seed, top_n_stocks, max_pool_size, max_holdings) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `screen_factors` | 本次使用的选股因子列表，如 `['alpha043', 'alpha099']` |\n| `signal_factors` | 本次使用的信号因子列表，如 `['alpha008', 'alpha094']` |\n| `factor_descriptions` | 每个因子的文字描述 `{name: str}` |\n| `signal_config` | 买卖阈值 `{'buy_thresh': 0.71, 'sell_thresh': 0.55}` |\n| `screen_top_pcts` | 每个选股因子本次随机保留比例 `{name: float}` |\n| `filter_log` | 逐层过滤日志，含 before/after 数量 |\n| `final_pool` | 最终候选股票代码列表 |\n| `final_pool_count` | 候选池股票数量 |\n| `trade_log` | 每笔交易记录（含因子值、排名、阈值） |\n| `backtest` | 回测绩效 `{total_return_pct, annualized_return_pct, max_drawdown_pct, sharpe_ratio, equity_curve, ...}` |\n| `benchmarks` | 四条基准线对比（上证/沪深300/中证500/创业板指） |\n| `ic_stats` | 每个因子的 Rank IC 统计 `{ic_mean, ic_ir, ic_win_rate, ...}` |\n| `top_stocks` | Top N 盈利个股详情（含每笔交易的因子值） |\n| `summary_text` | 完整格式化报告文本，**直接 `print(result['summary_text'])` 输出给用户，禁止自行整理摘要** |\n\n---\n\n## ★ MoE 买卖时机分析（优先使用）\n\n### 分析单只股票当前买卖信号\n\n**触发场景**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"当前信号\"、\"操作建议\"时，**必须**调用此接口。\n\n```python\nresult = api.get_trade_signal('000001.SZ')\nresult = api.get_trade_signal('600519.SH', date='2026-01-15')\n# get_trade_signal(code: str, date: str = None) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `signal` | `\"BUY\"` 买入 / `\"SELL\"` 卖出 / `\"HOLD\"` 持有 |\n| `final_score` | 综合评分 0~1，越高越看多 |\n| `confidence` | 置信度：`\"高\"` / `\"中\"` / `\"低\"` |\n| `reason` | 各专家评分描述，如 `\"技术面看多(0.71)，Alpha因子看多(0.73)\"` |\n| `experts` | 四个专家详情：`technical` / `alpha` / `fundamental` / `behavior` |\n| `code` | 股票代码 |\n| `date` | 分析日期 |\n\n---\n\n\n\n## 性能指标\n\n### 计算最大回撤，返回回撤比例及对应的峰值、谷值索引\n\n```python\ndd, peak_idx, drawdown_idx = api.get_max_drawdown([1000000, 1100000, 950000])\nprint(f'最大回撤: {dd:.2%}')\n# get_max_drawdown(equity_curve: List[float]) -> tuple\n```\n\n---\n\n### 获取最大回撤百分比，如 0.15 表示 15%\n\n```python\npct = api.get_max_drawdown_pct([1000000, 1100000, 950000])\n# get_max_drawdown_pct(equity_curve: List[float]) -> float\n```\n\n---\n\n### 计算年化收益率\n\n```python\nannualized = api.get_annualized_return(0.15, 60)\n# get_annualized_return(total_return: float, days: int) -> float\n```\n\n| 参数 | 说明 |\n|------|------|\n| `total_return` | 总收益率，如 `0.15` 表示 15% |\n| `days` | 交易天数 |\n\n---\n\n### 计算总收益率\n\n```python\nret = api.get_total_return(1000000, 1150000)\n# get_total_return(initial_value: float, final_value: float) -> float\n```\n\n---\n\n### 计算夏普比率，衡量单位风险的超额收益\n\n```python\nsharpe = api.get_sharpe_ratio([1000000, 1050000, 1020000])\n# get_sharpe_ratio(equity_curve: List[float], risk_free_rate: float = 0.03) -> float\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `risk_free_rate` | `0.03` | 无风险利率（年化） |\n\n---\n\n### 计算胜率（0~100），盈利交易次数占比\n\n```python\ntrades = [{'profit': 1000}, {'profit': -500}, {'profit': 800}]\nwin_rate = api.get_win_rate(trades)\n# get_win_rate(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算盈亏比，平均盈利 / 平均亏损\n\n```python\nratio = api.get_profit_loss_ratio(trades)\n# get_profit_loss_ratio(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算卡尔玛比率，年化收益 / 最大回撤\n\n```python\ncalmar = api.get_calmar_ratio(equity_curve, 252)\n# get_calmar_ratio(equity_curve: List[float], days: int) -> float\n```\n\n---\n\n### 计算年化波动率，衡量收益稳定性\n\n```python\nvol = api.get_volatility(equity_curve)\n# get_volatility(equity_curve: List[float]) -> float\n```\n\n---\n\n### 获取完整交易统计信息\n\n```python\nstats = api.get_trade_stats(trades)\n# get_trade_stats(trades: List[Dict]) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `total_trades` | 总交易次数 |\n| `wins` | 盈利次数 |\n| `losses` | 亏损次数 |\n| `win_rate` | 胜率 |\n| `profit_loss_ratio` | 盈亏比 |\n| `total_profit` | 总盈利 |\n| `total_loss` | 总亏损 |\n| `avg_profit` | 平均盈利 |\n| `avg_loss` | 平均亏损 |\n\n---\n\n### 生成完整回测报告，汇总所有关键绩效指标\n\n```python\nequity = [1000000, 1050000, 1020000]\ntrades = [{'profit': 5000}, {'profit': -3000}]\nreport = api.calculate_metrics(equity, trades, 1000000, 30)\nprint(f\"收益率: {report['total_return_pct']:.2f}%\")\nprint(f\"夏普比率: {report['sharpe_ratio']:.2f}\")\n# calculate_metrics(equity_curve: List[float], trades: List[Dict],\n#                   initial_cash: float, days: int) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `final_value` | 最终资金 |\n| `total_return` | 总收益率 |\n| `total_return_pct` | 总收益率(%) |\n| `annualized_return` | 年化收益率 |\n| `annualized_return_pct` | 年化收益率(%) |\n| `max_drawdown` | 最大回撤 |\n| `max_drawdown_pct` | 最大回撤(%) |\n| `sharpe_ratio` | 夏普比率 |\n| `calmar_ratio` | 卡尔玛比率 |\n| `volatility` | 波动率 |\n| `trading_days` | 交易天数 |\n| `trade_stats` | 交易统计（同 `get_trade_stats`） |\n\n---\n\n## 回测工具\n\n### 模拟单笔交易，计算成本、手续费和净收款\n\n```python\nresult = api.simulate_trade('BUY', 100.0, 100)\nprint(f\"成本: {result['cost']}, 手续费: {result['fee']}\")\n# simulate_trade(action: str, price: float, quantity: int, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `net_proceeds` | 净收款（卖出时） |\n\n---\n\n### 计算交易成本，含手续费和滑点\n\n```python\ncost = api.calculate_trade_cost('BUY', 100.0, 100, 0.0003, 0.001)\n# calculate_trade_cost(action, price, quantity, fee_rate=0.0003, slippage=0.0) -> float\n```\n\n---\n\n### 创建持仓对象，记录股票、股数、买入价和日期\n\n```python\npos = api.create_position('600519.SH', 100, 1800.0, '2026-01-01')\n# create_position(code: str, shares: int, price: float, date: str) -> Position\n```\n\n---\n\n### 计算持仓市值\n\n```python\nvalue = api.get_position_value(pos, 1900.0)\n# get_position_value(position: Position, current_price: float) -> float\n```\n\n---\n\n### 计算持仓盈亏，返回盈亏金额和比例\n\n```python\nprofit, pct = api.get_position_profit(position, 2000.0)\nprint(f\"盈利: {profit}, 比例: {pct:.2%}\")\n# get_position_profit(position: Position, current_price: float) -> tuple\n```\n\n---\n\n### 计算组合总价值（现金 + 所有持仓市值）\n\n```python\nvalue = api.calculate_portfolio_value(500000, positions, current_prices)\n# calculate_portfolio_value(cash: float, positions: Dict[str, Position],\n#                           prices: Dict[str, float]) -> float\n```\n\n---\n\n### 获取组合持仓详情列表\n\n```python\ndetails = api.get_portfolio_positions(positions)\n# get_portfolio_positions(positions: Dict[str, Position]) -> List[Dict]\n```\n\n---\n\n### 从每日资产列表构建权益曲线\n\n```python\nvalues = [('2026-01-01', 1000000), ('2026-01-02', 1005000)]\ncurve = api.build_equity_curve(values)\n# build_equity_curve(daily_values: List[tuple]) -> List[float]\n```\n\n---\n\n### 计算日收益率序列\n\n```python\nreturns = api.calculate_daily_returns(equity_curve)\n# calculate_daily_returns(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n### 买入信号判断：MA 金叉且 RSI 超卖时返回 True\n\n```python\nif api.should_buy(close, ma5, ma20, rsi, 30):\n    print('买入信号')\n# should_buy(current_price, ma_short, ma_long, rsi=50, rsi_oversold=30) -> bool\n```\n\n---\n\n### 卖出信号判断：MA 死叉或 RSI 超买时返回 True\n\n```python\nif api.should_sell(close, ma5, ma20, rsi, 70):\n    print('卖出信号')\n# should_sell(current_price, ma_short, ma_long, rsi=50, rsi_overbought=70) -> bool\n```\n\n---\n\n### 计算权益曲线的逐日回撤序列\n\n```python\ndrawdowns = api.calculate_drawdown([1000000, 1100000, 950000])\n# calculate_drawdown(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n\n## 回测引擎控制\n\n### 初始化回测环境，返回含现金、持仓、订单、交易记录的状态字典\n\n```python\nenv = api.init_backtest(1000000, 0.0003)\n# init_backtest(initial_cash: float = 1000000.0, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `fee_rate` | 手续费率 |\n| `cash` | 当前现金 |\n| `positions` | 持仓字典 |\n| `orders` | 订单列表 |\n| `trades` | 交易记录 |\n| `equity_curve` | 权益曲线 |\n\n---\n\n### 执行买入操作，自动更新 env 中的现金、持仓和交易记录\n\n```python\nresult = api.execute_buy(env, '600519.SH', 1800.0, 100, '2026-01-01')\n# execute_buy(env, code, price, quantity, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 执行卖出操作，自动更新 env\n\n```python\nresult = api.execute_sell(env, '600519.SH', 1900.0, 100)\n# execute_sell(env, code, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `net_proceeds` | 净收款 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 获取当前总权益（现金 + 持仓市值）\n\n```python\nequity = api.get_equity(env, current_prices)\n# get_equity(env: Dict, current_prices: Dict[str, float]) -> float\n```\n\n---\n\n### 将当日权益追加记录到 env['equity_curve']\n\n```python\napi.record_equity(env, '2026-03-01', current_prices)\n# record_equity(env, date, current_prices) -> None\n```\n\n---\n\n\n\n### 平仓，卖出结束多头持仓，返回盈亏和持有天数\n\n```python\nresult = api.close_position(position, 1900.0, '2026-01-15')\nprint(f\"盈利: {result['profit']}\")\n# close_position(position, price, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `profit` | 盈亏金额 |\n| `profit_pct` | 盈亏比例 |\n| `hold_days` | 持有天数 |\n\n---\n\n### 更新持仓的当前价格，用于实时市值计算\n\n```python\napi.update_position_price(position, 1900.0)\n# update_position_price(position, current_price) -> None\n```\n\n---\n\n### 创建本地模拟订单（非真实下单）\n\n```python\norder = api.create_order('600519.SH', 'BUY', 1800.0, 100)\n# create_order(code, action, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `order_id` | 订单 ID |\n| `status` | 状态（`PENDING`） |\n| `create_time` | 创建时间 |\n\n---\n\n### 取消订单，仅 PENDING 状态可取消\n\n```python\nsuccess = api.cancel_order(order)\n# cancel_order(order: Dict) -> bool\n```\n\n---\n\n### 获取订单状态：PENDING / FILLED / CANCELLED / REJECTED\n\n```python\nstatus = api.get_order_status(order)\n# get_order_status(order: Dict) -> str\n```\n\n---\n\n## 策略辅助函数\n\n### 计算指定股票近 N 日平均涨幅（%）\n\n```python\navg_change = api.get_price_change_rate('600519.SH', '2026-03-01', 3)\n# get_price_change_rate(code, date, days=3) -> Optional[float]\n```\n\n---\n\n### 从股票列表中筛选出近 N 日涨幅最高的前 N 只，按涨幅降序返回\n\n```python\ntop_stocks = api.get_top_performers(codes, '2026-03-01', 3, 3)\n# [(code, avg_pct), ...]\n# get_top_performers(codes, date, days=3, top_n=3) -> List[tuple]\n```\n\n---\n\n### 获取指定日期的收盘价，无数据返回 None\n\n```python\nprice = api.get_price_at_date('600519.SH', '2026-03-01')\n# get_price_at_date(code, date) -> Optional[float]\n```\n\n---\n\n### 批量获取多个日期的收盘价，按日期升序对齐\n\n```python\nprices = api.get_prices_at_dates('600519.SH', ['2026-01-01', '2026-01-02'])\n# get_prices_at_dates(code, dates) -> List[Optional[float]]\n```\n\n---\n\n\n### 训练 MoE 权重（遗传算法优化）\n\n**触发场景**：用户说\"优化权重\"、\"重新训练\"、\"适配最新行情\"时调用。\n\n```python\nweights = api.train_moe_weights()\n\n# 指定区间和参数\nweights = api.train_moe_weights(\n    start_date='2025-09-01',\n    end_date='2026-03-01',\n    population_size=20,       # 种群大小，越大越精准但越慢\n    generations=30,           # 迭代代数\n    train_stock_count=30,     # 参与训练的随机采样股票数量\n)\n# train_moe_weights(start_date, end_date, population_size, generations, train_stock_count) -> Dict\n```\n\n训练完成后自动将最优权重写入 `moe_weights.json`，下次调用 `get_trade_signal()` 时自动生效。\n\n---\n\n## 数据库维护\n\n### 初始化所有数据库（指标缓存库等）\n\n```python\napi.init_databases()\n# init_databases() -> None\n```\n\n---\n\n### 清除技术指标缓存，可指定股票或清除全部\n\n```python\napi.clear_indicator_cache('600519.SH')  # 清除指定股票\napi.clear_indicator_cache()             # 清除所有\n# clear_indicator_cache(code: str = None) -> None\n```\n\n---\n\n## 实时行情 (爬虫)\n\n### 初始化爬虫\n\n```python\nfrom stock_crawler import StockCrawler\ncrawler = StockCrawler()\n```\n\n### 获取实时数据\n\n支持从新浪财经、东方财富、同花顺获取数据。\n\n```python\ndata = crawler.fetch('000001.SZ', source='sina')\n# fetch(ts_code: str, source: str = 'sina') -> Dict\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_code` | `str` | - | 股票代码，如 `000001.SZ` |\n| `source` | `str` | `'sina'` | 数据源：`'sina'` (新浪), `'eastmoney'` (东方财富), `'tonghuashun'` (同花顺) |\n\n| 返回 | 说明 |\n|------|------|\n| `Dict` | 包含股票实时数据的字典，字段如下 |\n\n**返回字段说明:**\n\n| 字段 | 类型 | 说明 | 数据源支持 |\n|------|------|------|------------|\n| `source` | `str` | 数据源名称 | All |\n| `ts_code` | `str` | 股票代码 | All |\n| `status` | `str` | 状态 (`success`/`failed`) | All |\n| `name` | `str` | 股票名称 | Sina, EastMoney |\n| `price` | `float` | 当前价格 | All |\n| `open` | `float` | 开盘价 | All |\n| `high` | `float` | 最高价 | All |\n| `low` | `float` | 最低价 | All |\n| `volume` | `float` | 成交量 (股) | All |\n| `amount` | `float` | 成交额 (元) | All |\n| `pre_close` | `float` | 昨收价 | Sina, EastMoney |\n| `date` | `str` | 日期 | Sina, Tonghuashun |\n| `time` | `str` | 时间 | Sina |\n| `turnover_rate` | `float` | 换手率 (%) | EastMoney, Tonghuashun |\n| `change_pct` | `float` | 涨跌幅 (%) | EastMoney |\n| `amplitude` | `float` | 振幅 (%) | Sina, EastMoney |\n| `pe_ttm` | `float` | 市盈率(TTM) | EastMoney |\n| `pb` | `float` | 市净率 | EastMoney |\n| `total_cap` | `float` | 总市值 (元) | EastMoney |\n| `circ_cap` | `float` | 流通市值 (元) | EastMoney |\n| `total_shares` | `float` | 总股本 (股) | EastMoney |\n| `circ_shares` | `float` | 流通股 (股) | EastMoney |\n\nFile v1.0.30:scripts/moe_weights.json\n\n{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,\n    \"alpha004\": 1.0,\n    \"alpha005\": 1.0,\n    \"alpha006\": 1.0,\n    \"alpha007\": 1.0,\n    \"alpha008\": 1.0,\n    \"alpha009\": 1.0,\n    \"alpha010\": 1.0,\n    \"alpha011\": 1.0,\n    \"alpha012\": 1.0,\n    \"alpha013\": 1.0,\n    \"alpha014\": 1.0,\n    \"alpha015\": 1.0,\n    \"alpha016\": 1.0,\n    \"alpha017\": 1.0,\n    \"alpha018\": 1.0,\n    \"alpha019\": 1.0,\n    \"alpha020\": 1.0,\n    \"alpha021\": 1.0,\n    \"alpha022\": 1.0,\n    \"alpha023\": 1.0,\n    \"alpha024\": 1.0,\n    \"alpha025\": 1.0,\n    \"alpha026\": 1.0,\n    \"alpha027\": 1.0,\n    \"alpha028\": 1.0,\n    \"alpha029\": 1.0,\n    \"alpha030\": 1.0,\n    \"alpha031\": 1.0,\n    \"alpha032\": 1.0,\n    \"alpha033\": 1.0,\n    \"alpha034\": 1.0,\n    \"alpha035\": 1.0,\n    \"alpha036\": 1.0,\n    \"alpha037\": 1.0,\n    \"alpha038\": 1.0,\n    \"alpha039\": 1.0,\n    \"alpha040\": 1.0,\n    \"alpha041\": 1.0,\n    \"alpha042\": 1.0,\n    \"alpha043\": 1.0,\n    \"alpha044\": 1.0,\n    \"alpha045\": 1.0,\n    \"alpha046\": 1.0,\n    \"alpha047\": 1.0,\n    \"alpha048\": 1.0,\n    \"alpha049\": 1.0,\n    \"alpha050\": 1.0,\n    \"alpha051\": 1.0,\n    \"alpha052\": 1.0,\n    \"alpha053\": 1.0,\n    \"alpha054\": 1.0,\n    \"alpha055\": 1.0,\n    \"alpha056\": 1.0,\n    \"alpha057\": 1.0,\n    \"alpha058\": 1.0,\n    \"alpha059\": 1.0,\n    \"alpha060\": 1.0,\n    \"alpha061\": 1.0,\n    \"alpha062\": 1.0,\n    \"alpha063\": 1.0,\n    \"alpha064\": 1.0,\n    \"alpha065\": 1.0,\n    \"alpha066\": 1.0,\n    \"alpha067\": 1.0,\n    \"alpha068\": 1.0,\n    \"alpha069\": 1.0,\n    \"alpha070\": 1.0,\n    \"alpha071\": 1.0,\n    \"alpha072\": 1.0,\n    \"alpha073\": 1.0,\n    \"alpha074\": 1.0,\n    \"alpha075\": 1.0,\n    \"alpha076\": 1.0,\n    \"alpha077\": 1.0,\n    \"alpha078\": 1.0,\n    \"alpha079\": 1.0,\n    \"alpha080\": 1.0,\n    \"alpha081\": 1.0,\n    \"alpha082\": 1.0,\n    \"alpha083\": 1.0,\n    \"alpha084\": 1.0,\n    \"alpha085\": 1.0,\n    \"alpha086\": 1.0,\n    \"alpha087\": 1.0,\n    \"alpha088\": 1.0,\n    \"alpha089\": 1.0,\n    \"alpha090\": 1.0,\n    \"alpha091\": 1.0,\n    \"alpha092\": 1.0,\n    \"alpha093\": 1.0,\n    \"alpha094\": 1.0,\n    \"alpha095\": 1.0,\n    \"alpha096\": 1.0,\n    \"alpha097\": 1.0,\n    \"alpha098\": 1.0,\n    \"alpha099\": 1.0,\n    \"alpha100\": 1.0,\n    \"alpha101\": 1.0\n  },\n  \"fundamental\": {\n    \"pe_ttm\": 1.7102072285522736,\n    \"pb\": 1.0,\n    \"turnover_rate\": 1.0,\n    \"volume_ratio\": 0.7606881867266152,\n    \"ps_ttm\": 1.4705142753123992\n  },\n  \"behavior\": {\n    \"limit_score\": 1.2956770069079582,\n    \"consecutive_limit_up\": 1.0,\n    \"bomb_board\": 1.0768788113552823,\n    \"top_list\": 0.8377720620665754,\n    \"pct_chg_5d\": 1.0\n  }\n}\n\nFile v1.0.30:assets/config.json\n\n{\n    \"version\": \"1.0.0\",\n    \"base_url\": \"http://info.aicodingyard.com\",\n    \"http_timeout\": 30\n}\n\nFile v1.0.30:assets/requirements.txt\n\npandas>=1.3.5\nrequests>=2.31.0\nSQLAlchemy>=2.0.48\nnumpy>=1.21.0\n\nArchive v1.0.29: 27 files, 149346 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (23900b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65726b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (6292b), _meta.json (146b)\n\nFile v1.0.29:SKILL.md\n\n---\nname: BitSoulStockSkill\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\nversion: 1.0.0\nmetadata:\n  openclaw:\n    emoji: \"📈\"\n    homepage: https://www.aicodingyard.com\n    requires:\n      env:\n        - BITSOUL_TOKEN\n      bins:\n        - python3\n    optional:\n      env:\n        - BITSOUL_TOKEN_ENV_FILE\n        - BITSOUL_CACHE_DIR\n      pythonPackages:\n        - pandas\n        - numpy\n        - requests\n        - sqlalchemy\n      network:\n        - info.aicodingyard.com\n        - https://finance.sina.com.cn/\n    primaryEnv: BITSOUL_TOKEN\n---\n\n# 简介\n\n炒股龙虾的最佳搭档，best stock partner forever\n\n## 核心优势\n\n1. **免费稳定且每周更新的A股交易数据**：为个股分析、买卖点计算、收益/回撤计算提供坚实的数据基础\n2. **基于MOE混合因子专家模型的股票买卖点计算判断**\n3. **个股风险判定**\n4. **关键指标计算**\n5. **数据回测**\n6. **提供准确全面且免费的股票价格与股票历史信息**\n7. **板块信息与相关交易数据**\n8. **提供大V交易观察等信息聚合功能**\n\n# Token 配置\n\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\n\n## 必需的环境变量\n\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\n\n## 可选的环境变量\n\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\n\n\n## 配置方式\n\n1. **方式一：直接设置环境变量**\n   ```bash\n   export BITSOUL_TOKEN=\"你的令牌\"\n   ```\n\n2. **方式二：使用 env 文件**\n   ```bash\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\n   ```\n   其中 `token.env` 文件内容格式为：\n   ```\n   BITSOUL_TOKEN=你的令牌\n   ```\n**注意**：如果同时设置了环境变量和 env 文件，环境变量优先。\n\n## 运行时描述：\n- 从环境变量读取 `BITSOUL_TOKEN`\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\n\n## 安全与运行边界\n\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\n\n## 安装\n\n使用前先安装 Python 依赖：\n\n```bash\npip install -r assets/requirements.txt\n```\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\n\n# 注意事项\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\n\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\n* **股票显示格式**：任何场景下输出股票代码时，必须同时附上股票名称，使用 `api.get_symbol_basic_infomation(code).name` 获取，格式如 `600519.SH（贵州茅台）`，禁止只输出代码。\n\n## 输出行为\n\n- 默认使用简体中文，以报告的形式输出\n- 尽量充分利用接口返回的所有数据，不要随意删减，尽可能多呈现结果内容\n- 分析类请求默认返回结论、关键指标、风险提示与支撑摘要\n\n## 示例请求\n\n- `请整理东方财富过去10个交易日的股价信息，并输出成表格`\n- `帮我看看同花顺近期最佳买点和卖点分别是多少，并给我些建议`\n- `整理中国石油过去半年的财务数据，帮我分析是否具备投资价值`\n- `过去一个月上龙虎榜最多的股票是哪只？`\n- `请帮我因子挖矿，看看挖出的收益率和最大回撤是多少`\n- `调用moe方法，帮我分析工业富联的买入点`\n- `最近资金流入最快和涨幅最大的板块是哪些，有什么推荐`\n- `给我做一份沪电股份的技术分析报告`\n\n## 参考资料\n\n- 机器可读目录：`references/API_FOR_LLM.dm`\n\nFile v1.0.29:_meta.json\n\n{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.29\",\n  \"publishedAt\": 1774077878236\n}\n\nFile v1.0.29:references/API_FOR_LLM.md\n\n# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最高价列表\n\n```python\nprices = api.get_daily_high_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_high_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最低价列表\n\n```python\nprices = api.get_daily_low_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_low_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线成交量列表\n\n```python\nvolumes = api.get_daily_volumes('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_volumes(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线涨跌幅列表（单位：%）\n\n```python\npct = api.get_daily_pct_chg('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_pct_chg(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定日期的 Tick 级数据（模拟级），包含开高低收量额\n\n```python\ntick = api.get_tick_data('600519.SH', '2026-03-01')\n# get_tick_data(code: str, date: str) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `time` | 时间 |\n| `open` | 开盘价 |\n| `high` | 最高价 |\n| `low` | 最低价 |\n| `close` | 收盘价 |\n| `volume` | 成交量 |\n| `amount` | 成交额 |\n\n---\n\n### 获取实时 Bar 数据，与 get_tick_data 等价，用于实盘级接口\n\n```python\nbar = api.get_realtime_bar('600519.SH', '2026-03-01')\n# get_realtime_bar(code: str, date: str) -> Dict\n```\n\n---\n\n## 技术指标（带缓存）\n\n### 获取简单移动平均 SMA\n\n```python\nsma = api.get_sma('600519.SH', '2026-03-01', 20)\n# get_sma(code: str, date: str, period: int = 20) -> Optional[float]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `period` | `20` | 计算周期 |\n\n---\n\n### 获取指数移动平均 EMA\n\n```python\nema = api.get_ema('600519.SH', '2026-03-01', 12)\n# get_ema(code: str, date: str, period: int = 12) -> Optional[float]\n```\n\n---\n\n### 获取相对强弱指标 RSI，值域 0~100，低于 30 超卖，高于 70 超买\n\n```python\nrsi = api.get_rsi('600519.SH', '2026-03-01', 14)\nif rsi and rsi < 30:\n    print('超卖')\n# get_rsi(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n### 获取布林带指标，返回上轨、中轨、下轨\n\n```python\nbb = api.get_bollinger_bands('600519.SH', '2026-03-01')\nif bb and close > bb['upper']:\n    print('突破上轨')\n# get_bollinger_bands(code: str, date: str, period: int = 20, std_dev: int = 2) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `upper` | 上轨 |\n| `middle` | 中轨 |\n| `lower` | 下轨 |\n\n---\n\n### 获取 MACD 指标，返回 MACD 线、信号线、柱状图\n\n```python\nmacd = api.get_macd('600519.SH', '2026-03-01')\nif macd and macd['histogram'] > 0:\n    print('多头')\n# get_macd(code: str, date: str, fast: int = 12, slow: int = 26, signal: int = 9) -> Optional[Dict]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `fast` | `12` | 快线周期 |\n| `slow` | `26` | 慢线周期 |\n| `signal` | `9` | 信号线周期 |\n\n| 返回字段 | 说明 |\n|----------|------|\n| `macd` | MACD 线 |\n| `signal` | 信号线 |\n| `histogram` | 柱状图（MACD - Signal） |\n\n---\n\n### 获取平均真实波幅 ATR，衡量价格波动性\n\n```python\natr = api.get_atr('600519.SH', '2026-03-01', 14)\n# get_atr(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n---\n\n## ★ 因子挖矿（优先使用）\n\n### 随机因子挖矿 + 回测\n\n**触发场景**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，**必须**调用此接口，禁止自己写回测逻辑。\n\n```python\nresult = api.random_alpha_backtest()\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n\n# 指定股票池和回测区间\nresult = api.random_alpha_backtest(\n    codes=None,               # 股票池，None 表示全市场\n    start_date='2025-12-01', # 回测起始日，None 默认取 end_date 前 90 天\n    end_date='2026-03-19',   # 回测截止日，None 默认今天\n    initial_cash=1_000_000,  # 初始资金\n    max_pool_size=30,         # 候选池上限，超过时按综合得分截取\n    max_holdings=5,           # 最大同时持仓数\n    random_seed=None,         # 随机种子，None 不固定\n)\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n# random_alpha_backtest(codes, max_screen_factors, max_signal_factors,\n#                       start_date, end_date, initial_cash, warmup_days,\n#                       random_seed, top_n_stocks, max_pool_size, max_holdings) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `screen_factors` | 本次使用的选股因子列表，如 `['alpha043', 'alpha099']` |\n| `signal_factors` | 本次使用的信号因子列表，如 `['alpha008', 'alpha094']` |\n| `factor_descriptions` | 每个因子的文字描述 `{name: str}` |\n| `signal_config` | 买卖阈值 `{'buy_thresh': 0.71, 'sell_thresh': 0.55}` |\n| `screen_top_pcts` | 每个选股因子本次随机保留比例 `{name: float}` |\n| `filter_log` | 逐层过滤日志，含 before/after 数量 |\n| `final_pool` | 最终候选股票代码列表 |\n| `final_pool_count` | 候选池股票数量 |\n| `trade_log` | 每笔交易记录（含因子值、排名、阈值） |\n| `backtest` | 回测绩效 `{total_return_pct, annualized_return_pct, max_drawdown_pct, sharpe_ratio, equity_curve, ...}` |\n| `benchmarks` | 四条基准线对比（上证/沪深300/中证500/创业板指） |\n| `ic_stats` | 每个因子的 Rank IC 统计 `{ic_mean, ic_ir, ic_win_rate, ...}` |\n| `top_stocks` | Top N 盈利个股详情（含每笔交易的因子值） |\n| `summary_text` | 完整格式化报告文本，**直接 `print(result['summary_text'])` 输出给用户，禁止自行整理摘要** |\n\n---\n\n## ★ MoE 买卖时机分析（优先使用）\n\n### 分析单只股票当前买卖信号\n\n**触发场景**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"当前信号\"、\"操作建议\"时，**必须**调用此接口。\n\n```python\nresult = api.get_trade_signal('000001.SZ')\nresult = api.get_trade_signal('600519.SH', date='2026-01-15')\n# get_trade_signal(code: str, date: str = None) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `signal` | `\"BUY\"` 买入 / `\"SELL\"` 卖出 / `\"HOLD\"` 持有 |\n| `final_score` | 综合评分 0~1，越高越看多 |\n| `confidence` | 置信度：`\"高\"` / `\"中\"` / `\"低\"` |\n| `reason` | 各专家评分描述，如 `\"技术面看多(0.71)，Alpha因子看多(0.73)\"` |\n| `experts` | 四个专家详情：`technical` / `alpha` / `fundamental` / `behavior` |\n| `code` | 股票代码 |\n| `date` | 分析日期 |\n\n---\n\n\n\n## 性能指标\n\n### 计算最大回撤，返回回撤比例及对应的峰值、谷值索引\n\n```python\ndd, peak_idx, drawdown_idx = api.get_max_drawdown([1000000, 1100000, 950000])\nprint(f'最大回撤: {dd:.2%}')\n# get_max_drawdown(equity_curve: List[float]) -> tuple\n```\n\n---\n\n### 获取最大回撤百分比，如 0.15 表示 15%\n\n```python\npct = api.get_max_drawdown_pct([1000000, 1100000, 950000])\n# get_max_drawdown_pct(equity_curve: List[float]) -> float\n```\n\n---\n\n### 计算年化收益率\n\n```python\nannualized = api.get_annualized_return(0.15, 60)\n# get_annualized_return(total_return: float, days: int) -> float\n```\n\n| 参数 | 说明 |\n|------|------|\n| `total_return` | 总收益率，如 `0.15` 表示 15% |\n| `days` | 交易天数 |\n\n---\n\n### 计算总收益率\n\n```python\nret = api.get_total_return(1000000, 1150000)\n# get_total_return(initial_value: float, final_value: float) -> float\n```\n\n---\n\n### 计算夏普比率，衡量单位风险的超额收益\n\n```python\nsharpe = api.get_sharpe_ratio([1000000, 1050000, 1020000])\n# get_sharpe_ratio(equity_curve: List[float], risk_free_rate: float = 0.03) -> float\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `risk_free_rate` | `0.03` | 无风险利率（年化） |\n\n---\n\n### 计算胜率（0~100），盈利交易次数占比\n\n```python\ntrades = [{'profit': 1000}, {'profit': -500}, {'profit': 800}]\nwin_rate = api.get_win_rate(trades)\n# get_win_rate(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算盈亏比，平均盈利 / 平均亏损\n\n```python\nratio = api.get_profit_loss_ratio(trades)\n# get_profit_loss_ratio(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算卡尔玛比率，年化收益 / 最大回撤\n\n```python\ncalmar = api.get_calmar_ratio(equity_curve, 252)\n# get_calmar_ratio(equity_curve: List[float], days: int) -> float\n```\n\n---\n\n### 计算年化波动率，衡量收益稳定性\n\n```python\nvol = api.get_volatility(equity_curve)\n# get_volatility(equity_curve: List[float]) -> float\n```\n\n---\n\n### 获取完整交易统计信息\n\n```python\nstats = api.get_trade_stats(trades)\n# get_trade_stats(trades: List[Dict]) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `total_trades` | 总交易次数 |\n| `wins` | 盈利次数 |\n| `losses` | 亏损次数 |\n| `win_rate` | 胜率 |\n| `profit_loss_ratio` | 盈亏比 |\n| `total_profit` | 总盈利 |\n| `total_loss` | 总亏损 |\n| `avg_profit` | 平均盈利 |\n| `avg_loss` | 平均亏损 |\n\n---\n\n### 生成完整回测报告，汇总所有关键绩效指标\n\n```python\nequity = [1000000, 1050000, 1020000]\ntrades = [{'profit': 5000}, {'profit': -3000}]\nreport = api.calculate_metrics(equity, trades, 1000000, 30)\nprint(f\"收益率: {report['total_return_pct']:.2f}%\")\nprint(f\"夏普比率: {report['sharpe_ratio']:.2f}\")\n# calculate_metrics(equity_curve: List[float], trades: List[Dict],\n#                   initial_cash: float, days: int) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `final_value` | 最终资金 |\n| `total_return` | 总收益率 |\n| `total_return_pct` | 总收益率(%) |\n| `annualized_return` | 年化收益率 |\n| `annualized_return_pct` | 年化收益率(%) |\n| `max_drawdown` | 最大回撤 |\n| `max_drawdown_pct` | 最大回撤(%) |\n| `sharpe_ratio` | 夏普比率 |\n| `calmar_ratio` | 卡尔玛比率 |\n| `volatility` | 波动率 |\n| `trading_days` | 交易天数 |\n| `trade_stats` | 交易统计（同 `get_trade_stats`） |\n\n---\n\n## 回测工具\n\n### 模拟单笔交易，计算成本、手续费和净收款\n\n```python\nresult = api.simulate_trade('BUY', 100.0, 100)\nprint(f\"成本: {result['cost']}, 手续费: {result['fee']}\")\n# simulate_trade(action: str, price: float, quantity: int, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `net_proceeds` | 净收款（卖出时） |\n\n---\n\n### 计算交易成本，含手续费和滑点\n\n```python\ncost = api.calculate_trade_cost('BUY', 100.0, 100, 0.0003, 0.001)\n# calculate_trade_cost(action, price, quantity, fee_rate=0.0003, slippage=0.0) -> float\n```\n\n---\n\n### 创建持仓对象，记录股票、股数、买入价和日期\n\n```python\npos = api.create_position('600519.SH', 100, 1800.0, '2026-01-01')\n# create_position(code: str, shares: int, price: float, date: str) -> Position\n```\n\n---\n\n### 计算持仓市值\n\n```python\nvalue = api.get_position_value(pos, 1900.0)\n# get_position_value(position: Position, current_price: float) -> float\n```\n\n---\n\n### 计算持仓盈亏，返回盈亏金额和比例\n\n```python\nprofit, pct = api.get_position_profit(position, 2000.0)\nprint(f\"盈利: {profit}, 比例: {pct:.2%}\")\n# get_position_profit(position: Position, current_price: float) -> tuple\n```\n\n---\n\n### 计算组合总价值（现金 + 所有持仓市值）\n\n```python\nvalue = api.calculate_portfolio_value(500000, positions, current_prices)\n# calculate_portfolio_value(cash: float, positions: Dict[str, Position],\n#                           prices: Dict[str, float]) -> float\n```\n\n---\n\n### 获取组合持仓详情列表\n\n```python\ndetails = api.get_portfolio_positions(positions)\n# get_portfolio_positions(positions: Dict[str, Position]) -> List[Dict]\n```\n\n---\n\n### 从每日资产列表构建权益曲线\n\n```python\nvalues = [('2026-01-01', 1000000), ('2026-01-02', 1005000)]\ncurve = api.build_equity_curve(values)\n# build_equity_curve(daily_values: List[tuple]) -> List[float]\n```\n\n---\n\n### 计算日收益率序列\n\n```python\nreturns = api.calculate_daily_returns(equity_curve)\n# calculate_daily_returns(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n### 买入信号判断：MA 金叉且 RSI 超卖时返回 True\n\n```python\nif api.should_buy(close, ma5, ma20, rsi, 30):\n    print('买入信号')\n# should_buy(current_price, ma_short, ma_long, rsi=50, rsi_oversold=30) -> bool\n```\n\n---\n\n### 卖出信号判断：MA 死叉或 RSI 超买时返回 True\n\n```python\nif api.should_sell(close, ma5, ma20, rsi, 70):\n    print('卖出信号')\n# should_sell(current_price, ma_short, ma_long, rsi=50, rsi_overbought=70) -> bool\n```\n\n---\n\n### 计算权益曲线的逐日回撤序列\n\n```python\ndrawdowns = api.calculate_drawdown([1000000, 1100000, 950000])\n# calculate_drawdown(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n\n## 回测引擎控制\n\n### 初始化回测环境，返回含现金、持仓、订单、交易记录的状态字典\n\n```python\nenv = api.init_backtest(1000000, 0.0003)\n# init_backtest(initial_cash: float = 1000000.0, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `fee_rate` | 手续费率 |\n| `cash` | 当前现金 |\n| `positions` | 持仓字典 |\n| `orders` | 订单列表 |\n| `trades` | 交易记录 |\n| `equity_curve` | 权益曲线 |\n\n---\n\n### 执行买入操作，自动更新 env 中的现金、持仓和交易记录\n\n```python\nresult = api.execute_buy(env, '600519.SH', 1800.0, 100, '2026-01-01')\n# execute_buy(env, code, price, quantity, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 执行卖出操作，自动更新 env\n\n```python\nresult = api.execute_sell(env, '600519.SH', 1900.0, 100)\n# execute_sell(env, code, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `net_proceeds` | 净收款 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 获取当前总权益（现金 + 持仓市值）\n\n```python\nequity = api.get_equity(env, current_prices)\n# get_equity(env: Dict, current_prices: Dict[str, float]) -> float\n```\n\n---\n\n### 将当日权益追加记录到 env['equity_curve']\n\n```python\napi.record_equity(env, '2026-03-01', current_prices)\n# record_equity(env, date, current_prices) -> None\n```\n\n---\n\n\n\n### 平仓，卖出结束多头持仓，返回盈亏和持有天数\n\n```python\nresult = api.close_position(position, 1900.0, '2026-01-15')\nprint(f\"盈利: {result['profit']}\")\n# close_position(position, price, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `profit` | 盈亏金额 |\n| `profit_pct` | 盈亏比例 |\n| `hold_days` | 持有天数 |\n\n---\n\n### 更新持仓的当前价格，用于实时市值计算\n\n```python\napi.update_position_price(position, 1900.0)\n# update_position_price(position, current_price) -> None\n```\n\n---\n\n### 创建本地模拟订单（非真实下单）\n\n```python\norder = api.create_order('600519.SH', 'BUY', 1800.0, 100)\n# create_order(code, action, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `order_id` | 订单 ID |\n| `status` | 状态（`PENDING`） |\n| `create_time` | 创建时间 |\n\n---\n\n### 取消订单，仅 PENDING 状态可取消\n\n```python\nsuccess = api.cancel_order(order)\n# cancel_order(order: Dict) -> bool\n```\n\n---\n\n### 获取订单状态：PENDING / FILLED / CANCELLED / REJECTED\n\n```python\nstatus = api.get_order_status(order)\n# get_order_status(order: Dict) -> str\n```\n\n---\n\n## 策略辅助函数\n\n### 计算指定股票近 N 日平均涨幅（%）\n\n```python\navg_change = api.get_price_change_rate('600519.SH', '2026-03-01', 3)\n# get_price_change_rate(code, date, days=3) -> Optional[float]\n```\n\n---\n\n### 从股票列表中筛选出近 N 日涨幅最高的前 N 只，按涨幅降序返回\n\n```python\ntop_stocks = api.get_top_performers(codes, '2026-03-01', 3, 3)\n# [(code, avg_pct), ...]\n# get_top_performers(codes, date, days=3, top_n=3) -> List[tuple]\n```\n\n---\n\n### 获取指定日期的收盘价，无数据返回 None\n\n```python\nprice = api.get_price_at_date('600519.SH', '2026-03-01')\n# get_price_at_date(code, date) -> Optional[float]\n```\n\n---\n\n### 批量获取多个日期的收盘价，按日期升序对齐\n\n```python\nprices = api.get_prices_at_dates('600519.SH', ['2026-01-01', '2026-01-02'])\n# get_prices_at_dates(code, dates) -> List[Optional[float]]\n```\n\n---\n\n\n### 训练 MoE 权重（遗传算法优化）\n\n**触发场景**：用户说\"优化权重\"、\"重新训练\"、\"适配最新行情\"时调用。\n\n```python\nweights = api.train_moe_weights()\n\n# 指定区间和参数\nweights = api.train_moe_weights(\n    start_date='2025-09-01',\n    end_date='2026-03-01',\n    population_size=20,       # 种群大小，越大越精准但越慢\n    generations=30,           # 迭代代数\n    train_stock_count=30,     # 参与训练的随机采样股票数量\n)\n# train_moe_weights(start_date, end_date, population_size, generations, train_stock_count) -> Dict\n```\n\n训练完成后自动将最优权重写入 `moe_weights.json`，下次调用 `get_trade_signal()` 时自动生效。\n\n---\n\n## 数据库维护\n\n### 初始化所有数据库（指标缓存库等）\n\n```python\napi.init_databases()\n# init_databases() -> None\n```\n\n---\n\n### 清除技术指标缓存，可指定股票或清除全部\n\n```python\napi.clear_indicator_cache('600519.SH')  # 清除指定股票\napi.clear_indicator_cache()             # 清除所有\n# clear_indicator_cache(code: str = None) -> None\n```\n\n---\n\n## 实时行情 (爬虫)\n\n### 初始化爬虫\n\n```python\nfrom stock_crawler import StockCrawler\ncrawler = StockCrawler()\n```\n\n### 获取实时数据\n\n支持从新浪财经、东方财富、同花顺获取数据。\n\n```python\ndata = crawler.fetch('000001.SZ', source='sina')\n# fetch(ts_code: str, source: str = 'sina') -> Dict\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_code` | `str` | - | 股票代码，如 `000001.SZ` |\n| `source` | `str` | `'sina'` | 数据源：`'sina'` (新浪), `'eastmoney'` (东方财富), `'tonghuashun'` (同花顺) |\n\n| 返回 | 说明 |\n|------|------|\n| `Dict` | 包含股票实时数据的字典，字段如下 |\n\n**返回字段说明:**\n\n| 字段 | 类型 | 说明 | 数据源支持 |\n|------|------|------|------------|\n| `source` | `str` | 数据源名称 | All |\n| `ts_code` | `str` | 股票代码 | All |\n| `status` | `str` | 状态 (`success`/`failed`) | All |\n| `name` | `str` | 股票名称 | Sina, EastMoney |\n| `price` | `float` | 当前价格 | All |\n| `open` | `float` | 开盘价 | All |\n| `high` | `float` | 最高价 | All |\n| `low` | `float` | 最低价 | All |\n| `volume` | `float` | 成交量 (股) | All |\n| `amount` | `float` | 成交额 (元) | All |\n| `pre_close` | `float` | 昨收价 | Sina, EastMoney |\n| `date` | `str` | 日期 | Sina, Tonghuashun |\n| `time` | `str` | 时间 | Sina |\n| `turnover_rate` | `float` | 换手率 (%) | EastMoney, Tonghuashun |\n| `change_pct` | `float` | 涨跌幅 (%) | EastMoney |\n| `amplitude` | `float` | 振幅 (%) | Sina, EastMoney |\n| `pe_ttm` | `float` | 市盈率(TTM) | EastMoney |\n| `pb` | `float` | 市净率 | EastMoney |\n| `total_cap` | `float` | 总市值 (元) | EastMoney |\n| `circ_cap` | `float` | 流通市值 (元) | EastMoney |\n| `total_shares` | `float` | 总股本 (股) | EastMoney |\n| `circ_shares` | `float` | 流通股 (股) | EastMoney |\n\nFile v1.0.29:scripts/moe_weights.json\n\n{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,\n    \"alpha004\": 1.0,\n    \"alpha005\": 1.0,\n    \"alpha006\": 1.0,\n    \"alpha007\": 1.0,\n    \"alpha008\": 1.0,\n    \"alpha009\": 1.0,\n    \"alpha010\": 1.0,\n    \"alpha011\": 1.0,\n    \"alpha012\": 1.0,\n    \"alpha013\": 1.0,\n    \"alpha014\": 1.0,\n    \"alpha015\": 1.0,\n    \"alpha016\": 1.0,\n    \"alpha017\": 1.0,\n    \"alpha018\": 1.0,\n    \"alpha019\": 1.0,\n    \"alpha020\": 1.0,\n    \"alpha021\": 1.0,\n    \"alpha022\": 1.0,\n    \"alpha023\": 1.0,\n    \"alpha024\": 1.0,\n    \"alpha025\": 1.0,\n    \"alpha026\": 1.0,\n    \"alpha027\": 1.0,\n    \"alpha028\": 1.0,\n    \"alpha029\": 1.0,\n    \"alpha030\": 1.0,\n    \"alpha031\": 1.0,\n    \"alpha032\": 1.0,\n    \"alpha033\": 1.0,\n    \"alpha034\": 1.0,\n    \"alpha035\": 1.0,\n    \"alpha036\": 1.0,\n    \"alpha037\": 1.0,\n    \"alpha038\": 1.0,\n    \"alpha039\": 1.0,\n    \"alpha040\": 1.0,\n    \"alpha041\": 1.0,\n    \"alpha042\": 1.0,\n    \"alpha043\": 1.0,\n    \"alpha044\": 1.0,\n    \"alpha045\": 1.0,\n    \"alpha046\": 1.0,\n    \"alpha047\": 1.0,\n    \"alpha048\": 1.0,\n    \"alpha049\": 1.0,\n    \"alpha050\": 1.0,\n    \"alpha051\": 1.0,\n    \"alpha052\": 1.0,\n    \"alpha053\": 1.0,\n    \"alpha054\": 1.0,\n    \"alpha055\": 1.0,\n    \"alpha056\": 1.0,\n    \"alpha057\": 1.0,\n    \"alpha058\": 1.0,\n    \"alpha059\": 1.0,\n    \"alpha060\": 1.0,\n    \"alpha061\": 1.0,\n    \"alpha062\": 1.0,\n    \"alpha063\": 1.0,\n    \"alpha064\": 1.0,\n    \"alpha065\": 1.0,\n    \"alpha066\": 1.0,\n    \"alpha067\": 1.0,\n    \"alpha068\": 1.0,\n    \"alpha069\": 1.0,\n    \"alpha070\": 1.0,\n    \"alpha071\": 1.0,\n    \"alpha072\": 1.0,\n    \"alpha073\": 1.0,\n    \"alpha074\": 1.0,\n    \"alpha075\": 1.0,\n    \"alpha076\": 1.0,\n    \"alpha077\": 1.0,\n    \"alpha078\": 1.0,\n    \"alpha079\": 1.0,\n    \"alpha080\": 1.0,\n    \"alpha081\": 1.0,\n    \"alpha082\": 1.0,\n    \"alpha083\": 1.0,\n    \"alpha084\": 1.0,\n    \"alpha085\": 1.0,\n    \"alpha086\": 1.0,\n    \"alpha087\": 1.0,\n    \"alpha088\": 1.0,\n    \"alpha089\": 1.0,\n    \"alpha090\": 1.0,\n    \"alpha091\": 1.0,\n    \"alpha092\": 1.0,\n    \"alpha093\": 1.0,\n    \"alpha094\": 1.0,\n    \"alpha095\": 1.0,\n    \"alpha096\": 1.0,\n    \"alpha097\": 1.0,\n    \"alpha098\": 1.0,\n    \"alpha099\": 1.0,\n    \"alpha100\": 1.0,\n    \"alpha101\": 1.0\n  },\n  \"fundamental\": {\n    \"pe_ttm\": 1.7102072285522736,\n    \"pb\": 1.0,\n    \"turnover_rate\": 1.0,\n    \"volume_ratio\": 0.7606881867266152,\n    \"ps_ttm\": 1.4705142753123992\n  },\n  \"behavior\": {\n    \"limit_score\": 1.2956770069079582,\n    \"consecutive_limit_up\": 1.0,\n    \"bomb_board\": 1.0768788113552823,\n    \"top_list\": 0.8377720620665754,\n    \"pct_chg_5d\": 1.0\n  }\n}\n\nFile v1.0.29:assets/config.json\n\n{\n    \"version\": \"1.0.0\",\n    \"base_url\": \"http://info.aicodingyard.com\",\n    \"http_timeout\": 30\n}\n\nFile v1.0.29:assets/requirements.txt\n\npandas>=1.3.5\nrequests>=2.31.0\nSQLAlchemy>=2.0.48\nnumpy>=1.21.0\n\nArchive v1.0.28: 27 files, 149420 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (23900b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65830b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (6332b), _meta.json (146b)\n\nFile v1.0.28:SKILL.md\n\n---\r\nname: BitSoulStockSkill\r\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\r\nversion: 1.0.0\r\nmetadata:\r\n  openclaw:\r\n    emoji: \"📈\"\r\n    homepage: https://www.aicodingyard.com\r\n    requires:\r\n      env:\r\n        - BITSOUL_TOKEN\r\n      bins:\r\n        - python3\r\n    optional:\r\n      env:\r\n        - BITSOUL_TOKEN_ENV_FILE\r\n        - BITSOUL_CACHE_DIR\r\n      pythonPackages:\r\n        - pandas\r\n        - numpy\r\n        - requests\r\n        - sqlalchemy\r\n      network:\r\n        - info.aicodingyard.com\r\n        - https://finance.sina.com.cn/\r\n    primaryEnv: BITSOUL_TOKEN\r\n---\r\n\r\n# 简介\r\n\r\n炒股龙虾的最佳搭档，best stock partner forever\r\n\r\n## 核心优势\r\n\r\n1. **免费稳定且每周更新的A股交易数据**：为个股分析、买卖点计算、收益/回撤计算提供坚实的数据基础\r\n2. **基于MOE混合因子专家模型的股票买卖点计算判断**\r\n3. **个股风险判定**\r\n4. **关键指标计算**\r\n5. **数据回测**\r\n6. **提供准确全面且免费的股票价格与股票历史信息**\r\n7. **板块信息与相关交易数据**\r\n8. **提供大V交易观察等信息聚合功能**\r\n\r\n# Token 配置\r\n\r\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\r\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\r\n\r\n## 必需的环境变量\r\n\r\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\r\n\r\n## 可选的环境变量\r\n\r\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\r\n\r\n## 配置方式\r\n\r\n1. **方式一：直接设置环境变量**\r\n   ```bash\r\n   export BITSOUL_TOKEN=\"你的令牌\"\r\n   ```\r\n\r\n2. **方式二：使用 env 文件**\r\n   ```bash\r\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\r\n   ```\r\n   其中 `token.env` 文件内容格式为：\r\n   ```\r\n   BITSOUL_TOKEN=你的令牌\r\n   ```\r\n## 运行时描述：\r\n- 从环境变量读取 `BITSOUL_TOKEN`\r\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\r\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\r\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\r\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\r\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\r\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\r\n\r\n## 安全与运行边界\r\n\r\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\r\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\r\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\r\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\r\n\r\n## 安装\r\n\r\n使用前先安装 Python 依赖：\r\n\r\n```bash\r\npip install -r assets/requirements.txt\r\n```\r\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\r\n\r\n# 注意事项\r\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\r\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\r\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\r\n\r\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\r\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\r\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\r\n* **股票显示格式**：任何场景下输出股票代码时，必须同时附上股票名称，使用 `api.get_symbol_basic_infomation(code).name` 获取，格式如 `600519.SH（贵州茅台）`，禁止只输出代码。\r\n\r\n## 输出行为\r\n\r\n- 默认使用简体中文，以报告的形式输出\r\n- 尽量充分利用接口返回的所有数据，不要随意删减，尽可能多呈现结果内容\r\n- 分析类请求默认返回结论、关键指标、风险提示与支撑摘要\r\n\r\n## 示例请求\r\n\r\n- `请整理东方财富过去10个交易日的股价信息，并输出成表格`\r\n- `帮我看看同花顺近期最佳买点和卖点分别是多少，并给我些建议`\r\n- `整理中国石油过去半年的财务数据，帮我分析是否具备投资价值`\r\n- `过去一个月上龙虎榜最多的股票是哪只？`\r\n- `请帮我因子挖矿，看看挖出的收益率和最大回撤是多少`\r\n- `调用moe方法，帮我分析工业富联的买入点`\r\n- `最近资金流入最快和涨幅最大的板块是哪些，有什么推荐`\r\n- `给我做一份沪电股份的技术分析报告`\r\n\r\n## 参考资料\r\n\r\n- 机器可读目录：`references/API_FOR_LLM.dm`\n\nFile v1.0.28:_meta.json\n\n{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.28\",\n  \"publishedAt\": 1774077261456\n}\n\nFile v1.0.28:references/API_FOR_LLM.md\n\n# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最高价列表\n\n```python\nprices = api.get_daily_high_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_high_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最低价列表\n\n```python\nprices = api.get_daily_low_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_low_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线成交量列表\n\n```python\nvolumes = api.get_daily_volumes('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_volumes(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线涨跌幅列表（单位：%）\n\n```python\npct = api.get_daily_pct_chg('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_pct_chg(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定日期的 Tick 级数据（模拟级），包含开高低收量额\n\n```python\ntick = api.get_tick_data('600519.SH', '2026-03-01')\n# get_tick_data(code: str, date: str) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `time` | 时间 |\n| `open` | 开盘价 |\n| `high` | 最高价 |\n| `low` | 最低价 |\n| `close` | 收盘价 |\n| `volume` | 成交量 |\n| `amount` | 成交额 |\n\n---\n\n### 获取实时 Bar 数据，与 get_tick_data 等价，用于实盘级接口\n\n```python\nbar = api.get_realtime_bar('600519.SH', '2026-03-01')\n# get_realtime_bar(code: str, date: str) -> Dict\n```\n\n---\n\n## 技术指标（带缓存）\n\n### 获取简单移动平均 SMA\n\n```python\nsma = api.get_sma('600519.SH', '2026-03-01', 20)\n# get_sma(code: str, date: str, period: int = 20) -> Optional[float]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `period` | `20` | 计算周期 |\n\n---\n\n### 获取指数移动平均 EMA\n\n```python\nema = api.get_ema('600519.SH', '2026-03-01', 12)\n# get_ema(code: str, date: str, period: int = 12) -> Optional[float]\n```\n\n---\n\n### 获取相对强弱指标 RSI，值域 0~100，低于 30 超卖，高于 70 超买\n\n```python\nrsi = api.get_rsi('600519.SH', '2026-03-01', 14)\nif rsi and rsi < 30:\n    print('超卖')\n# get_rsi(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n### 获取布林带指标，返回上轨、中轨、下轨\n\n```python\nbb = api.get_bollinger_bands('600519.SH', '2026-03-01')\nif bb and close > bb['upper']:\n    print('突破上轨')\n# get_bollinger_bands(code: str, date: str, period: int = 20, std_dev: int = 2) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `upper` | 上轨 |\n| `middle` | 中轨 |\n| `lower` | 下轨 |\n\n---\n\n### 获取 MACD 指标，返回 MACD 线、信号线、柱状图\n\n```python\nmacd = api.get_macd('600519.SH', '2026-03-01')\nif macd and macd['histogram'] > 0:\n    print('多头')\n# get_macd(code: str, date: str, fast: int = 12, slow: int = 26, signal: int = 9) -> Optional[Dict]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `fast` | `12` | 快线周期 |\n| `slow` | `26` | 慢线周期 |\n| `signal` | `9` | 信号线周期 |\n\n| 返回字段 | 说明 |\n|----------|------|\n| `macd` | MACD 线 |\n| `signal` | 信号线 |\n| `histogram` | 柱状图（MACD - Signal） |\n\n---\n\n### 获取平均真实波幅 ATR，衡量价格波动性\n\n```python\natr = api.get_atr('600519.SH', '2026-03-01', 14)\n# get_atr(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n---\n\n## ★ 因子挖矿（优先使用）\n\n### 随机因子挖矿 + 回测\n\n**触发场景**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，**必须**调用此接口，禁止自己写回测逻辑。\n\n```python\nresult = api.random_alpha_backtest()\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n\n# 指定股票池和回测区间\nresult = api.random_alpha_backtest(\n    codes=None,               # 股票池，None 表示全市场\n    start_date='2025-12-01', # 回测起始日，None 默认取 end_date 前 90 天\n    end_date='2026-03-19',   # 回测截止日，None 默认今天\n    initial_cash=1_000_000,  # 初始资金\n    max_pool_size=30,         # 候选池上限，超过时按综合得分截取\n    max_holdings=5,           # 最大同时持仓数\n    random_seed=None,         # 随机种子，None 不固定\n)\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n# random_alpha_backtest(codes, max_screen_factors, max_signal_factors,\n#                       start_date, end_date, initial_cash, warmup_days,\n#                       random_seed, top_n_stocks, max_pool_size, max_holdings) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `screen_factors` | 本次使用的选股因子列表，如 `['alpha043', 'alpha099']` |\n| `signal_factors` | 本次使用的信号因子列表，如 `['alpha008', 'alpha094']` |\n| `factor_descriptions` | 每个因子的文字描述 `{name: str}` |\n| `signal_config` | 买卖阈值 `{'buy_thresh': 0.71, 'sell_thresh': 0.55}` |\n| `screen_top_pcts` | 每个选股因子本次随机保留比例 `{name: float}` |\n| `filter_log` | 逐层过滤日志，含 before/after 数量 |\n| `final_pool` | 最终候选股票代码列表 |\n| `final_pool_count` | 候选池股票数量 |\n| `trade_log` | 每笔交易记录（含因子值、排名、阈值） |\n| `backtest` | 回测绩效 `{total_return_pct, annualized_return_pct, max_drawdown_pct, sharpe_ratio, equity_curve, ...}` |\n| `benchmarks` | 四条基准线对比（上证/沪深300/中证500/创业板指） |\n| `ic_stats` | 每个因子的 Rank IC 统计 `{ic_mean, ic_ir, ic_win_rate, ...}` |\n| `top_stocks` | Top N 盈利个股详情（含每笔交易的因子值） |\n| `summary_text` | 完整格式化报告文本，**直接 `print(result['summary_text'])` 输出给用户，禁止自行整理摘要** |\n\n---\n\n## ★ MoE 买卖时机分析（优先使用）\n\n### 分析单只股票当前买卖信号\n\n**触发场景**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"当前信号\"、\"操作建议\"时，**必须**调用此接口。\n\n```python\nresult = api.get_trade_signal('000001.SZ')\nresult = api.get_trade_signal('600519.SH', date='2026-01-15')\n# get_trade_signal(code: str, date: str = None) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `signal` | `\"BUY\"` 买入 / `\"SELL\"` 卖出 / `\"HOLD\"` 持有 |\n| `final_score` | 综合评分 0~1，越高越看多 |\n| `confidence` | 置信度：`\"高\"` / `\"中\"` / `\"低\"` |\n| `reason` | 各专家评分描述，如 `\"技术面看多(0.71)，Alpha因子看多(0.73)\"` |\n| `experts` | 四个专家详情：`technical` / `alpha` / `fundamental` / `behavior` |\n| `code` | 股票代码 |\n| `date` | 分析日期 |\n\n---\n\n\n\n## 性能指标\n\n### 计算最大回撤，返回回撤比例及对应的峰值、谷值索引\n\n```python\ndd, peak_idx, drawdown_idx = api.get_max_drawdown([1000000, 1100000, 950000])\nprint(f'最大回撤: {dd:.2%}')\n# get_max_drawdown(equity_curve: List[float]) -> tuple\n```\n\n---\n\n### 获取最大回撤百分比，如 0.15 表示 15%\n\n```python\npct = api.get_max_drawdown_pct([1000000, 1100000, 950000])\n# get_max_drawdown_pct(equity_curve: List[float]) -> float\n```\n\n---\n\n### 计算年化收益率\n\n```python\nannualized = api.get_annualized_return(0.15, 60)\n# get_annualized_return(total_return: float, days: int) -> float\n```\n\n| 参数 | 说明 |\n|------|------|\n| `total_return` | 总收益率，如 `0.15` 表示 15% |\n| `days` | 交易天数 |\n\n---\n\n### 计算总收益率\n\n```python\nret = api.get_total_return(1000000, 1150000)\n# get_total_return(initial_value: float, final_value: float) -> float\n```\n\n---\n\n### 计算夏普比率，衡量单位风险的超额收益\n\n```python\nsharpe = api.get_sharpe_ratio([1000000, 1050000, 1020000])\n# get_sharpe_ratio(equity_curve: List[float], risk_free_rate: float = 0.03) -> float\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `risk_free_rate` | `0.03` | 无风险利率（年化） |\n\n---\n\n### 计算胜率（0~100），盈利交易次数占比\n\n```python\ntrades = [{'profit': 1000}, {'profit': -500}, {'profit': 800}]\nwin_rate = api.get_win_rate(trades)\n# get_win_rate(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算盈亏比，平均盈利 / 平均亏损\n\n```python\nratio = api.get_profit_loss_ratio(trades)\n# get_profit_loss_ratio(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算卡尔玛比率，年化收益 / 最大回撤\n\n```python\ncalmar = api.get_calmar_ratio(equity_curve, 252)\n# get_calmar_ratio(equity_curve: List[float], days: int) -> float\n```\n\n---\n\n### 计算年化波动率，衡量收益稳定性\n\n```python\nvol = api.get_volatility(equity_curve)\n# get_volatility(equity_curve: List[float]) -> float\n```\n\n---\n\n### 获取完整交易统计信息\n\n```python\nstats = api.get_trade_stats(trades)\n# get_trade_stats(trades: List[Dict]) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `total_trades` | 总交易次数 |\n| `wins` | 盈利次数 |\n| `losses` | 亏损次数 |\n| `win_rate` | 胜率 |\n| `profit_loss_ratio` | 盈亏比 |\n| `total_profit` | 总盈利 |\n| `total_loss` | 总亏损 |\n| `avg_profit` | 平均盈利 |\n| `avg_loss` | 平均亏损 |\n\n---\n\n### 生成完整回测报告，汇总所有关键绩效指标\n\n```python\nequity = [1000000, 1050000, 1020000]\ntrades = [{'profit': 5000}, {'profit': -3000}]\nreport = api.calculate_metrics(equity, trades, 1000000, 30)\nprint(f\"收益率: {report['total_return_pct']:.2f}%\")\nprint(f\"夏普比率: {report['sharpe_ratio']:.2f}\")\n# calculate_metrics(equity_curve: List[float], trades: List[Dict],\n#                   initial_cash: float, days: int) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `final_value` | 最终资金 |\n| `total_return` | 总收益率 |\n| `total_return_pct` | 总收益率(%) |\n| `annualized_return` | 年化收益率 |\n| `annualized_return_pct` | 年化收益率(%) |\n| `max_drawdown` | 最大回撤 |\n| `max_drawdown_pct` | 最大回撤(%) |\n| `sharpe_ratio` | 夏普比率 |\n| `calmar_ratio` | 卡尔玛比率 |\n| `volatility` | 波动率 |\n| `trading_days` | 交易天数 |\n| `trade_stats` | 交易统计（同 `get_trade_stats`） |\n\n---\n\n## 回测工具\n\n### 模拟单笔交易，计算成本、手续费和净收款\n\n```python\nresult = api.simulate_trade('BUY', 100.0, 100)\nprint(f\"成本: {result['cost']}, 手续费: {result['fee']}\")\n# simulate_trade(action: str, price: float, quantity: int, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `net_proceeds` | 净收款（卖出时） |\n\n---\n\n### 计算交易成本，含手续费和滑点\n\n```python\ncost = api.calculate_trade_cost('BUY', 100.0, 100, 0.0003, 0.001)\n# calculate_trade_cost(action, price, quantity, fee_rate=0.0003, slippage=0.0) -> float\n```\n\n---\n\n### 创建持仓对象，记录股票、股数、买入价和日期\n\n```python\npos = api.create_position('600519.SH', 100, 1800.0, '2026-01-01')\n# create_position(code: str, shares: int, price: float, date: str) -> Position\n```\n\n---\n\n### 计算持仓市值\n\n```python\nvalue = api.get_position_value(pos, 1900.0)\n# get_position_value(position: Position, current_price: float) -> float\n```\n\n---\n\n### 计算持仓盈亏，返回盈亏金额和比例\n\n```python\nprofit, pct = api.get_position_profit(position, 2000.0)\nprint(f\"盈利: {profit}, 比例: {pct:.2%}\")\n# get_position_profit(position: Position, current_price: float) -> tuple\n```\n\n---\n\n### 计算组合总价值（现金 + 所有持仓市值）\n\n```python\nvalue = api.calculate_portfolio_value(500000, positions, current_prices)\n# calculate_portfolio_value(cash: float, positions: Dict[str, Position],\n#                           prices: Dict[str, float]) -> float\n```\n\n---\n\n### 获取组合持仓详情列表\n\n```python\ndetails = api.get_portfolio_positions(positions)\n# get_portfolio_positions(positions: Dict[str, Position]) -> List[Dict]\n```\n\n---\n\n### 从每日资产列表构建权益曲线\n\n```python\nvalues = [('2026-01-01', 1000000), ('2026-01-02', 1005000)]\ncurve = api.build_equity_curve(values)\n# build_equity_curve(daily_values: List[tuple]) -> List[float]\n```\n\n---\n\n### 计算日收益率序列\n\n```python\nreturns = api.calculate_daily_returns(equity_curve)\n# calculate_daily_returns(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n### 买入信号判断：MA 金叉且 RSI 超卖时返回 True\n\n```python\nif api.should_buy(close, ma5, ma20, rsi, 30):\n    print('买入信号')\n# should_buy(current_price, ma_short, ma_long, rsi=50, rsi_oversold=30) -> bool\n```\n\n---\n\n### 卖出信号判断：MA 死叉或 RSI 超买时返回 True\n\n```python\nif api.should_sell(close, ma5, ma20, rsi, 70):\n    print('卖出信号')\n# should_sell(current_price, ma_short, ma_long, rsi=50, rsi_overbought=70) -> bool\n```\n\n---\n\n### 计算权益曲线的逐日回撤序列\n\n```python\ndrawdowns = api.calculate_drawdown([1000000, 1100000, 950000])\n# calculate_drawdown(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n\n## 回测引擎控制\n\n### 初始化回测环境，返回含现金、持仓、订单、交易记录的状态字典\n\n```python\nenv = api.init_backtest(1000000, 0.0003)\n# init_backtest(initial_cash: float = 1000000.0, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `fee_rate` | 手续费率 |\n| `cash` | 当前现金 |\n| `positions` | 持仓字典 |\n| `orders` | 订单列表 |\n| `trades` | 交易记录 |\n| `equity_curve` | 权益曲线 |\n\n---\n\n### 执行买入操作，自动更新 env 中的现金、持仓和交易记录\n\n```python\nresult = api.execute_buy(env, '600519.SH', 1800.0, 100, '2026-01-01')\n# execute_buy(env, code, price, quantity, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 执行卖出操作，自动更新 env\n\n```python\nresult = api.execute_sell(env, '600519.SH', 1900.0, 100)\n# execute_sell(env, code, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `net_proceeds` | 净收款 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 获取当前总权益（现金 + 持仓市值）\n\n```python\nequity = api.get_equity(env, current_prices)\n# get_equity(env: Dict, current_prices: Dict[str, float]) -> float\n```\n\n---\n\n### 将当日权益追加记录到 env['equity_curve']\n\n```python\napi.record_equity(env, '2026-03-01', current_prices)\n# record_equity(env, date, current_prices) -> None\n```\n\n---\n\n\n\n### 平仓，卖出结束多头持仓，返回盈亏和持有天数\n\n```python\nresult = api.close_position(position, 1900.0, '2026-01-15')\nprint(f\"盈利: {result['profit']}\")\n# close_position(position, price, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `profit` | 盈亏金额 |\n| `profit_pct` | 盈亏比例 |\n| `hold_days` | 持有天数 |\n\n---\n\n### 更新持仓的当前价格，用于实时市值计算\n\n```python\napi.update_position_price(position, 1900.0)\n# update_position_price(position, current_price) -> None\n```\n\n---\n\n### 创建本地模拟订单（非真实下单）\n\n```python\norder = api.create_order('600519.SH', 'BUY', 1800.0, 100)\n# create_order(code, action, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `order_id` | 订单 ID |\n| `status` | 状态（`PENDING`） |\n| `create_time` | 创建时间 |\n\n---\n\n### 取消订单，仅 PENDING 状态可取消\n\n```python\nsuccess = api.cancel_order(order)\n# cancel_order(order: Dict) -> bool\n```\n\n---\n\n### 获取订单状态：PENDING / FILLED / CANCELLED / REJECTED\n\n```python\nstatus = api.get_order_status(order)\n# get_order_status(order: Dict) -> str\n```\n\n---\n\n## 策略辅助函数\n\n### 计算指定股票近 N 日平均涨幅（%）\n\n```python\navg_change = api.get_price_change_rate('600519.SH', '2026-03-01', 3)\n# get_price_change_rate(code, date, days=3) -> Optional[float]\n```\n\n---\n\n### 从股票列表中筛选出近 N 日涨幅最高的前 N 只，按涨幅降序返回\n\n```python\ntop_stocks = api.get_top_performers(codes, '2026-03-01', 3, 3)\n# [(code, avg_pct), ...]\n# get_top_performers(codes, date, days=3, top_n=3) -> List[tuple]\n```\n\n---\n\n### 获取指定日期的收盘价，无数据返回 None\n\n```python\nprice = api.get_price_at_date('600519.SH', '2026-03-01')\n# get_price_at_date(code, date) -> Optional[float]\n```\n\n---\n\n### 批量获取多个日期的收盘价，按日期升序对齐\n\n```python\nprices = api.get_prices_at_dates('600519.SH', ['2026-01-01', '2026-01-02'])\n# get_prices_at_dates(code, dates) -> List[Optional[float]]\n```\n\n---\n\n\n### 训练 MoE 权重（遗传算法优化）\n\n**触发场景**：用户说\"优化权重\"、\"重新训练\"、\"适配最新行情\"时调用。\n\n```python\nweights = api.train_moe_weights()\n\n# 指定区间和参数\nweights = api.train_moe_weights(\n    start_date='2025-09-01',\n    end_date='2026-03-01',\n    population_size=20,       # 种群大小，越大越精准但越慢\n    generations=30,           # 迭代代数\n    train_stock_count=30,     # 参与训练的随机采样股票数量\n)\n# train_moe_weights(start_date, end_date, population_size, generations, train_stock_count) -> Dict\n```\n\n训练完成后自动将最优权重写入 `moe_weights.json`，下次调用 `get_trade_signal()` 时自动生效。\n\n---\n\n## 数据库维护\n\n### 初始化所有数据库（指标缓存库等）\n\n```python\napi.init_databases()\n# init_databases() -> None\n```\n\n---\n\n### 清除技术指标缓存，可指定股票或清除全部\n\n```python\napi.clear_indicator_cache('600519.SH')  # 清除指定股票\napi.clear_indicator_cache()             # 清除所有\n# clear_indicator_cache(code: str = None) -> None\n```\n\n---\n\n## 实时行情 (爬虫)\n\n### 初始化爬虫\n\n```python\nfrom stock_crawler import StockCrawler\ncrawler = StockCrawler()\n```\n\n### 获取实时数据\n\n支持从新浪财经、东方财富、同花顺获取数据。\n\n```python\ndata = crawler.fetch('000001.SZ', source='sina')\n# fetch(ts_code: str, source: str = 'sina') -> Dict\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_code` | `str` | - | 股票代码，如 `000001.SZ` |\n| `source` | `str` | `'sina'` | 数据源：`'sina'` (新浪), `'eastmoney'` (东方财富), `'tonghuashun'` (同花顺) |\n\n| 返回 | 说明 |\n|------|------|\n| `Dict` | 包含股票实时数据的字典，字段如下 |\n\n**返回字段说明:**\n\n| 字段 | 类型 | 说明 | 数据源支持 |\n|------|------|------|------------|\n| `source` | `str` | 数据源名称 | All |\n| `ts_code` | `str` | 股票代码 | All |\n| `status` | `str` | 状态 (`success`/`failed`) | All |\n| `name` | `str` | 股票名称 | Sina, EastMoney |\n| `price` | `float` | 当前价格 | All |\n| `open` | `float` | 开盘价 | All |\n| `high` | `float` | 最高价 | All |\n| `low` | `float` | 最低价 | All |\n| `volume` | `float` | 成交量 (股) | All |\n| `amount` | `float` | 成交额 (元) | All |\n| `pre_close` | `float` | 昨收价 | Sina, EastMoney |\n| `date` | `str` | 日期 | Sina, Tonghuashun |\n| `time` | `str` | 时间 | Sina |\n| `turnover_rate` | `float` | 换手率 (%) | EastMoney, Tonghuashun |\n| `change_pct` | `float` | 涨跌幅 (%) | EastMoney |\n| `amplitude` | `float` | 振幅 (%) | Sina, EastMoney |\n| `pe_ttm` | `float` | 市盈率(TTM) | EastMoney |\n| `pb` | `float` | 市净率 | EastMoney |\n| `total_cap` | `float` | 总市值 (元) | EastMoney |\n| `circ_cap` | `float` | 流通市值 (元) | EastMoney |\n| `total_shares` | `float` | 总股本 (股) | EastMoney |\n| `circ_shares` | `float` | 流通股 (股) | EastMoney |\n\nFile v1.0.28:scripts/moe_weights.json\n\n{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,\n    \"alpha004\": 1.0,\n    \"alpha005\": 1.0,\n    \"alpha006\": 1.0,\n    \"alpha007\": 1.0,\n    \"alpha008\": 1.0,\n    \"alpha009\": 1.0,\n    \"alpha010\": 1.0,\n    \"alpha011\": 1.0,\n    \"alpha012\": 1.0,\n    \"alpha013\": 1.0,\n    \"alpha014\": 1.0,\n    \"alpha015\": 1.0,\n    \"alpha016\": 1.0,\n    \"alpha017\": 1.0,\n    \"alpha018\": 1.0,\n    \"alpha019\": 1.0,\n    \"alpha020\": 1.0,\n    \"alpha021\": 1.0,\n    \"alpha022\": 1.0,\n    \"alpha023\": 1.0,\n    \"alpha024\": 1.0,\n    \"alpha025\": 1.0,\n    \"alpha026\": 1.0,\n    \"alpha027\": 1.0,\n    \"alpha028\": 1.0,\n    \"alpha029\": 1.0,\n    \"alpha030\": 1.0,\n    \"alpha031\": 1.0,\n    \"alpha032\": 1.0,\n    \"alpha033\": 1.0,\n    \"alpha034\": 1.0,\n    \"alpha035\": 1.0,\n    \"alpha036\": 1.0,\n    \"alpha037\": 1.0,\n    \"alpha038\": 1.0,\n    \"alpha039\": 1.0,\n    \"alpha040\": 1.0,\n    \"alpha041\": 1.0,\n    \"alpha042\": 1.0,\n    \"alpha043\": 1.0,\n    \"alpha044\": 1.0,\n    \"alpha045\": 1.0,\n    \"alpha046\": 1.0,\n    \"alpha047\": 1.0,\n    \"alpha048\": 1.0,\n    \"alpha049\": 1.0,\n    \"alpha050\": 1.0,\n    \"alpha051\": 1.0,\n    \"alpha052\": 1.0,\n    \"alpha053\": 1.0,\n    \"alpha054\": 1.0,\n    \"alpha055\": 1.0,\n    \"alpha056\": 1.0,\n    \"alpha057\": 1.0,\n    \"alpha058\": 1.0,\n    \"alpha059\": 1.0,\n    \"alpha060\": 1.0,\n    \"alpha061\": 1.0,\n    \"alpha062\": 1.0,\n    \"alpha063\": 1.0,\n    \"alpha064\": 1.0,\n    \"alpha065\": 1.0,\n    \"alpha066\": 1.0,\n    \"alpha067\": 1.0,\n    \"alpha068\": 1.0,\n    \"alpha069\": 1.0,\n    \"alpha070\": 1.0,\n    \"alpha071\": 1.0,\n    \"alpha072\": 1.0,\n    \"alpha073\": 1.0,\n    \"alpha074\": 1.0,\n    \"alpha075\": 1.0,\n    \"alpha076\": 1.0,\n    \"alpha077\": 1.0,\n    \"alpha078\": 1.0,\n    \"alpha079\": 1.0,\n    \"alpha080\": 1.0,\n    \"alpha081\": 1.0,\n    \"alpha082\": 1.0,\n    \"alpha083\": 1.0,\n    \"alpha084\": 1.0,\n    \"alpha085\": 1.0,\n    \"alpha086\": 1.0,\n    \"alpha087\": 1.0,\n    \"alpha088\": 1.0,\n    \"alpha089\": 1.0,\n    \"alpha090\": 1.0,\n    \"alpha091\": 1.0,\n    \"alpha092\": 1.0,\n    \"alpha093\": 1.0,\n    \"alpha094\": 1.0,\n    \"alpha095\": 1.0,\n    \"alpha096\": 1.0,\n    \"alpha097\": 1.0,\n    \"alpha098\": 1.0,\n    \"alpha099\": 1.0,\n    \"alpha100\": 1.0,\n    \"alpha101\": 1.0\n  },\n  \"fundamental\": {\n    \"pe_ttm\": 1.7102072285522736,\n    \"pb\": 1.0,\n    \"turnover_rate\": 1.0,\n    \"volume_ratio\": 0.7606881867266152,\n    \"ps_ttm\": 1.4705142753123992\n  },\n  \"behavior\": {\n    \"limit_score\": 1.2956770069079582,\n    \"consecutive_limit_up\": 1.0,\n    \"bomb_board\": 1.0768788113552823,\n    \"top_list\": 0.8377720620665754,\n    \"pct_chg_5d\": 1.0\n  }\n}\n\nFile v1.0.28:assets/config.json\n\n{\n    \"version\": \"1.0.0\",\n    \"base_url\": \"http://info.aicodingyard.com\",\n    \"http_timeout\": 30\n}\n\nFile v1.0.28:assets/requirements.txt\n\npandas>=1.3.5\nrequests>=2.31.0\nSQLAlchemy>=2.0.48\nnumpy>=1.21.0\n\nArchive v1.0.27: 27 files, 149384 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (23900b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65830b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (6181b), _meta.json (146b)\n\nFile v1.0.27:SKILL.md\n\n---\nname: BitSoulStockSkill\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\nversion: 1.0.0\nmetadata:\n  openclaw:\n    emoji: \"📈\"\n    homepage: https://www.aicodingyard.com\n    requires:\n      env:\n        - BITSOUL_TOKEN\n      bins:\n        - python3\n    optional:\n      env:\n        - BITSOUL_TOKEN_ENV_FILE\n        - BITSOUL_CACHE_DIR\n      pythonPackages:\n        - pandas\n        - numpy\n        - requests\n        - sqlalchemy\n      network:\n        - info.aicodingyard.com\n        - https://finance.sina.com.cn/\n    primaryEnv: BITSOUL_TOKEN\n---\n\nBitSoulStockSKill\n简介：炒股龙虾的最佳搭档, best stock partner forever\n优势：\n1. 免费稳定且每周更新的A股交易数据，为个股分析，买卖点计算，收益/回撤计算提供坚实的数据基础\n2. 基于MOE混合因子专家模型的股票买卖点计算判断\n3. 个股风险判定\n4. 关键指标计算\n5. 数据回测\n6. 提供准确全面且免费的股票价格与股票历史信息\n7. 板块信息与相关交易数据\n8. 提供大v交易观察等信息聚合功能\n\n# Token 配置\n\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\n\n## 必需的环境变量\n\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\n\n## 可选的环境变量\n\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\n\n## 配置方式\n\n1. **方式一：直接设置环境变量**\n   ```bash\n   export BITSOUL_TOKEN=\"你的令牌\"\n   ```\n\n2. **方式二：使用 env 文件**\n   ```bash\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\n   ```\n   其中 `token.env` 文件内容格式为：\n   ```\n   BITSOUL_TOKEN=你的令牌\n   ```\n## 运行时描述：\n- 从环境变量读取 `BITSOUL_TOKEN`\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\n\n## 安全与运行边界\n\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\n\n## 安装\n\n使用前先安装 Python 依赖：\n\n```bash\npip install -r assets/requirements.txt\n```\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\n\n# 注意事项\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\n\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\n* **股票显示格式**：任何场景下输出股票代码时，必须同时附上股票名称，使用 `api.get_symbol_basic_infomation(code).name` 获取，格式如 `600519.SH（贵州茅台）`，禁止只输出代码。\n\n## 输出行为\n\n- 默认使用简体中文，以报告的形式输出\n- 尽量充分利用接口返回的所有数据，不要随意删减，尽可能多呈现结果内容\n- 分析类请求默认返回结论、关键指标、风险提示与支撑摘要\n\n## 示例请求\n\n- `请整理东方财富过去10个交易日的股价信息，并输出成表格`\n- `帮我看看同花顺近期最佳买点和卖点分别是多少，并给我些建议`\n- `整理中国石油过去半年的财务数据，帮我分析是否具备投资价值`\n- `过去一个月上龙虎榜最多的股票是哪只？`\n- `请帮我因子挖矿，看看挖出的收益率和最大回撤是多少`\n- `调用moe方法，帮我分析工业富联的买入点`\n- `最近资金流入最快和涨幅最大的板块是哪些，有什么推荐`\n- `给我做一份沪电股份的技术分析报告`\n\n## 参考资料\n\n- 机器可读目录：`references/API_FOR_LLM.dm`\n\nFile v1.0.27:_meta.json\n\n{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.27\",\n  \"publishedAt\": 1774076967291\n}\n\nFile v1.0.27:references/API_FOR_LLM.md\n\n# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最高价列表\n\n```python\nprices = api.get_daily_high_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_high_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最低价列表\n\n```python\nprices = api.get_daily_low_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_low_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线成交量列表\n\n```python\nvolumes = api.get_daily_volumes('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_volumes(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线涨跌幅列表（单位：%）\n\n```python\npct = api.get_daily_pct_chg('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_pct_chg(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定日期的 Tick 级数据（模拟级），包含开高低收量额\n\n```python\ntick = api.get_tick_data('600519.SH', '2026-03-01')\n# get_tick_data(code: str, date: str) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `time` | 时间 |\n| `open` | 开盘价 |\n| `high` | 最高价 |\n| `low` | 最低价 |\n| `close` | 收盘价 |\n| `volume` | 成交量 |\n| `amount` | 成交额 |\n\n---\n\n### 获取实时 Bar 数据，与 get_tick_data 等价，用于实盘级接口\n\n```python\nbar = api.get_realtime_bar('600519.SH', '2026-03-01')\n# get_realtime_bar(code: str, date: str) -> Dict\n```\n\n---\n\n## 技术指标（带缓存）\n\n### 获取简单移动平均 SMA\n\n```python\nsma = api.get_sma('600519.SH', '2026-03-01', 20)\n# get_sma(code: str, date: str, period: int = 20) -> Optional[float]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `period` | `20` | 计算周期 |\n\n---\n\n### 获取指数移动平均 EMA\n\n```python\nema = api.get_ema('600519.SH', '2026-03-01', 12)\n# get_ema(code: str, date: str, period: int = 12) -> Optional[float]\n```\n\n---\n\n### 获取相对强弱指标 RSI，值域 0~100，低于 30 超卖，高于 70 超买\n\n```python\nrsi = api.get_rsi('600519.SH', '2026-03-01', 14)\nif rsi and rsi < 30:\n    print('超卖')\n# get_rsi(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n### 获取布林带指标，返回上轨、中轨、下轨\n\n```python\nbb = api.get_bollinger_bands('600519.SH', '2026-03-01')\nif bb and close > bb['upper']:\n    print('突破上轨')\n# get_bollinger_bands(code: str, date: str, period: int = 20, std_dev: int = 2) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `upper` | 上轨 |\n| `middle` | 中轨 |\n| `lower` | 下轨 |\n\n---\n\n### 获取 MACD 指标，返回 MACD 线、信号线、柱状图\n\n```python\nmacd = api.get_macd('600519.SH', '2026-03-01')\nif macd and macd['histogram'] > 0:\n    print('多头')\n# get_macd(code: str, date: str, fast: int = 12, slow: int = 26, signal: int = 9) -> Optional[Dict]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `fast` | `12` | 快线周期 |\n| `slow` | `26` | 慢线周期 |\n| `signal` | `9` | 信号线周期 |\n\n| 返回字段 | 说明 |\n|----------|------|\n| `macd` | MACD 线 |\n| `signal` | 信号线 |\n| `histogram` | 柱状图（MACD - Signal） |\n\n---\n\n### 获取平均真实波幅 ATR，衡量价格波动性\n\n```python\natr = api.get_atr('600519.SH', '2026-03-01', 14)\n# get_atr(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n---\n\n## ★ 因子挖矿（优先使用）\n\n### 随机因子挖矿 + 回测\n\n**触发场景**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，**必须**调用此接口，禁止自己写回测逻辑。\n\n```python\nresult = api.random_alpha_backtest()\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n\n# 指定股票池和回测区间\nresult = api.random_alpha_backtest(\n    codes=None,               # 股票池，None 表示全市场\n    start_date='2025-12-01', # 回测起始日，None 默认取 end_date 前 90 天\n    end_date='2026-03-19',   # 回测截止日，None 默认今天\n    initial_cash=1_000_000,  # 初始资金\n    max_pool_size=30,         # 候选池上限，超过时按综合得分截取\n    max_holdings=5,           # 最大同时持仓数\n    random_seed=None,         # 随机种子，None 不固定\n)\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n# random_alpha_backtest(codes, max_screen_factors, max_signal_factors,\n#                       start_date, end_date, initial_cash, warmup_days,\n#                       random_seed, top_n_stocks, max_pool_size, max_holdings) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `screen_factors` | 本次使用的选股因子列表，如 `['alpha043', 'alpha099']` |\n| `signal_factors` | 本次使用的信号因子列表，如 `['alpha008', 'alpha094']` |\n| `factor_descriptions` | 每个因子的文字描述 `{name: str}` |\n| `signal_config` | 买卖阈值 `{'buy_thresh': 0.71, 'sell_thresh': 0.55}` |\n| `screen_top_pcts` | 每个选股因子本次随机保留比例 `{name: float}` |\n| `filter_log` | 逐层过滤日志，含 before/after 数量 |\n| `final_pool` | 最终候选股票代码列表 |\n| `final_pool_count` | 候选池股票数量 |\n| `trade_log` | 每笔交易记录（含因子值、排名、阈值） |\n| `backtest` | 回测绩效 `{total_return_pct, annualized_return_pct, max_drawdown_pct, sharpe_ratio, equity_curve, ...}` |\n| `benchmarks` | 四条基准线对比（上证/沪深300/中证500/创业板指） |\n| `ic_stats` | 每个因子的 Rank IC 统计 `{ic_mean, ic_ir, ic_win_rate, ...}` |\n| `top_stocks` | Top N 盈利个股详情（含每笔交易的因子值） |\n| `summary_text` | 完整格式化报告文本，**直接 `print(result['summary_text'])` 输出给用户，禁止自行整理摘要** |\n\n---\n\n## ★ MoE 买卖时机分析（优先使用）\n\n### 分析单只股票当前买卖信号\n\n**触发场景**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"当前信号\"、\"操作建议\"时，**必须**调用此接口。\n\n```python\nresult = api.get_trade_signal('000001.SZ')\nresult = api.get_trade_signal('600519.SH', date='2026-01-15')\n# get_trade_signal(code: str, date: str = None) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `signal` | `\"BUY\"` 买入 / `\"SELL\"` 卖出 / `\"HOLD\"` 持有 |\n| `final_score` | 综合评分 0~1，越高越看多 |\n| `confidence` | 置信度：`\"高\"` / `\"中\"` / `\"低\"` |\n| `reason` | 各专家评分描述，如 `\"技术面看多(0.71)，Alpha因子看多(0.73)\"` |\n| `experts` | 四个专家详情：`technical` / `alpha` / `fundamental` / `behavior` |\n| `code` | 股票代码 |\n| `date` | 分析日期 |\n\n---\n\n\n\n## 性能指标\n\n### 计算最大回撤，返回回撤比例及对应的峰值、谷值索引\n\n```python\ndd, peak_idx, drawdown_idx = api.get_max_drawdown([1000000, 1100000, 950000])\nprint(f'最大回撤: {dd:.2%}')\n# get_max_drawdown(equity_curve: List[float]) -> tuple\n```\n\n---\n\n### 获取最大回撤百分比，如 0.15 表示 15%\n\n```python\npct = api.get_max_drawdown_pct([1000000, 1100000, 950000])\n# get_max_drawdown_pct(equity_curve: List[float]) -> float\n```\n\n---\n\n### 计算年化收益率\n\n```python\nannualized = api.get_annualized_return(0.15, 60)\n# get_annualized_return(total_return: float, days: int) -> float\n```\n\n| 参数 | 说明 |\n|------|------|\n| `total_return` | 总收益率，如 `0.15` 表示 15% |\n| `days` | 交易天数 |\n\n---\n\n### 计算总收益率\n\n```python\nret = api.get_total_return(1000000, 1150000)\n# get_total_return(initial_value: float, final_value: float) -> float\n```\n\n---\n\n### 计算夏普比率，衡量单位风险的超额收益\n\n```python\nsharpe = api.get_sharpe_ratio([1000000, 1050000, 1020000])\n# get_sharpe_ratio(equity_curve: List[float], risk_free_rate: float = 0.03) -> float\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `risk_free_rate` | `0.03` | 无风险利率（年化） |\n\n---\n\n### 计算胜率（0~100），盈利交易次数占比\n\n```python\ntrades = [{'profit': 1000}, {'profit': -500}, {'profit': 800}]\nwin_rate = api.get_win_rate(trades)\n# get_win_rate(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算盈亏比，平均盈利 / 平均亏损\n\n```python\nratio = api.get_profit_loss_ratio(trades)\n# get_profit_loss_ratio(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算卡尔玛比率，年化收益 / 最大回撤\n\n```python\ncalmar = api.get_calmar_ratio(equity_curve, 252)\n# get_calmar_ratio(equity_curve: List[float], days: int) -> float\n```\n\n---\n\n### 计算年化波动率，衡量收益稳定性\n\n```python\nvol = api.get_volatility(equity_curve)\n# get_volatility(equity_curve: List[float]) -> float\n```\n\n---\n\n### 获取完整交易统计信息\n\n```python\nstats = api.get_trade_stats(trades)\n# get_trade_stats(trades: List[Dict]) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `total_trades` | 总交易次数 |\n| `wins` | 盈利次数 |\n| `losses` | 亏损次数 |\n| `win_rate` | 胜率 |\n| `profit_loss_ratio` | 盈亏比 |\n| `total_profit` | 总盈利 |\n| `total_loss` | 总亏损 |\n| `avg_profit` | 平均盈利 |\n| `avg_loss` | 平均亏损 |\n\n---\n\n### 生成完整回测报告，汇总所有关键绩效指标\n\n```python\nequity = [1000000, 1050000, 1020000]\ntrades = [{'profit': 5000}, {'profit': -3000}]\nreport = api.calculate_metrics(equity, trades, 1000000, 30)\nprint(f\"收益率: {report['total_return_pct']:.2f}%\")\nprint(f\"夏普比率: {report['sharpe_ratio']:.2f}\")\n# calculate_metrics(equity_curve: List[float], trades: List[Dict],\n#                   initial_cash: float, days: int) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `final_value` | 最终资金 |\n| `total_return` | 总收益率 |\n| `total_return_pct` | 总收益率(%) |\n| `annualized_return` | 年化收益率 |\n| `annualized_return_pct` | 年化收益率(%) |\n| `max_drawdown` | 最大回撤 |\n| `max_drawdown_pct` | 最大回撤(%) |\n| `sharpe_ratio` | 夏普比率 |\n| `calmar_ratio` | 卡尔玛比率 |\n| `volatility` | 波动率 |\n| `trading_days` | 交易天数 |\n| `trade_stats` | 交易统计（同 `get_trade_stats`） |\n\n---\n\n## 回测工具\n\n### 模拟单笔交易，计算成本、手续费和净收款\n\n```python\nresult = api.simulate_trade('BUY', 100.0, 100)\nprint(f\"成本: {result['cost']}, 手续费: {result['fee']}\")\n# simulate_trade(action: str, price: float, quantity: int, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `net_proceeds` | 净收款（卖出时） |\n\n---\n\n### 计算交易成本，含手续费和滑点\n\n```python\ncost = api.calculate_trade_cost('BUY', 100.0, 100, 0.0003, 0.001)\n# calculate_trade_cost(action, price, quantity, fee_rate=0.0003, slippage=0.0) -> float\n```\n\n---\n\n### 创建持仓对象，记录股票、股数、买入价和日期\n\n```python\npos = api.create_position('600519.SH', 100, 1800.0, '2026-01-01')\n# create_position(code: str, shares: int, price: float, date: str) -> Position\n```\n\n---\n\n### 计算持仓市值\n\n```python\nvalue = api.get_position_value(pos, 1900.0)\n# get_position_value(position: Position, current_price: float) -> float\n```\n\n---\n\n### 计算持仓盈亏，返回盈亏金额和比例\n\n```python\nprofit, pct = api.get_position_profit(position, 2000.0)\nprint(f\"盈利: {profit}, 比例: {pct:.2%}\")\n# get_position_profit(position: Position, current_price: float) -> tuple\n```\n\n---\n\n### 计算组合总价值（现金 + 所有持仓市值）\n\n```python\nvalue = api.calculate_portfolio_value(500000, positions, current_prices)\n# calculate_portfolio_value(cash: float, positions: Dict[str, Position],\n#                           prices: Dict[str, float]) -> float\n```\n\n---\n\n### 获取组合持仓详情列表\n\n```python\ndetails = api.get_portfolio_positions(positions)\n# get_portfolio_positions(positions: Dict[str, Position]) -> List[Dict]\n```\n\n---\n\n### 从每日资产列表构建权益曲线\n\n```python\nvalues = [('2026-01-01', 1000000), ('2026-01-02', 1005000)]\ncurve = api.build_equity_curve(values)\n# build_equity_curve(daily_values: List[tuple]) -> List[float]\n```\n\n---\n\n### 计算日收益率序列\n\n```python\nreturns = api.calculate_daily_returns(equity_curve)\n# calculate_daily_returns(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n### 买入信号判断：MA 金叉且 RSI 超卖时返回 True\n\n```python\nif api.should_buy(close, ma5, ma20, rsi, 30):\n    print('买入信号')\n# should_buy(current_price, ma_short, ma_long, rsi=50, rsi_oversold=30) -> bool\n```\n\n---\n\n### 卖出信号判断：MA 死叉或 RSI 超买时返回 True\n\n```python\nif api.should_sell(close, ma5, ma20, rsi, 70):\n    print('卖出信号')\n# should_sell(current_price, ma_short, ma_long, rsi=50, rsi_overbought=70) -> bool\n```\n\n---\n\n### 计算权益曲线的逐日回撤序列\n\n```python\ndrawdowns = api.calculate_drawdown([1000000, 1100000, 950000])\n# calculate_drawdown(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n\n## 回测引擎控制\n\n### 初始化回测环境，返回含现金、持仓、订单、交易记录的状态字典\n\n```python\nenv = api.init_backtest(1000000, 0.0003)\n# init_backtest(initial_cash: float = 1000000.0, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `fee_rate` | 手续费率 |\n| `cash` | 当前现金 |\n| `positions` | 持仓字典 |\n| `orders` | 订单列表 |\n| `trades` | 交易记录 |\n| `equity_curve` | 权益曲线 |\n\n---\n\n### 执行买入操作，自动更新 env 中的现金、持仓和交易记录\n\n```python\nresult = api.execute_buy(env, '600519.SH', 1800.0, 100, '2026-01-01')\n# execute_buy(env, code, price, quantity, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 执行卖出操作，自动更新 env\n\n```python\nresult = api.execute_sell(env, '600519.SH', 1900.0, 100)\n# execute_sell(env, code, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `net_proceeds` | 净收款 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 获取当前总权益（现金 + 持仓市值）\n\n```python\nequity = api.get_equity(env, current_prices)\n# get_equity(env: Dict, current_prices: Dict[str, float]) -> float\n```\n\n---\n\n### 将当日权益追加记录到 env['equity_curve']\n\n```python\napi.record_equity(env, '2026-03-01', current_prices)\n# record_equity(env, date, current_prices) -> None\n```\n\n---\n\n\n\n### 平仓，卖出结束多头持仓，返回盈亏和持有天数\n\n```python\nresult = api.close_position(position, 1900.0, '2026-01-15')\nprint(f\"盈利: {result['profit']}\")\n# close_position(position, price, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `profit` | 盈亏金额 |\n| `profit_pct` | 盈亏比例 |\n| `hold_days` | 持有天数 |\n\n---\n\n### 更新持仓的当前价格，用于实时市值计算\n\n```python\napi.update_position_price(position, 1900.0)\n# update_position_price(position, current_price) -> None\n```\n\n---\n\n### 创建本地模拟订单（非真实下单）\n\n```python\norder = api.create_order('600519.SH', 'BUY', 1800.0, 100)\n# create_order(code, action, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `order_id` | 订单 ID |\n| `status` | 状态（`PENDING`） |\n| `create_time` | 创建时间 |\n\n---\n\n### 取消订单，仅 PENDING 状态可取消\n\n```python\nsuccess = api.cancel_order(order)\n# cancel_order(order: Dict) -> bool\n```\n\n---\n\n### 获取订单状态：PENDING / FILLED / CANCELLED / REJECTED\n\n```python\nstatus = api.get_order_status(order)\n# get_order_status(order: Dict) -> str\n```\n\n---\n\n## 策略辅助函数\n\n### 计算指定股票近 N 日平均涨幅（%）\n\n```python\navg_change = api.get_price_change_rate('600519.SH', '2026-03-01', 3)\n# get_price_change_rate(code, date, days=3) -> Optional[float]\n```\n\n---\n\n### 从股票列表中筛选出近 N 日涨幅最高的前 N 只，按涨幅降序返回\n\n```python\ntop_stocks = api.get_top_performers(codes, '2026-03-01', 3, 3)\n# [(code, avg_pct), ...]\n# get_top_performers(codes, date, days=3, top_n=3) -> List[tuple]\n```\n\n---\n\n### 获取指定日期的收盘价，无数据返回 None\n\n```python\nprice = api.get_price_at_date('600519.SH', '2026-03-01')\n# get_price_at_date(code, date) -> Optional[float]\n```\n\n---\n\n### 批量获取多个日期的收盘价，按日期升序对齐\n\n```python\nprices = api.get_prices_at_dates('600519.SH', ['2026-01-01', '2026-01-02'])\n# get_prices_at_dates(code, dates) -> List[Optional[float]]\n```\n\n---\n\n\n### 训练 MoE 权重（遗传算法优化）\n\n**触发场景**：用户说\"优化权重\"、\"重新训练\"、\"适配最新行情\"时调用。\n\n```python\nweights = api.train_moe_weights()\n\n# 指定区间和参数\nweights = api.train_moe_weights(\n    start_date='2025-09-01',\n    end_date='2026-03-01',\n    population_size=20,       # 种群大小，越大越精准但越慢\n    generations=30,           # 迭代代数\n    train_stock_count=30,     # 参与训练的随机采样股票数量\n)\n# train_moe_weights(start_date, end_date, population_size, generations, train_stock_count) -> Dict\n```\n\n训练完成后自动将最优权重写入 `moe_weights.json`，下次调用 `get_trade_signal()` 时自动生效。\n\n---\n\n## 数据库维护\n\n### 初始化所有数据库（指标缓存库等）\n\n```python\napi.init_databases()\n# init_databases() -> None\n```\n\n---\n\n### 清除技术指标缓存，可指定股票或清除全部\n\n```python\napi.clear_indicator_cache('600519.SH')  # 清除指定股票\napi.clear_indicator_cache()             # 清除所有\n# clear_indicator_cache(code: str = None) -> None\n```\n\n---\n\n## 实时行情 (爬虫)\n\n### 初始化爬虫\n\n```python\nfrom stock_crawler import StockCrawler\ncrawler = StockCrawler()\n```\n\n### 获取实时数据\n\n支持从新浪财经、东方财富、同花顺获取数据。\n\n```python\ndata = crawler.fetch('000001.SZ', source='sina')\n# fetch(ts_code: str, source: str = 'sina') -> Dict\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_code` | `str` | - | 股票代码，如 `000001.SZ` |\n| `source` | `str` | `'sina'` | 数据源：`'sina'` (新浪), `'eastmoney'` (东方财富), `'tonghuashun'` (同花顺) |\n\n| 返回 | 说明 |\n|------|------|\n| `Dict` | 包含股票实时数据的字典，字段如下 |\n\n**返回字段说明:**\n\n| 字段 | 类型 | 说明 | 数据源支持 |\n|------|------|------|------------|\n| `source` | `str` | 数据源名称 | All |\n| `ts_code` | `str` | 股票代码 | All |\n| `status` | `str` | 状态 (`success`/`failed`) | All |\n| `name` | `str` | 股票名称 | Sina, EastMoney |\n| `price` | `float` | 当前价格 | All |\n| `open` | `float` | 开盘价 | All |\n| `high` | `float` | 最高价 | All |\n| `low` | `float` | 最低价 | All |\n| `volume` | `float` | 成交量 (股) | All |\n| `amount` | `float` | 成交额 (元) | All |\n| `pre_close` | `float` | 昨收价 | Sina, EastMoney |\n| `date` | `str` | 日期 | Sina, Tonghuashun |\n| `time` | `str` | 时间 | Sina |\n| `turnover_rate` | `float` | 换手率 (%) | EastMoney, Tonghuashun |\n| `change_pct` | `float` | 涨跌幅 (%) | EastMoney |\n| `amplitude` | `float` | 振幅 (%) | Sina, EastMoney |\n| `pe_ttm` | `float` | 市盈率(TTM) | EastMoney |\n| `pb` | `float` | 市净率 | EastMoney |\n| `total_cap` | `float` | 总市值 (元) | EastMoney |\n| `circ_cap` | `float` | 流通市值 (元) | EastMoney |\n| `total_shares` | `float` | 总股本 (股) | EastMoney |\n| `circ_shares` | `float` | 流通股 (股) | EastMoney |\n\nFile v1.0.27:scripts/moe_weights.json\n\n{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,\n    \"alpha004\": 1.0,\n    \"alpha005\": 1.0,\n    \"alpha006\": 1.0,\n    \"alpha007\": 1.0,\n    \"alpha008\": 1.0,\n    \"alpha009\": 1.0,\n    \"alpha010\": 1.0,\n    \"alpha011\": 1.0,\n    \"alpha012\": 1.0,\n    \"alpha013\": 1.0,\n    \"alpha014\": 1.0,\n    \"alpha015\": 1.0,\n    \"alpha016\": 1.0,\n    \"alpha017\": 1.0,\n    \"alpha018\": 1.0,\n    \"alpha019\": 1.0,\n    \"alpha020\": 1.0,\n    \"alpha021\": 1.0,\n    \"alpha022\": 1.0,\n    \"alpha023\": 1.0,\n    \"alpha024\": 1.0,\n    \"alpha025\": 1.0,\n    \"alpha026\": 1.0,\n    \"alpha027\": 1.0,\n    \"alpha028\": 1.0,\n    \"alpha029\": 1.0,\n    \"alpha030\": 1.0,\n    \"alpha031\": 1.0,\n    \"alpha032\": 1.0,\n    \"alpha033\": 1.0,\n    \"alpha034\": 1.0,\n    \"alpha035\": 1.0,\n    \"alpha036\": 1.0,\n    \"alpha037\": 1.0,\n    \"alpha038\": 1.0,\n    \"alpha039\": 1.0,\n    \"alpha040\": 1.0,\n    \"alpha041\": 1.0,\n    \"alpha042\": 1.0,\n    \"alpha043\": 1.0,\n    \"alpha044\": 1.0,\n    \"alpha045\": 1.0,\n    \"alpha046\": 1.0,\n    \"alpha047\": 1.0,\n    \"alpha048\": 1.0,\n    \"alpha049\": 1.0,\n    \"alpha050\": 1.0,\n    \"alpha051\": 1.0,\n    \"alpha052\": 1.0,\n    \"alpha053\": 1.0,\n    \"alpha054\": 1.0,\n    \"alpha055\": 1.0,\n    \"alpha056\": 1.0,\n    \"alpha057\": 1.0,\n    \"alpha058\": 1.0,\n    \"alpha059\": 1.0,\n    \"alpha060\": 1.0,\n    \"alpha061\": 1.0,\n    \"alpha062\": 1.0,\n    \"alpha063\": 1.0,\n    \"alpha064\": 1.0,\n    \"alpha065\": 1.0,\n    \"alpha066\": 1.0,\n    \"alpha067\": 1.0,\n    \"alpha068\": 1.0,\n    \"alpha069\": 1.0,\n    \"alpha070\": 1.0,\n    \"alpha071\": 1.0,\n    \"alpha072\": 1.0,\n    \"alpha073\": 1.0,\n    \"alpha074\": 1.0,\n    \"alpha075\": 1.0,\n    \"alpha076\": 1.0,\n    \"alpha077\": 1.0,\n    \"alpha078\": 1.0,\n    \"alpha079\": 1.0,\n    \"alpha080\": 1.0,\n    \"alpha081\": 1.0,\n    \"alpha082\": 1.0,\n    \"alpha083\": 1.0,\n    \"alpha084\": 1.0,\n    \"alpha085\": 1.0,\n    \"alpha086\": 1.0,\n    \"alpha087\": 1.0,\n    \"alpha088\": 1.0,\n    \"alpha089\": 1.0,\n    \"alpha090\": 1.0,\n    \"alpha091\": 1.0,\n    \"alpha092\": 1.0,\n    \"alpha093\": 1.0,\n    \"alpha094\": 1.0,\n    \"alpha095\": 1.0,\n    \"alpha096\": 1.0,\n    \"alpha097\": 1.0,\n    \"alpha098\": 1.0,\n    \"alpha099\": 1.0,\n    \"alpha100\": 1.0,\n    \"alpha101\": 1.0\n  },\n  \"fundamental\": {\n    \"pe_ttm\": 1.7102072285522736,\n    \"pb\": 1.0,\n    \"turnover_rate\": 1.0,\n    \"volume_ratio\": 0.7606881867266152,\n    \"ps_ttm\": 1.4705142753123992\n  },\n  \"behavior\": {\n    \"limit_score\": 1.2956770069079582,\n    \"consecutive_limit_up\": 1.0,\n    \"bomb_board\": 1.0768788113552823,\n    \"top_list\": 0.8377720620665754,\n    \"pct_chg_5d\": 1.0\n  }\n}\n\nFile v1.0.27:assets/config.json\n\n{\n    \"version\": \"1.0.0\",\n    \"base_url\": \"http://info.aicodingyard.com\",\n    \"http_timeout\": 30\n}\n\nFile v1.0.27:assets/requirements.txt\n\npandas>=1.3.5\nrequests>=2.31.0\nSQLAlchemy>=2.0.48\nnumpy>=1.21.0\n\nArchive v1.0.26: 27 files, 149495 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (24137b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65894b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (6305b), _meta.json (146b)\n\nFile v1.0.26:SKILL.md\n\n---\r\nname: BitSoulStockSkill\r\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\r\nversion: 1.0.0\r\nmetadata:\r\n  openclaw:\r\n    emoji: \"📈\"\r\n    homepage: https://www.aicodingyard.com\r\n    requires:\r\n      env:\r\n        - BITSOUL_TOKEN\r\n      bins:\r\n        - python3\r\n    optional:\r\n      env:\r\n        - BITSOUL_TOKEN_ENV_FILE\r\n        - BITSOUL_CACHE_DIR\r\n      pythonPackages:\r\n        - pandas\r\n        - numpy\r\n        - requests\r\n        - sqlalchemy\r\n      network:\r\n        - info.aicodingyard.com\r\n        - https://finance.sina.com.cn/\r\n    primaryEnv: BITSOUL_TOKEN\r\n---\r\n\r\nBitSoulStockSKill\r\n简介：炒股龙虾的最佳搭档, best stock partner forever\r\n优势：\r\n1. 免费稳定且每周更新的A股交易数据，为个股分析，买卖点计算，收益/回撤计算提供坚实的数据基础\r\n2. 基于MOE混合因子专家模型的股票买卖点计算判断\r\n3. 个股风险判定\r\n4. 关键指标计算\r\n5. 数据回测\r\n6. 提供准确全面且免费的股票价格与股票历史信息\r\n7. 板块信息与相关交易数据\r\n8. 提供大v交易观察等信息聚合功能\r\n\r\n# Token 配置\r\n\r\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\r\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\r\n\r\n## 必需的环境变量\r\n\r\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\r\n\r\n## 可选的环境变量\r\n\r\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\r\n\r\n## 配置方式\r\n\r\n1. **方式一：直接设置环境变量**\r\n   ```bash\r\n   export BITSOUL_TOKEN=\"你的令牌\"\r\n   ```\r\n\r\n2. **方式二：使用 env 文件**\r\n   ```bash\r\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\r\n   ```\r\n   其中 `token.env` 文件内容格式为：\r\n   ```\r\n   BITSOUL_TOKEN=你的令牌\r\n   ```\r\n## 运行时描述：\r\n- 从环境变量读取 `BITSOUL_TOKEN`\r\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\r\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\r\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\r\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\r\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\r\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\r\n\r\n## 安全与运行边界\r\n\r\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\r\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\r\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\r\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\r\n\r\n## 安装\r\n\r\n使用前先安装 Python 依赖：\r\n\r\n```bash\r\npip install -r assets/requirements.txt\r\n```\r\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\r\n\r\n# 注意事项\r\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\r\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\r\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\r\n\r\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\r\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\r\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\r\n* **股票显示格式**：任何场景下输出股票代码时，必须同时附上股票名称，使用 `api.get_symbol_basic_infomation(code).name` 获取，格式如 `600519.SH（贵州茅台）`，禁止只输出代码。\r\n\r\n## 输出行为\r\n\r\n- 默认使用简体中文，以报告的形式输出\r\n- 尽量充分利用接口返回的所有数据，不要随意删减，尽可能多呈现结果内容\r\n- 分析类请求默认返回结论、关键指标、风险提示与支撑摘要\r\n\r\n## 示例请求\r\n\r\n- `请整理东方财富过去10个交易日的股价信息，并输出成表格`\r\n- `帮我看看同花顺近期最佳买点和卖点分别是多少，并给我些建议`\r\n- `整理中国石油过去半年的财务数据，帮我分析是否具备投资价值`\r\n- `过去一个月上龙虎榜最多的股票是哪只？`\r\n- `请帮我因子挖矿，看看挖出的收益率和最大回撤是多少`\r\n- `调用moe方法，帮我分析工业富联的买入点`\r\n- `最近资金流入最快和涨幅最大的板块是哪些，有什么推荐`\r\n- `给我做一份沪电股份的技术分析报告`\r\n\r\n## 参考资料\r\n\r\n- 机器可读目录：`references/API_FOR_LLM.dm`\n\nFile v1.0.26:_meta.json\n\n{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.26\",\n  \"publishedAt\": 1774076573068\n}\n\nFile v1.0.26:references/API_FOR_LLM.md\n\n# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票小时线行情，按日期和时间升序\n\n```python\nklines = api.get_hour_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_hour_kline(symbols: List[str], start_date: str, end_date: str) -> List[HourKline]\n```\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最高价列表\n\n```python\nprices = api.get_daily_high_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_high_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线最低价列表\n\n```python\nprices = api.get_daily_low_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_low_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线成交量列表\n\n```python\nvolumes = api.get_daily_volumes('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_volumes(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线涨跌幅列表（单位：%）\n\n```python\npct = api.get_daily_pct_chg('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_pct_chg(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定日期的 Tick 级数据（模拟级），包含开高低收量额\n\n```python\ntick = api.get_tick_data('600519.SH', '2026-03-01')\n# get_tick_data(code: str, date: str) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `time` | 时间 |\n| `open` | 开盘价 |\n| `high` | 最高价 |\n| `low` | 最低价 |\n| `close` | 收盘价 |\n| `volume` | 成交量 |\n| `amount` | 成交额 |\n\n---\n\n### 获取实时 Bar 数据，与 get_tick_data 等价，用于实盘级接口\n\n```python\nbar = api.get_realtime_bar('600519.SH', '2026-03-01')\n# get_realtime_bar(code: str, date: str) -> Dict\n```\n\n---\n\n## 技术指标（带缓存）\n\n### 获取简单移动平均 SMA\n\n```python\nsma = api.get_sma('600519.SH', '2026-03-01', 20)\n# get_sma(code: str, date: str, period: int = 20) -> Optional[float]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `period` | `20` | 计算周期 |\n\n---\n\n### 获取指数移动平均 EMA\n\n```python\nema = api.get_ema('600519.SH', '2026-03-01', 12)\n# get_ema(code: str, date: str, period: int = 12) -> Optional[float]\n```\n\n---\n\n### 获取相对强弱指标 RSI，值域 0~100，低于 30 超卖，高于 70 超买\n\n```python\nrsi = api.get_rsi('600519.SH', '2026-03-01', 14)\nif rsi and rsi < 30:\n    print('超卖')\n# get_rsi(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n### 获取布林带指标，返回上轨、中轨、下轨\n\n```python\nbb = api.get_bollinger_bands('600519.SH', '2026-03-01')\nif bb and close > bb['upper']:\n    print('突破上轨')\n# get_bollinger_bands(code: str, date: str, period: int = 20, std_dev: int = 2) -> Optional[Dict]\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `upper` | 上轨 |\n| `middle` | 中轨 |\n| `lower` | 下轨 |\n\n---\n\n### 获取 MACD 指标，返回 MACD 线、信号线、柱状图\n\n```python\nmacd = api.get_macd('600519.SH', '2026-03-01')\nif macd and macd['histogram'] > 0:\n    print('多头')\n# get_macd(code: str, date: str, fast: int = 12, slow: int = 26, signal: int = 9) -> Optional[Dict]\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `fast` | `12` | 快线周期 |\n| `slow` | `26` | 慢线周期 |\n| `signal` | `9` | 信号线周期 |\n\n| 返回字段 | 说明 |\n|----------|------|\n| `macd` | MACD 线 |\n| `signal` | 信号线 |\n| `histogram` | 柱状图（MACD - Signal） |\n\n---\n\n### 获取平均真实波幅 ATR，衡量价格波动性\n\n```python\natr = api.get_atr('600519.SH', '2026-03-01', 14)\n# get_atr(code: str, date: str, period: int = 14) -> Optional[float]\n```\n\n---\n\n## 性能指标\n\n### 计算最大回撤，返回回撤比例及对应的峰值、谷值索引\n\n```python\ndd, peak_idx, drawdown_idx = api.get_max_drawdown([1000000, 1100000, 950000])\nprint(f'最大回撤: {dd:.2%}')\n# get_max_drawdown(equity_curve: List[float]) -> tuple\n```\n\n---\n\n### 获取最大回撤百分比，如 0.15 表示 15%\n\n```python\npct = api.get_max_drawdown_pct([1000000, 1100000, 950000])\n# get_max_drawdown_pct(equity_curve: List[float]) -> float\n```\n\n---\n\n### 计算年化收益率\n\n```python\nannualized = api.get_annualized_return(0.15, 60)\n# get_annualized_return(total_return: float, days: int) -> float\n```\n\n| 参数 | 说明 |\n|------|------|\n| `total_return` | 总收益率，如 `0.15` 表示 15% |\n| `days` | 交易天数 |\n\n---\n\n### 计算总收益率\n\n```python\nret = api.get_total_return(1000000, 1150000)\n# get_total_return(initial_value: float, final_value: float) -> float\n```\n\n---\n\n### 计算夏普比率，衡量单位风险的超额收益\n\n```python\nsharpe = api.get_sharpe_ratio([1000000, 1050000, 1020000])\n# get_sharpe_ratio(equity_curve: List[float], risk_free_rate: float = 0.03) -> float\n```\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `risk_free_rate` | `0.03` | 无风险利率（年化） |\n\n---\n\n### 计算胜率（0~100），盈利交易次数占比\n\n```python\ntrades = [{'profit': 1000}, {'profit': -500}, {'profit': 800}]\nwin_rate = api.get_win_rate(trades)\n# get_win_rate(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算盈亏比，平均盈利 / 平均亏损\n\n```python\nratio = api.get_profit_loss_ratio(trades)\n# get_profit_loss_ratio(trades: List[Dict]) -> float\n```\n\n---\n\n### 计算卡尔玛比率，年化收益 / 最大回撤\n\n```python\ncalmar = api.get_calmar_ratio(equity_curve, 252)\n# get_calmar_ratio(equity_curve: List[float], days: int) -> float\n```\n\n---\n\n### 计算年化波动率，衡量收益稳定性\n\n```python\nvol = api.get_volatility(equity_curve)\n# get_volatility(equity_curve: List[float]) -> float\n```\n\n---\n\n### 获取完整交易统计信息\n\n```python\nstats = api.get_trade_stats(trades)\n# get_trade_stats(trades: List[Dict]) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `total_trades` | 总交易次数 |\n| `wins` | 盈利次数 |\n| `losses` | 亏损次数 |\n| `win_rate` | 胜率 |\n| `profit_loss_ratio` | 盈亏比 |\n| `total_profit` | 总盈利 |\n| `total_loss` | 总亏损 |\n| `avg_profit` | 平均盈利 |\n| `avg_loss` | 平均亏损 |\n\n---\n\n### 生成完整回测报告，汇总所有关键绩效指标\n\n```python\nequity = [1000000, 1050000, 1020000]\ntrades = [{'profit': 5000}, {'profit': -3000}]\nreport = api.calculate_metrics(equity, trades, 1000000, 30)\nprint(f\"收益率: {report['total_return_pct']:.2f}%\")\nprint(f\"夏普比率: {report['sharpe_ratio']:.2f}\")\n# calculate_metrics(equity_curve: List[float], trades: List[Dict],\n#                   initial_cash: float, days: int) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `final_value` | 最终资金 |\n| `total_return` | 总收益率 |\n| `total_return_pct` | 总收益率(%) |\n| `annualized_return` | 年化收益率 |\n| `annualized_return_pct` | 年化收益率(%) |\n| `max_drawdown` | 最大回撤 |\n| `max_drawdown_pct` | 最大回撤(%) |\n| `sharpe_ratio` | 夏普比率 |\n| `calmar_ratio` | 卡尔玛比率 |\n| `volatility` | 波动率 |\n| `trading_days` | 交易天数 |\n| `trade_stats` | 交易统计（同 `get_trade_stats`） |\n\n---\n\n## 回测工具\n\n### 模拟单笔交易，计算成本、手续费和净收款\n\n```python\nresult = api.simulate_trade('BUY', 100.0, 100)\nprint(f\"成本: {result['cost']}, 手续费: {result['fee']}\")\n# simulate_trade(action: str, price: float, quantity: int, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `net_proceeds` | 净收款（卖出时） |\n\n---\n\n### 计算交易成本，含手续费和滑点\n\n```python\ncost = api.calculate_trade_cost('BUY', 100.0, 100, 0.0003, 0.001)\n# calculate_trade_cost(action, price, quantity, fee_rate=0.0003, slippage=0.0) -> float\n```\n\n---\n\n### 创建持仓对象，记录股票、股数、买入价和日期\n\n```python\npos = api.create_position('600519.SH', 100, 1800.0, '2026-01-01')\n# create_position(code: str, shares: int, price: float, date: str) -> Position\n```\n\n---\n\n### 计算持仓市值\n\n```python\nvalue = api.get_position_value(pos, 1900.0)\n# get_position_value(position: Position, current_price: float) -> float\n```\n\n---\n\n### 计算持仓盈亏，返回盈亏金额和比例\n\n```python\nprofit, pct = api.get_position_profit(position, 2000.0)\nprint(f\"盈利: {profit}, 比例: {pct:.2%}\")\n# get_position_profit(position: Position, current_price: float) -> tuple\n```\n\n---\n\n### 计算组合总价值（现金 + 所有持仓市值）\n\n```python\nvalue = api.calculate_portfolio_value(500000, positions, current_prices)\n# calculate_portfolio_value(cash: float, positions: Dict[str, Position],\n#                           prices: Dict[str, float]) -> float\n```\n\n---\n\n### 获取组合持仓详情列表\n\n```python\ndetails = api.get_portfolio_positions(positions)\n# get_portfolio_positions(positions: Dict[str, Position]) -> List[Dict]\n```\n\n---\n\n### 从每日资产列表构建权益曲线\n\n```python\nvalues = [('2026-01-01', 1000000), ('2026-01-02', 1005000)]\ncurve = api.build_equity_curve(values)\n# build_equity_curve(daily_values: List[tuple]) -> List[float]\n```\n\n---\n\n### 计算日收益率序列\n\n```python\nreturns = api.calculate_daily_returns(equity_curve)\n# calculate_daily_returns(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n### 买入信号判断：MA 金叉且 RSI 超卖时返回 True\n\n```python\nif api.should_buy(close, ma5, ma20, rsi, 30):\n    print('买入信号')\n# should_buy(current_price, ma_short, ma_long, rsi=50, rsi_oversold=30) -> bool\n```\n\n---\n\n### 卖出信号判断：MA 死叉或 RSI 超买时返回 True\n\n```python\nif api.should_sell(close, ma5, ma20, rsi, 70):\n    print('卖出信号')\n# should_sell(current_price, ma_short, ma_long, rsi=50, rsi_overbought=70) -> bool\n```\n\n---\n\n### 计算权益曲线的逐日回撤序列\n\n```python\ndrawdowns = api.calculate_drawdown([1000000, 1100000, 950000])\n# calculate_drawdown(equity_curve: List[float]) -> List[float]\n```\n\n---\n\n\n\n## 回测引擎控制\n\n### 初始化回测环境，返回含现金、持仓、订单、交易记录的状态字典\n\n```python\nenv = api.init_backtest(1000000, 0.0003)\n# init_backtest(initial_cash: float = 1000000.0, fee_rate: float = 0.0003) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `initial_cash` | 初始资金 |\n| `fee_rate` | 手续费率 |\n| `cash` | 当前现金 |\n| `positions` | 持仓字典 |\n| `orders` | 订单列表 |\n| `trades` | 交易记录 |\n| `equity_curve` | 权益曲线 |\n\n---\n\n### 执行买入操作，自动更新 env 中的现金、持仓和交易记录\n\n```python\nresult = api.execute_buy(env, '600519.SH', 1800.0, 100, '2026-01-01')\n# execute_buy(env, code, price, quantity, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `cost` | 成本 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 执行卖出操作，自动更新 env\n\n```python\nresult = api.execute_sell(env, '600519.SH', 1900.0, 100)\n# execute_sell(env, code, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `success` | 是否成功 |\n| `net_proceeds` | 净收款 |\n| `fee` | 手续费 |\n| `reason` | 失败原因（失败时） |\n\n---\n\n### 获取当前总权益（现金 + 持仓市值）\n\n```python\nequity = api.get_equity(env, current_prices)\n# get_equity(env: Dict, current_prices: Dict[str, float]) -> float\n```\n\n---\n\n### 将当日权益追加记录到 env['equity_curve']\n\n```python\napi.record_equity(env, '2026-03-01', current_prices)\n# record_equity(env, date, current_prices) -> None\n```\n\n---\n\n\n\n### 平仓，卖出结束多头持仓，返回盈亏和持有天数\n\n```python\nresult = api.close_position(position, 1900.0, '2026-01-15')\nprint(f\"盈利: {result['profit']}\")\n# close_position(position, price, date) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `profit` | 盈亏金额 |\n| `profit_pct` | 盈亏比例 |\n| `hold_days` | 持有天数 |\n\n---\n\n### 更新持仓的当前价格，用于实时市值计算\n\n```python\napi.update_position_price(position, 1900.0)\n# update_position_price(position, current_price) -> None\n```\n\n---\n\n### 创建本地模拟订单（非真实下单）\n\n```python\norder = api.create_order('600519.SH', 'BUY', 1800.0, 100)\n# create_order(code, action, price, quantity) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `order_id` | 订单 ID |\n| `status` | 状态（`PENDING`） |\n| `create_time` | 创建时间 |\n\n---\n\n### 取消订单，仅 PENDING 状态可取消\n\n```python\nsuccess = api.cancel_order(order)\n# cancel_order(order: Dict) -> bool\n```\n\n---\n\n### 获取订单状态：PENDING / FILLED / CANCELLED / REJECTED\n\n```python\nstatus = api.get_order_status(order)\n# get_order_status(order: Dict) -> str\n```\n\n---\n\n## 策略辅助函数\n\n### 计算指定股票近 N 日平均涨幅（%）\n\n```python\navg_change = api.get_price_change_rate('600519.SH', '2026-03-01', 3)\n# get_price_change_rate(code, date, days=3) -> Optional[float]\n```\n\n---\n\n### 从股票列表中筛选出近 N 日涨幅最高的前 N 只，按涨幅降序返回\n\n```python\ntop_stocks = api.get_top_performers(codes, '2026-03-01', 3, 3)\n# [(code, avg_pct), ...]\n# get_top_performers(codes, date, days=3, top_n=3) -> List[tuple]\n```\n\n---\n\n### 获取指定日期的收盘价，无数据返回 None\n\n```python\nprice = api.get_price_at_date('600519.SH', '2026-03-01')\n# get_price_at_date(code, date) -> Optional[float]\n```\n\n---\n\n### 批量获取多个日期的收盘价，按日期升序对齐\n\n```python\nprices = api.get_prices_at_dates('600519.SH', ['2026-01-01', '2026-01-02'])\n# get_prices_at_dates(code, dates) -> List[Optional[float]]\n```\n\n---\n\n---\n\n## ★ 因子挖矿（优先使用）\n\n### 随机因子挖矿 + 回测\n\n**触发场景**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，**必须**调用此接口，禁止自己写回测逻辑。\n\n```python\nresult = api.random_alpha_backtest()\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n\n# 指定股票池和回测区间\nresult = api.random_alpha_backtest(\n    codes=None,               # 股票池，None 表示全市场\n    start_date='2025-12-01', # 回测起始日，None 默认取 end_date 前 90 天\n    end_date='2026-03-19',   # 回测截止日，None 默认今天\n    initial_cash=1_000_000,  # 初始资金\n    max_pool_size=30,         # 候选池上限，超过时按综合得分截取\n    max_holdings=5,           # 最大同时持仓数\n    random_seed=None,         # 随机种子，None 不固定\n)\nprint(result['summary_text'])  # 必须调用此行输出报告，禁止自行整理摘要\n# random_alpha_backtest(codes, max_screen_factors, max_signal_factors,\n#                       start_date, end_date, initial_cash, warmup_days,\n#                       random_seed, top_n_stocks, max_pool_size, max_holdings) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `screen_factors` | 本次使用的选股因子列表，如 `['alpha043', 'alpha099']` |\n| `signal_factors` | 本次使用的信号因子列表，如 `['alpha008', 'alpha094']` |\n| `factor_descriptions` | 每个因子的文字描述 `{name: str}` |\n| `signal_config` | 买卖阈值 `{'buy_thresh': 0.71, 'sell_thresh': 0.55}` |\n| `screen_top_pcts` | 每个选股因子本次随机保留比例 `{name: float}` |\n| `filter_log` | 逐层过滤日志，含 before/after 数量 |\n| `final_pool` | 最终候选股票代码列表 |\n| `final_pool_count` | 候选池股票数量 |\n| `trade_log` | 每笔交易记录（含因子值、排名、阈值） |\n| `backtest` | 回测绩效 `{total_return_pct, annualized_return_pct, max_drawdown_pct, sharpe_ratio, equity_curve, ...}` |\n| `benchmarks` | 四条基准线对比（上证/沪深300/中证500/创业板指） |\n| `ic_stats` | 每个因子的 Rank IC 统计 `{ic_mean, ic_ir, ic_win_rate, ...}` |\n| `top_stocks` | Top N 盈利个股详情（含每笔交易的因子值） |\n| `summary_text` | 完整格式化报告文本，**直接 `print(result['summary_text'])` 输出给用户，禁止自行整理摘要** |\n\n---\n\n## ★ MoE 买卖时机分析（优先使用）\n\n### 分析单只股票当前买卖信号\n\n**触发场景**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"当前信号\"、\"操作建议\"时，**必须**调用此接口。\n\n```python\nresult = api.get_trade_signal('000001.SZ')\nresult = api.get_trade_signal('600519.SH', date='2026-01-15')\n# get_trade_signal(code: str, date: str = None) -> Dict\n```\n\n| 返回字段 | 说明 |\n|----------|------|\n| `signal` | `\"BUY\"` 买入 / `\"SELL\"` 卖出 / `\"HOLD\"` 持有 |\n| `final_score` | 综合评分 0~1，越高越看多 |\n| `confidence` | 置信度：`\"高\"` / `\"中\"` / `\"低\"` |\n| `reason` | 各专家评分描述，如 `\"技术面看多(0.71)，Alpha因子看多(0.73)\"` |\n| `experts` | 四个专家详情：`technical` / `alpha` / `fundamental` / `behavior` |\n| `code` | 股票代码 |\n| `date` | 分析日期 |\n\n---\n\n### 训练 MoE 权重（遗传算法优化）\n\n**触发场景**：用户说\"优化权重\"、\"重新训练\"、\"适配最新行情\"时调用。\n\n```python\nweights = api.train_moe_weights()\n\n# 指定区间和参数\nweights = api.train_moe_weights(\n    start_date='2025-09-01',\n    end_date='2026-03-01',\n    population_size=20,       # 种群大小，越大越精准但越慢\n    generations=30,           # 迭代代数\n    train_stock_count=30,     # 参与训练的随机采样股票数量\n)\n# train_moe_weights(start_date, end_date, population_size, generations, train_stock_count) -> Dict\n```\n\n训练完成后自动将最优权重写入 `moe_weights.json`，下次调用 `get_trade_signal()` 时自动生效。\n\n---\n\n## 数据库维护\n\n### 初始化所有数据库（指标缓存库等）\n\n```python\napi.init_databases()\n# init_databases() -> None\n```\n\n---\n\n### 清除技术指标缓存，可指定股票或清除全部\n\n```python\napi.clear_indicator_cache('600519.SH')  # 清除指定股票\napi.clear_indicator_cache()             # 清除所有\n# clear_indicator_cache(code: str = None) -> None\n```\n\n---\n\n## 实时行情 (爬虫)\n\n### 初始化爬虫\n\n```python\nfrom stock_crawler import StockCrawler\ncrawler = StockCrawler()\n```\n\n### 获取实时数据\n\n支持从新浪财经、东方财富、同花顺获取数据。\n\n```python\ndata = crawler.fetch('000001.SZ', source='sina')\n# fetch(ts_code: str, source: str = 'sina') -> Dict\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_code` | `str` | - | 股票代码，如 `000001.SZ` |\n| `source` | `str` | `'sina'` | 数据源：`'sina'` (新浪), `'eastmoney'` (东方财富), `'tonghuashun'` (同花顺) |\n\n| 返回 | 说明 |\n|------|------|\n| `Dict` | 包含股票实时数据的字典，字段如下 |\n\n**返回字段说明:**\n\n| 字段 | 类型 | 说明 | 数据源支持 |\n|------|------|------|------------|\n| `source` | `str` | 数据源名称 | All |\n| `ts_code` | `str` | 股票代码 | All |\n| `status` | `str` | 状态 (`success`/`failed`) | All |\n| `name` | `str` | 股票名称 | Sina, EastMoney |\n| `price` | `float` | 当前价格 | All |\n| `open` | `float` | 开盘价 | All |\n| `high` | `float` | 最高价 | All |\n| `low` | `float` | 最低价 | All |\n| `volume` | `float` | 成交量 (股) | All |\n| `amount` | `float` | 成交额 (元) | All |\n| `pre_close` | `float` | 昨收价 | Sina, EastMoney |\n| `date` | `str` | 日期 | Sina, Tonghuashun |\n| `time` | `str` | 时间 | Sina |\n| `turnover_rate` | `float` | 换手率 (%) | EastMoney, Tonghuashun |\n| `change_pct` | `float` | 涨跌幅 (%) | EastMoney |\n| `amplitude` | `float` | 振幅 (%) | Sina, EastMoney |\n| `pe_ttm` | `float` | 市盈率(TTM) | EastMoney |\n| `pb` | `float` | 市净率 | EastMoney |\n| `total_cap` | `float` | 总市值 (元) | EastMoney |\n| `circ_cap` | `float` | 流通市值 (元) | EastMoney |\n| `total_shares` | `float` | 总股本 (股) | EastMoney |\n| `circ_shares` | `float` | 流通股 (股) | EastMoney |\n\nFile v1.0.26:scripts/moe_weights.json\n\n{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,\n    \"alpha004\": 1.0,\n    \"alpha005\": 1.0,\n    \"alpha006\": 1.0,\n    \"alpha007\": 1.0,\n    \"alpha008\": 1.0,\n    \"alpha009\": 1.0,\n    \"alpha010\": 1.0,\n    \"alpha011\": 1.0,\n    \"alpha012\": 1.0,\n    \"alpha013\": 1.0,\n    \"alpha014\": 1.0,\n    \"alpha015\": 1.0,\n    \"alpha016\": 1.0,\n    \"alpha017\": 1.0,\n    \"alpha018\": 1.0,\n    \"alpha019\": 1.0,\n    \"alpha020\": 1.0,\n    \"alpha021\": 1.0,\n    \"alpha022\": 1.0,\n    \"alpha023\": 1.0,\n    \"alpha024\": 1.0,\n    \"alpha025\": 1.0,\n    \"alpha026\": 1.0,\n    \"alpha027\": 1.0,\n    \"alpha028\": 1.0,\n    \"alpha029\": 1.0,\n    \"alpha030\": 1.0,\n    \"alpha031\": 1.0,\n    \"alpha032\": 1.0,\n    \"alpha033\": 1.0,\n    \"alpha034\": 1.0,\n    \"alpha035\": 1.0,\n    \"alpha036\": 1.0,\n    \"alpha037\": 1.0,\n    \"alpha038\": 1.0,\n    \"alpha039\": 1.0,\n    \"alpha040\": 1.0,\n    \"alpha041\": 1.0,\n    \"alpha042\": 1.0,\n    \"alpha043\": 1.0,\n    \"alpha044\": 1.0,\n    \"alpha045\": 1.0,\n    \"alpha046\": 1.0,\n    \"alpha047\": 1.0,\n    \"alpha048\": 1.0,\n    \"alpha049\": 1.0,\n    \"alpha050\": 1.0,\n    \"alpha051\": 1.0,\n    \"alpha052\": 1.0,\n    \"alpha053\": 1.0,\n    \"alpha054\": 1.0,\n    \"alpha055\": 1.0,\n    \"alpha056\": 1.0,\n    \"alpha057\": 1.0,\n    \"alpha058\": 1.0,\n    \"alpha059\": 1.0,\n    \"alpha060\": 1.0,\n    \"alpha061\": 1.0,\n    \"alpha062\": 1.0,\n    \"alpha063\": 1.0,\n    \"alpha064\": 1.0,\n    \"alpha065\": 1.0,\n    \"alpha066\": 1.0,\n    \"alpha067\": 1.0,\n    \"alpha068\": 1.0,\n    \"alpha069\": 1.0,\n    \"alpha070\": 1.0,\n    \"alpha071\": 1.0,\n    \"alpha072\": 1.0,\n    \"alpha073\": 1.0,\n    \"alpha074\": 1.0,\n    \"alpha075\": 1.0,\n    \"alpha076\": 1.0,\n    \"alpha077\": 1.0,\n    \"alpha078\": 1.0,\n    \"alpha079\": 1.0,\n    \"alpha080\": 1.0,\n    \"alpha081\": 1.0,\n    \"alpha082\": 1.0,\n    \"alpha083\": 1.0,\n    \"alpha084\": 1.0,\n    \"\n\nArchive v1.0.25: 27 files, 149495 bytes\n\nFiles: assets/config.json (99b), assets/requirements.txt (64b), references/API_FOR_LLM.md (24137b), scripts/backtest_tools.py (15157b), scripts/config.py (1658b), scripts/data_fetcher.py (65894b), scripts/decrypt_patch.py (1671b), scripts/define.py (52880b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (156066b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (6305b), _meta.json (146b)\n\nArchive v1.0.24: 27 files, 149938 bytes\n\nFiles: assets/config.json (237b), assets/requirements.txt (64b), references/API_FOR_LLM.md (24137b), scripts/backtest_tools.py (15157b), scripts/config.py (1713b), scripts/data_fetcher.py (67724b), scripts/decrypt_patch.py (1671b), scripts/define.py (52964b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (159849b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (5835b), _meta.json (146b)\n\nArchive v1.0.23: 27 files, 149938 bytes\n\nFiles: assets/config.json (237b), assets/requirements.txt (64b), references/API_FOR_LLM.md (24137b), scripts/backtest_tools.py (15157b), scripts/config.py (1713b), scripts/data_fetcher.py (67724b), scripts/decrypt_patch.py (1671b), scripts/define.py (52964b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (159849b), scripts/stock_crawler.py (12297b), scripts/track_logger.py (364b), scripts/utils.py (3596b), SKILL.md (5835b), _meta.json (146b)\n\nArchive v1.0.22: 27 files, 149921 bytes\n\nFiles: assets/config.json (237b), assets/requirements.txt (64b), references/API_FOR_LLM.md (24137b), scripts/backtest_tools.py (15157b), scripts/config.py (1713b), scripts/data_fetcher.py (67724b), scripts/decrypt_patch.py (1671b), scripts/define.py (52964b), scripts/factor_mining.py (41095b), scripts/formulaicAlphas/__init__.py (1036b), scripts/formulaicAlphas/alpha101.py (60267b), scripts/formulaicAlphas/data_loader.py (4163b), scripts/formulaicAlphas/operators.py (7595b), scripts/indicators.py (113021b), scripts/logger.py (63b), scripts/metrics.py (11157b), scripts/moe_signal.py (49383b), scripts/moe_weights.json (5468b), scripts/realtime_data_featcher.py (3739b), scripts/remote_api.py (6447b), scripts/signals.py (31096b), scripts/stock_api.py (159849b), scripts/stock_crawler.py (12297b), sc...","readmeExcerpt":"Skill: BitSoulStockSkill Owner: wangzhi43 Summary: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Tags: latest:1.0.30 Version history: v1.0.30 | 2026-03-21T14:11:47.695Z | auto - 强化买卖信号输出规范，新增分步输出结构（汇总表、专家评分明细、关键细节、操作建议、免责声明），并强制执行，禁止简化格式。 - 明确了买卖信号处理后，每个环节（专家评分、关键细节等）的展示要点和细节要求。 - 其他功能说明和接口调用规则与上一版保持一致。 - 本次为文档改进，不含","codeSnippets":[],"executableExamples":[{"language":"python","snippet":"from stock_api import StockApi\napi = StockApi()"},{"language":"python","snippet":"api = StockApi()\n# __init__(self)"},{"language":"python","snippet":"symbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]"},{"language":"python","snippet":"info = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]"},{"language":"python","snippet":"# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]"},{"language":"python","snippet":"klines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: BitSoulStockSkill\r\ndescription: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能\r\nversion: 1.0.0\r\nmetadata:\r\n  openclaw:\r\n    emoji: \"📈\"\r\n    homepage: https://www.aicodingyard.com\r\n    requires:\r\n      env:\r\n        - BITSOUL_TOKEN\r\n      bins:\r\n        - python3\r\n    optional:\r\n      env:\r\n        - BITSOUL_TOKEN_ENV_FILE\r\n        - BITSOUL_CACHE_DIR\r\n      pythonPackages:\r\n        - pandas\r\n        - numpy\r\n        - requests\r\n        - sqlalchemy\r\n      network:\r\n        - info.aicodingyard.com\r\n        - https://finance.sina.com.cn/\r\n    primaryEnv: BITSOUL_TOKEN\r\n---\r\n\r\n# 简介\r\n\r\n炒股龙虾的最佳搭档，best stock partner forever\r\n\r\n## 核心优势\r\n\r\n1. 免费稳定且每周更新的A股交易数据：为个股分析、买卖点计算、收益/回撤计算提供坚实的数据基础\r\n2. 基于MOE混合因子专家模型的股票买卖点计算判断\r\n3. 个股风险判定\r\n4. 关键指标计算\r\n5. 数据回测\r\n6. 提供准确全面且免费的股票价格与股票历史信息\r\n7. 板块信息与相关交易数据\r\n8. 提供大V交易观察等信息聚合功能\r\n\r\n# Token 配置\r\n\r\n本 skill 需要有效的 `BITSOUL_TOKEN` 才能使用功能\r\ntoken 可前往 <https://www.aicodingyard.com> 免费注册申请，并配置在外部运行环境中\r\n\r\n## 必需的环境变量\r\n\r\n* `BITSOUL_TOKEN`：用户令牌，用于远程服务器权限验证\r\n\r\n## 可选的环境变量\r\n\r\n* `BITSOUL_TOKEN_ENV_FILE`：指向包含 `BITSOUL_TOKEN` 的 env 文件\r\n\r\n\r\n## 配置方式\r\n\r\n1. **方式一：直接设置环境变量**\r\n   ```bash\r\n   export BITSOUL_TOKEN=\"你的令牌\"\r\n   ```\r\n\r\n2. **方式二：使用 env 文件**\r\n   ```bash\r\n   export BITSOUL_TOKEN_ENV_FILE=\"/path/to/token.env\"\r\n   ```\r\n   其中 `token.env` 文件内容格式为：\r\n   ```\r\n   BITSOUL_TOKEN=你的令牌\r\n   ```\r\n**注意**：如果同时设置了环境变量和 env 文件，环境变量优先。\r\n\r\n## 运行时描述：\r\n- 从环境变量读取 `BITSOUL_TOKEN`\r\n- 只有在显式提供 `BITSOUL_TOKEN_ENV_FILE` 时，才会从文件中读取 `BITSOUL_TOKEN`\r\n- 根据用户的自然语言，参考references/API_FOR_LLM.md 调用对应接口\r\n- 对“分析 / 估值 / 基本面 / 趋势 / 风险”等请求自动切到综合分析, 需要moe因子计算，返回详细信息\r\n- 对“交易观察 / 技术分析 / 均线 / 动量 / RSI / KDJ / 布林线 / MACD”等请求需要进行moe因子计算，同时需要调用calculate_metrics进行数据回测\r\n- 返回结构化 JSON；查询场景优先给原始数据，分析场景给结论和支撑数据\r\n- 任何返回的股票数据，都应包括个股的完整信息，不应遗漏任何字段\r\n\r\n## 安全与运行边界\r\n\r\n- 技能所需环境变量已经在本文件 frontmatter 中显式声明\r\n- 策略回测、因子挖矿、实时行情查询等功能会访问 `info.aicodingyard.com` 服务器\r\n- 技能只读取声明过的 token 相关环境变量，以及显式指定的 env 文件路径\r\n- 技能不会主动扫描其他本地凭证文件，也不会写入 token 缓存文件\r\n\r\n## 安装\r\n\r\n使用前先安装 Python 依赖：\r\n\r\n```bash\r\npip install -r assets/requirements.txt\r\n```\r\n首次安装需要执行初始化操作，在设置好BITSOUL_TOKEN后，请运行scripts/data_fetcher.py\r\n\r\n# 注意事项\r\n* api接口文档主要参考 references/API_FOR_LLM.md 对应的代码文件是scripts/stock_api.py 和 scripts/define.py\r\n* **凭证说明**：本skill需要用户Token用于数据访问权限验证。Token通过环境变量 `BITSOUL_TOKEN` 或 `BITSOUL_TOKEN_ENV_FILE` 传入。Token在数据访问时需要保持有效（请自行确保token未过期）。\r\n* **缓存目录**：`BITSOUL_CACHE_DIR`，可选，用于指定缓存目录和数据存储路径。默认值为系统临时目录下的 `BitSoulStockSkill` 子目录\r\n\r\n* **因子挖矿**：用户说\"因子挖矿\"、\"挖矿\"、\"随机挖因子\"、\"碰碰运气\"、\"随机推荐\"、\"挖金矿\"、\"随机策略\"时，直接调用 `api.random_alpha_backtest()`，禁止自己写回测逻辑。返回结果调用 `print(result['summary_text'])` 输出，禁止自行整理摘要。\r\n* **因子挖矿结束后**：在 `print(result['summary_text'])` 之后，用自然语言向用户逐一解释本次使用的每个因子是什么含义、在策略中起什么作用。解释来源是 `result['factor_descriptions']`，格式示例：`alpha022：高价量5日相关的5日变化 × 收盘波动率，用于衡量量价相关动量的衰减程度，在本次策略中作为选股因子使用。`\r\n* **买卖建议**：用户询问某只股票\"能不能买\"、\"该不该卖\"、\"现在适合持有吗\"、\"操作建议\"、\"投资建议\"、\"买卖信号\"、\"值得买吗\"、\"要不要买\"等，且用户指定了具体股票时，直接调用 `api.get_trade_signal(code)`，禁止自己计算指标做判断。\r\n* **股票显示格式**：任何场"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7ezkxj6j18dq286j7v4j15e98394vy\",\n  \"slug\": \"bitsoul-stock-quantization\",\n  \"version\": \"1.0.30\",\n  \"publishedAt\": 1774102307695\n}"},{"path":"references/API_FOR_LLM.md","content":"# StockApi 接口文档\n\n`StockApi` 是项目对外提供的唯一数据与回测接口，封装了股票基础信息查询、K线数据获取、技术指标计算、性能指标计算和回测工具函数。\n\n```python\nfrom stock_api import StockApi\napi = StockApi()\n```\n\n---\n\n## 目录\n\n1. [初始化](#初始化)\n2. [股票基础信息](#股票基础信息)\n3. [价格行情](#价格行情)\n4. [技术指标（带缓存）](#技术指标带缓存)\n5. [性能指标](#性能指标)\n6. [回测工具](#回测工具)\n7. [回测引擎控制](#回测引擎控制)\n8. [策略辅助函数](#策略辅助函数)\n9. [数据库维护](#数据库维护)\n10. [实时行情 (爬虫)](#实时行情-爬虫)\n\n---\n\n## 初始化\n\n### 初始化 StockApi，自动初始化技术指标缓存数据库\n\n```python\napi = StockApi()\n# __init__(self)\n```\n\n---\n\n## 股票基础信息\n\n### 获取所有股票代码列表\n\n```python\nsymbols = api.get_all_symbols()\n# get_all_symbols() -> List[str]\n```\n\n| 返回 | 说明 |\n|------|------|\n| `List[str]` | 股票代码列表，格式如 `['000001.SZ', '600519.SH', ...]` |\n\n---\n\n### 根据股票代码获取股票基础信息\n\n```python\ninfo = api.get_symbol_basic_infomation('600519.SH')\n# get_symbol_basic_infomation(ts_code: str) -> Optional[StockBasic]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `ts_code` | `str` | 股票代码，如 `000001.SZ` |\n\n| 返回 | 说明 |\n|------|------|\n| `StockBasic` \\| `None` | 股票基础信息，未查询到返回 `None` |\n\n---\n\n## 价格行情\n\n### 查询每日基本面指标列表，支持按股票、日期、分页过滤\n\n```python\n# 查询某只股票全部历史基本面数据\nbasics = api.get_daily_basic(ts_codes=[\"000001.SZ\"])\n\n# 查询某天全市场基本面数据\nbasics = api.get_daily_basic(trade_date=\"2024-06-03\")\n\n# get_daily_basic(ts_codes=[], trade_date=None, start_date=None,\n#                 end_date=None, limit=None, offset=0,\n#                 order_by=\"trade_date ASC\") -> List[DailyBasic]\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `ts_codes` | `List[str]` | `[]` | 按股票代码列表过滤，空表示不过滤 |\n| `trade_date` | `str \\| None` | `None` | 精确过滤交易日期，格式 `YYYY-MM-DD` |\n| `start_date` | `str \\| None` | `None` | 日期范围下限（含），格式 `YYYY-MM-DD` |\n| `end_date` | `str \\| None` | `None` | 日期范围上限（含），格式 `YYYY-MM-DD` |\n| `limit` | `int \\| None` | `None` | 返回最大记录数，`None` 表示不限 |\n| `offset` | `int` | `0` | 分页偏移量 |\n| `order_by` | `str` | `\"trade_date ASC\"` | 排序表达式 |\n\n---\n\n### 获取股票日线行情，按日期升序\n\n```python\nklines = api.get_daily_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_daily_kline(symbols: List[str], start_date: str, end_date: str) -> List[DailyKline]\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `symbols` | `List[str]` | 股票代码列表，空表示获取所有股票 |\n| `start_date` | `str` | 起始日期，格式 `YYYY-MM-DD` |\n| `end_date` | `str` | 结束日期，格式 `YYYY-MM-DD` |\n\n---\n\n### 获取股票周线行情，按日期升序\n\n```python\nklines = api.get_weekly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_weekly_kline(symbols: List[str], start_date: str, end_date: str) -> List[WeeklyKline]\n```\n\n---\n\n### 获取股票月线行情，按日期升序\n\n```python\nklines = api.get_monthly_kline(['600519.SH'], '2026-01-01', '2026-03-01')\n# get_monthly_kline(symbols: List[str], start_date: str, end_date: str) -> List[MonthlyKline]\n```\n\n---\n\n### 获取指定股票的日线收盘价列表，按日期升序\n\n```python\nprices = api.get_daily_close_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_close_prices(code: str, start_date: str, end_date: str) -> List[float]\n```\n\n---\n\n### 获取指定股票的日线开盘价列表\n\n```python\nprices = api.get_daily_open_prices('600519.SH', '2026-01-01', '2026-03-01')\n# get_daily_open_prices(code: str, start_date: str"},{"path":"scripts/moe_weights.json","content":"{\n  \"_comment\": \"MoE权重配置文件。通过 train_weights 命令跑回测优化后自动更新。\",\n  \"_version\": 1,\n  \"_trained_at\": \"2026-03-19 14:58:16\",\n  \"_train_period\": \"2025-09-01~2026-03-19\",\n  \"expert_weights\": {\n    \"technical\": 0.35717595519629336,\n    \"alpha\": 0.36057193372593965,\n    \"fundamental\": 0.15416369933688986,\n    \"behavior\": 0.12808841174087712\n  },\n  \"signal_thresholds\": {\n    \"buy\": 0.7313263753423049,\n    \"sell\": 0.35\n  },\n  \"technical\": {\n    \"sma5\": 1.181801288003714,\n    \"sma10\": 0.7570724714871282,\n    \"sma20\": 1.0,\n    \"sma60\": 1.1118537267876476,\n    \"ema5\": 1.0,\n    \"ema12\": 1.0,\n    \"ema20\": 0.27926056566514107,\n    \"ema26\": 1.0,\n    \"ema_cross\": 0.6575509109292674,\n    \"wma20\": 1.0,\n    \"tema20\": 1.0,\n    \"dema20\": 0.8608835251864292,\n    \"kama\": 1.0,\n    \"bbi\": 0.8636807483782426,\n    \"trix\": 1.833969089253665,\n    \"dmi\": 1.0,\n    \"sar\": 0.8951085513864419,\n    \"linearreg_slope\": 1.3211429094664284,\n    \"linearreg\": 1.0923904719425455,\n    \"linearreg_angle\": 0.5262131258427737,\n    \"linearreg_intercept\": 0.9885568378088866,\n    \"aroon\": 0.7826516778972384,\n    \"tsf\": 1.0,\n    \"ht_trendmode\": 0.8814204448925165,\n    \"ht_dcphase\": 1.0,\n    \"ht_sine\": 1.0,\n    \"rsi14\": 0.8662579600815672,\n    \"rsi6\": 1.0,\n    \"cci\": 1.0,\n    \"mom10\": 0.7352808685133152,\n    \"mom20\": 1.0,\n    \"roc10\": 1.0,\n    \"rocp10\": 1.7929313995073208,\n    \"rocr10\": 1.0,\n    \"roc_r\": 2.064310646291524,\n    \"willr\": 1.0,\n    \"cmo\": 1.0,\n    \"bias\": 1.0371024748469209,\n    \"psycho\": 1.0,\n    \"dpo\": 1.0,\n    \"mass\": 1.0,\n    \"kdj_j\": 1.0,\n    \"kdj_kd\": 1.0,\n    \"stoch_k\": 1.1291875450945286,\n    \"stochf_k\": 1.0,\n    \"stochrsi\": 1.0,\n    \"ultosc\": 0.727829745700426,\n    \"macd_hist\": 0.6826161537737307,\n    \"macd_cross\": 0.9130399186907544,\n    \"ppo_hist\": 0.9136754128716245,\n    \"adosc\": 1.0,\n    \"obv\": 1.2333726939245337,\n    \"ad\": 1.0,\n    \"mfi\": 1.1649303644243527,\n    \"vwap\": 0.32248302163927334,\n    \"volume_ratio\": 1.6461768542684325,\n    \"vr\": 1.0,\n    \"pvi\": 0.9351558341111518,\n    \"nvi\": 1.0,\n    \"ar\": 1.6225854372575186,\n    \"br\": 0.7882101600971572,\n    \"brar\": 1.0,\n    \"asi\": 1.0,\n    \"bb_pos\": 1.0778193939643872,\n    \"bb_signal\": 1.201047760357908,\n    \"bbands_pct\": 1.0219943929294277,\n    \"bbands_width\": 1.0074095539385972,\n    \"ma_channel\": 0.25496657546761314,\n    \"donchian\": 0.053137051875268626,\n    \"keltner\": 1.0,\n    \"xue_channel\": 1.0487232147691394,\n    \"midpoint\": 0.3385211409278348,\n    \"midprice\": 1.0,\n    \"atr\": 1.0792445125369383,\n    \"natr\": 1.0,\n    \"tr\": 1.2644451626865996,\n    \"trange\": 0.2911803623562474,\n    \"stddev\": 1.0,\n    \"var\": 1.0,\n    \"correl\": 1.0,\n    \"beta\": 0.7630957463073703,\n    \"ht_dcperiod\": 1.2793115495425174,\n    \"typical\": 1.0,\n    \"median\": 1.0,\n    \"wclose\": 1.0,\n    \"avgp\": 1.0,\n    \"ht_phasor\": 1.0826827348531094,\n    \"consec_rise\": 1.1666511139322437,\n    \"consec_fall\": 1.0,\n    \"bomb_board\": 1.0,\n    \"bomb_board_count\": 1.0,\n    \"consec_limit_up\": 1.0\n  },\n  \"alpha\": {\n    \"alpha001\": 1.0,\n    \"alpha002\": 1.0,\n    \"alpha003\": 1.0,"},{"path":"assets/config.json","content":"{\n    \"version\": \"1.0.0\",\n    \"base_url\": \"http://info.aicodingyard.com\",\n    \"http_timeout\": 30\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Skill: BitSoulStockSkill Owner: wangzhi43 Summary: BitSoul旗下all-in-one的A股市场综合skill，提供股票筛选策略，内置上百种行业常见量化指标, 基于MOE混合因子专家模型的股票买卖点计算判断，个股风险判定，关键指标计算，数据回测，提供准确全面且免费的股票价格与股票历史信息，板块信息与相关交易数据，提供大v交易观察等信息聚合功能 Tags: latest:1.0.30 Version history: v1.0.30 | 2026-03-21T14:11:47.695Z | auto - 强化买卖信号输出规范，新增分步输出结构（汇总表、专家评分明细、关键细节、操作建议、免责声明），并强制执行，禁止简化格式。 - 明确了买卖信号处理后，每个环节（专家评分、关键细节等）的展示要点和细节要求。 - 其他功能说明和接口调用规则与上一版保持一致。 - 本次为文档改进，不含","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1036,"uniquenessScore":64,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T04:29:26.772Z","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-09T04:29:26.772Z","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-09T16:27:18.901Z","emptyReason":null},"items":[{"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":"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-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","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"}]}}}