Skip to content

About

项目二 · Execution-aware Alpha|给定盘口与目标仓位:这笔单该吃、该挂、挂哪里、分几笔 —— 一个会自我质疑的 agent 团队 + 可复跑决策日志(decision_hash)|Bitget AI Base Camp Hackathon S2 · AI Trading Desk「执行辅助」

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

项目二 · Execution-aware Alpha

给定当前盘口和想要的仓位:这笔单该吃单还是挂单?挂在哪个价?分几笔? —— 以及这笔单该不该做(agent 团队给理由与条件,风控官一票否决)。

状态:可独立运行 | 零第三方依赖 | 可公网部署 | 快照可核验 仓库:https://github.com/zz-0816/bitget-s2-execution-aware-alpha(public) 加入日期:2026-09-19(由项目一 tools/isolate_p2.py 隔离生成,此后独立演进)

⚠️ 参赛作品展示:本项目是做市型价差捕获,不是无风险套利;代币 ≠ 股权; 不代下单,输出的是理由与条件,非投资建议。


0. 30 秒上手

三种跑法,都不需要网络、不需要 API key、不需要 pip install:

python run_p2.py --selftest      # ① 全量自检(18 步,含 HTTP 冒烟 + 页面渲染冒烟 + 前端布局验收)
python run_p2.py --demo NVDA     # ② 命令行跑完整决策链(不用浏览器)
python run_p2.py                 # ③ 起网页 http://127.0.0.1:8788

要求 Python ≥ 3.11(代码用 datetime.UTC;实测 3.14.5rc1 / 3.12)。 零第三方依赖(纯标准库),所以没有"装不上依赖"这一类失败模式。

想让它跑在"实时模式"而不是"离线演示"(两者的差别只在数据年龄):

# 最省事:双击 启动数据同步.bat(同步 + 情绪采样,180 秒一轮;关掉窗口才停)
# 等价的两条命令(想自己控节奏时用):
python tools/sync_p1_samples.py --loop --interval-sec 240   # ① 同步项目一新样本(只写最近两天)
python tools/sentiment_sampler.py --loop --interval 300     # ② 情绪/资金费(项目一没在采这个)
python tools/sync_p1_samples.py --status                    # 看还差几分钟到实时

📌 判定规则(project2/agent_team.py::time_basis):data/spread/ 的最新时刻距今 ≤ 10 分钟 → wallclock 实时模式;超过就按数据自带时刻判(asof = 离线演示)。 所以"能不能当实时程序用"只取决于数据供给是否持续,代码一行都不用改。 ⚠️ 本项目自带的 tools/market_feed.py 虽然能取实时行情,但它只写 data/live/ (刻意不污染证据基座),而决策链不读那个目录 —— 挂着它不能解除离线模式。 实时模式下若某个输入停了,页面会弹红条("实时模式但输入已停")—— 那是真告警,别忽略。

⚠️ 启动数据同步.bat 刻意是"纯 ASCII 正文 + CRLF 行尾",中文提示一律由 Python 打印。 原因不是洁癖:cmd.exe 按本机代码页(简体中文 = 936)解码批处理文件,而 UTF-8 的汉字是 3 字节 vs GBK 的 2 字节 —— 配上裸 LF 行尾,行尾那个悬空字节会把换行一起吃掉、 把两行粘成一行(实测事故:echo 变成 ?echo、python tools\sentiment_sampler.py 只剩后半截 \sentiment_sampler.py)。tools/bat_lint.py 守住这条规矩(自检 ⑧附)。

接真实仓位是可选的第四步(要先完成一次 Bitget Agentic OAuth 授权, 授权后不需要你交 API key):

python tools/account_read.py --read         # 只读取数 -> data/account/
python tools/account_read.py --preflight    # 交易前置检查:余额 / 持仓 / 手续费率

见 §5 账户接入(只读)。

想直接给别人一个链接(提交硬门禁「可访问的提交材料」):

python run_p2.py --tunnel        # 起网页 + 临时公网链接(cloudflared,免账号)

评审期推荐用保活启动(进程崩了自己回来,公网地址固定落盘、随时可查):

# Windows:双击 启动Demo.bat(前台保活)/ 后台运行Demo.bat(关窗口也不停)
# 任意平台:
python tools/keep_alive.py            # 保活:本机服务 + 公网隧道
python tools/keep_alive.py --status   # 看状态(含**当前**公网地址)
python tools/keep_alive.py --stop     # 停止(连子进程树一起收)

⚠️ 临时隧道的域名每次重启都会变,所以"当前链接是什么"要以 data/run/public_url.txt(或 查看Demo状态.bat)为准,不要用旧截图里的地址。

完整的三条部署路线(临时隧道 / Render / Fly / Docker)与实测记录见 docs/43-公网可访问.md;保活的原理、边界与开机自启见 docs/44-长期运行与保活.md。

