mns-common 1.3.2.5__py3-none-any.whl → 1.3.2.7__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.

@@ -0,0 +1,219 @@
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
+ from concurrent.futures import ThreadPoolExecutor
9
+ import pandas as pd
10
+ from loguru import logger
11
+ import requests
12
+ import time
13
+
14
+ # 最大返回条数
15
+ max_number = 12000
16
+ # 最小返回条数
17
+ min_number = 11000
18
+ # 分页条数
19
+ page_number = 200
20
+
21
+ fields = ("f352,f2,f3,f5,f6,f8,f10,f11,f22,f12,f14,f15,f16,f17,f18,f20,f21,f26,"
22
+ "f33,f34,f35,f62,f66,f69,f72,f100,f184,f211,f212")
23
+
24
+
25
+ def us_real_time_quotes_page_df(cookie, pn):
26
+ try:
27
+ headers = {
28
+ 'Cookie': cookie
29
+ }
30
+
31
+ current_timestamp = str(int(round(time.time() * 1000, 0)))
32
+
33
+ url = "https://72.push2.eastmoney.com/api/qt/clist/get"
34
+ params = {
35
+ "pn": str(pn),
36
+ "pz": "50000",
37
+ "po": "1",
38
+ "np": "2",
39
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
40
+ "fltt": "2",
41
+ "invt": "2",
42
+ "fid": "f3",
43
+ "fs": "m:105,m:106,m:107",
44
+ "fields": fields,
45
+ "_": str(current_timestamp),
46
+ }
47
+ r = requests.get(url, params=params, headers=headers, timeout=15)
48
+ data_json = r.json()
49
+ if not data_json["data"]["diff"]:
50
+ return pd.DataFrame()
51
+ temp_df = pd.DataFrame(data_json["data"]["diff"]).T
52
+
53
+ return temp_df
54
+ except Exception as e:
55
+ logger.error("获取美股实时行情异常:{}", e)
56
+ return pd.DataFrame()
57
+
58
+
59
+ def thread_pool_executor(cookie):
60
+ """
61
+ 使用多线程获取所有美股数据
62
+ """
63
+ # 计算总页数,假设总共有1000条数据,每页200条
64
+
65
+ per_page = page_number
66
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
67
+
68
+ # 创建线程池
69
+ with ThreadPoolExecutor(max_workers=3) as executor:
70
+ # 提交任务,获取每页数据
71
+ futures = [executor.submit(us_real_time_quotes_page_df, cookie, pn)
72
+ for pn in range(1, total_pages + 1)]
73
+
74
+ # 收集结果
75
+ results = []
76
+ for future in futures:
77
+ result = future.result()
78
+ if not result.empty:
79
+ results.append(result)
80
+
81
+ # 合并所有页面的数据
82
+ if results:
83
+ return pd.concat(results, ignore_index=True)
84
+ else:
85
+ return pd.DataFrame()
86
+
87
+
88
+ def get_us_stock_real_time_quotes(cookie):
89
+ # 获取第一页数据
90
+ page_one_df = us_real_time_quotes_page_df(cookie, 1)
91
+ # 数据接口正常返回5600以上的数量
92
+ if page_one_df.shape[0] > min_number:
93
+ page_one_df = rename_us_stock(page_one_df)
94
+ return page_one_df
95
+ else:
96
+ page_df = thread_pool_executor(cookie)
97
+ page_df = rename_us_stock(page_df)
98
+ return page_df
99
+
100
+
101
+ def rename_us_stock(temp_df):
102
+ temp_df = temp_df.rename(columns={
103
+
104
+ "f12": "symbol",
105
+ "f14": "name",
106
+ "f3": "chg",
107
+ "f2": "now_price",
108
+ "f5": "volume",
109
+ "f6": "amount",
110
+ "f8": "exchange",
111
+ "f10": "quantity_ratio",
112
+ "f22": "up_speed",
113
+ "f11": "up_speed_05",
114
+
115
+ "f15": "high",
116
+ "f16": "low",
117
+ "f17": "open",
118
+ "f18": "yesterday_price",
119
+ "f20": "total_mv",
120
+ "f21": "flow_mv",
121
+ "f26": "list_date",
122
+ "f33": "wei_bi",
123
+ "f34": "outer_disk",
124
+ "f35": "inner_disk",
125
+ "f62": "today_main_net_inflow",
126
+ "f66": "super_large_order_net_inflow",
127
+ "f69": "super_large_order_net_inflow_ratio",
128
+ "f72": "large_order_net_inflow",
129
+ # "f78": "medium_order_net_inflow",
130
+ # "f84": "small_order_net_inflow",
131
+ "f100": "industry",
132
+ # "f103": "concept",
133
+ "f184": "today_main_net_inflow_ratio",
134
+ "f352": "average_price",
135
+ "f211": "buy_1_num",
136
+ "f212": "sell_1_num"
137
+ })
138
+ temp_df.loc[temp_df['buy_1_num'] == '-', 'buy_1_num'] = 0
139
+ temp_df.loc[temp_df['sell_1_num'] == '-', 'sell_1_num'] = 0
140
+ temp_df.loc[temp_df['up_speed_05'] == '-', 'up_speed_05'] = 0
141
+ temp_df.loc[temp_df['up_speed'] == '-', 'up_speed'] = 0
142
+ temp_df.loc[temp_df['average_price'] == '-', 'average_price'] = 0
143
+ temp_df.loc[temp_df['wei_bi'] == '-', 'wei_bi'] = 0
144
+ temp_df.loc[temp_df['yesterday_price'] == '-', 'yesterday_price'] = 0
145
+ temp_df.loc[temp_df['now_price'] == '-', 'now_price'] = 0
146
+ temp_df.loc[temp_df['chg'] == '-', 'chg'] = 0
147
+ temp_df.loc[temp_df['volume'] == '-', 'volume'] = 0
148
+ temp_df.loc[temp_df['amount'] == '-', 'amount'] = 0
149
+ temp_df.loc[temp_df['exchange'] == '-', 'exchange'] = 0
150
+ temp_df.loc[temp_df['quantity_ratio'] == '-', 'quantity_ratio'] = 0
151
+ temp_df.loc[temp_df['high'] == '-', 'high'] = 0
152
+ temp_df.loc[temp_df['low'] == '-', 'low'] = 0
153
+ temp_df.loc[temp_df['open'] == '-', 'open'] = 0
154
+ temp_df.loc[temp_df['total_mv'] == '-', 'total_mv'] = 0
155
+ temp_df.loc[temp_df['flow_mv'] == '-', 'flow_mv'] = 0
156
+ temp_df.loc[temp_df['inner_disk'] == '-', 'inner_disk'] = 0
157
+ temp_df.loc[temp_df['outer_disk'] == '-', 'outer_disk'] = 0
158
+ temp_df.loc[temp_df['today_main_net_inflow_ratio'] == '-', 'today_main_net_inflow_ratio'] = 0
159
+ temp_df.loc[temp_df['today_main_net_inflow'] == '-', 'today_main_net_inflow'] = 0
160
+ temp_df.loc[temp_df['super_large_order_net_inflow'] == '-', 'super_large_order_net_inflow'] = 0
161
+ temp_df.loc[temp_df['super_large_order_net_inflow_ratio'] == '-', 'super_large_order_net_inflow_ratio'] = 0
162
+ temp_df.loc[temp_df['large_order_net_inflow'] == '-', 'large_order_net_inflow'] = 0
163
+ # temp_df.loc[temp_df['medium_order_net_inflow'] == '-', 'medium_order_net_inflow'] = 0
164
+ # temp_df.loc[temp_df['small_order_net_inflow'] == '-', 'small_order_net_inflow'] = 0
165
+
166
+ temp_df["list_date"] = pd.to_numeric(temp_df["list_date"], errors="coerce")
167
+ temp_df["wei_bi"] = pd.to_numeric(temp_df["wei_bi"], errors="coerce")
168
+ temp_df["average_price"] = pd.to_numeric(temp_df["average_price"], errors="coerce")
169
+ temp_df["yesterday_price"] = pd.to_numeric(temp_df["yesterday_price"], errors="coerce")
170
+ temp_df["now_price"] = pd.to_numeric(temp_df["now_price"], errors="coerce")
171
+ temp_df["chg"] = pd.to_numeric(temp_df["chg"], errors="coerce")
172
+ temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
173
+ temp_df["amount"] = pd.to_numeric(temp_df["amount"], errors="coerce")
174
+ temp_df["exchange"] = pd.to_numeric(temp_df["exchange"], errors="coerce")
175
+ temp_df["quantity_ratio"] = pd.to_numeric(temp_df["quantity_ratio"], errors="coerce")
176
+ temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
177
+ temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
178
+ temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
179
+ temp_df["total_mv"] = pd.to_numeric(temp_df["total_mv"], errors="coerce")
180
+ temp_df["flow_mv"] = pd.to_numeric(temp_df["flow_mv"], errors="coerce")
181
+ temp_df["outer_disk"] = pd.to_numeric(temp_df["outer_disk"], errors="coerce")
182
+ temp_df["inner_disk"] = pd.to_numeric(temp_df["inner_disk"], errors="coerce")
183
+ temp_df["today_main_net_inflow"] = pd.to_numeric(temp_df["today_main_net_inflow"], errors="coerce")
184
+ temp_df["super_large_order_net_inflow"] = pd.to_numeric(temp_df["super_large_order_net_inflow"],
185
+ errors="coerce")
186
+ temp_df["super_large_order_net_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_net_inflow_ratio"],
187
+ errors="coerce")
188
+ temp_df["large_order_net_inflow"] = pd.to_numeric(temp_df["large_order_net_inflow"],
189
+ errors="coerce")
190
+ # temp_df["medium_order_net_inflow"] = pd.to_numeric(temp_df["medium_order_net_inflow"],
191
+ # errors="coerce")
192
+ # temp_df["small_order_net_inflow"] = pd.to_numeric(temp_df["small_order_net_inflow"], errors="coerce")
193
+
194
+ # 大单比例
195
+ temp_df['large_order_net_inflow_ratio'] = round((temp_df['large_order_net_inflow'] / temp_df['amount']) * 100,
196
+ 2)
197
+
198
+ # 外盘是内盘倍数
199
+ temp_df['disk_ratio'] = round((temp_df['outer_disk'] - temp_df['inner_disk']) / temp_df['inner_disk'], 2)
200
+ # 只有外盘没有内盘
201
+ temp_df.loc[temp_df["inner_disk"] == 0, ['disk_ratio']] = 1688
202
+ temp_df['disk_diff_amount'] = round(
203
+ (temp_df['outer_disk'] - temp_df['inner_disk']) * temp_df[
204
+ "average_price"],
205
+ 2)
206
+ return temp_df
207
+
208
+
209
+ if __name__ == '__main__':
210
+ cookie_test = 'qgqp_b_id=1e0d79428176ed54bef8434efdc0e8c3; mtp=1; ct=QVRY_s8Tiag1WfK2tSW2n03qpsX-PD8aH_rIjKVooawX8K33UVnpIofK088lD1lguWlE_OEIpQwn3PJWFPhHvSvyvYr4Zka3l4vxtZfH1Uikjtyy9z1H4Swo0rQzMKXncVzBXiOo5TjE-Dy9fcoG3ZF7UVdQ35jp_cFwzOlpK5Y; ut=FobyicMgeV51lVMr4ZJXvn-72bp0oeSOvtzifFY_U7kBFtR6og4Usd-VtBM5XBBvHq0lvd9xXkvpIqWro9EDKmv6cbKOQGyawUSMcKVP57isZCaM7lWQ6jWXajvTfvV4mIR-W_MZNK8VY0lL9W4qNMniJ6PBn_gkJsSAJCadmsyI9cxmjx--gR4m54pdF_nie_y4iWHys83cmWR2R7Bt1KKqB25OmkfCQTJJqIf7QsqangVGMUHwMC39Z9QhrfCFHKVNrlqS503O6b9GitQnXtvUdJhCmomu; pi=4253366368931142%3Bp4253366368931142%3B%E8%82%A1%E5%8F%8B9x56I87727%3BYNigLZRW%2FzMdGgVDOJbwReDWnTPHl51dB0gQLiwaCf1XY98mlJYx6eJbsoYr5Nie%2BX1L%2BzaMsec99KkX%2BT29Ds1arfST7sIBXxjUQ3dp11IPUnXy64PaBFRTHzMRWnCFJvvhc%2FAI41rXSGXolC8YMxI%2BvyPS%2BuErwgOVjC5vvsIiKeO7TLyKkhqqQJPX%2F7RWC5Sf3QLh%3Bdwjn4Xho10%2FKjqOgTWs%2FJF4%2FkdKzeuBwM8sz9aLvJovejAkCAyGMyGYA6AE67Xk2Ki7x8zdfBifF2DG%2Fvf2%2BXAYN8ZVISSEWTIXh32Z5MxEacK4JBTkqyiD93e1vFBOFQ82BqaiVmntUq0V6FrTUHGeh1gG5Sg%3D%3D; uidal=4253366368931142%e8%82%a1%e5%8f%8b9x56I87727; sid=170711377; vtpst=|; quote_lt=1; websitepoptg_api_time=1715777390466; emshistory=%5B%22%E8%BD%AC%E5%80%BA%E6%A0%87%22%2C%22%E8%BD%AC%E5%80%BA%E6%A0%87%E7%9A%84%22%5D; st_si=00364513876913; st_asi=delete; HAList=ty-116-00700-%u817E%u8BAF%u63A7%u80A1%2Cty-1-688695-%u4E2D%u521B%u80A1%u4EFD%2Cty-1-600849-%u4E0A%u836F%u8F6C%u6362%2Cty-1-603361-%u6D59%u6C5F%u56FD%u7965%2Cty-1-603555-ST%u8D35%u4EBA%2Cty-0-000627-%u5929%u8302%u96C6%u56E2%2Cty-0-002470-%u91D1%u6B63%u5927%2Cty-0-832876-%u6167%u4E3A%u667A%u80FD%2Cty-0-300059-%u4E1C%u65B9%u8D22%u5BCC%2Cty-107-CWB-%u53EF%u8F6C%u503AETF-SPDR; st_pvi=26930719093675; st_sp=2024-04-28%2017%3A27%3A05; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=23; st_psi=20240517111108288-113200301321-2767127768'
211
+ while True:
212
+ us_df = get_us_stock_real_time_quotes(cookie_test)
213
+ us_stock_df = us_df[[
214
+ "symbol",
215
+ "name",
216
+ "chg",
217
+ "amount"
218
+ ]]
219
+ logger.info('test')
@@ -2,34 +2,50 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 20
5
+ end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
+
9
+ import requests
10
+ import json
8
11
  import pandas as pd
