diff --git a/__pycache__/strategy_lifecycle.cpython-312.pyc b/__pycache__/strategy_lifecycle.cpython-312.pyc index 071be1b..6cc3c36 100644 Binary files a/__pycache__/strategy_lifecycle.cpython-312.pyc and b/__pycache__/strategy_lifecycle.cpython-312.pyc differ diff --git a/strategy_lifecycle.py b/strategy_lifecycle.py index dbce59d..4a0f6bf 100644 --- a/strategy_lifecycle.py +++ b/strategy_lifecycle.py @@ -1031,8 +1031,9 @@ def enrich_timing_signal(base_signal, macro_desc="", sector_note="", profit_pct=0, stock_category="", is_new_entry=False, fundamentals=None, news_sentiment=None, timing_signal_override=None, - portfolio_context=None): # 新增参数 - """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险 + portfolio_context=None, + rr_ratio=0): # 2026-06-24 新参:盈亏比约束 + """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险+盈亏比 返回 (enriched_signal, factors_list) - enriched_signal: 可读的多因子信号描述 @@ -1137,6 +1138,14 @@ def enrich_timing_signal(base_signal, macro_desc="", sector_note="", elif portfolio_context.get('is_high_weak'): factors.append("组合风险信号") + # 5.7 盈亏比因子(2026-06-24 新增——RR<1.5降级买入信号) + if rr_ratio > 0: + if rr_ratio < 1.5: + factors.append(f"RR{rr_ratio}过低") + elif rr_ratio >= 3: + factors.append(f"RR{rr_ratio}") + # 1.5~3之间:中性,不特别标注 + # 如果没有足够因素,返回信号不充分 if not factors: return "信号不充分", [] @@ -1155,6 +1164,14 @@ def enrich_timing_signal(base_signal, macro_desc="", sector_note="", signal_found = f break clean_signal = signal_found if signal_found else "信号不充分" + + # 6. RR约束降级(2026-06-24 新增) + # 买入/加仓信号但RR<1.5 → 降级为"信号不充分" + buy_signals = {"买入", "加仓"} + if clean_signal in buy_signals and 0 < rr_ratio < 1.5: + clean_signal = "信号不充分" + factors.append("RR过低降级") + return clean_signal, factors @@ -1196,6 +1213,7 @@ def reassess_with_context(code, name, price, cost, shares, current_action, fundamentals=fund, news_sentiment=news_sentiment, portfolio_context=_get_portfolio_risk_state(), + rr_ratio=result.get("rr_ratio", 0), ) result["timing_signal"] = enriched result["signal_factors"] = factors @@ -1529,6 +1547,7 @@ def regenerate_all(stdout=True): is_new_entry=(source == "watchlist"), fundamentals=fund, news_sentiment=news_sentiment, + rr_ratio=result.get("rr_ratio", 0), ) result["timing_signal"] = enriched diff --git a/system_health_check.py b/system_health_check.py index 6262e36..450e812 100644 --- a/system_health_check.py +++ b/system_health_check.py @@ -14,7 +14,7 @@ PORTFOLIO_PATH = DATA_DIR / "portfolio.json" EVENTS_PATH = DATA_DIR / "price_events.json" EVALUATION_PATH = DATA_DIR / "evaluation.json" ACCURACY_PATH = DATA_DIR / "accuracy_stats.json" -CRON_JOBS = "/home/hmo/.hermes/cron/jobs.json" +CRON_JOBS = "/home/hmo/.hermes/profiles/position-analyst/cron/jobs.json" POSITION_CRON = "/home/hmo/.hermes/profiles/position-analyst/cron/jobs.json" def check(ok, msg):