From 1f57dac60522c7946da17010072142eb17c78047 Mon Sep 17 00:00:00 2001 From: hmo Date: Thu, 30 Jul 2026 10:03:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A0=94=E7=A9=B6Tab=E5=8A=A0=E8=BF=91?= =?UTF-8?q?5=E5=B9=B4=E5=8C=BA=E9=97=B4=E2=80=94=E2=80=94period=5Ftag?= =?UTF-8?q?=E4=BD=93=E7=B3=BB+API/UI=E6=8C=89=E5=8C=BA=E9=97=B4=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=88=97=E8=A1=A8=E6=95=B0=E6=8D=AE(5=E5=B9=B4?= =?UTF-8?q?=E9=AA=8C=E8=AF=81v1.0=E7=8E=B0=E5=8E=9F=E5=BD=A2-14.9%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- strategy_lab.py | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/strategy_lab.py b/strategy_lab.py index 5ca4ec37..900d9678 100644 --- a/strategy_lab.py +++ b/strategy_lab.py @@ -680,7 +680,7 @@ def has_breakout_dna(bars, i, lookback=10): return False -def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=True, universe='all'): +def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=True, universe='all', period_tag='2y'): strat = get_strategy(strategy_version) cfg = strat['config'] entry_cfg, exit_cfg = cfg['entry'], cfg['exit'] @@ -1059,6 +1059,7 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T 'strategy_name': strat['name'], 'market': universe, 'period': f"{start_date} ~ {end_date}", + 'period_tag': period_tag, 'capital': capital, 'total_stocks_screened': screened, 'scored_events': scored_n, @@ -1418,6 +1419,10 @@ def init_table(): conn.execute("ALTER TABLE strategy_research ADD COLUMN market TEXT DEFAULT 'all'") except sqlite3.OperationalError: pass + try: + conn.execute("ALTER TABLE strategy_research ADD COLUMN period_tag TEXT DEFAULT '2y'") + except sqlite3.OperationalError: + pass conn.commit() conn.close() @@ -1427,12 +1432,12 @@ def save_result(strat, result): conn = sqlite3.connect(DB_PATH) conn.execute(""" INSERT INTO strategy_research (version, name, summary, hypothesis, parent, - config_json, results_json, period, created_at, market) - VALUES (?,?,?,?,?,?,?,?,?,?) + config_json, results_json, period, created_at, market, period_tag) + VALUES (?,?,?,?,?,?,?,?,?,?,?) """, (strat['version'], strat['name'], strat['summary'], strat['hypothesis'], strat.get('parent'), json.dumps(strat['config'], ensure_ascii=False), json.dumps(result, ensure_ascii=False), result['period'], - datetime.now().strftime('%Y-%m-%d %H:%M:%S'), result.get('market', 'all'))) + datetime.now().strftime('%Y-%m-%d %H:%M:%S'), result.get('market', 'all'), result.get('period_tag', '2y'))) conn.commit() conn.close() @@ -1448,18 +1453,29 @@ def save_analysis(version, analysis): conn.close() -def list_strategies(): +def list_strategies(period_tag=None): init_table() conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row - # 每个 (version, market) 组合取最新一条 - rows = conn.execute(""" - SELECT sr.* FROM strategy_research sr - INNER JOIN (SELECT version, COALESCE(market,'all') as mkt, MAX(id) as max_id - FROM strategy_research GROUP BY version, COALESCE(market,'all')) latest - ON sr.id = latest.max_id - ORDER BY sr.version - """).fetchall() + if period_tag: + # 指定区间:每个 (version, market) 取该区间最新一条 + rows = conn.execute(""" + SELECT sr.* FROM strategy_research sr + INNER JOIN (SELECT version, COALESCE(market,'all') as mkt, MAX(id) as max_id + FROM strategy_research WHERE COALESCE(period_tag,'2y')=? + GROUP BY version, mkt) latest + ON sr.id = latest.max_id + ORDER BY sr.version + """, (period_tag,)).fetchall() + else: + # 默认:每个 (version, market) 组合取最新一条 + rows = conn.execute(""" + SELECT sr.* FROM strategy_research sr + INNER JOIN (SELECT version, COALESCE(market,'all') as mkt, MAX(id) as max_id + FROM strategy_research GROUP BY version, COALESCE(market,'all')) latest + ON sr.id = latest.max_id + ORDER BY sr.version + """).fetchall() conn.close() out = [] for r in rows: