Real errors fixed (all verified by manual run): - price_monitor.py: shares None -> TypeError at L584 (now completes 3m7s, full 39-stock reassess + zone triggers + Dad push) - market_insight.py: net_inflow None -> TypeError at L142 (now 0.3s, 5 insights) - promote_candidates.py: add busy_timeout=30s (DB lock under concurrent writes) - premarket_full_review.py: 12-dim analysis now detached background launch (was doomed by cron 120s script timeout no matter what) Systemic: - HERMES_CRON_SCRIPT_TIMEOUT=600 drop-in for both gateway services (fixes mofin_health SIGTERM, market_watch timeout, memory_guardian timeout) - sync_profile_scripts.sh: re-hardlink deploy->profile scripts after every deploy (scp replaces files = new inode = broken hardlink = cron silently runs stale code; this caused promote to keep failing after my first fix) Monitoring false-alarm fixes (the '花瓶' problem): - mofin_health.py: legacy JSONs that migrated to DB (multi_tf_cache/ macro_context/market/live_prices/price_history/macro_risk_state) no longer warn 'no readers'; marked as migrated - NEW db_freshness section: real pipeline health from DB tables (mtf_cache 0.4h / macro_context_log 2h / market_snapshots 2h / live_prices 0.4h / price_events.json 0.4h — ALL HEALTHY) - price_events freshness reads live JSON store (DB table is legacy) - market.json placeholder created (13+ scripts have fallback paths) Investigation notes: wiki-self-growth 03:04 key1 429 predates full key6 activation on default gateway; current 8642 verified on key6 and working. Weekend 'Blocked' jobs verified fixed (vacuum_state_db passes).
60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
||
"""premarket_full_review.py — 盘前全量重评
|
||
|
||
执行顺序:
|
||
1. regenerate_all() 全量技术参数重评(持仓+自选)
|
||
2. batch_reassess.py --type holding --today 持仓12维LLM分析(每日强制刷新)
|
||
3. watchlist_auto_exit() 自选退出检查
|
||
4. 输出摘要
|
||
|
||
调度:交易日 08:10(A股09:30开盘)
|
||
"""
|
||
import sys, os, json
|
||
sys.path.insert(0, '/home/hmo/MoFin')
|
||
|
||
# Step 1: 全量技术参数重评
|
||
print("=" * 50)
|
||
print("📊 盘前全量重评开始")
|
||
print("=" * 50)
|
||
from strategy_lifecycle import regenerate_all
|
||
result = regenerate_all(stdout=True)
|
||
print(f"\n重评完成: {result.get('ok',0)}/{result.get('total',0)}成功")
|
||
|
||
# Step 1.5: 持仓 12 维 LLM 深度分析——后台分离执行(12-40分钟,不能阻塞 cron 的 120s 超时)
|
||
print("\n" + "=" * 50)
|
||
print("🧠 持仓12维LLM分析(后台分离启动)")
|
||
print("=" * 50)
|
||
import subprocess as _sp
|
||
analysis_result = {"mode": "detached"}
|
||
try:
|
||
_log = open("/tmp/holdings_12d_daily.log", "a")
|
||
_sp.Popen(
|
||
["python3", "/home/hmo/.hermes/profiles/position-analyst/scripts/batch_reassess.py",
|
||
"--type", "holding", "--today"],
|
||
stdout=_log, stderr=_log, start_new_session=True)
|
||
print(" ✅ 12维分析已后台启动,日志: /tmp/holdings_12d_daily.log(结果落DB,不阻塞盘前流程)")
|
||
except Exception as e:
|
||
print(f" ⚠️ 12维分析启动失败: {e}")
|
||
analysis_result = {"mode": "detached", "error": str(e)[:100]}
|
||
|
||
# Step 2: 自选退出
|
||
print("\n" + "=" * 50)
|
||
print("🔍 自选退出检查")
|
||
print("=" * 50)
|
||
from scripts.watchlist_auto_exit import main as auto_exit
|
||
exited = auto_exit(dry_run=False)
|
||
|
||
# Step 3: 写入摘要供开盘简报引用
|
||
summary = {
|
||
"premarket_at": __import__('datetime').datetime.now().isoformat(),
|
||
"reassess": result,
|
||
"llm_analysis_12d": analysis_result,
|
||
"auto_exit": [{"code": c, "name": n, "reason": r} for c, n, s, r in exited],
|
||
"total_kept": result.get('total', 0) - len(exited),
|
||
}
|
||
os.makedirs("/tmp/mofin_premarket", exist_ok=True)
|
||
with open("/tmp/mofin_premarket/summary.json", "w") as f:
|
||
json.dump(summary, f, ensure_ascii=False, indent=2)
|
||
|
||
print(f"\n✅ 盘前重评完毕")
|