| name | tradingagents-astock-multi-agent-framework |
| description | A-share multi-agent investment research framework with 7 AI analysts, bull/bear debate, and risk assessment adapted for Chinese stock market |
| triggers | ["analyze Chinese stock with AI agents","set up A-share trading analysis framework","run multi-agent stock research for A-shares","configure TradingAgents for Chinese market","analyze stock with 7 AI analysts","implement bull bear debate for stock analysis","use mootdx for A-share data","create trading decision pipeline with LLM agents"] |
TradingAgents-Astock Multi-Agent Framework
Skill by ara.so — AI Agent Skills collection.
Overview
TradingAgents-Astock is a multi-agent investment research framework specifically adapted for Chinese A-share markets. It orchestrates 7 specialized AI analyst agents that generate research reports, engage in bull/bear debates, perform risk assessment, and produce trading decisions. The framework handles A-share specific constraints (T+1 settlement, price limits, minimum lots) and uses free Chinese data sources (mootdx, EastMoney, Sina, THS) instead of Western APIs.
Key Features:
- 7 specialized analysts (Market, Social, News, Fundamentals, Policy, Hot Money, Lockup)
- Bull vs Bear research debate system
- 3-way risk assessment (Aggressive, Conservative, Neutral)
- A-share trading constraints (T+1, 涨跌停, minimum lots, ST rules)
- Dual LLM architecture (quick_think + deep_think)
- Web UI with real-time progress tracking
- Chinese output with English internal reasoning
Installation
git clone https://github.com/simonlin1212/tradingagents-astock.git
cd tradingagents-astock
pip install -e .
pip install -e ".[google]"
Configuration
LLM Provider Setup
Create a .env file in the project root with your chosen LLM provider:
MINIMAX_API_KEY=sk-your-key-here
DEEPSEEK_API_KEY=sk-your-key-here
ZHIPU_API_KEY=your-key-here
DASHSCOPE_API_KEY=sk-your-key-here
OPENAI_API_KEY=sk-your-key-here
ANTHROPIC_API_KEY=sk-ant-your-key-here
ANTHROPIC_AUTH_TOKEN=your-kimi-token
Graph Configuration Object
config = {
"llm_provider": "minimax",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
"output_language": "Chinese",
"backend_url": None,
"max_debate_rounds": 3,
"enable_policy_analyst": True,
"enable_hotmoney_analyst": True,
"enable_lockup_analyst": True,
}
Core API Usage
Basic Analysis
from tradingagents.graph.trading_graph import TradingAgentsGraph
config = {
"llm_provider": "minimax",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
"output_language": "Chinese",
}
ta = TradingAgentsGraph(debug=True, config=config)
final_state, decision = ta.propagate("688017", "2026-05-12")
print(f"Signal: {decision['signal']}")
print(f"Confidence: {decision['confidence']}")
print(f"Position: {decision['position_size']}")
print(f"Reasoning: {decision['reasoning']}")
Using DeepSeek
config = {
"llm_provider": "deepseek",
"deep_think_llm": "deepseek-chat",
"quick_think_llm": "deepseek-chat",
"output_language": "Chinese",
}
ta = TradingAgentsGraph(config=config)
final_state, decision = ta.propagate("600519", "2026-05-15")
Using Anthropic with Kimi Backend
config = {
"llm_provider": "anthropic",
"deep_think_llm": "claude-sonnet-4-6",
"quick_think_llm": "claude-sonnet-4-6",
"backend_url": "https://api.kimi.com/coding/",
"output_language": "Chinese",
}
ta = TradingAgentsGraph(config=config)
final_state, decision = ta.propagate("000001", "2026-05-20")
Accessing Individual Analyst Reports
final_state, decision = ta.propagate("688017", "2026-05-12")
market_report = final_state["market_analyst_report"]
social_report = final_state["social_analyst_report"]
news_report = final_state["news_analyst_report"]
fundamentals_report = final_state["fundamentals_analyst_report"]
policy_report = final_state["policy_analyst_report"]
hotmoney_report = final_state["hotmoney_analyst_report"]
lockup_report = final_state["lockup_analyst_report"]
bull_research = final_state["bull_researcher_report"]
bear_research = final_state["bear_researcher_report"]
risk_assessment = final_state["risk_assessment"]
trading_plan = final_state["trading_plan"]
CLI Commands
Interactive Mode
tradingagents
Direct Execution
tradingagents --stock 688017 --date 2026-05-12 --provider minimax
tradingagents --stock 600519 --date 2026-05-15 \
--provider deepseek \
--deep-model deepseek-chat \
--quick-model deepseek-chat
tradingagents --stock 000001 --date 2026-05-20 --debug
Web UI
tradingagents-web
streamlit run web/app.py
Data Source Integration
Available Data Tools
The framework provides these tools to analysts (all free, no API keys needed):
get_stock_data(ticker, start_date, end_date)
get_indicators(ticker, start_date, end_date)
get_fundamentals(ticker)
get_balance_sheet(ticker)
get_cashflow(ticker)
get_income_statement(ticker)
get_news(ticker, start_date, end_date)
get_global_news(start_date, end_date)
get_insider_transactions(ticker)
Data Provider Mapping
| Data Type | Provider | Protocol |
|---|
| OHLCV K-lines | mootdx | TCP 7709 |
| PE/PB/Market Cap | Tencent Finance | HTTP |
| Dragon-Tiger List | EastMoney | HTTP |
| Lockup Schedule | EastMoney | HTTP |
| Financial Statements | Sina Finance | HTTP |
| EPS Consensus | THS (10jqka) | HTTP |
| News Feed | CLS.cn | HTTP |
| Sector Classification | Baidu Finance | HTTP |
Agent Pipeline Architecture
12-Stage Execution Flow
stages = [
"market_analyst",
"social_analyst",
"news_analyst",
"fundamentals_analyst",
"policy_analyst",
"hotmoney_analyst",
"lockup_analyst",
]
Custom Analyst Configuration
config = {
"llm_provider": "minimax",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
"output_language": "Chinese",
"enable_policy_analyst": False,
"enable_hotmoney_analyst": False,
"enable_lockup_analyst": False,
}
ta = TradingAgentsGraph(config=config)
A-Share Trading Constraints
The framework automatically applies A-share market rules:
These constraints are built into the Trader agent's decision logic.
Common Patterns
Batch Analysis
from tradingagents.graph.trading_graph import TradingAgentsGraph
from datetime import datetime, timedelta
config = {
"llm_provider": "minimax",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
"output_language": "Chinese",
}
ta = TradingAgentsGraph(config=config)
stocks = ["600519", "000858", "600036", "601318"]
date = "2026-05-15"
results = {}
for ticker in stocks:
try:
final_state, decision = ta.propagate(ticker, date)
results[ticker] = decision
print(f"{ticker}: {decision['signal']} (confidence: {decision['confidence']})")
except Exception as e:
print(f"Error analyzing {ticker}: {e}")
continue
Time Series Analysis
from datetime import datetime, timedelta
ta = TradingAgentsGraph(config=config)
ticker = "688017"
base_date = datetime(2026, 5, 10)
signals = []
for i in range(5):
analysis_date = (base_date + timedelta(days=i)).strftime("%Y-%m-%d")
try:
final_state, decision = ta.propagate(ticker, analysis_date)
signals.append({
"date": analysis_date,
"signal": decision["signal"],
"confidence": decision["confidence"],
})
except Exception as e:
print(f"Error on {analysis_date}: {e}")
continue
print(f"Signal history for {ticker}:")
for s in signals:
print(f"{s['date']}: {s['signal']} ({s['confidence']}%)")
Custom LLM Backend
config = {
"llm_provider": "ollama",
"deep_think_llm": "qwen2.5:32b",
"quick_think_llm": "qwen2.5:14b",
"backend_url": "http://localhost:11434",
"output_language": "Chinese",
}
ta = TradingAgentsGraph(config=config)
final_state, decision = ta.propagate("600519", "2026-05-15")
Extracting Structured Data
final_state, decision = ta.propagate("688017", "2026-05-12")
def extract_pe_ratio(fundamentals_report):
import re
match = re.search(r'PE.*?(\d+\.\d+)', fundamentals_report)
return float(match.group(1)) if match else None
def extract_lockup_events(lockup_report):
events = []
lines = lockup_report.split('\n')
for line in lines:
if '解禁' in line:
events.append(line.strip())
return events
pe_ratio = extract_pe_ratio(final_state["fundamentals_analyst_report"])
lockup_events = extract_lockup_events(final_state["lockup_analyst_report"])
print(f"PE Ratio: {pe_ratio}")
print(f"Upcoming lockups: {lockup_events}")
Troubleshooting
API Key Issues
import os
from dotenv import load_dotenv
load_dotenv()
print(f"MINIMAX_API_KEY exists: {bool(os.getenv('MINIMAX_API_KEY'))}")
config = {
"llm_provider": "minimax",
"api_key": "sk-your-key-here",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
}
Data Source Failures
from tradingagents.tools.astock_tools import get_stock_data
try:
data = get_stock_data("688017", "2026-04-01", "2026-05-01")
print(f"Successfully fetched {len(data)} rows")
except Exception as e:
print(f"Data fetch failed: {e}")
Invalid Stock Code
import re
def validate_astock_ticker(ticker):
pattern = r'^(600|601|603|688|000|001|002|003|300)\d{3}$'
return bool(re.match(pattern, ticker))
ticker = "688017"
if not validate_astock_ticker(ticker):
print(f"Invalid ticker: {ticker}")
Rate Limiting
import time
ta = TradingAgentsGraph(config=config)
tickers = ["600519", "000858", "600036"]
for ticker in tickers:
final_state, decision = ta.propagate(ticker, "2026-05-15")
print(f"{ticker}: {decision['signal']}")
time.sleep(5)
Debug Mode
ta = TradingAgentsGraph(debug=True, config=config)
final_state, decision = ta.propagate("688017", "2026-05-12")
print("Market Analyst Report:")
print(final_state["market_analyst_report"])
print("\nBull Research:")
print(final_state["bull_researcher_report"])
print("\nBear Research:")
print(final_state["bear_researcher_report"])
LLM Response Parsing Errors
config = {
"llm_provider": "minimax",
"deep_think_llm": "MiniMax-M2.7",
"quick_think_llm": "MiniMax-M2.7-highspeed",
"max_retries": 3,
"temperature": 0.7,
}
ta = TradingAgentsGraph(config=config)
Project Structure
tradingagents-astock/
├── tradingagents/
│ ├── graph/
│ │ ├── trading_graph.py # Main TradingAgentsGraph class
│ │ └── nodes.py # Individual agent node implementations
│ ├── tools/
│ │ ├── astock_tools.py # A-share data fetching tools
│ │ └── tool_registry.py # Tool registration system
│ ├── llm/
│ │ ├── llm_factory.py # LLM provider abstraction
│ │ └── providers/ # Provider-specific implementations
│ └── agents/
│ ├── analysts/ # 7 analyst agent prompts
│ ├── researchers/ # Bull/Bear researchers
│ ├── risk/ # 3 risk debaters
│ └── portfolio_manager/ # Final decision maker
├── web/
│ └── app.py # Streamlit UI
├── .env.example # Environment variable template
└── README.md
Best Practices
- Always use environment variables for API keys
- Start with debug=True to understand the pipeline
- Use MiniMax or DeepSeek for cost-effective China-based inference
- Check data availability before running batch analyses (market holidays, weekends)
- Monitor LLM costs — each analysis requires 30-50 API calls
- Validate stock codes before passing to
propagate()
- Set appropriate
max_debate_rounds — more rounds = higher cost but potentially better decisions
- Use quick_think_llm for analysts and researchers, reserve deep_think_llm for final decisions