Wind 与 Multi-AI Agent结合——面向截面数据的自动化股票分析工作流

本人持续追踪关注AI Agent与股票投资研究分析的结合,特别是Python的Crew AI库。本人所创内容均为原创,且目前来看Crew  AI在国内技术社区覆盖较少,具有先驱性。

写在前面:

以下均为个人理解

大语言模型(LLMs)的最大优势是对文本以及数据的总结解释能力,投喂正确准确及时的数据库,理论上可以生成较为可靠以供参考的股票分析报告。

但是LLMs目前落地实用的最大障碍是LLMs的模型幻觉,LLMs经常凭空生成一些不存在的或与事实不相符的错误信息。特别是对于股票投资分析研究,LLMs的模型幻觉会导致极大的错误,甚至导致完全错误的投资决策。

AI Agent在大规模批量重复任务方面拥有特别的优势,因此特别适合于商业用途。

但单个AI Agent的分析角度往往被限制在一个角度,因为AI Agent一旦被Prompt设定,一般只能扮演一个分析角色,但多个Agent在一起合作搭建的工作流可以较好地解决这个问题。

通过设定不同的分析角色,不同的Agent负责不同的分析任务,这样就形成一个分析小组 ,而且也可以突破LLMs单次输出的最大Tokens限制,形成较为完整的分析报告。另外,还可以将不同的Agent设定为不同的模型,处理简单任务,分析简单数据的Agent可以用Tokens价格较低的LLM,分析复杂任务,任务需求高的Agent可以实用Tokens价格较高性能较好的LLM,尽管这样的分配在小批量的分析的中没有明显的区别,但进行大批量的股票分析的时候,可以极大地节省Tokens及对应的费用。

因此,本文的思路是利用准确及时的金融数据库来提供数据,用占位符来映射数据,最大程度解决大语言模型幻觉问题,调用Deepseek-V3和R1来分析股票。

实现过程:

调用Deepseek的API,本人在实现前完成了充值。

import getpass
import os
os.environ["DEEPSEEK_API_KEY"] = getpass.getpass()

这里短暂地使用了热门的Langchain库,主要是为了检验调用是否成功:

from langchain_deepseek import ChatDeepSeek

model = ChatDeepSeek(
    model="deepseek-reasoner",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2,
    api_key=os.environ["DEEPSEEK_API_KEY"], 
    use_responses_api=False
)

from langchain_core.messages import HumanMessage
 
response = model.invoke(
    [HumanMessage(content="说你是猫,中文回答")]
)

print(response.content)

这里连接了Wind的数据库,Wind的数据较为标准:

from WindPy import w
import pandas as pd
from datetime import datetime, timedelta

w.start()

电脑安装了Wind并验证通过的话,是不需要输入API key的。这里我们直接获取最近一期的资产负债表,利润表,现金流量表 ,并且获得了2025-03的月度股票价格波动数据。这里我们选择的上市公司是"688981.SH",只是作为示例。


stock_code = "688981.SH"
trade_date = "2025-03-30"
report_date = "2024-09-30"

params = f"tradeDate={trade_date};industryType=1;rptDate={report_date};currencyType=;rptType=1"

income_fields = [
    "eps_basic", "roe_avg", "roe_basic", "roa2", "roa",
    "netprofitmargin_deducted", "grossprofitmargin", "cogstosales",
    "nptocostexpense", "expensetosales", "optoebt",
    "profittogr", "optogr", "ebittogr"
]
income_data = w.wss(stock_code, ",".join(income_fields), params)
df_income = pd.DataFrame(income_data.Data, index=income_fields).T
df_income.columns = income_fields
print(" 利润表(2024Q3)")
print(df_income)

balance_fields = [
    "debttoassets", "deducteddebttoassets2", "deducteddebttoassets",
    "longdebttolongcaptial", "longcapitaltoinvestment",
    "assetstoequity", "equity_to_asset", "catoassets",
    "currentdebttoequity", "ncatoassets", "longdebttoequity",
    "tangibleassetstoassets", "equitytototalcapital", "intdebttototalcap",
    "currentdebttodebt", "longdebtodebt", "ncatoequity", "ibdebtratio"
]
balance_data = w.wss(stock_code, ",".join(balance_fields), params)
df_balance = pd.DataFrame(balance_data.Data, index=balance_fields).T
df_balance.columns = balance_fields
print("\n 资产负债表(2024Q3)")
print(df_balance)

