Administrator
2022-09-16 b7000cbf5e67e90abe53e96a4ea931afbf906e24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# 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))