Files
MoFin/deploy/profile-scripts/fundamentals_refresh.py
T

54 lines
2.0 KiB
Python

#!/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()