Commit Graph

506 Commits

Author SHA1 Message Date
claude_dev 0d038548ae perf(factor): 股票池枚举改无过滤DISTINCT覆盖索引扫——带WHERE(interval/datetime/LIKE)版本在26G库退化全表扫NAS实测>5min不归,前缀python侧滤,周期/窗口由数据查询天然过滤(语义不变,15m-only股锁定测试) [vps] 2026-08-25 01:01:48 +08:00
claude_dev cdaa88fea1 feat(web): 批量评估页——股票池/因子集/时间窗三步提交进任务中心;CI门禁加tests/factor [nas]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 34s
CI/CD / nas-verify (push) Successful in 11s
2026-08-25 00:42:57 +08:00
claude_dev 77e12f4fe0 feat(web): 因子详情页——表达式卡+6格指标+月度/累计IC双系列图+十分组柱状(echarts终端暗色)+排行榜页色值清理走token [nas] 2026-08-25 00:40:26 +08:00
claude_dev 52eb5177ac feat(web): IC排行榜页——瓦片+筛选chips+全指标表格+IC趋势sparkline+信号灯,终端风1:1 mockup [nas] 2026-08-25 00:37:41 +08:00
claude_dev fa87135a44 feat(web): 因子工作台接线——eval API 客户端+3路由+投研组菜单/面包屑 [nas] 2026-08-25 00:33:46 +08:00
claude_dev f0e9860316 feat(api): 因子批量评估四端点(runs/leaderboard/detail/submit)+orchestrator任务接线——leaderboard服务端扁平化排序,worker落factor_eval.db+任务中心摘要 [vps] 2026-08-25 00:31:12 +08:00
claude_dev dfa4f90ecd feat(factor): 批量评估CLI——冒烟/全量/列因子,进度打印+Top15汇总表(NAS docker exec 冒烟入口) [vps] 2026-08-25 00:26:45 +08:00
claude_dev d3226ebe71 fix(factor): 批量评估空因子矩阵守卫——join静默空集记error行不再产全None淘汰假数据 [vps] 2026-08-25 00:25:30 +08:00
claude_dev 3f9a4fc681 feat(factor): 批量评估引擎——进程内逐因子calculate_by_expression(弃spawn池整df pickle),单因子失败不中断,结果增量落盘 [vps] 2026-08-25 00:21:54 +08:00
claude_dev afe969e307 feat(factor): 评估结果存储 factor_eval.db——runs/results两表,metrics按周期JSON,SANGUO_FACTOR_EVAL_DB可覆盖 [vps] 2026-08-25 00:17:47 +08:00
claude_dev 89a8dd1487 feat(factor): 向量化评估指标——RankIC逐行秩相关/ICIR/t/胜率/多空年化/换手/十分组/月度IC/结论分级 [vps] 2026-08-25 00:12:35 +08:00
claude_dev d00ad7d81d fix(factor): WARMUP_BARS 60→120 恢复spec剔新口径(修夹具130根预热而非改口径)+evaluation_filter改datetime对象比较(9M行免逐行strftime) [vps] 2026-08-25 00:09:31 +08:00
claude_dev cfb604588c feat(factor): 评估股票池加载器——dbbardata分块直读polars,前缀60/00/30,300天lookback+45天forward缓冲,vwap派生,bar_idx预热 [vps] 2026-08-25 00:07:37 +08:00
claude_dev 51137a8268 feat(factor): 挂载 vnpy Alpha101(82)+Alpha158(158) 全量表达式进注册表——空df实例化零成本提取,导入即注册,幂等 [vps] 2026-08-25 00:01:41 +08:00
claude_dev ec5a55c5f7 feat(factor): data_adapter 补 vwap 派生列(turnover/volume,零量置null)——Alpha101 表达式 59 处引用 vwap,dbbardata 无此列 [vps] 2026-08-24 23:57:19 +08:00
claude_dev a62013cb9c docs(factor): 第一批实施计划——13任务TDD拆解(挂载/股票池/指标/存储/引擎/CLI/API/前端三页/NAS验证),含ST过滤偏差声明与spawn池规避设计 [nas] 2026-08-24 23:52:40 +08:00
claude_dev c94d1f3d2b docs(factor): 第一批设计spec+终端风前端mockup——①spec:Alpha101+158全量挂载全A重验(2018-2026,主板+创业板剔ST/新股,RankIC 1/5/10D,退市股保留无幸存者偏差);后端=注册表挂载+vwap派生列+批量评估脚本(因子分批15-20/批)+冒烟先行;用户拍板两条:⚠️最终部署VPS不止NAS(走标准promote链,VPS 42.8G权威库)+行业中性化先不做(IC数据说话后再决策)②mockup v2:第一版亮色Element风被用户打回,重做1:1科幻终端风(tokens.css深空黑/荧光青/琥珀/红涨绿跌/term-grid/信号灯),三页=IC排行榜(统计瓦片+筛选+主表带IC色条sparkline)/因子详情(表达式+月度IC+十分组)/批量评估(股票池3预设卡+因子集勾选),用户确认③mockup与spec互引,调查报告见同目录 [nas] 2026-08-24 23:36:36 +08:00
claude_dev 31596f58f9 fix(shadow): 双轨对账count_match改按票+方向聚合总量——QMT部分成交拆行致27vs5恒False纯计数噪音 [vps]
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 1s
08-24实录: momentum一笔3800股被QMT拆19笔fill,对账27vs5恒count_match=False,总量却分毫不差。旧口径按原始行数比(注释自称'差异如实呈现待归因',实则部分成交属成交粒度非分歧)。修=按聚合桶live_volume==shadow_volume判;原始行数保留在live_count/shadow_count供归因。真量差仍判False(新增测试钉死)。trader 254绿。
2026-08-24 23:07:12 +08:00
claude_dev e2dc473682 fix(shadow): 影子市价单成交基准改实时行情——旧按委托保护价记账恒差1.5%,08-24双轨4/6红根因 [vps]
根因(代码级实锤): broker._ref_price 优先用下单传入price,而市价单的price是保护性委托上限(策略侧行情×1.015,BrokerBase契明文'可用作保护价/参考价'非期望成交价)→影子每笔买入虚高~1.5%,卖侧对称低~1.5%。08-24证据三连:momentum/small_cap首次真实成交日25票价差紧聚-150bps(-112~-189);卖侧510500同样-1.54%(排除'晚一根bar随行情'解释);级联=虚价吃掉影子现金6k+→002038买第6只差1678元资金不足拒单(shadow_60日志)。排除用户初判的滑点/费率参数不一致(影子账户slippage=0.0费率正常)。回测/实走无此问题(matcher.py按bar开收价,另一套)。
修: _ref_price(security,price,market)——市价单成交基准=price_getter实时行情,行情不可得退回委托价(告警,可用性优先);限价单沿用传入价(触价语义,旧行为);buy/sell补市价转限价封顶(行情超保护上限按上限成交不追高,卖侧对称)。
+5测试(市价买卖按行情/超上限封顶/无行情退委托价/限价语义不变),trader 254绿+api 171绿。
2026-08-24 23:07:12 +08:00
claude_dev 6c2c217e22 fix(web+api): 组合回测max_pool默认30→0——用户拍板「前端页面肯定要改」(回测口径与实盘对齐,f214e2f只翻了live/paper链漏了回测) [nas]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 42s
CI/CD / nas-verify (push) Successful in 9s
你印象中改过的是6ecdaab#95标的池pool→all(三表单+后端四处),max_pool当时没动。本次三处对齐: PortfolioBacktest表单默认30→0+过时提示(「MVP验证用,默认30」)清理+routes_portfolio Field default=30→0(防API直调口径分裂,#95同款对齐法)。语义同全链:0=不限,策略层>0才截断。build绿+tests/api 165绿。
2026-08-24 20:54:56 +08:00
claude_dev 981b501bdd docs(data): get_security_info_batch docstring同步双seek终态——删'IN+GROUP BY走索引'旧描述(该假设恰为生产劣化计划根源) [vps]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 3s
2026-08-24 14:16:21 +08:00
claude_dev aafa5baa67 perf(data): min/max改逐对双seek——INDEXED BY批IN形态VPS实测仍不达标(30只冷8.1s/热0.25s,大池冷态分钟级),ORDER BY ±datetime LIMIT 1三列全等前缀每股恰2次寻位冷热皆毫秒级——上一发(80fc517)生产探针续测定形态:①原IN+GROUP BY劣化计划101s冷;②钉复合索引后计划翻转(TEMP B-TREE消失)但仍逐股扫全部interval条目(d+15m+5m),30只冷8.1s→momentum池~2000只外推冷态≈9min过不了<60s验收;③行值IN变体在本SQLite对(row-value IN+INDEXED BY)走全索引扫描7min不归(弃);终态=逐对双seek,symbol/exchange/interval三列全等直落d子区间两端,连15m/5m条目都不碰;无日线对不落minmax(下游.get默认(None,None)同旧GROUP BY语义);测试5个重写到seek API(双索引名/回退/EXPLAIN计划签名interval=?直落+无TEMP B-TREE/batch==逐只等价);628绿;待VPS探针终验双seek计时 [vps]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 1s
2026-08-24 14:14:11 +08:00
claude_dev 96a1e6b413 tools(ops): 存量max_pool 30→0迁移脚本(默认dry-run,--apply才动手,幂等)——策略session 08-24移交项#1准备件 [nas]
CI/CD / test (push) Successful in 3s
CI/CD / nas-deploy (push) Successful in 19s
CI/CD / nas-verify (push) Successful in 3s
真实盘点(只读): VPS prod=live_accounts全6行30+paper_accounts.strategies 6处JSON30(=影子实例);NAS=paper_accounts 1处JSON30,live_accounts空。
⚠️刻意排除backtest_stats.params里的3处30=历史回测运行记录,改写=伪造历史(JSON白名单只放paper_accounts活动配置面)。
⚠️执行铁律:只与数据session SQL治本(80fc517已落)+f214e2f同车,部署成功后、引擎重启前跑——池放大×慢SQL=更糟;迁移后重启引擎吃新值。
冒烟三态过:dry-run盘点/apply迁移(30→0两行,显式50保留,JSON只动max_pool键)/二次apply零行幂等+历史表原样。
2026-08-24 13:50:40 +08:00
claude_dev 3ec1375a1b fix(web): max_pool表单提示去「默认30」——f214e2f默认已翻0(0=不限),提示与新默认矛盾 [nas]
两处同型: live/New.vue + paper/New.vue。表单已自带0=不限提示语,无需另加占位(策略session建议的可选润色,实际缺口=过时文案)。
2026-08-24 13:50:40 +08:00
claude_dev 40908b51f8 fix(live): 市值改本地估值委托——开盘不再依赖盘中Capital下载(策略session 08-24移交P0)——实锤:开盘miniQMT Capital表下载常超时(代码注释自曝trading hours常超时)→close×total_capital=NaN→策略sort_values无操作保持代码序,平安银行(≈3800亿)混进small_cap买入清单。修=get_fundamentals_df组装后增Step3.5:_apply_local_market_caps把market_cap/circulating_market_cap优先委托self._unified.get_fundamentals_df(fields=两列,估值parquet EOD,亿元同单位,全池同一时点口径);单股本地缺(NaN/新股)保留xt Capital已算值,unified整体异常静默回退开盘永不挂;date=None传今天(EOD取最新≤今天);_fetch_close本就读xtdata本地缓存不动。+6测试(本地优先/补NaN/空回退/异常回退/NaN不清值/date=None传today);628绿。验收=部署后首个9:30 small_cap买入清单不再0000xx连号不含超大盘 [vps]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 38s
CI/CD / nas-verify (push) Successful in 10s
2026-08-24 13:49:24 +08:00
claude_dev 80fc517531 fix(data): get_security_info_batch SQL计划劣化治本——INDEXED BY钉死复合索引(运行时探测索引名)——策略session 08-24移交P0:VPS生产EXPLAIN实锤min/max批量SQL被选去单列idx_dbbardata_interval整扫~21M日线行+USE TEMP B-TREE(interval IN列表作废),30只冷跑101s=开盘选股38-51min主根因;复合唯一索引存在但无统计信息计划不选。修=SQL加INDEXED BY钉死(symbol,exchange,interval,datetime);索引名跨环境不同(ensure_schema长名/NAS副本merge_increment建uq_dbbardata)故sqlite_master运行时探测+实例缓存(哨兵区分None),探不到回退裸查询不劣于现状;GROUP BY(symbol,exchange)=索引前缀→TEMP B-TREE消失(测试EXPLAIN断言钉死);+5测试(双索引名/回退/计划签名/hint下batch==逐只等价);628绿。配套:今晚VPS/NAS库ANALYZE灌统计(建议a一并落地) [vps] 2026-08-24 13:49:24 +08:00
claude_dev 7a6e9c8c52 test(api): 修channel_test随启随验过时断言——实盘=单probe_all定时(启动+90s随墙钟),四时点改由无env直测钉死 [nas]
策略session 08-24移交项#2: test_facade_injects_run_daily_for_channel_test 在HEAD恒红,非flaky——原断言的9:35/10:45/13:45/14:30四时点是回测/无env路径;实盘(SANGUO_LIVE_STRATEGY置位)自随启随验(channel_test.py:78-84)只注册一个「启动+90s」的probe_all,时:分随墙钟(13:33/13:34/13:35三跑三变之源)。
修=断言随启随验设计:单probe_all+时刻落在[注册前+90s,注册后+90s]取分窗口(纯时刻比较防1900年日期陷阱,容忍跨午夜);新增无env直测(ChannelTestConfig(on_demand=False))钉死四时点路径,原断言价值不丢。
3跑稳定;tests/api 165全绿。
2026-08-24 13:49:21 +08:00
claude_dev f214e2f0e4 fix(live): max_pool 全链默认 30→0(0=不限)——08-24巡检定罪MVP限流泄漏生产,选股池=代码序前30只失真 [vps]
CI/CD / test (push) Failing after 12m2s
CI/CD / nas-deploy (push) Has been skipped
CI/CD / nas-verify (push) Has been skipped
根因(策略session 08-24 午休探针实证):runtime/live_strategy.py SANGUO_LIVE_MAX_POOL
默认30经env注入全部实盘+影子+paper实例,_stock_pool截断成份池为「代码序前30只」:
small_cap「全市场最小市值」实际在000001平安银行等30只固定代码里选(平安银行≈3800亿
出现在小市值买入=market_cap开盘NaN排序失效叠bug);momentum每行业RPS只在代码序前
30里排;value 0/30+零委托史同源。注释自曝「MVP验证用」=限流遗留泄漏生产,上线
首日起全部选股失真。

