From 16b9b6832dafca392f158499ef10abdd9dae8814 Mon Sep 17 00:00:00 2001 From: agentson Date: Mon, 23 Feb 2026 12:30:51 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20BULLISH=20confidence=20=EC=9E=84?= =?UTF-8?q?=EA=B3=84=EA=B0=92=2075=EB=A1=9C=20=EB=B3=B5=EC=9B=90=20(#205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CLAUDE.md 규칙 개정에 따라 BULLISH 시장은 75로 유지. 시장 전망별 임계값: BEARISH=90, NEUTRAL=80, BULLISH=75. Co-Authored-By: Claude Sonnet 4.6 --- src/main.py | 3 ++- tests/test_main.py | 14 ++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main.py b/src/main.py index 6beb178..5951617 100644 --- a/src/main.py +++ b/src/main.py @@ -505,8 +505,9 @@ async def trading_cycle( outlook = playbook.market_outlook if outlook == MarketOutlook.BEARISH: min_confidence = 90 + elif outlook == MarketOutlook.BULLISH: + min_confidence = 75 else: - # BULLISH/NEUTRAL: use base threshold (min 80 per CLAUDE.md non-negotiable rule) min_confidence = base_threshold if match.confidence < min_confidence: logger.info( diff --git a/tests/test_main.py b/tests/test_main.py index ccafd90..f00467f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -2729,18 +2729,13 @@ class TestMarketOutlookConfidenceThreshold: assert call_args.kwargs["action"] == "BUY" @pytest.mark.asyncio - async def test_bullish_outlook_uses_same_threshold_as_neutral( + async def test_bullish_outlook_lowers_buy_confidence_threshold( self, mock_broker: MagicMock, mock_market: MagicMock, mock_telegram: MagicMock, ) -> None: - """BUY with confidence 77 should be suppressed even in bullish market. - - CLAUDE.md non-negotiable rule: confidence < 80 → force HOLD. - BULLISH outlook does NOT lower the threshold below 80. - (issue #205) - """ + """BUY with confidence 77 should proceed in bullish market (threshold=75).""" engine = MagicMock(spec=ScenarioEngine) engine.evaluate = MagicMock(return_value=self._make_buy_match_with_confidence(77)) playbook = self._make_playbook_with_outlook("bullish") @@ -2772,8 +2767,7 @@ class TestMarketOutlookConfidenceThreshold: call_args = decision_logger.log_decision.call_args assert call_args is not None - # confidence 77 < 80 → must be suppressed to HOLD - assert call_args.kwargs["action"] == "HOLD" + assert call_args.kwargs["action"] == "BUY" @pytest.mark.asyncio async def test_bullish_outlook_suppresses_very_low_confidence_buy( @@ -2782,7 +2776,7 @@ class TestMarketOutlookConfidenceThreshold: mock_market: MagicMock, mock_telegram: MagicMock, ) -> None: - """BUY with confidence 70 should be suppressed even in bullish market (threshold=80).""" + """BUY with confidence 70 should be suppressed even in bullish market (threshold=75).""" engine = MagicMock(spec=ScenarioEngine) engine.evaluate = MagicMock(return_value=self._make_buy_match_with_confidence(70)) playbook = self._make_playbook_with_outlook("bullish")