然后呢? FinBuddy — AI Agent 金融助手 — 折腾记录

FinBuddy — AI Agent 金融助手

Python + Electron · 从 7 个 Agent 砍到 3 个,反而更稳定

项目介绍

我做价值投资,需要快速筛选公司、分析财报、看行业数据。这些事情手动做很慢,但逻辑是固定的——正好适合让 AI 干。FinBuddy 不是交易系统,是一个研究助手:你问它问题,它调工具查数据,给你分析结果。

一开始我想得很简单:一个 Agent 接收问题,调工具查数据,返回结果。但实际做下来发现问题远比想象中复杂——用户的问题往往不是单一意图,而是混合的;不同场景需要不同的专家组合;Agent 的输出需要合规检查。

核心架构

FinBuddy 的架构经历了三次大重构,最终定型为三层:

  1. 意图引擎 — 先用规则引擎(关键词+正则+实体提取)快速分类,再用 LLM 语义解析兜底
  2. Swarm 编排引擎 — 按 DAG 依赖关系拓扑排序,并行/串行执行任务
  3. 进化系统 — Skill 进化(Analyzer + Evolver)和 Agent 自我进化(SelfOptimizer)
# 意图解析 — 双层架构
class UnifiedIntentEngine:
    """规则引擎快速分类 + LLM 语义解析兜底"""

    async def parse(self, query: str) -> IntentResult:
        # 第一层:规则引擎,毫秒级响应
        rule_result = self._rule_parse(query)
        if rule_result.confidence > 0.85:
            return rule_result
        # 第二层:LLM 语义解析,处理模糊/复杂意图
        llm_result = await self._llm_parse(query)
        return llm_result

工具体系

从 7 个 Agent 砍到 3 个后,原来各 Agent 的能力全部下沉为工具。工具是确定性的,输入相同输出就相同,比 Agent 可控得多。目前 FinBuddy 有 5 类核心工具:

1. 行情数据工具

从通达信本地客户端读取实时行情,不依赖第三方 API,速度快且稳定。支持 A 股日线/分钟线、板块行情、资金流向。

# 行情数据工具 — 从通达信读取实时行情
CLASS TdxDataSource:
    """通达信数据源,直连本地 TDX 客户端"""

    ASYNC DEF connect(self):
        # 连接本地通达信客户端(必须先启动 TDX)
        self.client = TdxClient()
        self.client.connect()
        # 连接后立即刷新自选股 K 线缓存
        AWAIT self.refresh_kline()

    ASYNC DEF fetch_daily_kline(self, stock_code, start, end):
        # 获取日线 K 线:开/高/低/收/量
        # 先查本地数据库(离线可用),再从 TDX 增量更新
        local_data = AWAIT self.db.get_kline(stock_code, start, end)
        IF self.client.is_connected:
            latest = self.client.get_kline(stock_code)
            AWAIT self.db.save_kline(stock_code, latest)
            RETURN merge(local_data, latest)
        RETURN local_data

    ASYNC DEF fetch_money_flow(self, stock_code):
        # 获取资金流向:主力/散户净流入
        # TDX 客户端提供 Level-2 资金数据
        RETURN self.client.get_money_flow(stock_code)

2. 财报分析工具

从本地数据库读取公司财报数据(三张表),计算 PE/PB/ROE/负债率/自由现金流等指标。数据来源是通达信导出的财务数据,定期同步。

# 财报分析工具 — 本地数据库查询
CLASS FinancialDataTool:
    """财报数据查询和指标计算"""

    ASYNC DEF get_key_metrics(self, stock_code, years=4):
        # 从 finbuddy_market.db 查询多年财务指标
        # 返回:营收/净利润/毛利率/ROE/负债率/经营现金流
        metrics = AWAIT self.middleware.query_financial(
            stock_code,
            fields=["revenue", "net_profit", "gross_margin",
                    "roe", "debt_ratio", "operating_cashflow"],
            years=years
        )
        # 计算增速和趋势
        metrics["revenue_growth"] = calc_yoy(metrics["revenue"])
        metrics["profit_growth"] = calc_yoy(metrics["net_profit"])
        RETURN metrics

    ASYNC DEF screen_stocks(self, conditions):
        # 价值筛选:按条件批量筛选
        # 例:PE<15 AND ROE>15% AND 负债率<60%
        # 详见 invest/quantitative-tools.html
        RETURN AWAIT self.middleware.screen(conditions)

3. 回测引擎工具

基于 Backtrader 的回测引擎,支持 Python 策略代码编写、参数优化、多品种回测。用户描述策略思路,Agent 生成策略代码并执行回测。

