This commit is contained in:
sam 2025-09-29 08:01:33 +08:00
parent 2afdaa76ed
commit 20bbcbb898

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import sys import sys
from dataclasses import asdict from dataclasses import asdict
from datetime import date, timedelta from datetime import date, datetime, timedelta
from pathlib import Path from pathlib import Path
from typing import Dict, List, Optional from typing import Dict, List, Optional
@ -210,9 +210,45 @@ def _load_daily_frame(ts_code: str, start: date, end: date) -> pd.DataFrame:
return df return df
def _get_latest_trade_date() -> Optional[date]:
try:
with db_session(read_only=True) as conn:
row = conn.execute(
"SELECT trade_date FROM daily ORDER BY trade_date DESC LIMIT 1"
).fetchone()
except Exception: # noqa: BLE001
LOGGER.exception("查询最新交易日失败", extra=LOG_EXTRA)
return None
if not row:
return None
raw_value = row["trade_date"]
if not raw_value:
return None
try:
return datetime.strptime(str(raw_value), "%Y%m%d").date()
except ValueError:
try:
return datetime.fromisoformat(str(raw_value)).date()
except ValueError:
LOGGER.warning("无法解析交易日:%s", raw_value, extra=LOG_EXTRA)
return None
def _default_backtest_range(window_days: int = 60) -> tuple[date, date]:
latest = _get_latest_trade_date() or date.today()
start = latest - timedelta(days=window_days)
if start > latest:
start = latest
return start, latest
def render_today_plan() -> None: def render_today_plan() -> None:
LOGGER.info("渲染今日计划页面", extra=LOG_EXTRA) LOGGER.info("渲染今日计划页面", extra=LOG_EXTRA)
st.header("今日计划") st.header("今日计划")
latest_trade_date = _get_latest_trade_date()
if latest_trade_date:
st.caption(f"最新交易日:{latest_trade_date.isoformat()}(统计数据请见左侧系统监控)")
else:
st.caption("统计与决策概览现已移至左侧“系统监控”侧栏。") st.caption("统计与决策概览现已移至左侧“系统监控”侧栏。")
try: try:
with db_session(read_only=True) as conn: with db_session(read_only=True) as conn:
@ -419,8 +455,7 @@ def render_backtest() -> None:
st.header("回测与复盘") st.header("回测与复盘")
st.write("在此运行回测、展示净值曲线与代理贡献。") st.write("在此运行回测、展示净值曲线与代理贡献。")
default_start = date(2020, 1, 1) default_start, default_end = _default_backtest_range(window_days=60)
default_end = date(2020, 3, 31)
LOGGER.debug( LOGGER.debug(
"回测默认参数start=%s end=%s universe=%s target=%s stop=%s hold_days=%s", "回测默认参数start=%s end=%s universe=%s target=%s stop=%s hold_days=%s",
default_start, default_start,