最近在 Hacker News 上看到一个很有意思的帖子:Show HN: Delphi – Build your own AI trading agent in seconds。这个项目的思路是把大模型、市场数据、交易执行整合到一起,让开发者用很短的时间搭建一个属于自己的 AI 交易代理(trading agent)。和很多 Demo 项目不同,它不是只给一个聊天框让你问“明天买什么”,而是把“观察行情 → 模型推理 → 生成交易决策 → 执行订单”这条链路做成了可配置、可复用的框架。
我顺着这个方向做了一些研究和本地实验,并把从概念到实战的完整过程整理成这篇教程。读完你会理解 AI 交易代理的核心组成,能照着示例写一个最小可用版本,也能避开模型乱调用、接口限流、回测失真这些常见坑。
需要提醒一句:名字叫 Delphi 的项目不止一个。老牌的 Delphi 是 Embarcadero 出品的 Object Pascal 开发工具,很多热词里出现的“Delphi 10.4 读取 Excel”“Delphi 7 禁 U 盘”都是指它。而本文要讲的是 Hacker News 上这个专门用于构建 AI 交易代理的开源项目,它只是恰好也叫 Delphi。阅读时先把这个区分开。
1. 项目背景与核心概念
1.1 什么是 AI 交易代理
先看一个通俗解释。AI 交易代理是“一个能自己拿主意”的程序,它不像传统量化策略那样只执行你写死的买卖规则,而是借助大模型的推理能力,把市场行情、新闻、技术指标甚至宏观经济数据作为上下文,经过分析后输出一个交易动作。
它最典型的运行循环如下:
- 获取当前市场数据,比如 K 线、最新价、成交量。
- 读取用户设定的投资目标和风险偏好。
- 把上述信息交给大模型,要求模型输出一个结构化决策。
- 校验模型输出,确认动作合法后再提交到交易所。
- 记录决策理由、当时的持仓、当时的行情快照,方便复盘。
这已经不是一个简单的“策略回测脚本”,而是一个带有感知、推理、行动、反思能力的智能体(AI Agent)。
1.2 为什么这类项目值得关注
传统量化交易的门槛主要在两点:一是策略开发需要大量数学和代码功底,二是数据清洗、回测、实盘接入的工程链很长。而 AI 交易代理把门槛进一步降低,因为策略本身不再是一堆公式,而是可以用自然语言描述的“规则”。
例如,你可以把策略写成这样一句话:
当比特币 4 小时级别突破布林带中轨,且 RSI 大于 55 时,可以考虑做多; 如果价格跌破最近一个支撑位,则立即止损离场。Delphi 这类框架的作用,就是让这句话变成可执行的交易逻辑。大模型负责理解这句话,并基于实时行情做出当前时刻的判断。对个人开发者、量化初学者、搞 AI 应用开发的人来说,这是一个很好的学习切入点。
1.3 适用场景与目标读者
从项目标题里的 “in seconds” 可以看出,这个框架的定位是快速搭建。它比较适合以下场景:
| 场景 | 适合程度 | 说明 |
|---|---|---|
| 个人学习 LLM + 交易策略结合 | 高 | 用少量代码跑通完整链路 |
| 快速验证某个交易想法 | 高 | 用自然语言描述想法即可测试 |
| 短线/波段辅助决策 | 中 | 需要搭配严格风控,不能直接全自动 |
| 高频交易 | 低 | 大模型推理延迟高,不适合高频场景 |
| 生产环境大资金实盘 | 低 | 需要额外审计、熔断、合规设计 |
如果你是刚接触 AI Agent 的开发新手,或者已经有量化基础想试试大模型怎么辅助交易,这个项目值得研究。
2. AI 交易代理的系统构成
在动手写代码之前,需要先建立一个整体认知。一个可用的 AI 交易代理,通常由下面几个模块组成。
2.1 观察层:市场数据接入
观察层负责给 agent 提供“眼睛”。它从交易所 API、行情服务商或本地数据库获取数据,统一转换成 agent 可以理解的格式。
这里的关键不是“能拿到数据”,而是“拿到数据之后如何组织”。大模型对长文本的注意力有限,把 5000 根 K 线全部塞进提示词既不经济,效果也差。常见的做法是只提取最近几十根 K 线,再计算几个关键指标,如移动平均线、RSI、布林带、成交量变化。
2.2 推理层:大模型与工具调用
推理层是 agent 的“大脑”。它接收市场数据、用户指令和对话历史,输出决策。这一层大多是调用 OpenAI、Anthropic 或本地模型的 API。
为了不让模型“凭空猜测”,推理层通常配合工具调用(function calling / tool use)能力。比如模型可以请求调用get_price_data、calculate_rsi、place_order这些工具,然后根据工具返回结果继续推理。这样 agent 就不是一次性输出结论,而是能主动获取信息后再决定。
2.3 执行层:订单与仓位管理
执行层把模型输出的决策翻译成真实或模拟的订单。它必须处理几个关键问题:
- 订单方向:买入、卖出、持有。
- 订单类型:市价单、限价单。
- 仓位比例:用总资金的多少比例下单。
- 杠杆与保证金:如果交易合约,还要考虑杠杆倍数和强平价格。
安全起见,执行层最重要的职责是“校验”,而不是“执行”。模型分析能力再强,也可能突然输出一个不合理的仓位,所以执行层必须设置硬性上限。
2.4 记忆层:对话记忆与策略记忆
记忆层是 AI 交易代理比较容易忽视的部分。每次调用模型时,如果只把当前行情塞进上下文,模型就会“失忆”,看不到上一轮它自己给出的判断和理由。这会带来两个问题:
- 无法对之前的决策做复盘。
- 策略行为不稳定,同一个行情可能一会儿做多一会儿做空。
合理的做法是维护一个会话记忆,记录历史决策、当时的理由和最终结果。在下一轮推理时,将最近的几条决策作为参考。这就是一个轻量级的“交易日志系统”。
2.5 安全边界:风控模块
任何自动交易工具都不能少了风控。AI 交易代理的安全边界至少要覆盖:
- 单笔最大亏损比例。
- 总仓位上限和最大回撤限制。
- 不允许交易的时段或品种黑名单。
- 模型输出非法动作时的熔断处理。
如果风控模块不完善,AI 交易代理在模拟盘上跑得再好,都不能上实盘。这是建议中优先级最高的一条。
3. 环境准备与版本说明
由于这类 AI 项目迭代速度快,具体版本需要根据你实际 clone 的仓库来确认。下面以我实验时的常见环境为例,重点演示配置思路。
3.1 运行环境
- 操作系统:建议 Linux 或 macOS。Windows 也能运行,但部分原生库可能要多花时间解决依赖。
- Python:3.10 或更高。AI Agent 生态基本都逐步迁移到新版 Python。
- 包管理工具:pip、poetry 或 uv,任选其一。
- 开发工具:VS Code 或 PyCharm,配合 Python 插件即可。
3.2 模型 API
Delphi 这类框架通常支持多种大模型后端。常见的几类:
- OpenAI 兼容接口:包括 OpenAI 官方、Azure OpenAI,以及大量兼容 OpenAI 协议的开源模型服务。
- Anthropic Claude:部分框架通过 SDK 接入。
- 本地模型:通过 Ollama、vLLM、llama.cpp 启动本地模型,再暴露一个 OpenAI 兼容的 HTTP 接口。
建议没有特殊需求时,先使用 OpenAI 兼容接口。它生态最成熟,工具调用(function calling)支持得也最稳定。
3.3 数据源与交易端
在开发阶段,千万不要直接接真实资金账户。建议优先使用以下环境:
- 交易所模拟盘(Paper Trading):例如币安测试网、Alpaca Paper Trading。
- 本地回测数据:下载历史 K 线到本地 CSV 或 SQLite,反复测试策略。
- 实时行情专用接口:部分数据服务商提供免费等级的行情 API,注意限流。
下表是我建议的开发环境组合:
| 组件 | 开发阶段推荐 | 说明 |
|---|---|---|
| 大模型 | OpenAI 兼容 API 或本地模型 | 优先用小模型验证链路 |
| 行情数据 | 本地 CSV 或模拟盘数据 | 免费、稳定、不限流 |
| 交易执行 | 模拟盘接口 | 不会造成资金损失 |
| 存储 | SQLite | 单文件易备份,适合日志记录 |
4. 快速构建:实现自己的第一个 AI 交易代理
下面的示例按照“基于 Delphi 项目的一般实现思路”来写。由于开源项目 API 可能随时调整,具体类名和函数名请以仓库 README 为准。这里重点演示一个 AI 交易代理的完整搭建流程,你完全可以照搬到自己的项目中。
4.1 安装与初始化
假设你已经 clone 了项目到本地,并创建了虚拟环境。安装核心依赖的命令通常类似:
cd delphi python -m venv .venv source .venv/bin/activate pip install -r requirements.txt如果你的项目使用了 pyproject.toml,也可以使用:
pip install -e .这一步的作用是安装 agent 框架本身、模型 SDK、交易所 SDK、行情处理库等依赖。
4.2 配置文件:模型、数据源与风控
多数 agent 框架都会提供一个配置入口。下面是一份示例config.yaml,包含模型、数据源和风控三个部分:
model: provider: openai api_key_env: OPENAI_API_KEY model_name: gpt-4o-mini temperature: 0.2 max_tokens: 1024 data_source: type: binance_testnet symbol: BTCUSDT timeframe: 4h lookback_bars: 50 risk: max_position_pct: 0.1 max_single_loss_pct: 0.02 max_drawdown_pct: 0.1 allowed_actions: - buy - sell - hold memory: enabled: true max_history_entries: 20 storage: sqlite:///trading_logs.db配置里的“风控”部分尤其重要。max_position_pct表示单次开仓最多占用总资金的 10%,max_single_loss_pct表示单笔亏损超过 2% 就强制平仓。这些参数后续会直接传给执行层,充当硬性约束。
4.3 核心代码:创建并运行交易代理
下面用 Python 写一个最小示例。这个示例把配置加载、策略提示词和 agent 运行三部分串起来。
# 文件路径:examples/run_agent.py from delphi import TradingAgent from delphi.config import load_config def advice_prompt() -> str: """把用户的自然语言策略转成模型提示词。""" return """ 你是一个稳健的加密货币交易助手。请基于以下行情数据给出交易决策。 规则: 1. 只看当前数据,不要预测未来。 2. 如果趋势不明朗,输出 hold。 3. 任何买入建议都必须包含止损价。 4. 输出格式必须是 JSON:{"action": "buy/sell/hold", "position_pct": 0~0.1, "stop_loss": 价格, "reason": "理由"} 当前行情: {market_summary} """ def main(): config = load_config("config.yaml") agent = TradingAgent( config=config, system_prompt=advice_prompt(), ) # 运行一轮完整的观察-推理-决策-执行流程 result = agent.run_once() print("=== 决策结果 ===") print(f"动作: {result.action}") print(f"仓位: {result.position_pct}") print(f"止损: {result.stop_loss}") print(f"理由: {result.reason}") print(f"行情快照: {result.market_snapshot}") if __name__ == "__main__": main()这里需要特别说明agent.run_once()做了什么:
- 从
data_source拉取最新 K 线,计算技术指标。 - 把指标摘要填充进
system_prompt中的{market_summary}占位符。 - 调用大模型,得到 JSON 输出。
- 解析 JSON,通过风控校验。
- 在模拟盘提交订单,并记录日志。
4.4 运行与验证
在激活虚拟环境后,运行:
export OPENAI_API_KEY="你的API Key" python examples/run_agent.py预期输出类似:
=== 决策结果 === 动作: hold 仓位: 0 止损: 0 理由: 当前价格在布林带中轨附近,RSI 为 52,没有明确方向,不适合开仓。第一次跑通时,模型输出hold是很正常的。这表示链路是完整的,模型确实看到了行情,也按照规则给出了保守决策。
4.5 结果说明与首次迭代
当你看到类似输出时,说明你的第一个 AI 交易代理已经运行成功。此时我建议先不急着改策略,而是做三件事:
- 查看数据库里记录的决策日志,确认每一轮决策都有行情快照。
- 多运行几轮,观察不同行情下模型的决策是否稳定。
- 把模型输出和真实行情对比,判断模型的理解是否准确。
如果发现模型频繁乱买乱卖,优先检查提示词里是否把仓位上限写清楚,而不是先调温度参数。
5. 进阶:让 AI 交易代理更可靠
跑通一个最小 demo 之后,你会很快发现光靠一句提示词还不够。下面这几个方向是让 agent 真正可用的关键。
5.1 加入技术指标工具
如果你把 50 根 K 线原始数据全塞给模型,它很难看出趋势。更合理的做法是提供计算好的指标。例如给 agent 注册一个calculate_indicators工具:
from delphi.tools import tool @tool def calculate_indicators(df): """计算 RSI、MA20、布林带等指标。""" df["rsi"] = ta.rsi(df["close"], length=14) df["ma20"] = ta.sma(df["close"], length=20) df["bb_upper"], df["bb_middle"], df["bb_lower"] = ta.bbands( df["close"], length=20, std=2 ) return df[["close", "rsi", "ma20", "bb_upper", "bb_middle", "bb_lower"]]这样模型在决策时可以直接读取指标值,而不是自己计算或盲目猜测。自定义工具注册是 AI 交易代理最核心的扩展方式。
5.2 使用思考链改进决策
简单的一步式输出容易让模型“拍脑袋”。改进办法是让模型先输出思考过程,再输出决策。在提示词中加入类似要求:
请按以下顺序思考: 1. 当前趋势是多头还是空头? 2. 是否存在明显的支撑/阻力位? 3. 当前风险偏好是多少? 4. 综合以上分析,给出最终决策。这里要注意,思考过程不要被直接当作指令执行。实际项目中,最好把“日常分析”和“最终下单”分开调用模型,避免提示词注入导致的乱操作。
5.3 仓位管理与止损策略
AI 交易代理最常见的风险是模型某个时刻输出一个过大的仓位。即便有max_position_pct参数兜底,也需要在策略层面加入渐进式仓位管理。比如:
- 首次开仓不超过总资金的 5%。
- 浮盈超过一定比例后,再逐步加仓。
- 单笔亏损达到 2% 强制止损,且当天不再开仓。
- 下午之后不开启新交易,只处理平仓。
这些规则不需要交给大模型,直接用代码执行会更可靠。大模型负责“判断方向”,代码负责“控制风险”。
5.4 多时间周期分析
很多策略只盯一个时间周期,容易在震荡行情中频繁进出。可以让 agent 同时分析 15 分钟、1 小时、4 小时的行情摘要,再综合判断:
15分钟:短期动能向上,但接近超买区。 1小时:价格在布林带中轨上方,偏多。 4小时:仍在上升通道内,但成交量萎缩。这种多周期视角能让模型给出的决策更稳健,也更容易生成“等待回调再入场”这类合理建议。
6. 常见问题与排查思路
在搭建和运行 AI 交易代理的过程中,下面几个问题出现频率最高。我整理了现象、原因和解决思路,方便你对照排查。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 启动时报 API Key 为空 | 环境变量未正确设置 | 检查终端是否执行 export,或改用 .env 文件加载 |
| 模型返回内容无法解析为 JSON | 提示词格式约束不够强,或 max_tokens 太短 | 增加 JSON 示例输出,调大 max_tokens |
| 代理从不交易,一直输出 hold | 提示词过于保守,或行情数据为空 | 检查数据源拉取是否成功,降低模型温度 |
| 代理频繁买卖,手续费吃掉收益 | 缺少过滤条件,模型对噪音过于敏感 | 增加多周期确认条件,禁止仓位为 0 时连续操作 |
| 模拟盘连接失败 | 接口地址或 API Key 配置错误 | 检查模拟盘 endpoint,确认配置处于 testnet 模式 |
| 模型响应速度太慢 | 使用大模型且输入过长 | 压缩行情数据,使用更小模型,开启流式输出 |
| 实际成交价和模型决策价差异大 | 涨跌幅过快或使用市价单 | 改用限价单,或增加滑点估算 |
6.1 模型不遵守输出格式
这是最常遇到的问题。解决办法是“给例子,而不是给描述”。在提示词中直接放一个具体的 JSON 示例:
{ "action": "buy", "position_pct": 0.05, "stop_loss": 51000, "reason": "价格突破20日均线,RSI从超卖区回升,短期动能偏多。" }模型看到具体例子后,输出格式的稳定性会明显提升。如果还是偶发解析失败,可以在解析层做一次兜底重试。
6.2 回测与模拟盘结果差异大
很多人在本地回测表现很好,一上模拟盘就亏损。根本原因通常是回测时忽略了手续费、滑点和成交延迟。AI 交易代理在模拟盘阶段还多一个变量:模型输出的不确定性。
排查时建议把每一轮决策的“模型理由”和当时的行情快照一起录下来,观察模型是否真的依据数据做判断,还是只是随机喊单。
6.3 模型成本失控
如果 agent 频繁调用大模型,每月账单可能很可观。一个常见优化方案是先本地计算硬指标,只把“已经整理好的结论”发给模型。例如先用代码判断:
- 价格是否高于 MA20?
- RSI 是否大于 60?
- 今日成交量是否放大?
只有这些条件满足时才发起模型调用,这样既省成本,又避免模型处理无意义数据。
7. 最佳实践与工程建议
无论你用的是 Delphi 项目,还是自己造的轮子,下面这些都是值得长期坚持的工程实践。
7.1 先跑模拟盘,再考虑实盘
AI 交易代理存在明显的“黑盒性”,你无法完全预测模型在极端行情下会做什么。因此一定要先在模拟盘上运行足够长的时间,建议至少覆盖一轮完整的震荡和趋势行情。模拟盘没有资金压力,但成交机制更接近真实环境,是检验策略的第一步。
7.2 把风控写成代码,而不是写进提示词
提示词里的规则是“软约束”,模型可能因为各种原因不遵守。风控应该写在与模型无关的执行层里。例如,开仓前必须检查:
def check_risk(action, position_pct, stop_loss, balance): if action not in ["buy", "sell", "hold"]: return False if position_pct > 0.1: return False if action == "buy" and stop_loss <= 0: return False if position_pct * balance < 10: # 最少下单金额 return False return True只有通过检查的订单才会被发送到交易接口。这条建议能拦住大多数“模型抽风”的情况。
7.3 保留完整的决策日志
每一轮决策都应当记录:
- 当前时间。
- 行情快照与技术指标。
- 模型原始输出和解析后的动作。
- 最终成交结果。
- 决策理由摘要。
- 手续费和滑点。
这些日志不仅用于复盘,还能在模型“事后解释”时提供依据。SQLite 足够用,不需要一开始就上重型数据库。
7.4 用最小化模型验证链路
初学阶段不要一上来就使用顶级大模型,成本高且故障排查困难。先用gpt-4o-mini或本地小模型跑通全链路,再逐步替换为更强模型。这样能快速区分问题是“链路问题”还是“模型能力问题”。
7.5 注意合规与平台条款
不同国家和地区对自动交易有不同的监管要求,交易所平台对 API 下单也有使用条款限制。开发和测试时,务必使用模拟盘或虚拟资产。如果要进行实盘交易,必须先确认所在地区的合法性,并严格控制资金规模。任何自动交易系统都应该允许随时手动接管,避免完全无人值守。
8. 总结与学习路线
通过本文,你已经理解了一个 AI 交易代理的基本架构:观察层负责行情数据,推理层由大模型驱动,执行层负责下单,记忆层记录决策,风控模块提供安全边界。你也动手搭建了一个最小可运行的代理,知道怎么配置模型和数据源,也了解到模型不遵守格式、回测失真、成本失控这些高频问题的排查思路。
接下来,如果你想继续深入,可以考虑这些方向:
- 阅读 Delphi 项目源码,理解 agent 循环和工具注册机制。
- 给 agent 增加更多工具,比如新闻情绪分析、链上数据查询。
- 尝试接入不同数据源,对比不同市场下 agent 的表现。
- 学习回测框架,把策略历史表现量化出来。
- 研究多智能体协作,比如“分析 agent 负责研究,执行 agent 负责下单”。
最后再次提醒:AI 交易代理的本质是一个“辅助决策工具”,它不保证盈利。千万不要因为模拟盘表现好就直接上大资金实盘。先把模拟盘跑通,把日志和风控做扎实,再逐步、小规模地放到真实环境验证。交易有风险,入场需谨慎。