27 Commits

Author SHA1 Message Date
claude_dev 5d5a9f29f4 fix(config): 身份文件 ASCII 化(\u 转义)修 PS5.1 GBK 读炸——10-06 21:00 xt_eod 生产实证: ConvertFrom-Json FormatException→BIGQMT_ACCOUNT_ID 未注入→桥 shim 硬错 account_id is required→universe ETF/基金=0→rc=1(对照 10-05 同假期班 rows=37301 正常, 30d 窗口拉取自愈无数据损失); 修=ensure_ascii 重写(值 round-trip 等值)+test_qmt_identity 第④钉(文件纯 ASCII, phase-③ wrapper 裸 Get-Content 安全性由钉担保)+落档案 §四④/§五①′(部署硬期限=10-08 复市 21:00 xt-daily 前, 理想 10-07 当天) [vps] [no-doc]
CI/CD / nas-deploy (push) Blocked by required conditions
CI/CD / nas-verify (push) Blocked by required conditions
CI/CD / test (push) Successful in 42s
2026-10-07 11:45:00 +08:00
claude_dev cbee9e414b fix(factor): 判定与档案五项收敛——_PROMOTION_BAR 单源化(第二处硬编码改引常量)+exam_gate 缺周期 fail-closed(单周期对比不再 SUGGEST_PROMOTE,INSUFFICIENT_PERIODS 明示)+报告文件名带时间戳(同日重跑不覆盖)+v2a 条目补 evidence 指针+等权交集语义 docstring 明示;gap台账坏行容错(T6-N1非dict行降级跳过);因子档 §7.7 台账 (审计 P3-15/16/17/18/19+T6-N1) [vps] 2026-10-05 22:08:56 +08:00
claude_dev 434d7cb357 feat(config): QMT 部署身份单一权威源 config/qmt_identity.json——P2-18 账号硬编码根治(⚖️-2 用户拍板:确认永为模拟号+令根治硬编码)
CI/CD / test (push) Failing after 7s
CI/CD / nas-deploy (push) Has been cancelled
CI/CD / nas-verify (push) Has been cancelled
根因三层(全案=audit/20261005_qmt_identity_env_plan.md): schtask 无 per-task env+机器级 env 未设→wrapper 被迫字面量;「部署身份」无单一权威源(env 名分裂三个);模拟号零安全压力致 32 文件 88 处 copy-paste 扩散。

- qmt_gate_common.load_identity 正典装载器(:14-59): env SANGUO_QMT_ACCOUNT/BIGQMT_ACCOUNT_ID(兼容别名)>json>RuntimeError fail-loud;SANGUO_IDENTITY_JSON 显式指路不存在=立即报错;查找=repo 相对>C:\sanguo_vnpy_v2\config\(生产副本回退位)
- 灾备腿同源: relogin/qmt_bridge_probe/setclip 改 from qmt_gate_common import ACCOUNT
- 桥腿镜像同链: xt_gateway._qmt_account/qmt_gateway_client._identity_default_account/is_price_source_vps/bridge_switch_ops(3 处 env 注入+1 处内嵌探针串)/check_xtquant——env 带默认的硬编码默认值全数退役
- xt_eod_wrapper.ps1 改 Get-Content identity json(保持 ASCII);码内 docstring 字面量→占位符(engine/runner/runner_live/live.yaml 注释/README)
- .gitignore 白名单 !config/qmt_identity.json(全局 *.json 曾吞之,git check-ignore 实证)
- tests/trader/test_qmt_identity.py 五钉: 装载链语义(env 双名覆盖/显式指路 fail)+单源一致性(identity≡live.yaml≡watch_accounts≡gate_common≡各腿镜像,休市表 CI 同步测先例)+码面字面量 grep-pin(生产码面零 66639661,只 config 三件套可含)
- 监控 spec: §3.2 账号来源 bullet/§9.A-18 坑条/§12 行数+行号勘正(插入块致 bridge_ping/calendar_probe/relogin_running 引用行号推移);runbook: 非代码资产两行(副本回退路径+生产 wrapper 待改清单=10-08 窗口后 §五③)

