"""
|
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
|
|
# 自由流通市值影响比例
|
@classmethod
|
def get_zylt_rate(cls, zyltgb):
|
yi = round(zyltgb / 100000000)
|
if yi < 1:
|
yi = 1
|
if yi <= 30:
|
rate = -0.04 + 0.01 * (yi - 1)
|
if rate > 0.1:
|
rate = 0.1
|
else:
|
rate = 0.09 - (yi - 31) * 0.002
|
if rate < -0.1:
|
rate = -0.1
|
return round(rate, 4)
|
|
# 获取行业影响比例
|
# total_limit_percent为统计的比例之和乘以100
|
@classmethod
|
def get_industry_rate(cls, total_limit_percent):
|
t = total_limit_percent / 10
|
rate = t / 0.5 * 0.02 + 0.26
|
if rate > 0.52:
|
rate = 0.52
|
return round(rate, 2)
|
|
# 获取量影响比例
|
@classmethod
|
def get_volumn_rate(cls, day60_max, yest, today):
|
old_volumn = yest
|
base_rate = 0.49
|
if day60_max > yest:
|
old_volumn = day60_max
|
base_rate = 0.50
|
r = round(today / old_volumn, 2)
|
print("比例:", r)
|
rate = 0
|
if r <= 0.25:
|
rate = base_rate - (r - 0.01) * 2
|
elif r <= 0.5:
|
rate = 0.25 - r + (0.01 if day60_max > yest else 0)
|
elif r < 0.75:
|
rate = r - 0.75 + (0.01 if day60_max > yest else 0)
|
elif r < 1.74:
|
rate = base_rate - (r - 0.75)
|
else:
|
rate = base_rate - 0.99
|
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.5
|
rate = 0
|
if dif < 1:
|
rate = base_rate
|
elif dif <= 5:
|
rate = base_rate - dif * 0.02
|
elif dif <= 120:
|
# 11:30之前
|
rate = 0.39 - (dif - 6) * 0.004
|
else:
|
rate = 0.39 - (120 - 6) * 0.004 - (dif - 210 + 1) * 0.004
|
if rate < -0.5:
|
rate = -0.5
|
return round(rate, 4)
|
|
# 纯万手哥影响值(手数》=9000 OR 金额》=500w)
|
@classmethod
|
def get_big_money_rate(cls, num):
|
if num < 0:
|
num = 0
|
if num >= 10:
|
return 0.5
|
else:
|
return round(num * 0.05, 2)
|
|
@classmethod
|
def compute_rate(cls, zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today,
|
limit_up_time, big_money_num):
|
# 自由流通股本影响比例
|
zyltgb_rate = cls.get_zylt_rate(zyltgb)
|
# 行业涨停影响比例
|
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(
|
"zyltgb_rate:{} industry_rate:{} volumn_rate:{} limit_up_time_rate:{} big_money_rate:{}".format(zyltgb_rate,
|
industry_rate,
|
volumn_rate,
|
limit_up_time_rate,
|
big_money_rate))
|
|
return round(1 - (zyltgb_rate + industry_rate + volumn_rate + limit_up_time_rate + big_money_rate), 4)
|
|
@classmethod
|
def compute_rate_by_code(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
|
# 获取量
|
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 cls.compute_rate(zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today,
|
limit_up_time, big_money_num)
|
|
@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
|
if code == '002476':
|
print("")
|
zyltgb = cls.get_base_safe_val(zyltgb)
|
rate = cls.compute_rate_by_code(code)
|
# print("m值获取:", code, round(zyltgb * rate))
|
return round(zyltgb * rate)
|
|
|
# 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__":
|
L2TradeFactorUtil.compute_m_value("000036")
|
# print(L2TradeFactorUtil.get_big_money_rate(1))
|
# print(L2TradeFactorUtil.get_big_money_rate(2))
|
# print(L2TradeFactorUtil.get_big_money_rate(3))
|