改动(9处默认位一致30→0;语义0=不限,与策略层max_pool>0才截断一致):
- sanguo_portfolio/live_strategy.py 适配器env默认+docstring
- sanguo_live/runner.py _portfolio_env_for(存量DB显式值不篡改,缺列/0→"0")
- sanguo_trader/shadow/supervisor.py 影子env默认
- sanguo_portfolio/runner_live.py live_env默认
- sanguo_trader/portfolio_paper.py + sanguo_api/routes_paper.py paper默认
- sanguo_api/routes_live.py create setdefault
- frontend live/paper New.vue 表单默认

测试:env mapping三态断言(缺列/0→"0",显式30不篡改)+live_env默认"0"
(RED→GREEN);CI范围642绿。存量实例DB仍存显式30,激活需配套DB迁移,必须与数据
session的get_security_info_batch SQL治本(101s→亚秒)同车部署——池放大×慢SQL=更糟。
2026-08-24 13:34:01 +08:00
claude_dev d575029788 docs: CLAUDE.md MCP权限注记更新——claude_dev已提权仓库owner(2026-08-22用户操作) [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 33s
CI/CD / nas-verify (push) Successful in 14s
旧注「MCP token 对仓库无 write 权限,dispatch 403,走 curl basic auth」已过时:
排查实证 token scope 本就齐全(write:issue+write:repository),真根因=claude_dev
协作者角色 read(Gitea 对 read 放行评论=有写权限的错觉来源);用户提权 owner 后
MCP issue_write 开/关往返实测通过(#7 开→关还原)。dispatch 预期同治(下次真实
「推vps」自然验证);cancel_run 404=版本无路由与权限无关。口令闸门铁律不变。
2026-08-22 23:02:03 +08:00
claude_dev 136d087b34 test(ci): CI扩跑tests/portfolio+钉死测试归一——issue#35方案B,440组合引擎题进门禁 [nas]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 2s
前置已消失:2197fea时点的13个Mac环境性失败,已被08-14 bullet_trade 0.9.2升齐+08-15补22个lock包
两次依赖治理顺带清零(本次实测440绿/1.74s,此前无人回头验收过);CI runner=本机Mac同venv310,本地绿即CI绿。

改动三件(不只加一行,用户点破冗余):
- 钉死测试迁至独立文件tests/portfolio/test_provider_method_surface.py:单一真相+保留
  fail-not-skip牙齿。原位置挂模块级requires_bullet_trade mark,conftest会在bullet_trade
  缺失时自动skip=钉死虚标(#35重演形态),必须移出mark覆盖面
- 删tests/data_platform/test_provider_method_parity.py(4aad65a方案A的复制版,
  「两处同步改」人工契约随之消亡)
- ci-cd.yml pytest行扩为 tests/data_platform tests/portfolio

验证:组合跑(CI同款命令)=617 passed/2 skipped/6.07s(177+440,副本删除-1,迁移+1);
conftest合并无冲突;钉死测试在新位置实跑通过。
2026-08-22 22:51:57 +08:00
claude_dev a58d9fd385 fix(ci): vps-deploy/workflow四雷根治(pipefail×3+ssh裸连+收尾非幂等+关issue不查gap)——issue#33基建工作包#1-#4 [nas]
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 3s
pipefail+SIGPIPE 三处(本机复现rc=141确定性,run724根因):
- L82端口释放检测被反转(最危险): netstat大输出|grep -q命中即提前退出→上游tr吃SIGPIPE(141)→pipefail判整管道失败→走||分支谎报「已释放」→下一步/run撞10048竞态
- L91 API等待循环同雷=run724死因: 检测恒假→120轮耗尽exit1→收尾三步全跳过
- L98 /docs探活同族(输出仅3字节几乎不触发,顺手修)
修法: grep -q 'x' → grep 'x' >/dev/null(读完整流不提前退出,无SIGPIPE)

workflow内裸ssh全量补 -o ConnectTimeout=20(对齐vps_restart_resident.sh写法):
单次ssh挂死原会让整步无限冻结; vps-deploy.yml 9处+ci-cd.yml 2处(NAS)

收尾三步抽幂等脚本 scripts/ci/vps_finalize.sh(工作包#2):
- run681/715/724三实录: 部署本体成功但收尾被前序步骤失败整段跳过,只能人工拼三段补
- 现在workflow尾步自动调; 被跳过时Mac本机手跑即补: GTOKEN=<token> bash scripts/ci/vps_finalize.sh <部署的sha>
- 常驻重启失败不阻断tag/issue记账(代码已就位,末尾非零退出提醒); tag -f+push -f天然幂等; issue按真实gap开/关

关issue按真实gap(工作包#3,2026-08-21事故):
- 旧代码硬编码VPS_LOG=""无脑关issue——用户dispatch填旧sha(f28f9cf≠be315a0)漏推P0后,gap非空也关→用户误以为推完
- 修=finalize算vps-deployed..origin/master真实gap,非空则issue保持open并列剩余清单
- gap改按subject算(--format='%h %s'|grep,与enforce-label同定义): --grep匹配整个message,commit body里引用的命令文本会误命中(曾误开issue#7); ci-cd.yml check-vps-needed同步改
- vps_pending_check.py: GITHUB_SHA缺失时回退VPS_DEPLOY_SHA(支持Mac手跑); 有上轮部署sha时body加「仍未上VPS」警示
2026-08-22 22:33:24 +08:00
claude_dev 4aad65aad9 test(ci): 方法面钉死测试复制进CI执行范围——issue#35方案A,ff05207「缺任一CI红」从虚标变成立 [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 35s
CI/CD / nas-verify (push) Successful in 14s
钉死测试(test_method_surface_no_gap_left)原在tests/portfolio/test_provider.py,
而ci-cd.yml pytest只跑tests/data_platform→CI从不执行=钉死虚标(issue#35)。
本commit把该测试逐字复制到tests/data_platform/test_provider_method_parity.py
(复制契约:两处同步改),CI 零改动零新依赖,其他测试零影响:
- 牙齿自检:bullet_trade不可用直接FAIL非skip(skip=环境劣化时钉死无声失效,
  重蹈#35;单测失败不中断同批其他测试)
- RED实证:给unified源码临时加假公共方法zz_fake_parity_gap→
  AssertionError「回测有实盘无:['zz_fake_parity_gap']」→还原复绿
- venv310按CI原样跑全套tests/data_platform:178绿(原177+新增1)
方案B(CI扩跑整个tests/portfolio,需先清13个Mac环境性失败)仍为可选增强,不阻塞
2026-08-22 20:54:32 +08:00
claude_dev 42894fe884 fix(nas): bs_5m --limit冒烟禁推chunk state——2026-08-22 09:17独立容器冒烟(--limit 3)实锤把state从2025-08-20多推到2025-02-18,[2025-02-18,2025-08-20]半年片被3只股'代表'5548只跳过(当日上午巡检发现:state mtime 09:17恰=冒烟时刻,窗口算术反推+代码链路三证合一);根因=limit_reached只盯DAILY_LIMIT配额防线(bs_5m_eod.py:220),--limit预截断列表后循环'正常跑完'lr=False,286行推进守卫畅通;修=chunk state推进闸门加not args.limit;+测试钉死冒烟不落state(Red复现→Green);NAS侧state两步手动补回(今晚23:5x→2025-08-20补跳过片,明晨完工后→2024-08-19跳过重跑);venv310全套177绿 [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 36s
CI/CD / nas-verify (push) Successful in 5s
2026-08-22 09:43:03 +08:00
claude_dev 329ad40dd7 feat(nas): 5m下载脱离主容器治本——DSM任务原docker exec进主容器跑,任何push→CI重启主容器=杀在跑的5m(08-20两案+08-22增量案三案实锤,系统性);修=独立一次性容器docker run --rm同镜像同tag(与现役容器sanguo_vnpy_v2:lock-aligned实证一致,CI部署自动跟踪版本),挂载与主容器完全一致,主容器重启永不波及;单实例锁/pid活性/state幂等全部沿用;DSM命令改一行:bash /volume1/stock/sanguo_5m/run_5m.sh;⚠️片宽183d维持不缩(45d小片同配额多跑4倍夜晚,容器解耦后已无暴露面问题,撤回此前缩片建议) [nas]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 28s
CI/CD / nas-verify (push) Successful in 4s
2026-08-22 09:15:41 +08:00
claude_dev ff05207f48 fix(provider): 实盘provider方法面全兜齐+CI钉死——用户拍板「不论有无消费方,统一堵光同款洞」:补最后两个裸名缺口①get_constituent(=get_index_stocks纯别名,对齐unified spec§6语义)②get_price_ex(转发base get_price xtdata成熟路径零新逻辑,签名/默认值对齐unified,fq默认'raw'而非base裸名'pre'保跨环境同语义);核心=新增方法面钉死测试:unified全部公共方法在SanguoMiniQmt(+MiniQMTProvider基类)逐一存在,缺任一CI直接红——「回测有实盘无」洞从巡检发现升级为结构性防住,未来unified加新公共方法必须同步实盘侧否则测试fail;+4测试(别名等值/转发参数含fq=raw钉/kwargs透传/方法面零缺口) [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 33s
CI/CD / nas-verify (push) Successful in 14s
2026-08-22 08:50:30 +08:00
claude_dev 27ed4b1416 fix(provider): 实盘SanguoMiniQmtProvider补get_limit_status_batch+get_value_metrics——2026-08-21策略session巡检实锤:方法缺失→实盘策略_get_limit_status getattr(...,None)静默返{}→filter_limitup/limitdown/paused全走'无数据保留'分支=实盘涨跌停/停牌过滤完全失效(涨停股照买/停牌股照挂单),回测LocalUnifiedProvider有此方法实盘缺,第5个同款洞。修=①历史日期(<今日,实盘主路径策略传previous_date,昨晚bs-daily已写昨日bar)委托self._unified同回测口径(prev_close×板块幅度+ST5%+volume==0判停牌,None条目语义原样透传);②当日盘中单次批量xtdata.get_full_tick拿lastPrice/lastClose,幅度复用_limit_pct板块感知(主板10/创业科创20/北交30/ST5),线程超时15s(2197fea开盘QMT忙挂死同款教训);③失败一律返'全清白map'(每code {False,False,False})而非{}——filter_paused对map内缺失code是剔除语义,返{}会全剔除(空转事故形态),全清白=只丢过滤不丢选股;tick缺code/价无效不猜停牌(宁错过不误杀)。另+方法面对照加固(策略session建议):diff两provider扫出get_value_metrics(+batch)同款洞(value_selection未入舰队=提前堵,委托unified三表parquet);get_price_ex/get_constituent裸名零消费不堵;+21测试(委托涨停/停牌/无bar/委托失败全清白/今日走tick/创业板20%钉/缺tick全清白非None/挂死超时/value_metrics四态) [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 46s
CI/CD / nas-verify (push) Successful in 23s
2026-08-22 08:37:56 +08:00
claude_dev cbf2db8069 fix(nas): sync_parquet.sh加互斥锁防周日双触发撕损——DSM id=6(周日04:00)当年配置即跑本脚本全量但从未实证(无parquet.log,当时标注待用户DSM UI确认命令),08-21又挂了sync_valuation_daily.sh周日钩子(~03:3x)同一脚本,两路若同日都触发=双scp -r并发写同文件撕损parquet;mkdir原子锁+>6h陈旧覆盖(单跑70min远不到)+trap EXIT清理,哪路先到哪路跑,后到skip留痕 [nas]
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 7s
2026-08-21 23:18:06 +08:00
claude_dev dc7ee632b9 fix(nas): NAS同步链补两个断更域+周日周更全量挂载——2026-08-21晚全域巡检实锤:每日链(dbbardata增量03:00/小表/events四类/valuation+financial_abstract 03:09)全绿,但①valuation_baostock(bs_eod每晚写pe/pb按年parquet)NAS断更自08-16②fundamentals_baostock(08-20新域,fund腿每晚回灌profit/dupont)NAS完全不存在,两域无任何同步器覆盖;③per-stock周更14子域(balance/cashflow/top_holders等,sync_parquet.sh 6.24G全量)从未被调度,仅08-16手动跑过一次,top_holders已漏VPS 08-16 18:18批次。修=扩展sync_valuation_daily.sh(每日实跑载体):循环外加valuation_baostock+fundamentals_baostock两域scp -r(MB级秒级,03:09时VPS写盘已静止,同款3次重试)+周日(date +%u=7)setsid脱离挂sync_parquet.sh周更全量(ak-weekly周六重写后周日兜底);sync_parquet.sh全量清单补fundamentals_baostock源+du对齐;bash -n过 [nas]
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 11s
2026-08-21 23:16:03 +08:00
claude_dev 2197feac33 fix(strategy): 实盘选股挂死根治——证券信息批量委托本地库替600次xtdata RPC + 选股阶段耗时日志 [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 46s
CI/CD / nas-verify (push) Successful in 14s
2026-08-21 实锤(live_19/shadow_60 同卡):momentum 9:30:06 buy_sign=True 后
47min 零输出被重启;small_cap 同型(fundamentals 超时120s后沉默)。channel_test
正常(不走走filters重取数)。value_selection/all_weather 月度未到期=零成交正常。

根因(VPS离场时段探针27s跑完全路径反推):filters.filter_st/filter_new 逐只
get_security_info,每只2次xtdata RPC(_detect_instrument_type+get_instrument_detail)
且无超时——momentum 10指数×30只×2过滤=600次RPC,开盘时段QMT忙时47min+不归;
provider无get_security_info_batch→filters._batch_security_info回退逐只(风暴路径)。

修法:
- SanguoMiniQmtProvider.get_security_info_batch:委托内部LocalUnifiedProvider
  (2条本地SQL替N×2次RPC,与78d35ba get_closes_panel/get_constituent_ex同款
  委托模式);失败/非dict返None→filters自动回退逐只(不崩策略);全部策略
  (aw/mom/sc/vs含_ex)经共享filters即时受益,影子/回测同速
- momentum/_ex+small_cap/_ex 选股段加阶段耗时日志(池预取/宽表/过滤3段,
  下个9:30若仍有卡点日志直接钉死位置)
- 遗留已报issue:SanguoMiniQmtProvider无get_limit_status_batch→实盘涨跌停/
  停牌filter静默失效(涨停股照买),归数据session按本地公式+单次批量tick根治

测试:+5(委托/失败回退None/非dict回退/filters消费批量零逐只RPC×2,__new__
绕过Mac无bullet_trade的构造raise);portfolio 380绿(13失败全=Mac缺bullet_trade
环境性,NAS CI过)

[vps]
2026-08-21 22:58:57 +08:00
claude_dev 1d754426cd docs: CLAUDE.md reload行适配任务重组——sanguo-bs-eod→sanguo-bs-daily(2026-08-20晚bs合并,18:05串行eod→fund),即刻让采集生效的命令同步换名 [nas]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 32s
CI/CD / nas-verify (push) Successful in 10s
2026-08-20 20:14:52 +08:00
claude_dev be315a0fd8 fix(live): P0 order_target_value执行层跨实例互卖根治——2026-08-20 14:06实锤#22探针otv(513030,0)(own仅100股)按引擎全账户target把#18的43,500股(~8.3万)一起卖了,当晚15:10恒等式如实报警(unattributed -83,346/-19.09%>0.5%);所有真实策略卖出全是同款写法(aw:191/409·mom:472·sc:392·vs:383),不修则9:30轮换同代码票必互卖——修法=facade层实例相对化(_instance_order_wrappers):有账本时otv换算 目标-持有 增量下显式股数单(买入差额/卖出硬顶own closeable,清仓允许零股尾巴,减仓整手化,可卖0一单不下·绝不卖别家),负order_value同款硬顶,正order_value买入不动;价格取get_current_data实时价,拿不到回退账本加权成本,双失效才透传引擎旧语义;无账本(回测/单测)原样透传行为零改动;+10测试(只卖自己恰好-100/P0原样复现own空再清仓零下单/T+1当日买closeable=0拒/半仓锁定只卖可卖600/加仓差额2400/减仓整手5000/负ov硬顶1000/正ov透传/无账本identity/价格回退avg_cost);portfolio 410绿 [vps]
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 8s
2026-08-20 20:05:33 +08:00
claude_dev f28f9cf308 fix(data): bs_eod挂死根治——login/logout纳入_with_timeout保护伞+中文系统运行判定三词修正。①根因(08-20 19:26实锤,日志形态逐字吻合):bs.login()打印success后仍有后续往返,baostock recv不遵守socket default timeout,主线程卡死在login内部recv(50min+零输出,连60s超时err都没有);fetch早已套_with_timeout但login/logout是裸调——relogin/login_once全部纳入(login60s/logout30s),超时按登录失败处理走既有重试链;②bs_fundamentals._is_running_text:中文系统实际输出「正在运行」不含连续子串「运行中」,原两词判定在中文VPS恒False=守卫恒fail-open(当晚若不禁用bs-fund将真撞车);三词都认+回归钉测试;③check_task_running.py通用探针(修复版)替换VPS上带同bug的check_bs_eod.py;+4测试(登录超时返False/relogin全程超时不raise/login与logout必经保护伞契约/正在运行判定) [vps]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 28s
CI/CD / nas-verify (push) Successful in 10s
2026-08-20 20:04:51 +08:00
claude_dev d4a1305714 chore(data): 23个VPS schtask XML备份入库(scripts/data_platform/legacy_tasks/)——2026-08-20数据任务重组删改前置铁律:删前XML备份;含①改名5对旧任务(sanguo-xt-eod/idx-eod/index/ak-stock/ak-quarter→源_频率命名,Actions/Triggers已验逐字一致)②将删的sanguo-bs-eod/bs-fund(bs合并手术用,bs-eod XML即sanguo-bs-daily克隆母版)③14残留(全部last-run≤2026-07-22已核验,breakdown:任务清单原写sanguo-daily-increment实为sanguo-bs-daily-increment真名已纠正)④ak-eod/ak-events现役快照(明天ak-eod改名用) [vps] 2026-08-20 19:58:24 +08:00
claude_dev 952cc5adf8 feat(data): sanguo-bs-daily单入口串行编排(bs_eod→bs_fundamentals)——2026-08-20数据任务重组阶段1:根治当日撞点(bs_eod加指数段后ETA 23:00+与旧23:05 bs-fund重叠=同IP双baostock连接封禁红线),合并进同一schtask两腿先后子进程,leg1进程退出(logout+消亡)连接才释放leg2才login;bs_daily_main只做顺序+退出码透传({0,3}=OK,3=按预算graceful不算失败)+[BS-DAILY]腿起止时间线日志(验收'eod logout后fund才login'直接证据);leg2无条件跑(leg1致命不连坐,连接已释放fund独立作业);wrapper传BS_DAILY_LIMIT=15000收紧eod病态重试硬顶(常态~11.1k不受影响,与fund30000合计≤45.1k<48k/IP/天);--smoke零配额链路自检;bs_fundamentals._bs_eod_running补注释:旧任务名已删探测必失败fail-open=设计行为勿修复(探新名会探到父任务永久让路);+15测试(顺序铁律/leg2无条件/退出码聚合9组合/smoke零子进程) [vps]
CI/CD / test (push) Successful in 18s
CI/CD / nas-deploy (push) Successful in 39s
CI/CD / nas-verify (push) Successful in 14s
2026-08-20 19:49:00 +08:00
claude_dev d54f648efc fix(web): 监控页列宽四修(用户验收08-20)——①本策略持仓(实例账本):新增『数量(可用)』列(=总持仓−冻结,T+1可用股数直读),标的100→90,总持仓/冻结/均价同步收紧②今日成交/全部成交两表:时间160→150定宽,策略160→110(超长省略号悬浮),标的100→90——挤出~120px,治后列折行③账户实况-实例分解:实例180→140+省略号悬浮④账户持仓(QMT全账户):标的110→90;npm run build绿 [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 33s
CI/CD / nas-verify (push) Successful in 13s
2026-08-20 13:33:13 +08:00
claude_dev b436adef1b fix(live): 成交时间1970守卫——08-20探针首日实锤9笔traded_at=1970-01-01 00:00:01(QMT原始时间经引擎pd.to_datetime失败形态落epoch),前端『今日成交』按日期过滤全空+账本trade_date失真(当日仓被当历史仓,T+1视图frozen=0);修=_effective_trade_time守卫:年份<2000一律回退当前时刻(归因轮询≤60s,日期误差仅跨日60s窗口);+2测试(1970回退当日记账且frozen生效/有效时间原样保留);附带已治疗VPS存量9行(从引擎日志按标的+数量回填13:03/13:05真实时刻,#18今日成交即时可见);portfolio 29+398绿 [vps] 2026-08-20 13:32:54 +08:00
claude_dev 2191160dda docs(factor): 因子库全景调查报告——因子调研session起步(C起步)——①本地盘点:sanguo_factor管线齐(注册表+alphalens评估+web API)但仅7个基础因子;vnpy自带Alpha101完整表达式(100个,零移植)+Alpha158(qlib同款)+46算子全覆盖;接入缺口=vwap派生列/AlphaLabSession 50股缓存上限/批量吞吐②聚宽250+因子全清单(官方文档直读):风险模型(Barra式10风格+21描述+16 PRO)+基本面136(质量70/基础41/成长10/每股15,等P2回灌)+量价104(随时可做);结论=值不买(试用拿不到近3月+2026-08起海外IP封),公式目录本地复刻;jqfactor_analyzer(MIT)可白嫖③行业:GTJA191公式全公开187/191可自算;QuantsPlaybook(5851★)研报复现入口;aurumq-rl(MIT)polars同构工程范本(296+11 A股私有因子族);Tushare 202因子公式全公开④四批路径:101+158现在→GTJA191+聚宽量价→聚宽财务(3周后)→Barra风格;行业中性=IC数据说话后再决策 [nas] 2026-08-20 13:22:13 +08:00
claude_dev 61421de1d9 chore(data): bs_fund_wrapper.ps1——sanguo-bs-fund schtask 23:05 wrapper(镜像 bs_eod_wrapper:清代理直连铁律+迁移日志目录+退出码透传),跑 baostock 季频财务+业绩报告(bs_fundamentals.py,数据session P1+P2+P3);wrapper 随本commit进repo,schtask 当场在VPS建(23:05,SYSTEM/HIGHEST,同bs-eod参数),run707已部署脚本本体 [vps]
CI/CD / test (push) Failing after 12m55s
CI/CD / nas-deploy (push) Has been skipped
CI/CD / nas-verify (push) Has been skipped
2026-08-20 12:58:20 +08:00
claude_dev 147a49d781 feat(strategy): channel_test随启随验探针模式(用户拍板2026-08-20:开盘窗口不再是验证瓶颈,随时启动随时验全场景)——on_demand=None自动:LiveEngine进程(supervisor注入SANGUO_LIVE_STRATEGY)→启动/重启后~90s经facade.run_daily注册probe_all打一轮全场景;必须走facade注册而非直接调用:回调才收到B2包装的代理context(实例预算视图),绕过它探针测不到定寸虚拟化;影子柜台24h可验(收盘价撮合),实盘闭市下单被QMT拒亦属验证项(决策层输出已在日志);重启实例=再验一轮;[PROBE-0]实例视图快照(cash=预算切片非全账户=B2生效标志)/[PROBE-1]rotate主调仓定寸=实例视图等权/[PROBE-2]只卖自己(卖出对象全部来自own账本,对照前端账户实况实例分解)/[PROBE-3]T+1当日买立即卖应拒(冷启动空仓跳过,第二轮起有票)/[PROBE-4]swap_one资金复用;回测/单测无env维持四时点旧行为,显式True/False覆盖;+3测试(env下仅注册1个未来~90s的probe_all/显式off保四时点/probe_all全序列下单断言);旧四时点测试补delenv防环境串扰 [vps]
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 15s
2026-08-20 11:41:56 +08:00
claude_dev e7c5defe64 fix(live): runtime副本孤立加载ImportError根治——2026-08-20晨12引擎崩溃循环事故(6实盘+6影子自建队07:10起每60s崩,当日0成交,9:05/9:30/9:35全未触发)——根因=live_strategy.py台账/B2两行相对导入(from . import live_instance_ledger/from .live_portfolio_proxy):文件被_instance_adapter逐字节复制到runtime/<实例>/后bullet_trade以顶层模块加载(无包上下文)→ImportError;测试全绿盲区=测试以包成员导入相对导入合法,生产孤立加载才崩,nas-verify不启引擎——修=改绝对导入from sanguo_portfolio import(引擎进程项目根在sys.path,同文件其它绝对导入生产已验证可跑);抽_ledger_tools()单函数两种加载上下文单测直打;+3测试(孤立副本顶层import_module复现事故点/包内上下文/静态禁from .回潮);_instance_adapter启动时内容比对自动重拷→VPS落地后下轮引擎重启自愈免手工清runtime;顺手修2个日期硬编码测试(proxy fixture与snapshot的trade_date=2026-08-19→动态今天,当日买入跨日T+1断言必翻红,CI不跑此套件故昨日未暴露);portfolio 398绿 [vps] 2026-08-20 11:41:47 +08:00