为了账号安全,请及时绑定邮箱和手机立即绑定

用LangGraph和OpenAI构建智能股票分析师

用Monica的照片

在股票交易的世界里,投资者依赖各种工具和方法来做出明智的决策。其中一种方法是基本面分析法,它通过评估公司的财务状况和股票表现来提供实用的见解。借助人工智能和机器学习,股票分析已实现很大程度的自动化。在这篇文章里,我们将探讨如何使用LangChain、LangGraph和雅虎财经来创建一个股票表现分析工具,利用实时股票数据和关键指标。

无论你是金融爱好者、开发者还是数据科学家,这个一步一步的教程将让你有能力创建自己的智能代理。那就让我们开始吧!

这位代理财务分析师会做什么?(Agentic是什么意思?)
  • 从雅虎财经获取股票价格数据
  • 计算技术指标,如RSI、MACD、VWAP等。
  • 评估财务指标,如PE比率、负债率(负债与资产比率)和利润率。
  • 提供结构化的AI生成分析,使用OpenAI的强大语言模型。
我们将用到的工具
  1. LangGraph: 一个用于编排工具并构建对话代理的库。
  2. OpenAI GPT-4: 用于生成智能且结构化的金融洞察。
  3. yfinance: 用于获取股票价格和财务比率。
  4. ta(技术分析库): 用于计算关键技术指标。
  5. Python库: pandas, dotenv, 和 datetime 用于数据处理和环境配置。
步骤 1:设置开发环境:

首先安装所需的库:

pip install -U lang图表 langchain langchain_openai pandas ta python-dotenv yfinance
# 安装更新的库:langgraph, langchain, langchain_openai, pandas, ta, python-dotenv, yfinance

创建一个 .env 文件来安全存储你的 OpenAI API 密钥。

OPENAI_API_KEY = 请将你的 openai_api_key_here
步骤2:分析师工具

获取股票历史数据:这个工具会抓取股票的历史数据并计算一些技术指标。

    from typing import Union, Dict, Set, List, TypedDict, Annotated  
    import pandas as pd  
    from langchain_core.tools import tool  
    import yfinance as yf  
    from ta.momentum import RSIIndicator, StochasticOscillator  
    from ta.trend import SMAIndicator, EMAIndicator, MACD  
    from ta.volume import volume_weighted_average_price  

    @tool  
    def 获取股票价格(ticker: str) -> Union[Dict, str]:  
        """获取给定股票代码的历史价格数据和技术指标."""  
        try:  
            data = yf.download(  
                ticker,  
                start=dt.datetime.now() - dt.timedelta(weeks=24*3),  
                end=dt.datetime.now(),  
                interval='1周'  
            )  
            df = data.copy()  
            data.reset_index(inplace=True)  
            data.Date = data.Date.astype(str)  

            indicators = {}  

            rsi_series = RSIIndicator(df['Close'], window=14).rsi().iloc[-12:]  
            indicators["RSI"] = {date.strftime('%Y-%m-%d'): int(value)   
                        for date, value in rsi_series.dropna().to_dict().items()}  

            sto_series = StochasticOscillator(  
                df['High'], df['Low'], df['Close'], window=14).stoch().iloc[-12:]  
            indicators["Stochastic_Oscillator"] = {  
                        date.strftime('%Y-%m-%d'): int(value)   
                        for date, value in sto_series.dropna().to_dict().items()}  

            macd = MACD(df['Close'])  
            macd_series = macd.macd().iloc[-12:]  
            indicators["MACD"] = {date.strftime('%Y-%m-%d'): int(value)   
                        for date, value in macd_series.to_dict().items()}  

            macd_signal_series = macd.macd_signal().iloc[-12:]  
            indicators["MACD_Signal"] = {date.strftime('%Y-%m-%d'): int(value)   
                        for date, value in macd_signal_series.to_dict().items()}  

            vwap_series = volume_weighted_average_price(  
                high=df['High'], low=df['Low'], close=df['Close'],   
                volume=df['Volume'],  
            ).iloc[-12:]  
            indicators["vwap"] = {date.strftime('%Y-%m-%d'): int(value)   
                        for date, value in vwap_series.to_dict().items()}  

            return {'stock_price': data.to_dict(orient='records'),  
                    'indicators': indicators}  

        except Exception as e:  
            return f"获取价格数据时发生错误: {str(e)}"

财务比率: 此工具提供关键的财务健康指标。

    @tool
    def 获取财务比率(ticker: str) -> Union[Dict, str]:  
        """获取给定股票代码的关键财务指标。"""  
        try:  
            stock = yf.Ticker(ticker)  
            info = stock.info  
            return {  
                '市盈率': info.get('forwardPE'),  
                '市净率': info.get('priceToBook'),  
                '负债权益比率': info.get('debtToEquity'),  
                '利润率': info.get('profitMargins')  
            }  
        except Exception as e:  
            return f"获取财务比率失败:{str(e)}"
步骤 3:构建 LangGraph 语言图

LangGraph 让我们能够高效地协调工具的使用并管理对话流程。

1. 定义图表:

定义一个 StateGraph 来管理流程的流动。

    从langgraph.graph导入StateGraph、START和END  

    class State(TypedDict):  
        messages: Annotated[list, add_messages]  
        stock: str  

    graph_builder = StateGraph(State)
2. 定义 OpenAI 及其绑定工具

