Administrator
2025-07-08 283a7c89f85b1584fde8ff429028506dc00e53d7
strategy/strategy_variable_factory.py
@@ -9,7 +9,7 @@
import constant
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
@@ -243,6 +243,48 @@
                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
    def load_trade_days(self):
        """
        加载交易日列表,now_day前120个交易日
@@ -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
@@ -655,7 +714,7 @@
    results = __DataLoader.load_target_plate_and_codes()
    # for k in results:
    #     print(k, results[k])
    plates = ["天然气", "军工"]
    plates = ["锂电池", "化工"]
    print("==========新题材=======")
    for p in plates:
        codes = [x for x in results.get(p)]  # if get_zylt(x) < 31e8
@@ -668,7 +727,7 @@
    # __load_target_codes_v1()
    __DataLoader = DataLoader("2025-06-17")
    __DataLoader = DataLoader("2025-06-25")
    # __test_jx_blocks(__DataLoader)
    # instance = StockVariables()
@@ -686,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))