From 32203dcb2d06b93e4b6c81f9121b00531a91395e Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 06 六月 2025 18:43:07 +0800
Subject: [PATCH] bug修复

---
 strategy/data_analyzer.py |  122 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 121 insertions(+), 1 deletions(-)

diff --git a/strategy/data_analyzer.py b/strategy/data_analyzer.py
index 0895532..5b7acde 100644
--- a/strategy/data_analyzer.py
+++ b/strategy/data_analyzer.py
@@ -60,6 +60,24 @@
         return k_data[0]['amount']
 
     @classmethod
+    def get_yesterday_low_price(cls, k_data):
+        """
+        鑾峰彇鏄ㄦ棩鏈�浣庝环
+        @param k_data: K绾挎暟鎹垪琛�
+        @return: 鏄ㄦ棩鏈�楂樹环
+        """
+        return k_data[0]['low']
+
+    @classmethod
+    def get_yesterday_open_price(cls, k_data):
+        """
+        鑾峰彇鏄ㄦ棩寮�鐩樹环
+        @param k_data: K绾挎暟鎹垪琛�
+        @return: 鏄ㄦ棩鏈�楂樹环
+        """
+        return k_data[0]['open']
+
+    @classmethod
     def get_recent_days_high(cls, k_data, days):
         """
         鑾峰彇杩戝嚑涓氦鏄撴棩鐨勬渶楂樹环
@@ -149,6 +167,22 @@
         """
         return sum(
             1 for d in k_data[:days] if d['close'] <= cls.calculate_lower_limit_price(d["sec_id"], d["pre_close"]))
+
+    @classmethod
+    def get_recent_days_double_volume_date(cls, k_data, days):
+        """
+        鑾峰彇鏈�杩戝嚑涓氦鏄撴棩鐨勫�嶉噺鏃ユ湡
+        @param k_data: K绾挎暟鎹垪琛�
+        @param days: 浜ゆ槗鏃ユ暟閲�
+        @return: 鍊嶉噺鐨勬棩鏈�
+        """
+        k_datas: list = k_data[:days]
+        k_datas.reverse()
+        for i in range(1, len(k_datas)):
+            latest_volume = k_datas[i - 1]["volume"]
+            if k_datas[i]["volume"] > 2 * latest_volume:
+                return k_datas[i]["bob"]
+        return None
 
     @classmethod
     def get_first_limit_up_avg_premium(cls, k_data, days):
@@ -403,10 +437,96 @@
         reason_counts = {}
         special_reasons = constant.KPL_INVALID_BLOCKS
         if limit_up_data:
-            for _, date, reason in limit_up_data:
+            for _, date, reason, is_open, _blocks in limit_up_data:
+                if is_open:
+                    continue
                 if min_day <= date <= max_day and reason not in special_reasons:
                     reason_counts[reason] = reason_counts.get(reason, 0) + 1
         if not reason_counts:
             return []
         max_count = max(reason_counts.values())
         return [(reason, count) for reason, count in reason_counts.items() if count == max_count]
+
+    @classmethod
+    def get_limit_up_reasons(cls, limit_up_data_list, min_day, max_day, include_recommend_reason=False):
+        """
+        鑾峰彇鏈�杩戜竴娈垫椂闂寸殑娑ㄥ仠鍘熷洜
+        @param include_recommend_reason: 鏄惁鍖呭惈鎺ㄨ崘鍘熷洜
+        @param max_day:
+        @param limit_up_data_list:
+        @param min_day: 
+        @return: 
+        """
+        special_reasons = constant.KPL_INVALID_BLOCKS
+        day_block_codes = {}
+        if limit_up_data_list:
+            for _, date, reason, is_open, _blocks in limit_up_data_list:
+                if reason in special_reasons:
+                    continue
+                if date > max_day or date < min_day:
+                    continue
+                # 姣忓ぉ鐨勬澘鍧楁定鍋滄暟閲�
+                if date not in day_block_codes:
+                    day_block_codes[date] = {}
+                reasons = {reason}
+                if include_recommend_reason and _blocks:
+                    reasons |= set(_blocks.split("銆�"))
+                for r in reasons:
+                    if r not in day_block_codes[date]:
+                        # {鏃ユ湡:{鏉垮潡锛歔{鐪熸娑ㄥ仠闆嗗悎}, {鐐告澘闆嗗悎}]}}
+                        day_block_codes[date][r] = [set(), set()]
+                    if not is_open:
+                        # 鐪熸娑ㄥ仠
+                        day_block_codes[date][r][0].add(_)
+                    else:
+                        # 鐐告澘
+                        day_block_codes[date][r][1].add(_)
+            blocks = set()
+            for date in day_block_codes:
+                for reason in day_block_codes[date]:
+                    if len(day_block_codes[date][reason][0]) >= 2 or len(day_block_codes[date][reason][0]) >= 4:
+                        # 鏈�鍚庢定鍋滄暟>=2 鐐告澘鏁�>=4
+                        blocks.add(reason)
+            return blocks
+        return set()
+
+    @classmethod
+    def get_continuous_limit_up_reasons(cls, limit_up_data_list, days_list):
+        """
+        杩炵画鑰侀鏉愶細days_list浜ゆ槗鏃ラ兘鍦ㄨ蛋鐨勯鏉�
+        @param limit_up_data_list:
+        @param days_list: ["2025-01-01"]
+        @return:
+        """
+        special_reasons = constant.KPL_INVALID_BLOCKS
+        day_block_codes = {}
+        if limit_up_data_list:
+            for _, date, reason, is_open, _blocks in limit_up_data_list:
+                if reason in special_reasons:
+                    continue
+                if date not in days_list:
+                    continue
+                # 姣忓ぉ鐨勬澘鍧楁定鍋滄暟閲�
+                if date not in day_block_codes:
+                    day_block_codes[date] = {}
+                reasons = {reason}
+                for r in reasons:
+                    if r not in day_block_codes[date]:
+                        # {鏃ユ湡:{鏉垮潡锛歔{鐪熸娑ㄥ仠闆嗗悎}, {鐐告澘闆嗗悎}]}}
+                        day_block_codes[date][r] = [set(), set()]
+                    if not is_open:
+                        # 鐪熸娑ㄥ仠
+                        day_block_codes[date][r][0].add(_)
+                    else:
+                        # 鐐告澘
+                        day_block_codes[date][r][1].add(_)
+            block_days = {}
+            for date in day_block_codes:
+                for reason in day_block_codes[date]:
+                    if len(day_block_codes[date][reason][0]) >= 2 or len(day_block_codes[date][reason][0]) >= 4:
+                        # 鏈�鍚庢定鍋滄暟>=2 鐐告澘鏁�>=4
+                        if reason not in block_days:
+                            block_days[reason] = set()
+                        block_days[reason].add(date)
+            return set([b for b in block_days if len(block_days[b])==len(days_list)])
+        return set()

--
Gitblit v1.8.0