不配 LLM key 也能跑:事件判断会退化为确定性日历,并在输出里如实标注 「本次未使用 LLM」——不假装跑过。


1. 这是什么(一句话)

项目一回答「哪里有价差」;项目二回答「这一单怎么下、能不能下」。 核心不是又一个成本公式,而是一个会自我质疑的 agent 团队: 5 路独立分析 → 多空辩论 → 事件闸门 → 交易员出方案 → 风控官一票否决。 每一步都必须引用已实测的量,每一句结论都必须能被证伪, 而数字一律不由 LLM 生成(否则报告里每个数字都无法复跑)。

⚠️ 注意:本仓库不是项目一的一个子目录,而是一个独立项目: 自洽的入口、自洽的数据快照、自洽的自检、自洽的页面。 与项目一的关系是单向只读(见 §3)。

真账户只读接入(§5)只做两件事:① 把真实余额 / 持仓 / 手续费率读出来 (并如实区分"没有"与"读不到");② 做交易前置检查(费率是否还支持门槛 11.34 bp)。 不代下单、不碰资金 —— 授权用的 Agentic 账户本身不可提币。


2. 项目说明(手册 6 段结构,可直接填表)

📌 填表请直接用 docs/40-提交材料(填表照抄·项目二).md(按手册 6 段逐段成稿)。 下面是同一内容的压缩版,用于在本文件里快速看懂这个项目。

第 1 段 · 思路 跨场所价差只在平台「所内撮合」窗口具有零售可执行性,且收益来源是流动性补偿 (做市),不是价差收敛。但能算出"能不能赚",算不出"这一单该怎么下"。 本项目用一个会自我质疑的 agent 团队回答执行决策:5 路独立分析 → 多空辩论 → 交易员出方案 → 风控官一票否决。核心假设:执行决策的输入是多维、非结构化、 相互冲突的,因此需要多个独立视角分别取证,再由强制对抗的辩论层收敛; 但数字不能由 LLM 生成,否则报告里的每个数字都无法复跑。

第 2 段 · 目标用户 主用户=已经被"执行成本"吃过亏的泛散户/小资金主动交易者(单笔 1k–50k USD, 会在休市时段看行情),痛点是下单后发现点差+滑点+资金费把预期收益吃光, 不知道该挂还是该吃。次用户=已有多平台仓位、会写脚本的小型量化散户。

第 3 段 · 验证数据与关键指标 门槛 11.34 bp | P(两腿都成交)=0.70% vs P(只成交一腿)=24.9% | 旧口径分母错误导致 META 高估 12 倍、GOOGL 18 倍 | 3/9 个标的最优执行方式改变 | agent:stale_quotes 真实驱动了一次一票否决(python run_p2.py --demo META: 现货腿 182~192 分钟无成交 ≥ 30 分钟阈值 → reject)| 真实账户实测费率与假设逐项一致(永续 maker 2 / taker 6 bp、现货 rToken 5 / 5 bp, 见 §5.2)| 快照重放回测(docs/55,4.5 天窗口 / 292 笔信号):过门槛信号在 in_house 窗口按 maker 口径胜率 84.9%92.0%、均值 +16.2+18.2 bp(跨 3 个交易日、4 个标的稳定), 不过滤基线胜率仅 8.3%10.7% → **门槛增量 +41+61 pp**; 同信号下 taker 胜率 0%(复现"吃单被成本吃穿"的路线判断)| 自检 18 步(离线)全过、退出码 0。全部可复跑,出处逐条写在 docs/40。

第 4 段 · 完成度 已完成:执行成本模型(三种方式对比 + 实测联合分布)、四层 agent 链、 可复跑日志(--log / --replay,契约字段逐字节比对)、独立页面与 API、 公网部署配置、prompt 外部化与事件驱动降本、事件判定校准集、 真实账户只读接入(Agentic 账户 OAuth → 只读取数 + 交易前置检查,见 §5)。 未完成(主动写):无挂单队列位置模型;事件源非毫秒级;联合分布只有三天; 现货腿自 09-14 起零成交;账户还没有资金(实测余额 0),所以"缺真实输入"这条 只解决了一半 —— 见 §8 ⑨。

第 5 段 · 材料清单 见 SUBMISSION-CHECKLIST.md 与 docs/40 的「材料清单」段。

第 6 段 · 对 AI Trading 的看法(选填) 见 docs/40。


3. 独立性、数据快照与可核验性

项 说明
对项目一的依赖 零。只读本仓库 data/ 下的数据快照
第三方依赖 零(requirements.txt 里没有任何包,只有环境要求)
common/ 的 4 个文件 隔离时的冻结副本;本项目对其做过的本地修改逐条记录在文件头(便于审计),要同步上游修复请回项目一改
数据快照 58.4 MB / 35 项,清单可离线核验(2026-09-23 补入项目一 09-20~09-23 样本后)
反向依赖 项目一不依赖本项目

