Administrator
2025-07-08 283a7c89f85b1584fde8ff429028506dc00e53d7
strategy/strategy_variable_factory.py
@@ -7,9 +7,9 @@
import re
import constant
from code_attribute import global_data_loader
from code_attribute import global_data_loader, gpcode_manager
from db import mysql_data_delegate
from strategy.data_analyzer import KTickLineAnalyzer, KPLLimitUpDataAnalyzer, K60SLineAnalyzer
from strategy.data.data_analyzer import KTickLineAnalyzer, KPLLimitUpDataAnalyzer, K60SLineAnalyzer
from strategy.strategy_variable import StockVariables
from third_data import kpl_api, kpl_util
from third_data.history_k_data_manager import HistoryKDataManager
@@ -22,7 +22,7 @@
    数据加载器类,用于集中管理策略变量所需的各类数据加载逻辑
    """
    def __init__(self, now_day, cache_path="D:/datas"):
    def __init__(self, now_day, cache_path=f"{constant.get_path_prefix()}/datas"):
        """
        初始化数据加载器
        :param now_day: 当前日期,格式为"2025-01-01"
@@ -235,10 +235,52 @@
                results = [x for x in results if
                           (tool.is_can_buy_code(x[0]) and x[0] in valid_codes and x[0] not in exclude_codes)]
                # 取前1/3且涨停数是前10
                max_count = len(results) // 2 if len(results) % 2 == 0 else len(results) // 2 + 1
                results = results[:max_count]
                max_count = len(results) // 3 if len(results) % 3 == 0 else len(results) // 3 + 1
                # results = results[:max_count]
                # 取前10
                results = results[:10]
                codes = [x[0] for x in results]
                fresults[kpl_util.filter_block(b)] = codes
        return fresults
    def load_target_plate_and_codes_v2(self):
        """
        快读拉升的目标票
        从最近180个交易日的真正涨停数据中
        @return: {"板块":[代码]}
        """
        end_date = self.trade_days[:180][-1]
        start_date = self.trade_days[:180][0]
        mysql = mysql_data_delegate.Mysqldb()
        # 获取上个交易日涨停的票
        results = mysql.select_all(
            f"SELECT r.`_code` FROM `kpl_limit_up_record` r where r._day='{self.trade_days[0]}' and r._open = 0")
        exclude_codes = set([x[0] for x in results])
        results = mysql.select_all(
            f"select r.`_hot_block_name` from `kpl_limit_up_record` r where r.`_open`=0 and r.`_day`>'{end_date}' and r.`_day` <= '{start_date}' group by r.`_hot_block_name`")
        blocks = set([x[0] for x in results])
        fresults = {}
        all_buy_plates_of_codes = self.load_all_buy_plates_of_codes()
        valid_codes = set(all_buy_plates_of_codes.keys())
        for b in blocks:
            sql = f"""
                    SELECT * FROM
                    (
                    SELECT r.`_code`, r.`_code_name`, COUNT(*) AS `count`, MAX(r.`_day`) AS _day FROM `kpl_limit_up_record` r WHERE r.`_open`=0  AND r.`_day`>'{end_date}' AND r.`_day`<='{start_date}' AND r.`_hot_block_name`='{b}' GROUP BY r.`_code`
                    ) a
                    ORDER BY a.count DESC,a._day  DESC
            """
            results = mysql.select_all(sql)
            # 取前1/3
            if results:
                results = [x for x in results if
                           (tool.is_can_buy_code(x[0]) and x[0] in valid_codes and x[0] not in exclude_codes)]
                # 取前1/3且涨停数是前10
                max_count = len(results) // 3 if len(results) % 3 == 0 else len(results) // 3 + 1
                # results = results[:max_count]
                # 取前10
                # results = results[:10]
                codes = [x[0] for x in results]
                fresults[kpl_util.filter_block(b)] = codes
        return fresults
@@ -343,6 +385,8 @@
                    continue
                if re.match(r"风险|立案", r[2]):
                    continue
                if re.match(r"退市", r[1]):
                    continue
                if r[1].find("ST") >= 0:
                    continue
                if r[1].find("S") >= 0:
@@ -381,12 +425,16 @@
                        if not is_for_buy:
                            if r[3] < 1:
                                continue
                            if re.match(r"退市", r[1]):
                                continue
                            if r[1].find("ST") >= 0:
                                continue
                            if r[1].find("S") >= 0:
                                continue
                        else:
                            if re.match(r"风险|立案", r[2]):
                                continue
                            if re.match(r"退市", r[1]):
                                continue
                            if r[1].find("ST") >= 0:
                                continue
@@ -602,6 +650,17 @@
            kline_data_60s = kline_data_60s_dict.get(trade_days[0])
            fdata = K60SLineAnalyzer.get_close_price_of_max_volume(kline_data_60s)
            instance.__setattr__(f"昨日分时最高量价", fdata)
        if KTickLineAnalyzer.is_too_high_and_not_release_volume(kline_data_1d):
            instance.涨得高未放量 = True
        else:
            instance.涨得高未放量 = False
        if KTickLineAnalyzer.is_latest_limit_up_with_no_release_volume(kline_data_1d):
            instance.涨停过未放量 = True
        else:
            instance.涨停过未放量 = False
        return instance
@@ -636,8 +695,39 @@
            print(code, code_blocks[code])
def __load_target_codes_v1():
    """
    50亿以下的
    @return:
    """
    def get_zylt(code):
        zylt_volume_map = global_util.zylt_volume_map
        last_trade_day = __DataLoader.trade_days[0]
        volume = zylt_volume_map.get(code)
        # 今日涨停价要突破昨日最高价
        k_bars = HistoryKDataManager().get_history_bars(code, last_trade_day)
        return k_bars[0]["close"] * volume * tool.get_limit_up_rate(code)
    __DataLoader = DataLoader('2025-06-13')
    global_data_loader.load_zyltgb_volume_from_db()
    results = __DataLoader.load_target_plate_and_codes()
    # for k in results:
    #     print(k, results[k])
    plates = ["锂电池", "化工"]
    print("==========新题材=======")
    for p in plates:
        codes = [x for x in results.get(p)]  # if get_zylt(x) < 31e8
        print("======", p)
        for code in codes:
            print("\t\t", code, gpcode_manager.CodesNameManager().get_code_name(code))
if __name__ == "__main__":
    __DataLoader = DataLoader("2025-06-12")
    # __load_target_codes_v1()
    __DataLoader = DataLoader("2025-06-25")
    # __test_jx_blocks(__DataLoader)
    # instance = StockVariables()
@@ -655,7 +745,7 @@
    results = __DataLoader.load_target_plate_and_codes()
    # for k in results:
    #     print(k, results[k])
    plates = ["汽车零部件", "稀土永磁", "化工", "医药", "光伏"]
    plates = ["智能驾驶", "无人驾驶", "家电", "锂电池", "芯片"]
    print("==========新题材=======")
    for p in plates:
        print(p, results.get(p))