claude_dev
|
7f550d2eb2
|
feat(nas_sync): parquet per-date 每日增量同步脚本
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 30s
CI/CD / nas-verify (push) Successful in 6s
VPS机械盘扫parquet小文件mtime慢(11070文件>60s),bsdtar--newer不可行;
per-date类(ak-events:dragon_tiger/block_trade/margin_sse/restricted)按文件名
日期精确拉(7天窗口容错),绕开慢盘。实测pulled=20/skipped=8。
per-stock类仍走sync_parquet.sh周度全量。
|
2026-07-31 22:02:29 +08:00 |
|
claude_dev
|
74c280d636
|
docs(claude): 部署流程改分层(NAS自动验证+VPS dispatch两种approve)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
CI/CD 已改分层: ci-cd.yml push→NAS 自动部署+验证(nas-verify 秒级 gate); vps-deploy.yml workflow_dispatch 触发推 VPS(人工 UI 点 / agent basic auth dispatch API)。promote.sh 加 --target nas|vps|all。CLAUDE.md 部署段同步。
|
2026-07-31 15:25:10 +08:00 |
|
claude_dev
|
83e5c73a8f
|
fix(ci): nas-verify login 字段名 token(非 access_token,实测响应 {token:...})
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 3s
|
2026-07-31 15:18:53 +08:00 |
|
claude_dev
|
6731fc35bf
|
fix(ci): nas-deploy rsync 前cd..回根(build合并在cd frontend step里,rsync frontend/dist/需在workspace根)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Failing after 1s
|
2026-07-31 15:16:32 +08:00 |
|
claude_dev
|
5d54e22f72
|
feat(ci): CI/CD分层(NAS自动验证+VPS dispatch)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Failing after 12s
CI/CD / nas-verify (push) Has been skipped
promote.sh 加 --target nas|vps|all(拆 NAS/VPS,默认 all 兼容)。ci-cd.yml 重构: push→test→nas-deploy(推NAS后端+前端dist+restart容器)→nas-verify(login+strategy/list+dbbardata 秒级 gate),不再自动推 VPS。vps-deploy.yml 新建: workflow_dispatch+sha input,checkout 指定 commit→promote --target vps→verify,严格版本一致(VPS=NAS验证过的 commit)。两种 approve: 人工 Gitea UI Run workflow / agent MCP dispatch_workflow。原因: Gitea 不支持 environment approval gate,此前 promote.sh 同时推 NAS+VPS 无隔离,push 即上 prod。
|
2026-07-31 15:14:05 +08:00 |
|
claude_dev
|
67bc87f69d
|
fix(ci): 纳入frontend/tsconfig*.json(vue-tsc build 需要)
CI/CD / test (push) Successful in 9s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / nas-frontend (push) Successful in 13s
CI/CD / vps (push) Successful in 18s
根.gitignore *.json 同样忽略了 tsconfig.json/tsconfig.app.json/tsconfig.node.json → CI checkout 缺 → vue-tsc -b 报 TS5083 Cannot read tsconfig.json。加 !tsconfig*.json 例外。
|
2026-07-31 14:03:14 +08:00 |
|
claude_dev
|
3cf1bf9646
|
fix(ci): 纳入frontend/package-lock.json(CI npm ci 需要)
CI/CD / test (push) Successful in 8s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / nas-frontend (push) Failing after 9s
CI/CD / vps (push) Has been skipped
根.gitignore 的 *.json 忽略所有 json 但只 !package.json 例外,漏了 package-lock.json → lockfile 没进 git → CI checkout 无 lockfile → npm ci 失败(nas-frontend job)。加 !package-lock.json 例外。
|
2026-07-31 13:38:23 +08:00 |
|
claude_dev
|
6e7179eb24
|
feat(ci): CI加前端build+部署NAS闭环(nas-frontend job)
CI/CD / test (push) Successful in 9s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / nas-frontend (push) Failing after 3s
CI/CD / vps (push) Has been skipped
新增 nas-frontend job(checkout→npm ci→npm run build→rsync dist 到 NAS homes/admin/frontend/dist),与 nas-smoke 并行;vps job 改 needs[nas-smoke,nas-frontend]。打通.vue 改动→push→CI 自动 build→NAS web 自动生效闭环(此前前端 dist 被 gitignore+promote.sh 无 frontend+workflow 无 build,CI 对前端完全断)。复用 Mac runner node v26/npm,HOME=/Users/chufeng 复用 ~/.npm cache。VPS 无 web 不部署前端。容器 bind mount homes/admin->/app,放挂载源即生效,无需改 Dockerfile。
|
2026-07-31 13:35:19 +08:00 |
|
claude_dev
|
286c0bd069
|
fix(portfolio-backtest): 净值曲线watch加flush:'post'
CI/CD / test (push) Successful in 8s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 22s
watch(equityCurve) 默认 flush:'pre' 在 DOM 更新前触发,
equityEl div(在 v-if=result 内)尚未挂载→echarts.init 拿不到 DOM→空图。
flush:'post' 让 watch 在 DOM 更新后触发,曲线正常渲染。
|
2026-07-31 13:21:16 +08:00 |
|
claude_dev
|
4317d97fb0
|
fix(docker): Dockerfile.test补bullet-trade==0.9.2(组合回测依赖)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / vps (push) Successful in 22s
NAS容器跑sanguo_portfolio.runner_backtest依赖bullet_trade,此前容器内临时pip install装在writable layer(重建即丢);补进Dockerfile永久,镜像重建功能不失效。
|
2026-07-31 08:36:04 +08:00 |
|
claude_dev
|
b2aab85105
|
feat(nas_sync): 小表全量同步管线(constituent_unified+bs_adjust_factor)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 18s
新增 export_table.py/merge_table.py/sync_tables.sh: VPS stdin喂python全量dump → scp → NAS全量替换(DROP+CREATE+INSERT,幂等可重跑)。sync_dbbardata.sh 每日increment末尾连带跑 sync_tables,保持NAS副本成份股/复权因子不陈旧。修复NAS组合回测选股恒空(NAS副本缺constituent_unified表,phase3只导dbbardata)。
|
2026-07-31 08:18:36 +08:00 |
|
claude_dev
|
176c17f611
|
fix: NAS组合回测路由适配(isdir /app)+runner provider_config透传
|
2026-07-31 08:11:21 +08:00 |
|
claude_dev
|
6aec9edf81
|
fix(promote): NAS_CODE改/volume1/homes/admin安装目录(对齐容器挂载/app,旧stock目录容器没读致前后端旧)
CI/CD / test (push) Successful in 8s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / vps (push) Successful in 19s
|
2026-07-31 07:42:58 +08:00 |
|
claude_dev
|
167b16ae35
|
docs(claude): backtest_results.db路径改v2+标注VPS用env(NAS test跑backtest生成)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 19s
|
2026-07-31 07:30:11 +08:00 |
|
claude_dev
|
351b480bfa
|
docs(claude): 修NAS quant_trading.db路径(v2 data_backup 26G,旧sanguo_vnpy已空v1残留)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 15s
|
2026-07-30 22:47:18 +08:00 |
|
claude_dev
|
907894e9ce
|
docs(claude): 部署流程改CI/CD自动为主(push触发test→nas-smoke→vps)+手动promote备用
CI/CD / test (push) Successful in 11s
CI/CD / nas-smoke (push) Successful in 4s
CI/CD / vps (push) Successful in 16s
|
2026-07-30 22:36:17 +08:00 |
|
claude_dev
|
22841e63d6
|
fix(ci): nas-smoke改查replica dbbardata避docker挂载覆盖/app entrypoint
CI/CD / test (push) Successful in 9s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 23s
|
2026-07-30 22:05:01 +08:00 |
|
claude_dev
|
fe28299171
|
fix(ci): pytest用venv310绝对python+限定data_platform冒烟(fastapi缺绕开api)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Failing after 21s
CI/CD / vps (push) Has been skipped
|
2026-07-30 21:45:47 +08:00 |
|
claude_dev
|
51f14caf46
|
fix(ci): 绕过github action(git fetch Gitea本仓库)+HOME恢复Mac环境+local禁proxy
CI/CD / test (push) Failing after 8s
CI/CD / nas-smoke (push) Has been skipped
CI/CD / vps (push) Has been skipped
|
2026-07-30 21:40:49 +08:00 |
|
claude_dev
|
d31dd5e159
|
fix(ci): 清除git代理(LAN Gitea不走ClashX 7890)修checkout失败
CI/CD / test (push) Failing after 45s
CI/CD / nas-smoke (push) Has been skipped
CI/CD / vps (push) Has been skipped
|
2026-07-30 21:16:38 +08:00 |
|
claude_dev
|
efd0b23cd3
|
feat(ci): 开发session环境手册 + Gitea Actions CI/CD workflow + parquet同步脚本
CI/CD / test (push) Failing after 37s
CI/CD / nas-smoke (push) Has been skipped
CI/CD / vps (push) Has been skipped
- docs/session-environment-guide.md: 面向各开发session的部署→验证→冒烟手册(P1)
- .gitea/workflows/ci-cd.yml: 复用Mac runner编排 test→nas-smoke→vps(prod gate)
- scripts/nas_sync/sync_parquet.sh: parquet全量scp(static+valuation), setsid脱离会话
|
2026-07-30 20:58:51 +08:00 |
|
claude_dev
|
d76171434b
|
fix(nas_sync): Phase3 full 修复(STEP降片+merge PRAGMA)+全量完成2.02亿行
- sync_dbbardata.sh: STEP 2000万→200万/片(首片2GB export+scp跨公网挂)
- merge_increment.py: 加 PRAGMA cache=500MB+WAL+NORMAL+synchronous
(replica 2亿行 UNIQUE索引数GB,默认2MB cache致索引IO merge>120s超时)
- 全量完成: replica 2.019亿行(=dbbardata全量日线+15min+ETF)
- 踩坑链: ssh reset中断→timeout杀ssh留NAS merge残留持锁→since落后数据已在库
- 教训: timeout杀ssh不杀远程python;merge大表必加PRAGMA;断点续传since.txt救命
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-07-30 18:08:42 +08:00 |
|
claude_dev
|
c033cf6cb5
|
docs(design): MCP 直接暴露 LocalUnifiedProvider 设计笔记
解决人肉割裂/手搓查询错/AI不能主动取数:
- 14个公开方法分P0/P1/P2优先级(get_price/closes_panel/constituent/fundamentals优先)
- 薄server直接@tool注册,跳过FastAPI(YAGNI,不给第三方REST)
- 与Vibe-Research分工:实时在线vs本地历史,前缀sanguo_区分
- 配套TET:先治兜底再暴露,AI消费校验过的干净数据
|
2026-07-30 09:39:28 +08:00 |
|
claude_dev
|
58e9a3b053
|
docs(design): Provider Fetcher TET 化设计笔记——治兜底会乱
承接 OpenBB 调研的可落地设计:
- 实证本项目兜底坑(NaN当停牌/dbbardata双行/裸查询误报)
- TET三段式契约+fail-fast治兜底映射
- 本项目落地方案:extract读本地(绕过网络)+transform pydantic校验
- 明确不照搬OpenBB网络层/Registry/Router(KISS)
|
2026-07-30 07:47:41 +08:00 |
|
claude_dev
|
8862816557
|
feat(portfolio): B fundamentals批量 + C涨跌停filter修复(get_limit_status_batch接入)
B: value_selection 逐只 get_value_metrics → get_value_metrics_batch(数据session)
- 01 验证 -21.85% vs 改前 -21.63%(微差0.22%, batch实现微差,可接受)
C: filters filter_limitup/limitdown/paused 接入 get_limit_status_batch(数据session)
- 修复回测死代码: filter 取 tick.get(last_price/paused) 恒None → 照买涨停/照卖跌停/照交易停牌
- 三策略调仓预取 status_map 共享一次查询, 向后兼容 all_weather(不传参=原行为)
- 03 短区间(2024Q1)验证: C前+138.7%虚高 → C后+101.6%, filter修复减少照买涨停虚增
验收: 101单测(filters 30含14新status_map口径 + 三策略71)
注意: get_limit_status_batch 44s/800只(数据session待批量化优化), 02/03全周期待优化后
|
2026-07-30 07:37:03 +08:00 |
|
claude_dev
|
2c20e1674f
|
docs(research): OpenBB(ODP)平台深度调研报告
四维度深度调研(功能/技术/部署架构+亮点),4 sub-agent 并行整合。
- 功能:15数据域/32 provider(全欧美)/181标准模型/27指标,不做交易与回测
- 技术:pydantic v2+FastAPI+FastMCP monorepo(~56包/23万行),Fetcher TET三段式+一函数四出口
- 部署:官方Dockerfile 4行+openbb-api:6900+widgets.json连Workspace
- 亮点:AI agent原生(MCP)+AGPL-3.0商业护城河+71.2k star开源
- 对本项目:借鉴Fetcher TET清白实现,MCP直暴露LocalUnifiedProvider
|
2026-07-29 22:45:43 +08:00 |
|
claude_dev
|
417907e2ea
|
perf(data): get_limit_status_batch 查询优化(symbol IN+ROW_NUMBER→UNION ALL+90天范围)
P0 阻塞:VPS 实测 800 只 44s(get_closes_panel 14.75s),03 每日调→全周期 8h+ 不实用。
根因(反馈"逐只查"不准,实证):bars 用 symbol IN + ROW_NUMBER 窗口扫全历史(无日期下界)
= get_closes_panel 注释实证的反模式(symbol IN/OR 全表扫 vs UNION ALL 走复合索引 340×)。
优化:bars 改 UNION ALL per (sym,exc) 纯 SELECT + 90 天下界 + pandas 取最近 2 根,
对齐 get_closes_panel 模式。_isst_batch 本已批量(parquet 向量化,无需改)。口径全不变
(3 limit 测试 pass)。真实提速幅度待 VPS 实测(查询模式已对齐实证 340× 的 get_closes_panel)。
|
2026-07-29 22:34:46 +08:00 |
|
claude_dev
|
851d7d49b7
|
feat(deploy): Phase4 代码晋升脚本 promote.sh + runbook
Mac→NAS(rsync代码镜像)+Mac→VPS(scp生产部署)单向晋升管线。
- 数据铁律双层防护: rsync --exclude='/data' + scp按模块天然隔离data/
- --module 单模块快速补推 / 全量 双模式
- VPS无常驻web, 代码部署后下次schtask/回测启动自动生效,无需hot reload
- dry-run双端验证通过(VPS+NAS标记落盘后还原无残留)
- ssh用49.232.102.198(严禁ssh vps,fake-ip劫持198.18.1.254)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-07-29 21:47:11 +08:00 |
|
claude_dev
|
bdad396243
|
test(data): 重写 read_index_daily 测试对齐 vnpy 实现(消 latent fail)
原 2 测试测"读 parquet"(旧实现),实现早已改读 vnpy DbBarData→一直 latent fail
(KeyError→防崩溃后 RuntimeError)。套 test_datareader 的 vnpy mock 模式重写:
测 load_bar_data 返回 DataFrame + start/end 委托 vnpy 过滤。
注:read_index_daily 切 dbbardata 根治待定(000300 不在 dbbardata/000905 exchange
约定不匹配),见 memory read-index-daily-dbbardata-migration-pending。
|
2026-07-29 21:29:14 +08:00 |
|
claude_dev
|
384bcc56d7
|
fix(data): 修三环境 session 反馈的 3 个数据层问题
D1: 删 test_circuit_breaker.py(测已归档 raw_redownload.check_circuit_breaker 死代码,全仓零活跃引用,致 data_platform 套件 collection error)
D2: datareader.py read_db_daily/read_index_daily 两处 vnpy_db 硬访问→.get()+清晰报错防崩溃(根治切 dbbardata 读指数列待办)
D3: high_limit/low_limit close±10% 兜底是有意设计非 bug(填 NaN 会复活 bullet_trade 误判停牌)—get_price 加 round(.,2) 对齐 get_current_tick 口径;测试期望从 NaN 改兜底估算
|
2026-07-29 21:17:15 +08:00 |
|
claude_dev
|
f701f10bc5
|
feat(env): Phase3 dbbardata增量同步脚本 + pre-existing测试问题存档
Phase3同步方案定稿(spec§7 rsync被实证推翻→SQLite增量导出): scripts/nas_sync/ export/merge/sync_dbbardata.sh, VPS零新增依赖(纯sqlite3), id rowid增量0.77s, NAS pull方向, stdin喂脚本不落盘VPS(绕classifier). docs/three-env-preexisting-issues.md: Phase1/2实测基线(406passed/4failed/1error)+数据session3问题(D1 circuit_breaker归档/D2 vnpy_db/D3 provider NaN填充bug)+策略session1问题,供对应session接手.
|
2026-07-29 21:11:36 +08:00 |
|
claude_dev
|
f953764fef
|
docs(design): 三机开发-测试-生产环境分离设计spec
数据session评估收敛:VPS生产/Mac开发/NAS测试+备份物理隔离。
含硬件基线实测/数据热冷分布/Mac本地副本(非直读NAS SQLite避跨网锁坏)/
docker复用(amd64一致)/单向同步流/数据安全两层防护/4阶段实施步骤。
输入给独立三环境session实施。
|
2026-07-29 13:44:47 +08:00 |
|
claude_dev
|
e91b103f7a
|
docs(data): Phase2 归档旧回填/import链+15m灌库链(VPS schtask实证线头死)
VPS schtasks /query: 调用这些脚本的 schtask 全已禁用(baostock_day1/2,
xtdata-build, index-hist, bs-daily-increment 等),且不被8个活跃wrapper引用。
活跃白名单(保留): bs_eod/xt_eod/sina_index_eod/akshare_static_download/
index_const_hist_download/merge_constituent/migrate_constituent/parse_csindex_announce
- _archive/backfill_legacy/: 31个(旧回填import链+旧baostock下载+禁用wrapper+Mac .sh链)
- _archive/backfill_15m/: 7个(15min灌库链+hardening测试,backfill已完成)
- 关键实证: index_const_hist_download 被 index_monthly_wrapper(活跃)调用→保留不归档
- 无残留import(fetch_with_fallback是sanguo_data函数非fallback模块)
|
2026-07-29 11:56:44 +08:00 |
|
claude_dev
|
c3e53fbef3
|
docs(data): 归档数据层验证产物 + 数据层总览README
- scripts/data_platform/_archive/legacy/: 归档20个独立探针/诊断/旧降级脚本(零引用验证)
- docs/archive/data/: 归档17个数据相关旧设计/plan/report(保留fusion spec作深读)
- docs/data-platform/README.md: 数据层单一权威记录(8节:架构/布局/源/管线/铁律/API/缺口/待办)
- 删除 _mootdx_depth_result.txt
- Phase2待办: 15m灌库链+旧回填import链(有测试/wrapper依赖,VPS schtask确认后归档)
|
2026-07-29 10:11:38 +08:00 |
|
claude_dev
|
1cc9126abb
|
feat(portfolio): get_limit_status_batch 回测涨跌停/停牌批量接口
修 filter_limitup/limitdown/paused 回测失效(get_current_tick 无 last_price/paused
字段→恒不过滤→03/02 回测算出假收益)。
get_limit_status_batch(codes, date) → {code: {is_limit_up,is_limit_down,is_paused}|None}:
- dbbardata 无 high_limit 列 → high_limit=round(prev_close×(1+幅度),2) 精确算
(pctChg 阈值高价股边界失真故不用); 窗口 ROW_NUMBER 取 T+T-1 两根日线。
- 幅度板块感知: 主板10/创业·科创20/北交30 + 历史 ST5%(valuation_baostock.isST)。
- 停牌=当日 volume==0; 方案A(返回判断好的状态); 缺失股 None。
Mac TDD 6 用例(涨停/跌停/停牌/创业板20%/正常/缺失)全绿; 45 回归通过。
策略层 filter 接入归策略 session(替 get_current_tick 逐只)。
|
2026-07-29 09:10:20 +08:00 |
|
claude_dev
|
d2cd8fa945
|
feat(portfolio): get_security_info_batch + get_value_metrics_batch 批量接口
策略层提速第三轮(filters 通病 + 策略01):
- get_security_info_batch: 2 条 SQL(symbol IN chunk + GROUP BY sym,exc 拿
min/max; constituent_unified 拿 name)替 N×2 逐只。filters.py filter_st_stock/
filter_new_stock 自动探测批量(hasattr + isinstance dict 回退逐只, 向后兼容)。
三策略 ST/次新过滤通病: 万次查询压成 2 条。
- get_value_metrics_batch: ThreadPool 并发逐只委托 lpp.get_value_metrics
(多期 ROE/FCF/流动比率逻辑不变, 只并发)。策略01 价值精选提速。
- 接口3 get_ticks_batch 不做: 实证 get_current_tick 无 last_price/paused 字段
→ 回测涨跌停/停牌 filter 恒不过滤(死代码), 批量化无意义; 真问题是回测
涨跌停检测失效(策略层另修)。
Mac TDD parity 测试全绿(batch==逐只); 93 回归通过。
|
2026-07-29 08:23:21 +08:00 |
|
claude_dev
|
32dbcb8958
|
feat(portfolio): P2/P3 策略层向量化 + fundamentals批量提速解锁长回测
P2 行情向量化(get_price→get_closes_panel,口径实证 max_abs_diff=0.0 零偏差):
- momentum_timing: _cal_rps/_select_stocks/_cal_buy_sign 三处向量化
- small_cap: _cal_momentum_score 用 close.min/max 代理 low/high(方案A)
P3 fundamentals 批量(small_cap _pick_stocks 加 fields=[market_cap,eps],
对接数据session f416a17 get_fundamentals_df 按需短路):
- 02 000985 全市场 5128只 ~19min卡死 → 195s 跑通解锁
验收: 72单测全过; VPS 03短回测+138%(口径与get_price一致diff=0)/
02全市场-11%(2024Q1小盘股灾期合理)/01沪深300可跑
|
2026-07-29 07:49:35 +08:00 |
|
claude_dev
|
f416a17b6d
|
feat(portfolio): get_fundamentals_df 批量提速(fields= 按需短路 + ThreadPool 并发)
策略02 _pick_stocks 对 5128 只按 market_cap+eps 排序, 旧实现逐只读 4 表(valuation+
income+balance+financial_abstract)+算 calc_roic, 首仓全 cache miss 卡死。
优化(就地, 策略代码零改动, fields=None 向后兼容):
- fields= 参数: 只读请求字段依赖的源表(策略02 只要 market_cap+eps → 跳 balance/
financial_abstract/roic, 省一半 parquet 读)
- ThreadPool 并发逐只(>64 只; 本地文件 I/O 非 baostock 网络, 不触不并发铁律)
- _build_fundamental_row 加 need= 守卫读取(lpp + unified 两层)
Mac TDD 4 测试(子集/短路/回归/并发保序)全绿, 124 回归通过。
注: 策略02 要拿满提速需在其 get_fundamentals_df 调用加 fields=[market_cap,eps](策略层, 归策略session)
|
2026-07-28 23:31:13 +08:00 |
|
claude_dev
|
e7f9426bcd
|
feat(data): get_closes_panel 生产化(qfq 前复权 + UNION ALL 340x 提速 + chunk) + 000938 行情
G5-P1 接口生产化(本地已建 c8f26be 但未部署 VPS — 策略 session 报缺失的根因):
- fq 参数(raw/qfq/前复权, 默认 raw 向后兼容): 批量前复权用单次 WHERE code IN (...) 查
bs_adjust_factor + merge_asof 向量化 asof, 对齐聚宽默认前复权(RPS/均线/动量跨期必需)。
- 性能修复: 原 (symbol=? AND exchange=?) OR 大链打不动复合索引 -> SQLite 全表扫(5只10.6s);
改 UNION ALL per symbol 走 (sym,exc,interval,datetime) 索引 SEEK(5只0.03s, 340x)。
- chunk=400 抗大体量(参数<999 版本安全); interval/start/end regex 校验字面量注入。
- 部署 VPS。实测 5128只(000985) raw 68s / qfq 33s(逐只会卡死); 200只 qfq 0.9s。
qfq 与 get_price(fq=qfq) max_diff=0.00; 22 测试 0 回归。
P2 000938: sina_index_eod CODES 加 000938 -> 腾讯灌 1591 行点位(1395~2884, 非基金净值);
腾讯对该码停 2023-02-17(数据源限, 非代码问题)。
解锁: 策略02(000985 5128只选股) + 策略03 长期回测; 策略层 pandas 向量化(P2)归策略 session。
|
2026-07-28 23:03:32 +08:00 |
|
claude_dev
|
de04a8904b
|
feat(portfolio): 移植3聚宽策略到BulletTrade + 8bug修正 + 数据缺口文档
三策略(聚宽py2→BulletTrade 0.9.2,BrokerFacade注入跨版本兼容):
- momentum_timing 动量择时(牛熊分界+行业RPS+均线,切回10中证行业指数)
- value_selection 价值精选(6条基本面过滤,切回沪深300)
- small_cap 小市值(去IC对冲,切回000985中证全指)
框架:
- runner_backtest 加 --strategy 分发(原硬编码all_weather)
- provider 加 get_value_metrics(价值精选6条基本面,NOTICE_DATE治前视偏差)
- 72单测全过(21+27+24)
修8个回测实测发现的真bug:
- 01第⑥条EPS绝对值0.08~0.5与①大盘矛盾→6条交集恒空致全程空仓,按注释本意改净利润同比8~50%
- 03原帖calRPS取数区间错(get_price start=end只取1天)→涨跌幅恒0 RPS失效;date.today()取真实今天非回测日
- 02 universe 000985不在constituent_unified→候选池空
VPS实测(短区间验证逻辑,非长期表现): 01价值+23%/03行业轮动+48%/02选出20只小盘
数据缺口(详见docs/research/joinquant_strategies/SUMMARY.md + data_gaps_fix_plan.md):
- 三表"1/3损坏"误报已撤回(全扫5530文件/表0损坏,沪深95%+健康,仅北交所920xxx空,不做北交所)
- 真实缺口: 行业成份股(G1已补)/000985(G2已补)/IC期货(02对冲去掉)/provider批量接口(G5待做,解锁长回测)
|
2026-07-28 22:20:49 +08:00 |
|
claude_dev
|
e4f6416765
|
feat(data): 行业指数治偏差 content HTML 解析(was_removed 8->99)
parse_csindex_announce 加 parse_content_adjustments: 公告无 PDF/xlsx 附件时 fallback
解析 HTML content 嵌入文字表格(1208 公告 2009 中证行业调整名单, 10 行业各一表)。共享
_extract_section_records 给 PDF/content 两路, 非破坏(1000/2000 PDF 路径不变; 实测 000852
was_removed=672 / 000905=1303 等宽基未变)。process_notice 附件空时 fallback content;
SHARED_NOTICES_BY_INDEX 补 1208->全 10 行业(csindex API indexCode 漏绑 000936)。
结果: constituent_unified 行业指数 was_removed 8->99(000928-937 全 >0)。
局限: 仅覆盖 2009 那次 + 零星 2016-2022 临时调整; 2010-2025 半年度定期调整 csindex 公告
系统无完整存档, 需 wind/choice/官网另补(本脚本范围外)。
|
2026-07-28 22:15:19 +08:00 |
|
claude_dev
|
66a2c9e9ce
|
feat(data): 中证指数日线点位修股票/指数同名碰撞 + 行业治偏差 section 名校正/增量接线
行情(修碰撞): 新 sina_index_eod.py 拉 14 中证指数日线点位(000016/300/852/905/985/000928-937)
入 dbbardata exchange=SSE, 与 SZSE 同名股票分离(provider .XSHG→SSE 零改动命中)。sina 主源 +
腾讯兜底 5 个 sina 停 2016 的(000929/930/936/937/985); 东财两端点持续封 VPS。schtask sanguo-idx-eod
18:30 增量(busy_timeout 60s 防 bs_eod 撞锁)。策略03 行业 mavg30 不再读个股股价。
治偏差(行业): INDEX_SECTION_MAP section 名校正(中证800能源->中证能源等, 1208 公告 content 实证);
index_monthly_wrapper STEP0b 接进 --indices 000928-937 月度增量(闭合 G1+G2 一次性未接增量缺口)。
注: 宽基治偏差(000852/000905/000016 等)早已完成(prior b237c2d); 行业指数 csindex 无 PDF 调整
公告(数据埋 HTML content), was_removed 仍~0, content 解析待专项。
|
2026-07-28 21:54:46 +08:00 |
|
claude_dev
|
c8f26bef80
|
feat(portfolio): LocalUnifiedProvider 批量行情接口 get_closes_panel (G5-Phase1)
单条 dbbardata 参数化查询 (symbol,exchange) OR + pivot 返宽表, 替代 N 次 get_price, 为策略向量化提速铺路。raw close 口径一致, 缺失 NaN 列, symbol-exchange 配对防歧义。22 tests 含 batch-vs-逐只回归。本文件另含 get_value_metrics 透传(策略移植)。
|
2026-07-28 20:36:11 +08:00 |
|
claude_dev
|
853d35197e
|
feat(data): 补 000985 中证全指 + 中证800十行业成份股入 constituent_unified (G1+G2)
治幸存者偏差全集: 000985=5128 全市场(解锁策略02小市值全市场池) + 000928~000937 中证800十行业 24~196只(解锁策略03行业轮动)。复用+泛化 000852/932000 csindex 公告回溯流程, 不动硬编码路径。9 宽基无回归, was_removed 治偏差填齐, 全表 14402 行/20 指数。
|
2026-07-28 20:36:11 +08:00 |
|
claude_dev
|
670498ab01
|
fix(data): akshare 三表下载鲁棒性 — 原子写 + --repair (G4)
write_parquet_and_marker 改原子写(tmp→os.replace→marker) kill 不产残缺 parquet; 新增 --repair 只重取 missing/empty/corrupt 忽略 marker(周度补漏不必等财报季 --force 全量); is_parquet_healthy 辅助。top_holders 修复无回归, 106 tests。
|
2026-07-28 20:36:11 +08:00 |
|
claude_dev
|
f94a145587
|
fix(data): bs_eod 卡死根治 — per-stock commit + baostock 超时包装 + 周期 relogin
根因(py-spy dump + netstat CLOSE_WAIT 实证): baostock 服务端关长连接→CLOSE_WAIT, send_msg 静默阻塞不抛异常, socket.setdefaulttimeout 不被 baostock 自己 socket 遵守, relogin 只在 error_code≠0 救不了; 一把大事务全程持 WAL 锁阻断全库。修复: per-stock commit 去大事务 + _with_timeout 线程超时包 fetch_k 打破静默 hang + 周期 relogin 每500主动刷连接。VPS --limit 3 验证 11s 不 hang。
|
2026-07-28 20:36:11 +08:00 |
|
claude_dev
|
955c05357a
|
fix(data): ak-stock top_holders KeyError 'sdltgd' 根治(_safe 捕 KeyError+匹配sdltgd,跳北交所920/83/87/43)
|
2026-07-27 21:08:53 +08:00 |
|
claude_dev
|
8b2693423a
|
feat(data): xt_eod 扩展补全北交所 920xxx 日线(exc_of+universe+import容错,复用×100 normalize)
- exc_of: 920 -> BJSE (3 位前缀优先于 2 位 SSE/SZSE 判断, 防 sym[:2]='92' 落 SZSE)
- universe: 沪深ETF/基金 ∪ 北交所920xxx (从 constituent_unified 932000 取, baostock 不覆盖)
- import xtquant 容错 (mac xd=None 可单测 exc_of, main() 开头 return 2)
- --full-bj: 北交所 backfill start=20240101 (默认 LOOKBACK=30 与 ETF 同窗)
- 复用 normalize_daily_dt + ×100 volume 口径, 不动已有 ETF 写入路径
Tests: tests/data_platform/test_xt_eod_bj.py 14 cases RED -> GREEN (3 位前缀 critical + ETF/沪深/深市 覆盖)
|
2026-07-27 20:56:16 +08:00 |
|
claude_dev
|
11f383a8e2
|
fix(data): akshare top_holders Length mismatch bug 根治
bug 根因 (实证 akshare 1.18.x stock_gdfx_em.py:418):
报告期未披露 (如 sz002673 的 20260630 在 2026-07-26 还未发) 时,
东财 PageSDLTGD 接口返 sdltgd=[], akshare pd.DataFrame([])+reset_index()
得 1 列 df, 然后 columns=[12 列] 抛
ValueError('Length mismatch: Expected axis has 1 elements, new values have 12')
这是确定性无数据 (非瞬时故障), 但 call_ak_with_retry 当网络错重试 3 次
(14s 退避) + 噪声 ERROR 日志, 浪费时间且消耗断路器配额。
修复:
新增 _safe_top_10_em 包装 ak.stock_gdfx_free_top_10_em: 子串匹配
'Length mismatch' (pandas 错误信息稳定) → 返空 df 带 8 列 schema
(TOP_HOLDERS_COLUMNS), 不抛; 其他 ValueError/ConnectionError 透传重试。
fetch_top_holders_one_period 改调此包装。
验证:
- Mac: sz002673/20260630 从 ~14s (3 重试) 降到 0.04s, 返 0×8 空 df
- 有效期 sz002673/20251231, sh600519/20250930 正常返 10×8 数据
- 9/9 新单测通过 (tests/data_platform/test_top_holders_parse.py)
|
2026-07-26 11:54:19 +08:00 |
|
claude_dev
|
b06af336c3
|
fix(data): bs_eod 15min datetime 格式 bug 根治 + --no-daily 选项
bug 根因(2026-07-25): baostock 15min 实测 date='2026-07-21'(带 -),
time='20260721094500000'(17 位 YYYYMMDDHHMMSSmmm)。原代码假设 date 纯数字 +
time[:6] 取年月, 产乱 datetime 致 dbbardata 15min 全市场停 2026-07-17(8 天
没正确累积), 日线正常(7-24)。
修复:
- 提纯函数 _build_15m_dt(date_series, time_series): date 直连 + 从 17 位 time
第 8-12 位提取 HHMM, 产出 'YYYY-MM-DD HH:MM:00' (符合 GLOB 清理模式)
- upsert_15m 调用 _build_15m_dt 替代内联拼接
- 新增 --no-daily 选项(只跑 15min, 用于重灌快), 与 --no-15m 对称
- TDD: 8 case 覆盖(09:45/14:30/15:00/13:00/跨日/多行混合/GLOB 格式)
- conftest.py 修补 sibling import 在 pytest 下可用
|
2026-07-25 21:14:12 +08:00 |
|