From 4aa884ed31edfe7be488561403d240890bdbf694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Wed, 24 Jun 2026 17:50:49 +0800 Subject: [PATCH] =?UTF-8?q?TODO=E4=B8=80=E5=8F=A3=E6=B0=944/6=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T001: enrich_timing_signal RR参数降级 T002: price_monitor已有XMPP推送(514-525行) T003: 自选扫描加15:00轮次 T005: 策略数据口径理解完成(非bug) T006: trigger同步(已完成) T004: 截图叙事清理待设计 system_health_check.py CRON_JOBS路径修正→正确的profile路径 --- .../strategy_lifecycle.cpython-312.pyc | Bin 69955 -> 70658 bytes strategy_lifecycle.py | 23 ++++++++++++++++-- system_health_check.py | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/__pycache__/strategy_lifecycle.cpython-312.pyc b/__pycache__/strategy_lifecycle.cpython-312.pyc index 071be1b999abfff2f2c8d65e0f20349b9845873a..6cc3c3656f42c7ba74c710934695a083ae3c1b25 100644 GIT binary patch delta 2739 zcmZuyeNa@_6~FiG2OqnzyWwN`(q$n8Hil7%7AX1PEg%Am3MfkCn@b36UC48zi1+zo zk}4?1)thEbfYwQxDN~%OnN275FU#2e(Q&F$+r~=9NQgBUHA$P++End%Z+WmV?#!Nh z@A>$hbI&>VytD6VUmMd#pNoo$MDTOHSJ>^%{4jdvyuQVb(1G^A-SdYyO*@TeA6|@O zo_GWMU~&y^XH%2+HO9umz|@~=!*P3HB9?PK!AS5pCqp76@@)FD zm9>0n#7=o9m4?WQyO3Byi-Z(!c~Bc6sc0Mr_XN935E7yvC6h|X>SsVratc3`iiP|T z9p@7JCqrb#<5*e*9_o1Ba2S!2#YRD!VKk}%$J-RgykHB_;g>kIkcLM|0U?G1h(-mX zgr<-tdB^tMPGYT}W#DFZ;InkTg=UfbMBsxu=fOlTmU?Z$5D+4*bQuJgK@C9LXd2LV z(02s&X(`x5F!2++rIL{O8mtA3GB!D7jp`u!dG0!ylm22zJ<91iA(eDW>xPk3PF@<; zlCDv0(2^ay7Mob+F;FY%c0+9iJ#kYjc<&n3fX10?JpK`Dow5Q=oc@DuEyJWnsr-ZK zX!~}EuwIT3xSoYQ%@jD&12^miOK6&x)zG9eR{eP*78t&2)9fH#d5w96>{R7s*NFZD zELN~HpBFm%)Z7aZ)Is`WH&O-ZlN0L+SDncm_Vv|d_S{TlSOr<5q#eR#o?8Y^tdt{X z2WM7gyU5dG6|MAPAxElI^Xkq+2sl|%rMO<@i5t9??8Z!O#BQZalSn`Nb|xW->``Nc z)KH~7(W5$Xqh~cFBY_?MqA*beh;?dtLBf%};>J!SR+(pNP72)6z~W~4 zc2W5u?O(_6mt}a1a%*{DZIyS6239@Y8XQY~Sg>Lw)z6>IaN0`K+POZ?orDm`b+TOE zd$@KEBk=`k!PbNkO@niGzYZaHgQ^ca#X{UBZJP72*=Ur(9s{sCa+sNB6D@B_TXtfx zfi}P!JOX$1v4UB<&A0Hfm6_2<8_7|*bA`vGitZ{l5gUVj?C@;5sY1;mMn2=vbL`A) z8BCs+FQmmv%|s)o+*_@7Q+EyHFC=l@n`QfDOtqxV#G@!$=N0SNw}u$NnVyX`leg3c zAU`2_C*NihH{-CPz;51*H!YQ#zREB>+GFy(N8%sRh%MeF{v0jdWHkb6S?YFN8 z-O7IdRWshkGH$uUR*9{&wYwcImhucW(kL2D-UaYBiiEh3K|4&N;Eh?S5$Fhw20A(# zrX~Q&(Z;^MwMAnZI?c*&+YRG~a60lT-%{D}<47nGn_##n8#bsxN=@t+w+qvc zNloxJ^$TeA2nJ8n-X>r4P*ZTnba!l!&Wt;@+9rr>c}Qf(6>H85eG~k3H>taY_2fHh z4KSKV$3xmVbpM?d_@{xhcdE22u0(ctyu$A0{vJ<9KeuY{6|=Y1-O=1D^t{;RRk&Be zyh2xJXNM3l|MO>9C*;BVVW+>7FdxYOR~W{*tmxn8G{UbDi@3WT6SnJajlNR;NVozQ z?us}`h?fsmnIy<05y%y-jLBU0_TfBs{@yh(`_+G2nYmZT%->rL`$44`9>LGrs$D z&M(DJv$Dt9#!Dhj>^WussPuGNp!`(f#f;~{tYOlewg~ZZ_R5cRr`iG$V|y;HDD-JB z#$`^Lvo71x2TFa8Nn^^#16ur0AKn^Sr_-(eM)>%M0e4~C?7wHkh1`0B{|8a{=hAPX zpsyE5;pi-0B|VGI=EO_++TVqT%hb#P=Ug6dX826hMqc+Ku4o{&)P{anx9L!$;%YvuVJq8h zNWZ!Ivyjh#EMOfMZ0ua8=|w!$VR&vOJluN*_B2D}i5Js*gPpjRWLm3*BF|8ab&H6P z!DYK{9a*n@6E+Z0(;ypL4F^FgqH$Q*{!+H> zMul;cw-Bq5Og1YRDI>|7T7X!aEox^hZGu$hn}i7sXQOWBWxs_OGquj5geP02vRY1> zOQcOl$?|NRiv;%hO#^IUU*9YT^*nYPouJ}plF5BYdM$b2)F&&`BuFJbL6ysGyi|f7)y53uE0@S+|iHur8~nogKUXGs|zh54Slvw(W=xWXJ;*^)x-yw=Nx&a7$qaEg{|Qh?NmJo$SWf1 zo;t;3#n#rSWu>;Xv9G0#tm$@%eU~>AD`X+NXsXE5R2(9pc48pATlI+3$R6FcLnDjr z%r?%YbICiKIcXki`YknzI!LY;M_8KAHgr0m92=9)zUxeb@W4j>VdA9<26r6tLRvvU z>F*X0ZCKZZ{ihf_RnW9m{1)DutjYyNuIzpMDjqm#kvw1<4IE9wbJkXY^2}%FQCy*5jM%GL(@Nq|^=$om3)v%69KyKnC8RfNZ6_a)oFg9|)`zu#^AFKy z_4g8^hiJ0{_tH)O>p!L6KVhvpY1vRT=Q4ka77vXjLvRO0v6#8aGfd}l; z13P506I}^Hq2#9O`yNA0bcBD77M<*7d0lzwdt^6WOTz$&o5N?wUGHu-2lj<`Zvy+F z%NAh(u8xx`+3_y>A~yz>Iw-JxDhltf)X+URXhYYLkF=fu*Y5=a`oUgU;X^BY8d~yj zjy`nuug}1EF~Tp_)z+>S*~Z5*Obh+_I0C@Mx}Th4r~dK6a+dRSfuU6SDa;D(eJTMP z-Mt<1*rDz#D9g^Zv6%IW!M1Ipt!3%LP=08aTcHIB~ 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):