cashflow_fields = [
    "salescashintoor", "ocftoor", "ocftooperateincome",
    "fa_netprofitcashcover", "capitalizedtoda", "ocftocf",
    "icftocf", "fcftocf", "ocftosales", "ocftoassets"
]
cashflow_data = w.wss(stock_code, ",".join(cashflow_fields), params)
df_cashflow = pd.DataFrame(cashflow_data.Data, index=cashflow_fields).T
df_cashflow.columns = cashflow_fields
print("\n 现金流量表(2024Q3)")
print(df_cashflow)

price_fields = [
    "close", "open", "volume", "amt", "swing", "turn"
]
price_data = w.wsd(
    stock_code,
    ",".join(price_fields),
    "2025-03-01",
    "2025-03-31",
    "unit=1"
)
df_price = pd.DataFrame(price_data.Data, index=price_data.Fields).T
df_price.columns = price_fields
df_price.index = price_data.Times
print("\n 股票价格数据(2025年3月)")
print(df_price)

接下来我们调用Crew AI,搭建股票分析框架,这里为了方便实验的速率,以及降低实验的费用,我们选择了DeepSeek-V3,这里我们首先定义了Agent的身份以及功能。

import os
os.environ["CREWAI_DISABLE_ONNX"] = "1"
os.environ["CREWAI_DISABLE_EMBEDDINGS"] = "1"


from crewai import Agent, Task, Crew, Process
from openai import OpenAI
balance_sheet_analyst = Agent(
    llm="deepseek/deepseek-chat",
    role="资产负债表分析专家",
    goal="深入分析企业的资产负债表,评估财务稳健性、资本结构、偿债能力及资产质量,提供专业财务见解",
    backstory=(
        "一位资深的资产负债表分析专家,擅长解读企业的资产、负债及股东权益结构,评估短期与长期偿债能力。"
        "熟悉流动性分析、杠杆比率、资产周转率及资本结构优化策略,能够结合行业基准和历史数据,识别企业的财务风险及成长潜力。"
    ),
    verbose=True,
    allow_delegation=False
)


income_statement_analyst = Agent(
    llm="deepseek/deepseek-chat",
    role="利润表分析专家",
    goal="深入分析企业的利润表,评估盈利能力、成本结构、营收增长趋势及经营效率,提供专业财务见解",
    backstory=(
        "一位经验丰富的利润表分析专家,擅长解读企业的收入、成本、费用和利润结构,评估盈利质量和增长潜力。"
        "熟悉毛利率、营业利润率、净利率、EBITDA、ROE 等核心财务指标,结合行业动态与竞争环境,帮助投资者识别企业的可持续盈利能力及经营风险。"
    ),
    verbose=True,
    allow_delegation=False
)

cash_flow_analyst = Agent(
    llm="deepseek/deepseek-chat",
    role="现金流量表分析专家",
    goal="深入分析企业的现金流量表,评估现金流结构、企业资金运作能力及财务可持续性,提供专业财务见解",
    backstory=(
        "一位资深的现金流分析专家,擅长解读企业的经营、投资和融资活动的现金流量,评估企业的自由现金流与资金流动性。"
        "熟悉经营活动现金流净额、资本支出、现金回报率及现金流安全边际分析,结合行业基准,帮助投资者识别企业的财务健康状况及流动性风险。"
    ),
    verbose=True,
    allow_delegation=False
)

price_trend_analyst = Agent(
    llm="deepseek/deepseek-chat",
    role="成交价趋势分析专家",
    goal="分析一段时间内的股票成交价趋势,结合技术指标和市场情绪,提供趋势判断与投资建议",
    backstory=(
        "一位经验丰富的金融市场分析师,专注于股票成交价趋势分析,结合成交量和市场情绪进行趋势判断。"
        "能够识别趋势反转信号、支撑与阻力位,以及市场周期性特征,为投资者提供精准的买卖时机建议。"
    ),
    verbose=True,
    allow_delegation=False
)
report_writer_agent = Agent(
    llm="deepseek/deepseek-chat",
    role="高级股票分析报告撰写专家",
    goal="整合财务数据、市场趋势和投资建议,撰写清晰、专业的股票分析报告,为投资者提供深入见解。",
    backstory=(
        "一位资深的股票分析师兼金融作家,熟练运用财务分析、行业研究和市场趋势洞察,撰写高质量的投资报告。"
        "擅长结合资产负债表、利润表、现金流量表、交易数据等关键指标,分析企业财务健康状况、盈利能力和市场竞争力。"
        "能够以结构化方式呈现分析结果,提供客观、专业且可操作的投资建议,帮助投资者做出明智决策。"
    ),
    verbose=True,
    allow_delegation=False
)

