mns-common 1.5.1.6__py3-none-any.whl → 1.5.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mns-common might be problematic. Click here for more details.

@@ -1,376 +0,0 @@
1
- import os
2
- import sys
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
- from mns_common.db.MongodbUtil import MongodbUtil
9
- import requests
10
- import json
11
- import pandas as pd
12
- from concurrent.futures import ThreadPoolExecutor
13
- import datetime
14
- import mns_common.utils.data_frame_util as data_frame_util
15
-
16
- mongodb_util = MongodbUtil('27017')
17
- fields = ("f352,f2,f3,f5,f6,f8,f10,f11,f22,f12,f14,f15,f16,f17,"
18
- "f18,f20,f21,f26,f33,f34,f35,f62,f66,f69,f72,f100,f184,f211,f212"),
19
- fs = "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048"
20
-
21
- # 最大返回条数
22
- max_number = 5800
23
- # 最小返回条数
24
- min_number = 5600
25
- # 分页条数
26
- PAGE_SIZE = 100
27
-
28
-
29
- def get_stock_page_data(pn, proxies, page_size):
30
- """
31
- 获取单页股票数据
32
- """
33
- # 获取当前日期和时间
34
- current_time = datetime.datetime.now()
35
-
36
- # 将当前时间转换为时间戳(以毫秒为单位)
37
- current_timestamp_ms = int(current_time.timestamp() * 1000)
38
-
39
- url = "https://33.push2.eastmoney.com/api/qt/clist/get"
40
- params = {
41
- "cb": "jQuery1124046660442520420653_" + str(current_timestamp_ms),
42
- "pn": str(pn),
43
- "pz": str(page_size), # 每页最大200条
44
- "po": "0",
45
- "np": "3",
46
- "ut": "bd1d9ddb04089700cf9c27f6f7426281",
47
- "fltt": "2",
48
- "invt": "2",
49
- "wbp2u": "|0|0|0|web",
50
- "fid": "f12",
51
- "fs": fs,
52
- "fields": fields,
53
- "_": current_timestamp_ms
54
- }
55
- try:
56
- if proxies is None:
57
- r = requests.get(url, params)
58
- else:
59
- r = requests.get(url, params, proxies=proxies)
60
-
61
- data_text = r.text
62
- if pn == 1:
63
- try:
64
- begin_index_total = data_text.index('"total":')
65
-
66
- end_index_total = data_text.index('"diff"')
67
- global max_number
68
- max_number = int(data_text[begin_index_total + 8:end_index_total - 1])
69
- except Exception as e:
70
- # logger.error(f"获取第{pn}页股票列表异常: {e}")
71
- return pd.DataFrame()
72
-
73
- begin_index = data_text.index('[')
74
- end_index = data_text.index(']')
75
- data_json = data_text[begin_index:end_index + 1]
76
- data_json = json.loads(data_json)
77
- if data_json is None:
78
- return pd.DataFrame()
79
- else:
80
- result_df = pd.DataFrame(data_json)
81
- result_df['page_number'] = pn
82
- return result_df
83
- except Exception as e:
84
- # logger.error(f"获取第{pn}页股票列表异常: {e}")
85
- return pd.DataFrame()
86
-
87
-
88
- def all_stock_ticker_data_new(proxies) -> pd.DataFrame:
89
- """
90
- 使用多线程获取所有股票数据
91
- """
92
-
93
- per_page = PAGE_SIZE
94
- total_pages = (max_number + per_page - 1) // per_page # 向上取整
95
-
96
- # 创建线程池
97
- with ThreadPoolExecutor(max_workers=10) as executor:
98
- # 提交任务,获取每页数据
99
- futures = [executor.submit(get_stock_page_data, pn, proxies, PAGE_SIZE)
100
- for pn in range(1, total_pages + 1)]
101
-
102
- # 收集结果
103
- results = []
104
- for future in futures:
105
- result = future.result()
106
- if not result.empty:
107
- results.append(result)
108
-
109
- # 合并所有页面的数据
110
- if results:
111
- return pd.concat(results, ignore_index=True)
112
- else:
113
- return pd.DataFrame()
114
-
115
-
116
- def get_real_time_quotes_all_stocks(proxies):
117
- page_df = all_stock_ticker_data_new(proxies)
118
- page_df = rename_real_time_quotes_df(page_df)
119
- page_df.drop_duplicates('symbol', keep='last', inplace=True)
120
- return page_df
121
-
122
-
123
- # 获取所有股票实时行情数据 f33,委比
124
- def rename_real_time_quotes_df(temp_df):
125
- temp_df = temp_df.rename(columns={
126
- "f2": "now_price",
127
- "f3": "chg",
128
- "f5": "volume",
129
- "f6": "amount",
130
- "f8": "exchange",
131
- "f10": "quantity_ratio",
132
- "f22": "up_speed",
133
- "f11": "up_speed_05",
134
- "f12": "symbol",
135
- "f14": "name",
136
- "f15": "high",
137
- "f16": "low",
138
- "f17": "open",
139
- "f18": "yesterday_price",
140
- "f20": "total_mv",
141
- "f21": "flow_mv",
142
- "f26": "list_date",
143
- "f33": "wei_bi",
144
- "f34": "outer_disk",
145
- "f35": "inner_disk",
146
- "f62": "today_main_net_inflow",
147
- "f66": "super_large_order_net_inflow",
148
- "f69": "super_large_order_net_inflow_ratio",
149
- "f72": "large_order_net_inflow",
150
- # "f78": "medium_order_net_inflow",
151
- # "f84": "small_order_net_inflow",
152
- "f100": "industry",
153
- # "f103": "concept",
154
- "f184": "today_main_net_inflow_ratio",
155
- "f352": "average_price",
156
- "f211": "buy_1_num",
157
- "f212": "sell_1_num"
158
- })
159
- if data_frame_util.is_empty(temp_df):
160
- return pd.DataFrame()
161
- else:
162
- temp_df.loc[temp_df['buy_1_num'] == '-', 'buy_1_num'] = 0
163
- temp_df.loc[temp_df['sell_1_num'] == '-', 'sell_1_num'] = 0
164
- temp_df.loc[temp_df['up_speed_05'] == '-', 'up_speed_05'] = 0
165
- temp_df.loc[temp_df['up_speed'] == '-', 'up_speed'] = 0
166
- temp_df.loc[temp_df['average_price'] == '-', 'average_price'] = 0
167
- temp_df.loc[temp_df['wei_bi'] == '-', 'wei_bi'] = 0
168
- temp_df.loc[temp_df['yesterday_price'] == '-', 'yesterday_price'] = 0
169
- temp_df.loc[temp_df['now_price'] == '-', 'now_price'] = 0
170
- temp_df.loc[temp_df['chg'] == '-', 'chg'] = 0
171
- temp_df.loc[temp_df['volume'] == '-', 'volume'] = 0
172
- temp_df.loc[temp_df['amount'] == '-', 'amount'] = 0
173
- temp_df.loc[temp_df['exchange'] == '-', 'exchange'] = 0
174
- temp_df.loc[temp_df['quantity_ratio'] == '-', 'quantity_ratio'] = 0
175
- temp_df.loc[temp_df['high'] == '-', 'high'] = 0
176
- temp_df.loc[temp_df['low'] == '-', 'low'] = 0
177
- temp_df.loc[temp_df['open'] == '-', 'open'] = 0
178
- temp_df.loc[temp_df['total_mv'] == '-', 'total_mv'] = 0
179
- temp_df.loc[temp_df['flow_mv'] == '-', 'flow_mv'] = 0
180
- temp_df.loc[temp_df['inner_disk'] == '-', 'inner_disk'] = 0
181
- temp_df.loc[temp_df['outer_disk'] == '-', 'outer_disk'] = 0
182
- temp_df.loc[temp_df['today_main_net_inflow_ratio'] == '-', 'today_main_net_inflow_ratio'] = 0
183
- temp_df.loc[temp_df['today_main_net_inflow'] == '-', 'today_main_net_inflow'] = 0
184
- temp_df.loc[temp_df['super_large_order_net_inflow'] == '-', 'super_large_order_net_inflow'] = 0
185
- temp_df.loc[temp_df['super_large_order_net_inflow_ratio'] == '-', 'super_large_order_net_inflow_ratio'] = 0
186
- temp_df.loc[temp_df['large_order_net_inflow'] == '-', 'large_order_net_inflow'] = 0
187
- # temp_df.loc[temp_df['medium_order_net_inflow'] == '-', 'medium_order_net_inflow'] = 0
188
- # temp_df.loc[temp_df['small_order_net_inflow'] == '-', 'small_order_net_inflow'] = 0
189
-
190
- temp_df["list_date"] = pd.to_numeric(temp_df["list_date"], errors="coerce")
191
- temp_df["wei_bi"] = pd.to_numeric(temp_df["wei_bi"], errors="coerce")
192
- temp_df["average_price"] = pd.to_numeric(temp_df["average_price"], errors="coerce")
193
- temp_df["yesterday_price"] = pd.to_numeric(temp_df["yesterday_price"], errors="coerce")
194
- temp_df["now_price"] = pd.to_numeric(temp_df["now_price"], errors="coerce")
195
- temp_df["chg"] = pd.to_numeric(temp_df["chg"], errors="coerce")
196
- temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
197
- temp_df["amount"] = pd.to_numeric(temp_df["amount"], errors="coerce")
198
- temp_df["exchange"] = pd.to_numeric(temp_df["exchange"], errors="coerce")
199
- temp_df["quantity_ratio"] = pd.to_numeric(temp_df["quantity_ratio"], errors="coerce")
200
- temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
201
- temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
202
- temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
203
- temp_df["total_mv"] = pd.to_numeric(temp_df["total_mv"], errors="coerce")
204
- temp_df["flow_mv"] = pd.to_numeric(temp_df["flow_mv"], errors="coerce")
205
- temp_df["outer_disk"] = pd.to_numeric(temp_df["outer_disk"], errors="coerce")
206
- temp_df["inner_disk"] = pd.to_numeric(temp_df["inner_disk"], errors="coerce")
207
- temp_df["today_main_net_inflow"] = pd.to_numeric(temp_df["today_main_net_inflow"], errors="coerce")
208
- temp_df["super_large_order_net_inflow"] = pd.to_numeric(temp_df["super_large_order_net_inflow"],
209
- errors="coerce")
210
- temp_df["super_large_order_net_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_net_inflow_ratio"],
211
- errors="coerce")
212
- temp_df["large_order_net_inflow"] = pd.to_numeric(temp_df["large_order_net_inflow"],
213
- errors="coerce")
214
- # temp_df["medium_order_net_inflow"] = pd.to_numeric(temp_df["medium_order_net_inflow"],
215
- # errors="coerce")
216
- # temp_df["small_order_net_inflow"] = pd.to_numeric(temp_df["small_order_net_inflow"], errors="coerce")
217
-
218
- # 大单比例
219
- temp_df['large_order_net_inflow_ratio'] = round((temp_df['large_order_net_inflow'] / temp_df['amount']) * 100,
220
- 2)
221
-
222
- # 外盘是内盘倍数
223
- temp_df['disk_ratio'] = round((temp_df['outer_disk'] - temp_df['inner_disk']) / temp_df['inner_disk'], 2)
224
- # 只有外盘没有内盘
225
- temp_df.loc[temp_df["inner_disk"] == 0, ['disk_ratio']] = 1688
226
- temp_df = temp_df.sort_values(by=['chg'], ascending=False)
227
- return temp_df
228
-
229
-
230
- # 北向/南向资金状况 北向已经停止
231
- def get_sum_north_south_net_buy_amt():
232
- # 设置请求头部信息
233
- headers = {
234
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
235
- }
236
-
237
- # 设置请求URL
238
- url = 'http://push2.eastmoney.com/api/qt/kamt/get?fields1=f1,f2,f3,f4&fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70&ut=b2884a393a59ad640022ce1e1e78431c&deviceid=0&cb=jsonp_1622790712837&_=1622790712926'
239
-
240
- # 发送HTTP请求
241
- response = requests.get(url, headers=headers, params={"type": "json"})
242
-
243
- # 解析JSON数据
244
- data = json.loads(response.text.lstrip('jsonp_1622790712837(').rstrip(');'))
245
-
246
- # 处理数据
247
-
248
- # 单位(万元)
249
- # dayNetAmtIn 资金净流入
250
- # dayAmtRemain 当日资金余额
251
- # dayAmtThreshold 当日资金限额
252
- # monthNetAmtIn 当月净流入
253
- # yearNetAmtIn 年度净流入
254
- # allNetAmtIn 总净流入
255
- # buyAmt 当日买入金额
256
- # sellAmt 当日卖出金额
257
- # buySellAmt 当日买入卖出总金额
258
- # netBuyAmt 成交净买额
259
-
260
- # Hongkong to Shanghai
261
- hk2sh = data['data']['hk2sh']
262
- hk2sh_df = pd.DataFrame(hk2sh, index=[0])
263
- # Hongkong to ShenZhen
264
- hk2sz = data['data']['hk2sz']
265
- hk2sz_df = pd.DataFrame(hk2sz, index=[0])
266
-
267
- # Shanghai to Hongkong
268
- sh2hk = data['data']['sh2hk']
269
- sh2hk_df = pd.DataFrame(sh2hk, index=[0])
270
-
271
- # ShenZhen to Hongkong
272
- sz2hk = data['data']['sz2hk']
273
- sz2hk_df = pd.DataFrame(sz2hk, index=[0])
274
- # 北向总额
275
- sum_north_netBuyAmt = hk2sh_df['netBuyAmt'] + hk2sz_df['netBuyAmt']
276
-
277
- sum_south_netBuyAmt = sh2hk_df['netBuyAmt'] + sz2hk_df['netBuyAmt']
278
-
279
- df = pd.DataFrame([[
280
- list(hk2sh_df['netBuyAmt'])[0],
281
- list(hk2sz_df['netBuyAmt'])[0],
282
- list(sum_north_netBuyAmt)[0],
283
- list(sh2hk_df['netBuyAmt'])[0],
284
- list(sz2hk_df['netBuyAmt'])[0],
285
- list(sum_south_netBuyAmt)[0]]],
286
- columns=['sh_netBuyAmt', 'sz_netBuyAmt', 'sum_north_netBuyAmt',
287
- 'sh_hk_netBuyAmt', 'sz_hk_netBuyAmt', 'sum_south_netBuyAmt'])
288
-
289
- # 打印结果
290
- return df
291
-
292
-
293
- def get_real_time_quotes_ip_pool(proxies_pool, timeout_time, show_msg):
294
- page_df = all_stock_ticker_data_ip_pools(proxies_pool, timeout_time, show_msg)
295
- page_df = rename_real_time_quotes_df(page_df)
296
- page_df.drop_duplicates('symbol', keep='last', inplace=True)
297
- return page_df
298
-
299
-
300
- def all_stock_ticker_data_ip_pools(proxies_pool, timeout_time: str, show_msg) -> pd.DataFrame:
301
- """
302
- 使用多线程获取所有股票数据,支持代理池,并避免超时死循环
303
- :param proxies_pool: 代理池列表
304
- :param timeout_time: 代理过期时间,格式为 "YYYY-MM-DD HH:MM:SS"
305
- :return: 股票数据的 DataFrame
306
- """
307
- # 将timeout_time字符串转化为 datetime 对象
308
- timeout_time = datetime.datetime.strptime(timeout_time, "%Y-%m-%d %H:%M:%S")
309
-
310
- if datetime.datetime.now() > timeout_time:
311
- logger.info("当前时间已超过: {},终止请求。", timeout_time)
312
- return pd.DataFrame() # 返回空DataFrame,表示结束
313
-
314
- per_page = PAGE_SIZE
315
- total_pages = (max_number + per_page - 1) // per_page # 向上取整
316
- results = []
317
-
318
- def get_page_data_with_retries(pn, proxy_list):
319
- """
320
- 使用代理池并重试,直到获取成功或超过超时时间
321
- """
322
- proxy_index = 0
323
- while True:
324
- # 检查当前时间是否超过了超时时间
325
- if datetime.datetime.now() > timeout_time:
326
- logger.info("当前时间已超过: {},终止请求。", timeout_time)
327
- return pd.DataFrame() # 返回空DataFrame,表示结束
328
-
329
- proxy_ip = proxy_list[proxy_index]
330
-
331
- proxies = {"https": proxy_ip,
332
- "http": proxy_ip}
333
-
334
- # 获取当前代理
335
- result = get_stock_page_data(pn, proxies, PAGE_SIZE)
336
- if not result.empty:
337
- return result
338
- else:
339
- # 如果当前代理失败,切换到下一个代理
340
- proxy_index = (proxy_index + 1) % len(proxy_list)
341
- if show_msg:
342
- logger.warning("页面 {} 获取失败,尝试使用代理 {} 重新获取.", pn, proxy_list[proxy_index])
343
-
344
- # 创建线程池
345
- with ThreadPoolExecutor(max_workers=10) as executor:
346
- # 提交任务,获取每页数据
347
- futures = [executor.submit(get_page_data_with_retries, pn, proxies_pool) for pn in range(1, total_pages + 1)]
348
-
349
- # 收集结果
350
- for future in futures:
351
- result = future.result()
352
- if result.empty:
353
- break # 如果返回空的DataFrame(即超时),则退出循环
354
- results.append(result)
355
-
356
- # 合并所有页面的数据
357
- if results:
358
- return pd.concat(results, ignore_index=True)
359
- else:
360
- return pd.DataFrame()
361
-
362
-
363
- # 示例调用
364
- import mns_common.component.proxies.proxy_common_api as proxy_common_api
365
- from loguru import logger
366
-
367
- # 示例调用
368
- if __name__ == "__main__":
369
-
370
- while True:
371
- result = proxy_common_api.get_proxy_ip_pool(3, 50, 3)
372
- ip_pool_list = result['ip_pool']
373
- effect_time = result['effect_time']
374
-
375
- test_df = get_real_time_quotes_ip_pool(ip_pool_list, effect_time, False)
376
- logger.info(test_df)
@@ -1,296 +0,0 @@
1
- import sys
2
- import os
3
-
4
- file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
6
- project_path = file_path[0:end]
7
- sys.path.append(project_path)
8
-
9
- import requests
10
- import json
11
- import pandas as pd
12
- from concurrent.futures import ThreadPoolExecutor
13
- import datetime
14
- from loguru import logger
15
-
16
- #
17
- # fields_02 = "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70,f71,f72,f73,f74,f75,f76,f77,f78,f79,f80,f81,f82,f83,f84,f85,f86,f87,f88,f89,f90,f91,f92,f93,f94,f95,f96,f97,f98,f99,f100,f101,f102,f103,f104,f105,f106,f107,f108" \
18
- # ",f109,f110,f111,f112,f113,f114,f115,f116,f117,f118,f119,f120,f121,f122,f123,f124,f125,f126,f127,f128,f129,f130,f131,f132,f133,f134,f135,f136,f137,f138,f139,f140,f141,f142,f143,f144,f145,f146,f147,f148,f149,f150,f151,f152,f153,f154,f155,f156,f157,f158,f159,f160,f161,f162,f163,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f184,f185,f186,f187,f188,f189,f190,f191,f192,f193,f194,f195,f196,f197,f198,f199,f200" \
19
- # ",f209,f210,f212,f213,f214,f215,f216,f217,f218,f219,f220,f221,f222,f223,f224,f225,f226,f227,f228,f229,f230,f231,f232,f233,f234,f235,f236,f237,f238,f239,f240,f241,f242,f243,f244,f245,f246,f247,f248,f249,f250,f251,f252,f253,f254,f255,f256,f257,f258,f259,f260,f261,f262,f263,f264,f265,f266,f267,f268,f269,f270,f271,f272,f273,f274,f275,f276,f277,f278,f279,f280,f281,f282,f283,f284,f285,f286,f287,f288,f289,f290,f291,f292,f293,f294,f295,f296,f297,f298,f299,f300" \
20
- # ",f309,f310,f312,f313,f314,f315,f316,f317,f318,f319,f320,f321,f322,f323,f324,f325,f326,f327,f328,f329,f330,f331,f332,f333,f334,f335,f336,f337,f338,f339,f340,f341,f342,f343,f344,f345,f346,f347,f348,f349,f350,f351,f352,f353,f354,f355,f356,f357,f358,f359,f360,f361,f362,f363,f364,f365,f366,f367,f368,f369,f370,f371,f372,f373,f374,f375,f376,f377,f378,f379,f380,f381,f382,f383,f384,f385,f386,f387,f388,f389,f390,f391,f392,f393,f394,f395,f396,f397,f398,f399,f401"
21
-
22
-
23
- fields = ("f2,f3,f5,f6,f8,"
24
- "f9,f10,f22,f12,f13,"
25
- "f14,f15,f16,f17,f18,"
26
- "f20,f21,f23,f26,f33,"
27
- "f34,f35,f37,f38,f39,"
28
- "f62,f64,f65,f67,f68,"
29
- "f66,f69,f70,f71,f72,"
30
- "f76,f77,f78,f82,f83,"
31
- "f84,f102,f184,f100,f103,"
32
- "f352,f191,f193,f24,f25")
33
-
34
- # 最大返回条数
35
- max_number = 5800
36
- # 最小返回条数
37
- min_number = 5600
38
- # 分页条数
39
- page_number = 100
40
-
41
-
42
- def get_stock_page_data(pn, fields, fs, proxies):
43
- """
44
- 获取单页股票数据
45
- """
46
- # 获取当前日期和时间
47
- current_time = datetime.datetime.now()
48
-
49
- # 将当前时间转换为时间戳(以毫秒为单位)
50
- current_timestamp_ms = int(current_time.timestamp() * 1000)
51
-
52
- url = "https://13.push2.eastmoney.com/api/qt/clist/get"
53
- params = {
54
- "cb": "jQuery1124046660442520420653_" + str(current_timestamp_ms),
55
- "pn": str(pn),
56
- "pz": "10000", # 每页最大200条
57
- "po": "1",
58
- "np": "3",
59
- "ut": "bd1d9ddb04089700cf9c27f6f7426281",
60
- "fltt": "2",
61
- "invt": "2",
62
- "wbp2u": "|0|0|0|web",
63
- "fid": "f3",
64
- "fs": fs,
65
- "fields": fields,
66
- "_": current_timestamp_ms
67
- }
68
- try:
69
- if proxies is None:
70
- r = requests.get(url, params)
71
- else:
72
- r = requests.get(url, params, proxies=proxies)
73
- data_text = r.text
74
- begin_index = data_text.index('[')
75
- end_index = data_text.index(']')
76
- data_json = data_text[begin_index:end_index + 1]
77
- data_json = json.loads(data_json)
78
- if data_json is None:
79
- return pd.DataFrame()
80
- else:
81
- return pd.DataFrame(data_json)
82
- except Exception as e:
83
- logger.error(f"获取第{pn}页股票列表异常: {e}")
84
- return pd.DataFrame()
85
-
86
-
87
- def all_stock_ticker_data_new(fields, fs, proxies) -> pd.DataFrame:
88
- """
89
- 使用多线程获取所有股票数据
90
- """
91
-
92
- per_page = page_number
93
- total_pages = (max_number + per_page - 1) // per_page # 向上取整
94
-
95
- # 创建线程池
96
- with ThreadPoolExecutor(max_workers=10) as executor:
97
- # 提交任务,获取每页数据
98
- futures = [executor.submit(get_stock_page_data, pn, fields, fs, proxies)
99
- for pn in range(1, total_pages + 1)]
100
-
101
- # 收集结果
102
- results = []
103
- for future in futures:
104
- result = future.result()
105
- if not result.empty:
106
- results.append(result)
107
-
108
- # 合并所有页面的数据
109
- if results:
110
- return pd.concat(results, ignore_index=True)
111
- else:
112
- return pd.DataFrame()
113
-
114
-
115
- def get_all_real_time_quotes(proxies):
116
- fs = "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048"
117
- # 获取第一页数据
118
- page_one_df = get_stock_page_data(1, fields, fs, proxies)
119
- # 数据接口正常返回5600以上的数量
120
- if page_one_df.shape[0] > min_number:
121
- page_one_df = rename_real_time_quotes_df(page_one_df)
122
- return page_one_df
123
- else:
124
- page_df = all_stock_ticker_data_new(fields, fs, proxies)
125
- page_df = rename_real_time_quotes_df(page_df)
126
- return page_df
127
-
128
-
129
- # 获取所有股票实时行情数据 f33,委比
130
- def rename_real_time_quotes_df(temp_df):
131
- temp_df = temp_df.rename(columns={
132
- "f2": "now_price",
133
- "f3": "chg",
134
- "f5": "volume",
135
- "f6": "amount",
136
- "f8": "exchange",
137
- "f9": "pe_ttm",
138
- "f10": "quantity_ratio",
139
- "f22": "up_speed",
140
- "f12": "symbol",
141
- "f13": "sz_sh",
142
- "f14": "name",
143
- "f15": "high",
144
- "f16": "low",
145
- "f17": "open",
146
- "f18": "yesterday_price",
147
- "f20": "total_mv",
148
- "f21": "flow_mv",
149
- "f23": "pb",
150
- "f26": "list_date",
151
- "f33": "wei_bi",
152
- "f34": "outer_disk",
153
- "f35": "inner_disk",
154
- "f37": "ROE",
155
- "f38": "total_share",
156
- "f39": "flow_share",
157
- "f62": "today_main_net_inflow",
158
- "f64": "super_large_order_inflow",
159
- "f65": "super_large_order_outflow",
160
- "f67": "super_large_order_inflow_ratio",
161
- "f68": "super_large_order_outflow_ratio",
162
-
163
- "f66": "super_large_order_net_inflow",
164
- "f69": "super_large_order_net_inflow_ratio",
165
- "f70": "large_order_inflow",
166
- "f71": "large_order_outflow",
167
- "f72": "large_order_net_inflow",
168
-
169
- "f76": "medium_order_inflow",
170
- "f77": "medium_order_outflow",
171
- "f78": "medium_order_net_inflow",
172
- "f82": "small_order_inflow",
173
- "f83": "small_order_outflow",
174
-
175
- "f84": "small_order_net_inflow",
176
- "f102": "area",
177
- "f184": "today_main_net_inflow_ratio",
178
- "f100": "industry",
179
- "f103": "concept",
180
-
181
- "f352": "average_price",
182
- "f191": "hk_stock_code",
183
- "f193": "hk_stock_name",
184
- "f24": "sixty_day_chg",
185
- "f25": "now_year_chg",
186
- })
187
- temp_df.loc[temp_df['sixty_day_chg'] == '-', 'total_share'] = 0
188
-
189
- temp_df.loc[temp_df['now_year_chg'] == '-', 'now_year_chg'] = 0
190
- temp_df.loc[temp_df['total_share'] == '-', 'total_share'] = 0
191
- temp_df.loc[temp_df['flow_share'] == '-', 'flow_share'] = 0
192
- temp_df.loc[temp_df['pe_ttm'] == '-', 'pe_ttm'] = 0
193
- temp_df.loc[temp_df['up_speed'] == '-', 'up_speed'] = 0
194
- temp_df.loc[temp_df['average_price'] == '-', 'average_price'] = 0
195
- temp_df.loc[temp_df['wei_bi'] == '-', 'wei_bi'] = 0
196
- temp_df.loc[temp_df['yesterday_price'] == '-', 'yesterday_price'] = 0
197
- temp_df.loc[temp_df['now_price'] == '-', 'now_price'] = 0
198
- temp_df.loc[temp_df['chg'] == '-', 'chg'] = 0
199
- temp_df.loc[temp_df['volume'] == '-', 'volume'] = 0
200
- temp_df.loc[temp_df['amount'] == '-', 'amount'] = 0
201
- temp_df.loc[temp_df['exchange'] == '-', 'exchange'] = 0
202
- temp_df.loc[temp_df['quantity_ratio'] == '-', 'quantity_ratio'] = 0
203
- temp_df.loc[temp_df['high'] == '-', 'high'] = 0
204
- temp_df.loc[temp_df['low'] == '-', 'low'] = 0
205
- temp_df.loc[temp_df['open'] == '-', 'open'] = 0
206
- temp_df.loc[temp_df['total_mv'] == '-', 'total_mv'] = 0
207
- temp_df.loc[temp_df['flow_mv'] == '-', 'flow_mv'] = 0
208
- temp_df.loc[temp_df['inner_disk'] == '-', 'inner_disk'] = 0
209
- temp_df.loc[temp_df['outer_disk'] == '-', 'outer_disk'] = 0
210
- temp_df.loc[temp_df['today_main_net_inflow_ratio'] == '-', 'today_main_net_inflow_ratio'] = 0
211
- temp_df.loc[temp_df['today_main_net_inflow'] == '-', 'today_main_net_inflow'] = 0
212
- temp_df.loc[temp_df['super_large_order_inflow'] == '-', 'super_large_order_inflow'] = 0
213
- temp_df.loc[temp_df['super_large_order_outflow'] == '-', 'super_large_order_outflow'] = 0
214
- temp_df.loc[temp_df['super_large_order_net_inflow'] == '-', 'super_large_order_net_inflow'] = 0
215
- temp_df.loc[temp_df['super_large_order_inflow_ratio'] == '-', 'super_large_order_inflow_ratio'] = 0
216
- temp_df.loc[temp_df['super_large_order_outflow_ratio'] == '-', 'super_large_order_outflow_ratio'] = 0
217
- temp_df.loc[temp_df['super_large_order_net_inflow_ratio'] == '-', 'super_large_order_net_inflow_ratio'] = 0
218
-
219
- temp_df.loc[temp_df['large_order_net_inflow'] == '-', 'large_order_net_inflow'] = 0
220
- temp_df.loc[temp_df['large_order_inflow'] == '-', 'large_order_inflow'] = 0
221
- temp_df.loc[temp_df['large_order_outflow'] == '-', 'large_order_outflow'] = 0
222
-
223
- temp_df.loc[temp_df['medium_order_net_inflow'] == '-', 'medium_order_net_inflow'] = 0
224
- temp_df.loc[temp_df['medium_order_outflow'] == '-', 'medium_order_outflow'] = 0
225
- temp_df.loc[temp_df['medium_order_inflow'] == '-', 'medium_order_inflow'] = 0
226
-
227
- temp_df.loc[temp_df['small_order_inflow'] == '-', 'small_order_inflow'] = 0
228
- temp_df.loc[temp_df['small_order_outflow'] == '-', 'small_order_outflow'] = 0
229
- temp_df.loc[temp_df['small_order_net_inflow'] == '-', 'small_order_net_inflow'] = 0
230
-
231
- temp_df["list_date"] = pd.to_numeric(temp_df["list_date"], errors="coerce")
232
- temp_df["wei_bi"] = pd.to_numeric(temp_df["wei_bi"], errors="coerce")
233
- temp_df["average_price"] = pd.to_numeric(temp_df["average_price"], errors="coerce")
234
- temp_df["yesterday_price"] = pd.to_numeric(temp_df["yesterday_price"], errors="coerce")
235
- temp_df["now_price"] = pd.to_numeric(temp_df["now_price"], errors="coerce")
236
- temp_df["chg"] = pd.to_numeric(temp_df["chg"], errors="coerce")
237
- temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
238
- temp_df["amount"] = pd.to_numeric(temp_df["amount"], errors="coerce")
239
- temp_df["exchange"] = pd.to_numeric(temp_df["exchange"], errors="coerce")
240
- temp_df["quantity_ratio"] = pd.to_numeric(temp_df["quantity_ratio"], errors="coerce")
241
- temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
242
- temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
243
- temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
244
- temp_df["total_mv"] = pd.to_numeric(temp_df["total_mv"], errors="coerce")
245
- temp_df["flow_mv"] = pd.to_numeric(temp_df["flow_mv"], errors="coerce")
246
- temp_df["outer_disk"] = pd.to_numeric(temp_df["outer_disk"], errors="coerce")
247
- temp_df["inner_disk"] = pd.to_numeric(temp_df["inner_disk"], errors="coerce")
248
- temp_df["today_main_net_inflow"] = pd.to_numeric(temp_df["today_main_net_inflow"], errors="coerce")
249
- temp_df["super_large_order_net_inflow"] = pd.to_numeric(temp_df["super_large_order_net_inflow"],
250
- errors="coerce")
251
- temp_df["super_large_order_net_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_net_inflow_ratio"],
252
- errors="coerce")
253
- temp_df["large_order_net_inflow"] = pd.to_numeric(temp_df["large_order_net_inflow"],
254
- errors="coerce")
255
- temp_df["medium_order_net_inflow"] = pd.to_numeric(temp_df["medium_order_net_inflow"],
256
- errors="coerce")
257
-
258
- temp_df["small_order_net_inflow"] = pd.to_numeric(temp_df["small_order_net_inflow"], errors="coerce")
259
-
260
- temp_df["pe_ttm"] = pd.to_numeric(temp_df["pe_ttm"], errors="coerce")
261
- temp_df["total_share"] = pd.to_numeric(temp_df["total_share"], errors="coerce")
262
- temp_df["flow_share"] = pd.to_numeric(temp_df["flow_share"], errors="coerce")
263
-
264
- temp_df["super_large_order_inflow"] = pd.to_numeric(temp_df["super_large_order_inflow"], errors="coerce")
265
- temp_df["super_large_order_outflow"] = pd.to_numeric(temp_df["super_large_order_outflow"], errors="coerce")
266
-
267
- temp_df["super_large_order_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_inflow_ratio"],
268
- errors="coerce")
269
- temp_df["super_large_order_outflow_ratio"] = pd.to_numeric(temp_df["super_large_order_outflow_ratio"],
270
- errors="coerce")
271
-
272
- temp_df["super_large_order_net_inflow"] = pd.to_numeric(temp_df["super_large_order_net_inflow"], errors="coerce")
273
- temp_df["super_large_order_net_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_net_inflow_ratio"],
274
- errors="coerce")
275
-
276
- temp_df["medium_order_inflow"] = pd.to_numeric(temp_df["medium_order_inflow"], errors="coerce")
277
- temp_df["medium_order_outflow"] = pd.to_numeric(temp_df["medium_order_outflow"], errors="coerce")
278
-
279
- temp_df["small_order_inflow"] = pd.to_numeric(temp_df["small_order_inflow"], errors="coerce")
280
- temp_df["small_order_outflow"] = pd.to_numeric(temp_df["small_order_outflow"], errors="coerce")
281
-
282
- outer_disk = temp_df['outer_disk']
283
- inner_disk = temp_df['inner_disk']
284
- disk_ratio = (outer_disk - inner_disk) / inner_disk
285
- temp_df['disk_ratio'] = round(disk_ratio, 2)
286
- return temp_df
287
-
288
-
289
- # 示例调用
290
- if __name__ == "__main__":
291
- number = 1
292
- while True:
293
- df = get_all_real_time_quotes(None)
294
- zt_df = df.loc[df['wei_bi'] == 100]
295
- logger.info("同步次数,{}", number)
296
- number = number + 1