生产 wrapper(C:\sanguo_bigqmt 库外)字面量收尾=10-08 复市验证窗口后非代码资产流程;VPS 班车同窗口(护 10-08 07:50 relogin 首班旧码纯净)。trader+api 620 绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-05 17:32:42 +08:00
claude_dev d15653d9df feat(factor): #70① 合成层双雄入注册表——composite_quant12(assessable 等权基线)+composite_quant12_v2a(promoted,promotion_t=26.32 锚 2026-09-11 考场);月度批评自此盯合成层衰减,等权/ICIR 当月 IC 并排 [vps]
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-10-03 20:59:29 +08:00
claude_dev e47dddd336 feat(data): P4-3 接线——corpus_reader.get_events 读出口+manifest 两域+run_corpus 尾两段(funnel/gate rc 隔离+LLM env 条件传递); fusion spec §20.16+runbook 落档; Mac 冒烟绿(词表件落+候选入队+门如实报缺) [vps] [nas]
CI/CD / test (push) Successful in 46s
CI/CD / nas-deploy (push) Successful in 2s
CI/CD / nas-verify (push) Successful in 10s
2026-10-02 10:02:51 +08:00
claude_dev 075052da54 fix(data): 10-01 二轮审计吸收——白名单补四类+三注册表钉死测试; data-monitor 两班入自监; 旧名注册脚本根治; manifest 补齐; spec 三勘正 [vps] [nas]
CI/CD / test (push) Successful in 38s
CI/CD / nas-deploy (push) Successful in 3s
CI/CD / nas-verify (push) Successful in 12s
- P1-5 读写注册表脱节: EVENT_PANEL_TYPES 补 margin/sw_industry/dragon_tiger_seats/
  nb_daily(15→19, 09-12 四域注册采集时漏同步); 新增 test_whitelist_sync 钉死
  「采集 PER_DATE_TYPES 全族+gdhs == 白名单 == manifest domains ⊇」三同步义务;
  nb_hold 季频 asof 语义不进 exact-date 底座(钉死边界, 零消费方)
- P1-6 manifest 脱节: data_manifest.yaml 8 域→27 域(补事件面板族 19 类),
  消 data_gap_check 对真实供给误开缺口 issue 的潜伏面
- P1-10 监控自监: SCHTASKS +sanguo-data-monitor-morn/eve(17→19); 两 wrapper 本就
  恒 exit 0(设计预留), 非零=真崩, 零假红; 双班全死盲区待 strategy 域 health
  mtime 反盯(已转呈)
- docs_audit 旧名根治: register_schtasks.ps1 重写为现役 bs-daily/xt-daily
  (旧版重跑会复活死任务双开, 09-01 事故同源); bs_eod_wrapper/xt_eod_wrapper
  头注勘正
- docs_audit spec 三勘正: §16.1 白名单 14→19 类; §20.1「零改动自动可读」落空
  改「白名单一行即读+钉死测试」; §18.8 自称权威降级+ak-daily 07:35→19:00
  (VPS 实查)+xt 行名归一+ak-events 指针化; §20.10.2 硬计数指针化;
  §20.15.1/runbook 在岗 17→19
- docs_audit README §4 调度表整表换现役 10 任务; data-monitoring 计划加三行
  状态头注(初值退出权威位)

tests: data_platform+portfolio 1397 passed

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-01 09:19:29 +08:00
claude_dev 3a938ecac8 fix(portfolio): 运行注册表种子缺失条目自动 merge——治挑战者双机漏登记缺口 [vps]
CI/CD / test (push) Successful in 40s
CI/CD / nas-deploy (push) Successful in 7s
CI/CD / nas-verify (push) Successful in 8s
2026-09-27 实证: 挑战者 szneul_eq_reb63 登记 config 种子后, 双机运行副本
(ensure_runtime_registry 首触才拷贝)永不知晓——周报 job 按运行副本点名
stage+paper_account_id, 挑战者被跳过=影子 A/B 评测腿(周报/孵化梯/毕业 gate)全盲。
治本: 首触整拷语义不变, 另加 _merge_seed_entries——种子有而运行副本缺的
条目(strategies/factors 双主顾)每次 touch 自动补入, 同名条目运行态为准
(防部署回滚转移结果), 无缺条目不写盘(幂等)。
config 种子挑战者 paper_account_id null→63(周报点名非空才算, 与双机手动补行一致)。
runbook 注册表行同步更语义(档随码走)。a 方案(双机手动补行)已先行落地救急。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-27 18:35:43 +08:00
claude_dev 5e69e3dd41 fix(factor): S 族包级导入可达(审计F-1)+血统注册表 5 名对齐与不可解析名防线(审计F-3) [vps] [no-doc]
CI/CD / test (push) Successful in 23s
CI/CD / nas-deploy (push) Successful in 10s
CI/CD / nas-verify (push) Successful in 16s
F-1: sentiment_library 曾只挂在 batch_eval 的 if sent_names: 分支内,而
sent_names 筛选又依赖已注册——鸡生蛋致 S 族评估管线不可达(Q3 披露潮首跑
即撞)。提升至包级 __init__ 与其余库同款;batch_eval 分支内冗余导入移除;
补子进程隔离的包导入集成回归测试。