接下来我们定义了一个标准化格式的函数,防止程序报错,之后定义了Agent所需要完成的Task,这里的description参数我们没有展示,主要是因为篇幅过长,如果需要可以评论区联系我。

​

from collections import defaultdict
def safe_format(template, data):
    return template.format_map(defaultdict(str, data))

analyze_balance_sheet = Task(
    description=safe_format(analyze_balance_template, df_balance),
    agent=balance_sheet_analyst,
    expected_output="一份 Markdown 格式的资产负债表分析报告,涵盖企业的资产、负债、资本结构及财务稳健性评估。",
)


analyze_benefeit_statement = Task(
    description=safe_format(analyze_income_template, df_income),
    agent=income_statement_analyst,
    expected_output="一份 Markdown 格式的利润表分析报告,涵盖企业的盈利能力、收入增长、成本管理及综合收益分析。",
)


analyze_cash_flow = Task(
    description=safe_format(analyze_cash_template, df_cashflow),
    agent=cash_flow_analyst,
    expected_output="一份 Markdown 格式的现金流量表分析报告,涵盖企业的经营、投资和融资活动现金流。",
)


analyze_price_trend = Task(
    description=safe_format(analyze_price_template, df_price_1),
    agent=price_trend_analyst,
    expected_output="一份 Markdown 格式的股票价格趋势分析报告,涵盖价格趋势、成交量分析及风险评估。",
)



generate_stock_report_cn = Task(
    description=generate_report_template,
    agent=report_writer_agent,
    expected_output="一份 Markdown 格式的股票分析报告,涵盖财务、市场、运营及投资价值评估。",
    dependencies=[analyze_balance_sheet, analyze_benefeit_statement, analyze_cash_flow, analyze_price_trend]
)

​

最后我们直接启动即可,CrewAI库的调用还是简单的。

crew = Crew(
    llm="deepseek/deepseek-chat",
    agents=[balance_sheet_analyst,income_statement_analyst,cash_flow_analyst,price_trend_analyst,report_writer_agent],
    tasks=[
        analyze_balance_sheet, analyze_benefeit_statement, analyze_cash_flow, analyze_price_trend, generate_stock_report_cn
    ],
    process=Process.sequential, 
)

crew_output = crew.kickoff() 

print(f"Raw Output: {crew_output.raw}")

print(f"Token Usage: {crew_output.token_usage}")

最终输出

以下内容均由AI生成,用以参考前请谨慎评估,这些内容不代表作者的任何建议:

