首页 文章 精选 留言 我的

精选列表

搜索[api],共10000篇文章
优秀的个人博客,低调大师

多 Agent 协作做股票研究:我的全链路工程实践笔记 IG50免费开源股票数据API接口

# 多 Agent 协作做股票研究:我的全链路工程实践笔记 最近半年,我在本地搭了一套"多 Agent 协作的股票研究系统",把"数据采集、因子挖掘、策略生成、回测验证、报告输出"这 5 个环节分别交给不同的 Agent。今天把这套系统的工程实践笔记完整记录下来,重点讲"为什么需要多 Agent"和"Agent 之间怎么协作"。 ## 一、为什么需要多 Agent 做股票研究这件事,一个人做太累,团队做太慢。最理想的状态是"流水线作业"——每个人(或每个 Agent)只负责一个环节,上一环节的输出是下一环节的输入。 我尝试过用"单 Agent 干所有事",结果是: - 上下文窗口很快爆掉(Qwen2.5-72B 是 32K) - 任务规划混乱(一个 Agent 同时想"因子设计"和"回测验证"会陷入循环) - 调试困难(一个 Agent 出错不知道是哪一步错的) 多 Agent 架构能彻底解决这三个问题。每个 Agent 有独立的上下文、独立的目标、独立的工具集,Agent 之间通过"消息队列"协作。 ## 二、整体架构 整个系统有 5 个核心 Agent: ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 数据 Agent │ → │ 因子 Agent │ → │ 策略 Agent │ └──────────┘ └──────────┘ └──────────┘ │ │ │ ↓ ↓ ↓ 数据接口 因子库 策略代码 │ ↓ ┌──────────┐ │ 回测 Agent │ └──────────┘ │ ↓ ┌──────────┐ │ 报告 Agent │ └──────────┘ ``` 每个 Agent 都有自己的"角色定位"和"工具集"。 ## 三、数据 Agent **角色定位**:根据其他 Agent 的请求,从本地数据引擎拉取所需数据。 **核心工具**: - `query_stock_basic`:查询股票基本信息 - `get_realtime_quote`:获取实时行情 - `get_history_kline`:获取历史 K 线 - `get_money_flow`:获取资金流向 - `get_longhubang`:获取龙虎榜 - `get_industry_flow`:获取行业资金流向 - `get_tick_data`:获取逐笔成交 - `get_financials`:获取财务数据 **设计要点**:数据 Agent 只负责"取数",不做任何分析。这样它的上下文非常干净,永远不会出现"上下文爆掉"的问题。 **踩坑**:数据 Agent 的"超时"问题很常见——比如拉 5000 只票的全量财务数据要 30 秒以上,会让上层 Agent 等很久。我后来加了"异步任务队列",数据 Agent 把耗时任务放进队列,返回一个 task_id,上层 Agent 可以轮询或订阅结果。 ## 四、因子 Agent **角色定位**:根据用户的研究方向,设计和挖掘量化因子。 **核心工具**: - `list_existing_factors`:列出已有因子库 - `add_factor`:添加新因子 - `test_factor`:单因子检验(IC、收益、回撤) - `analyze_factor_decay`:分析因子衰减 - `correlate_factors`:因子相关性分析 **输入**:研究方向(如"我想找能预测短期反转的因子")+ 已有因子库 **输出**:新因子定义 + 单因子检验报告 **设计要点**:因子 Agent 必须能"自己评估"——它生成的因子必须自己跑一次单因子检验,发现 IC 太低的因子自动丢弃。这个"自检"机制让因子 Agent 的产出质量大幅提升。 **踩坑**:因子 Agent 容易"过度优化"——它会不断尝试因子变种,找到一个 IC 高的因子就提交,但这个因子可能是"过拟合"。我加了一个"样本外测试"模块,要求每个新因子必须在训练集外的数据上再做一次检验,IC 衰减超过 30% 的会被标记为"可疑因子"。 ## 五、策略 Agent **角色定位**:根据因子 Agent 产出的因子,组装成完整的量化策略。 **核心工具**: - `generate_strategy_code`:生成策略代码 - `validate_strategy_syntax`:语法检查 - `preview_strategy_logic`:预览策略逻辑 - `submit_to_backtest`:提交到回测 Agent **输入**:1-3 个有效因子 + 用户的风控要求(如最大回撤、夏普比率) **输出**:策略代码(Python 函数)+ 策略说明文档 **设计要点**:策略 Agent 必须输出"可执行的策略代码",而不是"伪代码"。我让它生成的代码必须通过 `validate_strategy_syntax` 工具的语法检查,否则重新生成。 **踩坑**:策略 Agent 生成的代码经常"调用不存在的因子"——它会用因子 Agent 还没产出的因子。我后来让因子 Agent 必须先"注册因子"到因子库,策略 Agent 只能引用因子库里已注册的因子。这个"注册机制"解决了大部分"因子不存在"的问题。 ## 六、回测 Agent **角色定位**:执行策略回测,生成回测报告。 **核心工具**: - `run_backtest`:运行回测 - `generate_backtest_report`:生成回测报告 - `check_overfitting`:检查过拟合 - `compare_strategies`:多策略对比 **输入**:策略代码 + 回测时间范围 + 初始资金 **输出**:回测报告(年化、最大回撤、夏普、胜率、IC)+ 过拟合检查结果 **设计要点**:回测 Agent 必须"独立运行"——它有自己的回测引擎,不依赖其他 Agent。这样策略 Agent 提交代码后,回测 Agent 可以异步执行,不阻塞上层流程。 **踩坑**:回测 Agent 的"计算资源管理"是难点。一次全市场回测(5000 只票 × 3 年数据)可能要 10 分钟以上。我后来用了"分布式回测"——把回测任务拆分成多个子任务,分配到多台机器上并行执行。 ## 七、报告 Agent **角色定位**:把前面 4 个 Agent 的产出汇总成最终的研究报告。 **核心工具**: - `generate_research_report`:生成研究报告 - `generate_visualizations`:生成可视化图表 - `summarize_findings`:总结核心发现 - `export_to_pdf`:导出 PDF **输入**:研究问题 + 数据 Agent 的数据 + 因子 Agent 的因子 + 策略 Agent 的策略 + 回测 Agent 的回测报告 **输出**:完整的研究报告(Markdown / PDF 格式) **设计要点**:报告 Agent 是"信息整合者",它不做任何新的分析,只是把前面 4 个 Agent 的产出"结构化、可视化、可读化"。 **踩坑**:报告 Agent 容易"过度包装"——它会把所有数据都加进去,导致报告冗长。我后来加了"核心发现提取"模块,要求报告 Agent 先用 LLM 提炼出 3-5 个核心发现,再围绕这些发现组织报告。 ## 八、Agent 之间的协作机制 5 个 Agent 之间不是简单的"流水线",而是"消息总线 + 任务队列"。 **消息总线**:用 Redis Pub/Sub 实现。每个 Agent 订阅自己关心的消息频道,发布自己的产出到对应频道。 **任务队列**:用 Celery 实现。耗时任务(如数据 Agent 的批量查询、回测 Agent 的全市场回测)放进任务队列,异步执行。 **协作流程示例**: 用户提问:"帮我设计一个'短期反转 + 低估值'的量化策略" 1. 用户问题 → 因子 Agent(消息总线接收) 2. 因子 Agent 调用 `list_existing_factors`,发现已有"短期反转因子"和"低估值因子" 3. 因子 Agent 调用 `correlate_factors` 检查两个因子的相关性(避免共线性) 4. 因子 Agent 输出"已有因子,无需新增" 5. 因子 Agent → 策略 Agent(消息总线传递) 6. 策略 Agent 调用 `generate_strategy_code`,组装两个因子,生成策略代码 7. 策略 Agent 调用 `validate_strategy_syntax` 检查语法 8. 策略 Agent 把代码提交到回测 Agent(任务队列) 9. 回测 Agent 异步执行回测,生成回测报告 10. 回测 Agent → 报告 Agent(消息总线传递) 11. 报告 Agent 调用 `generate_research_report`,汇总所有产出,生成最终报告 整个流程大概 2-5 分钟(取决于回测耗时)。 ## 九、关键设计决策 **决策 1:每个 Agent 有独立的上下文** 这是最重要的设计。每个 Agent 不共享上下文,只通过消息传递"结果"。这个设计让每个 Agent 的 prompt 可以专门优化,不用担心上下文冲突。 **决策 2:工具集按 Agent 角色切分** 数据 Agent 的工具集是"取数工具",策略 Agent 的工具集是"代码生成工具",回测 Agent 的工具集是"回测执行工具"。工具集不重叠,避免 Agent 调用越界的工具。 **决策 3:每个 Agent 都有"自我评估"机制** 数据 Agent 会评估"数据质量"(如缺失值、异常值),因子 Agent 会评估"因子有效性"(IC、衰减),策略 Agent 会评估"代码质量"(语法、逻辑),回测 Agent 会评估"过拟合风险"。每个 Agent 都对自己的产出负责。 **决策 4:异常处理走"fallback Agent"** 当某个 Agent 失败时,会触发 fallback Agent 重新尝试,或退回到"半自动"模式(由人工介入)。这个机制让整个系统不会因为单个 Agent 失败而完全瘫痪。 ## 十、踩过的坑 **坑 1:Agent 之间的"消息循环"** 策略 Agent 调用 `submit_to_backtest` 后,会触发回测 Agent,回测 Agent 完成后再触发报告 Agent。但如果策略 Agent 在等待回测结果时,又收到了用户的另一个提问,策略 Agent 会陷入"既要等回测,又要回新问题"的循环。我后来加了"任务状态机"——每个 Agent 有明确的"忙/闲"状态,忙碌时不接收新任务。 **坑 2:Agent 输出格式不统一** 不同 Agent 输出的格式可能不一致,导致下游 Agent 解析失败。我后来定义了一套"标准消息格式"(JSON Schema),所有 Agent 必须按这个格式输出。 **坑 3:Agent 之间的"信任问题"** 下游 Agent 不能盲目信任上游 Agent 的输出。比如策略 Agent 必须自己验证因子 Agent 提供的因子是真实存在的,不能假设上游不会出错。我加了"交叉验证"机制,每个 Agent 接到上游输出后做一次"事实核查"。 **坑 4:调试和监控困难** 多 Agent 系统的调试比单 Agent 难 10 倍。我后来加了一套"全链路日志"系统,记录每个 Agent 的输入、输出、思考过程、工具调用,可以用 Trace 视图回放整个流程。 ## 十一、效果和未来 这套系统跑了大半年,最大的几个发现: 1. **多 Agent 的"流水线"效率比单 Agent 高 3-5 倍**:每个 Agent 只做自己擅长的事,整体效率大幅提升。 2. **错误隔离效果好**:单个 Agent 出错不会影响整个流程,最多某个环节失败。 3. **可扩展性强**:新增一个 Agent(如"风控 Agent")就能给整个系统增加新能力,不需要重写其他 Agent。 未来我打算加两个 Agent: - **"研报解读 Agent"**:自动读研报、提取关键观点、判断可信度 - **"舆情监控 Agent"**:监控新闻、股吧、雪球等渠道的情绪指标,给策略提供"另类数据" ## 十二、最后说几句 多 Agent 系统的核心思想是"专业化 + 流水线"。把复杂任务拆分成多个简单任务,每个任务交给专门的 Agent 去做,最后通过"消息总线"协作完成整体目标。 如果你也想做多 Agent 系统,建议从两个 Agent 开始(比如"数据 Agent + 策略 Agent"),先把"消息传递"和"任务队列"跑通,再慢慢扩展到 3-5 个 Agent。不要一开始就设计太复杂的系统——多 Agent 的复杂性增长是非线性的,2 个 Agent 复杂度是 2,5 个 Agent 复杂度是 20。 工程实践中最难的不是"怎么写 Agent",是"怎么让 Agent 之间协作顺畅"。这套笔记重点记的是后者——前者网上资料很多,后者基本要靠自己踩坑。 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

