From 18cd3598a6abf19dac1a02eb19c9db8edae8cc0c Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 11 七月 2023 16:45:56 +0800 Subject: [PATCH] 华鑫适配 --- third_data/hot_block_data_process.py | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 211 insertions(+), 15 deletions(-) diff --git a/third_data/hot_block_data_process.py b/third_data/hot_block_data_process.py index 6ff6a26..72866b0 100644 --- a/third_data/hot_block_data_process.py +++ b/third_data/hot_block_data_process.py @@ -1,13 +1,18 @@ """ 鐑棬鏉垮潡鏁版嵁澶勭悊 """ +import datetime import json -import tool +from utils import tool from db import redis_manager from db import mysql_data +from code_attribute import limit_up_time_manager, gpcode_manager +from l2 import code_price_manager +from third_data.history_k_data_util import HistoryKDatasUtils __redisManager = redis_manager.RedisManager(0) +INVALID_BLOCKS = ["鍏朵粬", "ST鑲�", "ST鎽樺附", "涓氱哗澧為暱", "涓氱哗棰勫", "鍏憡", "娆℃柊鑲�"] def __get_redis(): @@ -21,38 +26,63 @@ @classmethod def save(cls, day, datas): - cls.latest_datas = datas + mysqldb = mysql_data.Mysqldb() # 缁熻浠g爜鎵�灞炴澘鍧� code_block_dict = {} for data in datas: for code_info in data[2]: - code = code_info[0].split(".")[0] + code = code_info[0][1].split(".")[0] if not code_block_dict.get(code): code_block_dict[code] = set() code_block_dict[code].add(data[0]) + # 濡傛灉鏈鍜屼笂娆$浉宸殑浠g爜涓斾箣鍓嶆湁杩囨定鍋滃氨鍒ゆ柇涓虹偢鏉� + if cls.latest_datas: + latest_codes = set() + for data in cls.latest_datas: + for code_info in data[2]: + code = code_info[0][1].split(".")[0] + latest_codes.add(code) + now_codes = set(code_block_dict.keys()) + del_set = latest_codes - now_codes + for code in del_set: + # 鑾峰彇涔嬪墠鏄惁娑ㄥ仠杩� + results = cls.list_by_code(code, tool.get_now_date()) + if results: + first_limit_up_time = results[0][8] + if len(first_limit_up_time) > 6: + # 涔嬪墠娑ㄥ仠杩囷紝鏇存柊鐐告澘鏃堕棿 + for result in results: + mysqldb.execute( + f"update xgb_hot_block set _open_limit_up_time='{tool.get_now_time_str()}',_update_time=now() where _id='{result[0]}'") + cls.latest_datas = datas for data in datas: for code_info in data[2]: - code = code_info[0].split(".")[0] + code = code_info[0][1].split(".")[0] _id = f"{day}_{data[0]}_{code}" result = mysqldb.select_one("select * from xgb_hot_block where _id='{}'".format(_id)) limit_up_time = code_info[4] if len(limit_up_time) <= 6: limit_up_time = '' + # 00/60寮�澶翠唬鐮� 鏈夋定鍋滄椂闂� + if code.find("00") == 0 or code.find("60") == 0: + if len(limit_up_time) > 6: + code_price_manager.Buy1PriceManager.set_limit_up_time(code, limit_up_time) + if not result: mysqldb.execute( - f"insert into xgb_hot_block(_id,_day,_block_name,_code,_limit_up_time,_price,_rate,_update_time,_first_limit_up_time) values('{_id}','{day}','{data[0]}','{code}','{code_info[4]}','{code_info[2]}','{code_info[3]}',now(),'{limit_up_time}')") + f"insert into xgb_hot_block(_id,_day,_block_name,_code,_limit_up_time,_price,_rate,_update_time,_first_limit_up_time,_code_name) values('{_id}','{day}','{data[0]}','{code}','{code_info[4]}','{code_info[2]}','{code_info[3]}',now(),'{limit_up_time}','{code_info[0][0]}')") else: # 濡傛灉涓婃鐨勬暟鎹拰杩欐涓�鏍峰氨涓嶆洿鏂帮紝鍚﹀垯闇�瑕佹洿鏂版暟鎹� if cls.__last_datas.get(_id) != code_info: mysqldb.execute( - f"update xgb_hot_block set _limit_up_time='{code_info[4]}',_price='{code_info[2]}',_rate='{code_info[3]}',_update_time=now() where _id='{_id}'") + f"update xgb_hot_block set _limit_up_time='{code_info[4]}',_price='{code_info[2]}',_rate='{code_info[3]}',_update_time=now(),_code_name='{code_info[0][0]}' where _id='{_id}'") if (not result[8] or len(result[8]) <= 6) and len(limit_up_time) >= 6: + # 娌℃湁棣栨娑ㄥ仠鏃堕棿 mysqldb.execute( f"update xgb_hot_block set _first_limit_up_time='{limit_up_time}',_update_time=now() where _id='{_id}'") - cls.__last_datas[_id] = code_info # 鑾峰彇鍘熸潵鐨勪唬鐮佹墍灞炴澘鍧�,鍒犻櫎涔嬪墠閿欒鐨勬澘鍧� old_datas = XGBHotBlockDataManager.list_by_code(code, day) @@ -78,33 +108,171 @@ mysqldb = mysql_data.Mysqldb() return mysqldb.select_all(f"select * from xgb_hot_block where _block_name='{block_name}' and _day='{day}'") + @staticmethod + def list_blocks_with_day(days): + mysqldb = mysql_data.Mysqldb() + sql = "select _block_name,_day from xgb_hot_block where " + wheres = [] + for day in days: + wheres.append(f"_day = '{day}'") + sql += " or ".join(wheres) + sql += " group by _block_name,_day" + + results = mysqldb.select_all(sql) + return results + + @staticmethod + def get_latest_blocks(code): + wheres = [] + for b in INVALID_BLOCKS: + wheres.append(f"hb.`_block_name` != '{b}'") + wheres = " and ".join(wheres) + sql = f"SELECT GROUP_CONCAT(_block_name) FROM (SELECT hb.`_block_name`,hb.`_day` FROM `xgb_hot_block` hb WHERE hb.`_code`='{code}' AND {wheres} ORDER BY hb.`_day` DESC LIMIT 10) a GROUP BY a._day ORDER BY a._day DESC LIMIT 1" + mysqldb = mysql_data.Mysqldb() + return mysqldb.select_one(sql) + + +class XGBDataUtil: + + # 鏉垮潡涓槸鍚︽湁楂樹綅绁� + @classmethod + def is_has_high_code(cls, block_name, latest_datas): + if not latest_datas: + return False + for block in latest_datas: + if block[0] != block_name: + continue + for code_data in block[2]: + if code_data[1] and code_data[1].find("鏉�") >= 0: + day = code_data[1][-2:-1] + if int(day) >= 2: + return True, code_data + return False, None + + +__blocks_dict = {} + + +def get_latest_block(day_count=15): + now_day = tool.get_now_date_str() + if now_day in __blocks_dict: + return __blocks_dict[now_day] + now_date = datetime.datetime.now() + end_date = HistoryKDatasUtils.get_previous_trading_date(tool.get_now_date_str()) + start_date = now_date - datetime.timedelta(days=(day_count * 2 + 10)) + start_date = start_date.strftime("%Y-%m-%d") + days = HistoryKDatasUtils.get_trading_dates(start_date, end_date) + days = days[0 - day_count:] + results = XGBHotBlockDataManager.list_blocks_with_day(days) + __blocks_dict[now_day] = results + return results + + +# 鍔犺浇涔嬪墠鐨勬澘鍧� +__before_block_dict = {} + + +def __load_before_block(code): + if code not in __before_block_dict: + blocks = XGBHotBlockDataManager.get_latest_blocks(code) + if blocks: + blocks = blocks[0].split(',') + __before_block_dict[code] = blocks + + return __before_block_dict.get(code) + + +def __get_code_from_code_info(code_info): + code = code_info[0][1].split(".")[0] + return code + # 鑾峰彇浠g爜鎵�鍦ㄦ澘鍧椾俊鎭� def get_info(code): blocks = get_code_blocks(code) + if not blocks: + blocks = __load_before_block(code) + latest_blocks_info = get_latest_block(15) + # 缁熻鏉垮潡鍑虹幇娆℃暟 + # 鑾峰彇鐩爣鏉垮潡 target_block = None if blocks: for block in blocks: - if block == '鍏憡' or block == '鍏朵粬': + if block in INVALID_BLOCKS: continue target_block = block break if not target_block: return None - limit_up_codes_set = set() + # 缁熻鏉垮潡涓殑骞冲潎娑ㄥ箙 + total_rates = 0 + total_count = 0 + target_block_rate = 0 + if XGBHotBlockDataManager.latest_datas: + for b in XGBHotBlockDataManager.latest_datas: + if b[0] != target_block: + continue + if b[1]: + target_block_rate = float(b[1].strip().replace("%", '')) + for code_info in b[2]: + code__ = __get_code_from_code_info(code_info) + rate = float(code_info[3].strip().replace("%", '')) + if code__ != code: + total_rates += rate + total_count += 1 + + # 缁熻鏉垮潡鍑虹幇鐨勬鏁� + target_block_histry_count = 0 + if blocks: + for block_info in latest_blocks_info: + if block_info[0] != target_block: + continue + target_block_histry_count += 1 + + # 鏄惁鍑虹幇杩囬珮浣嶆澘 + high_block_infos = [] + for block in blocks: + if block == '鍏憡' or block == '鍏朵粬': + continue + if XGBHotBlockDataManager.latest_datas: + has_high, high_code_info = XGBDataUtil.is_has_high_code(block, XGBHotBlockDataManager.latest_datas) + if has_high: + high_block_info = (high_code_info[0], high_code_info[1]) + high_block_infos.append(high_block_info) + + limit_up_codes_info_set = set() + # 鏉垮潡涓嬬殑浠g爜鏁伴噺 + block_codes_set = set() if XGBHotBlockDataManager.latest_datas: for block in XGBHotBlockDataManager.latest_datas: if block[0] == target_block: for code_data in block[2]: + code_ = code_data[0][1].split('.')[0] if len(code_data[4]) > 6: - limit_up_codes_set.add(code_data[0].split('.')[0]) + limit_up_codes_info_set.add((code_, code_data[4])) + block_codes_set.add(code_) + # 鑾峰彇娑ㄥ仠鐨勯『搴� + limit_up_index = -1 + limit_up_codes_info_list = list(limit_up_codes_info_set) + limit_up_codes_info_list.sort(key=lambda x: x[1]) + for i in range(0, len(limit_up_codes_info_list)): + if limit_up_codes_info_list[i][0] == code: + limit_up_index = i + if limit_up_index < 0: + limit_up_index = len(limit_up_codes_info_list) + + # 娑ㄥ仠浠g爜闆嗗悎 + limit_up_codes_set = set([k[0] for k in limit_up_codes_info_list]) + limit_up_codes_set.discard(code) - limit_up_count = len(limit_up_codes_set) + block_codes_set.discard(code) + limit_up_codes_count = len(block_codes_set) total_datas = XGBHotBlockDataManager.total_datas break_codes = set() + re_limit_codes = set() for data in total_datas: block = data[2] if block != target_block: @@ -112,15 +280,39 @@ code = data[3] limit_up_time = data[4] first_limit_up_time = data[8] + open_limit_up_time = data[10] if len(limit_up_time) <= 6 and first_limit_up_time and len(first_limit_up_time) > 6: break_codes.add(code) + if len(limit_up_time) > 6 and open_limit_up_time and len(open_limit_up_time) > 6: + re_limit_codes.add(code) + # 鎺掗櫎鑷繁 break_codes.discard(code) # 鎺掗櫎宸茬粡娑ㄥ仠鐨勪唬鐮� break_codes = break_codes.difference(limit_up_codes_set) # 鐐告澘涓暟 break_size = len(break_codes) - return target_block, limit_up_count, break_size + + # 鐐告澘鍥炲皝鏁伴噺 + re_limit_up_size = len(re_limit_codes) + fresult = { + # 鐩爣鏉垮潡淇℃伅锛堟澘鍧楀悕绉�,鏉垮潡娑ㄥ箙,鍘嗗彶鏉垮潡鍑虹幇娆℃暟锛� + "target_block_info": (target_block, target_block_rate, target_block_histry_count), + # 娑ㄥ仠椤哄簭 + "limit_up_index": limit_up_index, + # 娑ㄥ仠浠g爜鏁伴噺 + "limit_up_codes_count": limit_up_codes_count, + # 鏉垮潡浠g爜娑ㄥ箙淇℃伅 + "block_codes_rates_info": (total_rates, total_count), + # 鐐告澘浠g爜鏁伴噺 + "break_size": break_size, + # 鐐告澘鍥炲皝鏁伴噺 + "re_limit_up_size": re_limit_up_size, + # 楂樹綅鐗堜俊鎭� + "high_block_infos": high_block_infos, + } + + return fresult # 淇濆瓨鏁版嵁 @@ -131,7 +323,12 @@ for block in datas: codes = [] for code_data in block[2]: - code = code_data[0].split(".")[0] + code = code_data[0][1].split(".")[0] + if gpcode_manager.FirstCodeManager.is_in_first_record(code): + limit_up_time = code_data[4] + if limit_up_time and len(limit_up_time) > 6: + if not limit_up_time_manager.get_limit_up_time(code): + limit_up_time_manager.save_limit_up_time(code, limit_up_time) if code not in code_block_dict: code_block_dict[code] = set() code_block_dict[code].add(block[0]) @@ -178,5 +375,4 @@ if __name__ == "__main__": # XGBHotBlockDataManager.total_datas=XGBHotBlockDataManager.list_all("2023-03-23") # get_info('002230') - codes = set([1, 2, 3, 4]) - print(codes.difference(set([1, 2]))) + print(__load_before_block("603163")) -- Gitblit v1.8.0