""" L2数据交易影响因子 """ # l2交易因子 import big_money_num_manager import global_util import limit_up_time_manager import log class L2TradeFactorUtil: # 获取基础m值,返回单位为元 @classmethod def get_base_safe_val(cls, zyltgb): yi = round(zyltgb / 100000000) if yi < 1: yi = 1 return 5000000 + (yi - 1) * 500000 # 获取行业影响比例 # total_limit_percent为统计的比例之和乘以100 @classmethod def get_industry_rate(cls, total_limit_percent): t = total_limit_percent / 10 if t < 0.9: return 0 elif t <= 1.1: return 0.2 elif t <= 1.6: return 0 elif t <= 2.1: return 0.03 elif t <= 2.6: return 0.06 elif t <= 3.1: return 0.09 elif t <= 3.6: return 0.12 elif t <= 4.1: return 0.15 elif t <= 4.6: return 0.18 elif t <= 5.1: return 0.21 elif t <= 5.6: return 0.24 elif t <= 6.1: return 0.27 else: return 0.30 # 获取量影响比例 @classmethod def get_volumn_rate(cls, day60_max, yest, today): old_volumn = yest if day60_max > yest: old_volumn = day60_max r = round(today / old_volumn, 2) if r < 0.01: r = 0.01 print("比例:", r) rate = 0 if r < 0.5: rate = 0.3 - (r - 0.01) elif r <= 0.75: rate = -0.2 + (r - 0.5) * 2 elif r <= 1.35: rate = 0.3 - (r - 0.75) else: rate = -0.3 return round(rate, 4) # 当前股票首次涨停时间的影响比例 @classmethod def get_limit_up_time_rate(cls, time_str): times = time_str.split(":") start_m = 9 * 60 + 30 m = int(times[0]) * 60 + int(times[1]) dif = m - start_m base_rate = 0.3 rate = 0 if dif < 1: rate = base_rate elif dif <= 120: # 11:30之前 rate = base_rate - dif * 0.0035 else: rate = base_rate - (dif - 89) * 0.0035 if rate < -0.3020: rate = -0.3020 return round(rate, 4) # 纯万手哥影响值(手数》=9000 OR 金额》=500w) @classmethod def get_big_money_rate(cls, num): if num < 4: return 0 rate = (num - 4) * 0.035 / 4 + 0.06 if rate > 0.9: rate = 0.9 return round(rate, 4) @classmethod def compute_rate(cls, zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today, limit_up_time, big_money_num): # 行业涨停影响比例 industry_rate = 0 if total_industry_limit_percent is not None: industry_rate = cls.get_industry_rate(total_industry_limit_percent) # 量影响比例 volumn_rate = 0 if volumn_day60_max is not None and volumn_yest is not None and volumn_today is not None: volumn_rate = cls.get_volumn_rate(int(volumn_day60_max), int(volumn_yest), int(volumn_today)) # 涨停时间影响比例 limit_up_time_rate = 0 if limit_up_time is not None: limit_up_time_rate = cls.get_limit_up_time_rate(limit_up_time) # 万手哥影响 big_money_rate = 0 if big_money_num is not None: big_money_rate = cls.get_big_money_rate(big_money_num) print( "industry_rate:{} volumn_rate:{} limit_up_time_rate:{} big_money_rate:{}".format(industry_rate, volumn_rate, limit_up_time_rate, big_money_rate)) final_rate = round(1 - (industry_rate + volumn_rate + limit_up_time_rate + big_money_rate), 4) if final_rate < 0.1: final_rate = 0.1 return final_rate @classmethod def compute_rate_by_code(cls, code): factors = cls.__get_rate_factors(code) return cls.compute_rate(factors[0], factors[1], factors[2], factors[3], factors[4], factors[5], factors[6]) @classmethod def __get_rate_factors(cls, code): zyltgb = global_util.zyltgb_map.get(code) # 获取行业热度 industry = global_util.code_industry_map.get(code) if industry is None: global_util.load_industry() industry = global_util.code_industry_map.get(code) total_industry_limit_percent = global_util.industry_hot_num.get(industry) if industry is not None else None # 当前票是否涨停 if total_industry_limit_percent is not None: if code in global_util.limit_up_codes_percent: total_industry_limit_percent -= global_util.limit_up_codes_percent[code] # 获取量 volumn_day60_max, volumn_yest, volumn_today = global_util.max60_volumn.get( code), global_util.yesterday_volumn.get(code), global_util.today_volumn.get(code) if volumn_day60_max is None or volumn_yest is None: global_util.load_volumn() volumn_day60_max, volumn_yest, volumn_today = global_util.max60_volumn.get( code), global_util.yesterday_volumn.get(code), global_util.today_volumn.get(code) # 首次涨停时间 limit_up_time = global_util.limit_up_time.get(code) if limit_up_time is None: limit_up_time = limit_up_time_manager.get_limit_up_time(code) big_money_num = global_util.big_money_num.get(code) if big_money_num is None: big_money_num = big_money_num_manager.get_num(code) return ( zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today, limit_up_time, big_money_num) @classmethod def factors_to_string(cls, code): vals = cls.__get_rate_factors(code) return "zyltgb:%s, total_industry_limit_percent:%s, volumn_day60_max:%s, volumn_yest:%s, volumn_today:%s,limit_up_time:%s, big_money_num:%s" % vals @classmethod def __get_zyltgb(cls, code): zyltgb = global_util.zyltgb_map.get(code) if zyltgb is None: global_util.load_zyltgb() zyltgb = global_util.zyltgb_map.get(code) return zyltgb @classmethod def compute_m_value(cls, code): zyltgb = global_util.zyltgb_map.get(code) if zyltgb is None: global_util.load_zyltgb() zyltgb = global_util.zyltgb_map.get(code) if zyltgb is None: print("没有获取到自由流通市值") return 10000000 zyltgb = cls.get_base_safe_val(zyltgb) rate = cls.compute_rate_by_code(code) # print("m值获取:", code, round(zyltgb * rate)) return round(zyltgb * rate) # 获取安全笔数 @classmethod def get_safe_buy_count(cls, code): gb = cls.__get_zyltgb(code) if not gb: # 默认10笔 return 8 count = gb // 100000000 if count > 30: return 30 if count < 5: return 5 return count # l2因子归因数据 class L2TradeFactorSourceDataUtil: # 是否为大单 @classmethod def is_big_money(cls, data): if int(data["val"]["limitPrice"]) != 1: return False if int(data["val"]["num"]) >= 9000: return True money = round(float(data["val"]["price"]) * int(data["val"]["num"]) * 100) if money >= 5000000: return True return False if __name__ == "__main__": # print(L2TradeFactorUtil.get_rate_factors("003004")) # print(L2TradeFactorUtil.factors_to_string("003004")) print(L2TradeFactorUtil.get_limit_up_time_rate("09:30:30")) print(L2TradeFactorUtil.get_limit_up_time_rate("11:30:00")) print(L2TradeFactorUtil.get_limit_up_time_rate("13:00:00")) print(L2TradeFactorUtil.get_limit_up_time_rate("13:48:00")) print(L2TradeFactorUtil.get_limit_up_time_rate("13:53:23")) print(L2TradeFactorUtil.get_limit_up_time_rate("14:23:23")) # print(L2TradeFactorUtil.get_big_money_rate(2)) # print(L2TradeFactorUtil.get_big_money_rate(3))