跨仓库引用约定(读文档前先看这一条)

docs/ 里有相当篇幅是从隔离前的历史继承下来的,因此会提到一些 不在本仓库的路径(项目一的脚本、未截断的历史数据日、旧的架构图)。 这类引用不是断链 —— 它们都在项目一仓库里,只是本仓库只保留了 快照 + 派生表。

下表就是全局声明清单:写在这里的路径允许在本仓库不存在 (tools/doc_ref_check.py 会读这张表 —— 所以每一条都写成全路径, 不要写成 funding_analysis.py 这种简写,否则登记不上、检查会报出来)。 已就地逐条核对过项目一仓库:

类别 路径(项目一仓库) 在本仓库的替代
采集/派生脚本 tools/friction_budget.py、tools/funding_analysis.py、tools/funding_sign_check.py、tools/oq8_yahoo_premarket.py、tools/precise_fill_analysis.py、tools/check_samplers.py、tools/precheck_window.py 它们产出的派生表在 data/derived/(本仓库只消费,不重跑)
隔离工具 tools/isolate_p2.py、tools/export_p2_snapshot.py 本仓库就是它们的产物;已独立演进
更早的自检入口 tools/reproduce_check.py(项目一"87 项"口径) python run_p2.py --selftest(本仓库口径)
更早的数据日 data/spread/2026-09-17.csv、data/spread/.trades_state.json 快照按"最后 400 轮"截断,更早的日不在仓库里;docs/29 里的读数是当时记录
更早的架构图 / 规格 docs/multi_agent_architecture.svg、project2/README.md 现用 docs/执行辅助-agent分工图-v2.svg(配 docs/47)与 docs/33
项目一的清单/数据字典 docs/TASKS.md、data/manifest.json、data/universe.csv、data/research/fee_timing_rules.txt 本仓库对应 TASKS-P2.md、docs/DATA_DICT.md

⚠️ 判据是"本仓库里有没有",不是"看起来像不像本仓库的"。 检查方式:python tools/doc_ref_check.py,判定以 git 入库状态为准: 已入库 / 被 .gitignore 排除的运行时产物 / 已声明的跨仓库引用 / 未声明失效 四类分开判,最后一类退出码 1。能读到项目一仓库时还会就地核对上游真有那个文件 (声明了但上游也没有 = 真断链,照样失败);读不到时如实标注"未验证上游", 不假装验证过。

🔴 顺带一条值得记的教训:这个检查器初版按 os.path.exists() 判, 于是 data/derived/event_driven_state.json 这种被 gitignore 的运行时产物 在开发机上通过、在刚 clone 出来的仓库里失败 —— 检查器自己不可移植。 改成以 git 为准后才成立。"换个机器结论就变"是这个仓库最不能接受的一类缺陷。

数据快照的三类文件(这一条是被坑过才写下来的)

data/SNAPSHOT.md 由 tools/snapshot_manifest.py 生成,把文件分成三类分开列、分开验:

类别 例子 核验方式
① 冻结快照 data/spread/orderbook-*.csv(前 400 轮) SHA256 必须逐字节一致,不一致即退出码 1
② 本仓库派生物 data/derived/rag_index.json 哈希与上游那张表本就不该一致,核验方式是「能重建」
③ 运行期可变 news_state.json 等 只查存在与非空,哈希仅作参考

为什么必须分开:混在一张表里用同一个哈希去验,结果只有两种 —— 误报(把正常运行当成数据被篡改),或者干脆没人验。两种都是"清单撒谎"。

python tools/snapshot_manifest.py --verify     # 就地核验,冻结项不一致 -> 退出码 1

⚠️ 快照是截断的(盘口保留最后 400 轮;trades 保留尾部 8 万行, 但现货行一条不丢 —— 现货成交稀少,被截掉会让"最后成交距今"失真、误触发停牌判据)—— data/SNAPSHOT.md 逐文件写明处理方式、行数与 SHA256。这是如实标注,不是借口。 (截断规则修订的来龙去脉见 docs/55 §7.3。)

📌 盘口为什么是最后 400 轮而不是前 400 轮:上游导出脚本对盘口取的是前 N 轮, 对 trades 取的是尾部 N 行 —— 拼在一起会自相矛盾(盘口停在 09-18 19:19, 成交却到了 09-19 07:16,差 12 小时)。对一个卖点是"同一时刻的盘口 + 逐笔成交" 的决策演示,这是硬伤(腿风险/成交率/深度会来自两个不同时段的市场)。 所以本仓库把盘口改成保留最后 400 轮与之对齐;重截断工具是 tools/retruncate_orderbook.py(自带自检,且不会改动源文件)。


