From ba629ea0ee91e57d505851f2047e21849d2279db Mon Sep 17 00:00:00 2001 From: dekun Date: Wed, 10 Jun 2026 16:58:57 +0800 Subject: [PATCH] fix: fund overview history starts from 2026-06-09 Add HUB_FUND_HISTORY_START_DAY so curves and drawdown exclude snapshots before the baseline trading day. Co-authored-by: Cursor --- hub_fund_history_lib.py | 27 ++++++++++++++++++--- manual_trading_hub/.env.example | 2 ++ manual_trading_hub/static/funds.js | 3 ++- manual_trading_hub/static/index.html | 4 ++-- manual_trading_hub/使用说明.md | 2 +- manual_trading_hub/资金概况说明.md | 6 +++-- tests/test_hub_fund_history_lib.py | 36 ++++++++++++++++++++++++++++ 7 files changed, 71 insertions(+), 9 deletions(-) diff --git a/hub_fund_history_lib.py b/hub_fund_history_lib.py index e0804fc..674e168 100644 --- a/hub_fund_history_lib.py +++ b/hub_fund_history_lib.py @@ -18,6 +18,12 @@ try: except ValueError: FUND_HISTORY_DAYS = 180 +FUND_HISTORY_START_DAY = (os.getenv("HUB_FUND_HISTORY_START_DAY") or "2026-06-09").strip()[:10] + + +def fund_history_start_day() -> str: + return FUND_HISTORY_START_DAY or "2026-06-09" + def _now_str() -> str: return datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -72,12 +78,20 @@ def _atomic_write(path: Path, data: dict) -> None: os.replace(tmp, path) -def _prune_days(days: dict, *, keep_days: int, anchor_day: str) -> dict: +def _prune_days( + days: dict, + *, + keep_days: int, + anchor_day: str, + start_day: Optional[str] = None, +) -> dict: try: anchor = datetime.strptime(anchor_day[:10], "%Y-%m-%d") except ValueError: anchor = datetime.now() - cutoff = (anchor - timedelta(days=max(1, keep_days) - 1)).strftime("%Y-%m-%d") + rolling_cutoff = (anchor - timedelta(days=max(1, keep_days) - 1)).strftime("%Y-%m-%d") + start = (start_day or fund_history_start_day()).strip()[:10] + cutoff = max(rolling_cutoff, start) if start else rolling_cutoff return {k: v for k, v in (days or {}).items() if str(k) >= cutoff} @@ -127,6 +141,9 @@ def record_fund_snapshot( ) -> dict[str, Any]: """写入当日各户资金账户/交易账户余额,并裁剪历史。""" day = (trading_day or "").strip()[:10] or current_trading_day(reset_hour=reset_hour) + start = fund_history_start_day() + if start and day < start: + return _load_store().get("days") or {} store = _load_store() days = dict(store.get("days") or {}) row_accounts: dict[str, dict] = {} @@ -150,7 +167,9 @@ def record_fund_snapshot( } if row_accounts: days[day] = {"accounts": row_accounts, "updated_at": _now_str()} - days = _prune_days(days, keep_days=keep_days, anchor_day=day) + days = _prune_days( + days, keep_days=keep_days, anchor_day=day, start_day=fund_history_start_day() + ) _atomic_write(FUND_HISTORY_PATH, {"version": 1, "days": days}) return days @@ -187,6 +206,7 @@ def get_fund_history(*, anchor_day: str, keep_days: int = FUND_HISTORY_DAYS) -> dict(store.get("days") or {}), keep_days=keep_days, anchor_day=anchor_day, + start_day=fund_history_start_day(), ) @@ -341,6 +361,7 @@ def build_fund_overview( "trading_day": day, "reset_hour": reset_hour, "keep_days": keep_days, + "history_start_day": fund_history_start_day(), "updated_at": updated_at, "totals": { "monitored_count": len(monitored_keys), diff --git a/manual_trading_hub/.env.example b/manual_trading_hub/.env.example index b3d5616..03c56f6 100644 --- a/manual_trading_hub/.env.example +++ b/manual_trading_hub/.env.example @@ -99,3 +99,5 @@ AI_MODEL=huihui_ai/deepseek-r1-abliterated:latest TRADING_DAY_RESET_HOUR=8 # 资金概况 / AI 上下文:分户资金快照保留交易日数(默认 180) # HUB_FUND_HISTORY_DAYS=180 +# 资金曲线与回撤统计起始交易日(默认 2026-06-09,该日之前不记、不展示) +# HUB_FUND_HISTORY_START_DAY=2026-06-09 diff --git a/manual_trading_hub/static/funds.js b/manual_trading_hub/static/funds.js index 473f216..5766263 100644 --- a/manual_trading_hub/static/funds.js +++ b/manual_trading_hub/static/funds.js @@ -215,7 +215,8 @@ const parts = [ "交易日 " + (data.trading_day || "—"), "切日 " + (data.reset_hour != null ? data.reset_hour : 8) + ":00 北京", - "历史 " + (data.keep_days || 180) + " 天", + "自 " + (data.history_start_day || "2026-06-09") + " 起", + "最多 " + (data.keep_days || 180) + " 交易日", ]; if (data.updated_at) parts.push("刷新 " + data.updated_at); if (totals.live_known_count != null) { diff --git a/manual_trading_hub/static/index.html b/manual_trading_hub/static/index.html index 37ad78c..4b2b623 100644 --- a/manual_trading_hub/static/index.html +++ b/manual_trading_hub/static/index.html @@ -334,7 +334,7 @@