优秀的个人博客,低调大师

Agent驱动的股票列表事件流监测系统用快照diff翻译市场变化 IG50免费开源股票数据API接口

# Agent驱动的股票列表事件流监测系统用快照diff翻译市场变化 做行情工具的人大多盯着价格,但有一类重要变化并不体现在价格上:一家公司戴帽了、摘帽了、改名了、上市了、进入退市整理了。这些"身份级"事件散落在全市场约5300条列表记录里,靠人眼每天扫一遍并不现实。这篇文章分享我们跑了很久的一套做法:每天收市后对股票列表做快照 diff,把结构变化识别成事件,交给 LLM 翻译成一句人话,再按订阅推送。整体分工是——代码负责发现事实,LLM 负责翻译事实,人负责最终复核。 ## 一、为什么选股票列表做事件源 行情数据一秒跳几次,噪声大、存储贵;财务数据一季一次,太慢。股票列表刚好卡在中间:数据集 `base/gplist` 每天下午 4 点更新一次,频率低到不存在限流焦虑,又恰好是所有身份级变化的直接载体。它的字段非常克制: - 股票代码:全市场唯一,天然主键 - 股票名称:更名与戴帽的第一现场 - 交易所:sh / sz / bj - 是否创业板、是否科创板:板块归属 - `isSt`:是否 ST - `isNew`:是否新股 字段少反而是一种优势:diff 出来的每条记录语义都唯一,不会出现"五个字段同时变了、不知道哪个重要"的模糊地带。 ## 二、五段式流水线 整个系统是一条单向管道: **快照归档 → 快照 diff → 事件识别 → LLM 翻译 → 简报与订阅推送** 每天 16 点数据更新后,把 `base/gplist` 当日全量落成一份 JSON,按日期归档,一天一个文件。全市场约5300条记录,一份快照只有几 MB,归档成本可以忽略。第二步拿今天与昨天两份快照做集合运算,产出原始 diff。 ## 三、四类事件与 diff 实现 规则上识别四类事件: 1. **新上市**:今日快照出现新代码,且 `isNew=1`; 2. **摘帽 / 戴帽**:代码不变,`isSt` 字段翻转; 3. **更名**:代码不变,名称变化; 4. **退市整理**:昨日在册的代码今日消失,且旧名称带"退"字样。 两份快照 diff 的核心实现不到三十行: ```python import json from pathlib import Path SNAP_DIR = Path("snapshots/gplist") # 按日期归档:20260901.json、20260902.json def load_snapshot(date: str) -> dict: rows = json.loads((SNAP_DIR / f"{date}.json").read_text(encoding="utf-8")) return {r["股票代码"]: r for r in rows} # 以股票代码为主键 def diff_snapshots(prev: dict, curr: dict) -> list[dict]: events = [] for code, row in curr.items(): if code not in prev: # 新增代码 tag = "新上市" if row["isNew"] == 1 else "待复核" events.append({"type": tag, "code": code, "name": row["股票名称"]}) continue old = prev[code] if old["isSt"] != row["isSt"]: # ST 状态翻转 events.append({"type": "摘帽" if old["isSt"] else "戴帽", "code": code, "name": row["股票名称"]}) if old["股票名称"] != row["股票名称"]: # 代码不变名称变 events.append({"type": "更名", "code": code, "old_name": old["股票名称"], "new_name": row["股票名称"]}) for code, old in prev.items(): # 代码消失且旧名含"退" if code not in curr and "退" in old["股票名称"]: events.append({"type": "退市整理", "code": code, "name": old["股票名称"]}) return events ``` 三个实现取舍值得展开: **主键必须用代码而不是名称。** 名称本身就是会变的字段,按名称对齐会把一次"更名"误判成"一家退市加一家上市",事件流立刻失真。 **新增代码要做双重确认。** 新代码且 `isNew=1` 才定为新上市;只出现新代码但 `isNew=0` 的,大概率是转板、代码复用之类的数据边界情况,标记为待复核而不是直接生成事件。 **退市整理靠名称特征识别。** 进入退市整理期的股票名称通常带"退"字样,用"代码消失 + 旧名含退"两个条件同时命中,避免单一条件的误报。 ## 四、LLM 的职责边界:翻译,不判断 LLM 在这条管道里的位置非常克制:它不负责发现事件——那是规则引擎的事;它只做两件事,把每条结构化 diff 翻译成一句自然语言,以及对当日全部事件生成一份简报:按事件类型分组、标注值得人工复核的样本。 翻译环节的 prompt 采用结构化的 JSON 输入输出模板: ```json { "task": "把下列列表事件逐条翻译成一句自然语言,并做风险归类", "constraints": [ "只陈述事件事实,禁止涨跌预测与情绪化措辞", "更名事件须判断新名称是否属于风险警示类(含ST、退字样)", "不确定时 confidence 必须低于 0.6" ], "input": { "date": "2026-09-02", "events": [ { "type": "新上市", "code": "301xxx", "name": "某某科技" }, { "type": "更名", "code": "600xxx", "old_name": "某某科技", "new_name": "*ST某某" } ] }, "output_schema": { "descriptions": [{ "code": "", "text": "" }], "risk_flags": [{ "code": "", "risk_warning": true, "confidence": 0.0 }], "need_human_review": [] } } ``` prompt 里最重要的两条约束:其一,只描述事件本身,禁止任何涨跌预判——"某某科技被实施其他风险警示"是事件描述,"某某科技前景堪忧"是模型在发挥,后者必须被拦住;其二,更名事件要求模型判断新名称是否属于风险警示类(带 ST、退字样),并给出置信度。这一步用 LLM 而不是正则,是因为更名的写法有很多边界样本:缩写保不保留、星号位置怎么排、有没有空格,正则要打一堆补丁,模型一次判断附带置信度字段更干净。 置信度低于 0.6 的样本自动进入待人工复核清单。这份清单是简报里最值钱的部分——每天事件总量不大,新股通常每天一到五家,戴帽摘帽全年合计也就百来条,人工复核成本完全可控。 ## 五、事件去重与推送 去重是被实践逼出来的细节:ST 状态这类字段偶尔会连续几天在数据里摇摆,数据源修正、复核回滚都会造成同一事件反复出现。如果每天报一遍,订阅者很快就会关掉通道。解决办法是给每个事件生成 `类型:代码` 形式的键,跨日持久化: ```python def dedup_events(events: list[dict], seen: dict, date: str) -> list[dict]: """seen 持久化存储 {事件键: 首次报告日期},跨日复用。""" fresh = [] for ev in events: key = f"{ev['type']}:{ev['code']}" if key in seen: # 同一事件连续多日出现,只报首次 continue seen[key] = date fresh.append(ev) return fresh ``` 推送层按订阅粒度拆分:有人只订新上市,有人只订风险警示类变化(戴帽加风险警示类更名);简报每天固定一份,全类型汇总。实测一天的事件量多在个位数到十几条之间,一份简报一屏读完。 ## 六、分工比模型更重要 回头看,这套系统的价值不在单项技术,而在分工:确定性的事实判断(diff、去重、阈值)交给代码,语言生成交给 LLM,最终裁决留给人工复核。本地数据引擎在其中扮演的是地基角色——每天 16 点准时可取的全量快照、没有接口限流,才让"每天全量 diff 一遍"这种粗放但可靠的做法成为可能。 市场不会每天都有大事,但身份级事件一旦发生,后果都足够重。用几 MB 的快照存档换一个不漏报的监测通道,这笔账怎么算都划算。当然,事件识别属于数据推演,不构成投资建议。 资料参考:ig50 [gitee开源地址](https://gitee.com/igtrade/ighub) [github开源地址](https://github.com/ig50-service/ig50-official)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册