# l2交易因子
|
class L2TradeFactorUtil:
|
# 获取基础m值,返回单位为元
|
@classmethod
|
def get_base_safe_val(cls, zyltgb):
|
yi = round(zyltgb / 100000000)
|
if yi < 1:
|
yi = 1
|
return 6000000 + (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.04
|
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.25
|
if day60_max > yest:
|
old_volumn = day60_max
|
base_rate = 0.26
|
r = round(today / old_volumn, 2)
|
print("比例:", r)
|
rate = 0
|
if r < 0.11:
|
rate = base_rate - (r - 0.01)
|
elif r < 0.45:
|
rate = base_rate - r
|
elif r < 0.75:
|
rate = (base_rate - 0.2049) + (r - 0.74) * 0.4
|
elif r < 1.38:
|
rate = base_rate - (r - 0.75) * 0.8
|
else:
|
rate = base_rate - 0.5
|
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.15
|
rate = 0
|
if dif < 1:
|
rate = base_rate
|
elif dif <= 5:
|
rate = base_rate - dif * 0.01
|
elif dif <= 120:
|
# 11:30之前
|
rate = 0.0985 - (dif - 6) * 0.0015
|
else:
|
rate = 0.0985 - (dif - 89 - 6) * 0.0015
|
if rate < -0.15:
|
rate = -0.15
|
return round(rate, 4)
|
|
# 纯万手哥影响值(手数》=9000 OR 金额》=500w)
|
@classmethod
|
def get_big_money_rate(cls, num):
|
if num >= 8:
|
return 0.08
|
else:
|
return num * 0.01
|
|
@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 = cls.get_industry_rate(total_industry_limit_percent)
|
# 量影响比例
|
volumn_rate=cls.get_volumn_rate(volumn_day60_max,volumn_yest,volumn_today)
|
# 涨停时间影响比例
|
limit_up_time_rate=cls.get_limit_up_time_rate(limit_up_time)
|
# 万手哥影响
|
big_money_rate=cls.get_big_money_rate(big_money_num)
|
|
return 1-(zyltgb_rate+industry_rate+volumn_rate+limit_up_time_rate+big_money_rate);
|
|
|
# l2因子归因数据
|
class L2TradeFactorSourceDataUtil:
|
# 是否为大单
|
@classmethod
|
def is_big_money(cls, data):
|
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_big_money_rate(32))
|
print(L2TradeFactorUtil.get_big_money_rate(8))
|
print(L2TradeFactorUtil.get_big_money_rate(0))
|