From 7f65f0cbd25573723921803bf85e75364f38982e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Fri, 10 Jul 2026 11:45:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B9=9D=E7=BB=B4=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=85=A8=E9=9D=A2=E5=8D=87=E7=BA=A7-=E8=B5=84=E9=87=91?= =?UTF-8?q?=E6=B5=81+=E6=B6=88=E6=81=AF=E9=9D=A2=E5=85=A5prompt+=E4=BA=A4?= =?UTF-8?q?=E5=8F=89=E7=BB=BC=E5=90=88+capital=5Fflow=5Fcollector=E4=BF=AE?= =?UTF-8?q?mo=5Fdata=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/batch_reassess.py | 50 +++++++++++++++++++++++++++++-- scripts/capital_flow_collector.py | 17 ++++++----- scripts/per_stock_reassess.py | 45 ++++++++++++++++++++++++++-- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/scripts/batch_reassess.py b/scripts/batch_reassess.py index 1fc587e6..9d378251 100644 --- a/scripts/batch_reassess.py +++ b/scripts/batch_reassess.py @@ -84,14 +84,57 @@ def build_prompt(data): cash = 321271 # 可用现金(从DB读取) total = 952879 # 总资产 + # 拉取资金流数据 + _flow_note = "暂无资金流数据" + try: + import sqlite3 as _sq, json as _j + _db = _sq.connect("/home/hmo/MoFin/data/mofin.db") + _fr = _db.execute("SELECT cache_json FROM capital_flow_cache ORDER BY id DESC LIMIT 1").fetchone() + if _fr and _fr[0]: + _fc = _j.loads(_fr[0]) + _stocks = _fc.get("stocks", {}) + _s = _stocks.get(data['code'], {}) + if _s and _s.get("analysis"): + _a = _s["analysis"] + _net = _a.get("net_flow", 0) + _main = _a.get("main_force", 0) + _retail = _a.get("retail_flow", 0) + _trend = _a.get("trend", "中性") + _flow_note = f"净流入{_net:.0f}万 主力{_main:.0f}万 散户{_retail:.0f}万 趋势{_trend}" + _db.close() + except: + pass + + # 拉取近期消息面 + _news_note = "暂无近期消息" + try: + import sqlite3 as _sq + _db = _sq.connect("/home/hmo/MoFin/data/mofin.db") + _nr = _db.execute( + "SELECT summary, overall_sentiment, created_at FROM signal_news " + "WHERE (code=? OR sector LIKE ?) AND overall_sentiment IN ('利好','利空') " + "ORDER BY id DESC LIMIT 3", + (data['code'], f'%{data.get("name","")[:4]}%') + ).fetchall() + if _nr: + _news_note = " | ".join([f"{r[2][:10]} {r[1]} {r[0][:40]}" for r in _nr]) + _db.close() + except: + pass + return f"""你是一个资深A股分析师。请对{data['code']} {data.get('name','')}做一个完整的九维矩阵分析,并输出策略参数。 -当前数据: +⚠️ 重要:以下9个维度不是独立分析的,你必须交叉对比后给出综合结论。 +例如:如果消息面利好但资金流在流出,说明利好可能是出货;如果基本面强但技术面破位,说明估值可能还没到底。 + +当前数据(以下数据均来自实时API,禁止使用模型训练数据): 大盘:{data.get('macro','震荡')} 最新价:{data.get('price',0)} 涨跌:{data.get('change_pct','0')}% PE={data.get('pe','?')} 市值={data.get('mcap','?')}亿 行业:{data.get('sector_context','?')} -技术面:{data.get('tech_snapshot','')[:200]} +技术面:{data.get('tech_snapshot','')[:300]} +资金流:{_flow_note} +消息面:{_news_note} 当前信号:{data.get('timing_signal','?')} 分类:{data.get('stock_category','?')} 原策略:{(data.get('action','') or '')[:200]} @@ -99,7 +142,8 @@ PE={data.get('pe','?')} 市值={data.get('mcap','?')}亿 请严格按以下格式输出: -① 大盘×基本面 [一句话] +【交叉分析】用2-3句话说明哪些维度出现矛盾/共振,最关键的信号是什么 +① 大盘×基本面 [一句话,说明矛盾关系] ② 大盘×消息面 [一句话] ③ 大盘×技术面 [一句话] ④ 大盘×资金流 [一句话] diff --git a/scripts/capital_flow_collector.py b/scripts/capital_flow_collector.py index 2ba6e3da..adac6e51 100644 --- a/scripts/capital_flow_collector.py +++ b/scripts/capital_flow_collector.py @@ -11,8 +11,7 @@ from datetime import datetime from urllib.request import urlopen, Request from concurrent.futures import ThreadPoolExecutor, as_completed from threading import Semaphore -from mo_data import read_portfolio, read_decisions, read_watchlist -from mofin_db import get_conn, write_capital_flow_cache +from mofin_db import get_conn, write_capital_flow_cache, query_holdings, query_holdings_db, query_watchlist DATA_DIR = "/home/hmo/web-dashboard/data" CACHE_PATH = f"{DATA_DIR}/capital_flow_cache.json" @@ -134,13 +133,15 @@ def analyze_flow(flow_data): def main(): codes = set() - # 读取持仓+自选 + # 读取持仓+自选(从DB直接读,替代已删除的mo_data) try: - dec = mo_data.read_decisions() - for d in dec.get("decisions", []): - c = d.get("code", "") - if c: - codes.add(c) + import sqlite3 + _db = sqlite3.connect("/home/hmo/MoFin/data/mofin.db") + for row in _db.execute("SELECT DISTINCT code FROM holdings WHERE is_active=1").fetchall(): + if row[0]: codes.add(row[0]) + for row in _db.execute("SELECT DISTINCT code FROM holding_strategies WHERE status='active' AND decision_type='自选策略'").fetchall(): + if row[0]: codes.add(row[0]) + _db.close() except: pass diff --git a/scripts/per_stock_reassess.py b/scripts/per_stock_reassess.py index 75dbe920..dac9db4c 100644 --- a/scripts/per_stock_reassess.py +++ b/scripts/per_stock_reassess.py @@ -394,12 +394,53 @@ def main(): except: pass + # 拉取资金流数据 + _flow_note = "暂无资金流数据" + try: + _fdb = __import__('sqlite3').connect("/home/hmo/MoFin/data/mofin.db") + _fr = _fdb.execute("SELECT cache_json FROM capital_flow_cache ORDER BY id DESC LIMIT 1").fetchone() + if _fr and _fr[0]: + _fc = __import__('json').loads(_fr[0]) + _s = _fc.get("stocks", {}).get(code, {}) + if _s and _s.get("analysis"): + _a = _s["analysis"] + _flow_note = f"净流入{_a.get('net_flow',0):.0f}万 主力{_a.get('main_force',0):.0f}万 趋势{_a.get('trend','中性')}" + _fdb.close() + except: + pass + + # 拉取近期消息面 + _news_note = "暂无近期消息" + try: + _ndb = __import__('sqlite3').connect("/home/hmo/MoFin/data/mofin.db") + _nr2 = _ndb.execute( + "SELECT summary, overall_sentiment, created_at FROM signal_news " + "WHERE (code=? OR sector LIKE ?) AND overall_sentiment IN ('利好','利空') " + "ORDER BY id DESC LIMIT 3", + (code, f'%{entry.get("name","")[:4]}%') + ).fetchall() + if _nr2: + _news_note = " | ".join([f"{r[2][:10]} {r[1]} {r[0][:40]}" for r in _nr2]) + _ndb.close() + except: + pass + _prompt = f"""你是一个资深股票分析师。请对股票{code}做一个完整的9维矩阵分析。 -当前数据:大盘={_macro_desc or "震荡"} | PE/市值={_pe_val} {_pb_val} | 价格={price} 区间={entry.get("entry_low",0)}~{entry.get("entry_high",0)} 止损={entry.get("stop_loss",0)} 止盈={entry.get("take_profit",0)} RR={result.get("rr_ratio",entry.get("rr_ratio",0))} | 信号={result.get("timing_signal") or entry.get("timing_signal","")} | 行业={(result.get("sector_context") or entry.get("sector_context",""))[:50]} + +⚠️ 重要:9个维度必须交叉对比,找出矛盾/共振点,给出综合判断。 + +当前数据(实时API,禁止使用模型训练数据): +大盘={_macro_desc or "震荡"} | PE/市值={_pe_val} {_pb_val} | 价格={price} 区间={entry.get("entry_low",0)}~{entry.get("entry_high",0)} 止损={entry.get("stop_loss",0)} 止盈={entry.get("take_profit",0)} RR={result.get("rr_ratio",entry.get("rr_ratio",0))} | 信号={result.get("timing_signal") or entry.get("timing_signal","")} | 行业={(result.get("sector_context") or entry.get("sector_context",""))[:50]} 策略={(result.get("action") or entry.get("action",""))[:200]} 技术={(result.get("tech_snapshot") or entry.get("tech_snapshot",""))[:200]} +资金流={_flow_note} +消息面={_news_note} -格式:①大盘×基本面 ②大盘×消息面 ③大盘×技术面 ④大盘×资金流 ⑤行业×基本面 ⑥行业×消息面 ⑦行业×技术面 ⑧个股×基本面 ⑨个股×消息面 +格式: +【交叉分析】哪些维度矛盾/共振,关键信号 +① 大盘×基本面 ② 大盘×消息面 ③ 大盘×技术面 ④ 大盘×资金流 +⑤ 行业×基本面 ⑥ 行业×消息面 ⑦ 行业×技术面 +⑧ 个股×基本面 ⑨ 个股×消息面 最后必须输出: 【综合结论】(买入/关注/观望/卖出)