|
香港大学的AI-Trader项目进步太快了,一周就已经支持了A股市场上证50成分股和BITWISE10主流加密货币,可以让多个AI模型在真实市场环境中完全自主决策、同台竞技,并且是开源的,实时的交易系统。想象一下,让Deepseek、Claude、GPT、Qwen等顶尖AI模型各自带着10万元资金,在A股市场中独立交易,看谁能在零人工干预的情况下获得最佳收益。
什么是AI-Trader? AI-Trader是一个基于大语言模型的完全自主交易系统,其核心特点是: - 完全自主决策:AI代理100%独立分析、决策、执行,零人工干预
- 纯工具驱动架构:基于MCP工具链,AI通过标准化工具调用完成所有交易操作
- 多模型竞技场:部署多个AI模型进行竞争性交易
- 实时性能分析:完整的交易记录、持仓监控和盈亏分析
- 智能市场情报:集成Jina搜索,获取实时市场新闻和财务报告
AI-Trader 缺点 AI-Trader优点实在太明显了,这里主要分享几个缺点,仅为个人观点: - 黑盒决策:AI模型可能产生过度拟合特定历史数据的策略,模型决策过程的可解释性不足,难以进行人工干预
- 基本面为主:目前以Jina搜索的实时市场新闻和财务报告等基本面数据为主,缺乏对更多技术指标和量化因子的原生支持,可回测性不够,是否有未来函数,也无法判定
- 配置分散:基于MCP工具链,需要同时运行多个MCP服务,增加了部署和维护难度,配置过程繁琐,对非技术用户不够友好
三大市场支持 AI-Trader目前支持三个主要市场: - 美股市场:纳斯达克100成分股,初始资金$10,000
- A股市场:上证50成分股,初始资金¥100,000
- ₿ 加密货币市场:BITWISE10主流加密货币,初始资金50,000 USDT
核心创新:历史回放架构 AI-Trader的核心创新在于其完全可重放的交易环境,确保AI代理在历史市场数据上的性能评估具有科学严谨性和可重复性。系统通过严格的时间控制框架,防止AI访问未来信息,确保评估的公平性。 项目整体架构 AI-Trader Bench/
├── 核心系统
│ ├── main.py # 主程序入口
│ ├── agent/ # AI代理系统
│ └── configs/ # ⚙️ 配置文件
├── ️ MCP工具链
│ ├── agent_tools/ # 交易工具集
│ └── tools/ # 辅助工具
├── 数据系统
│ ├── data/ # 市场数据
│ └── calculate_performance.py # 性能分析
├── 提示词系统
│ └── prompts/ # 交易提示词
├── 前端界面
│ └── frontend/ # Web仪表板
└── 快速启动脚本
└── scripts/ # ️ 便捷启动脚本
核心组件详解 1. 主程序(main.py) 主程序是整个系统的调度中心,具有以下关键功能: - 多模型并发:同时运行多个AI模型进行交易
- 动态代理加载:基于配置文件自动加载对应的代理类型
- 配置管理:支持JSON配置文件和环境变量
- 日期管理:灵活的交易日历和日期范围设置
- 错误处理:完善的异常处理和重试机制
2. AI代理系统 AI-Trader提供了三种专用代理: [td]代理类型 | 适用市场 | 特点 | BaseAgent | 美股/A股通用 | 灵活的市场切换,可配置股票池 | BaseAgentAStock | A股专用 | 内置A股规则,上证50默认池,中文提示词 | BaseAgentCrypto | 加密货币专用 | BITWISE10加密货币池,USDT计价 |
A股代理的特殊优化: - 交易规则适配:自动应用A股特有的T+1交易制度
- 手数限制:遵循A股一手100股的交易规则
- 人民币计价:所有交易和持仓以人民币为单位
- 中文提示词:专门优化的中文交易提示词,提高决策质量
3. MCP工具链 MCP(Model Context Protocol)是AI-Trader的核心技术基础,提供了标准化的工具调用接口: [td]工具 | 功能 | 市场支持 | 交易工具 | 买入/卖出资产,持仓管理 | 美股/A股/加密货币 | 价格工具 | 实时和历史价格查询 | 美股/A股/加密货币 | 搜索工具 | 市场信息搜索 | 全球市场 | 数学工具 | 财务计算和分析 | 通用 |
工具链的关键特性: - 自动识别:根据股票代码后缀(.SH/.SZ)自动选择数据源
- 规则适配:自动应用对应市场的交易规则
- 统一接口:相同的API接口支持多市场交易
配置指南:从零开始的完整配置流程 环境要求 - Python 3.10+
- 必要的API密钥:
- OpenAI API密钥(用于AI模型)
- Alpha Vantage API密钥(用于美股数据)
- Jina AI API密钥(用于市场信息搜索)
- Tushare Token(用于A股市场数据)
安装步骤 1. 克隆项目 git clone https://github.com/HKUDS/AI-Trader.git
cd AI-Trader
2. 安装依赖 pip install -r requirements.txt
核心依赖包括: - langchain:AI应用开发框架
- langchain-openai:OpenAI模型集成
- langchain-mcp-adapters:MCP协议适配器
- fastmcp:MCP服务器框架
- tushare:A股数据获取
3. 环境配置 创建.env文件并配置以下变量: # AI模型API配置
OPENAI_API_BASE=https://your-openai-proxy.com/v1
OPENAI_API_KEY=your_openai_key
# 数据源配置
ALPHAADVANTAGE_API_KEY=your_alpha_vantage_key
JINA_API_KEY=your_jina_api_key
TUSHARE_TOKEN=your_tushare_token
# ⚙️ 系统配置
RUNTIME_ENV_PATH=./runtime_env.json
# 服务端口配置
MATH_HTTP_PORT=8000
SEARCH_HTTP_PORT=8001
TRADE_HTTP_PORT=8002
GETPRICE_HTTP_PORT=8003
# AI代理配置
AGENT_MAX_STEP=30
Tushare配置详解 对于A股交易,Tushare是获取数据的关键: - 注册Tushare账号:访问tushare.pro注册
- 获取Token:在个人中心获取API Token
- 积分要求:基础数据需要一定积分,可通过完成任务获取
运行实战:多市场交易的详细操作步骤 数据准备阶段 A股数据获取 # 进入A股数据目录
cd data/A_stock
# 获取上证50成分股数据
python get_daily_price_tushare.py
# 转换为JSONL格式
python merge_jsonl_tushare.py
数据获取流程详解: - 指数成分股获取:通过Tushare API获取上证50指数成分股
- 批量数据获取:考虑到API限制,系统自动分批获取数据
- 数据格式转换:将CSV格式转换为系统所需的JSONL格式
- 防未来信息泄露:对最新交易日只提供买入价,防止回测作弊
数据获取代码解析 def get_daily_price_a_stock(
index_code: str = "000016.SH",
daily_start_date: str = "20250101",
fallback_csv: Optional[Path] = None,
) -> Optional[pd.DataFrame]:
"""获取A股指数成分股的日线数据"""
# 设置Tushare Token
ts.set_token(token)
pro = ts.pro_api()
# 获取指数成分股
df = pro.index_weight(
index_code=index_code,
start_date=index_start_date,
end_date=index_end_date
)
# 批量获取日线数据(考虑6000条记录限制)
batch_days = calculate_batch_days(len(code_list))
# ... 批量处理逻辑
MCP服务启动 cd ./agent_tools
python start_mcp_services.py
这将启动四个关键服务: - 数学计算服务:端口8000
- 信息搜索服务:端口8001
- 交易执行服务:端口8002
- 价格查询服务:端口8003
AI交易启动 A股交易配置 创建configs/astock_config.json: {
"agent_type": "BaseAgentAStock",
"market": "cn",
"date_range": {
"init_date": "2025-10-01",
"end_date": "2025-10-29"
},
"models": [
{
"name": "claude-3.7-sonnet",
"basemodel": "claude-3-7-sonnet-20250219",
"signature": "claude-3.7-sonnet",
"enabled": true
},
{
"name": "qwen3-max",
"basemodel": "qwen3-max",
"signature": "qwen3-max",
"enabled": true
}
],
"agent_config": {
"max_steps": 30,
"max_retries": 3,
"base_delay": 1.0,
"initial_cash": 100000.0
},
"log_config": {
"log_path": "./data/agent_data_astock"
}
}
启动交易 # 启动A股交易
python main.py configs/astock_config.json
中国股票数据获取:Tushare API的完整应用 Tushare数据源优势 Tushare作为国内知名的金融数据平台,具有以下优势: - 数据全面性:覆盖A股、指数、基金、期货等全市场数据
- 数据准确性:数据来源于交易所官方,质量可靠
- API稳定性:提供稳定的RESTful API接口
- 更新及时性:交易日结束后及时更新数据
数据获取关键技术 1. 指数成分股获取 # 获取上证50成分股
df = pro.index_weight(
index_code="000016.SH",
start_date="20251001",
end_date="20251031"
)
返回数据包含: - con_code:成分股代码
- trade_date:交易日期
- weight:在指数中的权重
2. 日线数据获取 # 获取个股日线数据
df_batch = pro.daily(
ts_code="600036.SH,600519.SH", # 股票代码列表
start_date="20251001",
end_date="20251031"
)
返回的日线数据包含: - ts_code:股票代码
- trade_date:交易日期
- open:开盘价
- high:最高价
- low:最低价
- close:收盘价
- vol:成交量(手)
- amount:成交额(千元)
3. 数据批处理策略 由于Tushare API有单次请求6000条记录的限制,系统实现了智能批处理: def calculate_batch_days(num_stocks: int, max_records: int = 6000) -> int:
"""计算每批可以获取的天数"""
return max(1, max_records // num_stocks)
数据格式转换 获取的原始数据需要转换为系统统一的JSONL格式: def convert_a_stock_to_jsonl(csv_path, output_path, stock_name_csv):
"""将A股CSV数据转换为JSONL格式"""
# 读取CSV数据
df = pd.read_csv(csv_path)
# 按股票代码分组处理
grouped = df.groupby("ts_code")
for ts_code, group_df in grouped:
# 构建时间序列数据
time_series = {}
for _, row in group_df.iterrows():
date_formatted = f"{row['trade_date'][:4]}-{row['trade_date'][4:6]}-{row['trade_date'][6:]}"
time_series[date_formatted] = {
"1. buy price": str(row["open"]), # 开盘价作为买入价
"2. high": str(row["high"]), # 最高价
"3. low": str(row["low"]), # 最低价
"4. sell price": str(row["close"]), # 收盘价作为卖出价
"5. volume": str(int(row["vol"] * 100)) # 转换为股数
}
# 构建完整的JSON对象
json_obj = {
"Meta Data": {
"2. Symbol": ts_code,
"2.1. Name": stock_name, # 股票名称
"3. Last Refreshed": latest_date,
"5. Time Zone": "Asia/Shanghai",
},
"Time Series (Daily)": time_series
}
A股专用代理(BaseAgentAStock) class BaseAgentAStock(BaseAgent):
def __init__(self, model_name, **kwargs):
super().__init__(model_name, **kwargs)
self.market = "cn"# 固定为A股市场
self.stock_pool = self.load_sse_50_stocks() # 上证50成分股
def load_sse_50_stocks(self):
"""加载上证50成分股"""
# 从配置文件加载股票池
return sse_50_stocks
asyncdef trade(self, date):
"""A股专用交易逻辑"""
# 应用A股特定规则
# T+1限制检查
# 手数限制检查
await super().trade(date)
多模型竞技实现 系统支持同时运行多个AI模型: # 在配置文件中定义多个模型
"models": [
{
"name": "claude-3.7-sonnet",
"basemodel": "anthropic/claude-3.7-sonnet",
"signature": "claude-3.7-sonnet",
"enabled": true
},
{
"name": "qwen3-max",
"basemodel": "qwen3-max",
"signature": "qwen3-max",
"enabled": true
}
]
每个AI代理的交易决策流程: - 市场分析:获取当前市场状态和持仓情况
- 信息搜集:通过Jina搜索获取相关新闻和分析
- 策略制定:基于市场信息制定交易策略
- 风险评估:评估潜在风险和收益
- 交易执行:通过MCP工具执行买卖操作
- 记录更新:更新持仓和交易记录
MCP工具链:纯工具驱动的交易执行 MCP协议简介 MCP(Model Context Protocol),定义了AI模型与外部工具的标准交互协议。 核心工具实现 1. 交易工具(tool_trade.py) @mcp.tool()
asyncdef buy(symbol: str, amount: int) -> str:
"""买入股票"""
# 参数验证
if amount <= 0:
return"错误:买入数量必须大于0"
# 获取当前价格
current_price = await get_current_price(symbol)
# 计算总成本
total_cost = current_price * amount
# 检查资金是否足够
if total_cost > cash_balance:
returnf"错误:资金不足,需要{total_cost:.2f},当前资金{cash_balance:.2f}"
# 执行买入操作
# 更新持仓
# 记录交易
returnf"成功买入{amount}股{symbol},价格{current_price:.2f}"
2. 价格查询工具(tool_get_price_local.py) @mcp.tool()
asyncdef get_price_local(symbol: str, date: str = None) -> dict:
"""获取股票价格信息"""
# 自动识别市场类型
if symbol.endswith('.SH') or symbol.endswith('.SZ'):
market = 'cn'# A股市场
elif symbol in CRYPTO_SYMBOLS:
market = 'crypto'# 加密货币
else:
market = 'us'# 美股市场
# 根据市场类型获取价格数据
price_data = await get_price_from_database(symbol, date, market)
return {
"symbol": symbol,
"market": market,
"price": price_data.get('close'),
"open": price_data.get('open'),
"high": price_data.get('high'),
"low": price_data.get('low'),
"volume": price_data.get('volume'),
"date": date
}
3. 信息搜索工具(tool_jina_search.py) @mcp.tool()
async def get_information(query: str) -> str:
"""搜索市场相关信息"""
# 调用Jina AI搜索API
results = await jina_search(query)
# 过滤和整理搜索结果
filtered_results = filter_relevant_information(results)
return f"关于'{query}'的搜索结果:\n{filtered_results}"
性能指标 AI-Trader-main\tools\result_tools.py提供了全面的性能分析指标: - 累计收益率:从开始到结束的总收益率
- 年化收益率:折算为年化的收益率
- 夏普比率:风险调整后的收益指标
- 最大回撤:投资组合从峰值到谷底的最大跌幅
- 胜率:盈利交易占总交易次数的比例
- 盈亏比:平均盈利与平均亏损的比值
交易记录分析 系统记录详细的交易数据: {
"date": "2025-10-15",
"agent": "claude-3.7-sonnet",
"action": "buy",
"symbol": "600036.SH",
"amount": 100,
"price": 35.20,
"reason": "基于技术分析和基本面分析,认为该股票具有上涨潜力",
"positions": {
"600036.SH": 100,
"CASH": 96480.0
}
}
在这里插入图片描述扩展与定制:第三方策略集成指南 自定义AI代理 开发者可以轻松创建自定义AI代理: class TechnicalAnalysisAgent(BaseAgent):
"""技术分析专用代理"""
def __init__(self, model_name, **kwargs):
super().__init__(model_name, **kwargs)
self.technical_indicators = ['MACD', 'RSI', 'Bollinger Bands']
asyncdef analyze_technical(self, symbol):
"""技术分析"""
# 计算技术指标
indicators = await calculate_indicators(symbol, self.technical_indicators)
return indicators
asyncdef trade(self, date):
"""基于技术分析的交易决策"""
# 技术分析
analysis_results = await self.analyze_technical(self.stock_pool)
# 制定交易策略
trading_decisions = await self.formulate_strategy(analysis_results)
# 执行交易
await self.execute_trades(trading_decisions)
注册自定义代理 在main.py中注册新代理: AGENT_REGISTRY = {
"BaseAgent": {
"module": "agent.base_agent.base_agent",
"class": "BaseAgent"
},
"BaseAgentAStock": {
"module": "agent.base_agent_astock.base_agent_astock",
"class": "BaseAgentAStock"
},
"TechnicalAnalysisAgent": {
"module": "agent.custom.technical_agent",
"class": "TechnicalAnalysisAgent"
}
}
添加自定义工具 开发者还可以添加自定义MCP工具: @mcp.tool()
class TechnicalIndicatorTool:
"""技术指标计算工具"""
def __init__(self):
self.name = "technical_indicators"
asyncdef calculate_macd(self, symbol: str, period: int = 26) -> dict:
"""计算MACD指标"""
# MACD计算逻辑
return macd_data
asyncdef calculate_rsi(self, symbol: str, period: int = 14) -> float:
"""计算RSI指标"""
# RSI计算逻辑
return rsi_value
对于想要尝试AI交易的开发者和投资者,可以从模拟交易开始,逐步过渡到实盘,持续关注AI-Trader项目,这样的开源项目将大模型技术迅速平民化,为广大开发者和投资者提供了学习和实践的机会。未来已来,AI交易的时代正在开启。
|