Raw Output: ```markdown
# XXX公司股票分析报告  

## 一、资产与财务结构  

### 1. 偿债能力分析  
- **资产负债率**33.44%(行业40-60%),财务政策保守,破产风险极低  
- **有息负债占比**22.02%,经营性负债主导显示供应链议价能力突出  
- **短期债务占比**43.53%需关注流动性安排,货币资金/总资产23.36%显示超额现金储备  

### 2. 资本结构优化  
- **权益乘数**1.50倍低于行业均值,建议提升至1.8倍以改善ROE  
- **长期负债/资本比**30.19%处于安全区间,需匹配资产期限结构  

### 3. 资产质量  
- **非流动资产占比**76.64%体现重资产特征,需关注周转效率  
- **流动负债/权益比**33.33%低于警戒线,速动比率>1显示短期偿付能力充足  

**核心结论**:财务稳健性★★★★☆,建议优化现金配置并适度增加财务杠杆  

## 二、盈利能力与收入质量  

### 1. 盈利水平  
- **ROE**18.86%显著高于资本成本,但**毛利率**17.64%→**净利率**7.72%转化损耗明显  
- **扣非净利率**5.25%与净利润率偏差2.47%,非经常性损益占比32%需警惕  

### 2. 成本结构  
- **销售成本率**82.36%突破警戒线,**费用率**12.56%存在优化空间  
- **净利/成本费用比**8.13%低于优秀企业10%基准  

### 3. 利润质量  
- 营业利润占比99.96%结构健康,但需核查是否含一次性收益  
- 缺失经营现金流/净利润比率数据(理想值应>1)  

**核心结论**:成本控制为关键改善点,建议实施集中采购与数字化降费  

## 三、现金流与财务可持续性  

### 1. 经营现金流  
- **销售回款率**89.07%接近优良水平,**OCF/营业收入**29.28%显著优于行业  
- **异常点**:经营现金流占比-66.58%,需核查大额营运资金投入  

### 2. 投资活动  
- **投资现金流占比**160.17%可能含资产处置收益,可持续性存疑  
- **自由现金流占比**6.41%显示资本支出压力较小  

### 3. 风险预警  
- 经营现金负占比需启动应收账款账龄分析  
- 建议建立20-30亿元银行授信对冲流动性风险  

**核心结论**:现金流健康度★★★☆☆,重点修复经营现金流并优化投资结构  

## 四、市场价格趋势与投资时机  

### 1. 价格表现  
- 累计跌幅5.83%,当前价90.4元接近关键支撑位89.87元  
- **阻力位**98.66元,**支撑位**89.87元,破位风险需警惕  

### 2. 技术信号  
- MACD看跌,RSI中性偏弱,布林带触及下轨显示超卖  
- 平均换手1.78%交投中等,量价相关性0.6需放量确认趋势  

### 3. 操作策略  
- **短线**:90元支撑位博弈反弹(止损88元)  
- **中长期**:等待周线企稳信号(连续两周>92元)  

**核心结论**:趋势评级★★☆☆☆,建议现金仓位保持60%以上  

## 五、综合结论与投资建议  

### 投资价值矩阵  
| 维度         | 评分(5★制) | 关键指标                 |  
|--------------|-------------|--------------------------|  
| 财务稳健性   | ★★★★☆       | 资产负债率33.44%         |  
| 盈利能力     | ★★★☆☆       | ROE18.86%/扣非净利率5.25%|  
| 现金流质量   | ★★★☆☆       | OCF/收入29.28%           |  
| 市场趋势     | ★★☆☆☆       | 下行通道/量价背离        |  

### 配置建议  
1. **保守型投资者**:  
   - 等待ROE持续>15%且经营现金流转正信号  
   - 关注89元支撑位有效性,破位则回避  

2. **进取型投资者**:  
   - 90-92元区间分批建仓(单仓位≤15%)  
   - 触发条件:  
     ✓ 单日放量>日均成交量150%  
     ✓ MACD金叉确认  

3. **优化建议**:  
   - 公司层面:提升资产负债率至40-45%,实施供应链金融优化  
   - 投资者层面:结合Q2财报验证毛利率改善趋势  

**风险提示**:短期债务兑付压力+成本攀升风险+技术面破位风险三重叠加需警惕  
```
Token Usage: total_tokens=17673 prompt_tokens=12519 cached_prompt_tokens=128 completion_tokens=5154 successful_requests=5

以上内容均由AI生成,用以参考前请谨慎评估,这些内容不代表作者的任何建议

总结

这份报告有用吗?

这是我最想问的一个问题,难道真的有人拿着这样的报告去做投资吗?我自己在进行的时候也在疑惑。

但是,我觉得,这只是目前项目的第一步,AI在大批量重复任务中拥有极低的分析成本,我们想要更好的分析结果,我们只需要更可靠的数据库以及更强大的大语言模型。我们可以看到这仅仅是DeepSeek-V3便可以获得较为结构化且具一定逻辑的分析报告,只要继续朝着方向不断调整改进 ,最终我们可以获得一个只需要输入股票代码就可以获得可靠股票分析报告的真正的AI智能投顾。

Limitations & Future Direction:

1.本文除股票价格数据以外,均为截面数据,不能反映公司基本面随时间的长期波动,未来将整合三大报表,将数据整合为面板数据。 

2.本文调用的LLM是非常基础的LLM,如果使用推理型模型,Agents可以获得更好的分析效果,未来将在分析框架稳定的基础上调用推理模型如Deepseek-R1或Open AI- GPTo1。

3.本文的多智能体只涉及了基本面和技术面的简单分析,未来添加情绪面(新闻爬取与文本分析 )后可以获得更好的分析效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值