基于CrewAI与AKShare构建A股多智能体分析系统
1. 项目概述:一个为A股市场量身定制的多智能体分析引擎
最近在折腾一个挺有意思的项目,叫“A股智能分析系统”。简单来说,它不是一个简单的数据爬虫或者指标计算器,而是一个由多个专业化AI角色(Agent)组成的“虚拟投研团队”。这个团队里的每个成员各司其职,有的看技术图形,有的扒财务报表,有的琢磨市场情绪,最后还有一个“投资顾问”来汇总大家的意见,给你一份相对全面的分析报告。
它的核心思路很直接:既然一个人的精力有限,看盘、看财报、看新闻很难面面俱到,那不如让几个“AI专家”分工协作。这背后依赖两个关键工具:CrewAI和AKShare。CrewAI负责搭建和管理这个多智能体协作的“工作流”,让几个AI能像真实团队一样沟通、传递信息、完成任务。AKShare则是一个宝藏级的开源金融数据接口库,提供了覆盖A股市场几乎所有维度的免费数据,从实时行情、历史K线到财务报表、资金流向、龙虎榜,一应俱全。把这两者结合起来,就构成了这个系统的骨架——用专业的数据,驱动专业的AI分析员,产出结构化的分析结论。
这个项目特别适合几类朋友:一是对量化分析、AI应用感兴趣的程序员或数据科学爱好者,你可以把它当作一个研究多智能体协作(Multi-Agent System)在金融领域落地的绝佳案例。二是那些有一定投资经验,但苦于信息过载、分析维度单一的散户投资者,这个系统可以帮你自动化完成一部分基础的数据整理和多维度交叉验证工作。当然,它绝对不是一个“圣杯”或“印钞机”,其核心价值在于提供一个相对客观、多角度的分析框架,辅助你进行决策,而不是替代你的思考。投资中最昂贵的四个字就是“这次不一样”,任何工具都只是帮你更清晰地看到“这次”和“以往”的异同。
2. 核心架构与设计思路拆解
2.1 为什么选择多智能体(Multi-Agent)架构?
传统的股票分析工具或脚本,往往是线性的:获取数据 -> 计算指标 -> 输出结果。这种模式的问题在于,不同分析维度(如技术面和基本面)的逻辑和知识体系是割裂的,很难进行深度的交叉验证和综合推理。比如,一只股票技术图形突破,但财报突然暴雷,线性程序可能只会机械地报告两个矛盾的事实。
多智能体架构的核心优势就在于“分工”与“协作”。在这个项目中,我们设计了四个专属的Agent,每个都拥有特定的角色、目标和专业知识背景:
- A股市场分析师:专注于盘面。他的知识库是技术分析理论、资金面解读和政策市特征。
- 财务报表专家:只和数字打交道。深谙财务三张表,擅长比率分析、趋势分析和同业比较。
- 市场情绪研究员:观察市场“温度”。分析资金流向、新闻舆情、散户情绪等非理性因素。
- A股投资顾问:扮演团队Leader和最终输出者。他并不直接进行原始分析,而是听取前三位专家的报告,识别其中的协同或矛盾点,结合A股市场的特性(如政策影响、涨跌停制度),综合生成最终的投资建议和风险评估。
这种设计模拟了一个专业投资研究室的流程。每个Agent在自己的领域内是“专家”,其思考(即大语言模型的推理)会更聚焦、更深入。而它们之间的协作(通过CrewAI的任务链和共享上下文实现),则确保了最终结论不是片面之词。例如,情绪研究员发现市场极度恐慌,但财务专家判断公司现金流依然稳健,这种矛盾点恰恰是投资顾问需要重点提示的风险或机会。
2.2 数据基石:AKShare的选型与优势
数据是分析的粮食。选择AKShare而非其他商业数据API(如Tushare、Baostock等),主要基于以下几点考量:
- 全面性与免费:AKShare覆盖了A股、港股、美股、期货、期权、宏观经济等海量数据,且完全免费。对于个人开发者和研究项目而言,没有调用次数和费用的限制,这是最大的吸引力。
- 社区活跃与更新快:AKShare基于Requests和Pandas,接口设计清晰。由于是开源项目,社区对数据源的维护和更新响应很快,能及时跟上交易所规则的变化。
- 轻量级与灵活性:直接返回Pandas DataFrame,与后续的数据处理、分析流程(通常也基于Pandas)无缝衔接,无需额外的数据格式转换。
当然,它也有缺点,比如接口稳定性依赖于目标数据网站的稳定性,偶尔会有爬虫失效的情况。但在项目架构中,我们可以通过增加错误重试、备用数据源逻辑来缓解。对于构建一个原型系统或研究工具来说,AKShare提供的“数据广度”足以支撑起多维度分析的需求。
2.3 CrewAI如何串联起整个工作流?
CrewAI是这个项目的“操作系统”。它不是一个AI模型,而是一个用于编排多个基于大语言模型(LLM)的Agent的框架。它的核心概念包括:
- Agent:定义每个角色的属性(role, goal, backstory)以及它擅长的工具(Tools)。
- Task:定义具体的工作任务,包括描述、期望输出、指定由哪个Agent来执行。
- Crew:将多个Agent和Task组织成一个有向无环图(DAG),明确任务执行的顺序和依赖关系。
在这个项目中,工作流被设计成一个清晰的接力赛:
- 启动:用户输入股票代码(如
600519.SH)。 - 并行数据获取与初步分析:市场分析师、财务专家、情绪研究员三个Agent同时启动。它们分别调用各自的工具函数(这些函数内部封装了AKShare接口),获取数据并完成自己领域的初步分析报告。这是一个“并行”阶段,提高了效率。
- 信息汇总与综合决策:三位专家的输出,作为上下文(Context)传递给投资顾问Agent。投资顾问的任务是阅读这些报告,进行综合研判,并生成包含明确观点、依据和风险提示的最终投资建议。
- 输出:最终报告以结构化的文本(或JSON)格式输出。
这个流程通过CrewAI的Process(如Process.sequential或Process.hierarchical)来管理。我们这里采用的是类层级式流程,即先并行执行专业分析,再串行执行综合决策。CrewAI会自动处理Agent之间的通信和上下文传递,开发者只需关注每个角色的定义和任务逻辑。
3. 四大智能体的深度解析与实操要点
3.1 A股市场分析师:技术、资金与政策的三角验证
这个Agent是盘面的“解读器”。它的目标不是预测涨跌,而是客观描述当前市场状态,并识别关键的技术位和资金信号。
核心工具与数据源:
- 实时/历史行情:通过AKShare的
stock_zh_a_spot和stock_zh_a_hist获取最新价、分时、日K线数据。这里的关键是复权处理。A股常有分红送股,必须使用后复权数据来分析长期趋势,否则K线图会出现巨大缺口,导致技术失真。在代码中,调用接口时需要明确指定adjust=“hfq”。 - 技术指标计算:我们不在AKShare层面做复杂计算,而是获取原始数据后,用
TA-Lib或Pandas在内存中计算均线(MA)、MACD、RSI、布林带等。这样做的好处是灵活,可以自定义参数。例如,除了常见的5、10、20、60日均线,对于A股,观察120日(半年线)和250日(年线)的支撑压力意义更大。 - 资金流向:使用
stock_individual_fund_flow获取个股的主力、超大单、大单、中单、小单资金净流入。分析师需要关注的不是单日数据,而是连续性和背离。比如,股价横盘或微跌,但主力资金连续多日净流入,这可能是一种“吸筹”信号。 - 政策与市场数据:通过
news接口获取财经新闻,或使用sector_detail查看所属板块的整体涨跌情况。在A股,板块效应非常显著。
实操心得与注意事项:
注意:技术分析是“艺术”而非“精确科学”。这个Agent的输出应避免使用“必然上涨”等绝对化词汇,而是描述“当前价格位于年线之上,且MACD出现金叉,属于技术面偏多信号”。同时,要特别提醒A股的“涨跌停限制”对技术形态的影响,比如连续涨停后的K线形态是失真的,此时技术指标参考价值下降。
3.2 财务报表专家:穿越数字迷雾的侦探
这个Agent的任务是给公司做“体检”,通过三张报表(资产负债表、利润表、现金流量表)判断其经营质量和财务健康度。
核心工具与数据源:
- 财务报告获取:使用AKShare的
stock_financial_report_sina或stock_financial_analysis_indicator接口。这里有个关键点:报告期。要区分季度报、中报、年报。分析时通常采用TTM(滚动十二个月)数据来消除季节性影响,并与去年同期对比看增长。 - 财务比率分析:这不是简单罗列数据。专家需要计算并解读关键比率:
- 盈利能力:毛利率、净利率、ROE(净资产收益率)。高且稳定的ROE是好公司的特征。
- 营运能力:应收账款周转率、存货周转率。判断公司运营效率。
- 偿债能力:资产负债率、流动比率、速动比率。评估财务风险。
- 成长能力:营收增长率、净利润增长率。
- 同业对比:通过
stock_industry找到同行业公司,拉出它们的财务比率进行横向比较。孤立的数据没有意义,只有在行业坐标系中,才能看出公司的相对位置。
实操心得与注意事项:
财务分析最忌“纸上谈兵”。这个Agent在输出时,必须结合行业特性。例如,房地产行业本身资产负债率就高,单纯看比率会很吓人;而白酒行业通常现金流充沛,预收账款(合同负债)是一个重要的先行指标。此外,要警惕“财务洗澡”和“业绩变脸”,对于异常波动的单项数据(如某季度销售费用骤降、利润暴增),Agent应在报告中标注“需要关注其可持续性及背后原因”。它更像一个提出问题的侦探,而不是下结论的法官。
3.3 市场情绪研究员:测量市场的“温度计”
A股是一个散户占比高、情绪化特征明显的市场。这个Agent试图量化那些难以用数字直接描述,却又至关重要的“市场情绪”。
核心工具与数据源:
- 资金流向深度分析:除了个股资金流,还要看板块资金流(
sector_fund_flow)。近期资金持续流入的板块,往往是市场热点。观察“北向资金”(沪股通、深股通)的动向,因其常被视为“聪明钱”。 - 市场广度指标:计算全市或特定板块的上涨家数 vs 下跌家数,以及涨停板家数 vs 跌停板家数。涨停家数增多而指数滞涨,可能预示市场情绪高涨但动能不足。
- 新闻与舆情分析:从财经新闻标题和摘要中,通过简单的关键词匹配或情感分析模型(如基于本地运行的轻量级模型),判断舆论倾向是“乐观”、“悲观”还是“中性”。关注政策相关新闻的出现频率和语气。
- 换手率与量价关系:异常放量(换手率急剧放大)往往意味着分歧加大或趋势可能转折。
实操心得与注意事项:
情绪指标通常是“滞后”或“同步”的,很难领先。这个Agent的价值在于提供“市场当前处于什么状态”的背景板。例如,当财务和技术面都向好,但市场情绪指标显示极度贪婪(如涨停家数过多、媒体一致唱多)时,这本身就是一个重要的风险提示。在实现时,情绪分析部分不宜过度复杂化,初期可以从简单的规则和关键词入手,避免引入不稳定的复杂NLP模型影响系统整体可靠性。
3.4 A股投资顾问:最终的合成与决策者
这是团队的“首席执行官”。它不生产原始数据,而是做信息的整合、权衡与决策。
它的工作流程:
- 信息接收:获取前三位Agent的详细分析报告。
- 矛盾识别:这是最关键的一步。例如,技术分析师说“突破在即”,情绪研究员说“市场恐慌”,财务专家说“业绩平稳”。投资顾问需要指出这种矛盾,并尝试分析哪种力量可能主导短期走势。
- A股特色因素加权:在综合判断时,必须额外考虑:
- 政策影响权重:对于受政策影响大的行业(如新能源、房地产),政策面分析的权重应调高。
- 市场阶段判断:是牛市、熊市还是震荡市?不同市场环境下,技术指标和情绪指标的有效性不同。
- 风险提示:必须包含A股特有的风险点,如业绩预告窗口期、限售股解禁、监管问询等。
- 生成结构化建议:输出不应是一段笼统的文字,而应包含:总体观点(看多/看空/中性)、核心依据(1.2.3.)、关键风险、建议关注价位(支撑/阻力)、以及后续观察点。
实操心得与注意事项:
投资顾问Agent的“智力”高度依赖于底层LLM的能力。如果使用较小的本地模型(如Llama 3.1 8B),它可能难以进行深度复杂的逻辑推理。此时,在任务(Task)描述中必须写得极其清晰具体,例如:“请首先总结三位专家的核心观点;然后列出观点一致和矛盾的地方;接着,结合A股市场当前[可传入宏观描述]的环境,给出你的权重判断;最后,输出格式必须严格按照以下JSON结构...”。通过精细的提示词工程,可以引导能力有限的模型产出结构化的可靠输出。
4. 从零到一的部署与核心配置实战
4.1 环境搭建与依赖管理
项目推荐使用Poetry进行依赖管理,这是现代Python项目的优秀实践,能很好地解决版本冲突和环境隔离问题。
步骤详解:
- 系统准备:确保你的系统已安装Python 3.12或更高版本。可以通过
python --version检查。 - 安装Poetry:如果未安装Poetry,使用官方推荐的一键安装命令(以Linux/macOS为例):
安装后,将Poetry添加到系统PATH。Windows用户可以使用Powershell安装,或通过curl -sSL https://install.python-poetry.org | python3 -pip install poetry安装(但官方推荐独立安装脚本)。 - 克隆与进入项目:
git clone https://github.com/liangdabiao/easy_investment_Agent_crewai.git cd easy_investment_Agent_crewai - 使用Poetry安装依赖:项目根目录下的
pyproject.toml已经定义了所有依赖。运行:
这个命令会创建一个虚拟环境,并安装所有必要的包,包括CrewAI、LangChain、AKShare、pandas等。poetry install--no-root参数表示不把当前项目本身作为包安装,通常不需要额外指定。
避坑指南:
- 网络问题:安装过程中,特别是下载PyTorch或某些大模型相关库时,可能会很慢或失败。建议配置国内镜像源。可以为Poetry单独配置源:
或者,更通用的方法是修改系统或用户层面的pip源。poetry config repositories.pypi https://pypi.tuna.tsinghua.edu.cn/simple/ - 版本冲突:如果
poetry install失败,提示依赖冲突,可以尝试使用uv工具,它以其极快的依赖解析速度著称。按照项目README提示:
这同样会创建虚拟环境并安装依赖。uv sync
4.2 核心配置文件解读与定制
项目的可配置性很强,核心在于两个YAML文件:config/agents.yaml和config/tasks.yaml。理解它们,你才能定制自己的分析团队。
agents.yaml- 定义你的AI团队成员:
a_stock_analyst: role: "A股市场技术分析师" goal: "提供基于价格、成交量、技术指标和市场资金流向的短期至中期趋势分析" backstory: "你是一位拥有15年A股实盘经验的技术分析专家,精通K线形态、均线系统、MACD、RSI等指标,尤其擅长结合A股市场‘政策市’和‘资金市’的特征进行解读。你对市场波动有极强的敏锐度。" tools: ["get_stock_data", "calculate_technical_indicators"]role:角色名称,用于在任务中指派。goal:该Agent的终极目标,所有思考都围绕此展开。写得更具体,Agent的表现会更聚焦。backstory:背景故事,这相当于给大模型提供了“人设”和知识背景。这里可以植入你对A股的理解,比如“深知散户情绪的影响”、“经历过多次牛熊转换”等,让Agent的分析更具“中国特色”。tools:该Agent被允许使用的工具列表。这些工具在代码中定义,通常是封装了AKShare数据获取或计算逻辑的函数。
tasks.yaml- 定义团队的工作流程:
analyze_market: description: > 作为A股市场分析师,请对{stock_code}进行全面的技术面和资金面分析。 你需要: 1. 获取该股票最近30个交易日的日K线数据(使用后复权)。 2. 计算并分析短期(5,10,20日)、长期(60,120,250日)移动平均线的排列关系。 3. 计算MACD和RSI指标,判断其是否出现背离、金叉或死叉信号。 4. 分析近5个交易日的资金流向,区分主力、散户资金行为。 5. 结合当前大盘指数位置和所属板块热度,给出技术面综合结论。 结论应避免预测具体点位,而是描述当前状态、关键支撑阻力位以及多空力量对比。 expected_output: "一份详细的技术分析报告,包含数据摘要、指标解读和综合结论。" agent: "a_stock_analyst"description:任务的详细描述。这是提示词工程的关键。描述越清晰、步骤越具体,Agent的输出就越符合预期。这里使用了具体的参数(30日、哪些均线)、明确的分析步骤和输出要求。expected_output:期望的输出格式或内容概述。agent:指定由哪个Agent来执行此任务。
自定义实践:如果你想增加一个“宏观经济分析师”Agent,只需在agents.yaml中添加一个新条目,并在tasks.yaml中为其设计一个新任务,然后在Crew的组装流程中将其插入到合适的位置(例如,在专业分析之前或之后)。
4.3 模型选择与切换:从云端到本地
项目的灵活性体现在可以轻松切换底层的大语言模型。
使用本地模型(默认): 项目默认配置是使用Ollama本地运行的llama3.1模型。这保证了数据隐私和零API成本。
# 在 src/a_stock_analysis/crew.py 或类似初始化文件中 from langchain.llms import Ollama llm = Ollama(model="llama3.1", temperature=0.1) # temperature调低使输出更稳定- 前提:你需要在本地安装并运行Ollama,并已经拉取了
llama3.1模型(通过ollama pull llama3.1)。 - 优势:完全离线,响应速度快,无使用限制。
- 劣势:模型能力相对GPT-4等顶级模型有差距,在复杂逻辑推理、遵循复杂指令方面可能不足。
使用OpenAI GPT系列模型: 如果你追求更强大的分析和推理能力,且不介意API成本,可以切换到OpenAI。
from langchain.chat_models import ChatOpenAI import os os.environ["OPENAI_API_KEY"] = "your-api-key-here" llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0.1)- 配置:需要在项目的
.env文件中设置OPENAI_API_KEY环境变量,代码中通过os.environ读取。 - 注意:使用云端API意味着你的股票代码和分析数据会发送给OpenAI,需考虑数据隐私问题。同时,分析多只股票或深度分析可能产生可观的API费用。
实操建议:在开发调试阶段,可以使用本地小模型快速迭代逻辑。在需要生产级分析报告时,切换到大模型。你甚至可以设计一个“模型路由”逻辑,让“投资顾问”这个需要最强综合能力的角色使用GPT-4,而其他专业分析角色使用本地模型,以平衡成本与效果。
4.4 运行你的第一次分析
环境配置好后,运行分析非常简单。
复制环境变量文件:
cp .env.example .env然后编辑
.env文件。如果你用本地模型,可能只需要配置日志级别;如果用OpenAI,则需要填入你的API密钥。运行默认分析:
poetry run python src/a_stock_analysis/main.py默认情况下,系统会分析腾讯控股(
00700.HK)。你会看到控制台输出各个Agent开始工作、调用工具、思考、最终生成报告的日志。分析其他股票: 直接修改
main.py中的inputs字典:inputs = { 'company_name': '宁德时代', 'stock_code': '300750.SZ', # 深交所创业板股票 'market': 'SZ' }支持的代码格式必须规范:上交所A股以
.SH结尾,深交所A股以.SZ结尾,港股以.HK结尾。这是AKShare接口的要求。
5. 常见问题、排查技巧与进阶优化
5.1 数据获取失败问题
这是使用AKShare最常见的问题,因为其数据源来自网络爬虫。
- 症状:程序报错,提示
JSONDecodeError或连接超时,或者返回空数据。 - 排查步骤:
- 网络检查:首先手动访问一下AKShare的源码中对应的目标网站(如新浪财经、东方财富),看是否能正常打开。有时是目标网站临时维护或反爬策略升级。
- 接口更新:AKShare接口可能已变更。查看项目GitHub的Issues或提交记录,看是否有相关反馈。可以尝试使用
ak.__version__查看版本,考虑升级AKShare库 (pip install akshare --upgrade)。 - 股票代码格式:反复确认股票代码格式是否正确,特别是后缀。
600519和600519.SH对于某些接口是不同的。 - 增加重试与异常处理:在封装AKShare调用的工具函数中,务必添加
try-except块和重试逻辑(如使用tenacity库)。对于暂时性网络错误,重试2-3次往往能解决。 - 备用数据源:对于关键数据,可以考虑实现一个降级策略。例如,获取财务数据时,如果新浪接口失败,可以尝试切换至东方财富的备用接口(AKShare通常提供多个同功能接口)。
5.2 Agent“胡言乱语”或输出不相关
这通常与模型能力或提示词(Prompt)质量有关。
- 症状:Agent的分析报告天马行空,谈论与股票无关的内容,或者严重偏离任务描述。
- 排查与解决:
- 检查提示词(Task Description):这是首要原因。确保
tasks.yaml中的描述足够具体、无歧义,并且用明确的指令(如“你需要:1. ... 2. ...”)来约束模型。为Agent设定严格的输出格式要求。 - 调整模型温度(Temperature):在初始化LLM时,将
temperature参数调低(如从0.7调到0.1或0.2)。较低的temperature会使模型输出更确定、更保守,减少随机性和“创造性”(在这里是胡编乱造)。 - 测试模型基础能力:如果使用本地模型,先用一个简单的问答测试它是否具备基本的金融知识。如果基础太差,考虑更换更大或更专业的模型(如
qwen:7b或llama3.2)。 - 为Agent提供更详细的背景(Backstory):在
agents.yaml中,丰富backstory,明确其专业领域和限制。例如,“你是一位严谨的财务分析师,只基于提供的财务数据说话,不进行没有根据的推测。”
- 检查提示词(Task Description):这是首要原因。确保
5.3 运行速度慢或内存占用高
- 症状:分析一只股票需要好几分钟,或者程序占用大量内存。
- 优化方向:
- 模型层面:使用量化版本的本地模型(如
llama3.1:8b-instruct-q4_K_M),能在几乎不损失精度的情况下大幅降低内存和计算需求。 - 数据缓存:对于不经常变动的数据(如历史财务数据),可以将其缓存到本地数据库(如SQLite)或文件中,下次请求时直接读取,避免重复网络请求。
- 异步并发:CrewAI本身支持一定程度的任务并行。确保在
Crew定义时,将可以并行执行的任务(如三个专家的分析)设置为并行模式,以缩短整体运行时间。 - 精简上下文:在Agent间传递上下文时,避免传递过长的原始数据。尽量传递提炼后的结论性文字,以减少模型的令牌(Token)消耗,提升速度并降低成本(对于API模型)。
- 模型层面:使用量化版本的本地模型(如
5.4 分析结论过于笼统或缺乏洞察
- 症状:报告看起来正确,但都是“车轱辘话”,没有深入的分析和独特的见解。
- 进阶优化:
- 工具增强:为Agent提供更强大的分析工具。例如,为财务专家提供一个“财务健康度评分卡”工具,该工具内部封装一套评分算法(如Z-score模型、杜邦分析分解),让Agent直接引用评分结果,而不仅仅是罗列比率。
- 引入外部知识:让Agent在分析时能够查询一些定义性的知识。例如,可以集成一个本地向量数据库,里面存储了经典投资书籍的片段(如《巴菲特致股东的信》、《笑傲股市》中的原则),让Agent在推理时能参考这些“投资哲学”。
- 迭代式分析:设计多轮任务。第一轮,各Agent产出初步报告。第二轮,投资顾问提出疑问(例如,“财务专家,你提到毛利率下降,请分析是成本上升还是售价下降导致的?”),然后指派对应的Agent进行深度分析。这种“追问”机制能挖掘更深层的信息。
- 人工反馈循环:将系统的输出提供给有经验的投资者审阅,标记出分析不到位或错误的地方。将这些“修正案例”作为few-shot示例,加入到对应Agent的提示词中,持续微调其分析能力。
这个项目就像一个乐高积木,基础框架已经搭好,但真正的威力和独特性,来自于你如何根据自己的投资理念和知识,去配置、优化和扩展这些AI“分析师”。它不会给你一个“买入/卖出”的魔法按钮,但能为你提供一个不知疲倦、覆盖多维度的研究助理,帮你把繁杂的信息初步梳理成结构化的报告,让你能把更多精力花在最终的判断和决策上。