4. 一键自检(18 步离线 + 2 步联网)

python run_p2.py --selftest        # 离线 18 步
python run_p2.py --selftest --net  # 额外跑 ⑲ 消息面源、⑳ 事件判定回归门槛
# 检查 防的是什么
① 执行成本模型 数字算错
② 事件闸门(含失败语义 / 日历质量) 闸门悄悄失效
③ 多 Agent 团队(分析师→辩论→交易员/风控官→执行进度官→复现日志) 一票否决被绕过、复跑对不上
④ RAG 记忆(能消化 / 不膨胀 / 只读 / 校准集留出) 上下文膨胀、抄答案
⑤ 数据快照核验(冻结项逐字节) 数据被改动而不自知
⑥ 持仓期巡检 裸露敞口无人报警
⑦ 可计算事件(期权到期/休市) 日历口径漂移
⑧ 配置解析(.env 优先级) key 泄露 / 配置没生效
⑧附 启动脚本卫生(.bat 纯 ASCII / CRLF / 无 BOM / 引用的脚本存在) 双击 bat 时 cmd 按代码页解码:UTF-8 多字节 + 裸 LF 会吃掉换行、把两行粘成一行(实测 echo 变 ?echo);脚本改名后 bat 静默失效
⑨ 事件判定校准集(schema + 覆盖 + 留出规则) 拿答案喂模型还自称校准过
⑩ 盘口重截断(保留最后 N 轮) 盘口与成交来自两个不同时段
⑪ 保活守护(地址解析 / 退避 / 状态落盘 / 隧道默认值) 链接悄悄死掉、地址抓错
⑫ HTTP 冒烟 页面调用的端点根本不存在
⑬ 页面渲染冒烟(Node 最小 DOM 里真跑一遍 web/app.js) 页面整页空白而自检全绿
⑭ 前端设计检查(类名一致 / 对比度 / reduced-motion / focus-visible) 状态类没定义、深色主题看不清、动效不尊重系统设置
⑮ 前端布局验收(真浏览器:决策台 + 执行闭环两页;溢出 / 字面标记 / 截断 / 卡住的占位符) 只有真渲染 + 量尺寸才发现的排版故障;只量默认页的话另一页的故障永远不会被发现
⑯ 长跑记录器(汇总统计算法 / 记录格式 / 空与坏数据) 稳定性与效率的证据源自己算错
⑰ 文档路径引用(以 git 入库状态为准 / 已声明的跨仓库引用 / 未声明失效) 文档里的路径点不回去(继承自隔离前的引用最易腐坏;"磁盘上有但没入库"也算坏)
⑱ 📡 行情通道 + ⚓ 外部锚 + 🏦 真实账户取数 + 📊 快照重放回测(schema 归一 / 落盘守卫 / 口径守卫 / 只读边界 / 盈亏公式与费率对拍) 采样器写坏冻结快照;归一化列与快照不一致;把"休市偏移"当成"折溢价"报出去;取数工具越界去写或把未掩码密钥落盘(见 §5.3);回测的盈亏公式/费率/门槛与项目常量不一致
⑲ 消息面源可用性(--net) 事件源悄悄失效
⑳ 事件判定回归门槛(--net,留出集 n=10) 把已经修掉的危险方向错误改回去

第 ⑮ 步需要真启动浏览器。没装浏览器、或装了但起不来 (受限策略 / 无桌面会话 / profile 被锁)时它会 [skip] 并返回 0 —— 本机实测:用 Edge 时它真的跑起来了并通过([skip] 从 2 项降到 0 项)。 不因为环境缺浏览器就让整套自检变红;而"页面真的检查不过"仍然会红 (退出码 1 vs 环境问题的 3,见 docs/46 §6)。

第 ⑳ 步没有 LLM key 时如实报"未执行"并返回 0:既不冒充通过,也不算失败。 它有硬门槛:危险方向错误必须为 0、一致率不得低于 90%、且不得比基线退化。

前端设计(可验证,不靠"看着还行")

页面的配色与动效不是随手挑的,而是按两套公开设计系统手写的, 并且每次自检都会重算:

项 依据 / 检查方式
色阶 Radix Colors 的 12 级深色语义(1 背景 … 12 高对比文字)
间距 / 圆角 / 缓动 Open Props 的 4px 刻度与 ease-*
时长档位 Material 3 motion(短 100–200ms / 中 250–400ms)
对比度 tools/ui_design_check.py 按 CSS 变量实算 WCAG,12 组全部 ≥4.5(最低 5.74)
类名一致性 同一工具双向比对 JS/HTML 用到的类 vs CSS 定义的类(改样式时最容易悄悄坏的就在这)
无障碍 prefers-reduced-motion 兜底 + :focus-visible 焦点环 + 跳转链接 + aria-live
依赖性 零第三方依赖:没有 CDN、没有框架、不下载字体,离线照常工作

