diff --git a/deploy/profile-scripts/fundamentals_refresh.py b/deploy/profile-scripts/fundamentals_refresh.py new file mode 100644 index 00000000..89d19a8d --- /dev/null +++ b/deploy/profile-scripts/fundamentals_refresh.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""fundamentals_refresh.py — 腾讯实时基本面批量刷新 stock_fundamentals +字段映射(实测600519): 39=PE(TTM) 44=总市值(亿) 45=流通市值(亿) 46=PB +EPS(TTM) = 现价/PE。限速0.15s/只。 +""" +import sqlite3, subprocess, time + +DB = "/home/hmo/MoFin/data/mofin.db" + +def prefix(code): + c = str(code) + if len(c) == 5: + return "hk" + return "sh" if c.startswith(("6", "9")) else "sz" + +def main(): + conn = sqlite3.connect(DB) + codes = [r[0] for r in conn.execute( + "SELECT DISTINCT code FROM holding_strategies WHERE status='active'")] + print(f"刷新 {len(codes)} 只基本面...") + ok = fail = 0 + for i, code in enumerate(codes, 1): + try: + r = subprocess.run(["curl", "-s", f"http://qt.gtimg.cn/q={prefix(code)}{code}"], + capture_output=True, timeout=8) + parts = r.stdout.decode("gbk", errors="ignore").split("~") + if len(parts) < 47 or not parts[3]: + fail += 1 + continue + price = float(parts[3]) + pe = float(parts[39]) if parts[39] else 0 + mcap_t = float(parts[44]) if parts[44] else 0 + mcap_f = float(parts[45]) if parts[45] else 0 + pb = float(parts[46]) if parts[46] else 0 + eps = round(price / pe, 2) if pe > 0 else 0 + conn.execute( + "INSERT OR REPLACE INTO stock_fundamentals (code, pe, pb, eps, mcap_total, mcap_flow, updated_at) " + "VALUES (?,?,?,?,?,?,datetime('now','localtime'))", + (code, pe, pb, eps, mcap_t, mcap_f)) + ok += 1 + except Exception: + fail += 1 + if i % 30 == 0: + conn.commit() + print(f" {i}/{len(codes)} ok={ok} fail={fail}") + time.sleep(0.15) + conn.commit() + total = conn.execute("SELECT COUNT(*) FROM stock_fundamentals").fetchone()[0] + print(f"完成: ok={ok} fail={fail}, 表总数={total}") + conn.close() + +if __name__ == "__main__": + main()