Add all-time stats tab with monthly breakdown on instance analytics.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-01 09:49:47 +08:00
parent a00699aec3
commit f6ea0dc399
9 changed files with 239 additions and 29 deletions
+47 -11
View File
@@ -1842,45 +1842,80 @@ def _compute_period_metrics(trades):
}
def _bounds_for_month_key(ym):
"""ym: YYYY-MM → 该自然月首末日(北京日历)."""
y, m = [int(x) for x in str(ym).split("-", 1)]
start = f"{y:04d}-{m:02d}-01"
if m == 12:
end = f"{y:04d}-12-31"
else:
end = (datetime(y, m + 1, 1) - timedelta(days=1)).date().strftime("%Y-%m-%d")
return start, end
def _build_monthly_stats_rows(conn, all_tr, seg_key):
"""按北京交易日所在自然月聚合;新月在前."""
by_month = {}
for p, t, td in all_tr:
if not td or len(str(td)) < 7:
continue
mk = str(td)[:7]
by_month.setdefault(mk, []).append((p, t, td))
rows = []
for mk in sorted(by_month.keys(), reverse=True):
metrics = _compute_period_metrics(by_month[mk])
ms, me = _bounds_for_month_key(mk)
metrics["opens_count"] = _count_opens_for_segment(conn, ms, me, seg_key)
metrics["range_label"] = f"{ms} ~ {me}"
metrics["month_key"] = mk
rows.append(metrics)
return rows
def compute_stats_bundle(conn, trading_day, now_dt=None):
"""日 / 周 / 月 统计:平仓按北京时间交易日(默认 8:00 切日)计入."""
"""日 / 周 / 月 / 全部 统计:平仓按北京时间交易日(默认 8:00 切日)计入."""
now_dt = now_dt or app_now()
pnls = _load_completed_trade_pnls(conn)
total_opens_all = conn.execute("SELECT COUNT(*) FROM order_monitors").fetchone()[0]
w_start, w_end = _session_week_bounds(trading_day)
m_start, m_end = _calendar_month_bounds(now_dt)
def in_week(tr):
return tr[2] and w_start <= tr[2] <= w_end
def in_month(tr):
return tr[2] and m_start <= tr[2] <= m_end
def slice_metrics(seg_key):
seg_rows = [tr for tr in pnls if _pnl_row_matches_segment(tr[3], seg_key)]
day_tr = [(p, t, td) for p, t, td, _r in seg_rows if td == trading_day]
week_tr = [(p, t, td) for p, t, td, _r in seg_rows if t and w_start <= td <= w_end]
month_tr = [(p, t, td) for p, t, td, _r in seg_rows if t and m_start <= td <= m_end]
all_tr = [(p, t, td) for p, t, td, _r in seg_rows if t]
dm = _compute_period_metrics(day_tr)
wm = _compute_period_metrics(week_tr)
mm = _compute_period_metrics(month_tr)
am = _compute_period_metrics(all_tr)
dm["opens_count"] = _count_opens_for_segment(conn, trading_day, trading_day, seg_key)
wm["opens_count"] = _count_opens_for_segment(conn, w_start, w_end, seg_key)
mm["opens_count"] = _count_opens_for_segment(conn, m_start, m_end, seg_key)
am["opens_count"] = _count_opens_for_segment(conn, "1970-01-01", "9999-12-31", seg_key)
dm["range_label"] = f"北京时间交易日 {trading_day}({TRADING_DAY_RESET_HOUR}:00 切日)"
wm["range_label"] = f"{w_start} ~ {w_end}(北京日期,近7天)"
mm["range_label"] = f"{m_start} ~ {m_end}(北京自然月)"
return dm, wm, mm
tds = [td for _, _, td in all_tr if td]
if tds:
am["range_label"] = f"全部历史 {min(tds)} ~ {max(tds)}(北京交易日)"
else:
am["range_label"] = "全部历史(暂无平仓)"
am["monthly_rows"] = _build_monthly_stats_rows(conn, all_tr, seg_key)
return dm, wm, mm, am
segments = []
seg_defs = effective_stats_segment_defs(
STATS_SEGMENT_DEFS, POSITION_SIZING_MODE, KEY_AUTO_ORDER_ENABLED
)
for seg_key, seg_title, _meta in seg_defs:
dm, wm, mm = slice_metrics(seg_key)
segments.append({"key": seg_key, "title": seg_title, "day": dm, "week": wm, "month": mm})
dm, wm, mm, am = slice_metrics(seg_key)
segments.append(
{"key": seg_key, "title": seg_title, "day": dm, "week": wm, "month": mm, "all": am}
)
dm, wm, mm = slice_metrics("all")
dm, wm, mm, am = slice_metrics("all")
return {
"trading_day": trading_day,
@@ -1888,6 +1923,7 @@ def compute_stats_bundle(conn, trading_day, now_dt=None):
"day": dm,
"week": wm,
"month": mm,
"all": am,
"segments": segments,
"stats_reset_hour": TRADING_DAY_RESET_HOUR,
}