F-3: config/factor_registry.yaml 5 名与因子库漂移(fa_gross_margin→
fund_gross_margin, s0*→sent_*4),月度批评空转+J2 误报。一次性改名对齐
(hypothesis/版本史原样保留);plan_batch 增不可解析名剔除防线(入
skipped_unregistered,main 侧 stderr 告警不炸批)+入库 yaml 全员可解析
守门测试。

tests/factor 424→427 绿(新增 3: 包导入集成/剔除防线/yaml 守门)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-27 07:57:47 +08:00
claude_dev ae39b5e727 feat(config): registry 登记 #69 影子A/B 挑战者 szneul_eq_reb63——等权v1 对照在位者 v2a 同参(TOP_N=200/REB=63/BAND=1.0), 09-28 起跑 [vps] [no-doc]
CI/CD / test (push) Successful in 24s
CI/CD / nas-deploy (push) Successful in 15s
CI/CD / nas-verify (push) Successful in 14s
2026-09-27 07:25:07 +08:00
claude_dev 0c22e8bed4 feat(data): 申万一级行业映射表导出器——P3 归因契约三列[symbol vt_symbol 形/industry_code 1..31 稳定序数/industry_name], 未映射=0 消费方约定, data_manifest 登记 sw_industry_map+spec §20.3 派生注记 [vps]
CI/CD / test (push) Successful in 23s
CI/CD / nas-deploy (push) Successful in 8s
CI/CD / nas-verify (push) Successful in 11s
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-26 14:22:37 +08:00
claude_dev 3cedcf7d53 feat(portfolio): 策略孵化梯注册表——五段状态机+血统硬闸+J1 事件+存量补录种子 [vps] [no-doc]
spec §4.5 决议 L 六件之 1/6:克隆 version_registry 范式(状态机/原子写/转移即
事件/issue 模板落盘);→retired 死因必填、→paper/live gate 快照必带、→live 另带
资金分配快照(决议 B);szneul_reb63 补录种子(gate 快照留空)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-24 20:53:10 +08:00
claude_dev 71548ab25e docs(pipeline): P1 注册表种子(2晋级+1可判+4孵化+1墓园)+域档 P1 流水线化节(含决议 J 六件) [vps]
CI/CD / test (push) Successful in 26s
CI/CD / nas-deploy (push) Successful in 11s
CI/CD / nas-verify (push) Successful in 15s
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 09:53:55 +08:00
claude_dev 5d42bf1e66 feat(pipeline): P1 数据缺口比对小件——注册表 params.source vs 底座 manifest,缺口 exit 2 [vps] [no-doc]
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 09:52:11 +08:00
claude_dev abead01bba chore(config): B1监视器冷启动账号源watch_accounts固化——实例删光+快照表空时监视器无目标可盯(VPS run700部署后实锤:监视器线程活但0行),config补watch_accounts=[66639661]+watch_mini_path;NAS侧无QMT客户端连接失败节流告警1条/30min属正常;本次部署已用sticky行播种应急,此config防未来整库重建再裸奔 [vps]
CI/CD / test (push) Successful in 17s
CI/CD / nas-deploy (push) Successful in 48s
CI/CD / nas-verify (push) Successful in 13s
2026-08-19 22:53:07 +08:00
claude_dev 2cb2ab0dd8 fix(config): vnpy_db 改 NAS v2 dbbardata 库(治 CTA 结果页 5图空白)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
根因:vnpy_db 指向旧路径 /volume1/stock/sanguo_vnpy/data/quant_trading.db
(v1 残留,库不存在)→ read_index_daily 连空库报错 → cta_engine try catch
(line 307)静默跳过 compute_metrics → metrics.json 不写 → CTA 结果页
5图全空(基准/Alpha/Beta/回撤/波动)。个股回测走 parquet 不受影响,故只
5图空,日志无 traceback(静默跳过非崩溃)。

