From a45aa5b033cefbcc14ae6e0cb16b6cb25856695d Mon Sep 17 00:00:00 2001 From: fish Date: Sat, 4 Jul 2026 17:41:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=87=AA=E9=80=89=E5=92=8C?= =?UTF-8?q?=E5=9B=9E=E6=B5=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- serve/backend/app/api/backtest.py | 474 ---- serve/backend/app/api/data.py | 4 +- serve/backend/app/api/kline.py | 4 +- serve/backend/app/api/settings.py | 18 - serve/backend/app/api/watchlist.py | 222 -- serve/backend/app/backtest/__init__.py | 4 - serve/backend/app/backtest/engine.py | 1532 ----------- serve/backend/app/backtest/factor.py | 480 ---- serve/backend/app/backtest/strategy.py | 721 ------ serve/backend/app/config.py | 2 - serve/backend/app/jobs/daily_pipeline.py | 5 +- serve/backend/app/main.py | 4 +- serve/backend/app/services/backtest.py | 392 --- serve/backend/app/services/extend_history.py | 5 +- serve/backend/app/services/preferences.py | 11 - serve/backend/app/services/watchlist.py | 144 -- serve/backend/app/tickflow/pools.py | 17 +- serve/backend/app/tickflow/repository.py | 5 +- .../tests/backtest/test_engine_portfolio.py | 422 --- .../backtest/test_full_simulation_tail.py | 59 - .../test_strategy_backtest_correctness.py | 163 -- .../src/components/ColumnCustomizer.tsx | 4 +- serve/frontend/src/components/Layout.tsx | 4 - .../src/components/StockPreviewDialog.tsx | 21 +- .../src/components/screener/ScreenerTable.tsx | 25 +- .../screener/StrategySettingsDialog.tsx | 29 +- serve/frontend/src/lib/api.ts | 219 -- serve/frontend/src/lib/backtestTask.ts | 227 -- serve/frontend/src/lib/queryKeys.ts | 9 +- serve/frontend/src/lib/screener-columns.ts | 3 - serve/frontend/src/lib/signals.ts | 4 +- serve/frontend/src/lib/storage.ts | 37 - serve/frontend/src/lib/useSharedMutations.ts | 15 - serve/frontend/src/lib/watchlist-columns.ts | 166 -- serve/frontend/src/pages/Backtest.tsx | 63 - serve/frontend/src/pages/LimitUpLadder.tsx | 2 +- serve/frontend/src/pages/Screener.tsx | 60 +- serve/frontend/src/pages/Watchlist.tsx | 1146 --------- .../src/pages/backtest/FactorBacktest.tsx | 447 ---- .../src/pages/backtest/StrategyBacktest.tsx | 2268 ----------------- .../backtest/charts/FactorGroupNavChart.tsx | 124 - .../pages/backtest/charts/FactorICChart.tsx | 88 - .../charts/ReturnDistributionChart.tsx | 63 - .../backtest/charts/StrategyNavChart.tsx | 209 -- .../src/pages/backtest/charts/useECharts.ts | 37 - .../backtest/components/TradeKlineModal.tsx | 170 -- .../src/pages/settings/MenuSettings.tsx | 2 - serve/frontend/src/router.tsx | 4 - serve/screenshots/backtest.png | Bin 668676 -> 0 bytes 49 files changed, 43 insertions(+), 10091 deletions(-) delete mode 100644 serve/backend/app/api/backtest.py delete mode 100644 serve/backend/app/api/watchlist.py delete mode 100644 serve/backend/app/backtest/__init__.py delete mode 100644 serve/backend/app/backtest/engine.py delete mode 100644 serve/backend/app/backtest/factor.py delete mode 100644 serve/backend/app/backtest/strategy.py delete mode 100644 serve/backend/app/services/backtest.py delete mode 100644 serve/backend/app/services/watchlist.py delete mode 100644 serve/backend/tests/backtest/test_engine_portfolio.py delete mode 100644 serve/backend/tests/backtest/test_full_simulation_tail.py delete mode 100644 serve/backend/tests/backtest/test_strategy_backtest_correctness.py delete mode 100644 serve/frontend/src/lib/backtestTask.ts delete mode 100644 serve/frontend/src/lib/watchlist-columns.ts delete mode 100644 serve/frontend/src/pages/Backtest.tsx delete mode 100644 serve/frontend/src/pages/Watchlist.tsx delete mode 100644 serve/frontend/src/pages/backtest/FactorBacktest.tsx delete mode 100644 serve/frontend/src/pages/backtest/StrategyBacktest.tsx delete mode 100644 serve/frontend/src/pages/backtest/charts/FactorGroupNavChart.tsx delete mode 100644 serve/frontend/src/pages/backtest/charts/FactorICChart.tsx delete mode 100644 serve/frontend/src/pages/backtest/charts/ReturnDistributionChart.tsx delete mode 100644 serve/frontend/src/pages/backtest/charts/StrategyNavChart.tsx delete mode 100644 serve/frontend/src/pages/backtest/charts/useECharts.ts delete mode 100644 serve/frontend/src/pages/backtest/components/TradeKlineModal.tsx delete mode 100644 serve/screenshots/backtest.png diff --git a/serve/backend/app/api/backtest.py b/serve/backend/app/api/backtest.py deleted file mode 100644 index 0fe0736..0000000 --- a/serve/backend/app/api/backtest.py +++ /dev/null @@ -1,474 +0,0 @@ -"""回测 API — 信号回测 + 因子回测 + 策略回测。""" -from __future__ import annotations - -import asyncio -import json -import queue -import threading -from dataclasses import asdict -from datetime import date, timedelta -from typing import Literal - -from fastapi import APIRouter, HTTPException, Request -from fastapi.responses import StreamingResponse -from pydantic import BaseModel, Field - -from app.config import settings -from app.services.backtest import ( - BacktestConfig, - BacktestService, - VectorbtUnavailable, - is_available, -) - -router = APIRouter(prefix="/api/backtest", tags=["backtest"]) - -FACTOR_DEFAULT_DAYS = 180 -STRATEGY_DEFAULT_DAYS = 365 * 3 -BACKTEST_MAX_SERVER_DAYS = 186 -FACTOR_MAX_SYMBOLS = 1000 -BACKTEST_SERVER_GUARD_MESSAGE = ( - "当前服务器内存约 1.8GB,回测区间最多支持 6 个月;" - "更长周期容易触发 OOM,建议在 8GB 以上内存环境或本机运行。" -) - - -def _get_engine(request: Request): - """获取或创建 BacktestEngine (单例,PanelCache 跨请求生效)。""" - from app.backtest.engine import BacktestEngine - engine = getattr(request.app.state, "backtest_engine", None) - if engine is None: - engine = BacktestEngine(request.app.state.repo) - request.app.state.backtest_engine = engine - return engine - - -def _resolve_start(req: BaseModel, end: date, default_days: int) -> date: - """未传 start 使用默认区间;显式传 null/空值表示全部历史。""" - start = getattr(req, "start") - if start is not None: - return start - if "start" in req.model_fields_set: - return date(1900, 1, 1) - return end - timedelta(days=default_days) - - -def _guard_server_backtest_range(start: date, end: date): - if not settings.backtest_range_guard: - return - days = (end - start).days + 1 - if days > BACKTEST_MAX_SERVER_DAYS: - raise HTTPException(status_code=400, detail=BACKTEST_SERVER_GUARD_MESSAGE) - - -# ================================================================ -# 状态 -# ================================================================ - -@router.get("/status") -def status(): - """前端可用此接口判断回测页是否要灰显。""" - return {"available": True} - - -# ================================================================ -# 信号回测 (现有接口,保持不变) -# ================================================================ - -class BacktestRequest(BaseModel): - symbols: list[str] = Field(..., min_length=1) - start: date | None = None - end: date | None = None - entries: list[str] = [] - exits: list[str] = [] - stop_loss_pct: float | None = None - max_hold_days: int | None = None - fees_pct: float = 0.0002 - slippage_bps: float = 5 - matching: Literal["close_t", "open_t+1"] = "close_t" - - -@router.post("/run") -def run(req: BacktestRequest, request: Request): - """信号回测 — 现有接口,向后兼容。""" - repo = request.app.state.repo - svc = BacktestService(repo) - end = req.end or date.today() - start = req.start or (end - timedelta(days=365 * 3)) - - cfg = BacktestConfig( - symbols=req.symbols, - start=start, - end=end, - entries=req.entries, - exits=req.exits, - stop_loss_pct=req.stop_loss_pct, - max_hold_days=req.max_hold_days, - fees_pct=req.fees_pct, - slippage_bps=req.slippage_bps, - matching=req.matching, - ) - try: - result = svc.run(cfg) - except VectorbtUnavailable as e: - raise HTTPException(status_code=503, detail=str(e)) from e - return asdict(result) - - -# ================================================================ -# 因子回测 -# ================================================================ - -class FactorColumnsResponse(BaseModel): - columns: list[dict] - - -@router.get("/factor/columns") -def factor_columns(): - """返回可用的因子列列表。""" - from app.backtest.factor import FACTOR_COLUMNS - return {"columns": FACTOR_COLUMNS} - - -class FactorBacktestRequest(BaseModel): - factor_name: str - symbols: list[str] | None = None - start: date | None = None - end: date | None = None - n_groups: int = 5 - rebalance: Literal["daily", "weekly", "monthly"] = "monthly" - weight: Literal["equal", "factor_weight"] = "equal" - fees_pct: float = 0.0002 - slippage_bps: float = 5.0 - - -@router.post("/factor/run") -def factor_run(req: FactorBacktestRequest, request: Request): - """因子回测 — IC/IR 分析 + 分层回测。""" - from app.backtest.factor import FactorBacktestService, FactorConfig - - engine = _get_engine(request) - svc = FactorBacktestService(engine) - - end = req.end or date.today() - start = _resolve_start(req, end, STRATEGY_DEFAULT_DAYS) - _guard_server_backtest_range(start, end) - symbols = req.symbols if req.symbols else None - if symbols is not None and len(symbols) > FACTOR_MAX_SYMBOLS: - raise HTTPException( - status_code=400, - detail=f"指定标的最多支持 {FACTOR_MAX_SYMBOLS} 只,请缩小标的范围。", - ) - - cfg = FactorConfig( - factor_name=req.factor_name, - symbols=symbols, - start=start, - end=end, - n_groups=req.n_groups, - rebalance=req.rebalance, - weight=req.weight, - fees_pct=req.fees_pct, - slippage_bps=req.slippage_bps, - ) - result = svc.run(cfg) - return asdict(result) - - -# ================================================================ -# 策略回测 -# ================================================================ - -class StrategyBacktestRequest(BaseModel): - strategy_id: str - symbols: list[str] | None = None - start: date | None = None - end: date | None = None - params: dict | None = None - overrides: dict | None = None - # matching 向后兼容; 显式传 entry_fill/exit_fill 时以二者为准。 - matching: Literal["close_t", "open_t+1"] = "open_t+1" - entry_fill: Literal["close_t", "open_t+1"] | None = None - exit_fill: Literal["close_t", "open_t+1"] | None = None - fees_pct: float = 0.0002 - slippage_bps: float = 5.0 - max_positions: int = 10 - max_exposure_pct: float = 1.0 - initial_capital: float = 1_000_000.0 - position_sizing: Literal["equal", "score_weight"] = "equal" - mode: Literal["position", "full"] = "position" - holding_days: int = 5 - - -@router.post("/strategy/run") -def strategy_run(req: StrategyBacktestRequest, request: Request): - """策略回测 — 复用 StrategyDef 体系做全周期回测。""" - from app.backtest.strategy import StrategyBacktestService, StrategyBacktestConfig - - engine = _get_engine(request) - strategy_engine = request.app.state.strategy_engine - svc = StrategyBacktestService(engine, strategy_engine) - - end = req.end or date.today() - start = _resolve_start(req, end, FACTOR_DEFAULT_DAYS) - _guard_server_backtest_range(start, end) - - cfg = StrategyBacktestConfig( - strategy_id=req.strategy_id, - symbols=req.symbols if req.symbols else None, - start=start, - end=end, - params=req.params, - overrides=req.overrides, - matching=req.matching, - entry_fill=req.entry_fill, - exit_fill=req.exit_fill, - fees_pct=req.fees_pct, - slippage_bps=req.slippage_bps, - max_positions=req.max_positions, - max_exposure_pct=req.max_exposure_pct, - initial_capital=req.initial_capital, - position_sizing=req.position_sizing, - mode=req.mode, - holding_days=req.holding_days, - ) - result = svc.run(cfg) - return asdict(result) - - -# ── SSE 流式回测 (实时进度 + 可取消 + 支持重连) ─────────────────── - -import time -import hashlib - - -class _BacktestJob: - """单个回测任务的状态, 存模块级供重连使用。""" - __slots__ = ("key", "cancel_event", "progress", "result", "error", "done", "finish_ts") - - def __init__(self, key: str): - self.key = key - self.cancel_event = threading.Event() - self.progress: list[dict] = [] # 进度历史 (新连接可回放) - self.result = None # 完成后的结果 - self.error: str | None = None - self.done = False - self.finish_ts: float = 0.0 - - -# 模块级任务表: key -> _BacktestJob -_running_jobs: dict[str, _BacktestJob] = {} -_jobs_lock = threading.Lock() -_JOB_TTL = 300 # 完成后保留 5 分钟 - - -def _cleanup_stale_jobs(): - """清理过期任务 (完成超过 TTL 的)。""" - now = time.time() - stale = [k for k, j in _running_jobs.items() if j.done and now - j.finish_ts > _JOB_TTL] - for k in stale: - _running_jobs.pop(k, None) - - -def _make_job_key( - strategy_id: str, symbols: str | None, start: str | None, end: str | None, - matching: str, entry_fill: str | None, exit_fill: str | None, - fees_pct: float, slippage_bps: float, - max_positions: int, max_exposure_pct: float, initial_capital: float, position_sizing: str, - params: str | None, overrides: str | None, - mode: str = "position", holding_days: int = 5, -) -> str: - raw = f"{strategy_id}|{symbols}|{start}|{end}|{matching}|{entry_fill}|{exit_fill}|{fees_pct}|{slippage_bps}|{max_positions}|{max_exposure_pct}|{initial_capital}|{position_sizing}|{params}|{overrides}|{mode}|{holding_days}" - return hashlib.md5(raw.encode()).hexdigest()[:12] - - -@router.get("/strategy/stream") -async def strategy_stream( - request: Request, - strategy_id: str, - symbols: str | None = None, - start: str | None = None, - end: str | None = None, - matching: str = "open_t+1", - entry_fill: str | None = None, - exit_fill: str | None = None, - fees_pct: float = 0.0002, - slippage_bps: float = 5.0, - max_positions: int = 10, - max_exposure_pct: float = 1.0, - initial_capital: float = 1_000_000.0, - position_sizing: str = "equal", - params: str | None = None, - overrides: str | None = None, - mode: str = "position", - holding_days: int = 5, -): - """SSE 流式策略回测: 实时推送进度, 完成后推送结果, 支持重连 (刷新/切页后恢复)。 - - - 相同参数的任务只启动一次, 多次连接订阅同一个任务 - - 断开连接不会取消任务 (除非显式调用 cancel) - - 结果保留 5 分钟供重连 - - 事件类型: - - progress: {day, total, date, equity} - - done: {result} (完整回测结果) - - error: {message} - """ - from app.backtest.strategy import StrategyBacktestService, StrategyBacktestConfig - - engine = _get_engine(request) - strategy_engine = request.app.state.strategy_engine - svc = StrategyBacktestService(engine, strategy_engine) - - end_date = date.fromisoformat(end) if end else date.today() - if start: - start_date = date.fromisoformat(start) - else: - # 空 start = 全部历史: 用本地最早日K日期, 查不到再回退到默认窗口 - earliest = request.app.state.repo.earliest_daily_date() - start_date = earliest or (end_date - timedelta(days=FACTOR_DEFAULT_DAYS)) - - # 服务端范围保护 - guard_violated = False - if settings.backtest_range_guard: - days = (end_date - start_date).days + 1 - if days > BACKTEST_MAX_SERVER_DAYS: - guard_violated = True - - job_key = _make_job_key( - strategy_id, symbols, start, end, - matching, entry_fill, exit_fill, - fees_pct, slippage_bps, max_positions, max_exposure_pct, initial_capital, position_sizing, - params, overrides, - mode, holding_days, - ) - - _cleanup_stale_jobs() - - # 获取或创建任务 - with _jobs_lock: - job = _running_jobs.get(job_key) - if job is None: - job = _BacktestJob(job_key) - _running_jobs[job_key] = job - is_new = True - else: - is_new = False - - async def event_generator(): - # 范围保护: 直接报错 - if guard_violated: - yield f"event: error\ndata: {json.dumps({'message': BACKTEST_SERVER_GUARD_MESSAGE}, ensure_ascii=False)}\n\n" - return - - # 如果是新任务, 启动回测线程 - if is_new and not job.done: - cfg = StrategyBacktestConfig( - strategy_id=strategy_id, - symbols=[s.strip() for s in symbols.split(",") if s.strip()] if symbols else None, - start=start_date, - end=end_date, - params=json.loads(params) if params else None, - overrides=json.loads(overrides) if overrides else None, - matching=matching, - entry_fill=entry_fill, - exit_fill=exit_fill, - fees_pct=fees_pct, - slippage_bps=slippage_bps, - max_positions=int(max_positions), - max_exposure_pct=float(max_exposure_pct), - initial_capital=float(initial_capital), - position_sizing=position_sizing, - mode=mode, - holding_days=int(holding_days), - ) - - def _run_backtest(): - try: - result = svc.run(cfg, lambda d: job.progress.append(d), job.cancel_event) - job.result = result - job.done = True - job.finish_ts = time.time() - except Exception as e: - job.error = str(e) - job.done = True - job.finish_ts = time.time() - - # 启动后台线程 (不阻塞事件循环) - threading.Thread(target=_run_backtest, daemon=True).start() - - # 订阅进度: 用读指针读 job.progress 列表 (多连接互不干扰) - cursor = 0 - tick = 0 - - try: - while True: - # 已完成: 推送最终结果/错误并退出 - if job.done: - if job.error: - yield f"event: error\ndata: {json.dumps({'message': job.error}, ensure_ascii=False)}\n\n" - elif job.result is not None: - r = job.result - if hasattr(r, "error") and r.error == "cancelled": - yield f"event: error\ndata: {json.dumps({'message': '回测已取消'}, ensure_ascii=False)}\n\n" - elif hasattr(r, "error") and r.error: - yield f"event: error\ndata: {json.dumps({'message': r.error}, ensure_ascii=False)}\n\n" - else: - yield f"event: done\ndata: {json.dumps(asdict(r), ensure_ascii=False, default=str)}\n\n" - return - - # 断开检测: 每 4 轮检查一次 (降低 GIL 抢占频率) - tick += 1 - if tick % 4 == 0 and await request.is_disconnected(): - break - - # 推送新进度 (从 cursor 开始读) - prog_list = job.progress - while cursor < len(prog_list): - msg = prog_list[cursor] - cursor += 1 - yield f"event: progress\ndata: {json.dumps(msg, ensure_ascii=False, default=str)}\n\n" - - await asyncio.sleep(0.5) - - except asyncio.CancelledError: - raise - - return StreamingResponse(event_generator(), media_type="text/event-stream") - - -@router.post("/strategy/cancel") -async def strategy_cancel(request: Request): - """取消正在运行的回测任务 (前端传 query string, 后端算 job_key)。""" - body = await request.json() - qs = body.get("qs", "") - # 解析 qs 得到参数 - from urllib.parse import parse_qs - p = parse_qs(qs) - def _get(key: str, default: str = "") -> str: - return p.get(key, [default])[0] - job_key = _make_job_key( - _get("strategy_id"), - _get("symbols") or None, - _get("start") or None, - _get("end") or None, - _get("matching", "open_t+1"), - _get("entry_fill") or None, - _get("exit_fill") or None, - float(_get("fees_pct", "0.0002")), - float(_get("slippage_bps", "5")), - int(_get("max_positions", "10")), - float(_get("max_exposure_pct", "1")), - float(_get("initial_capital", "1000000")), - _get("position_sizing", "equal"), - _get("params") or None, - _get("overrides") or None, - _get("mode", "position"), - int(_get("holding_days", "5")), - ) - job = _running_jobs.get(job_key) - if job and not job.done: - job.cancel_event.set() - return {"ok": True} - return {"ok": False, "message": "任务不存在或已完成"} - diff --git a/serve/backend/app/api/data.py b/serve/backend/app/api/data.py index 2d78a19..d100eac 100644 --- a/serve/backend/app/api/data.py +++ b/serve/backend/app/api/data.py @@ -505,7 +505,7 @@ def _compute_storage(data_dir: Path) -> dict: stats[f"{key}_size_mb"] = sz # total: 再加上其他零散文件(pools, financials, capabilities.json 等) - other_dirs = ["pools", "financials", "backtest_results", "screener_results", "ai_cache"] + other_dirs = ["pools", "financials", "screener_results", "ai_cache"] for name in other_dirs: d = data_dir / name if d.exists(): @@ -629,7 +629,7 @@ def clear_data(request: Request): "kline_daily", "kline_daily_enriched", "kline_index_daily", "kline_index_enriched", "kline_etf_daily", "kline_etf_enriched", "kline_etf_minute", "kline_minute", "adj_factor", "adj_factor_etf", "instruments", "instruments_index", "instruments_etf", "pools", "financials", - "backtest_results", "screener_results", "ai_cache", + "screener_results", "ai_cache", ): d = data_dir / sub if d.exists(): diff --git a/serve/backend/app/api/kline.py b/serve/backend/app/api/kline.py index 8e09ad9..eded068 100644 --- a/serve/backend/app/api/kline.py +++ b/serve/backend/app/api/kline.py @@ -150,7 +150,7 @@ def _attach_ext(resp: dict, repo, symbol: str, ext_columns: Optional[str]) -> di """按 ext_columns 规格为单只股票 LEFT JOIN 扩展数据,平铺到 stock_info['ext']。 key 形如 "{config_id}__{field_name}",与自选列表 enriched 接口保持一致。 - JOIN 逻辑参考 watchlist.watchlist_enriched;任何 ext 表/字段缺失都静默跳过。 + JOIN 逻辑;任何 ext 表/字段缺失都静默跳过。 """ if not ext_columns or not ext_columns.strip(): return resp @@ -380,7 +380,7 @@ async def sync_minute(request: Request): try: progress("sync_minute", 5, "解析标的池…") - universe = sorted(set(get_pool("watchlist")) | set(get_pool("CN_Equity_A"))) + universe = sorted(set(get_pool("CN_Equity_A"))) # 补充 instruments 全量标的,覆盖北交所、新股等 inst_path = repo.store.data_dir / "instruments" / "instruments.parquet" if inst_path.exists(): diff --git a/serve/backend/app/api/settings.py b/serve/backend/app/api/settings.py index 1139af4..ea7ea57 100644 --- a/serve/backend/app/api/settings.py +++ b/serve/backend/app/api/settings.py @@ -332,7 +332,6 @@ def get_preferences() -> dict: "instruments_schedule": preferences.get_instruments_schedule(), "enriched_batch_size": preferences.get_enriched_batch_size(), "index_daily_batch_size": preferences.get_index_daily_batch_size(), - "watchlist_columns": preferences.get_watchlist_columns(), "screener_result_columns": preferences.get_screener_result_columns(), "sidebar_index_symbols": preferences.get_sidebar_index_symbols(), "nav_order": preferences.get_nav_order(), @@ -343,14 +342,6 @@ def get_preferences() -> dict: } -@router.get("/preferences/watchlist-columns") -def get_watchlist_columns() -> dict: - """返回自选列表列配置。""" - from app.services import preferences - cols = preferences.get_watchlist_columns() - return {"columns": cols} - - class NavOrderIn(BaseModel): nav_order: list[str] @@ -375,15 +366,6 @@ def update_nav_hidden(req: NavHiddenIn) -> dict: return {"nav_hidden": saved} -@router.put("/preferences/watchlist-columns") -def update_watchlist_columns(req: dict) -> dict: - """保存自选列表列配置。""" - from app.services import preferences - columns = req.get("columns", []) - saved = preferences.set_watchlist_columns(columns) - return {"columns": saved} - - @router.get("/preferences/screener-result-columns") def get_screener_result_columns() -> dict: """返回策略结果列表列配置。""" diff --git a/serve/backend/app/api/watchlist.py b/serve/backend/app/api/watchlist.py deleted file mode 100644 index 81fc34d..0000000 --- a/serve/backend/app/api/watchlist.py +++ /dev/null @@ -1,222 +0,0 @@ -"""自选股 API。""" -from __future__ import annotations - -import logging -import math -import time -from datetime import date - -import polars as pl -from fastapi import APIRouter, Query, Request -from pydantic import BaseModel - -from app.services import watchlist - -logger = logging.getLogger(__name__) - -router = APIRouter(prefix="/api/watchlist", tags=["watchlist"]) - - -class AddRequest(BaseModel): - symbol: str - note: str = "" - - -class BatchAddRequest(BaseModel): - symbols: list[str] - note: str = "" - - -def _with_names(rows: list[dict], request: Request) -> list[dict]: - if not rows: - return rows - try: - df_i = request.app.state.repo.get_instruments() - if df_i.is_empty() or "symbol" not in df_i.columns or "name" not in df_i.columns: - return rows - name_by_symbol = dict(df_i.select(["symbol", "name"]).iter_rows()) - return [{**row, "name": name_by_symbol.get(row.get("symbol"))} for row in rows] - except Exception as e: # noqa: BLE001 - logger.debug("attach watchlist names failed: %s", e) - return rows - - -@router.get("") -def list_all(request: Request): - return {"symbols": _with_names(watchlist.list_symbols(), request)} - - -@router.post("") -def add_one(req: AddRequest, request: Request): - rows = watchlist.add(req.symbol, req.note) - return {"symbols": _with_names(rows, request)} - - -@router.post("/batch") -def add_batch(req: BatchAddRequest, request: Request): - for sym in req.symbols: - watchlist.add(sym, req.note) - return {"symbols": _with_names(watchlist.list_symbols(), request), "added": len(req.symbols)} - - -@router.post("/{symbol}/top") -def move_one_to_top(symbol: str, request: Request): - rows = watchlist.move_to_top(symbol) - return {"symbols": _with_names(rows, request)} - - -@router.delete("/{symbol}") -def remove_one(symbol: str, request: Request): - rows = watchlist.remove(symbol) - return {"symbols": _with_names(rows, request)} - - -@router.delete("") -def clear_all(): - """清空自选列表。""" - count = watchlist.clear() - return {"removed": count} - - -# 自选页需要的列 -_WATCHLIST_COLS = [ - "symbol", "close", "change_pct", "change_amount", "amount", - "turnover_rate", - "amplitude", "annual_vol_20d", - "vol_ratio_5d", - "ma5", "ma10", "ma20", "ma60", - "vol_ma5", "vol_ma10", - "high_60d", "low_60d", - "rsi_6", "rsi_14", "rsi_24", - "macd_dif", "macd_dea", "macd_hist", - "kdj_k", "kdj_d", "kdj_j", - "boll_upper", "boll_lower", - "atr_14", - "momentum_5d", "momentum_10d", "momentum_20d", "momentum_30d", "momentum_60d", - "consecutive_limit_ups", "consecutive_limit_downs", - "signal_limit_up", "signal_limit_down", "signal_volume_surge", - "signal_ma_golden_5_20", "signal_macd_golden", "signal_n_day_high", - "signal_boll_breakout_upper", "signal_ma20_breakout", - "signal_ma_dead_5_20", "signal_macd_dead", "signal_n_day_low", - "signal_boll_breakdown_lower", "signal_ma20_breakdown", -] - - -@router.get("/enriched") -def watchlist_enriched( - request: Request, - ext_columns: str | None = Query(None, description="逗号分隔的 ext 列: config_id.field_name"), -): - """自选股 enriched 数据 — 直接从 enriched 最新日读取, 无即时计算。 - - ext_columns 参数示例: "industry_rating.score,fund_flow.net_inflow" - 会动态 LEFT JOIN 对应的 ext_{config_id} DuckDB view。 - """ - t0 = time.perf_counter() - - repo = request.app.state.repo - symbols = [r["symbol"] for r in watchlist.list_symbols()] - if not symbols: - return {"rows": [], "as_of": None, "elapsed_ms": 0} - - df_e, cache_date = repo.get_enriched_latest() - if df_e.is_empty(): - return {"rows": [], "as_of": None, "elapsed_ms": 0} - - # 按 symbol 过滤 - df = df_e.filter(pl.col("symbol").is_in(symbols)) - if df.is_empty(): - return {"rows": [], "as_of": str(cache_date) if cache_date else None, "elapsed_ms": 0} - - # JOIN instruments 取 name + float_shares - df_i = repo.get_instruments() - if not df_i.is_empty() and "name" in df_i.columns: - inst_cols = [c for c in ["symbol", "name", "float_shares"] if c in df_i.columns] - df = df.join(df_i.select(inst_cols), on="symbol", how="left") - - # 选择内置需要的列 - keep = [c for c in _WATCHLIST_COLS + ["name", "float_shares"] if c in df.columns] - df = df.select(keep) - - # 动态 JOIN 扩展数据表 - ext_specs = _parse_ext_columns(ext_columns) if ext_columns else [] - if ext_specs: - db = repo.store.db - data_dir = repo.store.data_dir - from app.services.ext_data import ExtConfigStore - from app.api.ext_data import _read_ext_dataframe - - ext_store = ExtConfigStore(data_dir) - configs = {c.id: c for c in ext_store.load_all()} - - for config_id, field_name in ext_specs: - view_name = f"ext_{config_id}" - ext_col_name = f"{config_id}__{field_name}" - try: - # 扩展时序数据必须只取最新分区;否则一个 symbol 会按历史分区数被 JOIN 放大。 - cfg = configs.get(config_id) - if cfg: - ext_df, _ = _read_ext_dataframe(cfg, data_dir) - else: - ext_df = pl.from_arrow(db.query( - f"SELECT symbol, \"{field_name}\" FROM {view_name}" - ).arrow()) - if not ext_df.is_empty() and "symbol" in ext_df.columns: - ext_df = ( - ext_df - .select(["symbol", field_name]) - .unique(subset=["symbol"], keep="last") - .rename({field_name: ext_col_name}) - ) - df = df.join(ext_df.select(["symbol", ext_col_name]), on="symbol", how="left") - except Exception: - # view 不存在或字段不存在,尝试直接读 parquet - cfg = configs.get(config_id) - if cfg: - try: - ext_df, _ = _read_ext_dataframe(cfg, data_dir) - if not ext_df.is_empty() and "symbol" in ext_df.columns and field_name in ext_df.columns: - ext_df = ( - ext_df - .select(["symbol", field_name]) - .unique(subset=["symbol"], keep="last") - .rename({field_name: ext_col_name}) - ) - df = df.join(ext_df, on="symbol", how="left") - except Exception as e2: - logger.debug("ext join fallback failed for %s.%s: %s", config_id, field_name, e2) - - # sanitize NaN / Inf - float_cols = [c for c in df.columns if df[c].dtype.is_float()] - if float_cols: - df = df.with_columns([ - pl.when(pl.col(c).is_nan() | pl.col(c).is_infinite()) - .then(None) - .otherwise(pl.col(c)) - .alias(c) - for c in float_cols - ]) - - # 按自选添加顺序(新加的在前)重排行 - order_map = {s: i for i, s in enumerate(symbols)} - df = df.with_columns(pl.col("symbol").map_elements(lambda s: order_map.get(s, len(symbols)), return_dtype=pl.Int32).alias("_sort_order")) - df = df.sort("_sort_order").drop("_sort_order") - - rows = df.to_dicts() - elapsed = (time.perf_counter() - t0) * 1000 - return {"rows": rows, "as_of": str(cache_date) if cache_date else None, "elapsed_ms": elapsed} - - -def _parse_ext_columns(ext_columns: str) -> list[tuple[str, str]]: - """解析 'config_id1.field1,config_id2.field2' 为 [(config_id, field_name), ...]""" - result = [] - for part in ext_columns.split(","): - part = part.strip() - if "." not in part: - continue - config_id, field_name = part.split(".", 1) - config_id = config_id.strip() - field_name = field_name.strip() - if config_id and field_name: - result.append((config_id, field_name)) - return result diff --git a/serve/backend/app/backtest/__init__.py b/serve/backend/app/backtest/__init__.py deleted file mode 100644 index adfd49b..0000000 --- a/serve/backend/app/backtest/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""回测模块 — 因子回测 + 策略回测 + 信号回测。 - -架构: BacktestEngine (共享) → FactorBacktestService / StrategyBacktestService -""" diff --git a/serve/backend/app/backtest/engine.py b/serve/backend/app/backtest/engine.py deleted file mode 100644 index 943490c..0000000 --- a/serve/backend/app/backtest/engine.py +++ /dev/null @@ -1,1532 +0,0 @@ -"""回测引擎 — 共享数据加载 + 撮合 + 统计计算。 - -纯 Polars/NumPy 实现,不依赖 pandas/vectorbt。 -""" -from __future__ import annotations - -import hashlib -import logging -import time -from collections import OrderedDict -from dataclasses import dataclass -from datetime import date -from typing import Callable - -logger = logging.getLogger(__name__) -from typing import Literal - -import numpy as np -import polars as pl - -from app.tickflow.repository import KlineRepository - -logger = logging.getLogger(__name__) - - -# ================================================================ -# 数据结构 -# ================================================================ - -@dataclass -class MatcherConfig: - # matching 为向后兼容入口: 仅传 matching 时, entry_fill/exit_fill 都取 matching 的值。 - # 显式传入 entry_fill/exit_fill 时以二者为准 (允许建仓/清仓口径不同)。 - matching: Literal["close_t", "open_t+1"] = "close_t" - entry_fill: Literal["close_t", "open_t+1"] | None = None - exit_fill: Literal["close_t", "open_t+1"] | None = None - fees_pct: float = 0.0002 - slippage_bps: float = 5.0 - stop_loss_pct: float | None = None - take_profit_pct: float | None = None - trailing_stop_pct: float | None = None - trailing_take_profit_activate_pct: float | None = None - trailing_take_profit_drawdown_pct: float | None = None - max_hold_days: int | None = None - max_positions: int = 10 - max_exposure_pct: float = 1.0 - score_min: float | None = None - score_max: float | None = None - initial_capital: float = 1_000_000.0 - position_sizing: Literal["equal", "score_weight"] = "equal" - - def __post_init__(self) -> None: - # 解析最终口径: 优先 entry_fill/exit_fill, 否则回退到 matching (向后兼容)。 - if self.entry_fill is None: - self.entry_fill = self.matching - if self.exit_fill is None: - self.exit_fill = self.matching - - -@dataclass -class TradeRecord: - symbol: str - entry_date: date - exit_date: date - entry_price: float - exit_price: float - pnl_pct: float - duration: int - exit_reason: str # "signal" | "stop_loss" | "take_profit" | "trailing_stop" | "trailing_take_profit" | "max_hold" | "end" - # 退出优先级 (高→低): pending_exit(历史挂单) > 风控(止损/移动止损/移动止盈) > signal(卖点) > max_hold(到期) > end - name: str = "" - shares: float = 0.0 - lots: float = 0.0 - position_pct: float = 0.0 - entry_value: float = 0.0 - exit_value: float = 0.0 - pnl_amount: float = 0.0 - entry_score: float | None = None - entry_signal_date: date | str | None = None - exit_signal_date: date | str | None = None - blocked_exit_days: int = 0 - - -@dataclass -class SimResult: - equity_curve: list[dict] # [{date, value}] - drawdown_curve: list[dict] # [{date, value}] - trades: list[TradeRecord] - per_symbol_stats: list[dict] - stats: dict - - -# ================================================================ -# PanelCache — 避免重复 scan_parquet + compute_all -# ================================================================ - -class _CacheEntry: - __slots__ = ("df", "ts") - - def __init__(self, df: pl.DataFrame, ts: float): - self.df = df - self.ts = ts - - -class PanelCache: - """LRU + TTL 数据面板缓存。""" - - def __init__(self, max_size: int = 2, ttl_seconds: int = 180): - self._cache: OrderedDict[str, _CacheEntry] = OrderedDict() - self._max_size = max_size - self._ttl = ttl_seconds - - def get_or_compute( - self, - symbols: list[str] | None, - start: date, - end: date, - columns: list[str] | None, - compute_fn, - ) -> pl.DataFrame: - key = self._make_key(symbols, start, end, columns) - now = time.monotonic() - - if key in self._cache: - entry = self._cache[key] - if now - entry.ts < self._ttl: - self._cache.move_to_end(key) - return entry.df - del self._cache[key] - - df = compute_fn(symbols, start, end, columns) - self._cache[key] = _CacheEntry(df=df, ts=now) - if len(self._cache) > self._max_size: - self._cache.popitem(last=False) - return df - - def invalidate(self) -> None: - self._cache.clear() - - @staticmethod - def _make_key(symbols: list[str] | None, start: date, end: date, columns: list[str] | None) -> str: - if symbols is None: - h = "all" - else: - h = hashlib.md5(",".join(sorted(symbols)).encode()).hexdigest()[:12] - cols = "all" if columns is None else hashlib.md5(",".join(sorted(columns)).encode()).hexdigest()[:8] - return f"{h}:{start}:{end}:{cols}" - - -# ================================================================ -# BacktestEngine -# ================================================================ - -class BacktestEngine: - """回测引擎 — 数据加载 + 撮合模拟 + 统计计算。""" - - def __init__(self, repo: KlineRepository) -> None: - self.repo = repo - self._cache = PanelCache() - - # ── 数据加载 ────────────────────────────────────── - - def load_panel( - self, - symbols: list[str] | None, - start: date, - end: date, - columns: list[str] | None = None, - ) -> pl.DataFrame: - """加载 enriched 数据面板,带缓存。""" - return self._cache.get_or_compute(symbols, start, end, columns, self._load_panel_inner) - - def _load_panel_inner( - self, - symbols: list[str] | None, - start: date, - end: date, - columns: list[str] | None = None, - ) -> pl.DataFrame: - t0 = time.perf_counter() - - # 近期区间优先复用 repository 的预计算 enriched 历史缓存,避免重复 scan_parquet + compute_all。 - try: - if self.repo is not None and hasattr(self.repo, "get_enriched_range"): - cached = self.repo.get_enriched_range(start, end, symbols=symbols, columns=columns) - if cached is not None and not cached.is_empty(): - elapsed = (time.perf_counter() - t0) * 1000 - logger.info("load_panel(cache): %.0fms, %d rows, %d columns", elapsed, len(cached), len(cached.columns)) - return cached - except Exception as e: # noqa: BLE001 - logger.debug("backtest load panel cache miss: %s", e) - - enriched_glob = str(self.repo.store.data_dir / "kline_daily_enriched" / "**" / "*.parquet") - - try: - lf = pl.scan_parquet(enriched_glob) - if symbols is not None: - lf = lf.filter(pl.col("symbol").is_in(symbols)) - if columns is not None: - available = set(lf.collect_schema().names()) - selected = [c for c in columns if c in available] - if "symbol" not in selected and "symbol" in available: - selected.insert(0, "symbol") - if "date" not in selected and "date" in available: - selected.insert(1, "date") - lf = lf.select(selected) - df = ( - lf.filter( - (pl.col("date") >= start) - & (pl.col("date") <= end) - ) - .sort(["symbol", "date"]) - .collect(streaming=True) - ) - except Exception as e: - logger.warning("backtest load panel failed: %s", e) - return pl.DataFrame() - - if df.is_empty(): - return df - - if columns is not None: - elapsed = (time.perf_counter() - t0) * 1000 - logger.info("load_panel: %.0fms, %d rows, %d columns", elapsed, len(df), len(df.columns)) - return df - - from app.indicators.pipeline import compute_all - instruments = self.repo.get_instruments() - df = compute_all(df, instruments=instruments) - if not instruments.is_empty() and "name" not in df.columns: - inst_cols = [c for c in ["symbol", "name"] if c in instruments.columns] - if len(inst_cols) == 2: - df = df.join( - instruments.select(inst_cols).unique(subset=["symbol"]), - on="symbol", - how="left", - ) - - elapsed = (time.perf_counter() - t0) * 1000 - logger.info("load_panel: %.0fms, %d rows", elapsed, len(df)) - return df - - # ── 撮合模拟 ────────────────────────────────────── - - def simulate( - self, - panel: pl.DataFrame, - entries: pl.Series | None, - exits: pl.Series | None, - config: MatcherConfig, - ) -> SimResult: - """纯 NumPy 撮合模拟 — 逐 symbol 状态机。""" - if panel.is_empty(): - return self._empty_result() - - n = len(panel) - panel_dates = panel["date"].to_numpy() - panel_symbols = panel["symbol"].to_numpy() - - # 构建信号数组 - ent = np.zeros(n, dtype=bool) - ext = np.zeros(n, dtype=bool) - if entries is not None and len(entries) == n: - ent = entries.to_numpy().astype(bool) - if exits is not None and len(exits) == n: - ext = exits.to_numpy().astype(bool) - - if not ent.any(): - return self._empty_result() - - # 成交口径: entry/exit 可分别配置 close_t (信号当日收盘) 或 open_t+1 (次日开盘)。 - # open_t+1 时信号右移 1 天 (用前一根的信号 + 当根的 open 成交)。 - open_prices = panel["open"].to_numpy() - close_prices = panel["close"].to_numpy() - - # 同一 symbol 内相邻行掩码, 跨 symbol 边界不允许 shift (避免错配)。 - same_prev_symbol = np.zeros(n, dtype=bool) - same_prev_symbol[1:] = panel_symbols[1:] == panel_symbols[:-1] - - entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices - exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices - - if config.entry_fill == "open_t+1": - ent_s = np.zeros(n, dtype=bool) - ent_s[1:] = ent[:-1] & same_prev_symbol - ent = ent_s - if config.exit_fill == "open_t+1": - ext_s = np.zeros(n, dtype=bool) - ext_s[1:] = ext[:-1] & same_prev_symbol - ext = ext_s - - # 逐 symbol 撮合 - trades: list[TradeRecord] = [] - unique_symbols = np.unique(panel_symbols) - - for sym in unique_symbols: - mask = panel_symbols == sym - sym_ent = ent[mask] - sym_ext = ext[mask] - sym_entry_prices = entry_prices[mask] - sym_exit_prices = exit_prices[mask] - sym_close = close_prices[mask] - sym_dates = panel_dates[mask] - - holding = False - entry_idx = -1 - entry_price = 0.0 - hold_days = 0 - - for i in range(len(sym_ent)): - if not holding: - if sym_ent[i]: - holding = True - entry_idx = i - entry_price = float(sym_entry_prices[i]) - hold_days = 0 - else: - hold_days += 1 - exit_triggered = False - exit_reason = "" - - # 止损 — 用当日 close 检测 (优先级最高) - if config.stop_loss_pct is not None: - pnl = (float(sym_close[i]) - entry_price) / entry_price - if pnl <= -abs(config.stop_loss_pct): - exit_triggered = True - exit_reason = "stop_loss" - - # 信号退出 (优先于 max_hold: 卖点信号是策略主动离场) - if not exit_triggered and sym_ext[i]: - exit_triggered = True - exit_reason = "signal" - - # 最大持仓天数 (兜底: 无信号/未止损时强制平仓) - if not exit_triggered and config.max_hold_days is not None: - if hold_days >= config.max_hold_days: - exit_triggered = True - exit_reason = "max_hold" - - if exit_triggered: - exit_price = float(sym_exit_prices[i]) - pnl_pct = (exit_price - entry_price) / entry_price if entry_price > 0 else 0.0 - fee_cost = config.fees_pct * 2 + config.slippage_bps / 10000.0 * 2 - pnl_pct -= fee_cost - - e_date = sym_dates[entry_idx] - x_date = sym_dates[i] - trades.append(TradeRecord( - symbol=str(sym), - entry_date=e_date.item() if hasattr(e_date, "item") else e_date, - exit_date=x_date.item() if hasattr(x_date, "item") else x_date, - entry_price=round(entry_price, 4), - exit_price=round(exit_price, 4), - pnl_pct=round(pnl_pct, 6), - duration=int(hold_days), - exit_reason=exit_reason, - )) - holding = False - - # 净值曲线: 按出场日期归集收益 - all_dates_sorted = np.sort(np.unique(panel_dates)) - equity_curve, drawdown_curve = self._build_curves(trades, all_dates_sorted, config.initial_capital) - - # 统计 - date_min = panel_dates.min() - date_max = panel_dates.max() - d_min = date_min.item() if hasattr(date_min, "item") else date_min - d_max = date_max.item() if hasattr(date_max, "item") else date_max - stats = self._calc_stats(trades, config.initial_capital, d_min, d_max) - per_symbol = self._calc_per_symbol(trades) - - return SimResult( - equity_curve=equity_curve, - drawdown_curve=drawdown_curve, - trades=trades, - per_symbol_stats=per_symbol, - stats=stats, - ) - - def simulate_independent_candidates( - self, - panel: pl.DataFrame, - entries: pl.Series | None, - exits: pl.Series | None, - config: MatcherConfig, - progress_cb: "Callable[[dict], None] | None" = None, - cancel_event: "threading.Event | None" = None, - ) -> SimResult: - """全量候选独立执行:每个买入信号都是独立样本, 不受资金/仓位限制。""" - if panel.is_empty(): - return self._empty_result() - - n = len(panel) - panel_dates = panel["date"].to_numpy() - panel_symbols = panel["symbol"].to_numpy() - - ent_raw = np.zeros(n, dtype=bool) - ext_raw = np.zeros(n, dtype=bool) - if entries is not None and len(entries) == n: - ent_raw = entries.to_numpy().astype(bool) - if exits is not None and len(exits) == n: - ext_raw = exits.to_numpy().astype(bool) - n_candidates = int(ent_raw.sum()) - if n_candidates <= 0: - return self._empty_result() - - entry_signal_dates = np.array([None] * n, dtype=object) - exit_signal_dates = np.array([None] * n, dtype=object) - same_prev_symbol = panel_symbols[1:] == panel_symbols[:-1] - - # 建仓口径: close_t 用信号日收盘, open_t+1 右移到次日 open 成交。 - ent = np.zeros(n, dtype=bool) - if config.entry_fill == "open_t+1": - ent[1:] = ent_raw[:-1] & same_prev_symbol - for idx in np.flatnonzero(ent): - entry_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) - else: - ent = ent_raw - for idx in np.flatnonzero(ent): - entry_signal_dates[idx] = self._date_str(panel_dates[idx]) - - # 清仓口径: 独立于建仓, close_t 用信号日收盘, open_t+1 右移到次日 open。 - ext = np.zeros(n, dtype=bool) - if config.exit_fill == "open_t+1": - ext[1:] = ext_raw[:-1] & same_prev_symbol - for idx in np.flatnonzero(ext): - exit_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) - else: - ext = ext_raw - for idx in np.flatnonzero(ext): - exit_signal_dates[idx] = self._date_str(panel_dates[idx]) - - open_prices = panel["open"].to_numpy() - high_prices = panel["high"].to_numpy() if "high" in panel.columns else open_prices - low_prices = panel["low"].to_numpy() - close_prices = panel["close"].to_numpy() - # 撮合价: 建仓/清仓各自独立选列。 - entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices - exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices - has_volume = "volume" in panel.columns - volumes = panel["volume"].fill_null(0).to_numpy() if has_volume else np.ones(n, dtype=float) - names = panel["name"].fill_null("").to_numpy() if "name" in panel.columns else np.array([""] * n) - scores = panel["score"].fill_null(0).to_numpy() if "score" in panel.columns else np.zeros(n, dtype=float) - trade_scores = scores.copy() - # 评分跟随建仓口径 shift (评分在买入日生效)。 - if config.entry_fill == "open_t+1": - trade_scores[1:] = np.where(panel_symbols[1:] == panel_symbols[:-1], scores[:-1], trade_scores[1:]) - limit_up_flags = ( - panel["signal_limit_up"].fill_null(False).to_numpy().astype(bool) - if "signal_limit_up" in panel.columns else np.zeros(n, dtype=bool) - ) - limit_down_flags = ( - panel["signal_limit_down"].fill_null(False).to_numpy().astype(bool) - if "signal_limit_down" in panel.columns else np.zeros(n, dtype=bool) - ) - - symbol_rows: dict[str, list[int]] = {} - row_pos_in_symbol = np.zeros(n, dtype=int) - for i, sym_value in enumerate(panel_symbols): - sym = str(sym_value) - rows = symbol_rows.setdefault(sym, []) - row_pos_in_symbol[i] = len(rows) - rows.append(i) - - buy_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 - sell_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 - score_min = getattr(config, "score_min", None) - score_max = getattr(config, "score_max", None) - trades: list[TradeRecord] = [] - execution_stats: dict[str, int] = { - "buy_invalid_price": 0, - "buy_suspended": 0, - "buy_limit_up": 0, - "buy_score_filter": 0, - "buy_no_next_bar": max(n_candidates - int(ent.sum()), 0), - "sell_invalid_price": 0, - "sell_suspended": 0, - "sell_limit_down": 0, - "sell_no_future": 0, - "pending_exit": 0, - } - - def _count(key: str) -> None: - execution_stats[key] = execution_stats.get(key, 0) + 1 - - def _valid_price(value) -> bool: - try: - v = float(value) - except (TypeError, ValueError): - return False - return v > 0 and np.isfinite(v) - - def _is_suspended(idx: int) -> bool: - o = float(open_prices[idx]) - h = float(high_prices[idx]) - l = float(low_prices[idx]) - c = float(close_prices[idx]) - valid_bar = any(_valid_price(x) for x in (o, h, l, c)) - if not valid_bar: - return True - if has_volume and float(volumes[idx] or 0) <= 0: - same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) - if same_price: - return True - return False - - def _is_one_price_limit(idx: int, direction: str) -> bool: - if _is_suspended(idx): - return False - o = float(open_prices[idx]) - h = float(high_prices[idx]) - l = float(low_prices[idx]) - c = float(close_prices[idx]) - if not all(_valid_price(x) for x in (o, h, l, c)): - return False - same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) - if direction == "up": - return bool(limit_up_flags[idx]) and same_price - return bool(limit_down_flags[idx]) and same_price - - def _can_buy(idx: int) -> tuple[bool, str]: - if _is_suspended(idx): - return False, "buy_suspended" - if not _valid_price(entry_prices[idx]): - return False, "buy_invalid_price" - if _is_one_price_limit(idx, "up"): - return False, "buy_limit_up" - return True, "" - - def _can_sell(idx: int, exit_price_override: float | None = None) -> tuple[bool, str]: - if _is_suspended(idx): - return False, "sell_suspended" - exit_price = exit_price_override if exit_price_override is not None else exit_prices[idx] - if not _valid_price(exit_price): - return False, "sell_invalid_price" - if _is_one_price_limit(idx, "down"): - return False, "sell_limit_down" - return True, "" - - def _risk_exit(pos: dict, idx: int) -> tuple[str | None, float | None]: - if pos.get("pending_exit_reason") or pos.get("entry_idx") == idx: - return None, None - entry_price = float(pos["entry_price"]) - if entry_price <= 0: - return None, None - open_price = float(open_prices[idx]) - low_price = float(low_prices[idx]) - high_price = float(high_prices[idx]) - peak_price = float(pos.get("max_high", entry_price)) - risk_lines: list[tuple[float, str]] = [] - - if config.stop_loss_pct is not None: - risk_lines.append((entry_price * (1 - abs(config.stop_loss_pct)), "stop_loss")) - if config.trailing_stop_pct is not None and peak_price > 0: - risk_lines.append((peak_price * (1 - abs(config.trailing_stop_pct)), "trailing_stop")) - - activate_pct = getattr(config, "trailing_take_profit_activate_pct", None) - drawdown_pct = getattr(config, "trailing_take_profit_drawdown_pct", None) - if activate_pct is not None and drawdown_pct is not None and peak_price > entry_price: - peak_profit = peak_price / entry_price - 1 - if peak_profit >= abs(float(activate_pct)): - risk_lines.append((entry_price * (1 + peak_profit - abs(float(drawdown_pct))), "trailing_take_profit")) - - risk_lines = [(line, reason) for line, reason in risk_lines if _valid_price(line)] - # 止损/移损/回撤止盈: 价格跌破风控线触发 (取最高优先级线) - if risk_lines: - stop_price, reason = max(risk_lines, key=lambda item: item[0]) - if _valid_price(open_price) and open_price <= stop_price: - return reason, open_price - if _valid_price(low_price) and low_price <= stop_price: - return reason, stop_price - - # 固定止盈: 价格涨破止盈线触发 - tp_pct = getattr(config, "take_profit_pct", None) - if tp_pct is not None: - tp_line = entry_price * (1 + abs(float(tp_pct))) - if _valid_price(tp_line): - # 开盘即超过止盈线 → 以开盘价成交; 否则当日触及高点止盈 - if _valid_price(open_price) and open_price >= tp_line: - return "take_profit", open_price - if _valid_price(high_price) and high_price >= tp_line: - return "take_profit", tp_line - return None, None - - def _try_close(pos: dict, idx: int, reason: str, signal_date: str, exit_price_override: float | None = None) -> bool: - ok, block_reason = _can_sell(idx, exit_price_override) - if not ok: - if not pos.get("pending_exit_reason"): - pos["pending_exit_reason"] = reason - pos["pending_exit_signal_date"] = signal_date - _count("pending_exit") - pos["blocked_exit_days"] = int(pos.get("blocked_exit_days", 0)) + 1 - _count(block_reason) - return False - - exit_price = float(exit_price_override) if exit_price_override is not None else float(exit_prices[idx]) - shares = 100.0 - entry_value = shares * float(pos["entry_price"]) * (1 + buy_cost_pct) - exit_value = shares * exit_price * (1 - sell_cost_pct) - pnl_amount = exit_value - entry_value - pnl_pct = pnl_amount / entry_value if entry_value > 0 else 0.0 - trades.append(TradeRecord( - symbol=str(pos["symbol"]), - name=str(pos.get("name", "")), - entry_date=pos["entry_date"], - exit_date=self._date_str(panel_dates[idx]), - entry_price=round(float(pos["entry_price"]), 4), - exit_price=round(exit_price, 4), - pnl_pct=round(float(pnl_pct), 6), - duration=int(pos["hold_days"]), - exit_reason=reason, - shares=shares, - lots=1.0, - position_pct=0.0, - entry_value=round(float(entry_value), 2), - exit_value=round(float(exit_value), 2), - pnl_amount=round(float(pnl_amount), 2), - entry_score=round(float(pos["entry_score"]), 2) if pos.get("entry_score") is not None else None, - entry_signal_date=pos.get("entry_signal_date"), - exit_signal_date=signal_date, - blocked_exit_days=int(pos.get("blocked_exit_days", 0)), - )) - return True - - candidate_indices = np.flatnonzero(ent) - for seq, entry_idx in enumerate(candidate_indices, start=1): - if cancel_event is not None and cancel_event.is_set(): - logger.info("全量模拟被用户取消 (第 %d/%d 个候选)", seq, len(candidate_indices)) - break - if progress_cb is not None and (seq == 1 or seq % 500 == 0): - try: - progress_cb({ - "day": seq, - "total": len(candidate_indices), - "date": self._date_str(panel_dates[entry_idx]), - "equity": 0, - }) - except Exception: - pass - - ok, block_reason = _can_buy(entry_idx) - if not ok: - _count(block_reason) - continue - score = float(trade_scores[entry_idx] or 0.0) - if score_min is not None and score < score_min: - _count("buy_score_filter") - continue - if score_max is not None and score > score_max: - _count("buy_score_filter") - continue - - sym = str(panel_symbols[entry_idx]) - rows = symbol_rows.get(sym, []) - start_pos = int(row_pos_in_symbol[entry_idx]) - if start_pos >= len(rows): - _count("sell_no_future") - continue - - entry_price = float(entry_prices[entry_idx]) - pos = { - "symbol": sym, - "name": str(names[entry_idx] or ""), - "entry_idx": entry_idx, - "entry_date": self._date_str(panel_dates[entry_idx]), - "entry_signal_date": entry_signal_dates[entry_idx] or self._date_str(panel_dates[entry_idx]), - "entry_price": entry_price, - "entry_score": score, - "hold_days": 0, - "max_high": entry_price, - "pending_exit_reason": None, - "pending_exit_signal_date": None, - "blocked_exit_days": 0, - } - hi = float(high_prices[entry_idx]) - if _valid_price(hi): - pos["max_high"] = max(float(pos["max_high"]), hi) - - closed = False - last_idx = entry_idx - for idx in rows[start_pos + 1:]: - last_idx = idx - pos["hold_days"] = int(pos["hold_days"]) + 1 - d_str = self._date_str(panel_dates[idx]) - - def _scheduled_reason() -> tuple[str | None, str]: - if pos.get("pending_exit_reason"): - return str(pos["pending_exit_reason"]), str(pos.get("pending_exit_signal_date") or d_str) - # 卖点信号优先于到期: 策略主动离场先于 max_hold 兜底。 - if ext[idx]: - return "signal", str(exit_signal_dates[idx] or d_str) - if config.max_hold_days is not None and pos["hold_days"] >= config.max_hold_days: - return "max_hold", d_str - if idx == rows[-1]: - return "end", d_str - return None, d_str - - # 统一退出顺序: 风控(止损/移动止损/止盈)先于计划出场 (signal/max_hold/end)。 - # 无论 entry/exit 口径如何, 风控都是保护性离场, 必须最高优先级。 - reason, override_price = _risk_exit(pos, idx) - if reason and _try_close(pos, idx, reason, d_str, override_price): - closed = True - break - reason, signal_date = _scheduled_reason() - if reason and _try_close(pos, idx, reason, signal_date): - closed = True - break - - hi = float(high_prices[idx]) - if _valid_price(hi): - pos["max_high"] = max(float(pos.get("max_high", entry_price)), hi) - - if not closed: - if last_idx == entry_idx: - _count("sell_no_future") - elif not pos.get("pending_exit_reason"): - _try_close(pos, last_idx, "end", self._date_str(panel_dates[last_idx])) - - return self._calc_independent_candidate_result(trades, n_candidates, execution_stats) - - def simulate_portfolio( - self, - panel: pl.DataFrame, - entries: pl.Series | None, - exits: pl.Series | None, - config: MatcherConfig, - progress_cb: "Callable[[dict], None] | None" = None, - cancel_event: "threading.Event | None" = None, - ) -> SimResult: - """账户级组合回测:日线信号 → 成交约束 → 仓位/现金撮合。""" - if panel.is_empty(): - return self._empty_result() - - n = len(panel) - panel_dates = panel["date"].to_numpy() - panel_symbols = panel["symbol"].to_numpy() - - ent_raw = np.zeros(n, dtype=bool) - ext_raw = np.zeros(n, dtype=bool) - if entries is not None and len(entries) == n: - ent_raw = entries.to_numpy().astype(bool) - if exits is not None and len(exits) == n: - ext_raw = exits.to_numpy().astype(bool) - if not ent_raw.any(): - return self._empty_result() - - entry_signal_dates = np.array([None] * n, dtype=object) - exit_signal_dates = np.array([None] * n, dtype=object) - same_prev_symbol = panel_symbols[1:] == panel_symbols[:-1] - - # 建仓口径: close_t 用信号日收盘, open_t+1 右移到次日 open 成交。 - ent = np.zeros(n, dtype=bool) - if config.entry_fill == "open_t+1": - ent[1:] = ent_raw[:-1] & same_prev_symbol - for idx in np.flatnonzero(ent): - entry_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) - else: - ent = ent_raw - for idx in np.flatnonzero(ent): - entry_signal_dates[idx] = self._date_str(panel_dates[idx]) - - # 清仓口径: 独立于建仓。 - ext = np.zeros(n, dtype=bool) - if config.exit_fill == "open_t+1": - ext[1:] = ext_raw[:-1] & same_prev_symbol - for idx in np.flatnonzero(ext): - exit_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) - else: - ext = ext_raw - for idx in np.flatnonzero(ext): - exit_signal_dates[idx] = self._date_str(panel_dates[idx]) - - open_prices = panel["open"].to_numpy() - high_prices = panel["high"].to_numpy() if "high" in panel.columns else open_prices - low_prices = panel["low"].to_numpy() - close_prices = panel["close"].to_numpy() - # 撮合价: 建仓/清仓各自独立选列。 - entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices - exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices - has_volume = "volume" in panel.columns - volumes = panel["volume"].fill_null(0).to_numpy() if has_volume else np.ones(n, dtype=float) - names = ( - panel["name"].fill_null("").to_numpy() - if "name" in panel.columns else np.array([""] * n) - ) - scores = ( - panel["score"].fill_null(0).to_numpy() - if "score" in panel.columns else np.zeros(n, dtype=float) - ) - trade_scores = scores.copy() - # 评分跟随建仓口径 shift (评分在买入日生效)。 - if config.entry_fill == "open_t+1": - trade_scores[1:] = np.where(panel_symbols[1:] == panel_symbols[:-1], scores[:-1], trade_scores[1:]) - limit_up_flags = ( - panel["signal_limit_up"].fill_null(False).to_numpy().astype(bool) - if "signal_limit_up" in panel.columns else np.zeros(n, dtype=bool) - ) - limit_down_flags = ( - panel["signal_limit_down"].fill_null(False).to_numpy().astype(bool) - if "signal_limit_down" in panel.columns else np.zeros(n, dtype=bool) - ) - - date_to_indices: dict[str, list[int]] = {} - for i, d in enumerate(panel_dates): - d_str = self._date_str(d) - date_to_indices.setdefault(d_str, []).append(i) - all_dates = sorted(date_to_indices.keys()) - if not all_dates: - return self._empty_result() - - buy_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 - sell_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 - cash = float(config.initial_capital) - peak = cash - max_positions = max(int(config.max_positions), 0) - max_exposure_pct = min(max(float(getattr(config, "max_exposure_pct", 1.0)), 0.0), 1.0) - score_min = getattr(config, "score_min", None) - score_max = getattr(config, "score_max", None) - positions: dict[str, dict] = {} - last_close: dict[str, float] = {} - trades: list[TradeRecord] = [] - equity_curve: list[dict] = [] - drawdown_curve: list[dict] = [] - execution_stats: dict[str, int] = { - "buy_invalid_price": 0, - "buy_suspended": 0, - "buy_limit_up": 0, - "buy_no_slot": 0, - "buy_cash": 0, - "buy_lot_size": 0, - "buy_same_day_reentry": 0, - "buy_exposure": 0, - "buy_score_filter": 0, - "sell_invalid_price": 0, - "sell_suspended": 0, - "sell_limit_down": 0, - "pending_exit": 0, - } - - def _count(key: str) -> None: - execution_stats[key] = execution_stats.get(key, 0) + 1 - - def _valid_price(value) -> bool: - try: - v = float(value) - except (TypeError, ValueError): - return False - return v > 0 and np.isfinite(v) - - def _market_value() -> float: - value = 0.0 - for pos in positions.values(): - mark = last_close.get(pos["symbol"], pos["entry_price"]) - value += pos["shares"] * mark - return value - - def _is_suspended(idx: int) -> bool: - o = float(open_prices[idx]) - h = float(high_prices[idx]) - l = float(low_prices[idx]) - c = float(close_prices[idx]) - valid_bar = any(_valid_price(x) for x in (o, h, l, c)) - if not valid_bar: - return True - if has_volume and float(volumes[idx] or 0) <= 0: - same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) - if same_price: - return True - return False - - def _is_one_price_limit(idx: int, direction: str) -> bool: - if _is_suspended(idx): - return False - o = float(open_prices[idx]) - h = float(high_prices[idx]) - l = float(low_prices[idx]) - c = float(close_prices[idx]) - if not all(_valid_price(x) for x in (o, h, l, c)): - return False - same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) - if direction == "up": - return bool(limit_up_flags[idx]) and same_price - return bool(limit_down_flags[idx]) and same_price - - def _can_buy(idx: int) -> tuple[bool, str]: - if _is_suspended(idx): - return False, "buy_suspended" - if not _valid_price(entry_prices[idx]): - return False, "buy_invalid_price" - if _is_one_price_limit(idx, "up"): - return False, "buy_limit_up" - return True, "" - - def _can_sell(idx: int, exit_price_override: float | None = None) -> tuple[bool, str]: - if _is_suspended(idx): - return False, "sell_suspended" - exit_price = exit_price_override if exit_price_override is not None else exit_prices[idx] - if not _valid_price(exit_price): - return False, "sell_invalid_price" - if _is_one_price_limit(idx, "down"): - return False, "sell_limit_down" - return True, "" - - def _mark_pending(sym: str, reason: str, signal_date: str) -> None: - pos = positions[sym] - if not pos.get("pending_exit_reason"): - pos["pending_exit_reason"] = reason - pos["pending_exit_signal_date"] = signal_date - _count("pending_exit") - pos["blocked_exit_days"] = int(pos.get("blocked_exit_days", 0)) + 1 - - def _sell( - sym: str, - idx: int, - reason: str, - signal_date: str, - sold_today: set[str], - exit_price_override: float | None = None, - ) -> None: - nonlocal cash - pos = positions.pop(sym) - exit_price = float(exit_price_override) if exit_price_override is not None else float(exit_prices[idx]) - exit_value = pos["shares"] * exit_price * (1 - sell_cost_pct) - cash += exit_value - pnl_amount = exit_value - pos["entry_value"] - pnl_pct = (exit_value - pos["entry_value"]) / pos["entry_value"] if pos["entry_value"] > 0 else 0.0 - sold_today.add(sym) - trades.append(TradeRecord( - symbol=sym, - name=pos.get("name", ""), - entry_date=pos["entry_date"], - exit_date=self._date_str(panel_dates[idx]), - entry_price=round(float(pos["entry_price"]), 4), - exit_price=round(exit_price, 4), - pnl_pct=round(float(pnl_pct), 6), - duration=int(pos["hold_days"]), - exit_reason=reason, - shares=round(float(pos["shares"]), 4), - lots=round(float(pos["lots"]), 2), - position_pct=round(float(pos.get("position_pct", 0.0)), 6), - entry_value=round(float(pos["entry_value"]), 2), - exit_value=round(float(exit_value), 2), - pnl_amount=round(float(pnl_amount), 2), - entry_score=round(float(pos["entry_score"]), 2) if pos.get("entry_score") is not None else None, - entry_signal_date=pos.get("entry_signal_date"), - exit_signal_date=signal_date, - blocked_exit_days=int(pos.get("blocked_exit_days", 0)), - )) - - def _try_sell( - sym: str, - idx: int | None, - reason: str, - signal_date: str, - sold_today: set[str], - exit_price_override: float | None = None, - ) -> bool: - if idx is None: - _mark_pending(sym, reason, signal_date) - _count("sell_suspended") - return False - ok, block_reason = _can_sell(idx, exit_price_override) - if not ok: - _mark_pending(sym, reason, signal_date) - _count(block_reason) - return False - _sell(sym, idx, reason, signal_date, sold_today, exit_price_override) - return True - - def _process_scheduled_exits( - d_idx: int, - d_str: str, - row_by_symbol: dict[str, int], - sold_today: set[str], - ) -> None: - for sym in list(positions.keys()): - pos = positions.get(sym) - if pos is None: - continue - idx = row_by_symbol.get(sym) - reason = "" - signal_date = d_str - if pos.get("pending_exit_reason"): - reason = str(pos["pending_exit_reason"]) - signal_date = str(pos.get("pending_exit_signal_date") or d_str) - # 卖点信号优先于到期: 策略主动离场先于 max_hold 兜底。 - elif idx is not None and ext[idx]: - reason = "signal" - signal_date = str(exit_signal_dates[idx] or d_str) - elif config.max_hold_days is not None and pos["hold_days"] >= config.max_hold_days: - reason = "max_hold" - elif d_idx == len(all_dates) - 1: - reason = "end" - if reason: - _try_sell(sym, idx, reason, signal_date, sold_today) - - def _process_risk_exits(d_str: str, row_by_symbol: dict[str, int], sold_today: set[str]) -> None: - for sym in list(positions.keys()): - pos = positions.get(sym) - if pos is None or pos.get("pending_exit_reason"): - continue - if pos.get("entry_date") == d_str: - continue - idx = row_by_symbol.get(sym) - if idx is None or pos["entry_price"] <= 0: - continue - open_price = float(open_prices[idx]) - low_price = float(low_prices[idx]) - high_price = float(high_prices[idx]) - entry_price = float(pos["entry_price"]) - peak_price = float(pos.get("max_high", entry_price)) - risk_lines: list[tuple[float, str]] = [] - - if config.stop_loss_pct is not None: - risk_lines.append((entry_price * (1 - abs(config.stop_loss_pct)), "stop_loss")) - - if config.trailing_stop_pct is not None and peak_price > 0: - risk_lines.append((peak_price * (1 - abs(config.trailing_stop_pct)), "trailing_stop")) - - activate_pct = getattr(config, "trailing_take_profit_activate_pct", None) - drawdown_pct = getattr(config, "trailing_take_profit_drawdown_pct", None) - if activate_pct is not None and drawdown_pct is not None and peak_price > entry_price: - peak_profit = peak_price / entry_price - 1 - if peak_profit >= abs(float(activate_pct)): - take_profit_line = entry_price * (1 + peak_profit - abs(float(drawdown_pct))) - risk_lines.append((take_profit_line, "trailing_take_profit")) - - # 止损/移损/回撤止盈: 价格跌破风控线触发 - risk_lines = [(line, reason) for line, reason in risk_lines if _valid_price(line)] - if risk_lines: - stop_price, reason = max(risk_lines, key=lambda item: item[0]) - exit_price_override = None - if _valid_price(open_price) and open_price <= stop_price: - exit_price_override = open_price - elif _valid_price(low_price) and low_price <= stop_price: - exit_price_override = stop_price - if exit_price_override is not None: - _try_sell(sym, idx, reason, d_str, sold_today, exit_price_override) - continue - - # 固定止盈: 价格涨破止盈线触发 - tp_pct = getattr(config, "take_profit_pct", None) - if tp_pct is not None: - tp_line = entry_price * (1 + abs(float(tp_pct))) - if _valid_price(tp_line): - if _valid_price(open_price) and open_price >= tp_line: - _try_sell(sym, idx, "take_profit", d_str, sold_today, open_price) - elif _valid_price(high_price) and high_price >= tp_line: - _try_sell(sym, idx, "take_profit", d_str, sold_today, tp_line) - - def _process_entries( - d_str: str, - idxs: list[int], - sold_today: set[str], - ) -> None: - nonlocal cash - if max_positions <= 0: - return - candidates: list[tuple[int, str, float]] = [] - for idx in idxs: - if not ent[idx]: - continue - sym = str(panel_symbols[idx]) - if sym in positions: - continue - if sym in sold_today: - _count("buy_same_day_reentry") - continue - ok, block_reason = _can_buy(idx) - if not ok: - _count(block_reason) - continue - score = float(trade_scores[idx] or 0.0) - if score_min is not None and score < score_min: - _count("buy_score_filter") - continue - if score_max is not None and score > score_max: - _count("buy_score_filter") - continue - candidates.append((idx, sym, score)) - if not candidates: - return - candidates.sort(key=lambda x: x[2], reverse=True) - - slots = max_positions - len(positions) - if slots <= 0: - execution_stats["buy_no_slot"] += len(candidates) - return - - selected = candidates[:slots] - market_value_before = _market_value() - account_equity_before_buy = cash + market_value_before - if account_equity_before_buy <= 0 or max_exposure_pct <= 0: - execution_stats["buy_exposure"] += len(selected) - return - target_position_value = account_equity_before_buy * max_exposure_pct / max_positions - max_exposure_value = account_equity_before_buy * max_exposure_pct - exposure_capacity = max_exposure_value - market_value_before - if exposure_capacity <= 0: - execution_stats["buy_exposure"] += len(selected) - return - - weights = np.repeat(1 / len(selected), len(selected)) - if config.position_sizing == "score_weight": - raw = np.array([max(x[2], 0.0) for x in selected], dtype=float) - if raw.sum() > 0: - weights = raw / raw.sum() - total_budget = min(cash, exposure_capacity, target_position_value * len(selected)) - - for (idx, sym, _score), weight in zip(selected, weights): - if len(positions) >= max_positions: - _count("buy_no_slot") - break - current_market_value = _market_value() - current_equity = cash + current_market_value - current_exposure_capacity = current_equity * max_exposure_pct - current_market_value - allocation = min(total_budget * float(weight), target_position_value, cash, current_exposure_capacity) - if allocation <= 0: - _count("buy_exposure") - continue - entry_price = float(entry_prices[idx]) - shares = np.floor(allocation / (entry_price * (1 + buy_cost_pct)) / 100) * 100 - entry_value = shares * entry_price * (1 + buy_cost_pct) - if shares <= 0: - _count("buy_lot_size") - continue - if entry_value > cash + 1e-6: - _count("buy_cash") - continue - if entry_value > current_exposure_capacity + 1e-6: - _count("buy_exposure") - continue - cash -= entry_value - positions[sym] = { - "symbol": sym, - "name": str(names[idx] or ""), - "entry_date": self._date_str(panel_dates[idx]), - "entry_signal_date": entry_signal_dates[idx] or self._date_str(panel_dates[idx]), - "entry_price": entry_price, - "entry_value": entry_value, - "shares": shares, - "lots": shares / 100, - "position_pct": entry_value / account_equity_before_buy if account_equity_before_buy > 0 else 0.0, - "entry_score": _score, - "max_high": entry_price, - "hold_days": 0, - "pending_exit_reason": None, - "pending_exit_signal_date": None, - "blocked_exit_days": 0, - } - - for d_idx, d_str in enumerate(all_dates): - if d_idx % 20 == 0: - if cancel_event is not None and cancel_event.is_set(): - logger.info("回测被用户取消 (第 %d/%d 天)", d_idx, len(all_dates)) - break - if progress_cb is not None: - try: - progress_cb({ - "day": d_idx + 1, - "total": len(all_dates), - "date": str(d_str)[:10], - "equity": round(cash + _market_value(), 2), - }) - except Exception: - pass - - idxs = date_to_indices[d_str] - row_by_symbol = {str(panel_symbols[i]): i for i in idxs} - sold_today: set[str] = set() - - for pos in positions.values(): - pos["hold_days"] += 1 - - # 统一执行顺序 (不分口径): 风控(止损/移动止损/止盈) → 计划出场(signal/max_hold/end) → 建仓。 - # 风控是保护性离场, 必须最先; 计划出场次之; 建仓最后 (卖出释放的现金/仓位先用于满足新买)。 - # 当天新建仓不会被风控误杀 (_process_risk_exits 跳过 entry_date == d_str 的仓位)。 - _process_risk_exits(d_str, row_by_symbol, sold_today) - _process_scheduled_exits(d_idx, d_str, row_by_symbol, sold_today) - if d_idx < len(all_dates) - 1: - _process_entries(d_str, idxs, sold_today) - - for sym, pos in positions.items(): - idx = row_by_symbol.get(sym) - if idx is not None: - hi = float(high_prices[idx]) - if _valid_price(hi): - pos["max_high"] = max(float(pos.get("max_high", pos["entry_price"])), hi) - - for i in idxs: - c = float(close_prices[i]) - if c > 0 and np.isfinite(c): - last_close[str(panel_symbols[i])] = c - - market_value = _market_value() - equity = cash + market_value - peak = max(peak, equity) - dd = (equity - peak) / peak if peak > 0 else 0.0 - exposure = market_value / equity if equity > 0 else 0.0 - equity_curve.append({ - "date": d_str[:10], - "value": round(float(equity), 2), - "cash": round(float(cash), 2), - "positions": len(positions), - "exposure": round(float(exposure), 4), - }) - drawdown_curve.append({"date": d_str[:10], "value": round(float(dd), 4)}) - - stats = self._calc_portfolio_stats(equity_curve, trades, config.initial_capital) - stats["execution"] = execution_stats - stats["pending_exit_positions"] = sum(1 for p in positions.values() if p.get("pending_exit_reason")) - per_symbol = self._calc_per_symbol(trades) - return SimResult( - equity_curve=equity_curve, - drawdown_curve=drawdown_curve, - trades=trades, - per_symbol_stats=per_symbol, - stats=stats, - ) - - # ── 净值曲线 ────────────────────────────────────── - - @staticmethod - def _build_curves( - trades: list[TradeRecord], - all_dates: np.ndarray, - initial_capital: float, - ) -> tuple[list[dict], list[dict]]: - """从交易记录构建日频净值曲线和回撤曲线。 - - 资金模型: 每笔交易等权分配 (1/N_capital),N_capital = 同时持仓数上限。 - 简化版: 按出场日归集所有已平仓交易的平均收益作为当日组合收益。 - """ - if not trades or len(all_dates) == 0: - return [], [] - - # 按出场日归集 pnl - exit_pnl: dict[str, list[float]] = {} - for t in trades: - d_str = str(t.exit_date) - exit_pnl.setdefault(d_str, []).append(t.pnl_pct) - - equity = initial_capital - peak = initial_capital - curve: list[dict] = [] - dd_curve: list[dict] = [] - - for d in all_dates: - d_str = str(d.item() if hasattr(d, "item") else d) - pnls = exit_pnl.get(d_str, []) - # 当日组合收益 = 该日所有出场交易的平均收益 - daily_ret = float(np.mean(pnls)) if pnls else 0.0 - equity *= (1 + daily_ret) - peak = max(peak, equity) - dd = (equity - peak) / peak if peak > 0 else 0.0 - curve.append({"date": d_str[:10], "value": round(equity, 2)}) - dd_curve.append({"date": d_str[:10], "value": round(dd, 4)}) - - return curve, dd_curve - - # ── 统计计算 ────────────────────────────────────── - - @staticmethod - def _calc_stats( - trades: list[TradeRecord], - initial_capital: float, - start: date, - end: date, - ) -> dict: - if not trades: - return {"total_return": 0, "n_trades": 0} - - pnls = np.array([t.pnl_pct for t in trades]) - n_trades = len(trades) - - # 从净值曲线推算总收益 (等权组合) - cumulative = 1.0 - for p in pnls: - cumulative *= (1 + p) - # 修正: 等权组合的总收益不等于各笔复乘,用曲线终点更准 - # 但这里作为简化,用各笔复乘作为近似 - total_return = cumulative - 1.0 - - # 年化 - n_days = max((end - start).days, 1) - years = n_days / 365.25 - if total_return > -1.0 and years > 0: - annual_return = (1 + total_return) ** (1 / years) - 1 - else: - annual_return = total_return - - # 胜率 - wins = pnls[pnls > 0] - losses = pnls[pnls <= 0] - win_rate = len(wins) / n_trades - - # 盈亏比 - avg_win = float(np.mean(wins)) if len(wins) > 0 else 0.0 - avg_loss = abs(float(np.mean(losses))) if len(losses) > 0 else 0.0 - profit_factor = avg_win / avg_loss if avg_loss > 0 else (float("inf") if avg_win > 0 else 0.0) - - # 最大回撤 — 用交易序列近似 - equity = initial_capital - peak = initial_capital - max_dd = 0.0 - for p in pnls: - equity *= (1 + p) - peak = max(peak, equity) - dd = (equity - peak) / peak - max_dd = min(max_dd, dd) - - # 夏普 — 用交易收益标准差近似 - sharpe = float(np.mean(pnls) / np.std(pnls)) * np.sqrt(252) if np.std(pnls) > 0 else 0.0 - - # Calmar - calmar = annual_return / abs(max_dd) if abs(max_dd) > 0.001 else 0.0 - - return { - "total_return": round(float(total_return), 4), - "annual_return": round(float(annual_return), 4), - "max_drawdown": round(float(max_dd), 4), - "sharpe": round(float(sharpe), 2), - "calmar": round(float(calmar), 2), - "win_rate": round(float(win_rate), 4), - "profit_factor": round(float(profit_factor), 2) if np.isfinite(profit_factor) else None, - "n_trades": n_trades, - "avg_pnl": round(float(np.mean(pnls)), 4), - "avg_win": round(avg_win, 4), - "avg_loss": round(avg_loss, 4), - } - - @staticmethod - def _calc_per_symbol(trades: list[TradeRecord]) -> list[dict]: - if not trades: - return [] - by_sym: dict[str, dict] = {} - for t in trades: - s = t.symbol - d = by_sym.setdefault(s, { - "symbol": s, "n_trades": 0, "total_return": 1.0, - "best": -999.0, "worst": 999.0, "wins": 0, "pnls": [], - }) - d["n_trades"] += 1 - d["pnls"].append(t.pnl_pct) - d["total_return"] *= (1 + t.pnl_pct) - d["best"] = max(d["best"], t.pnl_pct) - d["worst"] = min(d["worst"], t.pnl_pct) - if t.pnl_pct > 0: - d["wins"] += 1 - - result = [] - for d in by_sym.values(): - result.append({ - "symbol": d["symbol"], - "n_trades": d["n_trades"], - "total_return": round(d["total_return"] - 1.0, 4), - "win_rate": round(d["wins"] / d["n_trades"], 4) if d["n_trades"] > 0 else 0.0, - "best": round(d["best"], 4), - "worst": round(d["worst"], 4), - }) - return sorted(result, key=lambda x: x["total_return"], reverse=True) - - @staticmethod - def _calc_independent_candidate_result( - trades: list[TradeRecord], - n_candidates: int, - execution_stats: dict[str, int], - ) -> SimResult: - """全量独立候选统计:按每个候选样本的实际执行收益聚合。""" - if not trades: - return SimResult( - equity_curve=[], - drawdown_curve=[], - trades=[], - per_symbol_stats=[], - stats={ - "mode": "full", - "full_kind": "candidate_execution", - "error": "no executable trades", - "n_candidates": int(n_candidates), - "n_trades": 0, - "execution": execution_stats, - }, - ) - - pnls = np.array([t.pnl_pct for t in trades], dtype=float) - durations = np.array([t.duration for t in trades], dtype=float) - wins = pnls[pnls > 0] - losses = pnls[pnls <= 0] - avg_win = float(np.mean(wins)) if len(wins) else 0.0 - avg_loss = abs(float(np.mean(losses))) if len(losses) else 0.0 - - # 按退出日聚合已实现样本收益, 构造“样本收益曲线”。它不是账户净值。 - daily_returns: dict[str, list[float]] = {} - for t in trades: - daily_returns.setdefault(str(t.exit_date)[:10], []).append(float(t.pnl_pct)) - - equity_curve: list[dict] = [] - drawdown_curve: list[dict] = [] - equity = 1.0 - peak = 1.0 - daily_avg: list[float] = [] - for d_str in sorted(daily_returns.keys()): - values = daily_returns[d_str] - avg_ret = float(np.mean(values)) if values else 0.0 - daily_avg.append(avg_ret) - equity *= (1 + avg_ret) - peak = max(peak, equity) - dd = (equity - peak) / peak if peak > 0 else 0.0 - equity_curve.append({ - "date": d_str, - "value": round(float(equity), 4), - "positions": len(values), - }) - drawdown_curve.append({"date": d_str, "value": round(float(dd), 4)}) - - values = np.array([r["value"] for r in equity_curve], dtype=float) - total_return = float(values[-1] - 1.0) if len(values) else 0.0 - peaks = np.maximum.accumulate(values) if len(values) else np.array([]) - drawdowns = values / peaks - 1 if len(values) else np.array([]) - max_drawdown = float(drawdowns.min()) if len(drawdowns) else 0.0 - daily = np.array(daily_avg, dtype=float) - sharpe = float(np.mean(daily) / np.std(daily) * np.sqrt(252)) if len(daily) > 1 and np.std(daily) > 0 else 0.0 - - lo, hi, nbins = -0.20, 0.20, 20 - clipped = np.clip(pnls, lo, hi) - counts, edges = np.histogram(clipped, bins=nbins, range=(lo, hi)) - dist = [ - { - "range": f"{(edges[i]*100):+.0f}~{(edges[i+1]*100):+.0f}%", - "count": int(counts[i]), - "ratio": round(float(counts[i] / pnls.size), 4) if pnls.size else 0.0, - } - for i in range(nbins) - ] - - stats = { - "mode": "full", - "full_kind": "candidate_execution", - "n_candidates": int(n_candidates), - "n_trades": int(len(trades)), - "n_days": int(len(daily_returns)), - "avg_daily_candidates": round(float(len(trades) / max(len(daily_returns), 1)), 1), - "avg_return": round(float(np.mean(pnls)), 4), - "median_return": round(float(np.median(pnls)), 4), - "win_rate": round(float(len(wins) / len(pnls)), 4) if len(pnls) else 0.0, - "profit_factor": round(float(avg_win / avg_loss), 2) if avg_loss > 0 else None, - "best": round(float(np.max(pnls)), 4), - "worst": round(float(np.min(pnls)), 4), - "avg_duration": round(float(np.mean(durations)), 1) if len(durations) else 0.0, - "total_return": round(float(total_return), 4), - "max_drawdown": round(float(max_drawdown), 4), - "sharpe": round(float(sharpe), 2), - "return_distribution": dist, - "execution": execution_stats, - } - - return SimResult( - equity_curve=equity_curve, - drawdown_curve=drawdown_curve, - trades=trades, - per_symbol_stats=BacktestEngine._calc_per_symbol(trades), - stats=stats, - ) - - @staticmethod - def _calc_portfolio_stats( - equity_curve: list[dict], - trades: list[TradeRecord], - initial_capital: float, - ) -> dict: - if not equity_curve: - return {"total_return": 0, "n_trades": 0} - final_equity = float(equity_curve[-1]["value"]) - total_return = final_equity / initial_capital - 1 if initial_capital > 0 else 0.0 - values = np.array([float(r["value"]) for r in equity_curve], dtype=float) - daily = values[1:] / values[:-1] - 1 if len(values) > 1 else np.array([]) - annual_return = (1 + total_return) ** (252 / max(len(equity_curve), 1)) - 1 if total_return > -1 else total_return - peaks = np.maximum.accumulate(values) - drawdowns = values / peaks - 1 - max_drawdown = float(drawdowns.min()) if len(drawdowns) else 0.0 - sharpe = float(np.mean(daily) / np.std(daily) * np.sqrt(252)) if len(daily) and np.std(daily) > 0 else 0.0 - pnls = np.array([t.pnl_pct for t in trades], dtype=float) if trades else np.array([]) - exposures = np.array([float(r.get("exposure", 0.0)) for r in equity_curve], dtype=float) - wins = pnls[pnls > 0] - losses = pnls[pnls <= 0] - avg_win = float(np.mean(wins)) if len(wins) else 0.0 - avg_loss = abs(float(np.mean(losses))) if len(losses) else 0.0 - return { - "total_return": round(float(total_return), 4), - "annual_return": round(float(annual_return), 4), - "max_drawdown": round(float(max_drawdown), 4), - "sharpe": round(float(sharpe), 2), - "calmar": round(float(annual_return / abs(max_drawdown)), 2) if abs(max_drawdown) > 0.001 else 0.0, - "win_rate": round(float(len(wins) / len(pnls)), 4) if len(pnls) else 0.0, - "profit_factor": round(float(avg_win / avg_loss), 2) if avg_loss > 0 else None, - "n_trades": len(trades), - "avg_pnl": round(float(np.mean(pnls)), 4) if len(pnls) else 0.0, - "avg_win": round(avg_win, 4), - "avg_loss": round(avg_loss, 4), - "final_equity": round(final_equity, 2), - "initial_capital": round(float(initial_capital), 2), - "avg_exposure": round(float(np.mean(exposures)), 4) if len(exposures) else 0.0, - "max_exposure": round(float(np.max(exposures)), 4) if len(exposures) else 0.0, - } - - @staticmethod - def _date_str(value) -> str: - value = value.item() if hasattr(value, "item") else value - return str(value)[:10] - - @staticmethod - def _empty_result() -> SimResult: - return SimResult( - equity_curve=[], drawdown_curve=[], trades=[], - per_symbol_stats=[], stats={"error": "no data or no signals"}, - ) - - # ── 截面工具 (因子回测用) ───────────────────────── - - @staticmethod - def cross_section_rank(panel: pl.DataFrame, col: str) -> pl.DataFrame: - return panel.with_columns( - pl.col(col).rank(method="random").over("date").alias(f"{col}_rank") - ) - - @staticmethod - def cross_section_qcut(panel: pl.DataFrame, col: str, n_groups: int) -> pl.DataFrame: - return panel.with_columns( - pl.col(col).qcut(n_groups, labels=[f"Q{i+1}" for i in range(n_groups)]) - .over("date").alias("_group") - ) diff --git a/serve/backend/app/backtest/factor.py b/serve/backend/app/backtest/factor.py deleted file mode 100644 index 740582a..0000000 --- a/serve/backend/app/backtest/factor.py +++ /dev/null @@ -1,480 +0,0 @@ -"""因子回测服务 — IC/IR 分析 + 分层回测 + 多空组合。 - -纯 Polars 向量化实现,无 pandas 依赖。 -""" -from __future__ import annotations - -import logging -import time -import uuid -from dataclasses import dataclass, field -from datetime import date, timedelta -from typing import Literal - -import numpy as np -import polars as pl - -from app.backtest.engine import BacktestEngine - -logger = logging.getLogger(__name__) - -# 可用因子列 (从 ENRICHED_COLUMNS 过滤出数值型指标) -FACTOR_COLUMNS: list[dict] = [ - {"id": "momentum_5d", "label": "5日动量", "group": "动量", "desc": "5日涨跌幅,正值表示上涨趋势"}, - {"id": "momentum_10d", "label": "10日动量", "group": "动量", "desc": "10日涨跌幅,中短期趋势指标"}, - {"id": "momentum_20d", "label": "20日动量", "group": "动量", "desc": "月度涨跌幅,常用因子"}, - {"id": "momentum_30d", "label": "30日动量", "group": "动量", "desc": "30日涨跌幅"}, - {"id": "momentum_60d", "label": "60日动量", "group": "动量", "desc": "季度涨跌幅,中期动量"}, - {"id": "rsi_6", "label": "RSI(6)", "group": "超买超卖", "desc": "6日相对强弱指标,敏感度高"}, - {"id": "rsi_14", "label": "RSI(14)", "group": "超买超卖", "desc": "14日相对强弱指标,经典周期"}, - {"id": "rsi_24", "label": "RSI(24)", "group": "超买超卖", "desc": "24日相对强弱指标"}, - {"id": "annual_vol_20d","label": "20日波动率", "group": "波动率", "desc": "20日年化波动率"}, - {"id": "atr_14", "label": "ATR(14)", "group": "波动率", "desc": "14日平均真实波幅"}, - {"id": "vol_ratio_5d", "label": "量比(5日)", "group": "量价", "desc": "当日成交量 / 5日均量"}, - {"id": "turnover_rate", "label": "换手率", "group": "量价", "desc": "当日换手率"}, - {"id": "macd_hist", "label": "MACD柱", "group": "趋势", "desc": "MACD柱状图值"}, - {"id": "kdj_k", "label": "KDJ-K", "group": "趋势", "desc": "KDJ指标K值"}, - {"id": "change_pct", "label": "日涨跌幅", "group": "基础", "desc": "当日涨跌幅"}, - {"id": "amplitude", "label": "日振幅", "group": "基础", "desc": "当日振幅 (最高-最低)/昨收"}, -] - -FACTOR_WARMUP_DAYS = 120 - - -@dataclass -class FactorConfig: - factor_name: str - symbols: list[str] | None - start: date - end: date - n_groups: int = 5 - rebalance: Literal["daily", "weekly", "monthly"] = "monthly" - weight: Literal["equal", "factor_weight"] = "equal" - fees_pct: float = 0.0002 - slippage_bps: float = 5.0 - - -@dataclass -class GroupStats: - group: int - label: str - total_return: float - annual_return: float - max_drawdown: float - sharpe: float - win_rate: float - - -@dataclass -class FactorResult: - run_id: str - config: dict - # IC 分析 - ic_mean: float | None = None - ic_std: float | None = None - ir: float | None = None - ic_win_rate: float | None = None - ic_series: list[dict] = field(default_factory=list) - # 分层 - group_stats: list[dict] = field(default_factory=list) - group_nav: list[dict] = field(default_factory=list) - # 多空 - long_short_stats: dict = field(default_factory=dict) - long_short_nav: list[dict] = field(default_factory=list) - # 元信息 - elapsed_ms: float = 0.0 - n_symbols: int = 0 - n_dates: int = 0 - error: str | None = None - - -class FactorBacktestService: - def __init__(self, engine: BacktestEngine) -> None: - self.engine = engine - - def run(self, config: FactorConfig) -> FactorResult: - t0 = time.perf_counter() - run_id = uuid.uuid4().hex[:10] - - def _err(msg: str) -> FactorResult: - return FactorResult( - run_id=run_id, - config=self._config_to_dict(config), - error=msg, - elapsed_ms=(time.perf_counter() - t0) * 1000, - ) - - # 加载基础面板: 当前 enriched parquet 只持久化基础列, 指标因子可能需要运行时计算。 - panel_columns = ["symbol", "date", "open", "high", "low", "close", "volume", "turnover_rate"] - if config.factor_name not in panel_columns: - panel_columns.append(config.factor_name) - load_start = config.start - if config.factor_name not in {"turnover_rate"}: - load_start = config.start - timedelta(days=FACTOR_WARMUP_DAYS) - - panel = self.engine.load_panel( - config.symbols, - load_start, - config.end, - columns=panel_columns, - ) - if panel.is_empty(): - return _err("无数据,请检查日期范围或先运行盘后管道") - - factor_col = config.factor_name - if factor_col not in panel.columns: - panel = self._compute_missing_factor(panel, factor_col) - if factor_col not in panel.columns: - return _err(f"因子列 '{factor_col}' 不存在于 enriched 数据中, 且无法从基础行情计算") - if "close" not in panel.columns: - return _err("enriched 数据缺少收盘价 close") - panel = panel.select(["symbol", "date", "close", factor_col]) - panel = panel.filter((pl.col("date") >= config.start) & (pl.col("date") <= config.end)) - - # 过滤有效行 - panel = panel.filter( - pl.col(factor_col).is_not_null() - & pl.col("close").is_not_null() - & (pl.col("close") > 0) - ) - if panel.is_empty(): - return _err("过滤后无有效数据") - - n_symbols = panel["symbol"].n_unique() - n_dates = panel["date"].n_unique() - - # 计算下期收益 - # 根据调仓频率计算不同周期的 forward return - if config.rebalance == "daily": - panel = panel.with_columns( - (pl.col("close").shift(-1).over("symbol") / pl.col("close") - 1) - .alias("_next_return") - ) - else: - # weekly/monthly: 计算到下个调仓日的收益 - panel = self._calc_period_return(panel, config.rebalance) - - # ── 1. IC 分析 ── - ic_df = self._calc_ic(panel, factor_col) - ic_series = [ - {"date": str(row["date"]), "ic": round(float(row["ic"]), 4)} - for row in ic_df.iter_rows(named=True) - if row["ic"] is not None and not np.isnan(float(row["ic"])) - ] - ic_values = [r["ic"] for r in ic_series] - ic_mean = float(np.mean(ic_values)) if ic_values else None - ic_std = float(np.std(ic_values)) if ic_values else None - ir = (ic_mean / ic_std) if (ic_mean is not None and ic_std and ic_std > 1e-8) else None - ic_win_rate = (sum(1 for v in ic_values if v > 0) / len(ic_values)) if ic_values else None - - # ── 2. 分层回测 ── - panel = self._add_groups(panel, factor_col, config.n_groups) - group_nav = self._calc_group_nav(panel, config) - group_stats = self._calc_group_stats(group_nav, config.start, config.end) - - # ── 3. 多空组合 ── - long_short_nav, long_short_stats = self._calc_long_short(group_nav, config) - - elapsed = (time.perf_counter() - t0) * 1000 - return FactorResult( - run_id=run_id, - config=self._config_to_dict(config), - ic_mean=round(ic_mean, 4) if ic_mean is not None else None, - ic_std=round(ic_std, 4) if ic_std is not None else None, - ir=round(ir, 4) if ir is not None else None, - ic_win_rate=round(ic_win_rate, 4) if ic_win_rate is not None else None, - ic_series=ic_series, - group_stats=group_stats, - group_nav=group_nav, - long_short_stats=long_short_stats, - long_short_nav=long_short_nav, - elapsed_ms=round(elapsed, 1), - n_symbols=n_symbols, - n_dates=n_dates, - ) - - @staticmethod - def _compute_missing_factor(panel: pl.DataFrame, factor_col: str) -> pl.DataFrame: - required = {"symbol", "date", "open", "high", "low", "close", "volume"} - if not required.issubset(panel.columns): - missing = sorted(required - set(panel.columns)) - logger.warning("factor %s cannot be computed, missing columns: %s", factor_col, missing) - return panel - - from app.indicators.pipeline import compute_indicators - - computed = compute_indicators(panel) - if factor_col not in computed.columns: - return panel - return computed.select(["symbol", "date", "close", factor_col]) - - # ── IC 计算 ── - - @staticmethod - def _calc_ic(panel: pl.DataFrame, factor_col: str) -> pl.DataFrame: - """计算截面 Rank IC (因子值 rank vs 下期收益 rank 的相关系数)。""" - return ( - panel.filter(pl.col("_next_return").is_not_null()) - .group_by("date") - .agg( - pl.corr( - pl.col(factor_col).rank(method="random"), - pl.col("_next_return").rank(method="random"), - ).alias("ic") - ) - .sort("date") - ) - - # ── 调仓期收益 ── - - @staticmethod - def _calc_period_return(panel: pl.DataFrame, rebalance: str) -> pl.DataFrame: - """计算到下个调仓日的收益。 - - weekly: 下周一的 open / 今日 close - 1 - monthly: 下月首个交易日的 open / 今日 close - 1 - 只在调仓日标记行有效,其他行为 null。 - """ - import datetime as _dt - - all_dates = sorted(panel["date"].unique().to_list()) - date_set = set(all_dates) - - if rebalance == "weekly": - # 调仓日 = 每周一 - rebalance_dates = set() - for d in all_dates: - if hasattr(d, "weekday"): - wd = d.weekday() - else: - wd = _dt.date.fromisoformat(str(d)).weekday() - if wd == 0: # Monday - rebalance_dates.add(d) - else: # monthly - # 调仓日 = 每月首个交易日 - seen_months: set[str] = set() - rebalance_dates = set() - for d in sorted(all_dates): - m = str(d)[:7] # "YYYY-MM" - if m not in seen_months: - seen_months.add(m) - rebalance_dates.add(d) - - if not rebalance_dates: - panel = panel.with_columns(pl.lit(None).cast(pl.Float64).alias("_next_return")) - return panel - - # 对每个调仓日,找到下一个调仓日 - sorted_rebalance = sorted(rebalance_dates) - next_rebalance_map: dict = {} - for i, d in enumerate(sorted_rebalance): - if i + 1 < len(sorted_rebalance): - next_rebalance_map[d] = sorted_rebalance[i + 1] - # 最后一个调仓日没有下一个,不计算收益 - - # 构建 (date, symbol) → next_rebalance_date 的 close 价格映射 - # 简化: 用下个调仓日的 close / 当前 close - panel = panel.sort(["symbol", "date"]) - dates_col = panel["date"].to_list() - close_col = panel["close"].to_list() - symbol_col = panel["symbol"].to_list() - - # 先找下个调仓日的 close - # 建立 (date, symbol) → close 的快速查找 - price_map: dict[tuple, float] = {} - for i in range(len(dates_col)): - price_map[(str(dates_col[i]), symbol_col[i])] = close_col[i] - - next_returns = [None] * len(panel) - for i in range(len(panel)): - d = dates_col[i] - d_val = d if isinstance(d, _dt.date) else _dt.date.fromisoformat(str(d)) - if d not in rebalance_dates: - continue - next_d = next_rebalance_map.get(d) - if next_d is None: - continue - next_d_str = str(next_d)[:10] - d_str = str(d)[:10] - sym = symbol_col[i] - next_close = price_map.get((next_d_str, sym)) - cur_close = close_col[i] - if next_close is not None and cur_close and cur_close > 0: - next_returns[i] = (next_close / cur_close - 1.0) - - panel = panel.with_columns( - pl.Series("_next_return", next_returns, dtype=pl.Float64) - ) - return panel - - # ── 分组 ── - - @staticmethod - def _add_groups(panel: pl.DataFrame, factor_col: str, n_groups: int) -> pl.DataFrame: - """截面分位数分组。""" - return panel.with_columns( - pl.col(factor_col) - .qcut(n_groups, labels=[f"Q{i+1}" for i in range(n_groups)]) - .over("date") - .alias("_group") - ) - - # ── 分组净值 ── - - @staticmethod - def _calc_group_nav(panel: pl.DataFrame, config: FactorConfig) -> list[dict]: - """计算分组净值曲线 — 只在调仓日更新净值。""" - # 只保留有下期收益的行 (= 调仓日) - group_ret = ( - panel.filter(pl.col("_next_return").is_not_null() & pl.col("_group").is_not_null()) - .group_by(["date", "_group"]) - .agg(pl.col("_next_return").mean().alias("group_return")) - ) - - # pivot: date × group - pivot = group_ret.pivot(index="date", columns="_group", values="group_return").sort("date") - - if pivot.is_empty(): - return [] - - group_cols = [c for c in pivot.columns if c != "date"] - - # 累乘净值曲线 - result: list[dict] = [] - nav_values: dict[str, float] = {c: 1.0 for c in group_cols} - - for row in pivot.iter_rows(named=True): - entry: dict = {"date": str(row["date"])[:10]} - for c in group_cols: - ret = float(row[c]) if row[c] is not None else 0.0 - nav_values[c] *= (1 + ret) - entry[c] = round(nav_values[c], 4) - result.append(entry) - - return result - - # ── 分组统计 ── - - @staticmethod - def _calc_group_stats( - group_nav: list[dict], start: date, end: date, - ) -> list[dict]: - if not group_nav: - return [] - - group_cols = [k for k in group_nav[0] if k != "date"] - n_days = max((end - start).days, 1) - years = n_days / 365.25 - - stats = [] - for i, c in enumerate(sorted(group_cols)): - values = [r[c] for r in group_nav if r.get(c) is not None] - if not values: - continue - total_return = values[-1] - 1.0 - annual_return = (values[-1]) ** (1 / max(years, 0.01)) - 1 if values[-1] > 0 else 0.0 - - # 最大回撤 - peak = 1.0 - max_dd = 0.0 - for v in values: - peak = max(peak, v) - dd = (v - peak) / peak - max_dd = min(max_dd, dd) - - # 日收益序列 - daily_rets = [] - for j in range(1, len(values)): - if values[j - 1] > 0: - daily_rets.append(values[j] / values[j - 1] - 1) - - # 夏普 - if daily_rets: - arr = np.array(daily_rets) - sharpe = float(np.mean(arr) / np.std(arr)) * np.sqrt(252) if np.std(arr) > 0 else 0.0 - win_rate = float(np.mean(arr > 0)) - else: - sharpe = 0.0 - win_rate = 0.0 - - stats.append({ - "group": i + 1, - "label": c, - "total_return": round(total_return, 4), - "annual_return": round(annual_return, 4), - "max_drawdown": round(max_dd, 4), - "sharpe": round(sharpe, 2), - "win_rate": round(win_rate, 4), - }) - - return stats - - # ── 多空组合 ── - - @staticmethod - def _calc_long_short( - group_nav: list[dict], config: FactorConfig, - ) -> tuple[list[dict], dict]: - """多空组合: 做多最高组 + 做空最低组。""" - if not group_nav: - return [], {} - - group_cols = sorted([k for k in group_nav[0] if k != "date"]) - if len(group_cols) < 2: - return [], {} - - top_col = group_cols[-1] # Q5 (最高) - bottom_col = group_cols[0] # Q1 (最低) - - # 独立计算 top 和 bottom 的日收益,然后合成 - ls_value = 1.0 - prev_top = 1.0 - prev_bot = 1.0 - peak = 1.0 - max_dd = 0.0 - ls_nav: list[dict] = [] - - for row in group_nav: - top_nav = float(row.get(top_col, 1.0)) if row.get(top_col) is not None else 1.0 - bot_nav = float(row.get(bottom_col, 1.0)) if row.get(bottom_col) is not None else 1.0 - - # top 组收益 (做多) - top_ret = (top_nav / prev_top - 1) if prev_top > 0 else 0.0 - # bottom 组收益 (做空 = 取反) - bot_ret = -(bot_nav / prev_bot - 1) if prev_bot > 0 else 0.0 - # 多空组合收益 - ls_ret = (top_ret + bot_ret) / 2 # 各分配 50% 资金 - ls_value *= (1 + ls_ret) - - prev_top = top_nav - prev_bot = bot_nav - - peak = max(peak, ls_value) - dd = (ls_value - peak) / peak if peak > 0 else 0.0 - max_dd = min(max_dd, dd) - - ls_nav.append({"date": row["date"], "value": round(ls_value, 4)}) - - total_ret = ls_value - 1.0 - ls_stats = { - "total_return": round(total_ret, 4), - "max_drawdown": round(max_dd, 4), - "top_group": top_col, - "bottom_group": bottom_col, - } - - return ls_nav, ls_stats - - @staticmethod - def _config_to_dict(c: FactorConfig) -> dict: - return { - "factor_name": c.factor_name, - "symbols": c.symbols, - "start": str(c.start), - "end": str(c.end), - "n_groups": c.n_groups, - "rebalance": c.rebalance, - "weight": c.weight, - "fees_pct": c.fees_pct, - "slippage_bps": c.slippage_bps, - } diff --git a/serve/backend/app/backtest/strategy.py b/serve/backend/app/backtest/strategy.py deleted file mode 100644 index 0518fb3..0000000 --- a/serve/backend/app/backtest/strategy.py +++ /dev/null @@ -1,721 +0,0 @@ -"""策略回测服务 — 复用 StrategyDef 体系做全周期回测。 - -核心优化: 向量化 filter_fn,不逐日调用 StrategyEngine.run()。 -""" -from __future__ import annotations - -import logging -import time -import uuid -from dataclasses import dataclass, field -from datetime import date, timedelta -from typing import Callable, Literal - -import numpy as np -import polars as pl - -from app.backtest.engine import BacktestEngine, MatcherConfig, SimResult -from app.strategy.engine import StrategyEngine, StrategyDef - -logger = logging.getLogger(__name__) - -BENCHMARK_SYMBOL = "000001.SH" - - -@dataclass -class StrategyBacktestConfig: - strategy_id: str - symbols: list[str] | None - start: date - end: date - params: dict | None = None - overrides: dict | None = None - # matching 为向后兼容入口; 显式传 entry_fill/exit_fill 时以二者为准。 - matching: Literal["close_t", "open_t+1"] = "open_t+1" - entry_fill: Literal["close_t", "open_t+1"] | None = None - exit_fill: Literal["close_t", "open_t+1"] | None = None - fees_pct: float = 0.0002 - slippage_bps: float = 5.0 - max_positions: int = 10 - max_exposure_pct: float = 1.0 - initial_capital: float = 1_000_000.0 - position_sizing: Literal["equal", "score_weight"] = "equal" - mode: Literal["position", "full"] = "position" - holding_days: int = 5 - - def __post_init__(self) -> None: - if self.entry_fill is None: - self.entry_fill = self.matching - if self.exit_fill is None: - self.exit_fill = self.matching - - -@dataclass -class StrategyBacktestResult: - run_id: str - config: dict - stats: dict = field(default_factory=dict) - equity_curve: list[dict] = field(default_factory=list) - drawdown_curve: list[dict] = field(default_factory=list) - benchmark_curve: list[dict] = field(default_factory=list) - trades: list[dict] = field(default_factory=list) - per_symbol_stats: list[dict] = field(default_factory=list) - strategy_info: dict = field(default_factory=dict) - elapsed_ms: float = 0.0 - error: str | None = None - - -class StrategyBacktestService: - def __init__( - self, - engine: BacktestEngine, - strategy_engine: StrategyEngine, - ) -> None: - self.engine = engine - self.strategy_engine = strategy_engine - - def run( - self, - config: StrategyBacktestConfig, - progress_cb: "Callable[[dict], None] | None" = None, - cancel_event: "threading.Event | None" = None, - ) -> StrategyBacktestResult: - t0 = time.perf_counter() - run_id = uuid.uuid4().hex[:10] - - def _err(msg: str) -> StrategyBacktestResult: - return StrategyBacktestResult( - run_id=run_id, - config=self._config_to_dict(config), - error=msg, - elapsed_ms=(time.perf_counter() - t0) * 1000, - ) - - # 获取策略定义 - try: - s = self.strategy_engine.get(config.strategy_id) - except ValueError as e: - return _err(str(e)) - - params = self._normalize_params(config.params or {}, s) - overrides = config.overrides or {} - basic_filter = self._effective_basic_filter(s, overrides) - entry_signals = self._effective_signals(overrides, "entry_signals", s.entry_signals) - exit_signals = self._effective_signals(overrides, "exit_signals", s.exit_signals) - stop_loss = self._override_value(overrides, "stop_loss", s.stop_loss) - take_profit = self._normalize_pct( - self._override_value(overrides, "take_profit", getattr(s, "take_profit", None)), - 0.01, - 5.0, - ) - trailing_stop = self._normalize_pct( - self._override_value(overrides, "trailing_stop", getattr(s, "trailing_stop", None)), - 0.005, - 0.5, - ) - trailing_take_profit_activate = self._normalize_pct( - self._override_value(overrides, "trailing_take_profit_activate", getattr(s, "trailing_take_profit_activate", None)), - 0.01, - 2.0, - ) - trailing_take_profit_drawdown = self._normalize_pct( - self._override_value(overrides, "trailing_take_profit_drawdown", getattr(s, "trailing_take_profit_drawdown", None)), - 0.005, - 0.5, - ) - if trailing_take_profit_activate is not None and trailing_take_profit_drawdown is not None: - trailing_take_profit_drawdown = min(trailing_take_profit_drawdown, trailing_take_profit_activate) - max_hold_days = self._override_value(overrides, "max_hold_days", s.max_hold_days) - score_min, score_max = self._normalize_score_range( - overrides.get("score_min"), - overrides.get("score_max"), - ) - - timing_ms: dict[str, float] = {} - - # 加载面板 (含 warmup + 全量指标 + 信号)。warmup 只用于指标/形态计算, 不参与正式交易。 - warmup_days = max(120, int(max(s.lookback_days or 1, 1) * 1.5)) - load_start = config.start - timedelta(days=warmup_days) - - # 全量模式: entries 只在正式区间触发, exits 需要 end 之后的尾部数据继续执行策略卖点。 - # 若策略有 max_hold_days, 用它决定尾部窗口;否则 holding_days 只作为兜底观察上限。 - full_horizon_days = int(max_hold_days or config.holding_days or 5) - full_horizon_days = max(full_horizon_days, 1) - load_end = config.end - if config.mode == "full": - fwd_buffer = full_horizon_days + 5 # 多取几天, 容错停牌缺口/open_t+1 - load_end = config.end + timedelta(days=fwd_buffer * 2) # 日历日放宽, 确保覆盖 N 个交易日 - - t_load = time.perf_counter() - panel = self.engine.load_panel(config.symbols, load_start, load_end) - timing_ms["load_panel"] = round((time.perf_counter() - t_load) * 1000, 1) - if panel.is_empty(): - return _err("无数据,请检查日期范围或先运行盘后管道") - - formal_range = self._date_range_mask(panel, config.start, config.end) - if not formal_range.any(): - return _err("正式回测区间内无数据") - - t_signal = time.perf_counter() - - # basic_filter 只影响买入候选, 不能删除行情 panel, 否则持仓 mark / 卖出 / full forward return 都会失真。 - basic_mask = pl.Series("_basic", [True] * len(panel), dtype=pl.Boolean) - if basic_filter and basic_filter.get("enabled", True): - expr = StrategyEngine._basic_filter_expr(panel, basic_filter) - if expr is not None: - try: - basic_mask = panel.select(expr.alias("_basic"))["_basic"].fill_null(False).cast(pl.Boolean) - except Exception as e: # noqa: BLE001 - logger.warning("basic_filter mask failed: %s", e) - return _err(f"基础过滤计算失败: {e}") - - # 策略候选层用于评分归一化;entry_signals 只是买点层, 不参与 score universe。 - candidate_filter_mask = self._build_candidate_filter_mask(panel, s, params) - candidate_mask = basic_mask & candidate_filter_mask - panel = self._apply_score(panel, s, overrides, universe_mask=candidate_mask) - - entry_mask = self._build_entry_mask_from_candidate(panel, candidate_mask, s, entry_signals) - entry_mask = entry_mask & formal_range - raw_exit_mask = self._build_signal_mask(panel, exit_signals, "_exit") - exit_mask = raw_exit_mask & (self._date_range_mask(panel, config.start, load_end) if config.mode == "full" else formal_range) - timing_ms["signals_score"] = round((time.perf_counter() - t_signal) * 1000, 1) - - if not entry_mask.any(): - return _err("在指定区间内未产生买入信号") - - # warmup 之后才交给撮合;full mode 保留 end 之后前瞻段用于 shift(-N)。 - sim_end = load_end if config.mode == "full" else config.end - sim_range = self._date_range_mask(panel, config.start, sim_end) - sim_panel = panel.filter(sim_range) - sim_entry_mask = entry_mask.filter(sim_range) - sim_exit_mask = exit_mask.filter(sim_range) - if sim_panel.is_empty(): - return _err("正式回测区间内无数据") - - t_sim = time.perf_counter() - matcher_config = MatcherConfig( - matching=config.matching, - entry_fill=config.entry_fill, - exit_fill=config.exit_fill, - fees_pct=config.fees_pct, - slippage_bps=config.slippage_bps, - stop_loss_pct=stop_loss, - take_profit_pct=take_profit, - trailing_stop_pct=trailing_stop, - trailing_take_profit_activate_pct=trailing_take_profit_activate, - trailing_take_profit_drawdown_pct=trailing_take_profit_drawdown, - max_hold_days=max_hold_days, - max_positions=config.max_positions, - max_exposure_pct=config.max_exposure_pct, - score_min=score_min, - score_max=score_max, - initial_capital=config.initial_capital, - position_sizing=config.position_sizing, - ) - # 撮合 — full 为全候选独立执行;position 为账户级仓位模拟。 - if config.mode == "full": - result = self.engine.simulate_independent_candidates( - sim_panel, - sim_entry_mask, - sim_exit_mask, - matcher_config, - progress_cb, - cancel_event, - ) - else: - result = self.engine.simulate_portfolio(sim_panel, sim_entry_mask, sim_exit_mask, matcher_config, progress_cb, cancel_event) - timing_ms["simulate"] = round((time.perf_counter() - t_sim) * 1000, 1) - - # 检查是否被取消 - if cancel_event is not None and cancel_event.is_set(): - return StrategyBacktestResult( - run_id=run_id, - config=self._config_to_dict(config), - error="cancelled", - elapsed_ms=round((time.perf_counter() - t0) * 1000, 1), - ) - - if result.stats.get("error"): - return _err(result.stats["error"]) - - timing_ms["total"] = round((time.perf_counter() - t0) * 1000, 1) - result.stats["timing_ms"] = timing_ms - result.stats["panel_rows"] = int(sim_panel.height) - - benchmark_curve = self._build_benchmark_curve(config.start, config.end) - - # 构建策略信息 - strategy_info = { - "id": s.meta.get("id", config.strategy_id), - "name": s.meta.get("name", config.strategy_id), - "description": s.meta.get("description", ""), - "entry_signals": entry_signals, - "exit_signals": exit_signals, - "stop_loss": stop_loss, - "take_profit": take_profit, - "trailing_stop": trailing_stop, - "trailing_take_profit_activate": trailing_take_profit_activate, - "trailing_take_profit_drawdown": trailing_take_profit_drawdown, - "max_hold_days": max_hold_days, - "full_horizon_days": full_horizon_days, - "score_min": score_min, - "score_max": score_max, - "source": s.source, - } - - elapsed = (time.perf_counter() - t0) * 1000 - - return StrategyBacktestResult( - run_id=run_id, - config=self._config_to_dict(config), - stats=result.stats, - equity_curve=result.equity_curve, - drawdown_curve=result.drawdown_curve, - benchmark_curve=benchmark_curve, - trades=[self._trade_to_dict(t) for t in result.trades], - per_symbol_stats=result.per_symbol_stats, - strategy_info=strategy_info, - elapsed_ms=round(elapsed, 1), - ) - - # ── 全量模拟 (选股能力统计, 不建组合不算净值) ── - - def _run_full_simulation( - self, - panel: pl.DataFrame, - entry_mask: pl.Series, - holding_days: int, - ) -> SimResult: - """对 entry_mask 命中的全部候选, 算持有 N 天后的前瞻收益统计。 - - 不受 max_positions/资金约束, 反映策略选股能力本身。 - equity_curve 复用为"累计日均超额收益曲线"(基准归零)。 - """ - n = holding_days if holding_days and holding_days > 0 else 5 - - df = panel.with_columns([ - entry_mask.cast(pl.Boolean).alias("_is_candidate"), - (pl.col("close").shift(-n).over("symbol") / pl.col("close") - 1).alias("_fwd_return"), - ]).filter( - pl.col("_is_candidate") - & pl.col("_fwd_return").is_not_null() - & pl.col("_fwd_return").is_not_nan() - ) - - if df.is_empty(): - return self.engine._empty_result() - - fwd = df["_fwd_return"].to_numpy() - wins = fwd[fwd > 0] - losses = fwd[fwd <= 0] - avg_win = float(wins.mean()) if wins.size else 0.0 - avg_loss = abs(float(losses.mean())) if losses.size else 0.0 - - # 按日聚合: 当日候选的平均前瞻收益 - daily = ( - df.group_by("date").agg( - pl.col("_fwd_return").mean().alias("avg_ret"), - pl.col("_fwd_return").count().alias("n_cand"), - ).sort("date") - ) - - # 累计超额曲线: 每日复利平均收益 (基准归零, 故 equity 即累计策略收益) - equity_curve: list[dict] = [] - equity = 1.0 - peak = 1.0 - drawdown_curve: list[dict] = [] - for row in daily.iter_rows(named=True): - ret = float(row["avg_ret"] or 0.0) - equity *= (1 + ret) - peak = max(peak, equity) - dd = (equity - peak) / peak if peak > 0 else 0.0 - d_str = str(row["date"])[:10] - equity_curve.append({ - "date": d_str, - "value": round(equity, 4), - "positions": int(row["n_cand"]), - }) - drawdown_curve.append({"date": d_str, "value": round(dd, 4)}) - - # 同期上证收益 (用 benchmark close 算) - benchmark_curve = self._build_benchmark_curve( - daily["date"].min(), daily["date"].max() - ) - benchmark_return = 0.0 - if benchmark_curve: - closes = [b["close"] for b in benchmark_curve if b.get("close")] - if len(closes) >= 2 and closes[0] > 0: - benchmark_return = closes[-1] / closes[0] - 1 - - total_return = equity - 1.0 - max_dd = min((d["value"] for d in drawdown_curve), default=0.0) - - # 日收益序列算 Sharpe (年化) - daily_rets = daily["avg_ret"].to_numpy() - sharpe = ( - float(daily_rets.mean() / daily_rets.std() * np.sqrt(252)) - if daily_rets.size > 1 and daily_rets.std() > 0 else 0.0 - ) - - # 收益分布直方图: 按 [-20%, +20%] 分 21 档 (每档 2%), 超出归入首尾档 - lo, hi, nbins = -0.20, 0.20, 20 - clipped = np.clip(fwd, lo, hi) - counts, edges = np.histogram(clipped, bins=nbins, range=(lo, hi)) - dist = [ - { - "range": f"{(edges[i]*100):+.0f}~{(edges[i+1]*100):+.0f}%", - "count": int(counts[i]), - "ratio": round(float(counts[i] / fwd.size), 4) if fwd.size else 0.0, - } - for i in range(nbins) - ] - - stats = { - "mode": "full", - "n_candidates": int(fwd.size), - "n_days": int(daily.height), - "avg_daily_candidates": round(float(daily["n_cand"].mean()), 1), - "avg_return": round(float(fwd.mean()), 4), - "median_return": round(float(np.median(fwd)), 4), - "win_rate": round(float(wins.size / fwd.size), 4) if fwd.size else 0.0, - "profit_factor": round(avg_win / avg_loss, 2) if avg_loss > 0 else None, - "best": round(float(fwd.max()), 4), - "worst": round(float(fwd.min()), 4), - "total_return": round(float(total_return), 4), - "max_drawdown": round(float(max_dd), 4), - "sharpe": round(sharpe, 2), - "benchmark_return": round(float(benchmark_return), 4), - "excess": round(float(total_return - benchmark_return), 4), - "return_distribution": dist, - } - - return SimResult( - equity_curve=equity_curve, - drawdown_curve=drawdown_curve, - trades=[], - per_symbol_stats=[], - stats=stats, - ) - - # ── 向量化信号生成 ── - - @staticmethod - def _date_range_mask(panel: pl.DataFrame, start: date, end: date) -> pl.Series: - return panel.select( - ((pl.col("date") >= start) & (pl.col("date") <= end)).alias("_range") - )["_range"].fill_null(False).cast(pl.Boolean) - - def _build_candidate_filter_mask( - self, - panel: pl.DataFrame, - s: StrategyDef, - params: dict, - ) -> pl.Series: - """生成策略候选层 mask。filter_history/filter 决定候选池, 不包含 entry_signals。""" - false_mask = pl.Series("_candidate_filter", [False] * len(panel), dtype=pl.Boolean) - true_mask = pl.Series("_candidate_filter", [True] * len(panel), dtype=pl.Boolean) - - history_failed = False - # 优先: filter_history_fn 策略 (涨停/反包等多日形态, 与选股路径共用同一逻辑) - if s.filter_history_fn: - try: - hit_df = s.filter_history_fn(panel, params) - if hit_df is None or hit_df.is_empty(): - return false_mask - # 命中行 (symbol,date) → 转 panel 等长布尔 mask - hits = hit_df.select(["symbol", "date"]).unique() - marked = ( - panel.select(["symbol", "date"]) - .join( - hits.with_columns(pl.lit(True).alias("_hit")), - on=["symbol", "date"], - how="left", - ) - ) - return marked["_hit"].fill_null(False).cast(pl.Boolean) - except Exception as e: - history_failed = True - logger.warning("strategy filter_history_fn failed: %s", e) - # 失败则回退到 filter_fn (若存在) - - # 策略 filter_fn: 候选层 (filter_history 不可用或失败时) - if s.filter_fn: - try: - expr = s.filter_fn(panel, params) - if expr is not None: - result = panel.select(expr.alias("_candidate_filter")) - if not result.is_empty(): - return result["_candidate_filter"].fill_null(False).cast(pl.Boolean) - except Exception as e: - logger.warning("strategy filter_fn failed: %s", e) - return false_mask - - if history_failed: - return false_mask - - # 没有策略候选层时, 由 entry_signals 直接决定买点。 - return true_mask - - def _build_entry_mask_from_candidate( - self, - panel: pl.DataFrame, - candidate_mask: pl.Series, - s: StrategyDef, - entry_signals: list[str], - ) -> pl.Series: - """向量化生成买入掩码:候选层 AND 买点层;无买点时只用策略候选层。""" - signal_mask = self._build_signal_mask(panel, entry_signals, "_entry_signal") - if entry_signals: - return candidate_mask & signal_mask - if s.filter_history_fn or s.filter_fn: - return candidate_mask - return pl.Series("_entry", [False] * len(panel), dtype=pl.Boolean) - - def _build_entry_mask( - self, - panel: pl.DataFrame, - s: StrategyDef, - params: dict, - entry_signals: list[str], - ) -> pl.Series: - """兼容旧调用: 候选层 AND 买点层。""" - candidate_mask = self._build_candidate_filter_mask(panel, s, params) - return self._build_entry_mask_from_candidate(panel, candidate_mask, s, entry_signals) - - @staticmethod - def _build_signal_mask(panel: pl.DataFrame, signals: list[str], name: str) -> pl.Series: - """向量化合并信号列,多个信号 OR。支持内置 signal_ 与自定义 csg_ 前缀。""" - masks: list[pl.Series] = [] - for sig in signals: - # csg_ (自定义信号) 直接用;否则按 signal_ 解析 - col = sig if (sig.startswith("signal_") or sig.startswith("csg_")) else f"signal_{sig}" - if col in panel.columns: - masks.append(panel[col].fill_null(False).cast(pl.Boolean)) - - if not masks: - return pl.Series(name, [False] * len(panel), dtype=pl.Boolean) - - combined = masks[0] - for m in masks[1:]: - combined = combined | m - return combined - - def _build_benchmark_curve(self, start: date, end: date) -> list[dict]: - try: - df = self.engine.repo.get_index_daily(BENCHMARK_SYMBOL, start, end, columns=["date", "close"]) - except Exception as e: - logger.warning("load benchmark %s failed: %s", BENCHMARK_SYMBOL, e) - return [] - - if df.is_empty() or "close" not in df.columns: - return [] - - df = df.filter(pl.col("close").is_not_null() & (pl.col("close") > 0)).sort("date") - if df.is_empty(): - return [] - - return [ - { - "date": str(row["date"])[:10], - "value": round(float(row["close"]), 4), - "close": round(float(row["close"]), 4), - "name": "上证指数", - "symbol": BENCHMARK_SYMBOL, - } - for row in df.iter_rows(named=True) - if row["close"] is not None - ] - - # ── 工具 ── - - @staticmethod - def _effective_basic_filter(s: StrategyDef, overrides: dict) -> dict: - basic_filter = dict(s.basic_filter or {}) - override_filter = overrides.get("basic_filter") - if isinstance(override_filter, dict): - basic_filter.update(override_filter) - return basic_filter - - @staticmethod - def _effective_signals(overrides: dict, key: str, default: list[str]) -> list[str]: - value = overrides.get(key) - if isinstance(value, list): - return [str(v) for v in value if v] - return list(default or []) - - @staticmethod - def _override_value(overrides: dict, key: str, default): - if key in overrides: - return overrides.get(key) - return default - - @staticmethod - def _normalize_pct(value, min_value: float, max_value: float) -> float | None: - if value is None or value == "": - return None - try: - pct = abs(float(value)) - except (TypeError, ValueError): - return None - return min(max(pct, min_value), max_value) - - @staticmethod - def _normalize_score_range(min_value, max_value) -> tuple[float | None, float | None]: - def _bound(value) -> float | None: - if value is None or value == "": - return None - try: - score = float(value) - except (TypeError, ValueError): - return None - if not np.isfinite(score): - return None - return min(max(score, 0.0), 100.0) - - score_min = _bound(min_value) - score_max = _bound(max_value) - if score_min is not None and score_max is not None and score_min > score_max: - score_min, score_max = score_max, score_min - return score_min, score_max - - @staticmethod - def _normalize_params(params: dict, s: StrategyDef) -> dict: - normalized = dict(params) - for param in s.meta.get("params", []): - pid = param.get("id") - if not pid: - continue - value = normalized.get(pid, param.get("default")) - p_type = param.get("type") - if p_type in {"float", "int"}: - try: - num = float(value) - except (TypeError, ValueError): - num = float(param.get("default", 0) or 0) - if param.get("min") is not None: - num = max(num, float(param["min"])) - if param.get("max") is not None: - num = min(num, float(param["max"])) - normalized[pid] = int(num) if p_type == "int" else num - elif p_type == "select" and param.get("options"): - normalized[pid] = value if value in param["options"] else param.get("default") - elif p_type == "bool": - if isinstance(value, bool): - normalized[pid] = value - elif isinstance(value, str): - normalized[pid] = value.lower() == "true" - else: - normalized[pid] = bool(param.get("default", False)) - else: - normalized[pid] = value - return normalized - - @staticmethod - def _trade_to_dict(t) -> dict: - return { - "symbol": t.symbol, - "name": t.name, - "entry_date": str(t.entry_date) if isinstance(t.entry_date, date) else str(t.entry_date), - "exit_date": str(t.exit_date) if isinstance(t.exit_date, date) else str(t.exit_date), - "entry_price": t.entry_price, - "exit_price": t.exit_price, - "pnl_pct": t.pnl_pct, - "duration": t.duration, - "exit_reason": t.exit_reason, - "shares": t.shares, - "lots": t.lots, - "position_pct": t.position_pct, - "entry_value": t.entry_value, - "exit_value": t.exit_value, - "pnl_amount": t.pnl_amount, - "entry_score": getattr(t, "entry_score", None), - "entry_signal_date": str(t.entry_signal_date) if getattr(t, "entry_signal_date", None) is not None else None, - "exit_signal_date": str(t.exit_signal_date) if getattr(t, "exit_signal_date", None) is not None else None, - "blocked_exit_days": getattr(t, "blocked_exit_days", 0), - } - - @staticmethod - def _config_to_dict(c: StrategyBacktestConfig) -> dict: - score_min, score_max = StrategyBacktestService._normalize_score_range( - (c.overrides or {}).get("score_min"), - (c.overrides or {}).get("score_max"), - ) - return { - "strategy_id": c.strategy_id, - "symbols": c.symbols, - "start": str(c.start), - "end": str(c.end), - "params": c.params, - "overrides": c.overrides, - "score_min": score_min, - "score_max": score_max, - "matching": c.matching, - "entry_fill": c.entry_fill, - "exit_fill": c.exit_fill, - "fees_pct": c.fees_pct, - "slippage_bps": c.slippage_bps, - "max_positions": c.max_positions, - "max_exposure_pct": c.max_exposure_pct, - "initial_capital": c.initial_capital, - "position_sizing": c.position_sizing, - "mode": c.mode, - "holding_days": c.holding_days, - } - - @staticmethod - def _apply_score( - panel: pl.DataFrame, - s: StrategyDef, - overrides: dict | None, - universe_mask: pl.Series | None = None, - ) -> pl.DataFrame: - scoring = s.meta.get("scoring", {}) - scoring_overrides = (overrides or {}).get("scoring") - if scoring_overrides: - scoring = {**scoring, **scoring_overrides} - - work = panel - has_universe = universe_mask is not None and len(universe_mask) == len(panel) - if has_universe: - work = work.with_columns(universe_mask.rename("_score_universe")) - - def _value_in_universe(col: str) -> pl.Expr: - if has_universe: - return pl.when(pl.col("_score_universe")).then(pl.col(col)).otherwise(None) - return pl.col(col) - - def _finish(df: pl.DataFrame) -> pl.DataFrame: - return df.drop("_score_universe") if "_score_universe" in df.columns else df - - if scoring: - total_weight = sum(scoring.values()) - if total_weight > 0: - score_parts: list[pl.Expr] = [] - for col, weight in scoring.items(): - if col not in work.columns: - continue - w = weight / total_weight - value = _value_in_universe(col) - col_min = value.min().over("date") - col_max = value.max().over("date") - col_range = col_max - col_min - normalized = pl.when(col_range > 0).then( - (pl.col(col) - col_min) / col_range - ).otherwise(pl.lit(0.5)) - if has_universe: - normalized = pl.when(pl.col("_score_universe")).then(normalized).otherwise(0.0) - score_parts.append(normalized * w) - if score_parts: - score_expr = score_parts[0] - for part in score_parts[1:]: - score_expr = score_expr + part - return _finish(work.with_columns((score_expr * 100).fill_null(0).alias("score"))) - - order_by = s.meta.get("order_by") - if order_by and order_by != "score" and order_by in work.columns: - direction = 1 if s.meta.get("descending", True) else -1 - score_expr = pl.col(order_by).fill_null(0) * direction - if has_universe: - score_expr = pl.when(pl.col("_score_universe")).then(score_expr).otherwise(0.0) - return _finish(work.with_columns(score_expr.alias("score"))) - return _finish(work.with_columns(pl.lit(0.0).alias("score"))) diff --git a/serve/backend/app/config.py b/serve/backend/app/config.py index f6c4f43..2844612 100644 --- a/serve/backend/app/config.py +++ b/serve/backend/app/config.py @@ -93,8 +93,6 @@ class Settings(BaseSettings): host: str = "0.0.0.0" port: int = 3018 log_level: str = "INFO" - backtest_range_guard: bool = False - # Auth — 首次启动时预置访问密码(明文, 仅用于初始化, 详见 services/auth.bootstrap_from_env) # 公网服务器部署时免去 SSH 端口转发设密码的麻烦。写入 auth.json(哈希)后即不再读取。 auth_password: str = "" diff --git a/serve/backend/app/jobs/daily_pipeline.py b/serve/backend/app/jobs/daily_pipeline.py index ec8876e..f112938 100644 --- a/serve/backend/app/jobs/daily_pipeline.py +++ b/serve/backend/app/jobs/daily_pipeline.py @@ -44,7 +44,7 @@ def _resolve_universe(capset: CapabilitySet) -> list[str]: """解析标的池 — 以 CN_Equity_A (沪深京A股 ~5522只) 为主。 有 batch 能力 → 直接拉 CN_Equity_A universe - 其他用户 → 用 instruments parquet + watchlist 兜底 + 其他用户 → 用 instruments parquet 兜底 """ if capset.has(Cap.KLINE_DAILY_BATCH): try: @@ -54,9 +54,8 @@ def _resolve_universe(capset: CapabilitySet) -> list[str]: except Exception as e: # noqa: BLE001 logger.warning("CN_Equity_A pool unavailable, fallback: %s", e) - # Free 用户兜底: instruments parquet + watchlist + demo + # Free 用户兜底: instruments parquet + demo base: set[str] = set(DEMO_SYMBOLS) - base.update(get_pool("watchlist")) d = Path(settings.data_dir) inst_path = d / "instruments" / "instruments.parquet" if inst_path.exists(): diff --git a/serve/backend/app/main.py b/serve/backend/app/main.py index e180569..c49c698 100644 --- a/serve/backend/app/main.py +++ b/serve/backend/app/main.py @@ -11,7 +11,7 @@ from fastapi.responses import FileResponse, JSONResponse from fastapi.staticfiles import StaticFiles from app import __version__ -from app.api import analysis, auth as auth_api, backtest, data, ext_data, financials, indices, kline, market_recap, alerts, overview, pipeline, rps, screener, settings as settings_api, signals, stock_analysis, strategy, watchlist +from app.api import analysis, auth as auth_api, data, ext_data, financials, indices, kline, market_recap, alerts, overview, pipeline, rps, screener, settings as settings_api, signals, stock_analysis, strategy from app.api.routes import router as core_router from app.config import settings from app.jobs import daily_pipeline @@ -182,9 +182,7 @@ async def auth_middleware(request: Request, call_next): app.include_router(core_router) app.include_router(auth_api.router) app.include_router(kline.router) -app.include_router(watchlist.router) app.include_router(screener.router) -app.include_router(backtest.router) app.include_router(indices.router) app.include_router(overview.router) app.include_router(analysis.router) diff --git a/serve/backend/app/services/backtest.py b/serve/backend/app/services/backtest.py deleted file mode 100644 index 806541c..0000000 --- a/serve/backend/app/services/backtest.py +++ /dev/null @@ -1,392 +0,0 @@ -"""回测服务(§6.7)。 - -包 vectorbt — 全项目唯一一处出现 pandas。 -""" -from __future__ import annotations - -import logging -import uuid -from dataclasses import dataclass, field -from datetime import date -from typing import Literal - -import numpy as np -import pandas as pd -import polars as pl - -from app.config import settings -from app.tickflow.repository import KlineRepository - -logger = logging.getLogger(__name__) - -# vectorbt 是 optional extras(见 pyproject.toml).未装时只有 backtest 不可用,其他功能正常. -_vbt = None -_vbt_unavailable_reason: str | None = None - - -class VectorbtUnavailable(RuntimeError): - """vectorbt 未安装 — 提示用户 `uv sync --extra backtest`.""" - - -def _get_vbt(): - global _vbt, _vbt_unavailable_reason - if _vbt is not None: - return _vbt - if _vbt_unavailable_reason is not None: - raise VectorbtUnavailable(_vbt_unavailable_reason) - try: - import vectorbt as vbt - _vbt = vbt - return _vbt - except ImportError as e: - _vbt_unavailable_reason = ( - "vectorbt 未安装 — 它是回测的可选依赖.macOS Intel 用户先 `brew install cmake` " - "然后 `uv sync --extra backtest`" - ) - logger.warning("vectorbt unavailable: %s", e) - raise VectorbtUnavailable(_vbt_unavailable_reason) from e - - -def is_available() -> bool: - """供 API 层快速检测.""" - try: - _get_vbt() - return True - except VectorbtUnavailable: - return False - - -SignalKind = Literal[ - "macd_golden", "macd_dead", - "ma_golden_5_20", "ma_dead_5_20", - "ma_golden_20_60", - "ma20_breakout", "ma20_breakdown", - "n_day_high", "n_day_low", - "boll_breakout_upper", "boll_breakdown_lower", - "volume_surge", - "rsi_oversold", "rsi_overbought", - "stop_loss", "trailing_stop", "max_hold", -] - - -@dataclass -class BacktestConfig: - symbols: list[str] - start: date - end: date - # 买入信号(任一触发即买) - entries: list[str] = field(default_factory=list) - # 卖出信号(任一触发即卖) - exits: list[str] = field(default_factory=list) - # 其他参数 - stop_loss_pct: float | None = None # 例 -0.05 = -5% - max_hold_days: int | None = None - fees_pct: float = 0.0002 # 万二佣金 - slippage_bps: float = 5 # 5 bps - # 撮合 - matching: Literal["close_t", "open_t+1"] = "close_t" - rsi_oversold_threshold: float = 30 - rsi_overbought_threshold: float = 70 - - -@dataclass -class BacktestResult: - run_id: str - config: dict - stats: dict - equity_curve: list[dict] # [{date, value}] - trades: list[dict] # [{symbol, entry_date, exit_date, pnl_pct, ...}] - per_symbol_stats: list[dict] # 每只股票的统计 - - -# enriched 表里的信号列名映射 -_SIGNAL_COLS: dict[SignalKind, str] = { - "macd_golden": "signal_macd_golden", - "macd_dead": "signal_macd_dead", - "ma_golden_5_20": "signal_ma_golden_5_20", - "ma_dead_5_20": "signal_ma_dead_5_20", - "ma_golden_20_60": "signal_ma_golden_20_60", - "ma20_breakout": "signal_ma20_breakout", - "ma20_breakdown": "signal_ma20_breakdown", - "n_day_high": "signal_n_day_high", - "n_day_low": "signal_n_day_low", - "boll_breakout_upper": "signal_boll_breakout_upper", - "boll_breakdown_lower": "signal_boll_breakdown_lower", - "volume_surge": "signal_volume_surge", -} - - -class BacktestService: - def __init__(self, repo: KlineRepository) -> None: - self.repo = repo - - def _load_panel( - self, - symbols: list[str], - start: date, - end: date, - ) -> pd.DataFrame: - """加载 [date × symbol] 价格面板 — Polars scan_parquet + 即时计算指标。 - - **全项目唯一从 Polars 转 pandas 的边界**(§7.4 / ADR-19)。 - """ - try: - enriched_glob = str(self.repo.store.data_dir / "kline_daily_enriched" / "**" / "*.parquet") - df = ( - pl.scan_parquet(enriched_glob) - .filter( - (pl.col("symbol").is_in(symbols)) - & (pl.col("date") >= start) - & (pl.col("date") <= end) - ) - .sort(["date", "symbol"]) - .collect() - ) - except Exception as e: # noqa: BLE001 - logger.warning("backtest load failed: %s", e) - return pd.DataFrame() - - if df.is_empty(): - return pd.DataFrame() - - # 即时计算指标 + 信号 - from app.indicators.pipeline import compute_all - df = compute_all(df) - - # 选择需要的列 - needed_cols = [ - "date", "symbol", "open", "high", "low", "close", "volume", - "rsi_14", "signal_macd_golden", "signal_macd_dead", - "signal_ma_golden_5_20", "signal_ma_dead_5_20", - "signal_ma_golden_20_60", - "signal_ma20_breakout", "signal_ma20_breakdown", - "signal_n_day_high", "signal_n_day_low", - "signal_boll_breakout_upper", "signal_boll_breakdown_lower", - "signal_volume_surge", - ] - existing = [c for c in needed_cols if c in df.columns] - df = df.select(existing) - - # to_pandas 边界 - return df.to_pandas(use_pyarrow_extension_array=False) - - def _build_signal_matrix( - self, - panel: pd.DataFrame, - kinds: list[str], - config: BacktestConfig, - ) -> pd.DataFrame: - """从面板构造 [date × symbol] 的布尔信号矩阵。""" - if not kinds or panel.empty: - return pd.DataFrame() - - # pivot 成 [date × symbol] 形式 - result = None - for kind in kinds: - mat = None - if kind in _SIGNAL_COLS: - col = _SIGNAL_COLS[kind] - mat = panel.pivot(index="date", columns="symbol", values=col).fillna(False).astype(bool) - elif kind == "rsi_oversold": - mat = (panel.pivot(index="date", columns="symbol", values="rsi_14") - < config.rsi_oversold_threshold) - elif kind == "rsi_overbought": - mat = (panel.pivot(index="date", columns="symbol", values="rsi_14") - > config.rsi_overbought_threshold) - # stop_loss / trailing / max_hold 通过 vectorbt 参数处理,不参与信号矩阵 - - if mat is not None: - result = mat if result is None else (result | mat) - return result if result is not None else pd.DataFrame() - - def run(self, config: BacktestConfig) -> BacktestResult: - vbt = _get_vbt() - run_id = uuid.uuid4().hex[:10] - - panel = self._load_panel(config.symbols, config.start, config.end) - if panel.empty: - return BacktestResult( - run_id=run_id, - config=_config_to_dict(config), - stats={"error": "no data"}, - equity_curve=[], - trades=[], - per_symbol_stats=[], - ) - - # 价格面板 - close = panel.pivot(index="date", columns="symbol", values="close") - - # 信号矩阵 - entries = self._build_signal_matrix(panel, config.entries, config) - exits = self._build_signal_matrix(panel, config.exits, config) - - # 对齐 index/columns - if not entries.empty: - entries = entries.reindex_like(close).fillna(False).astype(bool) - else: - entries = pd.DataFrame(False, index=close.index, columns=close.columns) - if not exits.empty: - exits = exits.reindex_like(close).fillna(False).astype(bool) - else: - exits = pd.DataFrame(False, index=close.index, columns=close.columns) - - if not entries.any().any(): - return BacktestResult( - run_id=run_id, - config=_config_to_dict(config), - stats={"error": "no buy signals"}, - equity_curve=[], - trades=[], - per_symbol_stats=[], - ) - - # T+1 适配:vectorbt 默认信号当根 K 撮合 - # close_t 撮合:维持默认 - # open_t+1 撮合:shift 信号 1 根 + 用 open 作为价 - if config.matching == "open_t+1": - entries = entries.shift(1).fillna(False).astype(bool) - exits = exits.shift(1).fillna(False).astype(bool) - price = panel.pivot(index="date", columns="symbol", values="open") - else: - price = close - - # 跑回测 - try: - pf_kwargs = dict( - close=close, - entries=entries, - exits=exits, - price=price, - fees=config.fees_pct, - slippage=config.slippage_bps / 10000.0, - freq="1D", - ) - if config.stop_loss_pct is not None: - pf_kwargs["sl_stop"] = abs(config.stop_loss_pct) - if config.max_hold_days is not None: - # vectorbt 没有内置 max-hold;用时间退出近似: - # 在 max_hold_days 后强制 exit - exits_idx = entries.copy() - for col in entries.columns: - entry_rows = np.where(entries[col].values)[0] - for i in entry_rows: - end_i = min(i + config.max_hold_days, len(entries) - 1) - if end_i > i: - exits_idx.iloc[end_i][col] = True - pf_kwargs["exits"] = (exits | exits_idx).astype(bool) - - pf = vbt.Portfolio.from_signals(**pf_kwargs) - except Exception as e: # noqa: BLE001 - logger.exception("vectorbt backtest failed") - return BacktestResult( - run_id=run_id, - config=_config_to_dict(config), - stats={"error": str(e)}, - equity_curve=[], - trades=[], - per_symbol_stats=[], - ) - - # 提取结果 - try: - stats_series = pf.stats(silence_warnings=True) - if isinstance(stats_series, pd.DataFrame): - # 多列时取 agg - stats_dict = stats_series.mean(numeric_only=True).to_dict() - else: - stats_dict = stats_series.to_dict() - except Exception: # noqa: BLE001 - stats_dict = {} - - # 净值曲线(组合平均) - equity = pf.value().mean(axis=1) if isinstance(pf.value(), pd.DataFrame) else pf.value() - equity_curve = [ - {"date": str(idx.date() if hasattr(idx, "date") else idx), "value": float(v)} - for idx, v in equity.items() if pd.notna(v) - ] - - # 交易记录 - try: - trades_df = pf.trades.records_readable - trades = trades_df.to_dict(orient="records") if not trades_df.empty else [] - # 字段名美化 - trades = [ - { - "symbol": t.get("Column", t.get("Symbol", "")), - "entry_date": str(t.get("Entry Timestamp", t.get("Entry Date", ""))), - "exit_date": str(t.get("Exit Timestamp", t.get("Exit Date", ""))), - "entry_price": float(t.get("Avg Entry Price", t.get("Avg. Entry Price", 0))), - "exit_price": float(t.get("Avg Exit Price", t.get("Avg. Exit Price", 0))), - "pnl_pct": float(t.get("Return", t.get("PnL %", 0))), - "duration": str(t.get("Duration", "")), - } - for t in trades - ] - except Exception: # noqa: BLE001 - trades = [] - - # 每标的统计 - per_symbol = [] - try: - total_ret = pf.total_return() - if isinstance(total_ret, pd.Series): - for sym, ret in total_ret.items(): - if pd.notna(ret): - per_symbol.append({"symbol": sym, "total_return": float(ret)}) - except Exception: # noqa: BLE001 - pass - - result = BacktestResult( - run_id=run_id, - config=_config_to_dict(config), - stats={k: _json_safe(v) for k, v in stats_dict.items()}, - equity_curve=equity_curve, - trades=trades, - per_symbol_stats=per_symbol, - ) - - # 落盘 - self._persist(result) - return result - - def _persist(self, result: BacktestResult) -> None: - out_dir = settings.data_dir / "backtest_results" - out_dir.mkdir(parents=True, exist_ok=True) - # 用 polars 写一份汇总 - summary = pl.DataFrame({ - "run_id": [result.run_id], - "stats_json": [str(result.stats)], - "n_trades": [len(result.trades)], - }) - summary.write_parquet(out_dir / f"run_id={result.run_id}.parquet") - - def get_result(self, run_id: str) -> BacktestResult | None: - # Phase 1:只保留近似落盘,完整结果保存在内存的近期 cache 中 - # 简化:重新 run 比缓存复杂结果代价小,暂不实现 get_result - return None - - -def _config_to_dict(c: BacktestConfig) -> dict: - return { - "symbols": c.symbols, - "start": str(c.start), - "end": str(c.end), - "entries": c.entries, - "exits": c.exits, - "stop_loss_pct": c.stop_loss_pct, - "max_hold_days": c.max_hold_days, - "fees_pct": c.fees_pct, - "slippage_bps": c.slippage_bps, - "matching": c.matching, - } - - -def _json_safe(v): - if isinstance(v, (int, float, str, bool)) or v is None: - return v - if isinstance(v, (np.floating, np.integer)): - return float(v) if not np.isnan(float(v)) else None - if hasattr(v, "isoformat"): - return v.isoformat() - return str(v) diff --git a/serve/backend/app/services/extend_history.py b/serve/backend/app/services/extend_history.py index 1339a52..1222076 100644 --- a/serve/backend/app/services/extend_history.py +++ b/serve/backend/app/services/extend_history.py @@ -38,7 +38,7 @@ def _invalidate(table: str | None = None) -> None: def _resolve_universe(capset: CapabilitySet) -> list[str]: - """解析标的池 — 与 daily_pipeline 独立的副本。""" + """解析标的池。""" if capset.has(Cap.KLINE_DAILY_BATCH): try: from app.tickflow.pools import get_pool @@ -48,12 +48,11 @@ def _resolve_universe(capset: CapabilitySet) -> list[str]: except Exception as e: logger.warning("CN_Equity_A pool unavailable: %s", e) - from app.tickflow.pools import DEMO_SYMBOLS, get_pool as _get_pool + from app.tickflow.pools import DEMO_SYMBOLS from app.config import settings from pathlib import Path import polars as pl base: set[str] = set(DEMO_SYMBOLS) - base.update(_get_pool("watchlist")) d = Path(settings.data_dir) inst_path = d / "instruments" / "instruments.parquet" if inst_path.exists(): diff --git a/serve/backend/app/services/preferences.py b/serve/backend/app/services/preferences.py index 39908cd..9c5870e 100644 --- a/serve/backend/app/services/preferences.py +++ b/serve/backend/app/services/preferences.py @@ -296,17 +296,6 @@ def set_nav_hidden(hidden: list[str]) -> list[str]: return get_nav_hidden() -def get_watchlist_columns() -> list[dict] | None: - """返回自选列表列配置。""" - return load().get("watchlist_columns") - - -def set_watchlist_columns(columns: list[dict]) -> list[dict]: - """保存自选列表列配置。""" - save({"watchlist_columns": columns}) - return columns - - def get_screener_result_columns() -> list[dict] | None: """返回策略结果列表列配置。""" return load().get("screener_result_columns") diff --git a/serve/backend/app/services/watchlist.py b/serve/backend/app/services/watchlist.py deleted file mode 100644 index 7515b72..0000000 --- a/serve/backend/app/services/watchlist.py +++ /dev/null @@ -1,144 +0,0 @@ -"""自选股服务(§6.1)。 - -存储:`data/user_data/watchlist.parquet`,字段 symbol + added_at + note。 -""" -from __future__ import annotations - -import logging -from datetime import datetime -from pathlib import Path - -import polars as pl - -from app.config import settings -from app.tickflow.capabilities import Cap, CapabilitySet -from app.tickflow.client import get_client - -logger = logging.getLogger(__name__) - - -def _path() -> Path: - p = settings.data_dir / "user_data" / "watchlist.parquet" - p.parent.mkdir(parents=True, exist_ok=True) - return p - - -def list_symbols() -> list[dict]: - p = _path() - if not p.exists(): - return [] - df = pl.read_parquet(p) - if df.is_empty(): - return [] - return df.to_dicts() - - -def add(symbol: str, note: str = "") -> list[dict]: - p = _path() - if p.exists(): - df = pl.read_parquet(p) - # 已存在则先移除,后面重新插入到最前面 - if symbol in df["symbol"].to_list(): - df = df.filter(pl.col("symbol") != symbol) - else: - df = pl.DataFrame(schema={"symbol": pl.Utf8, "added_at": pl.Utf8, "note": pl.Utf8}) - - new_row = pl.DataFrame({ - "symbol": [symbol], - "added_at": [datetime.utcnow().isoformat(timespec="seconds")], - "note": [note], - }) - out = pl.concat([new_row, df], how="diagonal_relaxed") - out.write_parquet(p) - return out.to_dicts() - - -def remove(symbol: str) -> list[dict]: - p = _path() - if not p.exists(): - return [] - df = pl.read_parquet(p) - df = df.filter(pl.col("symbol") != symbol) - df.write_parquet(p) - return df.to_dicts() - - -def move_to_top(symbol: str) -> list[dict]: - p = _path() - if not p.exists(): - return [] - df = pl.read_parquet(p) - if df.is_empty() or symbol not in df["symbol"].to_list(): - return df.to_dicts() - target = df.filter(pl.col("symbol") == symbol) - rest = df.filter(pl.col("symbol") != symbol) - out = pl.concat([target, rest], how="diagonal_relaxed") - out.write_parquet(p) - return out.to_dicts() - - -def clear() -> int: - """清空自选列表。返回移除的数量。""" - p = _path() - if not p.exists(): - return 0 - df = pl.read_parquet(p) - count = df.height - if count > 0: - pl.DataFrame(schema={"symbol": pl.Utf8, "added_at": pl.Utf8, "note": pl.Utf8}).write_parquet(p) - return count - - -def fetch_quotes(symbols: list[str], capset: CapabilitySet, timeout_s: float = 8.0) -> list[dict]: - """拉取实时行情。 - - 优先用 quote.batch;否则降级为 quote.by_symbol 单股请求。 - timeout_s: 单批次请求超时(秒),防止 API 卡死阻塞整个请求。 - """ - from concurrent.futures import ThreadPoolExecutor, TimeoutError as FuturesTimeout - - if not symbols: - return [] - - tf = get_client() - quotes: list[dict] = [] - - # 走 batch - batch_size = 5 - if capset.has(Cap.QUOTE_BATCH): - lim = capset.limits(Cap.QUOTE_BATCH) - batch_size = lim.batch if lim and lim.batch else 50 - elif capset.has(Cap.QUOTE_BY_SYMBOL): - lim = capset.limits(Cap.QUOTE_BY_SYMBOL) - batch_size = lim.batch if lim and lim.batch else 5 - else: - # 无任何实时行情能力(none/free 档走 free-api 服务器,不提供实时行情) - # 提前返回空,避免发起注定失败的请求 - return [] - - chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] - - # 用线程池为每个批次加超时保护 - pool = ThreadPoolExecutor(max_workers=1) - for chunk in chunks: - try: - future = pool.submit(tf.quotes.get, symbols=chunk, as_dataframe=True) - raw = future.result(timeout=timeout_s) - if raw is None or len(raw) == 0: - continue - df = pl.from_pandas(raw) - rename_map = { - "last_price": "price", - "ext.change_pct": "pct", - "ext.name": "name", - } - df = df.rename({k: v for k, v in rename_map.items() if k in df.columns}) - quotes.extend(df.to_dicts()) - except FuturesTimeout: - logger.warning("quote fetch timeout (%.1fs) for %d symbols", timeout_s, len(chunk)) - break # 超时后不再尝试后续批次 - except Exception as e: # noqa: BLE001 - logger.warning("quote fetch failed for %d symbols: %s", len(chunk), e) - pool.shutdown(wait=False) - - return quotes diff --git a/serve/backend/app/tickflow/pools.py b/serve/backend/app/tickflow/pools.py index 77a45d9..6523c98 100644 --- a/serve/backend/app/tickflow/pools.py +++ b/serve/backend/app/tickflow/pools.py @@ -3,7 +3,6 @@ Phase 1 实现: - 常用指数成份(沪深 300 / 中证 500 / 上证 50)用 TickFlow `quote.pool` 端点拉取并缓存 - 全 A 通过 instruments.batch 获取 - - 自选池 = 用户的 watchlist """ from __future__ import annotations @@ -19,7 +18,7 @@ from app.tickflow.client import get_client logger = logging.getLogger(__name__) -PoolId = Literal["CSI300", "CSI500", "SSE50", "CN_Equity_A", "CN_Index", "watchlist"] +PoolId = Literal["CSI300", "CSI500", "SSE50", "CN_Equity_A", "CN_Index"] # TickFlow universe id 是它内部命名(见 tf.universes.list())。 # 没有官方对照表,启动时按名称模糊匹配从 universes.list() 里找。 @@ -54,9 +53,6 @@ def _pool_cache_path(pool_id: str) -> Path: def get_pool(pool_id: PoolId, refresh: bool = False) -> list[str]: """返回标的池里的 symbol 列表。""" - if pool_id == "watchlist": - return _load_watchlist() - cache = _pool_cache_path(pool_id) if cache.exists() and not refresh: df = pl.read_parquet(cache) @@ -132,17 +128,6 @@ def _fetch_pool(pool_id: PoolId) -> list[str]: return [] -def _load_watchlist() -> list[str]: - """读取用户自选(由 watchlist service 维护)。""" - path = settings.data_dir / "user_data" / "watchlist.parquet" - if not path.exists(): - return [] - df = pl.read_parquet(path) - if df.is_empty() or "symbol" not in df.columns: - return [] - return df["symbol"].to_list() - - # 兜底:Free 用户/无 API 时给一个小型可用集合,让 UI 不至于空白 DEMO_SYMBOLS = [ "600000.SH", # 浦发银行 diff --git a/serve/backend/app/tickflow/repository.py b/serve/backend/app/tickflow/repository.py index 7ddd521..1e8e519 100644 --- a/serve/backend/app/tickflow/repository.py +++ b/serve/backend/app/tickflow/repository.py @@ -56,7 +56,6 @@ class DataStore: "instruments_ext", "kline_ext", "pools", - "backtest_results", "screener_results", "ai_cache", "user_data", @@ -77,7 +76,7 @@ class DataStore: 背景: 旧版 data_dir = exe_dir.parent / "TickFlowStockPanel_Data" (兄弟目录), 新版改为 exe_dir / "data" (子目录)。老用户首次升级时旧数据在兄弟目录, - 若不迁移会导致历史行情/策略/回测/监控全部"丢失"(实际还在旧位置)。 + 若不迁移会导致历史行情/策略/监控全部"丢失"(实际还在旧位置)。 策略 (仅打包桌面版触发, 开发/Docker 不受影响): 1. 旧目录存在且新 data/ 还基本为空 → 整目录搬迁 (shutil.move, 跨盘符安全)。 @@ -408,7 +407,7 @@ class KlineRepository: how="left", ) - # 缓存完整历史 (含指标+必要基础信息) 供 filter_history/backtest 直接复用 + # 缓存完整历史 (含指标+必要基础信息) self._enriched_history_cache = df_full self._enriched_history_start = df_full["date"].min() logger.info("enriched 历史缓存: %d rows, %s ~ %s", diff --git a/serve/backend/tests/backtest/test_engine_portfolio.py b/serve/backend/tests/backtest/test_engine_portfolio.py deleted file mode 100644 index 2c0ede5..0000000 --- a/serve/backend/tests/backtest/test_engine_portfolio.py +++ /dev/null @@ -1,422 +0,0 @@ -from __future__ import annotations - -from datetime import date, timedelta - -import polars as pl - -from app.backtest.engine import BacktestEngine, MatcherConfig - - -def _panel(symbols: list[str], days: int = 4, price: float = 10.0, overrides: dict[tuple[str, int], dict] | None = None) -> pl.DataFrame: - overrides = overrides or {} - start = date(2024, 1, 1) - rows = [] - for sym in symbols: - for i in range(days): - patch = overrides.get((sym, i), {}) - rows.append({ - "symbol": sym, - "name": sym, - "date": start + timedelta(days=i), - "open": patch.get("open", price), - "high": patch.get("high", price), - "low": patch.get("low", price), - "close": patch.get("close", price), - "volume": patch.get("volume", 100_000), - "score": patch.get("score", {"A": 4, "B": 3, "C": 2, "D": 1}.get(sym, 0)), - "signal_limit_up": patch.get("signal_limit_up", False), - "signal_limit_down": patch.get("signal_limit_down", False), - }) - return pl.DataFrame(rows).sort(["symbol", "date"]) - - -def _mask(panel: pl.DataFrame, marks: set[tuple[str, int]]) -> pl.Series: - values = [] - base = date(2024, 1, 1) - for row in panel.select(["symbol", "date"]).iter_rows(named=True): - day = (row["date"] - base).days - values.append((row["symbol"], day) in marks) - return pl.Series(values, dtype=pl.Boolean) - - -def _engine() -> BacktestEngine: - return BacktestEngine(repo=None) # simulate_portfolio 不访问 repo - - -def test_max_exposure_sets_target_position_and_caps_count(): - panel = _panel(["A", "B", "C", "D"], days=3) - entries = _mask(panel, {("A", 0), ("B", 0), ("C", 0), ("D", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=3, - max_exposure_pct=0.6, - initial_capital=100_000, - ), - ) - - assert len(result.trades) == 3 - assert {t.symbol for t in result.trades} == {"A", "B", "C"} - assert all(abs(t.position_pct - 0.2) < 0.001 for t in result.trades) - assert result.stats["max_exposure"] <= 0.61 - - -def test_one_price_limit_up_blocks_buy(): - panel = _panel( - ["A"], - days=3, - overrides={ - ("A", 1): {"open": 11, "high": 11, "low": 11, "close": 11, "signal_limit_up": True}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig(matching="open_t+1", fees_pct=0, slippage_bps=0, max_positions=1, initial_capital=100_000), - ) - - assert result.trades == [] - assert result.stats["execution"]["buy_limit_up"] == 1 - - -def test_failed_open_exit_keeps_slot_and_blocks_replacement_buy(): - panel = _panel( - ["A", "B", "C", "D"], - days=4, - overrides={ - ("A", 2): {"open": 9, "high": 9, "low": 9, "close": 9, "signal_limit_down": True}, - }, - ) - entries = _mask(panel, { - ("A", 0), ("B", 0), ("C", 0), - ("D", 1), - }) - exits = _mask(panel, {("A", 1)}) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=3, - max_exposure_pct=0.6, - initial_capital=100_000, - ), - ) - - assert "D" not in {t.symbol for t in result.trades} - assert result.stats["execution"]["sell_limit_down"] == 1 - assert result.stats["execution"]["pending_exit"] == 1 - assert result.stats["execution"]["buy_no_slot"] >= 1 - a_trade = next(t for t in result.trades if t.symbol == "A") - assert a_trade.blocked_exit_days == 1 - assert a_trade.exit_reason == "signal" - - -def test_trailing_stop_uses_high_water_mark(): - panel = _panel( - ["A"], - days=5, - overrides={ - ("A", 2): {"open": 10, "high": 12, "low": 11.8, "close": 12}, - ("A", 3): {"open": 12, "high": 12, "low": 11.3, "close": 11.3}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=1, - initial_capital=100_000, - trailing_stop_pct=0.05, - ), - ) - - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.exit_reason == "trailing_stop" - assert trade.exit_price == 11.4 - - -def test_trailing_take_profit_requires_activation(): - panel = _panel( - ["A"], - days=5, - overrides={ - ("A", 2): {"open": 10, "high": 10.8, "low": 10.4, "close": 10.8}, - ("A", 3): {"open": 10.8, "high": 10.8, "low": 10.4, "close": 10.4}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=1, - initial_capital=100_000, - trailing_take_profit_activate_pct=0.10, - trailing_take_profit_drawdown_pct=0.03, - ), - ) - - assert result.trades[0].exit_reason == "end" - - -def test_trailing_take_profit_exits_after_activation(): - panel = _panel( - ["A"], - days=5, - overrides={ - ("A", 2): {"open": 10, "high": 12, "low": 11.8, "close": 12}, - ("A", 3): {"open": 12, "high": 12, "low": 11.5, "close": 11.5}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=1, - initial_capital=100_000, - trailing_take_profit_activate_pct=0.10, - trailing_take_profit_drawdown_pct=0.03, - ), - ) - - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.exit_reason == "trailing_take_profit" - assert trade.exit_price == 11.7 - - -def test_score_filter_uses_signal_day_score_range(): - panel = _panel( - ["A", "B", "C"], - days=3, - overrides={ - ("A", 0): {"score": 70}, - ("B", 0): {"score": 80}, - ("C", 0): {"score": 90}, - ("A", 1): {"score": 100}, - ("B", 1): {"score": 1}, - ("C", 1): {"score": 1}, - }, - ) - entries = _mask(panel, {("A", 0), ("B", 0), ("C", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=3, - initial_capital=100_000, - score_min=71, - score_max=85, - ), - ) - - assert {t.symbol for t in result.trades} == {"B"} - assert result.trades[0].entry_score == 80 - assert result.stats["execution"]["buy_score_filter"] == 2 - - -def test_independent_candidates_allow_overlapping_same_symbol_trades(): - panel = _panel( - ["A"], - days=5, - overrides={ - ("A", 0): {"close": 10}, - ("A", 1): {"close": 11}, - ("A", 2): {"close": 12}, - ("A", 3): {"close": 13}, - ("A", 4): {"close": 14}, - }, - ) - entries = _mask(panel, {("A", 0), ("A", 1)}) - exits = _mask(panel, set()) - - result = _engine().simulate_independent_candidates( - panel, - entries, - exits, - MatcherConfig(matching="close_t", fees_pct=0, slippage_bps=0, max_hold_days=2), - ) - - assert result.stats["full_kind"] == "candidate_execution" - assert result.stats["n_candidates"] == 2 - assert len(result.trades) == 2 - assert [t.entry_date for t in result.trades] == ["2024-01-01", "2024-01-02"] - assert [t.exit_date for t in result.trades] == ["2024-01-03", "2024-01-04"] - assert all(t.exit_reason == "max_hold" for t in result.trades) - - -def test_independent_candidates_apply_stop_loss(): - panel = _panel( - ["A"], - days=4, - overrides={ - ("A", 0): {"close": 10, "low": 10}, - ("A", 1): {"open": 10, "high": 10, "low": 8.9, "close": 9}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_independent_candidates( - panel, - entries, - exits, - MatcherConfig(matching="close_t", fees_pct=0, slippage_bps=0, stop_loss_pct=0.1), - ) - - assert len(result.trades) == 1 - assert result.trades[0].exit_reason == "stop_loss" - assert result.trades[0].exit_price == 9.0 - - -def test_signal_exit_takes_priority_over_max_hold(): - """同一日既有卖点信号又到期 → 应按 signal 平仓 (卖点优先于 max_hold 兜底)。""" - panel = _panel( - ["A"], - days=4, - overrides={ - # day1 次日开盘买入 (open_t+1), 价 10 - ("A", 1): {"open": 10, "high": 10, "low": 10, "close": 10}, - # day2 持有 (hold_days 计到 1) - ("A", 2): {"open": 11, "high": 11, "low": 11, "close": 11}, - # day3: 既到期 (hold_days=2 >= max_hold_days=2) 又有卖点信号 → signal 优先 - ("A", 3): {"open": 12, "high": 12, "low": 12, "close": 12}, - }, - ) - entries = _mask(panel, {("A", 0)}) # day0 收盘确认 → day1 开盘买 - exits = _mask(panel, {("A", 2)}) # day2 收盘确认卖点 → day3 开盘卖 - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=1, - max_hold_days=2, - initial_capital=100_000, - ), - ) - - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.exit_reason == "signal" - assert trade.exit_price == 12.0 # 卖点用 day3 开盘 (exit_fill 跟随 matching=open_t+1) - - -def test_stop_loss_triggers_even_when_expired_in_open_mode(): - """open_t+1 模式下仓位到期且当日破止损 → 应按 stop_loss 平仓 (风控优先于 max_hold)。""" - panel = _panel( - ["A"], - days=4, - overrides={ - ("A", 1): {"open": 10, "high": 10, "low": 10, "close": 10}, - # day3 开盘跳空跌破止损 (-10%): open=8.9 < 9.0 止损线, low=8.5 - ("A", 3): {"open": 8.9, "high": 8.9, "low": 8.5, "close": 8.7}, - }, - ) - entries = _mask(panel, {("A", 0)}) - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - max_positions=1, - max_hold_days=2, - stop_loss_pct=0.1, - initial_capital=100_000, - ), - ) - - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.exit_reason == "stop_loss" - # 风控盘中触发: 开盘价 8.9 <= 止损线 9.0 → 按开盘价 8.9 成交 - assert trade.exit_price == 8.9 - - -def test_default_fill_is_buy_open_sell_close(): - """拆分口径: 建仓=次日开盘, 清仓=收盘。entry_price 用次日 open, exit_price 用收盘价。""" - panel = _panel( - ["A"], - days=4, - overrides={ - # day1: 次日开盘买入, 开盘 10 - ("A", 1): {"open": 10, "high": 10.5, "low": 9.5, "close": 10.2}, - # day2: 到期 (max_hold_days=1), 收盘卖 - ("A", 2): {"open": 11, "high": 11, "low": 10, "close": 10.8}, - }, - ) - entries = _mask(panel, {("A", 0)}) # day0 收盘确认 - exits = _mask(panel, set()) - - result = _engine().simulate_portfolio( - panel, - entries, - exits, - MatcherConfig( - entry_fill="open_t+1", - exit_fill="close_t", - fees_pct=0, - slippage_bps=0, - max_positions=1, - max_hold_days=1, - initial_capital=100_000, - ), - ) - - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.entry_price == 10.0 # 次日开盘 - assert trade.exit_price == 10.8 # 到期日收盘 - assert trade.exit_reason == "max_hold" diff --git a/serve/backend/tests/backtest/test_full_simulation_tail.py b/serve/backend/tests/backtest/test_full_simulation_tail.py deleted file mode 100644 index f5352b9..0000000 --- a/serve/backend/tests/backtest/test_full_simulation_tail.py +++ /dev/null @@ -1,59 +0,0 @@ -"""全量模拟 (full mode) 尾部执行回归测试。""" -from __future__ import annotations - -from datetime import date, timedelta - -import polars as pl - -from app.backtest.engine import BacktestEngine, MatcherConfig - - -def _panel_with_tail(symbols: list[str], n_data_days: int) -> pl.DataFrame: - start = date(2024, 1, 1) - rows = [] - for sym in symbols: - for i in range(n_data_days): - px = 10.0 + i - rows.append({ - "symbol": sym, - "date": start + timedelta(days=i), - "open": px, - "high": px, - "low": px, - "close": px, - "volume": 100_000, - "signal_limit_up": False, - "signal_limit_down": False, - }) - return pl.DataFrame(rows).sort(["symbol", "date"]) - - -def test_full_simulation_executes_signal_at_tail(): - """信号集中在正式区间最后一天时, tail 数据应允许次日开盘买入并按策略退出。""" - n_days = 6 - panel = _panel_with_tail(["A"], n_days + 3) - - start = date(2024, 1, 1) - end = start + timedelta(days=n_days - 1) - entry_vals = [] - for row in panel.select(["symbol", "date"]).iter_rows(named=True): - entry_vals.append(row["date"] == end) - entry_mask = pl.Series(entry_vals, dtype=pl.Boolean) - exit_mask = pl.Series([False] * len(panel), dtype=pl.Boolean) - - result = BacktestEngine(repo=None).simulate_independent_candidates( # type: ignore[arg-type] - panel, - entry_mask, - exit_mask, - MatcherConfig(matching="open_t+1", fees_pct=0, slippage_bps=0, max_hold_days=2), - ) - - assert not result.stats.get("error"), f"unexpected error: {result.stats.get('error')}" - assert result.stats.get("full_kind") == "candidate_execution" - assert result.stats.get("n_candidates") == 1 - assert result.stats.get("n_trades") == 1 - assert len(result.trades) == 1 - trade = result.trades[0] - assert trade.entry_signal_date == str(end) - assert trade.entry_date == str(end + timedelta(days=1)) - assert trade.exit_reason == "max_hold" diff --git a/serve/backend/tests/backtest/test_strategy_backtest_correctness.py b/serve/backend/tests/backtest/test_strategy_backtest_correctness.py deleted file mode 100644 index 6b55ba8..0000000 --- a/serve/backend/tests/backtest/test_strategy_backtest_correctness.py +++ /dev/null @@ -1,163 +0,0 @@ -from __future__ import annotations - -from datetime import date, timedelta -from types import SimpleNamespace - -import polars as pl - -from app.backtest.engine import BacktestEngine, SimResult -from app.backtest.strategy import StrategyBacktestConfig, StrategyBacktestService -from app.strategy.engine import StrategyDef - - -def _strategy(**kwargs) -> StrategyDef: - defaults = dict( - meta={"id": "test", "name": "test", "scoring": {}, "params": [], "limit": 100}, - basic_filter={"enabled": True, "amount_min": 100.0}, - entry_signals=[], - exit_signals=[], - stop_loss=None, - trailing_stop=None, - trailing_take_profit_activate=None, - trailing_take_profit_drawdown=None, - max_hold_days=None, - alerts=[], - filter_fn=lambda df, params: pl.lit(True), - filter_history_fn=None, - lookback_days=1, - source="custom", - file_path=None, - ) - defaults.update(kwargs) - return StrategyDef(**defaults) - - -class _StrategyEngineStub: - def __init__(self, strategy: StrategyDef) -> None: - self.strategy = strategy - - def get(self, strategy_id: str) -> StrategyDef: - return self.strategy - - -class _RepoStub: - def get_index_daily(self, *args, **kwargs) -> pl.DataFrame: - return pl.DataFrame() - - -class _EngineStub: - def __init__(self, panel: pl.DataFrame) -> None: - self.panel = panel - self.repo = _RepoStub() - self.load_args = None - self.sim_panel: pl.DataFrame | None = None - self.sim_entries: pl.Series | None = None - - def load_panel(self, symbols, start: date, end: date) -> pl.DataFrame: - self.load_args = (symbols, start, end) - return self.panel - - def simulate_portfolio(self, panel, entries, exits, config, progress_cb=None, cancel_event=None) -> SimResult: - self.sim_panel = panel - self.sim_entries = entries - return SimResult( - equity_curve=[{"date": "2024-01-01", "value": config.initial_capital}], - drawdown_curve=[{"date": "2024-01-01", "value": 0.0}], - trades=[], - per_symbol_stats=[], - stats={"total_return": 0.0, "n_trades": 0}, - ) - - -def test_basic_filter_only_limits_entries_not_panel_rows(): - start = date(2024, 1, 1) - rows = [] - for i, amount in enumerate([1000.0, 0.0, 1000.0]): - rows.append({ - "symbol": "A", - "name": "A", - "date": start + timedelta(days=i), - "open": 10.0 + i, - "high": 10.0 + i, - "low": 10.0 + i, - "close": 10.0 + i, - "volume": 100_000, - "amount": amount, - "signal_limit_up": False, - "signal_limit_down": False, - }) - panel = pl.DataFrame(rows).sort(["symbol", "date"]) - engine = _EngineStub(panel) - service = StrategyBacktestService(engine=engine, strategy_engine=_StrategyEngineStub(_strategy())) - - result = service.run(StrategyBacktestConfig( - strategy_id="test", - symbols=None, - start=start, - end=start + timedelta(days=2), - matching="close_t", - mode="position", - )) - - assert result.error is None - assert engine.sim_panel is not None - assert engine.sim_panel.height == 3 - assert engine.sim_panel.filter(pl.col("amount") == 0.0).height == 1 - assert engine.sim_entries is not None - assert engine.sim_entries.to_list() == [True, False, True] - assert engine.load_args is not None - assert engine.load_args[1] < start # warmup 只用于计算, 不参与正式交易 - - -def test_score_normalizes_inside_strategy_candidate_universe(): - panel = pl.DataFrame({ - "symbol": ["A", "B", "C"], - "date": [date(2024, 1, 1)] * 3, - "factor": [10.0, 20.0, 1000.0], - }) - universe = pl.Series([True, True, False], dtype=pl.Boolean) - strategy = SimpleNamespace(meta={"scoring": {"factor": 1.0}, "order_by": "score", "descending": True}) - - scored = StrategyBacktestService._apply_score(panel, strategy, None, universe_mask=universe) - scores = dict(zip(scored["symbol"].to_list(), scored["score"].to_list())) - - assert scores["A"] == 0.0 - assert scores["B"] == 100.0 - assert scores["C"] == 0.0 - - -def test_full_mode_executes_every_candidate_with_strategy_rules(): - start = date(2024, 1, 1) - panel = pl.DataFrame([ - {"symbol": "A", "name": "A", "date": start, "open": 10.0, "high": 10.0, "low": 10.0, "close": 10.0, "volume": 1, "amount": 1000.0, "signal_limit_up": False, "signal_limit_down": False}, - {"symbol": "A", "name": "A", "date": start + timedelta(days=1), "open": 11.0, "high": 11.0, "low": 11.0, "close": 11.0, "volume": 1, "amount": 0.0, "signal_limit_up": False, "signal_limit_down": False}, - {"symbol": "A", "name": "A", "date": start + timedelta(days=2), "open": 20.0, "high": 20.0, "low": 20.0, "close": 20.0, "volume": 1, "amount": 1000.0, "signal_limit_up": False, "signal_limit_down": False}, - ]).sort(["symbol", "date"]) - - engine = BacktestEngine(repo=None) # type: ignore[arg-type] - engine.load_panel = lambda symbols, s, e: panel # type: ignore[method-assign] - strategy = _strategy( - filter_fn=lambda df, params: pl.col("date") == start, - max_hold_days=1, - ) - service = StrategyBacktestService(engine=engine, strategy_engine=_StrategyEngineStub(strategy)) - - result = service.run(StrategyBacktestConfig( - strategy_id="test", - symbols=None, - start=start, - end=start, - mode="full", - matching="open_t+1", - fees_pct=0, - slippage_bps=0, - holding_days=1, - )) - - assert result.error is None - assert result.stats["full_kind"] == "candidate_execution" - assert result.stats["n_candidates"] == 1 - assert result.stats["n_trades"] == 1 - assert result.trades[0]["entry_date"] == str(start + timedelta(days=1)) - assert result.trades[0]["exit_reason"] == "max_hold" - assert result.stats["avg_return"] == round(20 / 11 - 1, 4) diff --git a/serve/frontend/src/components/ColumnCustomizer.tsx b/serve/frontend/src/components/ColumnCustomizer.tsx index 814dcd7..1f124d3 100644 --- a/serve/frontend/src/components/ColumnCustomizer.tsx +++ b/serve/frontend/src/components/ColumnCustomizer.tsx @@ -1,5 +1,5 @@ import { ListColumnCustomizer } from '@/components/ListColumnCustomizer' -import { COLUMN_GROUPS, type ColumnConfig } from '@/lib/watchlist-columns' +import type { ColumnConfig } from '@/lib/list-columns' interface ColumnCustomizerProps { columns: ColumnConfig[] @@ -12,7 +12,7 @@ export function ColumnCustomizer({ columns, onChange, open, onClose }: ColumnCus return ( s.symbol === symbol) - - const toggleWatchlist = useMutation({ - mutationFn: () => inWatchlist ? api.watchlistRemove(symbol!) : api.watchlistAdd(symbol!), - onSuccess: () => { - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) - }, - }) - // ESC 关闭 useEffect(() => { if (!symbol) return @@ -239,8 +222,6 @@ export function StockPreviewDialog({ symbol, name, onClose, triggerInfo }: Props onSelectDate={() => { if (!showIntraday) setShowIntraday(true) }} dateRange={dateRange} onMonitor={() => setShowMonitorEditor(true)} - inWatchlist={inWatchlist} - onToggleWatchlist={() => toggleWatchlist.mutate()} /> diff --git a/serve/frontend/src/components/screener/ScreenerTable.tsx b/serve/frontend/src/components/screener/ScreenerTable.tsx index 3ec62ea..2930da6 100644 --- a/serve/frontend/src/components/screener/ScreenerTable.tsx +++ b/serve/frontend/src/components/screener/ScreenerTable.tsx @@ -6,7 +6,7 @@ * score、signals、candle、ext 列。其余纯数据列(价格/指标/财务…)交给共享原语。 */ import { useState, type CSSProperties, type ReactNode } from 'react' -import { Check, Plus, Eye, EyeOff } from 'lucide-react' +import { Eye, EyeOff } from 'lucide-react' import type { KlineRow } from '@/lib/api' import { fmtPrice } from '@/lib/format' import type { ColumnConfig } from '@/lib/screener-columns' @@ -22,10 +22,7 @@ interface ScreenerTableProps { strategyIdToName: Record symbolStrategyMap: Map activeStrategy: string | null - watchlistSet: Set onPreview: (symbol: string, name: string) => void - onToggleWatchlist: (symbol: string, inList: boolean) => void - watchlistPending: boolean /** symbol → 日k 数据,仅当启用日k列时传入 */ klineData?: Record /** 日k蜡烛图是否显示(表头眼睛开关) */ @@ -114,7 +111,7 @@ function renderExtValue( export function ScreenerTable({ rows, columns, strategyIdToName, symbolStrategyMap, activeStrategy, - watchlistSet, onPreview, onToggleWatchlist, watchlistPending, klineData = {}, + onPreview, klineData = {}, dailyKChartVisible = true, onToggleDailyKChart, sort, onSortToggle, }: ScreenerTableProps) { @@ -164,7 +161,6 @@ export function ScreenerTable({ switch (key) { case 'symbol': { const board = boardTag(r.symbol) - const inWatchlist = watchlistSet.has(r.symbol) return (
@@ -189,25 +185,10 @@ export function ScreenerTable({ )} - {isExpired ? ( + {isExpired && ( 失效 - ) : ( - )}
diff --git a/serve/frontend/src/components/screener/StrategySettingsDialog.tsx b/serve/frontend/src/components/screener/StrategySettingsDialog.tsx index f4eb336..d9ae17d 100644 --- a/serve/frontend/src/components/screener/StrategySettingsDialog.tsx +++ b/serve/frontend/src/components/screener/StrategySettingsDialog.tsx @@ -2,25 +2,36 @@ import { motion, AnimatePresence } from 'framer-motion' import { X, Settings2, RotateCcw, Save, ChevronDown, Filter, Star, TrendingUp, Sparkles } from 'lucide-react' import { api, type StrategyDetail, type StrategyParamDef } from '@/lib/api' -import { BUILTIN_COLUMNS } from '@/lib/watchlist-columns' import { color } from '@/lib/colors' import { SignalPicker } from './SignalPicker' import { SignalTriggerActions } from '@/components/signals/SignalTriggerActions' -// 内置列名 → 中文标签 -const FIELD_LABEL: Record = {} -for (const c of BUILTIN_COLUMNS) { - if (c.source.type === 'builtin') FIELD_LABEL[c.source.key] = c.label -} -// enriched 列名别名 -Object.assign(FIELD_LABEL, { +// 字段名 → 中文标签 +const FIELD_LABEL: Record = { + close: '收盘价', open: '开盘价', high: '最高价', low: '最低价', change_pct: '涨跌幅', consecutive_limit_ups: '连板', + momentum_5d: '5D动量', momentum_10d: '10D动量', + momentum_20d: '20D动量', momentum_30d: '30D动量', momentum_60d: '60D动量', turnover_rate: '换手率', + change_amount: '涨跌额', amplitude: '振幅', + volume: '成交量', amount: '成交额', rsi_14: 'RSI14', rsi_6: 'RSI6', rsi_24: 'RSI24', vol_ratio_5d: '量比', vol_ratio_20d: '20日量比', + vol_ratio: '量比', macd_dif: 'MACD-DIF', macd_dea: 'MACD-DEA', macd_hist: 'MACD柱', boll_upper: '布林上轨', boll_lower: '布林下轨', -}) + ma5: 'MA5', ma10: 'MA10', ma20: 'MA20', ma30: 'MA30', ma60: 'MA60', + kdj_k: 'KDJ-K', kdj_d: 'KDJ-D', kdj_j: 'KDJ-J', + atr14: 'ATR14', annual_vol: '年化波动', + high_60d: '60日高', low_60d: '60日低', + eps: 'EPS', bps: 'BPS', roe: 'ROE', pe_ttm: 'PE(TTM)', pb: 'PB', + gross_margin: '毛利率', net_margin: '净利率', + revenue_yoy: '营收增速', net_income_yoy: '净利增速', + debt_ratio: '负债率', + score: '评分', + limit_ups: '连板', limit_downs: '连跌', + float_val: '流通值', price: '现价', pct: '涨跌幅', turnover: '换手率', +} interface Props { strategyId: string | null diff --git a/serve/frontend/src/lib/api.ts b/serve/frontend/src/lib/api.ts index 96cf1c7..ceef787 100644 --- a/serve/frontend/src/lib/api.ts +++ b/serve/frontend/src/lib/api.ts @@ -192,23 +192,6 @@ export interface KlineRow { [key: string]: any } -// ===== Watchlist ===== -export interface WatchlistEntry { - symbol: string - added_at: string - note?: string - name?: string | null -} - -export interface Quote { - symbol: string - price?: number - pct?: number - close?: number - change_pct?: number - [key: string]: any -} - export interface IndexInstrument { symbol: string name?: string | null @@ -505,111 +488,6 @@ export interface LimitLadderResult { sealed_counts_down?: { real: number; fake: number; pending: number } } -// ===== Backtest ===== -export interface BacktestResult { - run_id: string - config: any - stats: Record - equity_curve: { date: string; value: number }[] - trades: any[] - per_symbol_stats: { symbol: string; total_return: number }[] -} - -// ===== Factor Backtest ===== -export interface FactorColumn { - id: string - label: string - group: string - desc: string -} - -export interface GroupStat { - group: number - label: string - total_return: number - annual_return: number - max_drawdown: number - sharpe: number - win_rate: number -} - -export interface FactorBacktestResult { - run_id: string - config: Record - ic_mean: number | null - ic_std: number | null - ir: number | null - ic_win_rate: number | null - ic_series: { date: string; ic: number }[] - group_stats: GroupStat[] - group_nav: Record[] - long_short_stats: Record - long_short_nav: { date: string; value: number }[] - elapsed_ms: number - n_symbols: number - n_dates: number - error: string | null -} - -// ===== Strategy Backtest ===== -export interface StrategyBacktestTrade { - symbol: string - name?: string - entry_date: string - exit_date: string - entry_price: number - exit_price: number - pnl_pct: number - duration: number - exit_reason: string - shares?: number - lots?: number - position_pct?: number - entry_value?: number - exit_value?: number - pnl_amount?: number - entry_score?: number | null - entry_signal_date?: string | null - exit_signal_date?: string | null - blocked_exit_days?: number -} - -export interface StrategyBacktestResult { - run_id: string - config: Record - stats: Record - equity_curve: { date: string; value: number; cash?: number; positions?: number; exposure?: number }[] - drawdown_curve: { date: string; value: number }[] - benchmark_curve?: { date: string; value: number; close?: number; name?: string; symbol?: string }[] - trades: StrategyBacktestTrade[] - per_symbol_stats: { - symbol: string - n_trades: number - total_return: number - win_rate: number - best: number - worst: number - }[] - strategy_info: { - id: string - name: string - description: string - entry_signals: string[] - exit_signals: string[] - stop_loss: number | null - take_profit: number | null - trailing_stop: number | null - trailing_take_profit_activate: number | null - trailing_take_profit_drawdown: number | null - score_min: number | null - score_max: number | null - max_hold_days: number | null - source: string - } - elapsed_ms: number - error: string | null -} - // ===== Settings ===== /** 端点发现清单 —— 对应 tickflow.org/endpoints.json */ @@ -856,15 +734,6 @@ export const api = { body: JSON.stringify({ size }), }), - // 自选列表列配置 - watchlistColumns: () => - request<{ columns: any[] | null }>('/api/settings/preferences/watchlist-columns'), - updateWatchlistColumns: (columns: any[]) => - request<{ columns: any[] }>('/api/settings/preferences/watchlist-columns', { - method: 'PUT', - body: JSON.stringify({ columns }), - }), - // 策略结果列表列配置 screenerResultColumns: () => request<{ columns: any[] | null }>('/api/settings/preferences/screener-result-columns'), @@ -976,37 +845,6 @@ export const api = { method: 'POST', }), - watchlistList: () => request<{ symbols: WatchlistEntry[] }>('/api/watchlist'), - watchlistAdd: (symbol: string, note = '') => - request<{ symbols: WatchlistEntry[] }>('/api/watchlist', { - method: 'POST', - body: JSON.stringify({ symbol, note }), - }), - watchlistBatchAdd: (symbols: string[], note = '') => - request<{ symbols: WatchlistEntry[]; added: number }>('/api/watchlist/batch', { - method: 'POST', - body: JSON.stringify({ symbols, note }), - }), - watchlistRemove: (symbol: string) => - request<{ symbols: WatchlistEntry[] }>( - `/api/watchlist/${encodeURIComponent(symbol)}`, - { method: 'DELETE' }, - ), - watchlistMoveToTop: (symbol: string) => - request<{ symbols: WatchlistEntry[] }>( - `/api/watchlist/${encodeURIComponent(symbol)}/top`, - { method: 'POST' }, - ), - watchlistClear: () => - request<{ removed: number }>('/api/watchlist', { method: 'DELETE' }), - watchlistQuotes: () => request<{ quotes: Quote[] }>('/api/watchlist/quotes'), - watchlistEnriched: (extColumns?: string) => - request<{ rows: any[]; as_of: string | null; elapsed_ms: number }>( - extColumns - ? `/api/watchlist/enriched?ext_columns=${encodeURIComponent(extColumns)}` - : '/api/watchlist/enriched', - ), - screenerStrategies: () => request<{ presets: ScreenerStrategy[] }>('/api/screener/strategies'), screenerRunPreset: (strategy_id: string, pool?: string[], asOf?: string, extColumns?: string) => request('/api/screener/run_preset', { @@ -1047,63 +885,6 @@ export const api = { ) }, - backtestStatus: () => request<{ available: boolean }>('/api/backtest/status'), - - backtestRun: (payload: { - symbols: string[] - entries: string[] - exits: string[] - start?: string - end?: string - stop_loss_pct?: number - max_hold_days?: number - matching?: 'close_t' | 'open_t+1' - }) => - request('/api/backtest/run', { - method: 'POST', - body: JSON.stringify(payload), - }), - - factorColumns: () => - request<{ columns: FactorColumn[] }>('/api/backtest/factor/columns'), - - factorRun: (payload: { - factor_name: string - symbols?: string[] | null - start?: string | null - end?: string | null - n_groups?: number - rebalance?: 'daily' | 'weekly' | 'monthly' - weight?: 'equal' | 'factor_weight' - fees_pct?: number - slippage_bps?: number - }) => - request('/api/backtest/factor/run', { - method: 'POST', - body: JSON.stringify(payload), - }), - - strategyBacktestRun: (payload: { - strategy_id: string - symbols?: string[] | null - start?: string | null - end?: string | null - params?: Record | null - overrides?: Record | null - matching?: 'close_t' | 'open_t+1' - entry_fill?: 'close_t' | 'open_t+1' | null - exit_fill?: 'close_t' | 'open_t+1' | null - fees_pct?: number - slippage_bps?: number - max_positions?: number - initial_capital?: number - position_sizing?: 'equal' | 'score_weight' - }) => - request('/api/backtest/strategy/run', { - method: 'POST', - body: JSON.stringify(payload), - }), - pipelineRun: () => request<{ job_id: string; reused: boolean }>( '/api/pipeline/run', { method: 'POST' }, ), diff --git a/serve/frontend/src/lib/backtestTask.ts b/serve/frontend/src/lib/backtestTask.ts deleted file mode 100644 index 2c2eb6d..0000000 --- a/serve/frontend/src/lib/backtestTask.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { useSyncExternalStore } from 'react' -import type { StrategyBacktestResult } from './api' - -/** - * 全局回测任务管理 (SSE 模式 + 任务缓存 + 重连支持)。 - * - * 特性: - * - 实时进度: EventSource 监听后端 SSE, 推送 day/total/equity - * - 可取消: POST /strategy/cancel/{job_key}, 后端 cancel_event - * - 切页/刷新保持: 后端按参数 hash 缓存任务, 重连不重启 - * - 切页: 模块级 store 保持, EventSource 随组件卸载断开, 回来后重连 - * - 刷新: localStorage 存 job 参数, 刷新后重新连接到同一任务 - */ - -export interface BacktestProgress { - day: number - total: number - date: string - equity: number -} - -export interface BacktestTask { - id: number - isPending: boolean - result: StrategyBacktestResult | null - progress: BacktestProgress | null - error: string | null -} - -let current: BacktestTask | null = null -const listeners = new Set<() => void>() -let taskSeq = 0 -let eventSource: EventSource | null = null - -const RECONNECT_KEY = 'backtest_reconnect' - -function emit() { - listeners.forEach(fn => fn()) -} - -function subscribe(fn: () => void) { - listeners.add(fn) - return () => listeners.delete(fn) -} - -function getSnapshot() { - return current -} - -function getServerSnapshot() { - return null -} - -/** 查询字符串构建 */ -function buildQuery(params: Record): string { - const sp = new URLSearchParams() - for (const [k, v] of Object.entries(params)) { - if (v != null && v !== '') sp.set(k, String(v)) - } - return sp.toString() -} - -/** 连接 SSE (新建或重连都用这个) */ -function connectSSE(url: string): void { - const id = current?.id ?? ++taskSeq - - // 关闭旧连接 - if (eventSource) { - eventSource.close() - eventSource = null - } - - const es = new EventSource(url) - eventSource = es - - es.addEventListener('progress', (e: MessageEvent) => { - if (current?.id !== id) return - try { - const prog = JSON.parse(e.data) as BacktestProgress - current = { ...current, progress: prog } - emit() - } catch { /* ignore */ } - }) - - es.addEventListener('done', (e: MessageEvent) => { - if (current?.id !== id) return - try { - const result = JSON.parse(e.data) as StrategyBacktestResult - current = { ...current, isPending: false, result, error: null } - emit() - } catch { - current = { ...current, isPending: false, error: '结果解析失败' } - emit() - } - es.close() - eventSource = null - localStorage.removeItem(RECONNECT_KEY) - }) - - es.addEventListener('error', (e: MessageEvent) => { - if (current?.id !== id) return - // SSE error 事件: 有 data 说明是后端主动推送的错误/取消; 无 data 说明是连接断开 - if (e.data) { - try { - const msg = JSON.parse(e.data)?.message ?? '回测出错' - current = { ...current, isPending: false, error: msg } - emit() - } catch { - current = { ...current, isPending: false, error: '回测出错' } - emit() - } - es.close() - eventSource = null - localStorage.removeItem(RECONNECT_KEY) - } - // 无 data: 连接异常断开, EventSource 会自动重连, 不改变状态 - }) -} - -/** 启动一次 SSE 回测任务 */ -export function startBacktest(params: { - strategy_id: string - symbols?: string[] | null - start?: string | null - end?: string | null - matching?: string - entry_fill?: string - exit_fill?: string - fees_pct?: number - slippage_bps?: number - max_positions?: number - max_exposure_pct?: number - initial_capital?: number - position_sizing?: string - params?: Record | null - overrides?: Record | null - mode?: 'position' | 'full' - holding_days?: number -}): void { - // 取消之前的任务状态 - if (eventSource) { - eventSource.close() - eventSource = null - } - - const id = ++taskSeq - current = { id, isPending: true, result: null, progress: null, error: null } - emit() - - const qs = buildQuery({ - strategy_id: params.strategy_id, - symbols: params.symbols?.join(','), - start: params.start ?? undefined, - end: params.end ?? undefined, - matching: params.matching, - entry_fill: params.entry_fill, - exit_fill: params.exit_fill, - fees_pct: params.fees_pct, - slippage_bps: params.slippage_bps, - max_positions: params.max_positions, - max_exposure_pct: params.max_exposure_pct, - initial_capital: params.initial_capital, - position_sizing: params.position_sizing, - params: params.params ? JSON.stringify(params.params) : undefined, - overrides: params.overrides ? JSON.stringify(params.overrides) : undefined, - mode: params.mode, - holding_days: params.holding_days, - }) - - // 存 reconnect 信息 (刷新后用) - localStorage.setItem(RECONNECT_KEY, qs) - - connectSSE(`/api/backtest/strategy/stream?${qs}`) -} - -/** 停止当前回测任务 (调后端 cancel, 后端 cancel_event → 停止计算) */ -export async function stopBacktest(): Promise { - // 从 reconnect key 提取 job_key (后端按参数 hash 算 job_key) - const qs = localStorage.getItem(RECONNECT_KEY) - if (qs) { - // 解析出参数, 用 fetch 调 cancel - try { - // job_key 是后端算的 md5, 前端不知道。用 reconnect URL 里的参数重新请求 stream, - // 后端会找到同一个 job 并返回它的 job_key? 不行。 - // 替代: 前端直接关闭 SSE 连接 + 调一个带参数的 cancel 接口。 - // 简化: 关闭连接即可, 后端检测断开后 (不取消)。需要 cancel 用 POST。 - // 这里用 cancel 接口: POST /strategy/cancel, body 带 qs 的参数。 - await fetch('/api/backtest/strategy/cancel', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ qs }), - }).catch(() => {}) - } catch { /* ignore */ } - } - if (eventSource) { - eventSource.close() - eventSource = null - } - if (current?.isPending) { - current = { ...current, isPending: false, error: '已取消' } - emit() - } - localStorage.removeItem(RECONNECT_KEY) -} - -/** 清除任务状态 (隐藏提示) */ -export function clearBacktest(): void { - current = null - emit() -} - -/** 恢复: 从 localStorage 读取 reconnect 信息, 重新连接 (刷新后调用) */ -export function tryReconnect(): boolean { - const qs = localStorage.getItem(RECONNECT_KEY) - if (!qs) return false - // 有未完成的任务, 重连 - const id = ++taskSeq - current = { id, isPending: true, result: null, progress: null, error: null } - emit() - connectSSE(`/api/backtest/strategy/stream?${qs}`) - return true -} - -/** React hook: 读取当前全局回测任务状态 */ -export function useBacktestTask(): BacktestTask | null { - return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) -} diff --git a/serve/frontend/src/lib/queryKeys.ts b/serve/frontend/src/lib/queryKeys.ts index 60e06d4..f0efbc9 100644 --- a/serve/frontend/src/lib/queryKeys.ts +++ b/serve/frontend/src/lib/queryKeys.ts @@ -16,11 +16,7 @@ export const QK = { overviewMarket: (asOf?: string) => ['overview-market', asOf ?? 'latest'] as const, indexList: ['index-list'] as const, - // Watchlist - watchlist: ['watchlist'] as const, - watchlistQuotes: ['watchlist-quotes'] as const, - watchlistEnriched: (ext?: string) => ['watchlist-enriched', ext] as const, - watchlistKlineBatch: (symbols: string) => ['watchlist-kline-batch', symbols] as const, + // Search instrumentSearch: (q: string) => ['instrument-search', q] as const, // Screener @@ -31,9 +27,6 @@ export const QK = { marketSnapshot: ['market-snapshot'] as const, limitLadder: (asOf?: string) => ['limit-ladder', asOf] as const, - // Backtest - backtestStatus: ['backtest-status'] as const, - // Data / Pipeline dataStatus: ['data-status'] as const, pipelineJobs: ['pipeline-jobs'] as const, diff --git a/serve/frontend/src/lib/screener-columns.ts b/serve/frontend/src/lib/screener-columns.ts index 01601a8..35a8126 100644 --- a/serve/frontend/src/lib/screener-columns.ts +++ b/serve/frontend/src/lib/screener-columns.ts @@ -1,8 +1,5 @@ /** * 策略结果列表自定义列配置。 - * - * 内置列与分组与自选页 (watchlist-columns) 保持一致,额外保留策略特有的 - * 「策略」「评分」两列。通用列模型/合并/扩展列参数来自 list-columns。 */ import { storage } from '@/lib/storage' import { diff --git a/serve/frontend/src/lib/signals.ts b/serve/frontend/src/lib/signals.ts index eff1b76..89a8c2e 100644 --- a/serve/frontend/src/lib/signals.ts +++ b/serve/frontend/src/lib/signals.ts @@ -1,7 +1,7 @@ /** - * 买卖触发器信号定义 — 选股页弹窗 / 回测页共用。 + * 买卖触发器信号定义 — 选股页弹窗共用。 * - * 信号 ID 必须与后端 backtest/strategy.py:_build_signal_mask 对齐 + * 信号 ID 必须与后端对齐 * (signal_* 前缀为内置原子信号, csg_ 前缀为用户自定义信号)。 */ diff --git a/serve/frontend/src/lib/storage.ts b/serve/frontend/src/lib/storage.ts index 1b3db9b..54a0b8f 100644 --- a/serve/frontend/src/lib/storage.ts +++ b/serve/frontend/src/lib/storage.ts @@ -27,27 +27,15 @@ export const storage = { /** 策略池 (screener) */ strategyPool: kv('strategy-pool'), - /** 自选列表列配置 */ - watchlistColumns: kv('watchlist_columns'), - /** 个股日K信息条指标配置 */ stockInfoBarFields: kv('stock_info_bar_fields'), /** 策略结果列表列配置 */ screenerResultColumns: kv('screener_result_columns'), - /** 自选列表视图模式 table | card */ - watchlistView: kv('watchlist_view'), - - /** 自选列表日K蜡烛图显示状态 */ - watchlistCandle: kv('watchlist_showCandle'), - /** 策略结果列表日K蜡烛图显示状态 */ screenerCandle: kv('screener_showCandle'), - /** 自选列表板块筛选 */ - watchlistBoardFilter: kv('watchlist_boardFilter'), - /** Screener 卡片尺寸 */ screenerCardSize: kv('screener-card-size'), @@ -78,31 +66,6 @@ export const storage = { /** 已保存策略的原始规则(策略ID → 规则文本) */ strategyRules: kv>('strategy-rules'), - /** 策略回测快捷区间按钮配置 */ - strategyBacktestQuickRanges: kv('strategy-backtest-quick-ranges'), - - /** 策略回测最后一次成功结果和参数 */ - strategyBacktestLast: kv<{ - selectedStrategy: string | null - symbols: string - start: string - end: string - matching: 'close_t' | 'open_t+1' - entryFill: 'close_t' | 'open_t+1' - exitFill: 'close_t' | 'open_t+1' - fees: string - slippage: string - maxPositions: string - maxExposure: string - initialCapital: string - positionSizing: 'equal' | 'score_weight' - mode: 'position' | 'full' - holdingDays: string - params?: Record - overrides?: Record - result: any - } | null>('strategy-backtest-last'), - /** 概念分析页面字段配置 */ conceptAnalysisConfig: kv>('concept-analysis-config'), diff --git a/serve/frontend/src/lib/useSharedMutations.ts b/serve/frontend/src/lib/useSharedMutations.ts index d4bb726..5ba20e3 100644 --- a/serve/frontend/src/lib/useSharedMutations.ts +++ b/serve/frontend/src/lib/useSharedMutations.ts @@ -1,18 +1,3 @@ /** * 共享 mutation hooks — 消除多页面重复的 useMutation 调用。 */ -import { useMutation, useQueryClient } from '@tanstack/react-query' -import { api } from './api' -import { QK } from './queryKeys' - -/** 批量添加自选 — Screener / Intraday 共用 */ -export function useWatchlistBatchAdd() { - const qc = useQueryClient() - return useMutation({ - mutationFn: (symbols: string[]) => api.watchlistBatchAdd(symbols), - onSuccess: () => { - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) - }, - }) -} diff --git a/serve/frontend/src/lib/watchlist-columns.ts b/serve/frontend/src/lib/watchlist-columns.ts deleted file mode 100644 index 3c69cc4..0000000 --- a/serve/frontend/src/lib/watchlist-columns.ts +++ /dev/null @@ -1,166 +0,0 @@ -/** - * 自选列表自定义列配置。 - * - * 自选页只保留业务内置列、分组和偏好持久化;通用列模型/合并/扩展列参数 - * 来自 list-columns,策略页等其它股票列表可复用同一底座。 - */ - -import { storage } from '@/lib/storage' -import { - buildExtColumnsParam as buildExtColumnsParamBase, - createExtColumn as createExtColumnBase, - mergeColumns as mergeColumnsBase, - serializeColumns as serializeColumnsBase, - type ColumnConfig, - type ColumnGroup, - type ColumnSource, - type ExtColumnDisplayConfig, - type CandleColumnConfig, -} from '@/lib/list-columns' - -export type { ColumnConfig, ColumnGroup, ColumnSource, ExtColumnDisplayConfig, CandleColumnConfig } - -// ===== 内置列注册表(与当前硬编码一一对应) ===== - -export const BUILTIN_COLUMNS: ColumnConfig[] = [ - // 固定列 - { id: 'builtin:symbol', source: { type: 'builtin', key: 'symbol' }, label: '代码/名称', visible: true, pinned: true, align: 'left' }, - // 价格 - { id: 'builtin:price', source: { type: 'builtin', key: 'price' }, label: '现价', visible: true, align: 'center' }, - { id: 'builtin:pct', source: { type: 'builtin', key: 'pct' }, label: '涨跌幅', visible: true, align: 'center' }, - { id: 'builtin:change_amount', source: { type: 'builtin', key: 'change_amount' }, label: '涨跌额', visible: false, align: 'center' }, - { id: 'builtin:amplitude', source: { type: 'builtin', key: 'amplitude' }, label: '振幅', visible: false, align: 'center' }, - // 成交 - { id: 'builtin:turnover', source: { type: 'builtin', key: 'turnover' }, label: '换手率', visible: true, align: 'center' }, - { id: 'builtin:amount', source: { type: 'builtin', key: 'amount' }, label: '成交额', visible: false, align: 'center' }, - { id: 'builtin:float_val', source: { type: 'builtin', key: 'float_val' }, label: '流通值', visible: false, align: 'center' }, - { id: 'builtin:vol_ratio', source: { type: 'builtin', key: 'vol_ratio' }, label: '量比', visible: true, align: 'center' }, - { id: 'builtin:annual_vol', source: { type: 'builtin', key: 'annual_vol' }, label: '年化波动', visible: false, align: 'center' }, - // 均线 - { id: 'builtin:ma5', source: { type: 'builtin', key: 'ma5' }, label: 'MA5', visible: false, align: 'center' }, - { id: 'builtin:ma10', source: { type: 'builtin', key: 'ma10' }, label: 'MA10', visible: false, align: 'center' }, - { id: 'builtin:ma20', source: { type: 'builtin', key: 'ma20' }, label: 'MA20', visible: false, align: 'center' }, - { id: 'builtin:ma60', source: { type: 'builtin', key: 'ma60' }, label: 'MA60', visible: false, align: 'center' }, - // 区间 - { id: 'builtin:high_60d', source: { type: 'builtin', key: 'high_60d' }, label: '60日高', visible: false, align: 'center' }, - { id: 'builtin:low_60d', source: { type: 'builtin', key: 'low_60d' }, label: '60日低', visible: false, align: 'center' }, - // 技术指标 - { id: 'builtin:rsi6', source: { type: 'builtin', key: 'rsi6' }, label: 'RSI6', visible: false, align: 'center' }, - { id: 'builtin:rsi14', source: { type: 'builtin', key: 'rsi14' }, label: 'RSI14', visible: true, align: 'center' }, - { id: 'builtin:rsi24', source: { type: 'builtin', key: 'rsi24' }, label: 'RSI24', visible: false, align: 'center' }, - { id: 'builtin:macd_dif', source: { type: 'builtin', key: 'macd_dif' }, label: 'MACD-DIF', visible: false, align: 'center' }, - { id: 'builtin:macd_dea', source: { type: 'builtin', key: 'macd_dea' }, label: 'MACD-DEA', visible: false, align: 'center' }, - { id: 'builtin:macd_hist', source: { type: 'builtin', key: 'macd_hist' }, label: 'MACD柱', visible: false, align: 'center' }, - { id: 'builtin:kdj_k', source: { type: 'builtin', key: 'kdj_k' }, label: 'KDJ-K', visible: false, align: 'center' }, - { id: 'builtin:kdj_d', source: { type: 'builtin', key: 'kdj_d' }, label: 'KDJ-D', visible: false, align: 'center' }, - { id: 'builtin:kdj_j', source: { type: 'builtin', key: 'kdj_j' }, label: 'KDJ-J', visible: false, align: 'center' }, - { id: 'builtin:boll_upper', source: { type: 'builtin', key: 'boll_upper' }, label: '布林上轨', visible: false, align: 'center' }, - { id: 'builtin:boll_lower', source: { type: 'builtin', key: 'boll_lower' }, label: '布林下轨', visible: false, align: 'center' }, - { id: 'builtin:atr14', source: { type: 'builtin', key: 'atr14' }, label: 'ATR14', visible: false, align: 'center' }, - { id: 'builtin:vol_ma5', source: { type: 'builtin', key: 'vol_ma5' }, label: '量MA5', visible: false, align: 'center' }, - { id: 'builtin:vol_ma10', source: { type: 'builtin', key: 'vol_ma10' }, label: '量MA10', visible: false, align: 'center' }, - // 动量 - { id: 'builtin:momentum_5d', source: { type: 'builtin', key: 'momentum_5d' }, label: '5D 动量', visible: false, align: 'center' }, - { id: 'builtin:momentum_10d', source: { type: 'builtin', key: 'momentum_10d' }, label: '10D 动量', visible: false, align: 'center' }, - { id: 'builtin:momentum_20d', source: { type: 'builtin', key: 'momentum_20d' }, label: '20D 动量', visible: false, align: 'center' }, - { id: 'builtin:momentum_30d', source: { type: 'builtin', key: 'momentum_30d' }, label: '30D 动量', visible: false, align: 'center' }, - { id: 'builtin:momentum_60d', source: { type: 'builtin', key: 'momentum' }, label: '60D 动量', visible: true, align: 'center' }, - // 连板 - { id: 'builtin:limit_ups', source: { type: 'builtin', key: 'limit_ups' }, label: '连板', visible: true, align: 'center' }, - { id: 'builtin:limit_downs', source: { type: 'builtin', key: 'limit_downs' }, label: '连跌', visible: false, align: 'center' }, - // 信号 & 图表 - { id: 'builtin:signals', source: { type: 'builtin', key: 'signals' }, label: '信号', visible: true, align: 'center' }, - { id: 'builtin:candle', source: { type: 'builtin', key: 'candle' }, label: '日k', visible: false, align: 'center' }, - // 财务指标 (需 Expert 套餐 financial capability, 列默认隐藏) - { id: 'builtin:eps', source: { type: 'builtin', key: 'eps' }, label: 'EPS', visible: false, align: 'center' }, - { id: 'builtin:bps', source: { type: 'builtin', key: 'bps' }, label: 'BPS', visible: false, align: 'center' }, - { id: 'builtin:roe', source: { type: 'builtin', key: 'roe' }, label: 'ROE', visible: false, align: 'center' }, - { id: 'builtin:pe_ttm', source: { type: 'builtin', key: 'pe_ttm' }, label: 'PE(TTM)', visible: false, align: 'center' }, - { id: 'builtin:pb', source: { type: 'builtin', key: 'pb' }, label: 'PB', visible: false, align: 'center' }, - { id: 'builtin:gross_margin', source: { type: 'builtin', key: 'gross_margin' }, label: '毛利率', visible: false, align: 'center' }, - { id: 'builtin:net_margin', source: { type: 'builtin', key: 'net_margin' }, label: '净利率', visible: false, align: 'center' }, - { id: 'builtin:revenue_yoy', source: { type: 'builtin', key: 'revenue_yoy' }, label: '营收增速', visible: false, align: 'center' }, - { id: 'builtin:net_income_yoy', source: { type: 'builtin', key: 'net_income_yoy' }, label: '净利增速', visible: false, align: 'center' }, - { id: 'builtin:debt_ratio', source: { type: 'builtin', key: 'debt_ratio' }, label: '负债率', visible: false, align: 'center' }, -] - -export const COLUMN_GROUPS: ColumnGroup[] = [ - { id: 'price', label: '价格', icon: '💰', keys: ['price', 'pct', 'change_amount', 'amplitude'] }, - { id: 'volume', label: '成交', icon: '📊', keys: ['turnover', 'amount', 'float_val', 'vol_ratio', 'annual_vol'] }, - { id: 'ma', label: '均线', icon: '📈', keys: ['ma5', 'ma10', 'ma20', 'ma60'] }, - { id: 'range', label: '区间', icon: '📏', keys: ['high_60d', 'low_60d'] }, - { id: 'tech', label: '技术指标', icon: '🔬', keys: ['rsi6', 'rsi14', 'rsi24', 'macd_dif', 'macd_dea', 'macd_hist', 'kdj_k', 'kdj_d', 'kdj_j', 'boll_upper', 'boll_lower', 'atr14', 'vol_ma5', 'vol_ma10'] }, - { id: 'momentum', label: '动量', icon: '🚀', keys: ['momentum_5d', 'momentum_10d', 'momentum_20d', 'momentum_30d', 'momentum_60d'] }, - { id: 'limit', label: '连板', icon: '🔥', keys: ['limit_ups', 'limit_downs'] }, - { id: 'signal', label: '信号', icon: '📡', keys: ['signals', 'candle'] }, - { id: 'finance', label: '财务', icon: '📋', keys: ['eps', 'bps', 'roe', 'pe_ttm', 'pb', 'gross_margin', 'net_margin', 'revenue_yoy', 'net_income_yoy', 'debt_ratio'] }, -] - -// 操作列(始终显示,不参与自定义) -export const ACTION_COLUMN_ID = 'builtin:action' - -// ===== localStorage 持久化 ===== - -/** 序列化列配置(只保存用户可自定义的列,排除 pinned 和 action) */ -export function serializeColumns(columns: ColumnConfig[]): ColumnConfig[] { - return serializeColumnsBase(columns, ACTION_COLUMN_ID) -} - -/** 序列化并保存到后端 + localStorage */ -export async function saveColumnConfig(columns: ColumnConfig[]): Promise { - const saveable = serializeColumns(columns) - // 同时写 localStorage(即时)和后端(持久化) - storage.watchlistColumns.set(saveable) - try { - const { api } = await import('@/lib/api') - await api.updateWatchlistColumns(saveable) - } catch { - // 后端不可用时 localStorage 仍有效 - } -} - -/** 加载列配置:优先后端,回退 localStorage,最终用默认值 */ -export async function loadColumnConfig(): Promise { - // 1. 尝试从后端加载 - try { - const { api } = await import('@/lib/api') - const res = await api.watchlistColumns() - if (res.columns && res.columns.length > 0) { - const merged = mergeColumns(res.columns, BUILTIN_COLUMNS) - // 同步到 localStorage - storage.watchlistColumns.set(serializeColumns(merged)) - return merged - } - } catch { - // 后端不可用,继续尝试 localStorage - } - - // 2. 尝试从 localStorage 加载 - const saved = storage.watchlistColumns.get([]) as ColumnConfig[] - if (saved.length > 0) { - return mergeColumns(saved, BUILTIN_COLUMNS) - } - - // 3. 默认值 - return [...BUILTIN_COLUMNS] -} - -/** 合并用户保存的列与默认列 */ -function mergeColumns(saved: ColumnConfig[], defaults: ColumnConfig[]): ColumnConfig[] { - return mergeColumnsBase(saved, defaults, { actionColumnId: ACTION_COLUMN_ID }) -} - -/** 从列配置中提取 ext 列参数,用于后端 enriched 接口 */ -export function buildExtColumnsParam(columns: ColumnConfig[]): string { - return buildExtColumnsParamBase(columns) -} - -/** 根据 ext schema 数据创建 ext 列配置 */ -export function createExtColumn( - configId: string, - configLabel: string, - fieldName: string, - fieldLabel?: string, -): ColumnConfig { - return createExtColumnBase(configId, configLabel, fieldName, fieldLabel) -} diff --git a/serve/frontend/src/pages/Backtest.tsx b/serve/frontend/src/pages/Backtest.tsx deleted file mode 100644 index 08ab0d7..0000000 --- a/serve/frontend/src/pages/Backtest.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useState } from 'react' -import { PageHeader } from '@/components/PageHeader' -import { FactorBacktest } from './backtest/FactorBacktest' -import { StrategyBacktest } from './backtest/StrategyBacktest' -import { BarChart3, FlaskConical } from 'lucide-react' - -type Tab = 'factor' | 'strategy' - -const MODES: Record = { - factor: { - title: '因子回测', - subtitle: '验证单个因子是否有预测能力', - hint: '看 IC / IR、分层收益和多空组合,适合先筛掉无效指标。', - }, - strategy: { - title: '策略回测', - subtitle: '验证完整选股和交易规则', - hint: '看净值曲线、回撤、胜率和交易明细,适合判断策略是否可执行。', - }, -} - -export function Backtest() { - const [activeTab, setActiveTab] = useState('strategy') - - const modeSwitch = ( -
- {(['factor', 'strategy'] as const).map(tab => { - const Icon = tab === 'factor' ? BarChart3 : FlaskConical - const active = activeTab === tab - return ( - - ) - })} -
- ) - - return ( -
- - -
- {activeTab === 'factor' && } - {activeTab === 'strategy' && } -
-
- ) -} diff --git a/serve/frontend/src/pages/LimitUpLadder.tsx b/serve/frontend/src/pages/LimitUpLadder.tsx index 3f1ef84..d034a52 100644 --- a/serve/frontend/src/pages/LimitUpLadder.tsx +++ b/serve/frontend/src/pages/LimitUpLadder.tsx @@ -12,7 +12,7 @@ import { PageHeader } from '@/components/PageHeader' import { EmptyState } from '@/components/EmptyState' import { useCapabilities, usePreferences } from '@/lib/useSharedQueries' import { SealedBadge } from '@/components/SealedBadge' -import type { ExtColumnDisplayConfig } from '@/lib/watchlist-columns' +import type { ExtColumnDisplayConfig } from '@/lib/list-columns' // ===== Ext 字段配置 ===== diff --git a/serve/frontend/src/pages/Screener.tsx b/serve/frontend/src/pages/Screener.tsx index 2970546..d2bef6f 100644 --- a/serve/frontend/src/pages/Screener.tsx +++ b/serve/frontend/src/pages/Screener.tsx @@ -1,10 +1,9 @@ import { useState, useEffect, useCallback, useRef, useMemo } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { motion } from 'framer-motion' -import { ScanSearch, Clock, TrendingUp, Star, Filter, Layers, Network, Sparkles, RefreshCw, Settings2, Store } from 'lucide-react' +import { ScanSearch, Clock, TrendingUp, Filter, Layers, Network, Sparkles, RefreshCw, Settings2, Store } from 'lucide-react' import { api, genRuleId, type ScreenerStrategy, type ScreenerResult } from '@/lib/api' import { useDataStatus, usePreferences } from '@/lib/useSharedQueries' -import { useWatchlistBatchAdd } from '@/lib/useSharedMutations' import { QK } from '@/lib/queryKeys' import { storage } from '@/lib/storage' import { PageHeader } from '@/components/PageHeader' @@ -35,7 +34,6 @@ export function Screener() { const [activeStrategy, setActiveStrategy] = useState(null) const [result, setResult] = useState(null) const [asOf, setAsOf] = useState('') - const [batchMsg, setBatchMsg] = useState('') const [previewSymbol, setPreviewSymbol] = useState(null) const [previewName, setPreviewName] = useState('') const closePreview = useCallback(() => { setPreviewSymbol(null); setPreviewName('') }, []) @@ -402,28 +400,6 @@ export function Screener() { const minDate = dataStatus.data?.enriched?.earliest_date ?? '' const maxDate = dataStatus.data?.enriched?.latest_date ?? '' - const batchAdd = useWatchlistBatchAdd() - - // 自选股列表 (用于判断是否在自选中) - const watchlist = useQuery({ - queryKey: QK.watchlist, - queryFn: api.watchlistList, - }) - const watchlistSet = useMemo(() => { - const symbols = watchlist.data?.symbols ?? [] - return new Set(symbols.map((s: any) => s.symbol)) - }, [watchlist.data]) - - // 单只股票加入/移出自选 - const toggleWatchlist = useMutation({ - mutationFn: ({ symbol, inList }: { symbol: string; inList: boolean }) => - inList ? api.watchlistRemove(symbol) : api.watchlistAdd(symbol), - onSuccess: () => { - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) - }, - }) - // 重新运行策略:重载策略文件 + 重跑全部策略,刷新符合条件的个股 const reloadStrategies = useMutation({ mutationFn: api.strategyReload, @@ -473,22 +449,6 @@ export function Screener() { } } - const handleBatchAdd = () => { - if (!displayRows.length) return - const symbols = displayRows.map((r: any) => r.symbol) - batchAdd.mutate(symbols, { - onSuccess: (data) => { - setBatchMsg(`已添加 ${data.added} 只到自选`) - setTimeout(() => setBatchMsg(''), 3000) - }, - onError: () => { - setBatchMsg('添加失败') - setTimeout(() => setBatchMsg(''), 3000) - }, - }) - } - - return ( <> )} - {displayRows.length > 0 && ( - - )} - {batchMsg && ( - {batchMsg} - )} {!showAll && result && result.elapsed_ms > 0 && (
@@ -749,10 +694,7 @@ export function Screener() { strategyIdToName={strategyIdToName} symbolStrategyMap={symbolStrategyMap} activeStrategy={activeStrategy} - watchlistSet={watchlistSet} onPreview={(symbol, name) => { setPreviewSymbol(symbol); setPreviewName(name) }} - onToggleWatchlist={(symbol, inList) => toggleWatchlist.mutate({ symbol, inList })} - watchlistPending={toggleWatchlist.isPending} klineData={klineData} dailyKChartVisible={dailyKChartVisible} onToggleDailyKChart={toggleDailyKChart} diff --git a/serve/frontend/src/pages/Watchlist.tsx b/serve/frontend/src/pages/Watchlist.tsx deleted file mode 100644 index 0414a4b..0000000 --- a/serve/frontend/src/pages/Watchlist.tsx +++ /dev/null @@ -1,1146 +0,0 @@ -import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react' -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' -import { motion, AnimatePresence } from 'framer-motion' -import { Trash2, RefreshCw, Star, X, Search, LayoutGrid, List, Settings2, Plus, Check, Filter, Eye, EyeOff, Minus, ChevronsUp } from 'lucide-react' -import { api, type KlineRow } from '@/lib/api' -import { QK } from '@/lib/queryKeys' -import { storage } from '@/lib/storage' -import { fmtPrice, fmtPct, fmtBigNum, priceColorClass } from '@/lib/format' -import { PageHeader } from '@/components/PageHeader' -import { EmptyState } from '@/components/EmptyState' -import { StockPreviewDialog } from '@/components/StockPreviewDialog' -import { ColumnCustomizer } from '@/components/ColumnCustomizer' -import { StockDataTable } from '@/components/stock-table/StockDataTable' -import { useTableSort } from '@/components/stock-table/useTableSort' -import { MiniCandlestick } from '@/components/stock-table/MiniCandlestick' -import { boardTag, renderBuiltinDataCell } from '@/components/stock-table/primitives' -import { getSignals, signalCls, getSortValue, UNSORTABLE_KEYS } from '@/lib/stock-table' -import { resolveCandleConfig } from '@/lib/list-columns' -import { - type ColumnConfig, - BUILTIN_COLUMNS, - COLUMN_GROUPS, - loadColumnConfig, - saveColumnConfig, - buildExtColumnsParam, -} from '@/lib/watchlist-columns' - -// ===== 板块标识(筛选/卡片用) ===== -// 注: boardTag(创/科/北 标签)已移至共享 @/components/stock-table/primitives - -const BOARDS = ['沪主板', '深主板', '创业板', '科创板', '北交所'] as const -type BoardType = typeof BOARDS[number] - -function getBoardType(symbol: string): BoardType | null { - if (/^(300|301)/.test(symbol)) return '创业板' - if (/^688/.test(symbol)) return '科创板' - if (/\.BJ$/.test(symbol)) return '北交所' - if (/^60[0135]/.test(symbol)) return '沪主板' - if (/^00[012]/.test(symbol)) return '深主板' - return null -} - -// ===== 换手率分档色(卡片/表格用) ===== - -function turnoverColor(rate: number | null | undefined): string { - if (rate == null || Number.isNaN(rate)) return 'text-[#888]' - if (rate < 5) return 'text-[#888]' - if (rate < 10) return 'text-[#d4a800]' - if (rate < 20) return 'text-[#f97316]' - if (rate < 35) return 'text-[#d94a3d]' - return 'text-[#b84a8a]' -} - -// ===== 动态列渲染 ===== -// 表头/单元格渲染已共享化:纯数据列由 @/components/stock-table/primitives 的 -// renderBuiltinDataCell 处理;symbol/signals/candle/ext 等需上下文的列由下方 -// 表格 renderCell 回调处理。表格骨架使用 StockDataTable。 - -/** 渲染扩展数据列的值(含分隔/标签/展开配置) */ -function renderExtValue( - val: any, - col: ColumnConfig, - expanded: boolean, - onToggle: () => void, - inline?: boolean, -): React.ReactNode { - if (val == null || Number.isNaN(val)) return - if (typeof val === 'number') { - // int 类型不显示小数 - const displayVal = Number.isInteger(val) ? fmtPrice(val, 0) : fmtPrice(val) - return {displayVal} - } - if (typeof val === 'boolean') { - return {val ? '是' : '否'} - } - - // String — 按 extDisplay 配置渲染 - const cfg = col.extDisplay - const str = String(val) - - // 纯文本模式 - if (cfg?.displayMode === 'text') { - return {str} - } - - // 标签模式(默认) - const separator = cfg?.separator?.trim() || null - const tags = separator - ? str.split(separator).map(s => s.trim()).filter(Boolean) - : str.split(/[、,,;;\-]/).map(s => s.trim()).filter(Boolean) - - if (tags.length === 0) return - - const maxTags = cfg?.maxTags ?? 0 - const showAll = maxTags <= 0 || expanded || tags.length <= maxTags - const sliced = showAll ? tags : tags.slice(0, maxTags) - const hiddenIndices = maxTags > 0 ? cfg?.hiddenIndices : undefined - const visibleTags = hiddenIndices?.length - ? sliced.filter((_, i) => !hiddenIndices.includes(i)) - : sliced - const hiddenCount = tags.length - visibleTags.length - - // 竖向排列:仅在表格视图、收起状态、设定了显示上限时生效 - const isVertical = !inline && cfg?.tagLayout === 'vertical' && !expanded - - const tagEls = ( - <> - {visibleTags.map((tag, i) => ( - - {tag} - - ))} - {!showAll && hiddenCount > 0 && ( - - )} - {showAll && maxTags > 0 && tags.length > maxTags && ( - - )} - - ) - - if (inline) { - // 卡片视图:返回 inline 片段 - return tagEls - } - // 表格视图:用
包裹 - return
{tagEls}
-} - -/** 渲染扩展数据列的 */ -function renderExtCell( - r: any, - col: ColumnConfig, - expandedCells: Set, - onToggleExpand: (key: string) => void, -): React.ReactNode { - if (col.source.type !== 'ext') return null - const { configId, fieldName } = col.source - const val = r[`${configId}__${fieldName}`] - const cellKey = `${r.symbol}::${col.id}` - const expanded = expandedCells.has(cellKey) - - const style: React.CSSProperties = {} - if (col.extDisplay?.maxWidth) { - style.maxWidth = col.extDisplay.maxWidth - } - - // 根据值类型决定 td class - const tdClass = val == null || Number.isNaN(val) - ? 'px-2 py-1.5 text-right num tabular-nums text-muted' - : typeof val === 'number' - ? 'px-2 py-1.5 text-right num tabular-nums' - : typeof val === 'boolean' - ? 'px-2 py-1.5 text-right' - : 'px-2 py-1.5' - - return ( - - {renderExtValue(val, col, expanded, () => onToggleExpand(cellKey))} - - ) -} - -// ===== 搜索框组件(紧凑内联式)===== - -function StockSearchBox({ - onPreview, - existingSymbols, - onAdd, -}: { - onPreview: (symbol: string, name: string) => void - existingSymbols: string[] - onAdd: (symbol: string) => void -}) { - const [query, setQuery] = useState('') - const [open, setOpen] = useState(false) - const containerRef = useRef(null) - const inputRef = useRef(null) - const [activeIdx, setActiveIdx] = useState(-1) - - const search = useQuery({ - queryKey: QK.instrumentSearch(query), - queryFn: () => api.instrumentSearch(query), - enabled: query.trim().length > 0, - staleTime: 30_000, - }) - - const results = search.data?.results ?? [] - - useEffect(() => { - function handleClick(e: MouseEvent) { - if (containerRef.current && !containerRef.current.contains(e.target as Node)) { - setOpen(false) - } - } - document.addEventListener('mousedown', handleClick) - return () => document.removeEventListener('mousedown', handleClick) - }, []) - - function handleKeyDown(e: React.KeyboardEvent) { - if (e.key === 'Escape') { setOpen(false); return } - if (!open || results.length === 0) return - if (e.key === 'ArrowDown') { - e.preventDefault() - setActiveIdx(i => Math.min(i + 1, results.length - 1)) - } else if (e.key === 'ArrowUp') { - e.preventDefault() - setActiveIdx(i => Math.max(i - 1, -1)) - } else if (e.key === 'Enter') { - e.preventDefault() - if (activeIdx >= 0) handleSelect(results[activeIdx]) - else if (results.length > 0) handleSelect(results[0]) - } - } - - function handleSelect(r: { symbol: string; name: string }) { - onPreview(r.symbol, r.name) - setQuery('') - setOpen(false) - setActiveIdx(-1) - } - - return ( -
-
- - { setQuery(e.target.value); setOpen(true); setActiveIdx(-1) }} - onFocus={() => { if (query.trim()) setOpen(true) }} - onKeyDown={handleKeyDown} - className="w-44 h-8 pl-8 pr-2.5 rounded-btn bg-elevated border border-border text-xs text-foreground placeholder:text-muted focus:outline-none focus:border-accent/50 focus:w-56 transition-all duration-200" - /> -
- - - {open && results.length > 0 && ( - - {results.map((r, i) => { - const inWatchlist = existingSymbols.includes(r.symbol) - return ( -
- - -
- ) - })} -
- )} -
-
- ) -} - -// ===== 卡片组件 ===== - -function StockCard({ - r, - candleRows, - showCandle, - onPreview, - onConfirmRemove, - onCancelRemove, - onRequestRemove, - confirmRemove, - extCols, - expandedCells, - onToggleExpand, -}: { - r: any - candleRows: KlineRow[] - showCandle: boolean - onPreview: (symbol: string, name: string) => void - onConfirmRemove: (symbol: string) => void - onCancelRemove: () => void - onRequestRemove: (symbol: string) => void - confirmRemove: string | null - extCols: ColumnConfig[] - expandedCells: Set - onToggleExpand: (key: string) => void -}) { - const board = boardTag(r.symbol) - const price = r.rt_price ?? r.close - const pct = r.rt_pct ?? r.change_pct - const name = r.rt_name ?? r.name - const signals = getSignals(r) - const isUp = (pct ?? 0) > 0 - const isDown = (pct ?? 0) < 0 - - // 动态背景渐变: 涨=红底, 跌=绿底, 平=无色 - const bgGlow = isUp - ? 'bg-gradient-to-br from-bull/[0.06] via-transparent to-bull/[0.02]' - : isDown - ? 'bg-gradient-to-br from-bear/[0.06] via-transparent to-bear/[0.02]' - : '' - // 左侧指示条颜色 - const barColor = isUp ? 'bg-bull/70' : isDown ? 'bg-bear/70' : 'bg-muted/30' - // 涨跌幅标签背景 - const pctBg = isUp ? 'bg-bull/12 text-bull' : isDown ? 'bg-bear/12 text-bear' : 'bg-elevated text-secondary' - - return ( -
onPreview(r.symbol, name ?? '')} - > - {/* 左侧彩色指示条 */} -
- - {/* 删除按钮 / 确认区 */} -
- {confirmRemove === r.symbol ? ( -
e.stopPropagation()}> - - -
- ) : ( - - )} -
- - {/* 卡片内容 */} -
- {/* 第一行: 代码 + 名称 + 板块标识 */} -
- - {r.symbol} - - {name && ( - {name} - )} - {board && ( - - {board.label} - - )} - {r.consecutive_limit_ups > 0 && ( - - {r.consecutive_limit_ups === 1 ? '首板' : `${r.consecutive_limit_ups}连`} - - )} -
- - {/* 第二行: 大价格 + 涨跌幅胶囊 */} -
- - {fmtPrice(price)} - - {pct != null && ( - - {isUp ? '+' : ''}{pct.toFixed(2)}% - - )} -
- - {/* 第三行: 指标 */} -
- 换手{r.turnover_rate != null ? `${r.turnover_rate.toFixed(2)}%` : '—'} - 量比{fmtPrice(r.vol_ratio_5d)} - RSI{r.rsi_14 != null ? r.rsi_14.toFixed(1) : '—'} - {/* 扩展数据列展示在卡片中 */} - {extCols.map(col => { - if (col.source.type !== 'ext') return null - const { configId, fieldName } = col.source - const val = r[`${configId}__${fieldName}`] - if (val == null) return null - - const cellKey = `${r.symbol}::${col.id}` - const expanded = expandedCells.has(cellKey) - - return ( - - {fieldName} - - {renderExtValue(val, col, expanded, () => onToggleExpand(cellKey), true)} - - - ) - })} -
-
- - {/* 信号标签区 */} - {signals.length > 0 && ( -
- {signals.slice(0, 3).map(s => ( - - {s.label} - - ))} - {signals.length > 3 && ( - - +{signals.length - 3} - - )} -
- )} - - {/* 迷你蜡烛图 */} - {showCandle && candleRows.length > 0 && ( -
- -
- )} -
- ) -} - -// ===== 主页面 ===== - -export function Watchlist() { - const qc = useQueryClient() - const [viewMode, setViewMode] = useState<'table' | 'card'>(() => { - return (storage.watchlistView.get('table') as 'table' | 'card') - }) - const [dailyKChartVisible, setDailyKChartVisible] = useState(() => { - return storage.watchlistCandle.get(true) - }) - - // 列配置 — 从后端/localStorage 异步加载 - const [columns, setColumns] = useState([...BUILTIN_COLUMNS]) - const [customizerOpen, setCustomizerOpen] = useState(false) - const columnsLoaded = useRef(false) - - useEffect(() => { - if (columnsLoaded.current) return - columnsLoaded.current = true - loadColumnConfig().then(setColumns) - }, []) - - const handleColumnsChange = useCallback((next: ColumnConfig[]) => { - setColumns(next) - saveColumnConfig(next) - }, []) - - const candleColumn = useMemo(() => - columns.find(c => c.source.type === 'builtin' && c.source.key === 'candle' && c.visible), - [columns], - ) - const candleColumnEnabled = !!candleColumn - // 日k列渲染配置(来自列定制,已钳制边界) - const candleResolved = useMemo(() => resolveCandleConfig(candleColumn?.candleConfig), [candleColumn]) - const candleDays = candleResolved.days - const candleSize = dailyKChartVisible - ? { width: candleResolved.enabledWidth, height: candleResolved.enabledHeight } - : { width: candleResolved.disabledWidth, height: candleResolved.disabledHeight } - - const dailyKVisible = candleColumnEnabled && dailyKChartVisible - - // 计算可见列(列是否出现只由自定义列配置决定) - const visibleColumns = useMemo(() => { - return columns.filter(c => c.visible) - }, [columns]) - - // 计算 ext 列参数 - const extColumnsParam = useMemo(() => buildExtColumnsParam(columns), [columns]) - - const toggleView = useCallback(() => { - setViewMode(v => { - const next = v === 'table' ? 'card' : 'table' - storage.watchlistView.set(next) - return next - }) - }, []) - const toggleDailyKChart = useCallback(() => { - setDailyKChartVisible(v => { - const next = !v - storage.watchlistCandle.set(next) - return next - }) - }, []) - const [previewSymbol, setPreviewSymbol] = useState(null) - const [previewName, setPreviewName] = useState('') - const [expandedCells, setExpandedCells] = useState>(new Set()) - const closePreview = useCallback(() => { - setPreviewSymbol(null) - setPreviewName('') - }, []) - - const handleToggleExpand = useCallback((cellKey: string) => { - setExpandedCells(prev => { - const next = new Set(prev) - if (next.has(cellKey)) next.delete(cellKey) - else next.add(cellKey) - return next - }) - }, []) - - const list = useQuery({ - queryKey: QK.watchlist, - queryFn: api.watchlistList, - }) - - // enriched 数据 — 传入 ext_columns 参数 - const enriched = useQuery({ - queryKey: QK.watchlistEnriched(extColumnsParam), - queryFn: () => api.watchlistEnriched(extColumnsParam || undefined), - enabled: (list.data?.symbols.length ?? 0) > 0, - }) - - const symbols = enriched.data?.rows?.map((r: any) => r.symbol) ?? [] - const symbolsKey = symbols.join(',') - - // 批量日k数据 (天数由列配置决定) - const klineBatch = useQuery({ - queryKey: QK.watchlistKlineBatch(`${symbolsKey}|${candleDays}`), - queryFn: () => api.klineDailyBatch(symbols, candleDays), - enabled: dailyKVisible && symbols.length > 0, - staleTime: 5 * 60_000, // 5 分钟内不重请求 - }) - - const klineData = dailyKVisible ? (klineBatch.data?.data ?? {}) : {} - - const addMutation = useMutation({ - mutationFn: (sym: string) => api.watchlistAdd(sym), - onSuccess: (data) => { - qc.setQueryData(QK.watchlist, data) - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: ['watchlist-enriched'] }) - qc.invalidateQueries({ queryKey: ['watchlist-kline-batch'] }) - }, - }) - - const remove = useMutation({ - mutationFn: (sym: string) => api.watchlistRemove(sym), - onSuccess: (_data, sym) => { - // 1. 立即从 enriched 缓存中移除该股票,UI 即时更新 - qc.setQueryData(['watchlist-enriched', extColumnsParam], (old: any) => { - if (!old?.rows) return old - return { ...old, rows: old.rows.filter((r: any) => r.symbol !== sym) } - }) - // 2. 清除 list 缓存,触发后台 refetch - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) - qc.invalidateQueries({ queryKey: QK.watchlistKlineBatch('') }) - }, - }) - - const moveToTop = useMutation({ - mutationFn: (sym: string) => api.watchlistMoveToTop(sym), - onSuccess: (data) => { - qc.setQueryData(QK.watchlist, data) - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: ['watchlist-enriched'] }) - qc.invalidateQueries({ queryKey: ['watchlist-kline-batch'] }) - qc.invalidateQueries({ queryKey: QK.preferences }) - }, - }) - - const clearAll = useMutation({ - mutationFn: () => api.watchlistClear(), - onSuccess: () => { - setConfirmClear(false) - // 立即清空 enriched 缓存 - qc.setQueryData(['watchlist-enriched', extColumnsParam], { rows: [], as_of: null, elapsed_ms: 0 }) - qc.invalidateQueries({ queryKey: QK.watchlist }) - qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) - qc.invalidateQueries({ queryKey: QK.watchlistKlineBatch('') }) - }, - }) - - // 二次确认状态 - const [confirmClear, setConfirmClear] = useState(false) - const [confirmRemove, setConfirmRemove] = useState(null) - - const allSymbols = list.data?.symbols?.map(s => s.symbol) ?? [] - const rows = enriched.data?.rows ?? [] - - // ===== 筛选 ===== - const [filterOpen, setFilterOpen] = useState(false) - const [filters, setFilters] = useState>({}) - - // 板块筛选(持久化) - const [boardFilter, setBoardFilter] = useState>(() => { - const saved = storage.watchlistBoardFilter.get([]) - return saved.length > 0 ? new Set(saved) : new Set(BOARDS) // 默认全选 - }) - const persistBoardFilter = useCallback((next: Set) => { - setBoardFilter(next) - storage.watchlistBoardFilter.set([...next]) - }, []) - - const toggleBoard = useCallback((board: string) => { - setBoardFilter(prev => { - const next = new Set(prev) - if (next.has(board)) next.delete(board) - else next.add(board) - persistBoardFilter(next) - return next - }) - }, [persistBoardFilter]) - - const updateFilter = useCallback((colId: string, patch: { min?: string; max?: string; text?: string }) => { - setFilters(prev => { - const next = { ...prev } - const existing = next[colId] || {} - const merged = { ...existing, ...patch } - if (!merged.min && !merged.max && !merged.text) { - delete next[colId] - } else { - next[colId] = merged - } - return next - }) - }, []) - - const clearFilters = useCallback(() => setFilters({}), []) - - // 可筛选的内置列 - const filterableBuiltinCols = useMemo( - () => columns.filter(c => c.source.type === 'builtin' && !UNSORTABLE_KEYS.has(c.source.key) && c.id !== 'builtin:symbol'), - [columns], - ) - - // 按类别索引(复用列配置的分组定义) - const colsByCategory = useMemo(() => { - const map: Record = {} - for (const cat of COLUMN_GROUPS) { - map[cat.label] = [] - for (const key of cat.keys) { - const col = filterableBuiltinCols.find(c => c.source.type === 'builtin' && c.source.key === key) - if (col) map[cat.label].push({ id: col.id, label: col.label, col }) - } - } - return map - }, [filterableBuiltinCols]) - - // 筛选 + 排序 - const filteredRows = useMemo(() => { - // 板块筛选(全选时跳过) - let result = rows - if (boardFilter.size > 0 && boardFilter.size < BOARDS.length) { - result = result.filter(r => { - const board = getBoardType(r.symbol) - return board != null && boardFilter.has(board) - }) - } - // 数值/文本筛选 - const activeFilters = Object.entries(filters).filter(([, v]) => v.min || v.max || v.text) - if (activeFilters.length > 0) { - result = result.filter(r => { - for (const [colId, f] of activeFilters) { - const col = columns.find(c => c.id === colId) - if (!col) continue - const val = getSortValue(r, col) - if (val == null) return false - if (typeof val === 'number') { - if (f.min && val < Number(f.min)) return false - if (f.max && val > Number(f.max)) return false - } else { - if (f.text && !String(val).includes(f.text)) return false - } - } - return true - }) - } - return result - }, [rows, filters, columns, boardFilter]) - - const activeFilterCount = Object.values(filters).filter(v => v.min || v.max || v.text).length - - // 排序(复用共享三态排序 hook) - const { sort, toggle: handleSortToggle, sortRows } = useTableSort() - - const sortedRows = useMemo( - () => sortRows(filteredRows, columns), - [filteredRows, sortRows, columns], - ) - - // 可见的 ext 列(卡片视图使用) - const visibleExtCols = useMemo( - () => visibleColumns.filter(c => c.source.type === 'ext'), - [visibleColumns] - ) - - // 被过滤掉的个股数 (筛选/板块过滤导致的隐藏) - const hiddenCount = Math.max(0, allSymbols.length - sortedRows.length) - - return ( -
- - {/* 计数胶囊: 显示数/总数, mono 字体突出数字 */} - - {sortedRows.length} - / - {allSymbols.length} - - - {/* 过滤提示: 仅在有隐藏时出现, 柔和橙色融入整体 */} - {hiddenCount > 0 && ( - - - 已过滤 {hiddenCount} - - )} - - } - right={ -
- {/* 筛选 / 搜索 */} - - { setPreviewSymbol(sym); setPreviewName(name) }} - existingSymbols={allSymbols as string[]} - onAdd={(sym) => addMutation.mutate(sym)} - /> -
- {/* 视图 */} - -
- {/* 自定义列 / 刷新 */} - - - {allSymbols.length > 0 && ( - <> -
- - - )} -
- } - /> - - {/* 筛选栏 */} - {filterOpen && ( -
- {/* 板块筛选 */} -
-
板块
-
- {BOARDS.map(board => { - const active = boardFilter.has(board) - return ( - - ) - })} -
-
- {COLUMN_GROUPS.map(cat => { - const items = colsByCategory[cat.label]?.filter(i => i.col) - if (!items?.length) return null - return ( -
-
{cat.label}
-
- {items.map(item => { - const f = filters[item.id] || {} - const hasFilter = !!f.min || !!f.max || !!f.text - return ( -
- {item.label} - updateFilter(item.id, { min: e.target.value })} - placeholder="min" - className={`w-12 h-5 rounded border text-[10px] px-1 placeholder:text-muted focus:outline-none ${ - hasFilter ? 'border-accent/30 bg-accent/5' : 'border-border bg-elevated' - } text-foreground focus:border-accent/50`} - /> - ~ - updateFilter(item.id, { max: e.target.value })} - placeholder="max" - className={`w-12 h-5 rounded border text-[10px] px-1 placeholder:text-muted focus:outline-none ${ - hasFilter ? 'border-accent/30 bg-accent/5' : 'border-border bg-elevated' - } text-foreground focus:border-accent/50`} - /> -
- ) - })} -
-
- ) - })} - {activeFilterCount > 0 && ( - - )} -
- )} - - {/* 可滚动列表区 — 占满剩余高度,内部独立滚动,表头 sticky 固定 */} -
-
- {/* 列表 */} - {list.isLoading &&
加载中…
} - {list.isError &&
读取自选失败
} - - {allSymbols.length === 0 ? ( - - ) : viewMode === 'table' ? ( - r.symbol} - rowClassName={() => 'border-t border-border hover:bg-elevated/50 transition-colors duration-150 ease-smooth'} - // 日k列表头:标签 + 显示/隐藏眼睛按钮 - renderHeaderContent={(col) => { - if (col.source.type === 'builtin' && col.source.key === 'candle') { - return ( - - {col.label} - - - ) - } - return undefined - }} - renderCell={(r: any, col: ColumnConfig) => { - // ext 列 - if (col.source.type === 'ext') { - return renderExtCell(r, col, expandedCells, handleToggleExpand) - } - const key = col.source.key - const price = r.rt_price ?? r.close - const pct = r.rt_pct ?? r.change_pct - const name = r.rt_name ?? r.name - // 自选页 symbol 列:预览 + 内嵌删除(减号图标,二次确认) - if (key === 'symbol') { - const board = boardTag(r.symbol) - return ( - -
- - {/* 删除入口:默认减号图标,二次确认时替换为确定按钮 */} -
- {confirmRemove === r.symbol ? ( -
- - -
- ) : ( -
- - -
- )} -
-
- - ) - } - // 实时行情列:price/pct/amount 使用 rt_ 回退(自选页有实时推送) - const numCls = 'px-2 py-1.5 text-right num tabular-nums' - if (key === 'price') { - return {fmtPrice(price)} - } - if (key === 'pct') { - return {fmtPct(pct)} - } - if (key === 'amount') { - return {fmtBigNum(r.rt_amount ?? r.amount)} - } - if (key === 'turnover') { - return {r.turnover_rate != null ? `${r.turnover_rate.toFixed(2)}%` : '—'} - } - // 信号列 - if (key === 'signals') { - const signals = getSignals(r) - return ( - - {signals.length > 0 && ( -
- {signals.slice(0, 3).map((s) => ( - - {s.label} - - ))} - {signals.length > 3 && ( - +{signals.length - 3} - )} -
- )} - - ) - } - // 日k列 - if (key === 'candle') { - return ( - - - - ) - } - // 其余纯数据列 → 共享原语 - return renderBuiltinDataCell(r, col) - }} - className="rounded-card overflow-x-auto" - /> - ) : ( -
- {rows.map((r: any) => ( - { setPreviewSymbol(sym); setPreviewName(name) }} - onConfirmRemove={(sym) => { remove.mutate(sym); setConfirmRemove(null) }} - onCancelRemove={() => setConfirmRemove(null)} - onRequestRemove={(sym) => setConfirmRemove(sym)} - confirmRemove={confirmRemove} - extCols={visibleExtCols} - expandedCells={expandedCells} - onToggleExpand={handleToggleExpand} - /> - ))} -
- )} -
-
- - {/* 清空确认弹窗 */} - - {confirmClear && ( -
- setConfirmClear(false)} - /> - -

确认清空自选

-

- 将移除全部 {allSymbols.length} 只自选股,此操作不可恢复。 -

-
- - -
-
-
- )} -
- - {/* 列自定义侧栏 */} - setCustomizerOpen(false)} - /> - - -
- ) -} diff --git a/serve/frontend/src/pages/backtest/FactorBacktest.tsx b/serve/frontend/src/pages/backtest/FactorBacktest.tsx deleted file mode 100644 index 3c44771..0000000 --- a/serve/frontend/src/pages/backtest/FactorBacktest.tsx +++ /dev/null @@ -1,447 +0,0 @@ -import { useState, useMemo } from 'react' -import { useQuery, useMutation } from '@tanstack/react-query' -import { motion } from 'framer-motion' -import { Play, BarChart3, Clock } from 'lucide-react' -import { api, type FactorColumn, type FactorBacktestResult, type GroupStat } from '@/lib/api' -import { fmtPct, priceColorClass } from '@/lib/format' -import { EmptyState } from '@/components/EmptyState' -import { DatePicker } from '@/components/DatePicker' -import { FactorICChart } from './charts/FactorICChart' -import { FactorGroupNavChart } from './charts/FactorGroupNavChart' - -const formatDate = (date: Date) => date.toISOString().slice(0, 10) -const monthsAgo = (months: number) => { - const date = new Date() - date.setMonth(date.getMonth() - months) - return formatDate(date) -} -const TODAY = formatDate(new Date()) -const THREE_MONTHS_AGO = monthsAgo(3) - -const INPUT_CLS = `w-full px-2.5 py-1.5 rounded-input bg-surface border border-border text-xs - focus:outline-none focus:border-accent transition-colors duration-150 ease-smooth` - -function StatCard({ label, value, highlight }: { - label: string - value: string | null | undefined - highlight?: 'bull' | 'bear' | 'neutral' -}) { - const colorCls = highlight === 'bull' - ? 'text-bull' : highlight === 'bear' ? 'text-bear' : '' - return ( -
-
{label}
-
- {value ?? '—'} -
-
- ) -} - -function LoadingPanel({ symbolsText }: { symbolsText: string }) { - return ( -
-
-
-
-
正在计算因子分析
-
{symbolsText} · 完成后会一次性刷新 IC、分层收益和净值曲线。
-
-
-
-
-
-
-
- -
- {['读取因子', '计算 IC', '分层回测', '汇总指标'].map(item => ( -
-
-
{item}
-
- ))} -
- -
-
-
分层净值预览
-
等待后端返回完整结果
-
-
-
- {[46, 38, 54, 50, 64, 58, 74, 68, 84, 78, 90, 86].map((h, i) => ( -
- ))} -
-
-
-
- ) -} - -export function FactorBacktest() { - const [factorName, setFactorName] = useState('momentum_20d') - const [symbols, setSymbols] = useState('') - const [start, setStart] = useState(THREE_MONTHS_AGO) - const [end, setEnd] = useState(TODAY) - const [nGroups, setNGroups] = useState(5) - const [weight, setWeight] = useState<'equal' | 'factor_weight'>('equal') - const [fees, setFees] = useState('2') - const [result, setResult] = useState(null) - - const columns = useQuery({ - queryKey: ['backtest-factor-columns'], - queryFn: api.factorColumns, - }) - - // 按 group 分类的因子 - const factorGroups = useMemo(() => { - const cols = columns.data?.columns ?? [] - const groups: Record = {} - for (const c of cols) { - ;(groups[c.group] ??= []).push(c) - } - return groups - }, [columns.data]) - - // 当前因子描述 - const factorDesc = useMemo(() => { - return columns.data?.columns.find(c => c.id === factorName)?.desc ?? '' - }, [columns.data, factorName]) - - const run = useMutation({ - mutationFn: () => - api.factorRun({ - factor_name: factorName, - symbols: symbols ? symbols.split(',').map(s => s.trim()).filter(Boolean) : null, - start: start || null, - end: end || undefined, - n_groups: nGroups, - rebalance: 'daily', - weight, - fees_pct: Number(fees) / 10000, - }), - onSuccess: (data) => { - if (data.error) { - setResult(data) - } else { - setResult(data) - } - }, - }) - - const applyRange = (months: number) => { - setStart(monthsAgo(months)) - setEnd(formatDate(new Date())) - } - - const applyAllRange = () => { - setStart('') - setEnd(formatDate(new Date())) - } - - const rangeKey = end === TODAY && start === THREE_MONTHS_AGO - ? '3m' - : end === TODAY && start === monthsAgo(6) - ? '6m' - : end === TODAY && start === monthsAgo(12) - ? '1y' - : end === TODAY && start === '' - ? 'all' - : 'custom' - const rangeTitle = rangeKey === '3m' - ? '近 3 个月' - : rangeKey === '6m' - ? '近 6 个月' - : rangeKey === '1y' - ? '近 1 年' - : rangeKey === 'all' - ? '全部历史' - : '自定义区间' - const rangeButtonCls = (key: string) => `rounded-btn px-2 py-1 text-[11px] font-medium transition-colors ${rangeKey === key - ? 'bg-accent/15 text-accent' - : 'text-muted hover:bg-elevated/70 hover:text-secondary' - }` - - return ( -
- {/* 配置面板 */} -
-
-
因子配置
-
选择因子、区间和分组方式。默认最近 3 个月。
-
- -
- - - {factorDesc && ( -

{factorDesc}

- )} -
- -
- - setSymbols(e.target.value)} - placeholder="留空则使用全市场,建议最近3个月" - className={`w-full px-2.5 py-1.5 rounded-input bg-surface border border-border text-xs font-mono - focus:outline-none focus:border-accent transition-colors duration-150 ease-smooth`} - /> -
- -
-
-
回测区间
- - {rangeTitle} - -
- -
-
- - -
-
- - -
-
- -
- - - - -
-
- -
-
- - -
-
- - -
-
- - setFees(e.target.value)} - className={INPUT_CLS} /> -
-
- - -
- - {/* 结果面板 */} -
- {result?.error && !result.ic_mean && ( -
- {result.error} -
- )} - - {run.isError && ( -
- {String((run.error as any).message)} -
- )} - - {!result && !run.isPending && ( - - )} - - {run.isPending && result && ( -
- 正在重新计算,当前暂时展示上一次因子分析结果,完成后会自动替换。 -
- )} - - {run.isPending && !result && ( - - )} - - {result && result.ic_mean != null && ( - - {/* IC/IR 指标 */} -
-
-

因子预测能力

-
- - Rank IC · 日度调仓 - - {result.elapsed_ms > 0 && ( - - - {result.elapsed_ms.toFixed(0)} ms - - )} -
-
-
- 0.03 ? 'bull' : result.ic_mean < -0.03 ? 'bear' : 'neutral' - : undefined} - /> - - 0.5 ? (result.ir > 0 ? 'bull' : 'bear') : 'neutral' - : undefined} - /> - -
-
- - {/* IC 时序图 */} - {result.ic_series.length > 0 && ( -
-
- IC 时序 -
-
- -
-
- )} - - {/* 分层净值 */} - {result.group_nav.length > 0 && ( -
-
- 分层净值曲线 -
-
- -
-
- )} - - {/* 分层统计表 */} - {result.group_stats.length > 0 && ( -
- - - - - - - - - - - - - {result.group_stats.map((g: GroupStat) => ( - - - - - - - - - ))} - {/* 多空行 */} - {result.long_short_stats?.total_return != null && ( - - - - - - - - - )} - -
分组总收益年化最大回撤夏普胜率
{g.label} - {fmtPct(g.total_return)} - - {fmtPct(g.annual_return)} - {fmtPct(g.max_drawdown)}{g.sharpe?.toFixed(2)}{fmtPct(g.win_rate)}
- 多空({result.long_short_stats.top_group ?? ''}-{result.long_short_stats.bottom_group ?? ''}) - - {fmtPct(result.long_short_stats.total_return as number)} - - {fmtPct(result.long_short_stats.max_drawdown as number)} -
-
- )} - - {/* 数据概要 */} -
- {result.n_symbols} 只标的 - {result.n_dates} 个交易日 - run_id: {result.run_id} -
-
- )} -
-
- ) -} diff --git a/serve/frontend/src/pages/backtest/StrategyBacktest.tsx b/serve/frontend/src/pages/backtest/StrategyBacktest.tsx deleted file mode 100644 index bc951c5..0000000 --- a/serve/frontend/src/pages/backtest/StrategyBacktest.tsx +++ /dev/null @@ -1,2268 +0,0 @@ -import { useState, useMemo, useEffect, useRef, type ReactNode } from 'react' -import { useQuery } from '@tanstack/react-query' -import { motion } from 'framer-motion' -import { Play, FlaskConical, Clock, Loader2, Square, Search, Plus, X, SlidersHorizontal, BarChart3, Gauge, Zap, ListPlus } from 'lucide-react' -import { - api, - type StrategyBacktestResult, - type StrategyBacktestTrade, - type StrategyDetail, - type StrategyParamDef, -} from '@/lib/api' -import { QK } from '@/lib/queryKeys' -import { tierRank } from '@/lib/capability-labels' -import { storage } from '@/lib/storage' -import { fmtPct, fmtPrice, priceColorClass } from '@/lib/format' -import { boardTag } from '@/lib/board' -import { BUILTIN_COLUMNS } from '@/lib/watchlist-columns' -import { SignalPicker } from '@/components/screener/SignalPicker' -import { startBacktest, stopBacktest, tryReconnect, useBacktestTask } from '@/lib/backtestTask' -import { useDataStatus, useCapabilities } from '@/lib/useSharedQueries' -import { EmptyState } from '@/components/EmptyState' -import { WarmupBadge } from '@/components/WarmupBadge' -import { DatePicker } from '@/components/DatePicker' -import { StrategyNavChart } from './charts/StrategyNavChart' -import { ReturnDistributionChart } from './charts/ReturnDistributionChart' -import { TradeKlineModal } from './components/TradeKlineModal' -import { SignalTriggerActions } from '@/components/signals/SignalTriggerActions' - -const formatDate = (date: Date) => date.toISOString().slice(0, 10) -const monthsAgo = (months: number) => { - const date = new Date() - date.setMonth(date.getMonth() - months) - return formatDate(date) -} -const TODAY = formatDate(new Date()) -const THREE_MONTHS_AGO = monthsAgo(3) - -type QuickRangeUnit = 'month' | 'year' | 'all' -type QuickRangeConfig = { id: string; enabled: boolean; unit: QuickRangeUnit; value: number } - -const QUICK_RANGE_LIMITS = { - month: { min: 1, max: 120 }, - year: { min: 1, max: 10 }, -} as const -const DEFAULT_QUICK_RANGES: QuickRangeConfig[] = [ - { id: 'range-1', enabled: true, unit: 'month', value: 3 }, - { id: 'range-2', enabled: true, unit: 'month', value: 6 }, - { id: 'range-3', enabled: true, unit: 'year', value: 1 }, - { id: 'range-4', enabled: true, unit: 'all', value: 0 }, -] -const quickRangeValue = (unit: QuickRangeUnit, value: unknown, fallback: number) => { - if (unit === 'all') return 0 - const limits = QUICK_RANGE_LIMITS[unit] - const num = Number(value) - const safe = Number.isFinite(num) ? Math.round(num) : fallback - return clamp(safe, limits.min, limits.max) -} -const normalizeQuickRange = (raw: unknown, fallback: QuickRangeConfig): QuickRangeConfig => { - const obj = raw && typeof raw === 'object' ? raw as Partial : {} - const unit: QuickRangeUnit = obj.unit === 'month' || obj.unit === 'year' || obj.unit === 'all' - ? obj.unit - : fallback.unit - const enabled = typeof obj.enabled === 'boolean' ? obj.enabled : fallback.enabled - return { id: fallback.id, enabled, unit, value: quickRangeValue(unit, obj.value, fallback.value) } -} -const normalizeQuickRanges = (raw: unknown) => { - const items = Array.isArray(raw) ? raw : [] - const ranges = DEFAULT_QUICK_RANGES.map((fallback, index) => { - const byId = items.find(item => item && typeof item === 'object' && (item as { id?: unknown }).id === fallback.id) - return normalizeQuickRange(byId ?? items[index], fallback) - }) - return ranges.some(range => range.enabled) - ? ranges - : ranges.map((range, index) => index === 0 ? { ...range, enabled: true } : range) -} -const loadQuickRanges = () => normalizeQuickRanges(storage.strategyBacktestQuickRanges.get(DEFAULT_QUICK_RANGES)) -const quickRangeMonths = (range: QuickRangeConfig) => range.unit === 'year' ? range.value * 12 : range.value -const quickRangeLabel = (range: QuickRangeConfig) => range.unit === 'all' - ? '全部' - : range.unit === 'year' - ? `${range.value}年` - : `${range.value}个月` -const quickRangeTitle = (range: QuickRangeConfig) => range.unit === 'all' - ? '全部历史' - : range.unit === 'year' - ? `近 ${range.value} 年` - : `近 ${range.value} 个月` - -const INPUT_CLS = `w-full px-2.5 py-1.5 rounded-input bg-surface border border-border text-xs - focus:outline-none focus:border-accent transition-colors duration-150 ease-smooth` - -const SRC_MAP: Record = { builtin: '内置', custom: '自定义', ai: 'AI' } -const TRADE_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100] -const BADGE_CLS_MAP: Record = { - builtin: 'bg-secondary/10 text-muted border-border', - ai: 'bg-purple-500/10 text-purple-400 border-purple-500/30', - custom: 'bg-amber-400/10 text-amber-400 border-amber-400/30', -} -const FIELD_LABEL: Record = {} -for (const c of BUILTIN_COLUMNS) { - if (c.source.type === 'builtin') FIELD_LABEL[c.source.key] = c.label -} -Object.assign(FIELD_LABEL, { - change_pct: '涨跌幅', consecutive_limit_ups: '连板', - momentum_60d: '60D动量', turnover_rate: '换手率', - rsi_14: 'RSI14', rsi_6: 'RSI6', rsi_24: 'RSI24', - vol_ratio_5d: '量比', vol_ratio_20d: '20日量比', - macd_dif: 'MACD-DIF', macd_dea: 'MACD-DEA', macd_hist: 'MACD柱', - boll_upper: '布林上轨', boll_lower: '布林下轨', -}) -const BOARD_OPTIONS = ['沪主板', '深主板', '创业板', '科创板', '北交所'] -const BASIC_FILTER_FIELDS = [ - { key: 'price_min', label: '最低价', unit: '元' }, - { key: 'price_max', label: '最高价', unit: '元' }, - { key: 'amount_min', label: '最低成交额', unit: '亿', scale: 1e8 }, - { key: 'market_cap_min', label: '最低总市值', unit: '亿', scale: 1e8 }, - { key: 'turnover_min', label: '最低换手率', unit: '%' }, - { key: 'turnover_max', label: '最高换手率', unit: '%' }, -] -type AdvancedSettingsTab = 'params' | 'filter' | 'entry' | 'exit' | 'scoring' | 'risk' | 'range' -type StrategyGroup = 'all' | 'custom' | 'ai' | 'builtin' -const STRATEGY_GROUPS: { id: StrategyGroup; label: string }[] = [ - { id: 'all', label: '全部' }, - { id: 'custom', label: '自定义' }, - { id: 'ai', label: 'AI' }, - { id: 'builtin', label: '内置' }, -] -const ADVANCED_TABS: { id: AdvancedSettingsTab; label: string }[] = [ - { id: 'params', label: '策略参数' }, - { id: 'filter', label: '基础过滤' }, - { id: 'entry', label: '买入触发器' }, - { id: 'exit', label: '卖出触发器' }, - { id: 'scoring', label: '评分权重' }, - { id: 'risk', label: '风控' }, - { id: 'range', label: '回测范围' }, -] -const toSignalId = (sig: string) => (sig.startsWith('signal_') || sig.startsWith('csg_')) ? sig : `signal_${sig}` -const numOrNull = (v: string) => v === '' || Number.isNaN(Number(v)) ? null : Number(v) -const clamp = (v: number, min?: number, max?: number) => { - let next = v - if (min != null) next = Math.max(next, min) - if (max != null) next = Math.min(next, max) - return next -} -const strategyDefaultParams = (detail: StrategyDetail) => { - const values: Record = { ...detail.params_defaults } - detail.params.forEach(p => { - if (!(p.id in values)) values[p.id] = p.default - }) - return values -} -const buildDefaultOverrides = (detail: StrategyDetail) => ({ - basic_filter: { ...detail.basic_filter }, - entry_signals: detail.entry_signals.map(toSignalId), - exit_signals: detail.exit_signals.map(toSignalId), - scoring: { ...detail.scoring }, - stop_loss: detail.stop_loss, - take_profit: detail.take_profit, - trailing_stop: detail.trailing_stop, - trailing_take_profit_activate: detail.trailing_take_profit_activate, - trailing_take_profit_drawdown: detail.trailing_take_profit_drawdown, - score_min: null, - score_max: null, - max_hold_days: detail.max_hold_days, -}) - -const fmtMoney = (v: number | null | undefined) => { - if (v == null || Number.isNaN(v)) return '—' - return v.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) -} - -const fmtSignedMoney = (v: number | null | undefined) => { - if (v == null || Number.isNaN(v)) return '—' - const sign = v > 0 ? '+' : '' - return `${sign}${fmtMoney(v)}` -} - -const fmtShares = (v: number | null | undefined) => { - if (v == null || Number.isNaN(v)) return '—' - return v.toLocaleString('zh-CN', { maximumFractionDigits: 0 }) -} - -const fmtLots = (v: number | null | undefined) => { - if (v == null || Number.isNaN(v)) return '—' - return v.toLocaleString('zh-CN', { maximumFractionDigits: 2 }) -} - -const statValueColor = (v: number | null | undefined) => { - if (v == null || Number.isNaN(v) || v === 0) return '#f8fafc' - return v > 0 ? '#f87171' : '#34d399' -} - -function ExitReasonBadge({ reason }: { reason: string }) { - const config: Record = { - signal: { label: '信号', cls: 'bg-accent/10 text-accent border-accent/30' }, - stop_loss: { label: '止损', cls: 'bg-red-500/10 text-red-400 border-red-500/30' }, - take_profit: { label: '止盈', cls: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/30' }, - trailing_stop: { label: '移损', cls: 'bg-orange-500/10 text-orange-400 border-orange-500/30' }, - trailing_take_profit: { label: '回撤止盈', cls: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/30' }, - max_hold: { label: '超期', cls: 'bg-amber-400/10 text-amber-400 border-amber-400/30' }, - pending_exit: { label: '待卖', cls: 'bg-orange-400/10 text-orange-400 border-orange-400/30' }, - end: { label: '期末', cls: 'bg-secondary/10 text-secondary border-border' }, - } - const c = config[reason] ?? { label: reason, cls: 'bg-elevated text-muted border-border' } - return ( - {c.label} - ) -} - -type DailyTradeRow = { - date: string - buys: StrategyBacktestTrade[] - sells: StrategyBacktestTrade[] - buyValue: number - sellValue: number - realizedPnl: number - cumulativePnl: number -} - -function fmtPositionPct(v: number | null | undefined, digits = 2): string { - if (v == null || Number.isNaN(v)) return '—' - return `${(Math.abs(v) * 100).toFixed(digits)}%` -} - -function fmtScore(v: number | null | undefined): string { - if (v == null || Number.isNaN(Number(v))) return '—' - return Number(v).toFixed(1) -} - -function DailyTradeChip({ trade, side, strategyName, onClick }: { trade: StrategyBacktestTrade; side: 'buy' | 'sell'; strategyName?: string; onClick?: () => void }) { - const isBuy = side === 'buy' - const tag = boardTag(trade.symbol) - const price = isBuy ? trade.entry_price : trade.exit_price - const amount = isBuy ? trade.entry_value : trade.exit_value - const pnlColor = priceColorClass(trade.pnl_amount ?? trade.pnl_pct) - const footerColor = isBuy ? 'text-secondary' : pnlColor - const footerText = `仓位 ${fmtPositionPct(trade.position_pct, 2)}` - const scoreText = fmtScore(trade.entry_score) - const buyStrategy = strategyName || '策略' - - return ( - - ) -} - -function TradeLegCell({ trade, side }: { trade: StrategyBacktestTrade; side: 'buy' | 'sell' }) { - const isBuy = side === 'buy' - const date = String(isBuy ? trade.entry_date : trade.exit_date).slice(0, 10) - const signalDate = String(isBuy ? trade.entry_signal_date ?? '' : trade.exit_signal_date ?? '').slice(0, 10) - const price = isBuy ? trade.entry_price : trade.exit_price - const amount = isBuy ? trade.entry_value : trade.exit_value - - return ( -
-
- {date} - - {isBuy ? '买' : '卖'} - -
-
- {fmtPrice(price)} - {fmtMoney(amount)} -
- {signalDate && signalDate !== date && ( -
信号 {signalDate}
- )} -
- ) -} - -function fmtDuration(ms: number): string { - const s = ms / 1000 - if (s < 1) return `${ms.toFixed(0)}ms` - if (s < 60) return `${s.toFixed(1)}秒` - const m = Math.floor(s / 60) - const rest = Math.round(s % 60) - return `${m}分${rest}秒` -} - -function SharpeLabel() { - const [open, setOpen] = useState(false) - const [alignRight, setAlignRight] = useState(false) - const ref = useRef(null) - useEffect(() => { - if (!open) return - const onClick = (e: MouseEvent) => { - if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) - } - document.addEventListener('mousedown', onClick) - return () => document.removeEventListener('mousedown', onClick) - }, [open]) - const toggle = () => { - if (!open && ref.current) { - const rect = ref.current.getBoundingClientRect() - setAlignRight(rect.left + 240 > window.innerWidth) - } - setOpen(o => !o) - } - return ( - - 夏普 - - {open && ( - - 夏普比率 (Sharpe Ratio) - 衡量单位波动风险换来的超额收益。 - 数值越高,收益相对波动越优秀; - 短周期或交易次数少时容易偏高,仅供参考。 - - )} - - ) -} - -function Stat({ label, value, color }: { label: ReactNode; value: string; color?: string }) { - return ( -
-
{label}
-
- {value} -
-
- ) -} - -function ConfigSection({ title, hint, actions, children }: { title: string; hint?: ReactNode; actions?: ReactNode; children: ReactNode }) { - return ( -
-
-
- {title} - {hint && {hint}} -
- {actions &&
{actions}
} -
-
{children}
-
- ) -} - - -const scoringToPct = (values: Record) => { - const total = Object.values(values).reduce((a, b) => a + Math.max(0, Number(b) || 0), 0) - if (total <= 0) return Object.fromEntries(Object.keys(values).map(k => [k, 0])) as Record - return Object.fromEntries(Object.entries(values).map(([k, v]) => [k, Math.round((Math.max(0, Number(v) || 0) / total) * 100)])) as Record -} - -const normalizePctWeights = (values: Record) => { - const total = Object.values(values).reduce((a, b) => a + Math.max(0, Number(b) || 0), 0) - if (total <= 0) return Object.fromEntries(Object.keys(values).map(k => [k, 0])) as Record - return Object.fromEntries(Object.entries(values).map(([k, v]) => [k, +(Math.max(0, Number(v) || 0) / total).toFixed(4)])) as Record -} - -function ScoringWeightRow({ name, weight, pct, editing, onChange }: { - name: string - weight: number - pct: number - editing: boolean - onChange: (value: number) => void -}) { - const label = FIELD_LABEL[name] ?? name - return ( -
- {label} - {editing ? ( - onChange(Number(e.target.value))} - className="h-1 flex-1 cursor-pointer accent-amber-400" - /> - ) : ( -
-
-
- )} - {editing ? weight : `${pct}%`} -
- ) -} - -function StrategyParamInput({ param, value, onChange }: { - param: StrategyParamDef - value: any - onChange: (value: any) => void -}) { - if (param.type === 'bool') { - const checked = value === true || value === 'true' || value === 'True' || value === true - return ( - - ) - } - if (param.type === 'select') { - return ( - - ) - } - return ( - - ) -} - -function StockPoolPicker({ value, onChange }: { value: string; onChange: (value: string) => void }) { - const symbols = useMemo(() => value.split(',').map(s => s.trim()).filter(Boolean), [value]) - const [query, setQuery] = useState('') - const [open, setOpen] = useState(false) - const [symbolNames, setSymbolNames] = useState>({}) - const ref = useRef(null) - const search = useQuery({ - queryKey: QK.instrumentSearch(query), - queryFn: () => api.instrumentSearch(query), - enabled: query.trim().length > 0, - staleTime: 30_000, - }) - const results = search.data?.results ?? [] - // 自选列表 — 供「从自选导入」一键填入回测范围 - const watchlist = useQuery({ - queryKey: QK.watchlist, - queryFn: () => api.watchlistList(), - staleTime: 30_000, - }) - - useEffect(() => { - if (results.length === 0) return - setSymbolNames(prev => { - const next = { ...prev } - results.forEach(r => { - if (r.name) next[r.symbol] = r.name - }) - return next - }) - }, [results]) - - useEffect(() => { - const onClick = (e: MouseEvent) => { - if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) - } - document.addEventListener('mousedown', onClick) - return () => document.removeEventListener('mousedown', onClick) - }, []) - - const setSymbols = (next: string[]) => onChange(Array.from(new Set(next)).join(',')) - const addSymbol = (symbol: string, name?: string | null) => { - if (name) setSymbolNames(prev => ({ ...prev, [symbol]: name })) - setSymbols([...symbols, symbol]) - setQuery('') - setOpen(false) - } - const removeSymbol = (symbol: string) => setSymbols(symbols.filter(s => s !== symbol)) - // 一键导入自选: 合并去重, 顺带回填股票名 - const importFromWatchlist = () => { - const entries = watchlist.data?.symbols ?? [] - if (entries.length === 0) return - setSymbolNames(prev => { - const next = { ...prev } - entries.forEach(e => { if (e.name) next[e.symbol] = e.name }) - return next - }) - setSymbols([...symbols, ...entries.map(e => e.symbol)]) - } - const watchlistCount = watchlist.data?.symbols?.length ?? 0 - - return ( -
-
-
- - { setQuery(e.target.value); setOpen(true) }} - onFocus={() => { if (query.trim()) setOpen(true) }} - placeholder="搜索股票名称/代码添加股票池" - className="w-full rounded-input border border-border bg-surface py-1.5 pl-8 pr-2.5 text-xs focus:border-accent focus:outline-none" - /> - {open && results.length > 0 && ( -
- {results.map(r => { - const added = symbols.includes(r.symbol) - return ( - - ) - })} -
- )} -
- {/* 操作按钮 — 紧贴输入框右侧 */} -
- {/* 当前范围 — 有范围显示个数, 无范围显示全市场 */} - - {symbols.length === 0 ? '全市场' : `共 ${symbols.length} 只`} - - - -
-
-
- {symbols.length === 0 ? ( - 默认全市场回测,由基础过滤和策略条件筛选。 - ) : symbols.map(symbol => { - const name = symbolNames[symbol] - return ( - - {symbol} - {name && {name}} - - - ) - })} -
-
- ) -} - -export function StrategyBacktest() { - const [saved] = useState(() => storage.strategyBacktestLast.get(null)) - const [selectedStrategy, setSelectedStrategy] = useState(saved?.selectedStrategy ?? null) - const [strategyGroup, setStrategyGroup] = useState('all') - const [symbols, setSymbols] = useState(saved?.symbols ?? '') - const [start, setStart] = useState(saved?.start ?? THREE_MONTHS_AGO) - const [end, setEnd] = useState(saved?.end ?? TODAY) - // 成交口径: 建仓/清仓可独立配置。向后兼容老 matching (派生为 entry=exit=matching)。 - const [matching] = useState<'close_t' | 'open_t+1'>(saved?.matching ?? 'open_t+1') - const [entryFill, setEntryFill] = useState<'close_t' | 'open_t+1'>(saved?.entryFill ?? saved?.matching ?? 'open_t+1') - const [exitFill, setExitFill] = useState<'close_t' | 'open_t+1'>(saved?.exitFill ?? saved?.matching ?? 'close_t') - const [fees, setFees] = useState(saved?.fees ?? '2') - const [slippage, setSlippage] = useState(saved?.slippage ?? '5') - const [maxPositions, setMaxPositions] = useState(saved?.maxPositions ?? '10') - const [maxExposure, setMaxExposure] = useState(saved?.maxExposure ?? '100') - const [initialCapital, setInitialCapital] = useState(saved?.initialCapital ?? '1000000') - const [positionSizing, setPositionSizing] = useState<'equal' | 'score_weight'>(saved?.positionSizing ?? 'equal') - const [simMode, setSimMode] = useState<'position' | 'full'>(saved?.mode ?? 'position') - const [holdingDays, setHoldingDays] = useState(saved?.holdingDays ?? '5') - const [settingsOpen, setSettingsOpen] = useState(false) - // 高颗粒回测(分钟K精确回测)— 开发中,Starter+ 功能 - const [highGranularity, setHighGranularity] = useState(false) - const { data: caps } = useCapabilities() - const isFreeTier = tierRank(caps?.label ?? '') < 1 - const [rangeSettingsOpen, setRangeSettingsOpen] = useState(false) - const [quickRanges, setQuickRanges] = useState(loadQuickRanges) - const [settingsTab, setSettingsTab] = useState('params') - const [editingScoring, setEditingScoring] = useState(false) - const [scoringDraft, setScoringDraft] = useState>({}) - const [strategyParams, setStrategyParams] = useState>(saved?.params ?? {}) - const [overrides, setOverrides] = useState>(saved?.overrides ?? {}) - // result 不从 localStorage 恢复:它是运行产物(净值/交易),大且易过时, - // 跨会话/拉新代码后自动渲染一个可能对应已失效策略的旧结果会造成困惑 - // (切页不卸载组件,内存中的 result 仍保留,无需靠 localStorage 恢复)。 - const [result, setResult] = useState(null) - const [resultTab, setResultTab] = useState<'daily' | 'trades' | 'picks'>('daily') - const [dailyPage, setDailyPage] = useState(0) - const [tradePage, setTradePage] = useState(0) - const [tradePageSize, setTradePageSize] = useState(10) - const [selectedTrade, setSelectedTrade] = useState(null) - const loadedStrategyRef = useRef(null) - - const strategies = useQuery({ - queryKey: QK.screenerStrategies, - queryFn: api.screenerStrategies, - }) - - const strategyList = useMemo(() => strategies.data?.presets ?? [], [strategies.data]) - const filteredStrategyList = useMemo(() => ( - strategyGroup === 'all' ? strategyList : strategyList.filter(st => st.source === strategyGroup) - ), [strategyGroup, strategyList]) - - // 校验 localStorage 里保存的上次选中策略是否仍存在(本地开发残留的自定义策略 - // 拉新代码后会失效,导致 strategyGet 一直 404/加载中)。列表就绪后若失效, - // 连带清除其专属的 params/overrides/result(这些是该策略的运行配置/产物, - // 策略失效后留着会造成"孤儿"状态:界面显示旧回测结果却无对应策略)。 - useEffect(() => { - if (strategies.isLoading || strategyList.length === 0) return - if (selectedStrategy && !strategyList.some(st => st.id === selectedStrategy)) { - setSelectedStrategy(null) - setStrategyParams({}) - setOverrides({}) - setResult(null) - } - }, [strategies.isLoading, strategyList, selectedStrategy]) - - const strategyDetail = useQuery({ - queryKey: ['strategy-detail', selectedStrategy], - queryFn: () => api.strategyGet(selectedStrategy!), - enabled: !!selectedStrategy, - }) - - const backtestTask = useBacktestTask() - const isPending = backtestTask?.isPending ?? false - - const dataStatus = useDataStatus() - const earliestDate = dataStatus.data?.daily?.earliest_date ?? null - - const resetConfigFromDetail = (detail: StrategyDetail) => { - setStrategyParams(strategyDefaultParams(detail)) - setOverrides(buildDefaultOverrides(detail)) - } - - // 刷新页面后: 从 localStorage 恢复未完成的回测任务 - useEffect(() => { - tryReconnect() - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - useEffect(() => { - const detail = strategyDetail.data - if (!detail || loadedStrategyRef.current === detail.id) return - loadedStrategyRef.current = detail.id - if (saved?.selectedStrategy === detail.id && (saved.params || saved.overrides)) { - setStrategyParams(saved.params ?? strategyDefaultParams(detail)) - setOverrides(saved.overrides ?? buildDefaultOverrides(detail)) - return - } - resetConfigFromDetail(detail) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [strategyDetail.data]) - - // 当全局回测任务完成时, 把结果写入组件 (切页回来也能恢复) - useEffect(() => { - if (backtestTask && !backtestTask.isPending && backtestTask.result) { - setResult(backtestTask.result) - setResultTab('daily') - setDailyPage(0) - setTradePage(0) - storage.strategyBacktestLast.set({ - selectedStrategy, - symbols, - start, - end, - matching, - entryFill, - exitFill, - fees, - slippage, - maxPositions, - maxExposure, - initialCapital, - positionSizing, - mode: simMode, - holdingDays, - params: strategyParams, - overrides, - result: backtestTask.result, - }) - } - }, [backtestTask]) - - const handleRun = () => { - if (!selectedStrategy) return - startBacktest({ - strategy_id: selectedStrategy, - symbols: symbols ? symbols.split(',').map(s => s.trim()).filter(Boolean) : null, - start: start || null, - end: end || undefined, - matching, - entry_fill: entryFill, - exit_fill: exitFill, - fees_pct: Number(fees) / 10000, - slippage_bps: Number(slippage), - max_positions: Number(maxPositions), - max_exposure_pct: Number(maxExposure) / 100, - initial_capital: Number(initialCapital), - position_sizing: positionSizing, - params: strategyParams, - overrides, - mode: simMode, - holding_days: Number(holdingDays) || 5, - }) - } - - // 提取统计 - const s = result?.stats - const pick = (...keys: string[]) => { - for (const k of keys) { - if (s && k in s && s[k] != null) return s[k] - } - return null - } - - const benchmarkReturn = useMemo(() => { - const values = (result?.benchmark_curve ?? []) - .map(r => Number(r.close ?? r.value)) - .filter(v => Number.isFinite(v) && v > 0) - if (values.length < 2) return null - return values[values.length - 1] / values[0] - 1 - }, [result?.benchmark_curve]) - - const strategyReturn = pick('total_return') as number | null - const excessReturn = strategyReturn != null && benchmarkReturn != null - ? strategyReturn - benchmarkReturn - : null - - const applyRange = (months: number) => { - setStart(monthsAgo(months)) - setEnd(formatDate(new Date())) - } - - const applyAllRange = () => { - setStart(earliestDate ?? '') - setEnd(formatDate(new Date())) - } - - // 进入页面/还在加载时就点了"全部": earliestDate 就绪后回填, 让 DatePicker 显示真实起始日 - useEffect(() => { - if (earliestDate && start === '' && end === TODAY) { - setStart(earliestDate) - } - }, [earliestDate, start, end]) - - const applyQuickRange = (range: QuickRangeConfig) => { - if (range.unit === 'all') { - applyAllRange() - return - } - applyRange(quickRangeMonths(range)) - } - - const saveQuickRanges = (next: QuickRangeConfig[]) => { - const normalized = normalizeQuickRanges(next) - storage.strategyBacktestQuickRanges.set(normalized) - return normalized - } - - const updateQuickRange = (id: string, patch: Partial>) => { - setQuickRanges(prev => { - const current = prev.find(range => range.id === id) - if (patch.enabled === false && current?.enabled && prev.filter(range => range.enabled).length <= 1) return prev - return saveQuickRanges(prev.map(range => range.id === id - ? normalizeQuickRange({ ...range, ...patch }, range) - : range - )) - }) - } - - const visibleQuickRanges = quickRanges.filter(range => range.enabled) - const matchedQuickRange = visibleQuickRanges.find(range => range.unit === 'all' - ? end === TODAY && (start === earliestDate || start === '') - : end === TODAY && start === monthsAgo(quickRangeMonths(range)) - ) - const rangeKey = matchedQuickRange?.id ?? 'custom' - const rangeTitle = matchedQuickRange ? quickRangeTitle(matchedQuickRange) : '自定义区间' - const rangeButtonCls = (key: string) => `rounded-btn px-2 py-1 text-[11px] font-medium transition-colors ${rangeKey === key - ? 'bg-accent/15 text-accent' - : 'text-muted hover:bg-elevated/70 hover:text-secondary' - }` - - const sortedTrades = useMemo(() => { - return [...(result?.trades ?? [])].sort((a, b) => { - const exitCmp = String(b.exit_date).localeCompare(String(a.exit_date)) - if (exitCmp !== 0) return exitCmp - return String(b.entry_date).localeCompare(String(a.entry_date)) - }) - }, [result?.trades]) - - const dailyTradeRows = useMemo(() => { - const rows = new Map>() - const ensure = (date: string) => { - if (!rows.has(date)) { - rows.set(date, { date, buys: [], sells: [], buyValue: 0, sellValue: 0, realizedPnl: 0 }) - } - return rows.get(date)! - } - - for (const t of result?.trades ?? []) { - const entryDate = String(t.entry_date).slice(0, 10) - const exitDate = String(t.exit_date).slice(0, 10) - const buyRow = ensure(entryDate) - buyRow.buys.push(t) - buyRow.buyValue += Number(t.entry_value ?? 0) - - const sellRow = ensure(exitDate) - sellRow.sells.push(t) - sellRow.sellValue += Number(t.exit_value ?? 0) - sellRow.realizedPnl += Number(t.pnl_amount ?? 0) - } - - let cumulativePnl = 0 - return [...rows.values()] - .sort((a, b) => a.date.localeCompare(b.date)) - .map(row => { - cumulativePnl += row.realizedPnl - return { ...row, cumulativePnl } - }) - .reverse() - }, [result?.trades]) - - const tradePageCount = sortedTrades.length - ? Math.ceil(sortedTrades.length / tradePageSize) - : 0 - const dailyPageSize = 10 - const dailyPageCount = dailyTradeRows.length - ? Math.ceil(dailyTradeRows.length / dailyPageSize) - : 0 - const safeDailyPage = Math.min(dailyPage, Math.max(dailyPageCount - 1, 0)) - const dailyStart = safeDailyPage * dailyPageSize - const visibleDailyRows = dailyTradeRows.slice(dailyStart, dailyStart + dailyPageSize) - const dailyEnd = Math.min(dailyStart + visibleDailyRows.length, dailyTradeRows.length) - const safeTradePage = Math.min(tradePage, Math.max(tradePageCount - 1, 0)) - const tradeStart = safeTradePage * tradePageSize - const visibleTrades = sortedTrades.slice(tradeStart, tradeStart + tradePageSize) - const tradeEnd = Math.min(tradeStart + visibleTrades.length, sortedTrades.length) - const symbolNames = useMemo(() => { - const names: Record = {} - result?.trades.forEach(t => { - if (t.name) names[t.symbol] = t.name - }) - return names - }, [result?.trades]) - - const detail = strategyDetail.data - const basicFilter = (overrides.basic_filter ?? {}) as Record - const entrySignals = (overrides.entry_signals ?? []) as string[] - const exitSignals = (overrides.exit_signals ?? []) as string[] - - const scoring = useMemo(() => (overrides.scoring ?? {}) as Record, [overrides.scoring]) - const scoreMinValue = overrides.score_min == null ? '' : String(overrides.score_min) - const scoreMaxValue = overrides.score_max == null ? '' : String(overrides.score_max) - const stopLossPct = overrides.stop_loss == null ? '' : String(Math.abs(Number(overrides.stop_loss)) * 100) - const takeProfitPct = overrides.take_profit == null ? '' : String(Math.abs(Number(overrides.take_profit)) * 100) - const trailingStopPct = overrides.trailing_stop == null ? '' : String(Math.abs(Number(overrides.trailing_stop)) * 100) - const trailingTakeProfitActivatePct = overrides.trailing_take_profit_activate == null ? '' : String(Math.abs(Number(overrides.trailing_take_profit_activate)) * 100) - const trailingTakeProfitDrawdownPct = overrides.trailing_take_profit_drawdown == null ? '' : String(Math.abs(Number(overrides.trailing_take_profit_drawdown)) * 100) - const maxHoldDaysValue = overrides.max_hold_days == null ? '' : String(overrides.max_hold_days) - const targetPositionPct = Number(maxPositions) > 0 ? Number(maxExposure) / Number(maxPositions) : 0 - - useEffect(() => { - if (!editingScoring) setScoringDraft(scoringToPct(scoring)) - }, [scoring, editingScoring]) - - const updateOverride = (key: string, value: any) => { - setOverrides(prev => ({ ...prev, [key]: value })) - } - const updateBasicFilter = (key: string, value: any) => { - updateOverride('basic_filter', { ...basicFilter, [key]: value }) - } - const startScoringEdit = () => { - setScoringDraft(scoringToPct(scoring)) - setEditingScoring(true) - } - const cancelScoringEdit = () => { - setScoringDraft(scoringToPct(scoring)) - setEditingScoring(false) - } - const saveScoringDraft = () => { - updateOverride('scoring', normalizePctWeights(scoringDraft)) - setEditingScoring(false) - } - const scoreFilterSummary = scoreMinValue !== '' && scoreMaxValue !== '' - ? `评分 ${scoreMinValue}~${scoreMaxValue}` - : scoreMinValue !== '' - ? `评分 ≥${scoreMinValue}` - : scoreMaxValue !== '' - ? `评分 ≤${scoreMaxValue}` - : '评分不过滤' - const advancedSummary = detail - ? [ - detail.params.length > 0 ? `参数 ${detail.params.length}` : '无策略参数', - basicFilter.enabled !== false ? '过滤开' : '过滤关', - `买点 ${entrySignals.length}`, - `卖点 ${exitSignals.length}`, - scoreFilterSummary, - stopLossPct !== '' ? `止损 ${stopLossPct}%` : '止损未设', - takeProfitPct !== '' ? `止盈 ${takeProfitPct}%` : '止盈未设', - trailingStopPct !== '' ? `移损 ${trailingStopPct}%` : '移损未设', - trailingTakeProfitActivatePct !== '' && trailingTakeProfitDrawdownPct !== '' ? `回撤 ${trailingTakeProfitActivatePct}-${trailingTakeProfitDrawdownPct}点` : '回撤未设', - maxHoldDaysValue !== '' ? `最长 ${maxHoldDaysValue}天` : '不限持仓', - ].join(' · ') - : '选择策略后可调整参数 / 过滤 / 买卖触发器 / 评分 / 风控' - const selectedStrategyName = detail?.name ?? strategyList.find(st => st.id === selectedStrategy)?.name ?? '未选择策略' - const selectedStrategySource = detail?.source ?? strategyList.find(st => st.id === selectedStrategy)?.source - const stockPoolCount = symbols.split(',').map(s => s.trim()).filter(Boolean).length - const stockPoolSummary = stockPoolCount > 0 ? `股票池 已限定 ${stockPoolCount} 只` : '股票池 全市场' - const resultStartDate = result?.config?.start ?? result?.equity_curve?.[0]?.date ?? start - const resultEndDate = result?.config?.end ?? result?.equity_curve?.[result.equity_curve.length - 1]?.date ?? end - const resultTradeDays = result?.equity_curve?.length ?? 0 - const executionStats = (result?.stats?.execution ?? {}) as Record - const executionSummary = [ - ['buy_no_slot', '满仓未买'], - ['buy_exposure', '仓位上限'], - ['buy_score_filter', '评分过滤'], - ['buy_limit_up', '涨停未买'], - ['buy_suspended', '停牌未买'], - ['sell_limit_down', '跌停阻塞'], - ['sell_suspended', '停牌阻塞'], - ['pending_exit', '待卖阻塞'], - ] - .map(([key, label]) => ({ key, label, value: Number(executionStats[key] ?? 0) })) - .filter(item => item.value > 0) - - return ( -
- {/* 配置面板 */} -
-
-
- - {/* 高颗粒回测(分钟K)— 开发中占位 */} -
- - - 分钟K - {isFreeTier && ( - Starter+ - )} -
-
- {/* 高颗粒开启时的警告条 */} - {highGranularity && !isFreeTier && ( -
- -
- 高颗粒回测(开发中) - :将结合每日分钟K进行更精确的回测。 - ⚠️ 此功能尚未完成,且开启后会显著拖慢回测速度、占用大量资源。 -
-
- )} -
-
- {STRATEGY_GROUPS.map(group => ( - - ))} -
-
- {strategies.isLoading && ( - 加载中… - )} - {!strategies.isLoading && filteredStrategyList.length === 0 && ( - 当前分组暂无策略 - )} - {filteredStrategyList.map(st => ( - - ))} -
-
-
- - {selectedStrategy && strategyDetail.isLoading && ( -
加载策略配置…
- )} - - - -
-
-
-
回测区间
- -
- - {rangeTitle} - -
- -
-
- - -
-
- - -
-
- -
-
- {visibleQuickRanges.map(range => ( - - ))} -
- -
- - {rangeSettingsOpen && ( -
-
- 快捷区间 - 月 1-120 / 年 1-10 -
-
- {quickRanges.map((range, index) => { - const limits = range.unit === 'all' ? null : QUICK_RANGE_LIMITS[range.unit] - return ( -
- - - updateQuickRange(range.id, { value: Number(e.target.value) })} - placeholder="—" - className={`${INPUT_CLS} ${range.unit === 'all' ? 'opacity-50' : ''}`} - /> -
- ) - })} -
-
- )} -
- -
-
- - -
-
- - -
-
-
建仓默认次日开盘(避免未来函数),清仓默认当日收盘(持仓中可盘中/收盘卖);买卖点由策略触发器决定,这里只决定成交价。
- - {simMode === 'position' && ( -
-
- - setInitialCapital(e.target.value)} - className={INPUT_CLS} /> -
-
- - -
-
- - setMaxPositions(e.target.value)} - className={INPUT_CLS} /> -
-
- - setMaxExposure(e.target.value)} - className={INPUT_CLS} /> -
-
- - setFees(e.target.value)} className={INPUT_CLS} /> -
-
- - setSlippage(e.target.value)} className={INPUT_CLS} /> -
-
- )} - {simMode === 'position' && ( -
- 单票目标约 {Number.isFinite(targetPositionPct) ? targetPositionPct.toFixed(1) : '—'}%。最大总仓位控制资金投入;剩余现金不是新增持仓名额,只有实际卖出成功才释放持仓数。 -
- )} - {simMode === 'full' && ( -
- 全量模拟:每日将策略选出的全部候选独立买入,不受资金/最大持仓数限制;每一笔仍按策略卖点、止损、移动止盈/止损和最长持仓执行,用于评估策略本身的选股 + 交易规则质量。 -
- )} - - {isPending ? ( - - ) : ( - - )} -
- - {/* 结果面板 */} -
- {/* 模式切换: 仓位模拟 / 全量模拟 */} -
-
- {([['position', '仓位模拟'], ['full', '全量模拟']] as const).map(([val, label]) => ( - - ))} -
- {simMode === 'full' && ( - maxHoldDaysValue !== '' ? ( -
- 策略最长 {maxHoldDaysValue} 天 -
- ) : ( -
- 兜底上限 -
- {(['1', '5', '10', '20'] as const).map(d => ( - - ))} -
-
- ) - )} -
- - {result?.error && ( -
- {result.error} -
- )} - - {backtestTask?.error && ( -
- {backtestTask.error} -
- )} - - {!result && !isPending && ( - - )} - - {isPending && ( - -
- - - - -
-
- {backtestTask?.progress - ? `回测中 · 第 ${backtestTask.progress.day}/${backtestTask.progress.total} 天 (${backtestTask.progress.date})` - : '正在重新计算回测…'} -
-
- {result ? '当前展示上次结果,完成后自动替换' : '正在加载回测数据…'} -
-
- {backtestTask?.progress && ( - - {((backtestTask.progress.day / backtestTask.progress.total) * 100).toFixed(0)}% - - )} - -
- {backtestTask?.progress && ( -
-
-
- )} - - )} - - {/* 旧全量模拟结果: 固定前瞻收益统计 (兼容历史缓存结果) */} - {result && !result.error && result.stats && result.stats.mode === 'full' && result.stats.full_kind !== 'candidate_execution' && ( - -
- {result.strategy_info?.name ?? '策略'} - 全量模拟 - 持有 {result.config?.holding_days ?? 5} 天 - - {String(result.config?.start).slice(0,10)} ~ {String(result.config?.end).slice(0,10)} - -
- - {/* 统计卡片 */} -
- - - - - - - - -
- -
- 候选样本 {result.stats.n_candidates ?? 0} (标的×信号日) - 信号天数 {result.stats.n_days ?? 0} - 日均候选 {result.stats.avg_daily_candidates ?? 0} - 最佳 {fmtPct(result.stats.best)} - 最差 {fmtPct(result.stats.worst)} - 基准(上证) {fmtPct(result.stats.benchmark_return)} -
- - {/* 累计超额曲线 (复用 StrategyNavChart) */} - {result.equity_curve.length > 1 && ( -
-
累计收益曲线(日均复利)
- -
- )} - - {/* 收益分布直方图 */} - {Array.isArray(result.stats.return_distribution) && result.stats.return_distribution.length > 0 && ( -
-
- 候选标的收益分布(持有 {result.config?.holding_days ?? 5} 天) - 红=正收益 · 绿=负收益 -
- -
- )} - -
run_id: {result.run_id}
-
- )} - - {result && !result.error && result.stats && !result.stats.error && (result.stats.mode !== 'full' || result.stats.full_kind === 'candidate_execution') && ( - - {/* 策略信息 */} - {result.strategy_info && ( -
-
- {result.strategy_info.name} - {result.stats.full_kind === 'candidate_execution' && ( - 全量独立执行 - )} - {result.strategy_info.source && ( - - {SRC_MAP[result.strategy_info.source] ?? ''} - - )} -
- {result.strategy_info.stop_loss != null && ( - 止损 {fmtPct(result.strategy_info.stop_loss)} - )} - {result.strategy_info.take_profit != null && ( - 止盈 {fmtPct(result.strategy_info.take_profit)} - )} - {result.strategy_info.trailing_stop != null && ( - 移损 {fmtPct(result.strategy_info.trailing_stop)} - )} - {result.strategy_info.trailing_take_profit_activate != null && result.strategy_info.trailing_take_profit_drawdown != null && ( - 回撤 {fmtPct(result.strategy_info.trailing_take_profit_activate)}-{fmtPct(result.strategy_info.trailing_take_profit_drawdown)} - )} - {result.strategy_info.max_hold_days != null && ( - 最长 {result.strategy_info.max_hold_days} 天 - )} - {resultTradeDays > 0 && ( - - {String(resultStartDate).slice(0, 10)} ~ {String(resultEndDate).slice(0, 10)} - {resultTradeDays} 天 - - )} - {result.elapsed_ms > 0 && ( - 0 ? '' : 'ml-auto'}`}> - - 总耗时 - {fmtDuration(result.elapsed_ms)} - - )} -
- )} - - {/* 统计卡片 */} -
-
- - - - - } value={pick('sharpe') != null ? Number(pick('sharpe')).toFixed(2) : '—'} /> - - - - {result.stats.full_kind === 'candidate_execution' ? ( - - ) : ( - - )} -
-
- - {executionSummary.length > 0 && ( -
- 成交约束: - {executionSummary.map((item, index) => ( - - {index > 0 ? '· ' : ''}{item.label} {item.value} 次 - - ))} -
- )} - - {/* 净值曲线 */} - {result.equity_curve.length > 0 && ( -
- -
- )} - - {Array.isArray(result.stats.return_distribution) && result.stats.return_distribution.length > 0 && ( -
-
- 独立候选交易收益分布 - 红=正收益 · 绿=负收益 -
- -
- )} - - {/* Tab: 按日期 / 交易明细 / 选股分析 */} - {(result.trades.length > 0 || result.per_symbol_stats.length > 0) && ( -
-
- {(['daily', 'trades', 'picks'] as const).map(t => ( - - ))} -
- - {resultTab === 'daily' && ( -
-
- - - - - - - - - - - - {visibleDailyRows.map(row => ( - - - - - - - - ))} - -
日期买入卖出当日收益累计收益
-
{row.date}
-
- 买 {row.buys.length} / 卖 {row.sells.length} -
-
- {row.buys.length === 0 ? ( - - ) : ( -
- {row.buys.map((t, i) => ( - setSelectedTrade(t)} /> - ))} -
- )} -
- {row.sells.length === 0 ? ( - - ) : ( -
- {row.sells.map((t, i) => ( - setSelectedTrade(t)} /> - ))} -
- )} -
- {fmtSignedMoney(row.realizedPnl)} - - {fmtSignedMoney(row.cumulativePnl)} -
-
- {dailyTradeRows.length > 0 && ( -
- - 显示 {dailyStart + 1}-{dailyEnd} 天 / 共 {dailyTradeRows.length} 天,每页 10 天 - -
- - - {safeDailyPage + 1} / {dailyPageCount} - - -
-
- )} -
- )} - - {resultTab === 'trades' && ( -
- - - - - - - - - - - - - - {visibleTrades.map((t: StrategyBacktestTrade, i: number) => ( - - - - - - - - - - ))} - -
标的买入卖出仓位 / 手数单票盈亏持仓原因
-
- {t.name || t.symbol} -
-
{t.symbol}
-
- - - - -
{fmtPct(t.position_pct, 2)}
-
- {fmtLots(t.lots)} 手 - {fmtShares(t.shares)} 股 -
-
-
{fmtSignedMoney(t.pnl_amount)}
-
{fmtPct(t.pnl_pct)}
-
-
{t.duration} 天
- {!!t.blocked_exit_days &&
阻塞 {t.blocked_exit_days} 天
} -
- {sortedTrades.length > 0 && ( -
- - 显示 {tradeStart + 1}-{tradeEnd} 条 / 共 {sortedTrades.length} 条 - -
- - - - {safeTradePage + 1} / {tradePageCount} - - -
-
- )} -
- )} - - {resultTab === 'picks' && ( - - - - - - - - - - - - - {result.per_symbol_stats.map((r) => ( - - - - - - - - - ))} - -
标的选股次数总收益胜率最佳最差
-
- {symbolNames[r.symbol] || r.symbol} -
-
{r.symbol}
-
{r.n_trades} - {fmtPct(r.total_return)} - {fmtPct(r.win_rate)}{fmtPct(r.best)}{fmtPct(r.worst)}
- )} -
- )} - -
- run_id: {result.run_id} -
-
- )} -
- - {settingsOpen && detail && ( - <> - setSettingsOpen(false)} - className="fixed inset-0 z-50 bg-black/45 backdrop-blur-[1px]" - /> - -
-
-
-
- 高级策略设置 - - {SRC_MAP[detail.source] ?? ''} - -
-
{detail.name}
-
{advancedSummary}
-
- -
-
- {ADVANCED_TABS.map(tab => ( - - ))} -
-
- -
-
-
触发 / 成交 / 仓位关系
-
触发器决定什么时候产生买卖信号;评分只在多个买点同时出现时排序。
-
成交口径可分别设置建仓/清仓:默认建仓次日开盘(避免未来函数)、清仓当日收盘(持仓中可盘中/收盘卖)。
-
退出优先级:止损/移动止损 > 卖点信号 > 到期平仓;到期只作兜底,不抢占卖点或风控。
-
最大持仓数控制同时持股数量,最大总仓位控制资金投入比例;剩余现金不等于可新增持仓名额。
-
- - {settingsTab === 'range' && ( - - -
默认全市场回测,由基础过滤、策略条件和买卖触发器筛选;需要单票调试或自选池回测时再限定股票池。
-
- )} - - {settingsTab === 'params' && ( - - {detail.params.length > 0 ? ( -
- {detail.params.map(param => ( - setStrategyParams(prev => ({ ...prev, [param.id]: value }))} - /> - ))} -
- ) : ( -
当前策略没有可调参数。
- )} -
- )} - - {settingsTab === 'filter' && ( - - -
- {BASIC_FILTER_FIELDS.map(field => { - const scale = field.scale ?? 1 - const value = basicFilter[field.key] == null ? '' : Number(basicFilter[field.key]) / scale - return ( - - ) - })} -
- -
- {BOARD_OPTIONS.map(board => { - const boards = Array.isArray(basicFilter.boards) ? basicFilter.boards : [] - const checked = boards.includes(board) - return ( - - ) - })} -
-
- )} - - {settingsTab === 'entry' && ( - updateOverride('entry_signals', next)} />} - > - updateOverride('entry_signals', next)} - kind="entry" - /> - - )} - - {settingsTab === 'exit' && ( - updateOverride('exit_signals', next)} />} - > - updateOverride('exit_signals', next)} - kind="exit" - /> - - )} - - {settingsTab === 'scoring' && ( - - {Object.entries(scoring).length > 0 ? (() => { - const visibleWeights = editingScoring ? scoringDraft : scoringToPct(scoring) - const total = Object.values(visibleWeights).reduce((a, b) => a + b, 0) - return ( -
-
- {Object.keys(scoring).map(key => ( - setScoringDraft(prev => ({ ...prev, [key]: Math.max(0, value) }))} - /> - ))} -
-
-
- 总和 {editingScoring ? total : 100} - 保存时自动归一化计算 -
-
- {editingScoring && ( - - )} - -
-
-
- ) - })() : ( -
当前策略没有评分权重。
- )} -
-
- 评分过滤 - 留空 = 不过滤;命中范围后按评分从高到低买入 -
-
- - -
-
例如最小值 71 表示只把评分 ≥ 71 的股票放入下一交易日买入预选池。
-
-
- )} - - {settingsTab === 'risk' && ( - -
- - - - - - -
-
- )} -
- -
- - -
-
- - )} - - setSelectedTrade(null)} /> -
- ) -} diff --git a/serve/frontend/src/pages/backtest/charts/FactorGroupNavChart.tsx b/serve/frontend/src/pages/backtest/charts/FactorGroupNavChart.tsx deleted file mode 100644 index 98e618b..0000000 --- a/serve/frontend/src/pages/backtest/charts/FactorGroupNavChart.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { useMemo } from 'react' -import { useECharts } from './useECharts' -import type { FactorBacktestResult } from '@/lib/api' - -const GROUP_COLORS = [ - '#6366f1', // Q1 indigo - '#8b5cf6', // Q2 violet - '#f59e0b', // Q3 amber - '#f97316', // Q4 orange - '#ef4444', // Q5 red - '#ec4899', // Q6 - '#14b8a6', // Q7 - '#06b6d4', // Q8 - '#84cc16', // Q9 - '#a855f7', // Q10 -] - -interface Props { - result: FactorBacktestResult -} - -export function FactorGroupNavChart({ result }: Props) { - const option = useMemo(() => { - if (!result.group_nav.length) return null - - const dates = result.group_nav.map(r => (r.date as string).slice(0, 10)) - const groupCols = Object.keys(result.group_nav[0]).filter(k => k !== 'date').sort() - - // 多空净值 - const lsNav = result.long_short_nav - const hasLS = lsNav && lsNav.length > 0 - - const series = groupCols.map((col, i) => ({ - name: col, - type: 'line', - data: result.group_nav.map(r => r[col]), - symbol: 'none', - lineStyle: { color: GROUP_COLORS[i % GROUP_COLORS.length], width: 1.5 } as any, - itemStyle: { color: GROUP_COLORS[i % GROUP_COLORS.length] } as any, - })) - - if (hasLS) { - series.push({ - name: '多空', - type: 'line', - data: lsNav.map(r => r.value), - symbol: 'none', - lineStyle: { color: '#fbbf24', width: 2, type: 'dashed' }, - itemStyle: { color: '#fbbf24' }, - }) - } - - return { - animation: false, - legend: { - show: false, - }, - grid: { left: 56, right: 16, top: 12, bottom: 28 }, - tooltip: { - trigger: 'axis', - backgroundColor: 'rgba(15,23,42,0.95)', - borderColor: 'rgba(148,163,184,0.2)', - textStyle: { color: '#e2e8f0', fontSize: 12 }, - formatter: (params: any) => { - const date = params[0]?.axisValue ?? '' - let html = `
${date}
` - for (const p of params) { - if (p.value == null) continue - html += `
- - - ${p.seriesName} - - ${(p.value as number).toFixed(4)} -
` - } - return html - }, - }, - xAxis: { - type: 'category', - data: dates, - axisLabel: { color: '#64748b', fontSize: 10, interval: Math.floor(dates.length / 6) }, - axisLine: { lineStyle: { color: '#334155' } }, - axisTick: { show: false }, - }, - yAxis: { - type: 'value', - scale: true, - axisLabel: { color: '#64748b', fontSize: 10 }, - splitLine: { lineStyle: { color: '#1e293b' } }, - axisLine: { show: false }, - }, - series, - } as any - }, [result.group_nav, result.long_short_nav, result.run_id]) - - const chartRef = useECharts(option, [result.run_id]) - - // 图例 - const groupCols = result.group_nav.length > 0 - ? Object.keys(result.group_nav[0]).filter(k => k !== 'date').sort() - : [] - - return ( -
-
- {groupCols.map((col, i) => ( - - - {col} - - ))} - {result.long_short_nav?.length > 0 && ( - - - 多空 - - )} -
-
-
- ) -} diff --git a/serve/frontend/src/pages/backtest/charts/FactorICChart.tsx b/serve/frontend/src/pages/backtest/charts/FactorICChart.tsx deleted file mode 100644 index c66b161..0000000 --- a/serve/frontend/src/pages/backtest/charts/FactorICChart.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { useMemo } from 'react' -import { useECharts } from './useECharts' -import type { FactorBacktestResult } from '@/lib/api' - -interface Props { - result: FactorBacktestResult -} - -export function FactorICChart({ result }: Props) { - const option = useMemo(() => { - if (!result.ic_series.length) return null - - const dates = result.ic_series.map(r => r.date.slice(0, 10)) - const values = result.ic_series.map(r => r.ic) - - // 12期移动平均 - const maWindow = 12 - const ma: (number | null)[] = values.map((_, i) => { - if (i < maWindow - 1) return null - const slice = values.slice(i - maWindow + 1, i + 1) - return slice.reduce((a, b) => a + b, 0) / slice.length - }) - - return { - animation: false, - grid: { left: 50, right: 16, top: 16, bottom: 28 }, - tooltip: { - trigger: 'axis', - backgroundColor: 'rgba(15,23,42,0.95)', - borderColor: 'rgba(148,163,184,0.2)', - textStyle: { color: '#e2e8f0', fontSize: 12 }, - formatter: (params: any) => { - const date = params[0]?.axisValue ?? '' - let html = `
${date}
` - for (const p of params) { - if (p.value == null) continue - html += `
- ${p.seriesName} - ${(p.value * 100).toFixed(2)}% -
` - } - return html - }, - }, - xAxis: { - type: 'category', - data: dates, - axisLabel: { color: '#64748b', fontSize: 10, interval: Math.floor(dates.length / 6) }, - axisLine: { lineStyle: { color: '#334155' } }, - axisTick: { show: false }, - }, - yAxis: { - type: 'value', - axisLabel: { color: '#64748b', fontSize: 10, formatter: (v: number) => `${(v * 100).toFixed(0)}%` }, - splitLine: { lineStyle: { color: '#1e293b' } }, - axisLine: { show: false }, - }, - series: [ - { - name: 'IC', - type: 'bar', - data: values.map(v => ({ - value: v, - itemStyle: { - color: v >= 0 - ? 'rgba(240,68,56,0.6)' - : 'rgba(18,183,106,0.6)', - }, - })), - barMaxWidth: 6, - }, - { - name: `MA${maWindow}`, - type: 'line', - data: ma, - smooth: true, - symbol: 'none', - lineStyle: { color: '#f59e0b', width: 1.5 }, - z: 10, - }, - ], - } as any - }, [result.ic_series]) - - const chartRef = useECharts(option, [result.run_id]) - - return
-} diff --git a/serve/frontend/src/pages/backtest/charts/ReturnDistributionChart.tsx b/serve/frontend/src/pages/backtest/charts/ReturnDistributionChart.tsx deleted file mode 100644 index 382fcb3..0000000 --- a/serve/frontend/src/pages/backtest/charts/ReturnDistributionChart.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useMemo } from 'react' -import { useECharts } from './useECharts' -import type { EChartsOption } from 'echarts' - -interface DistBin { - range: string - count: number - ratio: number -} - -/** - * 收益分布直方图 — 全量模拟专用的候选标的收益分布。 - * 柱子颜色按收益正负区分(正红负绿),零轴居中。 - */ -export function ReturnDistributionChart({ distribution }: { distribution: DistBin[] }) { - const option = useMemo(() => { - const cats = distribution.map(d => d.range) - const vals = distribution.map(d => d.count) - // 判断每档是正还是负(按 range 字符串首字符 +/~) - const colors = distribution.map(d => { - const lo = parseFloat(d.range) - // 中心档(跨 0) 用中性色 - if (lo < 0 && parseFloat(d.range.split('~')[1]) > 0) return '#a1a1aa' - return lo >= 0 ? '#ef4444' : '#22c55e' - }) - - return { - grid: { left: 48, right: 16, top: 24, bottom: 56 }, - tooltip: { - trigger: 'axis', - axisPointer: { type: 'shadow' }, - formatter: (params: any) => { - const p = Array.isArray(params) ? params[0] : params - const bin = distribution[p.dataIndex] - if (!bin) return '' - return `${bin.range}
数量: ${bin.count}
占比: ${(bin.ratio * 100).toFixed(1)}%` - }, - }, - xAxis: { - type: 'category', - data: cats, - axisLabel: { color: '#a1a1aa', fontSize: 10, rotate: 45, interval: 1 }, - axisLine: { lineStyle: { color: '#3f3f46' } }, - }, - yAxis: { - type: 'value', - axisLabel: { color: '#a1a1aa', fontSize: 10 }, - splitLine: { lineStyle: { color: '#27272a' } }, - }, - series: [ - { - type: 'bar', - data: vals.map((v, i) => ({ value: v, itemStyle: { color: colors[i] } })), - barWidth: '90%', - }, - ], - } - }, [distribution]) - - const chartRef = useECharts(option, [distribution]) - - return
-} diff --git a/serve/frontend/src/pages/backtest/charts/StrategyNavChart.tsx b/serve/frontend/src/pages/backtest/charts/StrategyNavChart.tsx deleted file mode 100644 index a6c808e..0000000 --- a/serve/frontend/src/pages/backtest/charts/StrategyNavChart.tsx +++ /dev/null @@ -1,209 +0,0 @@ -import { useMemo } from 'react' -import { useECharts } from './useECharts' -import type { StrategyBacktestResult } from '@/lib/api' - -interface Props { - result: StrategyBacktestResult -} - -export function StrategyNavChart({ result }: Props) { - const option = useMemo(() => { - if (!result.equity_curve.length) return null - - const moneyFmt = new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 0 }) - const valueFmt = new Intl.NumberFormat('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) - const axisMoneyFmt = (v: number) => { - if (Math.abs(v) >= 100_000_000) return `${(v / 100_000_000).toFixed(1)}亿` - if (Math.abs(v) >= 10_000) return `${(v / 10_000).toFixed(0)}万` - return moneyFmt.format(v) - } - const dates = result.equity_curve.map(r => r.date.slice(0, 10)) - const navValues = result.equity_curve.map(r => r.value) - const benchmarkByDate = new Map((result.benchmark_curve ?? []).map(r => [r.date.slice(0, 10), r.close ?? r.value])) - const benchmarkValues = dates.map(d => benchmarkByDate.get(d) ?? null) - const hasBenchmark = benchmarkValues.some(v => v != null) - const ddValues = result.drawdown_curve.map(r => r.value * 100) - - return { - animation: false, - axisPointer: { - link: [{ xAxisIndex: 'all' }], - label: { backgroundColor: '#334155' }, - }, - grid: [ - { left: 64, right: hasBenchmark ? 64 : 16, top: 14, bottom: '40%' }, - { left: 64, right: hasBenchmark ? 64 : 16, top: '68%', bottom: 46 }, - ], - xAxis: [ - { - type: 'category', data: dates, gridIndex: 0, - axisLabel: { show: false }, axisTick: { show: false }, - axisPointer: { show: true, type: 'line' }, - axisLine: { lineStyle: { color: '#334155' } }, - }, - { - type: 'category', data: dates, gridIndex: 1, - axisLabel: { color: '#64748b', fontSize: 10, interval: Math.floor(dates.length / 6) }, - axisTick: { show: false }, - axisPointer: { show: true, type: 'line' }, - axisLine: { lineStyle: { color: '#334155' } }, - }, - ], - yAxis: [ - { - type: 'value', gridIndex: 0, - scale: true, - name: hasBenchmark ? '上证点位' : '策略资金', - nameTextStyle: { color: hasBenchmark ? 'rgba(148,163,184,0.55)' : '#64748b', fontSize: 10, padding: [0, 0, 4, 0] }, - axisLabel: { - color: hasBenchmark ? 'rgba(148,163,184,0.55)' : '#64748b', - fontSize: 10, - formatter: hasBenchmark ? ((v: number) => v.toFixed(0)) : axisMoneyFmt, - }, - splitLine: { lineStyle: { color: '#1e293b' } }, - axisLine: { show: false }, - }, - { - type: 'value', gridIndex: 0, - position: 'right', - scale: true, - name: hasBenchmark ? '策略资金' : '', - nameTextStyle: { color: '#64748b', fontSize: 10, padding: [0, 0, 4, 0] }, - axisLabel: { - show: hasBenchmark, - color: '#64748b', - fontSize: 10, - formatter: axisMoneyFmt, - }, - splitLine: { show: false }, - axisLine: { show: false }, - }, - { - type: 'value', gridIndex: 1, - position: 'right', - max: 0, - axisLabel: { - color: '#64748b', fontSize: 10, - formatter: (v: number) => `${v.toFixed(1)}%`, - }, - splitLine: { lineStyle: { color: '#1e293b' } }, - axisLine: { show: false }, - }, - ], - dataZoom: [ - { - type: 'inside', - xAxisIndex: [0, 1], - filterMode: 'filter', - zoomOnMouseWheel: true, - moveOnMouseMove: true, - moveOnMouseWheel: false, - }, - { - type: 'slider', - xAxisIndex: [0, 1], - filterMode: 'filter', - height: 16, - bottom: 10, - borderColor: 'rgba(148,163,184,0.18)', - backgroundColor: 'rgba(15,23,42,0.55)', - fillerColor: 'rgba(59,130,246,0.18)', - handleStyle: { color: '#64748b', borderColor: '#94a3b8' }, - textStyle: { color: '#64748b', fontSize: 10 }, - brushSelect: false, - }, - ], - tooltip: { - trigger: 'axis', - backgroundColor: 'rgba(15,23,42,0.95)', - borderColor: 'rgba(148,163,184,0.2)', - textStyle: { color: '#e2e8f0', fontSize: 12 }, - formatter: (params: any) => { - const date = params[0]?.axisValue ?? '' - let html = `
${date}
` - for (const p of params) { - if (p.value == null) continue - const isDrawdown = p.seriesName === '回撤' - const isBenchmark = p.seriesName === '同期上证指数' - html += `
- ${p.seriesName} - ${ - isDrawdown - ? `${(p.value as number).toFixed(2)}%` - : isBenchmark - ? `${valueFmt.format(p.value as number)} 点` - : moneyFmt.format(p.value as number) - } -
` - } - return html - }, - }, - series: [ - { - name: '净值', - type: 'line', - xAxisIndex: 0, - yAxisIndex: hasBenchmark ? 1 : 0, - data: navValues, - symbol: 'none', - lineStyle: { color: '#3b82f6', width: 2.2 }, - areaStyle: { - color: { - type: 'linear', x: 0, y: 0, x2: 0, y2: 1, - colorStops: [ - { offset: 0, color: 'rgba(59,130,246,0.15)' }, - { offset: 1, color: 'rgba(59,130,246,0.01)' }, - ], - } as any, - }, - }, - ...(hasBenchmark ? [{ - name: '同期上证指数', - type: 'line', - xAxisIndex: 0, - yAxisIndex: 0, - data: benchmarkValues, - symbol: 'none', - connectNulls: true, - lineStyle: { color: 'rgba(148,163,184,0.45)', width: 1, type: 'dashed' }, - }] : []), - { - name: '回撤', - type: 'line', - xAxisIndex: 1, - yAxisIndex: 2, - data: ddValues, - symbol: 'none', - lineStyle: { color: 'rgba(240,68,56,0.6)', width: 1 }, - areaStyle: { color: 'rgba(240,68,56,0.12)' }, - }, - ], - } as any - }, [result.equity_curve, result.drawdown_curve, result.benchmark_curve, result.run_id]) - - const chartRef = useECharts(option, [result.run_id]) - - return ( -
-
- - - 策略净值 - - - - 回撤 - - {(result.benchmark_curve?.length ?? 0) > 0 && ( - - - 同期上证指数 - - )} - 滚轮缩放 · 拖动平移 -
-
-
- ) -} diff --git a/serve/frontend/src/pages/backtest/charts/useECharts.ts b/serve/frontend/src/pages/backtest/charts/useECharts.ts deleted file mode 100644 index 6d33c9d..0000000 --- a/serve/frontend/src/pages/backtest/charts/useECharts.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useEffect, useRef } from 'react' -import * as echarts from 'echarts' -import type { ECharts, EChartsOption } from 'echarts' - -/** - * ECharts 实例管理 Hook — 自动初始化/resize/销毁。 - * 返回 ref 绑定到容器 div,和 setOption 方法。 - */ -export function useECharts( - option: EChartsOption | null, - deps: any[] = [], -) { - const chartRef = useRef(null) - const instanceRef = useRef(null) - - // 初始化 / 销毁 - useEffect(() => { - if (!chartRef.current) return - instanceRef.current = echarts.init(chartRef.current, undefined, { renderer: 'canvas' }) - const handleResize = () => instanceRef.current?.resize() - window.addEventListener('resize', handleResize) - - return () => { - window.removeEventListener('resize', handleResize) - instanceRef.current?.dispose() - instanceRef.current = null - } - }, []) - - // 更新 option - useEffect(() => { - if (!instanceRef.current || !option) return - instanceRef.current.setOption(option, { notMerge: true }) - }, [option, ...deps]) - - return chartRef -} diff --git a/serve/frontend/src/pages/backtest/components/TradeKlineModal.tsx b/serve/frontend/src/pages/backtest/components/TradeKlineModal.tsx deleted file mode 100644 index 6f964ff..0000000 --- a/serve/frontend/src/pages/backtest/components/TradeKlineModal.tsx +++ /dev/null @@ -1,170 +0,0 @@ -import { useEffect, useMemo, useState } from 'react' -import { AnimatePresence, motion } from 'framer-motion' -import { Clock, X } from 'lucide-react' -import { StockPanel } from '@/components/StockPanel' -import type { ChartPriceLine, ChartRange } from '@/components/EChartsCandlestick' -import type { StrategyBacktestTrade } from '@/lib/api' -import { fmtPct, fmtPrice, priceColorClass } from '@/lib/format' - -interface Props { - trade: StrategyBacktestTrade | null - onClose: () => void -} - -function addDays(date: string, days: number): string { - const d = new Date(date) - d.setDate(d.getDate() + days) - return d.toISOString().slice(0, 10) -} - -function fmtMoney(v: number | null | undefined): string { - if (v == null || Number.isNaN(Number(v))) return '—' - const n = Number(v) - const abs = Math.abs(n) - if (abs >= 100_000_000) return `${(n / 100_000_000).toFixed(2)}亿` - if (abs >= 10_000) return `${(n / 10_000).toFixed(2)}万` - return n.toFixed(0) -} - -function fmtSignedMoney(v: number | null | undefined): string { - if (v == null || Number.isNaN(Number(v))) return '—' - const prefix = Number(v) > 0 ? '+' : '' - return `${prefix}${fmtMoney(v)}` -} - -export function TradeKlineModal({ trade, onClose }: Props) { - const [showIntraday, setShowIntraday] = useState(false) - - useEffect(() => { - if (!trade) return - const handler = (e: KeyboardEvent) => { - if (e.key === 'Escape') onClose() - } - document.addEventListener('keydown', handler) - return () => document.removeEventListener('keydown', handler) - }, [trade, onClose]) - - useEffect(() => { - if (trade) setShowIntraday(false) - }, [trade]) - - const dateRange = useMemo(() => { - if (!trade) return null - return { - start: addDays(String(trade.entry_date).slice(0, 10), -45), - end: addDays(String(trade.exit_date).slice(0, 10), 20), - } - }, [trade]) - - const ranges = useMemo(() => { - if (!trade) return [] - return [{ - start: String(trade.entry_date).slice(0, 10), - end: String(trade.exit_date).slice(0, 10), - label: '持仓区间', - color: 'rgba(59,130,246,0.07)', - }] - }, [trade]) - - const priceLines = useMemo(() => { - if (!trade) return [] - const start = String(trade.entry_date).slice(0, 10) - const end = String(trade.exit_date).slice(0, 10) - return [ - { - value: Number(trade.entry_price), - label: `买入价 ${fmtPrice(trade.entry_price)}`, - color: '#C74040', - start, - end, - }, - { - value: Number(trade.exit_price), - label: `卖出价 ${fmtPrice(trade.exit_price)}`, - color: '#2D9B65', - start, - end, - }, - ] - }, [trade]) - - return ( - - {trade && dateRange && ( -
- - -
-
-
- {trade.symbol} - {trade.name || '交易回放'} - 交易回放 -
-
- {String(trade.entry_date).slice(0, 10)} 买入 → {String(trade.exit_date).slice(0, 10)} 卖出 · 持仓 {trade.duration ?? '—'} 天 -
-
-
-
-
买 / 卖
-
{fmtPrice(trade.entry_price)} / {fmtPrice(trade.exit_price)}
-
-
-
盈亏
-
- {fmtSignedMoney(trade.pnl_amount)} / {fmtPct(trade.pnl_pct)} -
-
- - -
-
- -
- { if (!showIntraday) setShowIntraday(true) }} - /> -
-
-
- )} -
- ) -} diff --git a/serve/frontend/src/pages/settings/MenuSettings.tsx b/serve/frontend/src/pages/settings/MenuSettings.tsx index 14d7303..3697ba5 100644 --- a/serve/frontend/src/pages/settings/MenuSettings.tsx +++ b/serve/frontend/src/pages/settings/MenuSettings.tsx @@ -32,9 +32,7 @@ interface NavEntry { const BUILTIN_PAGES: NavEntry[] = [ { id: '/', label: '看板', type: 'builtin', visible: true }, - { id: '/watchlist', label: '自选', type: 'builtin', visible: true }, { id: '/screener', label: '策略', type: 'builtin', visible: true }, - { id: '/backtest', label: '回测', type: 'builtin', visible: true }, { id: '/limit-ladder', label: '连板梯队', type: 'builtin', visible: true }, { id: '/concept-analysis', label: '概念分析', type: 'builtin', visible: true }, { id: '/industry-analysis', label: '行业分析', type: 'builtin', visible: true }, diff --git a/serve/frontend/src/router.tsx b/serve/frontend/src/router.tsx index ef4d6b1..abc41e8 100644 --- a/serve/frontend/src/router.tsx +++ b/serve/frontend/src/router.tsx @@ -1,8 +1,6 @@ import { createBrowserRouter, Navigate } from 'react-router-dom' import { Layout } from './components/Layout' -import { Watchlist } from './pages/Watchlist' import { Screener } from './pages/Screener' -import { Backtest } from './pages/Backtest' import { Financials } from './pages/Financials' import { Onboarding } from './pages/Onboarding' import { Auth } from './pages/Auth' @@ -70,9 +68,7 @@ export const router = createBrowserRouter([ { path: 'industry-analysis', element: }, { path: 'stock-analysis', element: }, { path: 'review', element: }, - { path: 'watchlist', element: }, { path: 'screener', element: }, - { path: 'backtest', element: }, { path: 'financials', element: }, { path: 'data', element: }, { path: 'monitor', element: }, diff --git a/serve/screenshots/backtest.png b/serve/screenshots/backtest.png deleted file mode 100644 index c4b55c8819881ced1d8be2c9031f965a397acda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668676 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%0A>E&W+q@3}C|B;E-dN7p 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

4LH-|5$_Xz`hxL{OVO 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π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%0DCUY)pXPdu*s@4kv_ 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 CS3#x#