# 回测引擎工具 — Backtrader 封装
CLASS BacktestEngineTool:
    """策略回测执行引擎"""

    ASYNC DEF run_backtest(self, strategy_code, params):
        # 1. 安全校验:白名单检查策略代码中的 import
        validate_imports(strategy_code)  # 禁止 os/sys/subprocess 等

        # 2. 构建 Backtrader 场景
        cerebro = bt.Cerebro()
        data = AWAIT self.load_feed(params.stock_code, params.start, params.end)
        cerebro.adddata(data)

        # 3. 注入策略类(用户代码动态加载)
        strategy_class = compile_strategy(strategy_code)
        cerebro.addstrategy(strategy_class, **params.kwargs)

        # 4. 执行回测
        result = cerebro.run()

        # 5. 返回回测指标(必须标注"回测结果")
        RETURN BacktestResult(
            annual_return=result.annual_return,  # 回测年化收益
            max_drawdown=result.max_drawdown,    # 最大回撤
            sharpe=result.sharpe,                # 夏普比率
            disclaimer="回测结果,不代表未来表现"
        )

4. 知识库工具

本地知识库,存储用户的研究笔记、投资日志、阅读心得。Agent 可以检索知识库中的相关内容辅助分析,但不会自动写入——写入需要用户确认。

# 知识库工具 — 本地向量检索
CLASS KnowledgeBaseTool:
    """本地知识库检索(不联网)"""

    ASYNC DEF search(self, query, top_k=5):
        # 向量化查询 → 本地 FAISS 索引检索
        query_embedding = self.embedder.encode(query)
        results = self.faiss_index.search(query_embedding, top_k)
        # 返回相关笔记片段(来源:用户自己的研究笔记)
        RETURN [r.payload for r in results]

    ASYNC DEF add_note(self, content, metadata):
        # 添加笔记到知识库(需用户确认)
        # 自动向量化并插入 FAISS 索引
        embedding = self.embedder.encode(content)
        self.faiss_index.add(embedding, payload={
            "content": content,
            "metadata": metadata,
            "created_at": now()
        })

5. 安全与合规工具

SQL 注入防护、LLM 生成内容安全校验、投资建议合规过滤。这是 FinBuddy 作为金融工具的底线——所有输出必须经过合规检查。

# 安全合规工具 — 输出过滤
CLASS ComplianceTool:
    """投资内容合规检查"""

    DEF check_output(self, text: str) -> ComplianceResult:
        # 规则1:禁止推荐具体股票
        IF contains_stock_recommendation(text):
            RETURN ComplianceResult(blocked=True, reason="禁止推荐具体股票")

        # 规则2:禁止给出买卖建议
        IF contains_trading_advice(text):
            RETURN ComplianceResult(blocked=True, reason="禁止给出买卖建议")

        # 规则3:回测数据必须标注"回测"
        IF contains_backtest_data(text) AND NOT has_backtest_disclaimer(text):
            RETURN ComplianceResult(blocked=True, reason="回测数据需标注免责")

        # 规则4:禁止承诺收益
        IF contains_return_guarantee(text):
            RETURN ComplianceResult(blocked=True, reason="禁止承诺收益")

        RETURN ComplianceResult(blocked=False)

    DEF validate_sql_identifier(self, name: str) -> str:
        # SQL 注入防护:白名单校验表名/列名
        # 只允许字母、数字、下划线
        IF NOT re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', name):
            RAISE ValueError(f"非法标识符: {name}")
        RETURN name

最大的坑:Agent 不是越多越好

第一版我搞了 7 个 Agent:基本面分析师、技术分析师、风控专家、资金流向分析师、行业研究员、宏观分析师、首席策略师。听起来很酷对吧?

实际跑起来发现:意图解析链路太长,错误层层放大。7 个 Agent 的 system prompt 加起来 token 就爆了。最后砍到 3 个核心 Agent:数据获取分析策略。简单、可控、稳定。

开发日记

  1. SQLCipher加密与前端重构

    数据库加密改造:SQLCipher引擎替换aiosqlite、KeyHolder密钥派生、EncryptedStorage密钥链路重构、自选股排序、前端20+组件优化。

  2. 市场监控与弹窗系统

    新增市场监控服务(异常检测+订阅推送)、弹窗系统(Toast/Modal/History)、自选股静默预取、FC拦截层。

  3. 修复通达信K线增量更新

    先刷新缓存再读取,同步保存到本地数据库,修复open字段读取close_df的bug。

  4. Services 层拆分重构

    将臃肿的 services.py 拆分为独立服务模块,按职责单一原则组织。

  5. 安全模块重构

    白盒密码学、设备指纹、许可证验证的安全架构重构。

  6. 通达信技能与Swarm优化

    新增通达信技能模块、Swarm并行流式输出、流式处理增强。

  7. 自选股与计费重构

    自选股完整功能、FC冻结-结算-退款计费、研究架构子包拆分。

  8. 意图引擎重构

    6层继承链重构为组合模式,Swarm DAG编排,数据源适配器统一接口。

  9. 核心模块与SSE流式

    新增core子包(权限/用量/内存/插件),SSE流式解析,OpenSpace参考。

  10. 意图引擎与SubAgent

    意图解析6层继承链、SubAgent执行器、FinClawAdapter、K线图组件。

  11. 初始架构搭建

    Electron+FastAPI技术栈,7个Agent设计,认证鉴权,前端骨架。