feat(prompt): 技术指标注入LLM prompt——collect_data增加ta/mtf/factor,build_prompt增加_tech_str

- 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个策略所需的全部输入数据
This commit is contained in:
xxm
2026-08-20 15:51:42 +08:00
parent 118bcebb1b
commit 228fefd328
+86
View File
@@ -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','?')}