我们把这些工具整合进LangGraph,并创建一个分析过程的反馈回路。

import dotenv  
dotenv.load_dotenv()  

from langchain_openai import ChatOpenAI  

llm = ChatOpenAI(model='gpt-4o-mini')  

tools = [获取股票价格, 获取财务指标]  
llm_with_tool = llm.绑定功能(tools)
三点. 分析点

这提示让AI理解其角色并生成有结构的输出。

    FUNDAMENTAL_ANALYST_PROMPT = """  
    你是一位专注于基于股价、技术指标和财务指标来评估公司(其股票代码为 {company})表现的基本面分析师。你的任务是为给定的股票提供全面的基本面分析摘要。  

    你拥有访问以下工具的权限:  

1. **get_stock_prices**: 获取最新的股票价格、历史价格数据和技术指标如RSI、MACD、最大回撤和VWAP。  

2. **get_financial_metrics**: 获取关键财务指标,例如收入、每股收益(EPS)、市盈率(P/E)和资产负债率。  

    ### 你的任务:  

1. **输入股票代码**: 使用提供的股票代码查询工具并收集相关信息。  

2. **分析数据**: 评估工具的结果,识别潜在的阻力、关键趋势、优势或关注点。  

3. **提供摘要**: 编写一个简洁、结构良好的摘要,突出以下内容:  
        - 近期的股价变动、趋势和潜在阻力。  
        - 关键技术指标的见解(例如,股票是否超买或超卖)。  
        - 基于财务指标的财务状况和表现。  

    ### 约束条件:  
    - 仅使用工具提供的数据。  
    - 避免使用投机性语言;专注于可观察的数据和趋势。  
    - 如果任何工具无法提供数据,请在摘要中明确指出。  

    ### 输出格式:  
    用以下格式回复:  
    "stock": "<股票代码>",  
    "price_analysis": "<详细的股票价格趋势分析>",  
    "technical_analysis": "<所有技术指标的详细时间序列分析>",  
    "financial_analysis": "<来自财务指标的详细分析>",  
    "final Summary": "<基于以上分析的全面结论>",  
    "asked_question_answer": "<基于以上细节和分析的回答>"  

    确保你的回复客观、简洁且实用。"""  

    def fundamental_analyst(state: State):  
        messages = [  
            SystemMessage(content=FUNDAMENTAL_ANALYST_PROMPT.format(company=state['stock'])),  
        ]  + state['messages']  
        return {  
            'messages': llm_with_tool.invoke(messages)  
        }  

    graph_builder.add_node('fundamental_analyst', fundamental_analyst)  
    graph_builder.add_edge(START, 'fundamental_analyst')  

4.: 添加工具以进行绘制图表和编译

图构建器.add_node(ToolNode(工具节点))  
图构建器.add_conditional_edges('fundamental_analyst', 工具条件)  
图构建器.add_edge('工具', '基本分析师')  

图 = 图构建器编译生成()  

graph

5. 运行图:
events = graph.stream({'messages':[('user', '我该不该买这只股票?')],  
 'stock': 'TSLA',}, stream_mode='values')  
# 此处代码处理消息流,检查每条消息并格式化打印
for event in events:  
    if 'messages' in event:  
        event['messages'][-1].pretty_print()  # 格式化打印最后一条消息

示例输出

    {  
      "stock": "TSLA",  
      "价格分析": "最近TSLA的股价显示出波动性,波动较大。最近几周,股价从2024年11月18日的最高点361.53美元跌至最低点147.05美元。目前股价大约在352.56美元左右,显示出从近期低点强劲反弹。根据最近的高点,潜在的阻力位可能在360美元左右,而支撑位在大约320美元。",  
      "技术分析": "技术指标显示前景复杂多样。最近RSI上升至71,表明股票接近超买区域。随机震荡指标显示值为94,表明股票可能超买。同时,MACD上升至28,表明看涨势头。然而,需要注意的是,RSI和随机震荡指标的超买状况表明股票可能超买,这可能导致价格修正。",  
      "财务分析": "TSLA的财务指标表明相对于其收益,其估值较高,市盈率为108.09,市净率为16.17。公司的债务权益比为18.08,相对较低,表明资产负债表稳健。利润率13.08%,表明盈利能力良好。然而,高市盈率表明投资者对其未来增长有很高的预期。",  
      "final_summary": "总体而言,TSLA近期显示出强劲的价格反弹。技术指标表明股票可能超买,这可能导致价格修正。从财务角度看,虽然公司的债务水平可控,利润率合理,但高估值指标表明未来表现必须达到更高的预期。投资者在决定买入前应仔细权衡这些因素。",  
      "Asked_Question_Answer": "鉴于目前的超买指标和高估值,考虑在TSLA可能出现回调后再购买可能是明智的。"  
    }  
基于未来的改进方向

全能组合经理代理的概念纳入项目中是一个巨大的改进!在这一框架下,有多个专业团队协同工作,代理可以被显著增强和优化,涵盖广泛的领域,并提供全面的组合管理解决方案。

结论:

建立一个代理型财务分析师不仅是一个了解人工智能和财务分析的绝佳方式,也是一个创建强大、现实世界应用的跳板。试试看,动手试试吧,看看自动化的力量吧!

在 GitHub 上查看该项目的完整内容。把它 fork 下来,试试看,并告诉我你的想法!

你希望给这个项目加点什么功能?下面留言讨论一下吧!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消