12
+ from concurrent.futures import ThreadPoolExecutor
13
+ import datetime
9
14
  from loguru import logger
10
- import json
11
- import requests
15
+
16
+ # 最大返回条数
17
+ max_number = 5800
18
+ # 最小返回条数
19
+ min_number = 5600
20
+ # 分页条数
21
+ page_number = 200
12
22
 
13
23
 
14
- # 获取所有股票行情数据
15
- # 复合接口 fs 控制业务类型 fields 控制返回字段
16
- def all_stock_ticker_data(fields, fs) -> pd.DataFrame:
24
+ def get_stock_page_data(pn, fields, fs):
25
+ """
26
+ 获取单页股票数据
27
+ """
28
+ # 获取当前日期和时间
29
+ current_time = datetime.datetime.now()
30
+
31
+ # 将当前时间转换为时间戳(以毫秒为单位)
32
+ current_timestamp_ms = int(current_time.timestamp() * 1000)
33
+
17
34
  url = "https://13.push2.eastmoney.com/api/qt/clist/get"
18
- # url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112303212778189608789_1645434416300&fid=f62&po=1&pz=6000&pn=1&np=1&fltt=2&invt=2&ut=b2884a393a59ad64002292a3e90d46a5&fs=m%3A0%2Bt%3A6%2Bf%3A!2%2Cm%3A0%2Bt%3A13%2Bf%3A!2%2Cm%3A0%2Bt%3A80%2Bf%3A!2%2Cm%3A1%2Bt%3A2%2Bf%3A!2%2Cm%3A1%2Bt%3A23%2Bf%3A!2%2Cm%3A0%2Bt%3A7%2Bf%3A!2%2Cm%3A1%2Bt%3A3%2Bf%3A!2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13"
19
35
  params = {
20
- "cb": "jQuery1124046660442520420653_1660036672477",
21
- "pn": "1",
22
- "pz": "10000",
36
+ "cb": "jQuery1124046660442520420653_" + str(current_timestamp_ms),
37
+ "pn": str(pn),
38
+ "pz": "10000", # 每页最大200条
23
39
  "po": "1",
24
40
  "np": "3",
25
- "ut": " bd1d9ddb04089700cf9c27f6f7426281",
41
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
26
42
  "fltt": "2",
27
43
  "invt": "2",
28
44
  "wbp2u": "|0|0|0|web",
29
45
  "fid": "f3",
30
46
  "fs": fs,
31
47
  "fields": fields,
32
- "_": 1660036672518
48
+ "_": current_timestamp_ms
33
49
  }
