#!/usr/bin/env python3 """data_governance.py — MoFin 数据治理 (no_agent) 1. holding_strategies 去重归档 2. 检查缺失策略的持仓 3. 报告数据健康状况 """ import json, sqlite3 from pathlib import Path from datetime import datetime from mo_data import read_portfolio, read_decisions, read_watchlist BASE = Path("/home/hmo/MoFin") DATA = BASE / "data" DB_PATH = DATA / "mofin.db" DECISIONS_PATH = DATA / "decisions.json" def clean_holding_strategies(conn): """归档旧策略,只保留每只股票最新一条""" codes = conn.execute( "SELECT code, COUNT(*) as cnt, MAX(created_at) as latest " "FROM holding_strategies GROUP BY code HAVING cnt > 1" ).fetchall() total_archived = 0 for code, cnt, latest in codes: # 标记除了最新一条以外的所有记录为已归档 conn.execute( "UPDATE holding_strategies SET superseded_at=? " "WHERE code=? AND created_at 0 and price > 0: loss = (price - cost) / cost * 100 if loss < -25: deep.append((d.get("name",""), d["code"], loss, d.get("stop_loss",0))) if deep: print(f"\n🔴 {len(deep)}只深套(>-25%):") for name, code, loss, sl in deep: print(f" {name}({code}): {loss:.0f}% 止损={sl}") else: print("\n✅ 无深套持仓") conn.close() if __name__ == "__main__": main()