From b0e6fa7dde3f1f95d7bfbdd84cf24e1c27d0a68e Mon Sep 17 00:00:00 2001 From: xxm Date: Tue, 18 Aug 2026 02:06:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ab=5Fresearch=5Fdaily=E9=9B=86=E6=88=90?= =?UTF-8?q?LLM=E2=80=94=E2=80=94LLM=E4=B8=BB=E5=AF=BC=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E7=A0=94=E7=A9=B6=E7=BB=93=E8=AE=BA(?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E8=96=84=E5=BC=B1/=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=E5=B0=9D=E8=AF=95/=E9=A2=84=E6=9C=9F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/ab_research_daily.py | 126 ++++++++++---------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/deploy/profile-scripts/ab_research_daily.py b/deploy/profile-scripts/ab_research_daily.py index 0debd37d..109c2504 100644 --- a/deploy/profile-scripts/ab_research_daily.py +++ b/deploy/profile-scripts/ab_research_daily.py @@ -1,92 +1,94 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -"""ab_research_daily.py — AB路线每日LLM主导研究(老莫2026-08-18) -职责: -1. 读进化中心快照 evolution_center.json + strategy_regime_perf_by_period -2. 分析找出薄弱温区/薄弱策略(覆盖最少) -3. 记录到 strategy_research_log 表(每日一行:日期/发现/尝试/结论/产出策略) -4. 产出新策略(若验证通过)→ 注册为未激活状态(等老莫审查) +"""AB路线每日LLM主导研究 v2(老莫2026-08-18) +在原规则化分析基础上,集成 LLM 生成深度研究结论(真正"LLM主导") +1. 读温区覆盖 + 进化中心 + B组候选 +2. LLM 分析薄弱环节 → 建议尝试 +3. 写 strategy_research_log 表 """ import sys, os, json, sqlite3 from datetime import datetime +sys.path.insert(0, "/home/hmo/MoFin/deploy/profile-scripts") DB = "/home/hmo/MoFin/data/mofin.db" CENTER = "/home/hmo/MoFin/data/evolution_center.json" def ensure_table(conn): - conn.execute(""" - CREATE TABLE IF NOT EXISTS strategy_research_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - log_date TEXT NOT NULL, - market TEXT, - weak_regime TEXT, - finding TEXT, - experiment TEXT, - result TEXT, - produced_strategy TEXT, - produced_verified INTEGER DEFAULT 0, - llm_model TEXT, - created_at TEXT - ) - """) + conn.execute("""CREATE TABLE IF NOT EXISTS strategy_research_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, log_date TEXT NOT NULL, market TEXT, + weak_regime TEXT, finding TEXT, experiment TEXT, result TEXT, + produced_strategy TEXT, produced_verified INTEGER DEFAULT 0, llm_model TEXT, created_at TEXT)""") conn.commit() def load_center(): - if not os.path.exists(CENTER): - return {} - try: - return json.load(open(CENTER)) - except: - return {} + if not os.path.exists(CENTER): return {} + try: return json.load(open(CENTER)) + except: return {} -def analyze(conn): - """结构化分析:温区覆盖薄弱点""" - weak = [] - findings = [] +def build_prompt(coverage, center): + """构造 LLM 研究 prompt""" + line = [] + line.append("你是MoFin策略研究员。分析当前策略覆盖,找出薄弱环节并给出研究建议。") + line.append("温区覆盖(trades>=30,2y):") + for c in coverage: + line.append(f"- {c['market']}/{c['regime']}: {c['count']}个策略") + bg = center.get("b_group") or [] + if bg: + line.append(f"B组候选: {len(bg)}条") + for b in bg[:3]: + line.append(f" - {str(b)[:80]}") + line.append("\n请输出:") + line.append("1. 最薄弱的温区/环节(策略匮乏或合格策略少)") + line.append("2. 具体研究建议(做什么尝试)") + line.append("3. 预期成果类型") + line.append("格式:发现|建议|预期") + return "\n".join(line) + +def analyze_llm(coverage, center): + """LLM 生成研究结论""" try: - rows = conn.execute(""" - SELECT market, regime, COUNT(DISTINCT strategy) as cnt - FROM strategy_regime_perf_by_period - WHERE period_tag='2y' AND trades >= 30 - GROUP BY market, regime - """).fetchall() - coverage = [{"market": r[0], "regime": r[1], "count": r[2]} for r in rows] - if coverage: - coverage.sort(key=lambda x: x["count"]) - weak = coverage[:2] - findings.append("策略覆盖最少的温区: " + "; ".join( - f"{c['market']}/{c['regime']}({c['count']}个策略)" for c in weak)) - # 补充:qual_overview 里合格策略少的 - center = load_center() - qo = center.get("qual_overview") or [] - if qo: - findings.append(f"合格策略总览: {len(qo)}条") + from llm_client import call_llm + prompt = build_prompt(coverage, center) + res = call_llm(prompt) + return str(res)[:400] if res else None except Exception as e: - findings.append(f"分析异常: {e}") - return findings, weak + return f"[LLM调用失败: {e}]" def main(): conn = sqlite3.connect(DB, timeout=30) conn.execute("PRAGMA busy_timeout=30000") ensure_table(conn) today = datetime.now().strftime("%Y-%m-%d") - exists = conn.execute("SELECT COUNT(*) FROM strategy_research_log WHERE log_date=?", (today,)).fetchone()[0] - if exists: - print(f"[AB研究] {today} 已有记录,跳过") - conn.close() - return - findings, weak = analyze(conn) - finding_text = "; ".join(findings) if findings else "无明显薄弱点(常规观察)" - weak_rg = (weak[0]["regime"] if weak else "") - weak_mkt = (weak[0]["market"] if weak else "a") + if conn.execute("SELECT COUNT(*) FROM strategy_research_log WHERE log_date=?", (today,)).fetchone()[0]: + print(f"[AB研究] {today} 已有记录"); conn.close(); return + # 读取覆盖 + rows = conn.execute("""SELECT market, regime, COUNT(DISTINCT strategy) as cnt + FROM strategy_regime_perf_by_period WHERE period_tag='2y' AND trades >= 30 + GROUP BY market, regime""").fetchall() + coverage = [{"market": r[0], "regime": r[1], "count": r[2]} for r in rows] + center = load_center() + # 基础规则发现 + findings = [] + weak = [] + if coverage: + c_sorted = sorted(coverage, key=lambda x: x["count"]) + weak = c_sorted[:2] + findings.append("覆盖最少的温区: " + "; ".join(f"{c['market']}/{c['regime']}({c['count']})" for c in weak)) + # LLM 深度分析 + if coverage: + llm_res = analyze_llm(coverage, center) + if llm_res: + findings.append("LLM分析: " + llm_res) + finding_text = "; ".join(findings) or "无明显薄弱点" + weak_rg = weak[0]["regime"] if weak else "" + weak_mkt = weak[0]["market"] if weak else "a" conn.execute( "INSERT INTO strategy_research_log (log_date, market, weak_regime, finding, experiment, result, produced_strategy, created_at) " "VALUES (?,?,?,?,?,?,?,?)", - (today, weak_mkt, weak_rg, finding_text, - "自动扫描温区覆盖+B组候选", "记录待LLM深度分析", "", + (today, weak_mkt, weak_rg, finding_text, "LLM主导温区覆盖+B组分析", "记录待验证", "", datetime.now().isoformat())) conn.commit() - print(f"[AB研究] {today} 已记录: {finding_text}") + print(f"[AB研究] {today} 记录完成 (LLM主导)") conn.close() if __name__ == "__main__":