34
50
  try:
35
51
  r = requests.get(url, params)
@@ -40,33 +56,68 @@ def all_stock_ticker_data(fields, fs) -> pd.DataFrame:
40
56
  data_json = json.loads(data_json)
41
57
  if data_json is None:
42
58
  return pd.DataFrame()
43
- return pd.DataFrame(data_json)
59
+ else:
60
+ return pd.DataFrame(data_json)
44
61
  except Exception as e:
45
- logger.error("获取股票列表,实时行情异常:{}", e)
46
- return None
62
+ logger.error(f"获取第{pn}页股票列表异常: {e}")
63
+ return pd.DataFrame()
47
64
 
48
65
 
49
- # 获取全量信息
50
- def get_all_real_time_quotes():
51
- 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" \
52
- ",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" \
53
- ",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" \
54
- ",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"
66
+ def all_stock_ticker_data_new(fields, fs) -> pd.DataFrame:
67
+ """
68
+ 使用多线程获取所有股票数据
69
+ """
70
+
71
+ per_page = page_number
72
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
73
+
74
+ # 创建线程池
75
+ with ThreadPoolExecutor(max_workers=10) as executor:
76
+ # 提交任务,获取每页数据
77
+ futures = [executor.submit(get_stock_page_data, pn, fields, fs)
78
+ for pn in range(1, total_pages + 1)]
55
79
 
56
- all_stock_ticker = all_stock_ticker_data(fields_02,
57
- "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048")
80
+ # 收集结果
81
+ results = []
82
+ for future in futures:
83
+ result = future.result()
84
+ if not result.empty:
85
+ results.append(result)
58
86
 
59
- temp_df = all_stock_ticker.rename(columns={
87
+ # 合并所有页面的数据
88
+ if results:
89
+ return pd.concat(results, ignore_index=True)
90
+ else:
91
+ return pd.DataFrame()
92
+
93
+
94
+ def get_all_real_time_quotes():
95
+ fields = "f352,f2,f3,f5,f6,f8,f10,f11,f22,f12,f14,f15,f16,f17,f18,f20,f21,f26,f33,f34,f35,f62,f66,f69,f72,f100,f184,f211,f212",
96
+ fs = "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048"
97
+ # 获取第一页数据
98
+ page_one_df = get_stock_page_data(1, fields, fs)
99
+ # 数据接口正常返回5600以上的数量
100
+ if page_one_df.shape[0] > min_number:
101
+ page_one_df = rename_real_time_quotes_df(page_one_df)
102
+ return page_one_df
103
+ else:
104
+ page_df = all_stock_ticker_data_new(fields, fs)
105
+ page_df = rename_real_time_quotes_df(page_df)
106
+ return page_df
107
+
108
+
109
+ # 获取所有股票实时行情数据 f33,委比
110
+ def rename_real_time_quotes_df(temp_df):
111
+ temp_df = temp_df.rename(columns={
60
112
  "f2": "now_price",
61
113
  "f3": "chg",
62
114
  "f5": "volume",
63
115
  "f6": "amount",
64
116
  "f8": "exchange",
65
- "f9": "pe_ttm",
66
117
  "f10": "quantity_ratio",
67
118
  "f22": "up_speed",
119
+ "f11": "up_speed_05",
68
120
  "f12": "symbol",
69
- "f13": "sz_sh",
70
121
  "f14": "name",
71
122
  "f15": "high",
72
123
  "f16": "low",
@@ -74,42 +125,27 @@ def get_all_real_time_quotes():
74
125
  "f18": "yesterday_price",
75
126
  "f20": "total_mv",
76
127
  "f21": "flow_mv",
77
- "f23": "pb",
78
128
  "f26": "list_date",
79
129
  "f33": "wei_bi",
80
130
  "f34": "outer_disk",
81
131
  "f35": "inner_disk",
82
- "f37": "ROE",
83
- "f38": "total_share",
84
- "f39": "flow_share",
85
132
  "f62": "today_main_net_inflow",
86
- "f64": "super_large_order_inflow",
87
- "f65": "super_large_order_outflow",
88
- "f67": "super_large_order_inflow_ratio",
89
- "f68": "super_large_order_outflow_ratio",
90
-
91
133
  "f66": "super_large_order_net_inflow",
92
134
  "f69": "super_large_order_net_inflow_ratio",
93
- "f70": "large_order_inflow",
94
- "f71": "large_order_outflow",
95
135
  "f72": "large_order_net_inflow",
96
- "f76": "medium_order_inflow",
97
- "f77": "medium_order_outflow",
98
- "f78": "medium_order_net_inflow",
99
- "f82": "small_order_inflow",
100
- "f83": "small_order_outflow",
101
- "f84": "small_order_net_inflow",
102
- "f102": "area",
103
- "f184": "today_main_net_inflow_ratio",
136
+ # "f78": "medium_order_net_inflow",
137
+ # "f84": "small_order_net_inflow",
104
138
  "f100": "industry",
105
- "f191": "hk_stock_code",
106
- "f193": "hk_stock_name",
107
- "f103": "concept",
108
- "f352": "average_price"
139
+ # "f103": "concept",
140
+ "f184": "today_main_net_inflow_ratio",
141
+ "f352": "average_price",
142
+ "f211": "buy_1_num",
143
+ "f212": "sell_1_num"
109
144
  })
110
- temp_df.loc[temp_df['total_share'] == '-', 'total_share'] = 0
111
- temp_df.loc[temp_df['flow_share'] == '-', 'flow_share'] = 0
112
- temp_df.loc[temp_df['pe_ttm'] == '-', 'pe_ttm'] = 0
145
+
146
+ temp_df.loc[temp_df['buy_1_num'] == '-', 'buy_1_num'] = 0
147
+ temp_df.loc[temp_df['sell_1_num'] == '-', 'sell_1_num'] = 0
148
+ temp_df.loc[temp_df['up_speed_05'] == '-', 'up_speed_05'] = 0
113
149
  temp_df.loc[temp_df['up_speed'] == '-', 'up_speed'] = 0
114
150
  temp_df.loc[temp_df['average_price'] == '-', 'average_price'] = 0
115
151
  temp_df.loc[temp_df['wei_bi'] == '-', 'wei_bi'] = 0
@@ -129,24 +165,11 @@ def get_all_real_time_quotes():
129
165
  temp_df.loc[temp_df['outer_disk'] == '-', 'outer_disk'] = 0
130
166
  temp_df.loc[temp_df['today_main_net_inflow_ratio'] == '-', 'today_main_net_inflow_ratio'] = 0
131
167
  temp_df.loc[temp_df['today_main_net_inflow'] == '-', 'today_main_net_inflow'] = 0
132
- temp_df.loc[temp_df['super_large_order_inflow'] == '-', 'super_large_order_inflow'] = 0
133
- temp_df.loc[temp_df['super_large_order_outflow'] == '-', 'super_large_order_outflow'] = 0
134
168
  temp_df.loc[temp_df['super_large_order_net_inflow'] == '-', 'super_large_order_net_inflow'] = 0
135
- temp_df.loc[temp_df['super_large_order_inflow_ratio'] == '-', 'super_large_order_inflow_ratio'] = 0
136
- temp_df.loc[temp_df['super_large_order_outflow_ratio'] == '-', 'super_large_order_outflow_ratio'] = 0
137
169
  temp_df.loc[temp_df['super_large_order_net_inflow_ratio'] == '-', 'super_large_order_net_inflow_ratio'] = 0
138
-
139
170
  temp_df.loc[temp_df['large_order_net_inflow'] == '-', 'large_order_net_inflow'] = 0
140
- temp_df.loc[temp_df['large_order_inflow'] == '-', 'large_order_inflow'] = 0
141
- temp_df.loc[temp_df['large_order_outflow'] == '-', 'large_order_outflow'] = 0
142
-
143
- temp_df.loc[temp_df['medium_order_net_inflow'] == '-', 'medium_order_net_inflow'] = 0
144
- temp_df.loc[temp_df['medium_order_outflow'] == '-', 'medium_order_outflow'] = 0
145
- temp_df.loc[temp_df['medium_order_inflow'] == '-', 'medium_order_inflow'] = 0
146
-
147
- temp_df.loc[temp_df['small_order_inflow'] == '-', 'small_order_inflow'] = 0
148
- temp_df.loc[temp_df['small_order_outflow'] == '-', 'small_order_outflow'] = 0
149
- temp_df.loc[temp_df['small_order_net_inflow'] == '-', 'small_order_net_inflow'] = 0
171
+ # temp_df.loc[temp_df['medium_order_net_inflow'] == '-', 'medium_order_net_inflow'] = 0
172
+ # temp_df.loc[temp_df['small_order_net_inflow'] == '-', 'small_order_net_inflow'] = 0
150
173
 
151
174
  temp_df["list_date"] = pd.to_numeric(temp_df["list_date"], errors="coerce")
152
175
  temp_df["wei_bi"] = pd.to_numeric(temp_df["wei_bi"], errors="coerce")
@@ -172,103 +195,25 @@ def get_all_real_time_quotes():
172
195
  errors="coerce")
173
196
  temp_df["large_order_net_inflow"] = pd.to_numeric(temp_df["large_order_net_inflow"],
174
197
  errors="coerce")
175
- temp_df["medium_order_net_inflow"] = pd.to_numeric(temp_df["medium_order_net_inflow"],
176
- errors="coerce")
198
+ # temp_df["medium_order_net_inflow"] = pd.to_numeric(temp_df["medium_order_net_inflow"],
199
+ # errors="coerce")
200
+ # temp_df["small_order_net_inflow"] = pd.to_numeric(temp_df["small_order_net_inflow"], errors="coerce")
177
201
 
178
- temp_df["small_order_net_inflow"] = pd.to_numeric(temp_df["small_order_net_inflow"], errors="coerce")
202
+ # 大单比例
203
+ temp_df['large_order_net_inflow_ratio'] = round((temp_df['large_order_net_inflow'] / temp_df['amount']) * 100, 2)
179
204
 
180
- temp_df["pe_ttm"] = pd.to_numeric(temp_df["pe_ttm"], errors="coerce")
181
- temp_df["total_share"] = pd.to_numeric(temp_df["total_share"], errors="coerce")
182
- temp_df["flow_share"] = pd.to_numeric(temp_df["flow_share"], errors="coerce")
205
+ # 外盘是内盘倍数
206
+ temp_df['disk_ratio'] = round((temp_df['outer_disk'] - temp_df['inner_disk']) / temp_df['inner_disk'], 2)
207
+ # 只有外盘没有内盘
208
+ temp_df.loc[temp_df["inner_disk"] == 0, ['disk_ratio']] = 1688
183
209
 
184
- temp_df["super_large_order_inflow"] = pd.to_numeric(temp_df["super_large_order_inflow"], errors="coerce")
185
- temp_df["super_large_order_outflow"] = pd.to_numeric(temp_df["super_large_order_outflow"], errors="coerce")
186
-
187
- temp_df["super_large_order_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_inflow_ratio"],
188
- errors="coerce")
189
- temp_df["super_large_order_outflow_ratio"] = pd.to_numeric(temp_df["super_large_order_outflow_ratio"],
190
- errors="coerce")
191
-
192
- temp_df["super_large_order_net_inflow"] = pd.to_numeric(temp_df["super_large_order_net_inflow"], errors="coerce")
193
- temp_df["super_large_order_net_inflow_ratio"] = pd.to_numeric(temp_df["super_large_order_net_inflow_ratio"],
194
- errors="coerce")
195
-
196
- temp_df["medium_order_inflow"] = pd.to_numeric(temp_df["medium_order_inflow"], errors="coerce")
197
- temp_df["medium_order_outflow"] = pd.to_numeric(temp_df["medium_order_outflow"], errors="coerce")
198
-
199
- temp_df["small_order_inflow"] = pd.to_numeric(temp_df["small_order_inflow"], errors="coerce")
200
- temp_df["small_order_outflow"] = pd.to_numeric(temp_df["small_order_outflow"], errors="coerce")
201
-
202
- outer_disk = temp_df['outer_disk']
203
- inner_disk = temp_df['inner_disk']
204
- disk_ratio = (outer_disk - inner_disk) / inner_disk
205
- temp_df['disk_ratio'] = round(disk_ratio, 2)
206
210
  return temp_df