⑫⑬ 是被真实故障逼出来的:本仓库最初把项目一的 web/ 一起复制了过来, 而它调用的 /api/overview、/api/timeline 只有项目一的服务才有 —— 独立跑起来整页是空的,当时所有自检却都是绿的(没有一个自检去碰页面)。 现在:端点集合集中写在前端 API 对象里,自检照着它真的打一遍; 再用 Node 在最小 DOM 里渲染一遍,逐区块检查有没有真的出内容。

信息架构与页面结构(v3 起:6 段步进器 + 按需展开的详情)见 docs/49-前端信息架构与UI设计规范(v3).md,截图存证在 docs/ui-v3/。 回滚不需要仓库里另存备份 —— 上一版 UI 就在 git 历史里(docs/49 §9 给了三条命令)。


5. 账户接入(只读):能读到什么、怎么读

主路线是 Bitget Agentic 账户(OAuth 授权,不需要你交 API key)。 它的三个性质正好对上本项目「只辅助、不自动下单」的定位:资金隔离 (只能碰你转进去的额度)、不可提币(官方 FAQ 明确)、OAuth 不落长期密钥 (凭证由 MCP 回调自动落盘,不进聊天、不进文档)。撤权方式=在官网删掉该账户的 API Key。

5.1 三条用法

python tools/account_read.py --read         # ① 只读取数 -> data/account/
python tools/account_read.py --preflight    # ② 交易前置检查:余额 / 持仓 / 手续费率

# ③ 把持仓段规范化成项目持仓单(默认只打印,加 --write 才落盘)
python project2/account_feed.py --ingest data/account/positions_raw.json `
       --base-map ../bitgetS2_factory_trading/data/universe.csv

📌 ③ 里的 --base-map 不是可选项:现货 rToken 符号是 RHOODUSDT、永续是 HOODUSDT, 两条腿必须归到同一个 HOOD。而不能无条件剥 R 前缀 —— 真标的里也有 R 开头的 (如 RIVN),剥了会变成 IVN,凭空多出一个"标的"。正解是查权威符号表 (可直接用项目一 data/universe.csv,带 base / spot_symbol / perp_symbol 三列)。

⚠️ --read 每次新起一个 MCP 进程。 这不是洁癖:MCP 进程如果在授权之前就启动了, 它不会热加载新落盘的凭证,私有接口一律报 ConfigError: Private endpoint requires API credentials(它的提示会诱导你去配 BITGET_API_* 环境变量,别照做 —— 那是备选的手动 Key 路线)。自己起一个新进程即可,不必重开会话。

🌐 前置条件两条(都在本机实测过):

  1. 先完成一次 OAuth 授权(一次性)。完整步骤与三个坑见 docs/52 §8.1.1;凭证由 MCP 回调自动落盘到 ~/.bitget/oauth_token.json, 你不用手填任何 key。
  2. 要能连通 bitget.com:本机实测直连不通,走 Clash 代理(127.0.0.1:7890)才通。 代理写在 ~/.workbuddy/mcp.json 的 env 里,且必须同时带 NODE_USE_ENV_PROXY=1 —— Node 的 fetch 不读 HTTP_PROXY,少它连公开行情都拉不到、OAuth 还会静默失败。 取数工具从那份配置读启动方式,所以你只需要改一处。

5.2 前置检查实际输出什么

实测(2026-09-22,24 个只读请求全部 ok):

项 实测值 判据 / 含义
授权 authorized: true(apiKey 由服务端掩码成 bg_ff…7fe4) OAuth 生效
余额 accountEquity = 0、assets: []、fundingAssets: [] 🔴 账户是空的 → 无法下单。要演示/实盘得先把资金划进去;提币与主→子划转按约定由你自己在 Web 手动完成,Agent 不碰资金
持仓 positions.data.list = null 明确无持仓(这是结论,不是"读不到")
永续费率 maker 0.0002 / taker 0.0006 = 2 / 6 bp 与 project2/execution_cost.py 的 FEE_PERP_MAKER / FEE_PERP_TAKER 逐项一致
现货 rToken 费率 0.0005 / 0.0005 = 5 / 5 bp(RHOODUSDT) 与 FEE_SPOT 一致

为什么盯死费率:EDGE_THRESHOLD_BP = 11.34 的推导前提就是 「往返手续费 13.70 bp = 2×(现货 5.0 + 永续 maker 2.0)」。费率一旦漂,门槛就得重算 —— 所以检查器把账户返回的费率与代码常量逐项对照,漂了就报警并点明这一点。

两个此前不知道、但会影响结论的事实(都已写进工具注释与自检):

  1. 费率是逐 symbol 的 —— 同为 SPOT,BTCUSDT 是 10 bp、RHOODUSDT 是 5 bp。 所以前置检查必须按自己的标的查;拿 BTC 的费率当代表就是错的。
  2. category=SPOT 的 positions 段不被支持(返回 HTTP 400 / Parameter SPOT does not exist) —— 现货持仓不在这里。工具如实报出,而不是把它当成"空仓"。

5.3 只读是三层的,不是"我们保证不写"

层 做法
权限层 Agentic 账户不可提币(官方 FAQ),且只能碰你转进去的额度
代码层 工具白名单只有三个:get_auth_status / account_overview / position(且只放行 info·history·adlRank)。下单/撤单/提币/划转整类不在表里,position.action=close 连参数都传不进去;启动环境里剥掉所有 BITGET_*
落盘层 写文件前先过脱敏守卫:出现 secretKey / passphrase 之类的键,或 apiKey 竟然没有掩码,直接拒写

三层在 python tools/account_read.py --selftest(离线,用真实返回做 fixture)里都有断言; 它已挂进 run_p2.py --selftest 的第 ⑱ 步。

5.4 三态语义:读不到 ≠ 没有

状态 意思 输出怎么写
ok 读到了 N 条 逐条列出
empty 读到了、而且确实是空的 「没有在途持仓(已确认)」—— 🔴 官方空仓给的是 list: null,不是 []
unavailable 读不到(未授权 / 网络不通 / 字段认不出) 「持仓读不到」+ 原因,且退出码 1

这条不是洁癖:把 unavailable 显示成 0 仓位,就是把缺数据说成了安全。 这正是本项目最容易犯、也最不该犯的错(project2/account_feed.py 自检里逐条守着)。

⚠️ 仍未校准的一处(如实写):非空持仓的字段名。当前账户为空,拿不到真实的非空返回, 所以 --preflight 遇到非空持仓时会原样贴出并明确警告「未校准、请人工核对」, 不按猜出来的字段名硬解读。

端到端已跑通:--read → --ingest 报 empty(真实账户确实没有持仓)。

页面入口在哪:网页左侧「执行闭环」那一页的最上面,有一块 🏦 真实账户(只读) —— 余额 / 持仓 / 逐 symbol 手续费率 / 前置检查结论, 都带三态徽标(读到 · 读到且确认 · 读不到)。 截图存证:docs/ui-v3/17-account.png。

⚠️ 它读的是 data/account/read_latest.json 这份本机落盘的结果: /api/account 只读文件,页面本身不打交易所(刷新一万次也不产生一次外部请求)。 "交易所读数 → 页面"之间只有两个可核验的中间文件(账户取数结果、持仓单), 而不是一条隐式链路 —— 这样页面永远不会因为有人点了一下就去碰账户。


6. 目录

├── run_p2.py            唯一入口:网页 / 自检 / 命令行演示 / 公网隧道
├── README.md            本文件
├── SUBMISSION-CHECKLIST.md  提交前逐条打勾(硬门禁 / 评分项 / 归档)
├── TASKS-P2.md          任务清单与完成状态
├── requirements.txt     零第三方依赖(只写环境要求)
├── Dockerfile           python:3.12-slim + tzdata(slim 镜像缺 tz 数据会崩)
├── render.yaml          Render 一键部署(Blueprint)
├── fly.toml             Fly.io 一键部署
├── 启动Demo.bat          Windows 双击:**保活**启动(进程掉了自动拉起 + 公网地址落盘)
├── 后台运行Demo.bat      Windows 双击:后台保活(关掉窗口也不停)
├── 查看Demo状态.bat      Windows 双击:看状态 + **当前公网地址** + 最近日志
├── 停止Demo.bat          Windows 双击:停止(连子进程树一起收,不留孤儿隧道)
├── start_demo.sh        Linux/macOS/WSL:一键起服务 + 公网链接
├── .env.example         LLM 配置模板(任意 OpenAI 兼容端点;不配也能跑)
├── prompts/             🔸事件判断 prompt(版本化,可回溯到具体版本 + SHA256)
├── common/              冻结副本:config / console / market_calendar / rag_memory
│                        (本地修改逐条记录在文件头)
├── project2/            核心:execution_cost · agent_team · event_gate · market_events
│                        · mcp_client · signal_adapter · events_calendar.json
│                        · account_feed.py(仓位接入层:把只读返回规范化成项目持仓单)
├── tools/               消息面 / 情绪采样 / 持仓巡检 / 联合分布 / 阈值敏感性 /
│                        模型对比 / 快照清单 / 盘口重截断 / 页面冒烟 / 事件判定校准 /
│                        长跑记录器(run_record.py,稳定性与效率的实测证据源)/
│                        account_read.py(**真实账户只读取数 + 交易前置检查**,见 §5)
├── web/                 独立页面(决策链 / 概览 / 阈值透明化 / 快照 / 告警弹窗)
├── data/                数据快照(SNAPSHOT.md 可核验)+ 决策日志 + 校准集
└── docs/                口径、叙事与提交材料(见下)

关键文档

文档 用途
docs/40-提交材料(填表照抄·项目二).md 填表直接粘贴(手册 6 段 + 大模型作用 + 两套赛道措辞)
docs/41-赛道选择与两投接口.md 赛道三 vs 赛道一开放主题的对比与推荐;与项目一的七个交接点
docs/34-项目二叙事重写(agent团队主线).md 叙事主线(最完整)
docs/33-Agent团队分工图与规格.md agent 团队逐 agent 规格与三条设计红线
docs/14-往返摩擦预算与精确化成交判定.md 成本门槛与联合成交分布的口径
docs/42-prompt版本化与事件驱动降本.md prompt 版本化 + 事件驱动的完整规则与代价
docs/43-公网可访问.md 三条部署路线 + 实测记录 + 常见故障
docs/44-长期运行与保活.md 保活的原理、边界与开机自启
docs/46-事件闸门接线与复跑契约.md 硬闸门如何合并 LLM 判定;复跑契约的两处坑
docs/47-执行辅助agent分工优化(v2).md 执行辅助的 agent 分工优化方案(配图:docs/执行辅助-agent分工图-v2.svg / .png)
docs/48-执行进度官·校准回归门槛·长跑归因(本轮三项).md 本轮三项:校准危险方向修正 + 回归门槛、事件驱动降本实测、执行进度官(含抓到的时钟不一致 bug)
docs/49-前端信息架构与UI设计规范(v3).md 页面信息架构(6 段步进器)、设计 token 规范、可用性取舍与回滚方式(截图:docs/ui-v3/)
docs/50-后续新增标的操作清单.md 以后要加标的时逐层要改什么、不改会怎么静默出错(含两处必踩的坑)
docs/53-接入官方MCP(数据源集成).md 接官方 bitget-mcp-server:把财报日历 / 除息做成硬闸门的第三个源(实测接入当天抓到 META 除息日=当天);含两个接入坑与"没有接什么、为什么"
docs/55-快照重放回测(胜率的可验证定义).md 📊 回测证据记录:在冻结快照上确定性重放(10 标的×双腿×895 轮×60s),胜率的精确定义、两条口径(taker 下界 / maker 上界)、门槛增量 +53+64 pp、以及全部局限(窗口一天 / 无队列模型 / LLM 不可重放);配 tools/backtest_replay.py(15 项自检)与 data/backtest/ 逐笔明细
docs/52-完整执行辅助团队:编制、接口与落地顺序.md 要当成真实可用的完整交易系统还缺谁:采集官 / 仓位官 / 对账官 / 复核官 / 日报官;交易所接入的红线与签名;§8 路线定案:主 Agentic 账户(OAuth,不需要你给 key),API Key 作备选;§9 跨仓库引用约定
docs/51-怎么用(小白版)与离场问题的边界.md 三步上手 · 什么时候能交易(看哪一格)· 什么时候离场:本项目为什么不给(配图 docs/使用流程图.png / .svg)
tools/account_read.py(--help) 🏦 真实账户只读取数 + 交易前置检查(见 §5):--read 每次新起一个 MCP 进程取数(绕开"长驻进程不热加载凭证"这个坑);--preflight 查余额 / 持仓 / 手续费率,并与 execution_cost.py 的费率常量逐项对照。只读三层保证 + 脱敏守卫;自检离线(用真实返回做 fixture)
project2/account_feed.py(--help) 账户/仓位接入层(只读):把取数结果规范化成项目持仓单格式(--ingest + --base-map,下游零改动;--write 才落盘)。--plan 打印"该跑什么",模块自己不执行任何命令。三态语义守在自检里:ok / empty(🔴 官方空仓是 list: null,不是 [])/ unavailable
docs/29-现货腿零成交事件(0914起).md 最重要的那条局限的完整记录

Agent 分工图

执行辅助 · Agent 分工图 v2(优化方案)

上:v2 优化方案 —— 在 v1「开仓前一次性决策」之上补出执行中的闭环 (绿色为本方案新增:微观结构分析师 / 执行进度官 / 拆单规划器 / 账户级规则 / 复核官)。 v1 的分工与逐 agent 规格见 docs/33,优化理由与落地顺序见 docs/47。 矢量版(可放大、可编辑)在 docs/执行辅助-agent分工图-v2.svg。


7. 页面与接口

页面刻意只调用本仓库自己的端点(历史故障见 §4 的说明):

端点 用途
/api/health 存活 + 快照时间点 + LLM 是否配置
/api/decision?base=NVDA&qty=5000 完整决策链(5 路分析→辩论→闸门→交易员→风控官→最终 + decision_hash)
/api/decision?base=NVDA&position=demo 同上,并带上在途持仓单 -> 第 6 路执行进度官(auto 读 data/positions/open.json/demo 用带 synthetic 标记的合成单/none 关掉)
/api/assess?base=NVDA 风险与理由(不代下单,只给理由与条件)
/api/overview 全标的汇总
/api/params 生效阈值与来源(页面上每个数字都能点回代码常量)
/api/snapshot 数据边界(data/SNAPSHOT.md 原文)
/api/alerts 持仓期巡检告警(右下角闪烁弹窗的数据源)
/api/account 🏦 真实账户只读摘要(读 data/account/read_latest.json;不打交易所,三态严格区分「没有」与「读不到」)

🏦 账户是"页面只读本地文件"的:取数本身只在 CLI(§5),页面上那块 🏦 真实账户(只读)(在「执行闭环」页)读的是 data/account/read_latest.json 这份本机落盘的结果,/api/account 也只读文件。 所以"交易所读数 → 页面"之间只有两个可核验的中间文件(账户取数结果、持仓单), 而不是一条隐式链路 —— 也保证页面永远不会因为有人点了一下就去碰账户。

页面上的东西刻意做成可自证的:最终裁决旁边就是 decision_hash、 输入文件的 SHA256(16) 与复跑命令;风控官区块把未触发的规则也列出来并写明 「什么条件下撤销」;阈值表把每个常量的代码位置摊开。


8. 已知局限(主动写,这是可信度来源)

① 现货腿在若干时段零成交(报价仍在)→ 现货挂单路径在这些时段不可执行。 准确的时间线(逐笔实测,docs/29 + docs/55 §7):09-14 00:00Z ~ 09-19 06:46Z 零成交 (持续 5 天,09-19 恢复);09-20 / 09-21 正常(4206 / 2946 笔); 🔴 09-22 起再次整天零成交(该日永续 509,515 笔、现货 0 笔)—— 所以页面上的 agent:stale_quotes / quote_frozen 是真判据在起作用, 不是系统算错了; ② 联合分布只覆盖 09-1209-14;③ 容量是制度性(SEC 豁免限符号与成交量)+ 流动性双重限制; ④ 无挂单队列位置模型;⑤ 事件源非毫秒级; ⑥ 无 key 时事件判断退化(会如实标注,不假装); ⑦ 采样缺口 8.04 h + 74.9 min(均 100% 落在 stockroute); ⑧ 事件判定校准集 n=10,只能做回归与危险方向检查,不能当准确率结论; ⑨ 执行进度官的输入依赖真实仓位 —— 取数与规范化已落地(Agentic 账户 OAuth: tools/account_read.py + project2/account_feed.py,见 §5 与 docs/52 §8), 页面上也能看到账户状态(「执行闭环」页的 🏦 区块), 但实测账户余额 0、无持仓(还没划入资金),所以目前仍只能用 demo 合成单演示: 判据可验证,真实输入待资金到位。这条局限没有消除,只是原因从"取数还没实现" 变成了"账户里还没有钱"(提币与主→子划转按约定由你在 Web 手动完成,Agent 不碰资金); ⑩ 长跑记录里 412 轮是旧代码跑的(记录已加 src_sha16 代码指纹按版本分组, 带指纹的轮次从 2026-09-20 起重新累积)—— 旧轮次不能给当前代码背书; ⑪ 快照重放回测的窗口是 4.5 天(docs/55:2026-09-1909-23,292 笔信号、 4 个标的、3 个有信号的交易日)—— 它证明的是"门槛有甄别力、吃单必败"的方向与稳定性, 仍不支持任何收益承诺;且 maker 口径是乐观上界(无队列位置模型,成交率要按 实测联合分布折算)。

完整清单与出处见 docs/40 与 docs/34 第 6 段。

⚠️ 材料里不要写的三条:① "rToken 跟踪偏离 −33~+85 bp"(已撤回,实测中位 +1.7 bp); ② "用周末样本跑了 60 天回测";③ "SEC 批准了我们的策略"。


9. 合规与术语

必须用 禁止用
做市型价差捕获 无风险套利 / risk-free arbitrage
代币化美股 / rToken(并写明"代币 ≠ 股权") "股票"
期望收益 / 实测区间 年化收益 / 稳赚 / 保证

每段都要能点回一个可复跑的证据;点不回去的数字,删掉。

About

项目二 · Execution-aware Alpha|给定盘口与目标仓位:这笔单该吃、该挂、挂哪里、分几笔 —— 一个会自我质疑的 agent 团队 + 可复跑决策日志(decision_hash)|Bitget AI Base Camp Hackathon S2 · AI Trading Desk「执行辅助」

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages