feat: ab_research_daily集成LLM——LLM主导生成每日研究结论(发现薄弱/建议尝试/预期)

This commit is contained in:
xxm
2026-08-18 02:06:57 +08:00
parent 255d901270
commit b0e6fa7dde
+64 -62
View File
@@ -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>=302y):")
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__":