207
211
 
208
212
 
209
- # 北向资金状况
210
- def get_sum_north_net_buy_amt():
211
- # 设置请求头部信息
212
- headers = {
213
- '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'
214
- }
215
-
216
- # 设置请求URL
217
- 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'
218
-
219
- # 发送HTTP请求
220
- response = requests.get(url, headers=headers, params={"type": "json"})
221
-
222
- # 解析JSON数据
223
- data = json.loads(response.text.lstrip('jsonp_1622790712837(').rstrip(');'))
224
-
225
- # 处理数据
226
-
227
- # 单位(万元)
228
- # dayNetAmtIn 资金净流入
229
- # dayAmtRemain 当日资金余额
230
- # dayAmtThreshold 当日资金限额
231
- # monthNetAmtIn 当月净流入
232
- # yearNetAmtIn 年度净流入
233
- # allNetAmtIn 总净流入
234
- # buyAmt 当日买入金额
235
- # sellAmt 当日卖出金额
236
- # buySellAmt 当日买入卖出总金额
237
- # netBuyAmt 成交净买额
238
-
239
- # Hongkong to Shanghai
240
- hk2sh = data['data']['hk2sh']
241
- hk2sh_df = pd.DataFrame(hk2sh, index=[0])
242
- # Hongkong to ShenZhen
243
- hk2sz = data['data']['hk2sz']
244
- hk2sz_df = pd.DataFrame(hk2sz, index=[0])
245
-
246
- # Shanghai to Hongkong
247
- sh2hk = data['data']['sh2hk']
248
- sh2hk_df = pd.DataFrame(sh2hk, index=[0])
249
-
250
- # ShenZhen to Hongkong
251
- sz2hk = data['data']['sz2hk']
252
- sz2hk_df = pd.DataFrame(sz2hk, index=[0])
253
- # 北向总额
254
- sum_north_netBuyAmt = hk2sh_df['netBuyAmt'] + hk2sz_df['netBuyAmt']
255
-
256
- sum_south_netBuyAmt = sh2hk_df['netBuyAmt'] + sz2hk_df['netBuyAmt']
257
-
258
- df = pd.DataFrame([[
259
- list(hk2sh_df['netBuyAmt'])[0],
260
- list(hk2sz_df['netBuyAmt'])[0],
261
- list(sum_north_netBuyAmt)[0],
262
- list(sh2hk_df['netBuyAmt'])[0],
263
- list(sz2hk_df['netBuyAmt'])[0],
264
- list(sum_south_netBuyAmt)[0]]],
265
- columns=['sh_netBuyAmt', 'sz_netBuyAmt', 'sum_north_netBuyAmt',
266
- 'sh_hk_netBuyAmt', 'sz_hk_netBuyAmt', 'sum_south_netBuyAmt'])
267
-
268
- # 打印结果
269
- return df
270
-
271
-
272
- if __name__ == '__main__':
273
- df = get_all_real_time_quotes()
274
- print(df)
213
+ # 示例调用
214
+ if __name__ == "__main__":
215
+ while True:
216
+ df = get_all_real_time_quotes()
217
+ print(df)
218
+ zt_df = df.loc[df['wei_bi'] == 100]
219
+ logger.info("涨停数据,{}", zt_df)
@@ -175,10 +175,14 @@ ONE_MINUTE_K_LINE_BFQ_H = 'one_minute_k_line_bfq_h'
175
175
  ONE_MINUTE_K_LINE_BFQ_K = 'one_minute_k_line_bfq_k'
176
176
 
177
177
  # 深圳主板分钟集合数据
178
- ONE_MINUTE_K_LINE_BFQ_K = 'one_minute_k_line_bfq_s'
178
+ ONE_MINUTE_K_LINE_BFQ_S = 'one_minute_k_line_bfq_s'
179
179
 
180
180
  # 可转债分钟集合数据
181
181
  ONE_MINUTE_K_LINE_BFQ_KZZ = 'one_minute_k_line_bfq_kzz'
182
182
 
183
183
  # ETF分钟集合数据
184
184
  ONE_MINUTE_K_LINE_BFQ_ETF = 'one_minute_k_line_bfq_etf'
185
+ # 可转债qfq 日k线
186
+ KZZ_QFQ_DAILY = 'kzz_qfq_daily'
187
+ # ETF qfq 日k线
188
+ ETF_QFQ_DAILY = 'etf_qfq_daily'