修复:vnpy_db → /volume1/stock/sanguo_vnpy_v2/data_backup/quant_trading.db
(NAS v2 dbbardata 库,000300 SSE 4025行实证)。yaml 本就是 NAS 路径基准
(daily_dir 等 /volume1/stock/...),VPS 走 SANGUO_DATA_ROOT env 覆盖、
Mac 走 fixture,三环境互不影响。

端到端验证:NAS 容器 load_config(find_config_path()) → vnpy_db v2 →
read_index_daily('sh000300',2024-01-02,2024-06-28) 返回 117行(was 0)。
2026-08-02 20:22:44 +08:00
claude_dev 96b1924fd5 feat: 实盘模拟(live) + 组合回测MVP(portfolio)
[live] 实盘模拟 vnpy+miniQMT 直连(supervisor 轮询, 前后端):
- sanguo_live: LiveTradingEngine + AShareCtaTemplate(定寸/禁做空) + runner_supervisor(DB驱动) + persistence(4表WAL)
- sanguo_api/routes_live: 9路由(create/start/stop/positions/trades/account/status)
- frontend live: New/List/Monitor + api/live.ts; config/live.yaml

[portfolio] 组合回测 MVP(BulletTrade, 链路代码完成待验证):
- runner_backtest 加 JSON 入口(--json, BacktestEngine 顶层 import)
- sanguo_api/routes_portfolio: POST /portfolio/backtest SSH 触发 VPS 跑
- frontend PortfolioBacktest.vue + api/portfolio.ts: 表单+结果+净值曲线
- 路由/菜单注册(/backtest/portfolio 组合回测)
- 已知: MVP 链路未端到端验证, agent 改至中途被停; 待 Mac 起服务联调
2026-07-18 20:04:16 +08:00
claude_dev 0761342baf feat(trader): live bridge token 改从 config 读取,免容器重建
容器 docker run(非 compose)注入 BRIDGE_TOKEN env 需重建容器,风险大。改为 live_cfg.bridge_token 优先、fallback BRIDGE_TOKEN env。run_live_step 每次 load_config,改 config 免重启即生效。

- _shadow_trades_to_bridge + reconcile_from_bridge 两处 token 读取
- config: live.bridge_token 占位空值(真实值填 NAS gitignored config,不入库)
- tests: +6 测试(config优先/env fallback/都无跳过),191 passed
2026-07-13 19:30:58 +08:00
claude_dev e77c9df0d4 feat(live): D-4c模式B reconcile—bridge回报驱动账本(真桥验证通过)
- bridge_client: from_bridge_code(sh/sz→纯数字码, to_bridge_code逆函数)
- live_orchestrator: reconcile_from_bridge 读bridge /account /positions校正account现金+持仓+持久化, 默认mode_b=false
- live_step step8: 影子后调reconcile(mode_b=true生效, mode_b=false跳过)
- config: live.mode_b开关(默认false模式A)
- test_reconcile: 10例(cash/positions校正+code转换+失败降级+mode_b跳过)
- NAS环境15 passed(reconcile10+shadow5无回归)
- 真桥集成: live_step mode_b=true → reconcile读bridge → account校正(1000万/空仓=bridge真实账本)+持久化
安全: mode_b默认关+bridge失败降级不阻断+token走env
2026-07-11 06:30:08 +08:00
claude_dev ff84b3d4b0 feat(live): D-3 sanguo实盘分支(影子下单)+D期设计文档
D-3 模式A影子下单(spec §5):
- bridge_client.py: QMT bridge HTTP客户端(urllib, X-Bridge-Token, 失败不抛返回None)
- live_orchestrator: _shadow_trades_to_bridge 当日成交POST bridge(默认enabled=false)
- persistence: paper_shadow_orders幂等表+save_shadow_order/is_trade_shadowed
- config: data_platform.yaml加live段, token走env(BRIDGE_TOKEN)
- to_bridge_code symbol转换与guess_exchange一致(2位前缀)
安全: enabled=false默认关+token走env+幂等防重复+影子失败不阻断live_step

