Added macro economic analyst - 2

This commit is contained in:
bastien.migette 2025-10-06 12:15:22 +02:00
parent 0708fd20a9
commit 6da48b66dd
7 changed files with 293 additions and 7 deletions

View File

@ -1,7 +1,7 @@
# FRED API Macro Data Integration
## Summary
Added FRED (Federal Reserve Economic Data) API support to the TradingAgents vendor methods system for macroeconomic analysis.
Added FRED (Federal Reserve Economic Data) API support to the TradingAgents vendor methods system for macroeconomic analysis, including a new **Macro Analyst** agent.
## Files Added
@ -24,9 +24,22 @@ New module providing FRED API integration with the following functions:
- **`get_fed_calendar_and_minutes(curr_date)`** - Federal Reserve meeting calendar and policy updates
- **`get_macro_economic_summary(curr_date, lookback_days=90)`** - Complete macro economic analysis combining all components
### 2. `tradingagents/agents/analysts/macro_analyst.py`
New macro analyst agent that uses FRED API tools to analyze economic conditions:
- Analyzes Federal Reserve policy and economic indicators
- Evaluates inflation, employment, and growth trends
- Assesses Treasury yield curve and recession signals
- Provides market implications and trading considerations
### 3. `tradingagents/agents/utils/macro_data_tools.py`
Tool wrapper functions for LangChain integration:
- **`get_economic_indicators(curr_date, lookback_days)`** - Comprehensive economic indicators
- **`get_yield_curve(curr_date)`** - Treasury yield curve with inversion analysis
- **`get_fed_calendar(curr_date)`** - Fed meeting calendar and policy updates
## Files Modified
### 2. `tradingagents/dataflows/interface.py`
### 4. `tradingagents/dataflows/interface.py`
Updated vendor routing system to include FRED macro data:
**Added Imports:**
@ -71,6 +84,76 @@ VENDOR_LIST = [
},
```
### 5. `tradingagents/agents/__init__.py`
Added macro analyst to exports:
```python
from .analysts.macro_analyst import create_macro_analyst
__all__ = [
# ... existing exports ...
"create_macro_analyst",
]
```
### 6. `tradingagents/agents/utils/agent_utils.py`
Added macro tool imports:
```python
from tradingagents.agents.utils.macro_data_tools import (
get_economic_indicators,
get_yield_curve,
get_fed_calendar
)
```
### 7. `tradingagents/graph/setup.py`
Added macro analyst option to graph setup:
```python
def setup_graph(
self, selected_analysts=["market", "social", "news", "fundamentals"]
):
"""Set up and compile the agent workflow graph.
Args:
selected_analysts (list): List of analyst types to include. Options are:
- "market": Market analyst
- "social": Social media analyst
- "news": News analyst
- "fundamentals": Fundamentals analyst
- "macro": Macro economic analyst # New!
"""
# ... existing analyst setup ...
if "macro" in selected_analysts:
analyst_nodes["macro"] = create_macro_analyst(
self.quick_thinking_llm
)
delete_nodes["macro"] = create_msg_delete()
tool_nodes["macro"] = self.tool_nodes["macro"]
```
### 8. `tradingagents/graph/trading_graph.py`
Added macro tools import and tool node:
```python
from tradingagents.agents.utils.agent_utils import (
# ... existing imports ...
get_economic_indicators,
get_yield_curve,
get_fed_calendar
)
def _create_tool_nodes(self) -> Dict[str, ToolNode]:
return {
# ... existing tool nodes ...
"macro": ToolNode(
[
get_economic_indicators,
get_yield_curve,
get_fed_calendar,
]
),
}
```
## Configuration Required
To use FRED API features, set the FRED API key via:
@ -92,6 +175,22 @@ To use FRED API features, set the FRED API key via:
## Usage Examples
### Enable Macro Analyst in Graph
```python
from tradingagents.graph.trading_graph import TradingAgentsGraph
# Create graph with macro analyst enabled
graph = TradingAgentsGraph(
selected_analysts=["market", "fundamentals", "macro"], # Include "macro"
debug=True,
config=your_config
)
# Run analysis
result = graph.propagate("AAPL", "2025-10-06")
```
### Via Vendor Routing System
```python
@ -165,11 +264,12 @@ All functions return formatted markdown strings suitable for LLM analysis:
Changes were made with minimal modifications to existing code:
1. ✅ **New file only** - `macro_utils.py` is a new addition
2. ✅ **Additive changes** - Only added new entries to existing dictionaries
1. ✅ **New files only** - `macro_utils.py`, `macro_analyst.py`, `macro_data_tools.py` are new additions
2. ✅ **Additive changes** - Only added new entries to existing dictionaries and imports
3. ✅ **No breaking changes** - Existing functionality unchanged
4. ✅ **Follows existing patterns** - Uses same vendor routing architecture as other data sources
5. ✅ **Consistent naming** - Follows existing naming conventions (`get_*` pattern)
4. ✅ **Follows existing patterns** - Uses same vendor routing and analyst architecture
5. ✅ **Consistent naming** - Follows existing naming conventions (`get_*`, `create_*_analyst` patterns)
6. ✅ **Optional feature** - Macro analyst is opt-in via `selected_analysts` parameter
## Testing

View File

@ -6,6 +6,7 @@ from .analysts.fundamentals_analyst import create_fundamentals_analyst
from .analysts.market_analyst import create_market_analyst
from .analysts.news_analyst import create_news_analyst
from .analysts.social_media_analyst import create_social_media_analyst
from .analysts.macro_analyst import create_macro_analyst
from .researchers.bear_researcher import create_bear_researcher
from .researchers.bull_researcher import create_bull_researcher
@ -29,6 +30,7 @@ __all__ = [
"create_bull_researcher",
"create_research_manager",
"create_fundamentals_analyst",
"create_macro_analyst",
"create_market_analyst",
"create_neutral_debator",
"create_news_analyst",

View File

@ -0,0 +1,78 @@
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import time
import json
from tradingagents.agents.utils.agent_utils import get_economic_indicators, get_yield_curve, get_fed_calendar
from tradingagents.dataflows.config import get_config
def create_macro_analyst(llm):
def macro_analyst_node(state):
current_date = state["trade_date"]
ticker = state["company_of_interest"]
company_name = state["company_of_interest"]
tools = [
get_economic_indicators,
get_yield_curve,
get_fed_calendar,
]
system_message = (
"You are a macro economic analyst tasked with analyzing Federal Reserve data, economic indicators, and macroeconomic trends. "
"Your objective is to write a comprehensive report detailing current economic conditions, monetary policy implications, and their impact on financial markets. "
"Analyze key indicators such as:\n"
"- Federal Funds Rate and monetary policy trajectory\n"
"- Inflation indicators (CPI, PPI)\n"
"- Employment data (unemployment rate, payrolls)\n"
"- Treasury yield curve and inversion signals\n"
"- Economic growth indicators (GDP, PMI)\n"
"- Market volatility (VIX)\n\n"
"Provide detailed analysis of:\n"
"1. Current economic cycle positioning\n"
"2. Federal Reserve policy stance and likely direction\n"
"3. Inflation and employment trends\n"
"4. Yield curve implications for recession risk\n"
"5. Market implications and trading considerations\n\n"
"Use the available tools: `get_economic_indicators` for comprehensive economic data, "
"`get_yield_curve` for Treasury yields and inversion analysis, and `get_fed_calendar` for FOMC schedule and policy trajectory. "
"Make sure to provide detailed, actionable insights rather than generic summaries. "
"Append a Markdown table at the end summarizing key macro indicators and their implications."
)
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful AI assistant, collaborating with other assistants."
" Use the provided tools to progress towards answering the question."
" If you are unable to fully answer, that's OK; another assistant with different tools"
" will help where you left off. Execute what you can to make progress."
" If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable,"
" prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop."
" You have access to the following tools: {tool_names}.\n{system_message}"
"For your reference, the current date is {current_date}. The company we want to look at is {ticker}",
),
MessagesPlaceholder(variable_name="messages"),
]
)
prompt = prompt.partial(system_message=system_message)
prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools]))
prompt = prompt.partial(current_date=current_date)
prompt = prompt.partial(ticker=ticker)
chain = prompt | llm.bind_tools(tools)
result = chain.invoke(state["messages"])
report = ""
if len(result.tool_calls) == 0:
report = result.content
return {
"messages": [result],
"macro_report": report,
}
return macro_analyst_node

View File

@ -19,6 +19,11 @@ from tradingagents.agents.utils.news_data_tools import (
get_insider_transactions,
get_global_news
)
from tradingagents.agents.utils.macro_data_tools import (
get_economic_indicators,
get_yield_curve,
get_fed_calendar
)
def create_msg_delete():
def delete_messages(state):

View File

@ -0,0 +1,82 @@
from typing import Annotated
from langchain_core.tools import tool
@tool
def get_economic_indicators(
curr_date: Annotated[str, "Current date in yyyy-mm-dd format"],
lookback_days: Annotated[int, "How many days to look back for data"] = 90,
):
"""
Retrieve comprehensive economic indicators report from FRED including:
- Federal Funds Rate
- Consumer Price Index (CPI) and Producer Price Index (PPI)
- Unemployment Rate and Nonfarm Payrolls
- GDP Growth Rate
- ISM Manufacturing PMI
- Consumer Confidence
- VIX (Market Volatility)
Args:
curr_date (str): Current date in yyyy-mm-dd format
lookback_days (int): How many days to look back for data
Returns:
str: Comprehensive economic indicators report with analysis
"""
from tradingagents.dataflows.interface import route_to_vendor
result = route_to_vendor(
"get_economic_indicators",
curr_date=curr_date,
lookback_days=lookback_days
)
return str(result)
@tool
def get_yield_curve(
curr_date: Annotated[str, "Current date in yyyy-mm-dd format"],
):
"""
Retrieve US Treasury yield curve data from FRED with inversion analysis.
Includes yields for 1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, and 30Y maturities.
Provides 2Y-10Y spread analysis and yield curve interpretation.
Args:
curr_date (str): Current date in yyyy-mm-dd format
Returns:
str: Treasury yield curve data with analysis and recession signals
"""
from tradingagents.dataflows.interface import route_to_vendor
result = route_to_vendor(
"get_yield_curve",
curr_date=curr_date
)
return str(result)
@tool
def get_fed_calendar(
curr_date: Annotated[str, "Current date in yyyy-mm-dd format"],
):
"""
Retrieve Federal Reserve meeting calendar and recent policy updates.
Includes FOMC meeting schedule, recent Fed Funds rate history,
and key policy considerations.
Args:
curr_date (str): Current date in yyyy-mm-dd format
Returns:
str: Fed calendar, meeting schedule, and policy trajectory
"""
from tradingagents.dataflows.interface import route_to_vendor
result = route_to_vendor(
"get_fed_calendar",
curr_date=curr_date
)
return str(result)

View File

@ -48,6 +48,7 @@ class GraphSetup:
- "social": Social media analyst
- "news": News analyst
- "fundamentals": Fundamentals analyst
- "macro": Macro economic analyst
"""
if len(selected_analysts) == 0:
raise ValueError("Trading Agents Graph Setup Error: no analysts selected!")
@ -85,6 +86,13 @@ class GraphSetup:
delete_nodes["fundamentals"] = create_msg_delete()
tool_nodes["fundamentals"] = self.tool_nodes["fundamentals"]
if "macro" in selected_analysts:
analyst_nodes["macro"] = create_macro_analyst(
self.quick_thinking_llm
)
delete_nodes["macro"] = create_msg_delete()
tool_nodes["macro"] = self.tool_nodes["macro"]
# Create researcher and manager nodes
bull_researcher_node = create_bull_researcher(
self.quick_thinking_llm, self.bull_memory

View File

@ -33,7 +33,10 @@ from tradingagents.agents.utils.agent_utils import (
get_news,
get_insider_sentiment,
get_insider_transactions,
get_global_news
get_global_news,
get_economic_indicators,
get_yield_curve,
get_fed_calendar
)
from .conditional_logic import ConditionalLogic
@ -155,6 +158,14 @@ class TradingAgentsGraph:
get_income_statement,
]
),
"macro": ToolNode(
[
# Macroeconomic analysis tools
get_economic_indicators,
get_yield_curve,
get_fed_calendar,
]
),
}
def propagate(self, company_name, trade_date):