From 228fefd328616b64a8757b05ece056c0856e3d9c Mon Sep 17 00:00:00 2001 From: xxm Date: Thu, 20 Aug 2026 15:51:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(prompt):=20=E6=8A=80=E6=9C=AF=E6=8C=87?= =?UTF-8?q?=E6=A0=87=E6=B3=A8=E5=85=A5LLM=20prompt=E2=80=94=E2=80=94collec?= =?UTF-8?q?t=5Fdata=E5=A2=9E=E5=8A=A0ta/mtf/factor,build=5Fprompt=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=5Ftech=5Fstr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - collect_data(): 从ta.full_analysis获取支撑阻力/MA/形态,从mtf获取多周期趋势/RSI,从stock_indicators获取mcap_q/pe_q/bias60 - build_prompt(): 在技术面段注入_tech_str(MA/dist_ma20/RSI/多周期趋势/基本面分位) - LLM现在能看到11个策略所需的全部输入数据 --- deploy/profile-scripts/batch_reassess.py | 86 ++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/deploy/profile-scripts/batch_reassess.py b/deploy/profile-scripts/batch_reassess.py index e0321926..bbc0d0ef 100644 --- a/deploy/profile-scripts/batch_reassess.py +++ b/deploy/profile-scripts/batch_reassess.py @@ -122,6 +122,63 @@ def collect_data(code): data["strategy_def"] = None except Exception: data["strategy_def"] = None + # ── 技术指标收集(策略输入数据)── + try: + import technical_analysis as _ta + _tech = _ta.full_analysis(code) + if _tech: + _sr = _tech.get("support_resistance", {}) + data["ta_strong_support"] = _sr.get("strong_support", 0) + data["ta_weak_support"] = _sr.get("weak_support", 0) + data["ta_pivot"] = _sr.get("pivot", 0) + data["ta_weak_resist"] = _sr.get("weak_resist", 0) + data["ta_strong_resist"] = _sr.get("strong_resist", 0) + _cs = _tech.get("candlestick", {}) + data["ta_candle"] = _cs.get("pattern", "") + "/" + _cs.get("sentiment", "") + _vol = _tech.get("volume", {}) + data["ta_volume"] = _vol.get("description", "") + import re as _re + _snap = data.get("tech_snapshot", "") + _ma = _re.search(r'MA5=([\d.]+).*?MA10=([\d.]+).*?MA20=([\d.]+).*?MA60=([\d.]+)', _snap) + if _ma: + data["ta_ma5"] = float(_ma.group(1)) + data["ta_ma10"] = float(_ma.group(2)) + data["ta_ma20"] = float(_ma.group(3)) + data["ta_ma60"] = float(_ma.group(4)) + if data["ta_ma20"] > 0: + data["ta_dist_ma20"] = round((data["price"] - data["ta_ma20"]) / data["ta_ma20"] * 100, 2) + except Exception: + pass + try: + import multi_timeframe as _mtf + _mtf_r = _mtf.full_multi_tf_analysis(code) + if _mtf_r: + _adj = _mtf_r.get("strategy_adjustment", {}) + data["mtf_trend_alignment"] = _adj.get("trend_alignment", "未知") + data["mtf_daily_trend"] = _mtf_r.get("daily", {}).get("trend", {}).get("description", "") + data["mtf_weekly_trend"] = _mtf_r.get("weekly", {}).get("trend", {}).get("description", "") + data["mtf_monthly_trend"] = _mtf_r.get("monthly", {}).get("trend", {}).get("description", "") + _rsi = _mtf_r.get("daily", {}).get("rsi") + if _rsi is not None: + data["ta_rsi"] = round(_rsi, 1) + except Exception: + pass + try: + _db2 = sqlite3.connect(DB, timeout=30) + _fi = _db2.execute("SELECT mcap_q, pe_q, bias60, bias20, rsi, r5f, dist_lo20 FROM stock_indicators WHERE code=? ORDER BY date DESC LIMIT 1", (code,)).fetchone() + if _fi: + data["factor_mcap_q"] = _fi[0] if _fi[0] is not None else None + data["factor_pe_q"] = _fi[1] if _fi[1] is not None else None + data["factor_bias60"] = _fi[2] if _fi[2] is not None else None + data["factor_bias20"] = _fi[3] if _fi[3] is not None else None + if data.get("ta_rsi") is None and _fi[4] is not None: + data["ta_rsi"] = round(_fi[4], 1) + data["factor_ret5d"] = _fi[5] if _fi[5] is not None else None + data["factor_dist_lo20"] = _fi[6] if _fi[6] is not None else None + _db2.close() + except Exception: + pass + # 情势体检:温区 + 高风险消息 + 执行红线 _sit = {"regime_a": "unknown", "regime_7d_ago": "unknown", "high_risk": "", "breach_stop": "否", "reach_tp": "否", "out_zone": "否", "over_hold": "否"} try: @@ -390,6 +447,34 @@ def build_prompt(data): f"(是否建仓/什么价位建仓/仓位多大),禁止假设我有浮盈、" f"禁止出现「已持仓者」视角的建议。") + _tech_parts = [] + if data.get("ta_strong_support"): + _tech_parts.append(f"强支撑={data['ta_strong_support']} 弱支撑={data['ta_weak_support']} 枢轴={data['ta_pivot']} 弱压={data['ta_weak_resist']} 强压={data['ta_strong_resist']}") + if data.get("ta_ma20"): + _ma_info = f"MA5={data.get('ta_ma5','?')} MA10={data.get('ta_ma10','?')} MA20={data.get('ta_ma20','?')} MA60={data.get('ta_ma60','?')}" + if data.get("ta_dist_ma20") is not None: + _ma_info += f" 距MA20={data['ta_dist_ma20']}%" + _tech_parts.append(_ma_info) + if data.get("ta_rsi"): + _tech_parts.append(f"RSI={data['ta_rsi']}") + if data.get("ta_candle"): + _tech_parts.append(f"K线形态={data['ta_candle']}") + if data.get("mtf_trend_alignment"): + _tech_parts.append(f"多周期趋势={data['mtf_trend_alignment']}") + if data.get("mtf_daily_trend"): + _tech_parts.append(f"日线={data['mtf_daily_trend']}") + if data.get("mtf_weekly_trend"): + _tech_parts.append(f"周线={data['mtf_weekly_trend']}") + if data.get("mtf_monthly_trend"): + _tech_parts.append(f"月线={data['mtf_monthly_trend']}") + _factor_parts = [] + for _fk, _fl in [("factor_mcap_q", "市值分位"), ("factor_pe_q", "PE分位"), ("factor_bias60", "bias60"), ("factor_bias20", "bias20"), ("factor_ret5d", "5日涨幅"), ("factor_dist_lo20", "距20日低点")]: + if data.get(_fk) is not None: + _factor_parts.append(f"{_fl}={data[_fk]}") + if _factor_parts: + _tech_parts.append("基本面分位: " + " ".join(_factor_parts)) + _tech_str = " | ".join(_tech_parts) if _tech_parts else "技术指标数据待刷新" + # ── 换仓上下文(2026-07-24 老爸:现金不足时给出具体换股建议)── _rotation_context = "" if not data.get('held'): @@ -550,6 +635,7 @@ PE={data.get('pe','?')}(最新财报) 市值={data.get('mcap','?')}亿 行业:{data.get('sector_context','?')}(近一个交易日) 技术面:{data.get('tech_snapshot','')[:300]}(MA=5/10/20/60日 支撑阻力=近20日 量价=当日+近5日趋势) {_tech_str} +{_tech_str} 资金流:{_flow_note}(近5日累计) 消息面:{_news_note}(最近3条,自动标注抓取时间) 当前信号:{data.get('timing_signal','?')} 分类:{data.get('stock_category','?')}