Administrator
5 天以前 c05044c53a5d0213ef33b2b3bdbb57a328300ad2
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
"""
板块信息
"""
import datetime
 
import constant
from utils import tool
from third_data import kpl_util
from third_data.history_k_data_util import HistoryKDatasUtils
from third_data.kpl_data_manager import KPLLimitUpDataRecordManager, KPLDataManager
 
from third_data import kpl_data_manager
 
__before_block_dict = {}
 
__kplDataManager = KPLDataManager()
 
 
def __load_before_block(code):
    if code not in __before_block_dict:
        blocks = KPLLimitUpDataRecordManager.get_latest_blocks_set(code)
        if blocks:
            __before_block_dict[code] = blocks
 
    return __before_block_dict.get(code)
 
 
# 获取之前的板块
def get_before_blocks(code):
    return __before_block_dict.get(code)
 
 
# 获取之前的代码-板块字典
def get_before_blocks_dict():
    return __before_block_dict
 
 
def __get_code_from_code_info(code_info):
    code = code_info[0][1].split(".")[0]
    return code
 
 
# (代码, 名称, 首次涨停时间, 最近涨停时间, 几板, 涨停原因, 板块, 实际流通, 主力净额)
def __get_blocks(code, limit_up_datas, filter=True):
    blocks = []
    if limit_up_datas:
        for data in limit_up_datas:
            if data[0] == code:
                block = data[5]
                if block in constant.KPL_INVALID_BLOCKS and filter:
                    continue
                blocks.append(block)
    return blocks
 
 
def __is_has_high_code(block, latest_datas):
    for data in latest_datas:
        if block == data[5]:
            if data[4] != "首板":
                return True, 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_cache(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 = KPLLimitUpDataRecordManager.list_blocks_with_day(days)
    __blocks_dict[now_day] = results
    return results
 
 
# 获取代码所属板块
def get_code_blocks(code):
    latest_datas = __kplDataManager.get_data(kpl_util.KPLDataType.LIMIT_UP)
    blocks = __get_blocks(code, latest_datas)
    return blocks
 
 
def get_target_block_info(code, filter=False):
    latest_datas = __kplDataManager.get_data(kpl_util.KPLDataType.LIMIT_UP)
    blocks = __get_blocks(code, latest_datas, filter)
    if not blocks:
        blocks = __load_before_block(code)
        # 获取目标板块
    target_block = None
    if blocks:
        for block in blocks:
            if block in constant.KPL_INVALID_BLOCKS and filter:
                continue
            target_block = block
            break
    if not target_block:
        return None
    return target_block
 
 
# 获取代码所在板块信息
def get_info(code):
    latest_datas = __kplDataManager.get_data(kpl_util.KPLDataType.LIMIT_UP)
    blocks = __get_blocks(code, latest_datas)
    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 in constant.KPL_INVALID_BLOCKS:
                continue
            target_block = block
            break
    if not target_block:
        return None
 
    # 统计板块中的平均涨幅
    total_rates = 0
    total_count = 0
    target_block_rate = 0
    # if latest_datas:
    #     for b in latest_datas:
    #         if b[5] != 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 in constant.KPL_INVALID_BLOCKS:
            continue
        if latest_datas:
            has_high, high_code_info = __is_has_high_code(block, latest_datas)
            if has_high:
                high_block_info = (high_code_info[1], high_code_info[4])
                high_block_infos.append(high_block_info)
 
    limit_up_codes_info_set = set()
    # 板块下的代码数量
    block_codes_set = set()
    if KPLLimitUpDataRecordManager.total_datas is None:
        KPLLimitUpDataRecordManager.load_total_datas()
    if KPLLimitUpDataRecordManager.total_datas:
        for d in KPLLimitUpDataRecordManager.total_datas:
            if d[2] == target_block:
                code_ = d[3]
                limit_up_codes_info_set.add((code_, d[5]))
                block_codes_set.add(code_)
            elif d[3] == code:
                limit_up_codes_info_set.add((d[3], d[5]))
    # 获取涨停的顺序
    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)
 
    # 涨停代码集合
    limit_up_codes_set = set([k[0] for k in limit_up_codes_info_list])
 
    limit_up_codes_set.discard(code)
    block_codes_set.discard(code)
    limit_up_codes_count = len(block_codes_set)
 
    # 获取炸板数据
    open_limit_up_datas = __kplDataManager.get_data(kpl_util.KPLDataType.OPEN_LIMIT_UP)
    break_codes = set()
    re_limit_codes = set()
    # 炸板:
    # (代码,名称,涨幅,板块,实际流通)
    if open_limit_up_datas:
        for data in open_limit_up_datas:
            blocks = set(data[3].split("、"))
            if target_block not in blocks:
                continue
            code_ = data[0]
            break_codes.add(code_)
    # 统计回封
    if latest_datas:
        for data in latest_datas:
            if data[5] != target_block:
                continue
            # 回封
            if data[2] != data[3]:
                re_limit_codes.add(data[0])
 
    # 排除自己
    break_codes.discard(code)
    # 排除已经涨停的代码
    break_codes = break_codes.difference(limit_up_codes_set)
    # 炸板个数
    break_size = len(break_codes)
 
    # 炸板回封数量
    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,
        # 涨停代码数量
        "limit_up_codes_count": limit_up_codes_count,
        # 板块代码涨幅信息
        "block_codes_rates_info": (total_rates, total_count),
        # 炸板代码数量
        "break_size": break_size,
        # 炸板回封数量
        "re_limit_up_size": re_limit_up_size,
        # 高位版信息
        "high_block_infos": high_block_infos,
    }
 
    return fresult
 
 
# 初始化板块数据
def init():
    # 加载数据到内存中
    kpl_data_manager.get_current_limit_up_data_records(10)
    # 加载最近数据到内存中
    limit_up_datas = kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.LIMIT_UP)
    if limit_up_datas:
        kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas = limit_up_datas
 
 
def init_code(code):
    # 加载历史涨停原因
    __load_before_block(code)
 
 
if __name__ == "__main__":
    get_info("603133")