
如何读懂ATLAS janus.py源码JANUS元层把群体加权变成涌现市场制度检测器【免费下载链接】atlas-gicATLAS by General Intelligence Capital — Self-improving AI trading agents using Karpathy-style autoresearch项目地址: https://gitcode.com/gh_mirrors/at/atlas-gicATLAS 是一个自进化 AI 交易系统25 个以上的 AI 交易代理每日辩论市场并用市场反馈持续改进自身提示词。其中的 janus.py 实现了位于所有代理群体之上的JANUS 元层它根据近期准确率对各 cohort不同训练区间的代理群体做动态加权而权重差本身还涌现成了一个市场制度Regime检测器。下面用新手友好的方式带你读懂这个不到 570 行的 Python 文件里的核心设计。 先搞懂背景JANUS 在 ATLAS 四层架构中的位置读懂 janus.py 之前先看一眼整体架构。ATLAS 是一个 4 层多智能体系统信号从宏观层逐层过滤最终由决策层执行层级角色说明Layer 1宏观10 个代理判断风险偏好RISK_ON / RISK_OFF / NEUTRALLayer 2行业台7 个代理在宏观背景下选出板块多空头Layer 3超级投资者4 个代理用不同投资哲学过滤标的Layer 4决策层4 个代理CRO 风险审查 → CIO 最终拍板架构图和逐层输出格式可以看 architecture/overview.md 与 architecture/layers.md。而 JANUS 站在这些群体之上。ATLAS 用不同的市场区间训练出不同的代理群体All Seasons / PRISM 方法详见 README.md 中的 All Seasons 一节比如18monthcohort 在 18 个月数据上训练10yearcohort 在更长历史上训练。不同 cohort 给出的建议可能互相矛盾——谁来裁判就是 JANUS。 第一步从 3 个类常量看懂设计意图打开 src/janus.py#L36-L40文件开头就藏着整个系统的设计哲学MIN_WEIGHT 0.2任何 cohort 的影响力不得低于 20%——永远保留少数派声音MAX_WEIGHT 0.8任何 cohort 不得独占 80% 以上话语权——防止某个群体一家独大ROLLING_WINDOW 30只用最近 30 天的表现打分数——只信近期战绩REGIME_THRESHOLD 0.15两组权重差超过 ±15% 才发出明确的制度信号。 新手读源码技巧先读常量和注释再读函数。ATLAS 的开发者把没有 cohort 会被彻底静音、也不会有一个 cohort 独裁这条风控原则直接写在了常量里这比任何文字文档都直白。初始化时src/janus.py#L42-L58所有 cohort 从平等权重各 1/2开始随后完全靠战绩说话——这就是涌现的前提没有人预先规定制度切换规则。⚖️ 第二步权重是如何算出来的三步走JANUS 每天跑一次的权重更新逻辑在update_weights()里src/janus.py#L241-L267可以拆成三步① 打两个分命中率 Sharpecalculate_cohort_metrics()src/janus.py#L162-L200回看最近 30 天的打分记录算出每个 cohort 的hit_rate预测方向正确的比例做多且涨了、做空且跌了就算命中sharpe按置信度加权的日收益的年化夏普比率。② 合成原始分数每个 cohort 的原始分 命中率与归一化 Sharpe 各占一半各 50%。③ Softmax 双边界约束_softmax_with_constraints()src/janus.py#L202-L239把原始分数通过 softmax 变成一组和为 1 的权重然后依次执行低于 0.2 的拉到 0.2 → 重新归一化 → 高于 0.8 的压到 0.8 → 再次归一化。 为什么用 softmax 而不是简单归一化softmax 是赢家通吃但有温度的平滑放大分数差距越大领先者权重升得越猛但永远不会让落后者归零。配合上下界形成一个能拉开差距、但不会消灭对手的动态天平。 第三步最妙的设计——权重差 涌现制度检测器真正让这篇源码出圈的是regime_signal()src/janus.py#L269-L289。它的判断逻辑只有一行核心比较短窗口 cohort 权重 − 长窗口 cohort 权重权重差含义输出信号短窗口显著占优 0.15市场出现了历史经验没覆盖过的新行为NOVEL_REGIME新奇制度长窗口显著占优 −0.15经典历史规律正在重演HISTORICAL_REGIME历史制度两者势均力敌无明确倾向MIXED混合为什么说它是涌现的因为开发者从未写过任何制度识别规则——没有 VIX 阈值、没有波动率过滤。它只是忠实地记录哪个 cohort 最近猜得对而市场变新了 vs 市场在重复历史这一区分从权重差中自己浮现出来。短窗口代理擅长捕捉当下长窗口代理擅长匹配历史模式谁近期更准谁就获得更高权重——这个差值天然就是制度仪表盘。 建议怎么融合争议标的与置信度惩罚blend_recommendations()src/janus.py#L291-L336按当前权重把各 cohort 的建议混成最终推荐单标的融合规则在_blend_ticker_recommendations()src/janus.py#L338-L421对每只股票把各 cohort 的多头意见和空头意见分开按权重 × 置信度求和哪边加权和更高最终方向就是哪边如果多空双方同时存在contested True用对方的一半加权和做惩罚压低最终置信度——分歧越大仓位越保守所有争议标的会被单独列进contested_tickers供人工或 CRO 重点审查。这一步的思想可以概括为一句话让群体吵架但按谁更靠谱决定听谁的话吵得越凶出手越轻。 每日循环一条命令跑完整流程run_daily()src/janus.py#L423-L471把整件事串成流水线加载打分结果 → 更新权重 → 融合建议 → 输出制度信号 → 落盘。产物有两份 JSON当日完整输出janus_daily.json和只保留摘要的滚动历史janus_history.json自动裁剪到最近 365 天方便后续画权重与制度随时间演变的曲线get_history()就是为此提供数据src/janus.py#L512-L531。文件末尾的main()src/janus.py#L534-L567还做了命令行入口支持用逗号分隔传入任意 cohort 组合。 读完这篇源码你能带走什么三条可复用的架构思想裁判层与选手层分离25 个交易代理负责猜JANUS 只负责按战绩分话语权。选手水平再高也需要一个只认近期战绩的裁判。边界约束比精确算法更重要0.2 / 0.8 的上下界让系统在灵活加权和防止独裁/消音之间取得了平衡——这是比 softmax 本身更值得抄的设计。监测涌现指标而不是硬编码规则与其写满什么时候算风格切换的 if-else不如先让系统按准确率加权再从权重分布里读出市场状态。制度检测器不是被写出来的是被权重动态养出来的。延伸阅读路径都在仓库内四层架构全景architecture/overview.md各层代理职责与输出格式architecture/layers.mdautoresearch 自改进循环与 Darwinian 权重architecture/autoresearch.md源码目录结构说明src/README.md18 个月回测的最终代理权重表results/summary.json回测过程日志样例results/autoresearch_log.json一个有趣的交叉印证在 results/summary.json 中CIO组合经理代理的 Darwinian 权重被压到了最低值 0.3——系统自己发现了组合管理才是瓶颈与 JANUS 元层的判断逻辑异曲同工权重会自己说出问题所在。这正是把群体加权做成元层之后ATLAS 最迷人的地方。【免费下载链接】atlas-gicATLAS by General Intelligence Capital — Self-improving AI trading agents using Karpathy-style autoresearch项目地址: https://gitcode.com/gh_mirrors/at/atlas-gic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考