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
|
2393097074
|
test(live): D-4a集成测试(mock bridge真HTTP, sanguo半边4例绿)
- _MockBridge HTTP server模拟bridge(health/order/account/positions+鉴权)
- bridge_client真发HTTP(urlopen+X-Bridge-Token)+响应解析+错token 401返回None
- _shadow_trades_to_bridge真HTTP链路:注入成交→真POST→mock收到下单+symbol转sh600000→paper_shadow_orders记录
- NAS容器4 passed
- D-4a sanguo半边端到端验证(真HTTP); miniQMT真报单另半边待Windows bridge实跑
|
2026-07-11 05:41:43 +08:00 |
|
claude_dev
|
38f5635b59
|
test(live): D-3持久化测试(bridge_client+影子下单集成, NAS环境11例绿)
- test_bridge_client: to_bridge_code转换(sh/sz/前缀) + HTTP mock(成功/失败返回None不抛)
- test_shadow_orders: 幂等persistence + enabled跳过 + 正向记录+symbol转换 + 幂等不重复 + bridge失败不阻断
- NAS容器真实环境(Python3.10/pytest) 11 passed
- 补 D-3 测试空缺(Sub Agent临时自测未沉淀成持久测试)
|
2026-07-11 05:35:20 +08:00 |
|
claude_dev
|
379836d34e
|
docs(live): D期任务状态更新(D-1/D-3完成)+Windows部署联调清单
- 设计文档§8: D-1/D-3标✅代码完成+commit号, D-2/D-4待Windows, 附代码层验证说明
- d-phase-windows-deploy.md(新): Windows端一站式清单(D-1实测/D-2自启/D-4a联调/故障排查)
|
2026-07-11 00:07:18 +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
|
eff9ed2ae9
|
feat(bridge): D-1 bridge MVP—FastAPI 4接口(xtquant封装+token鉴权+sh/sz代码转换)
- bridge.py: lifespan连miniQMT, health/order/account/positions, 连不上不崩
- xt_gateway.py: xtquant单例封装(延迟import), 照搬check_xtquant验证模式
- auth.py: X-Bridge-Token校验(hmac防时序攻击), 未配token返回503不裸奔
- requirements.txt(fastapi+uvicorn) + README.md(Windows部署步骤)
安全: 无硬编码secret, token/userdata/account均走环境变量(grep验证CLEAN)
|
2026-07-10 23:48:59 +08:00 |
|
claude_dev
|
6a40ae9336
|
fix(bridge): check_xtquant step3改用StockAccount对象(xtquant本版无xttrader.STOCK_ACCOUNT)
|
2026-07-10 23:25:04 +08:00 |
|
claude_dev
|
baab212a86
|
feat(bridge): D-1 xtquant 可用性验证脚本 check_xtquant.py
分3步探活(import xtquant / connect miniQMT / 查询模拟账户资金持仓)
已填国金QMT模拟独立交易环境(账号66639661)
|
2026-07-10 22:52:56 +08:00 |
|
claude_dev
|
0656108b9e
|
fix(live): live_step传qfq_bars对齐step双源签名(端到端跑通)
live_step当日补fetch_day qfq + step(today,raw,qfq,prev,pending)5参数对齐.
修前 step5参数 vs live_step4参数 missing pending(预存, c6b19f4双源后未对齐).
容器verify_live_step端到端跑通(live_step@2026-07-07, _restore_ledger不崩,
分红/占用成本加载OK). 139 passed.
|
2026-07-10 08:49:58 +08:00 |
|
claude_dev
|
7c7976221b
|
docs(spec): phase3c-design §295分期项标记完成(分红送股+占用成本落地)
|
2026-07-10 08:46:14 +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
|
86a7f8ef2d
|
docs+fix(data): run_daily_update重写raw+qfq增量 + daily-update-design v3双源
- run_daily_update.sh: 重写raw+qfq增量(跳daily_all_update新浪坏接口KeyError:date,
持久路径data_cache/daily_update不进tmp, set -uo pipefail不-e); C-S3每日raw(撮合)+qfq(warmup)
- daily-update-design.md: v3.0变更记录+十六节(双源raw/qfq架构/脚本更新清单/launchd15:30部署/准确性验证/与v2关系)
- config/data_platform.yaml: minute_15_qfq_dir/minute_15_raw_dir(15min双源目录)
|
2026-07-10 08:16:41 +08:00 |
|
claude_dev
|
917d5bca2a
|
fix(data): baostock_download断连自动re-login retry(限流鲁棒)
本机下131只后baostock broken pipe卡死(脚本无retry). 加reconnect()+download_one
max_retries=3(空结果/broken pipe→bs.logout+login重试). 下次跑断点续传skip 131.
|
2026-07-10 07:10:36 +08:00 |
|
claude_dev
|
18d4ba2013
|
feat(web): 前端全局重构专业量化后台(深色+红涨绿跌+设计系统)
- 设计系统 styles/tokens.css: 深色token(#0d1117底/#161b22卡片) + 红涨绿跌
(--up#f85149/--down#3fb950) + 品牌蓝#1890ff + 间距/圆角/阴影/mono
- Element Plus深色(element-dark.css + dark/css-vars)+reset
- 删Vite脚手架残留(style.css重写/HelloWorld/hero/vite/vue资源)
- Layout重构(深色专业侧边)+Login+图表统一深色(useChart/echartsDark)
- 新建paper/Live.vue实走监控(step状态/净值/持仓/今日信号10s轮询)
- 业务页套.page头, 保留所有功能/路由/api
- 验证: vue-tsc --noEmit ✅ + npm run build ✅
|
2026-07-09 23:02:31 +08:00 |
|
claude_dev
|
252deb5ec7
|
feat(api): paper positions/pending 端点(实走监控用,Phase 3c Live页后端基础)
|
2026-07-09 22:33:35 +08:00 |
|
claude_dev
|
193064c953
|
feat(trader): 软限额max_allocation(分期项)—每策略资金额度消除顺序依赖
spec §195: 多策略并发下单"先到后到"不可复现 → 每策略独立max_allocation
- StrategyRunner: max_allocation字段(默认inf) + used_allocation(持仓市值)
- engine._match: BUY cash_enough后查 used+成交额>max_allocation → 拒单max_allocation_exceeded
- live_orchestrator: runner传max_allocation(默认initial_capital)
- routes_paper: StrategyCfg加max_allocation(API→DB→live_step数据流)
- test_soft_limit: 3测试(累计超限拒单/默认不限/SELL不受限)
116 passed(113旧+3新), 无回归.
|
2026-07-09 22:05:35 +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
|
a372544045
|
feat(data): 双源5yr全市场部署 + baostock 15min + 断点续传
- raw_redownload 加断点续传(exists/skip已存在, 扩范围重下覆盖)
- baostock_download: 15min双源(qfq+raw)下载器, NAS容器跑, 限速防封
- full_deploy_5yr.sh: 无人值守日线双源pipeline(qfq→raw→rsync→验证)
- verify_dual_source: 容器内双源部署验证(fetch_day/iter_bars/除权日)
实测: 日线双源5yr 29600文件×2(rsync NAS), 浦发除权日 raw-5.9%/qfq-0.7%,
容器内 fetch_day/iter_bars/全市场抽检5只全通过. 15min沪深300 baostock限流121只.
|
2026-07-09 19:22:36 +08:00 |
|
claude_dev
|
d5d3eea236
|
chore: gitignore data_cache(双源验证数据本地缓存,不入库)
|
2026-07-08 12:17:11 +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
|
ab703e93ba
|
feat(matcher): 集合竞价CALL_AUCTION撮合(分期项)—开盘价(最大成交量原则→open)
CALL_AUCTION枚举原拒单(unsupported), 现撮合用开盘价(open, 集合竞价确定开盘价).
当前定价同NEXT_OPEN(均为open); 未来区分开盘/尾盘集合竞价需扩枚举.
test: call_auction fills@open(原rejected用例改).
|
2026-07-08 07:02:51 +08:00 |
|
claude_dev
|
7eec983164
|
fix(live): C-S3实走warmup(am跨日)+fetch_day wrapper+端到端验证
- live_orchestrator warmup: 重放start~昨日raw到策略am使其inited(实走每日单根, 不warmup则ArrayManager永不inited→策略无信号)
- routes _DataSourceWrapper 加 fetch_day(给 live_step 拉当日raw)
- verify_live_step 容器端到端: 创建live account+live_step(07-07 warmup+step)+存pending, 跑通(pending=0系DoubleMa当日无交叉, 撮合/存已单测)
|
2026-07-08 06:59:24 +08:00 |
|
claude_dev
|
674cfadba7
|
feat(data): run_daily_update加raw增量—每日15:30拉最近5天raw推NAS(C-S3实走数据管道)
|
2026-07-08 06:51:00 +08:00 |
|
claude_dev
|
6931a7b541
|
feat(trader): C-S3实走后端骨架—live_orchestrator+全局scheduler job+routes live
架构(简化,避per-account闭包注入):
- live_orchestrator live_step(account_id)自包含: 恢复cash/positions/pending→fetch_day raw当日→engine.step→存状态
- run_live_step(db)遍历live accounts调live_step; scheduler register_live_step_job全局20:30 job
- app startup注册全局job; routes create mode=live存account running(不跑回放)
- TODO(分期项): prev_close昨日raw/listing_days IPO算/realized_pnl恢复
- 113/113通过, live_orchestrator import OK
|
2026-07-08 06:49:31 +08:00 |
|
claude_dev
|
20bdd689af
|
feat(persistence): C-S3实走跨日状态—paper_pending_orders+positions/last_balance存取
|
2026-07-08 06:46:57 +08:00 |
|
claude_dev
|
3aca14f723
|
refactor(engine): 抽出step()单根推进(C-S3实走入口,task2基础)
run()循环体抽为step(bar_date,bars,prev_close,pending)→(pending,closes);
run()改为调step。实走scheduler每日喂当日bar调step单步推进。
- 回放行为不变(test_engine原3用例pass)
- 加test_engine_step_single_bar_advances: day1信号缓冲/day2撮合
- trader全量111/111通过
|
2026-07-07 23:41:18 +08:00 |
|
claude_dev
|
05dba7fe46
|
feat(trader): 科创板200股最小手数(分期项切片)—lot_size_for+matcher板块取整
科创板(688/689)最小200股1股递增(不整倍); 主板/创业/北交100整倍; 卖出不取整。
- limit.py 加 lot_size_for(symbol)
- matcher cross_order 买入取整按板块(star≥200不取整, 其余100整倍)
- routes_paper cta size=lot_size_for(symbol)
- test: 688981 买150拒/买250不取整; 主板用例不变; 63/63通过
|
2026-07-07 23:37:50 +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
|
fc39b549cf
|
docs(data): 补齐数据脚本文档(v1调研5文档复制+11脚本清单表)
|
2026-07-07 20:00:50 +08:00 |
|
claude_dev
|
1a88954126
|
feat(data): v2 数据下载(SSH模式 STOCK_MOUNT+rsync) + launchd定时 + 文档
- v1 data_platform 脚本复制到 v2/scripts/data_platform/ 维护
- daily_all_update.py: 路径用 STOCK_MOUNT env(SSH模式) + STOCK_LIMIT(验证)
- run_daily_update.sh: rsync拉NAS→本地 + v1增量 + 推NAS(SSH key免密,不挂载)
- launchd com.sanguo.data-update 每日15:30(替代crontab,macOS FDA限制)
- 验证: STOCK_LIMIT=2 updated=2 records=24 拉到当天
- 文档 docs/deployment/data-download.md
|
2026-07-07 19:41:07 +08:00 |
|
claude_dev
|
0543154a62
|
fix(paper): save_account 兼容 start/end → start_date/end_date 字段映射
|
2026-07-07 17:45:43 +08:00 |
|
claude_dev
|
ddc527b39c
|
feat(web): Result 轮询(running每3s)+状态提示, New 默认 DoubleMaStrategy
|
2026-07-07 15:33:46 +08:00 |
|
claude_dev
|
ba2138e1cf
|
fix(trader): volume×size(A股1手=100股) — DoubleMa 真策略回放 filled=3 跑通
|
2026-07-07 15:15:27 +08:00 |
|
claude_dev
|
17a4801450
|
fix(trader): vnpy 桥接(am/trading/cancel_all/__getattr__兜底) + create 异步回放
|
2026-07-07 15:03:57 +08:00 |
|
claude_dev
|
eb6aa34b82
|
fix(paper): create 接入回放(engine.run) + 日线 parquet 文件名 sh/sz 前缀+_daily
|
2026-07-07 14:47:20 +08:00 |
|
claude_dev
|
88bd001a97
|
test(paper): Phase 3c 端到端冒烟脚本(login+create+equity/trades/strategies)
|
2026-07-07 12:58:14 +08:00 |
|
claude_dev
|
36b4299934
|
feat(web): 模拟盘前端(点亮入口+router+New/Result页+归因/拒单展示)
|
2026-07-07 12:50:55 +08:00 |
|
claude_dev
|
cacdb5ae24
|
feat(trader): C-S3 scheduler(APScheduler定时+启动恢复live job)
|
2026-07-07 12:48:24 +08:00 |
|
claude_dev
|
14088eac13
|
feat(paper): C-S2 分策略归因(/strategies 聚合成交/拒单/费用)
|
2026-07-07 12:07:37 +08:00 |
|
claude_dev
|
041dca59e2
|
feat(api): /paper/* 路由(create建account+equity/trades查询,JWT)
|
2026-07-07 12:06:26 +08:00 |
|
claude_dev
|
42877213ae
|
feat(trader): PaperEngine 主循环(逐bar重放/next_open缓冲/current_close/双层记账/持久化)
- run(): T+1解冻→撮合上根pending(用当前bar)→喂策略收单→current_close当根/next_open缓冲→盯市入库
- 双层记账一致性(总账=分户之和), checkpoint续跑字段
- StrategyRunner +symbol 字段 3 tests passed.
|
2026-07-07 12:01:37 +08:00 |
|
claude_dev
|
f0d8fd2a03
|
feat(trader): PaperCtaEngine 策略适配器(拦截send_order→PaperOrder)
|
2026-07-07 12:00:14 +08:00 |
|
claude_dev
|
b2c5d8fd79
|
feat(data): read_parquet_15min + trader data_source(qfq/raw双源)
- datareader: +read_parquet_15min(sh/sz前缀+15min.parquet), get_database lazy(去tzlocal等依赖)
- data_source: iter_bars cross-section yield(date,{symbol:Bar}), raw首版fallback qfq+warning(spec§17)
- 本机 mock _read_fn 测调度逻辑, read_parquet_15min 容器冒烟 4 tests passed.
|
2026-07-07 11:57:16 +08:00 |
|
claude_dev
|
308d36f2b6
|
feat(trader): persistence 4表+checkpoint+WAL(spec§8/§9.1)
paper_accounts(含owner_id/checkpoint_date/scheduler_job_id/match_session)
paper_trades(rejected/reject_reason/blocked_by) paper_positions(scope)
paper_daily_balance(is_checkpoint) WAL多进程读写 5 tests passed.
|
2026-07-07 11:52:11 +08:00 |
|
claude_dev
|
e5e4eef807
|
feat(trader): Account总账+StrategyRunner分户(双层记账/资金T0/股票T1)
- Account: cash资金T0/合并持仓/equity盯市/cash_enough买单检查
- StrategyRunner: 分户持仓+realized_pnl归因/unrealized_pnl
- transfer_fee 直接用(matcher已双向,不再×2,review H3)
- unfreeze_all 对称(总账+分户,T+1每日解冻)
7 tests passed.
|
2026-07-07 11:50:40 +08:00 |
|
claude_dev
|
05d74fc2c1
|
fix(trader): M+L 接口校验 (listing_days/NaN/输入校验/类型注数) review
M1: PaperOrder+limit+matcher 加 listing_days(创业/科创/北交所前5日不锁,0=已过)
M3: is_locked_for_*_symbol cfg 注解 AccountConfig
M4: matcher NaN bar 拒单 bar_missing
L3: PositionLedger price/volume 正数校验
L5: PaperOrder __post_init__ volume 类型校验(拒 float/bool)
M5: current_close 契约 docstring + H3 残留注释修正(transfer_fee 双向)
79 tests passed.
|
2026-07-07 11:23:16 +08:00 |
|
claude_dev
|
b874be1d84
|
fix(trader): matcher slippage/过户费双向/限价超涨停拒单 (H2/H3/H4)
H2: fill_price 应用 slippage(买+/卖-,默认0不影响)
H3: 过户费改双向(matcher 直接×2,Account 不再×2,删单边注释)
H4: 限价单超涨停价拒单(price_above_limit/price_below_limit)
69 tests passed.
|
2026-07-07 11:15:19 +08:00 |
|
claude_dev
|
f940841a9a
|
fix(trader): 价格精度 _price_eq + Decimal ROUND_HALF_UP (C1/H1)
C1 CRITICAL: is_one_word_lock/is_t_lock 用 == 比较价格,浮点尾数差
(5.5600000000000005 vs 5.56) 导致一字板当可成交。改用 math.isclose
容差比较 (pricetick/2)。新增 _price_eq(),所有价格 == 改用之;
相对比较 (low<open, high>open) 保留原语义。
H1 HIGH: limit_up/down_price 用 Python round() 是 banker's rounding
(round(610.5)=610),导致 5.55×1.10→6.10 而非 6.11。改用
decimal.Decimal(str(x)) + ROUND_HALF_UP。
测试:
- 5.05 一字涨停 (浮点尾数差 case)
- 9.99×1.2 创业板一字板
- 0.35×1.05 ST T 字板
- 5.55×1.10 → 6.11 (banker's 消除)
- 4.45×0.90 → 4.01
60 tests pass, 100% cov 保持。
Refs: Phase 3c C-S0 review findings [C1][H1]
|
2026-07-07 10:47:39 +08:00 |
|
claude_dev
|
67ea7763cd
|
feat(trader): matcher.py A股撮合(match_session/费率/100股/封板) Issue#3
|
2026-07-07 10:05:49 +08:00 |
|