返回项目列表
自主交易

Trader Joe

Judgment, Oversight & Execution

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

分享这篇案例 →
5
领域专家
APScheduler over five roles
编排方式
2
LLM家族
难点所在

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

架构一览
已上线
截至 2026-07-31
ReAct orchestrator over domain experts — built, shadow-only, never promoted to liveConfig-driven LLM & agent configExternalized prompt storeVersioned reasoning-trace store — built, not yet wired to a live roleA2A protocol peer — portfolio_summary, runtime_scope and signal_feedback liveDirect/A2A provider parity verification before cutoverCommand-center portfolio-summary bridge for Wall Street
完整的内部 Agent 阵容
交接给交接给交接给可否决orchestratormarket_analysisstrategy_timingrisk_sizingexecutionreview
Agent

APScheduler-based; wakes each role on a market-driven schedule. This is the scheduler that actually runs the desk in production — distinct from the bounded ReAct orchestrator, which is built but has never been promoted past shadow mode.

TraderJoe 在生态系统中
技术栈

Python, Postgres, Alpaca, DeepSeek, Qwen, Video Factory LLM gateway

01五个agent,一张时间表

一个基于APScheduler的编排器按行情节奏唤醒每个agent。分析师在美东时间08:30用DeepSeek V4 Pro运行——重推理、每天一次——读隔夜新闻、宏观日历,还有自己过去的教训,写出盘前简报。交易员在09:10到15:50每20分钟运行一次,用DeepSeek V4 Flash——轻量,每天约21次调用——决定开平哪些仓位、多大仓位、止损设在哪。在任何有实质影响的开仓之前,一个挑战者角色会用quality档复核同一笔交易——推理规格刻意高于交易员用的fast档,而且是独立的一次调用、独立的一套提示词,不是同一次运行里顺手带出来的"第二意见"。跨模型家族的独立性是这里最初的设计意图,如今仍然只是改一行配置的事;今天两档都走同一个网关。挑战者可以否决这笔交易;如果它联系不上,系统会选择放行而不是冻结整个交易台。评估者在中午用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。

— 简历与联系方式

聊。