返回项目列表
自主交易

Trader Joe

Judgment, Oversight & Execution

一个五角色AI团队,独立分析盘前新闻,在Alpaca上管理核心-卫星组合,每天收盘后对照SPY基准自我复盘。24/7跑在一台家用NAS上。

分享这篇案例 →
5
领域专家
ReAct over domain experts
编排方式
3
LLM家族
难点所在

难点在于:硬性风控写在模型改不了的代码里,还有一个自我提升循环——同一个错误反复出现之后,会从一条教训升级成写死在代码里的硬性拦截。

架构一览
已上线
截至 2026-07-14
ReAct orchestrator over domain expertsConfig-driven LLM & agent configExternalized prompt storeVersioned reasoning-trace storeA2A protocol peer (portfolio_summary, watchlist, investment_consult)Direct/A2A provider parity verification before cutoverCommand-center portfolio-summary bridge for Wall Street
完整的内部 Agent 阵容
交接给交接给交接给可否决orchestratormarket_analysisstrategy_timingrisk_sizingexecutionreview
Agent

APScheduler-based; wakes each expert on a market-driven schedule

TraderJoe 在生态系统中
技术栈

Python, Postgres, Alpaca, Claude, DeepSeek, Qwen

01五个agent,一张时间表

一个基于APScheduler的编排器按行情节奏唤醒每个agent。分析师在美东时间08:30用DeepSeek V4 Pro运行——重推理、每天一次——读隔夜新闻、宏观日历,还有自己过去的教训,写出盘前简报。交易员在09:10到15:50每20分钟运行一次,用DeepSeek V4 Flash——轻量,每天约21次调用——决定开平哪些仓位、多大仓位、止损设在哪。在任何有实质影响的开仓之前,一个挑战者角色会用Claude Opus复核同一笔交易——刻意选用和交易员的DeepSeek不同家族的模型,因为同一家族的"第二意见"往往会因为同样的理由认同自己第一次的错误判断。挑战者可以否决这笔交易;如果它联系不上,系统会选择放行而不是冻结整个交易台。评估者在中午用DeepSeek V4 Pro运行,重新审视每个持仓是否还符合当初的逻辑。复盘者在收盘时运行,驱动下面的自我提升循环。只有交易员能真正下单。

02纯函数核心,命令式外壳

每一个交易决策函数都是纯函数——零I/O、零副作用、完全可单测。52周高点动量信号(引用George & Hwang 2004年的研究)即便候选标的没通过筛选,也会返回全部诊断字段,从不做黑箱式拒绝。核心仓位的再平衡器同样是纯函数:没有I/O、没有LLM,只输出一份订单列表交给一层薄的包装函数去执行。实际效果是:大约90%的交易逻辑不需要连接真实券商就能单测,不需要mock,也没有测试时误下真实订单的风险。

03模型绕不过去的关卡

交易员是五个agent里工具集最丰富的一个,但无论模型怎么判断,都要受几道确定性关卡约束。一套冷却机制防止它在连续几轮里反复交易同一只股票——开仓后冷却120分钟,评估后未采取行动冷却40分钟,而且冷却时间只会延长、不会缩短。一个退出管理器给每笔平仓都打上标准化的原因标签,并把持仓超过48小时的标记为"逾期"——这是Triple Barrier方法里"时间屏障"的纯函数实现。在这两道关卡之上还有一个每日熔断:只要组合当天回撤达到或超过2%,当天就彻底停止开新仓,没有例外。如果分析师的盘前简报缺失或过期,交易员会硬性拦截新开仓,而不是蒙着眼交易——这是一条安全默认值,不是模型可以绕过去的建议。

04核心-卫星:两个agent,一个组合

投资组合被机械地拆成两个独立仓位。核心仓位(SPY/QQQ/VOO,占60%)用零LLM的drift-band再平衡——纯数学计算,只有偏离超过8%才下单。卫星仓位(主动,占40%)完全由LLM驱动,每20分钟通过DeepSeek V4 Flash自主决策。这个拆分保证了即便卫星agent的判断完全跑偏,60%的组合依然纹丝不动、紧跟大盘。资本保全是架构层面写进去的,不只是一条政策。

05当一条教训变成一条铁律

每个交易日收盘时,复盘者会计算盈亏归因、在多笔交易里找规律,把带日期和编号的教训写进一份日志文件——提交并推送到Gitea,不涉及向量数据库或RAG流水线,git历史本身就是记忆系统。大多数教训只是用来充实第二天早上的简报。但当同一个错误反复出现,它就会"升级":在多次记录到"20日均线以下开仓、结果亏损"之后,这条门槛不再只是一条要记住的笔记,而是变成了风控模块里一条写死的检查——把"我们发现这样做会出问题"闭环成了"代码从此不再允许这样做"。

技术栈

Python、Claude API、DeepSeek API、Alpaca、Finnhub、EDGAR、pgvector、APScheduler、Docker、自建Gitea Actions CI/CD。

— 简历与联系方式

聊。