docs: phase3d-live-trading-design.md(D期完整设计)
2026-07-11 00:03:46 +08:00
claude_dev 164690373f feat(trader): C期分期项收尾—资金占用成本+分红送股+_restore_ledger修复
- 资金占用成本(spec§195): StrategyRunner.daily_borrow_cost(used×risk_free/365)
  归因per_strategy_pnl(不碰account总账, account.equity真实净值不变);
  config risk_free_rate=0.02; engine.step mark_to_market后计扣; =0向后兼容跳过
- 分红送股(spec§295): dividend_source.py(akshare stock_history_dividend_detail,
  实测600000/000001纯现金分红); PositionLedger.apply_split(volume×factor/avg÷factor);
  Account.apply_cash_dividend; engine._apply_dividends(除权日调整,现金先split后);
  mark_to_market停牌prev_close兜底(今收→前收→均价); _run_replay注入dividends日历
- 修_restore_ledger预存bug: PositionLedger.__init__加volume/frozen/avg_price参数
  (原只symbol, live_orchestrator跨日恢复4参数调用会TypeError, 首次step空仓未暴露)
- 139 passed(119基准+20分红+3占用成本), 无回归
- live_step dividends注入待分期项(每日拉全市场分红慢, 需run_daily_update预拉日历)
2026-07-10 08:44:35 +08:00
claude_dev c01da9f8ed chore(security): backtest.yaml不入库(密码hash/jwt_secret secrets不进版本库)
secrets不进git历史(防克隆/备份/泄露暴露bcrypt hash离线爆破). 本机+NAS已手动
维护Ccf7561523*. .gitignore + git rm --cached停跟踪, 本机文件保留.
2026-07-10 08:21:33 +08:00
claude_dev 0810259911 feat(data): 15min双源集成(data_source路由 + baostock格式适配)
- _resolve_dir_key: 15min支持raw/qfq双源(移除raw15min抛错)
- _check_adjust_cfg: 按interval查dir(minute_15_raw_dir/qfq_dir)
- read_parquet_15min: datetime列优先(baostock时分,旧date兼容)
- config: 加 minute_15_qfq_dir/minute_15_raw_dir
- test: 更新raw15min路由断言(6 passed)

实测容器: 600000 15min qfq 336bars close6.1977 / raw 336bars close6.6200,
datetime时分正确(09:45:00). 15min双源分期项落地.
2026-07-09 19:34:43 +08:00
claude_dev c6b19f4244 feat(data): 恢复双源(task#79)—撮合raw+策略qfq, 分红除权准确
用户要模拟=回测准确: raw除权缺口致MA假信号, 必须双源。
- data_source: qfq→qfq_dir(干净qfq), raw→raw_dir; _check_adjust_cfg(cfg提供才校验)
- engine 双bar流: step(raw_bars,qfq_bars)撮合/盯市raw+策略on_bar qfq; run zip(raw,qfq)
- live_orchestrator: warmup用qfq(信号am); 去adjust参数(双源固定)
- raw_redownload --adjust(''raw/'qfq'); config qfq_dir
- 113/113通过
2026-07-08 07:21:33 +08:00
claude_dev 1ed7b72aca feat(data): raw真实价数据源(task#79)—raw_dir+dir_key路由+新浪源重下
根因: daily_dir mixed-adjust(hfq bulk+akshare raw tail)致3-30 -94%假跌。
方案(Linus三问简化单raw, 除权留分期项#3):
- datareader read_parquet_daily/15min 加 dir_key 参数
- data_source iter_bars/fetch_day: adjust=raw→raw_dir(缺配置报错防混源), qfq→daily_dir
- engine PaperEngine 默认 adjust=raw
- config 加 raw_dir; scripts/raw_redownload.py 新浪源adjust='' 直连+单线程限速
- 验证: 浦发606行close 6.5/14.6 mean10.08 0跳变, 撮合成交价9.71-10.25真实
- 测试9/9+trader全量108/108通过
2026-07-07 22:19:11 +08:00
claude_dev 2227a91a8d feat(api): JWT 单用户认证(auth.py)+ config 扩展 2026-07-06 18:10:04 +08:00
claude_dev 0f894c8415 feat(api): 轻量 FastAPI 5 路由(无 JWT/WS/前端) 2026-07-06 11:38:15 +08:00
claude_dev 90f0b68ce2 feat(data): 脚手架 + YAML 配置加载 2026-07-05 11:41:57 +08:00