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