akshare 1.12.99__py3-none-any.whl → 1.15.73__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 akshare might be problematic. Click here for more details.

Files changed (236) hide show
  1. akshare/__init__.py +442 -138
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +29 -43
  4. akshare/air/sunrise_tad.py +32 -17
  5. akshare/bank/bank_cbirc_2020.py +12 -9
  6. akshare/bond/bond_cb_ths.py +17 -9
  7. akshare/bond/bond_china.py +38 -39
  8. akshare/bond/bond_china_money.py +75 -48
  9. akshare/bond/bond_info_cm.py +28 -8
  10. akshare/bond/bond_issue_cninfo.py +73 -30
  11. akshare/bond/bond_zh_cov.py +1 -1
  12. akshare/bond/bond_zh_sina.py +57 -51
  13. akshare/cal/__init__.py +0 -0
  14. akshare/cal/rv.py +170 -0
  15. akshare/cost/cost_living.py +7 -5
  16. akshare/currency/currency_safe.py +7 -6
  17. akshare/data/cninfo.js +15 -0
  18. akshare/datasets.py +10 -21
  19. akshare/economic/macro_bank.py +95 -653
  20. akshare/economic/macro_china.py +772 -1024
  21. akshare/economic/macro_china_hk.py +65 -243
  22. akshare/economic/macro_china_nbs.py +24 -7
  23. akshare/economic/macro_constitute.py +17 -12
  24. akshare/economic/macro_euro.py +13 -6
  25. akshare/economic/macro_finance_ths.py +133 -0
  26. akshare/economic/macro_info_ws.py +100 -0
  27. akshare/economic/macro_japan.py +5 -4
  28. akshare/economic/macro_other.py +12 -9
  29. akshare/economic/macro_usa.py +376 -1940
  30. akshare/economic/marco_cnbs.py +11 -6
  31. akshare/energy/energy_carbon.py +94 -125
  32. akshare/event/migration.py +3 -2
  33. akshare/exceptions.py +43 -0
  34. akshare/file_fold/calendar.json +245 -2
  35. akshare/fortune/fortune_500.py +15 -48
  36. akshare/fund/fund_amac.py +157 -75
  37. akshare/fund/fund_em.py +191 -184
  38. akshare/fund/fund_etf_em.py +16 -15
  39. akshare/fund/fund_etf_sina.py +71 -23
  40. akshare/fund/fund_etf_ths.py +93 -0
  41. akshare/fund/fund_fee_em.py +98 -0
  42. akshare/fund/fund_portfolio_em.py +60 -50
  43. akshare/fund/fund_rank_em.py +91 -82
  44. akshare/fund/fund_report_cninfo.py +63 -48
  45. akshare/fund/fund_scale_sina.py +20 -10
  46. akshare/fund/fund_xq.py +139 -109
  47. akshare/futures/cons.py +8 -31
  48. akshare/futures/cot.py +185 -137
  49. akshare/futures/futures_basis.py +97 -32
  50. akshare/futures/futures_comm_ctp.py +37 -0
  51. akshare/futures/futures_comm_qihuo.py +74 -45
  52. akshare/futures/futures_daily_bar.py +121 -184
  53. akshare/futures/futures_hf_em.py +66 -61
  54. akshare/futures/futures_hq_sina.py +79 -61
  55. akshare/futures/futures_index_ccidx.py +6 -3
  56. akshare/futures/futures_inventory_99.py +61 -272
  57. akshare/futures/futures_news_shmet.py +4 -2
  58. akshare/futures/futures_roll_yield.py +12 -25
  59. akshare/futures/futures_spot_stock_em.py +19 -13
  60. akshare/futures/futures_stock_js.py +14 -12
  61. akshare/futures/futures_to_spot.py +38 -33
  62. akshare/futures/futures_warehouse_receipt.py +75 -71
  63. akshare/futures/futures_zh_sina.py +5 -5
  64. akshare/futures/symbol_var.py +18 -13
  65. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  66. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  67. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  68. akshare/futures_derivative/futures_cot_sina.py +26 -19
  69. akshare/futures_derivative/futures_spot_sys.py +21 -8
  70. akshare/fx/currency_investing.py +19 -285
  71. akshare/index/index_cflp.py +29 -26
  72. akshare/index/index_cni.py +86 -88
  73. akshare/index/index_cons.py +26 -10
  74. akshare/index/index_cx.py +248 -47
  75. akshare/index/index_drewry.py +17 -16
  76. akshare/index/index_option_qvix.py +329 -0
  77. akshare/index/index_research_fund_sw.py +134 -0
  78. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  79. akshare/index/index_spot.py +9 -5
  80. akshare/index/index_stock_hk.py +35 -16
  81. akshare/index/index_stock_us_sina.py +1 -1
  82. akshare/index/index_stock_zh.py +180 -89
  83. akshare/index/index_stock_zh_csindex.py +15 -369
  84. akshare/index/index_sw.py +62 -34
  85. akshare/index/index_yw.py +46 -23
  86. akshare/index/index_zh_a_scope.py +48 -0
  87. akshare/index/index_zh_em.py +6 -4
  88. akshare/interest_rate/interbank_rate_em.py +14 -9
  89. akshare/movie/artist_yien.py +32 -5
  90. akshare/movie/movie_yien.py +92 -18
  91. akshare/movie/video_yien.py +28 -5
  92. akshare/news/news_baidu.py +78 -44
  93. akshare/news/news_cctv.py +38 -38
  94. akshare/news/news_stock.py +6 -3
  95. akshare/nlp/nlp_interface.py +7 -8
  96. akshare/option/cons.py +11 -11
  97. akshare/option/option_comm_qihuo.py +86 -0
  98. akshare/option/option_commodity.py +178 -51
  99. akshare/option/option_daily_stats_sse_szse.py +146 -0
  100. akshare/option/option_em.py +147 -138
  101. akshare/option/option_finance_sina.py +160 -137
  102. akshare/option/option_lhb_em.py +62 -56
  103. akshare/option/option_risk_indicator_sse.py +17 -14
  104. akshare/other/other_car_cpca.py +934 -0
  105. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  106. akshare/qdii/__init__.py +0 -0
  107. akshare/qdii/qdii_jsl.py +233 -0
  108. akshare/request.py +117 -0
  109. akshare/spot/spot_hog_soozhu.py +232 -0
  110. akshare/spot/spot_price_qh.py +121 -0
  111. akshare/spot/spot_sge.py +63 -10
  112. akshare/stock/stock_allotment_cninfo.py +10 -9
  113. akshare/stock/stock_board_concept_em.py +23 -14
  114. akshare/stock/stock_board_industry_em.py +40 -34
  115. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  116. akshare/stock/stock_cg_guarantee.py +41 -51
  117. akshare/stock/stock_cg_lawsuit.py +36 -35
  118. akshare/stock/stock_dividend_cninfo.py +12 -6
  119. akshare/stock/stock_dzjy_em.py +347 -260
  120. akshare/stock/stock_fund_em.py +332 -84
  121. akshare/stock/stock_hk_famous.py +108 -0
  122. akshare/stock/stock_hk_sina.py +8 -7
  123. akshare/stock/stock_hold_control_cninfo.py +100 -15
  124. akshare/stock/stock_hold_control_em.py +4 -3
  125. akshare/stock/stock_hold_num_cninfo.py +18 -12
  126. akshare/stock/stock_hot_rank_em.py +2 -1
  127. akshare/stock/stock_hot_search_baidu.py +5 -2
  128. akshare/stock/stock_industry_cninfo.py +24 -18
  129. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  130. akshare/stock/stock_industry_sw.py +9 -10
  131. akshare/stock/stock_info.py +25 -15
  132. akshare/stock/stock_info_em.py +5 -2
  133. akshare/stock/stock_intraday_em.py +5 -2
  134. akshare/stock/stock_intraday_sina.py +22 -18
  135. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  136. akshare/stock/stock_new_cninfo.py +32 -19
  137. akshare/stock/stock_news_cx.py +39 -0
  138. akshare/stock/stock_profile_cninfo.py +9 -8
  139. akshare/stock/stock_rank_forecast.py +8 -6
  140. akshare/stock/stock_share_changes_cninfo.py +18 -14
  141. akshare/stock/stock_share_hold.py +24 -19
  142. akshare/stock/stock_summary.py +54 -26
  143. akshare/stock/stock_us_famous.py +15 -6
  144. akshare/stock/stock_us_pink.py +7 -5
  145. akshare/stock/stock_us_sina.py +15 -12
  146. akshare/stock/stock_xq.py +38 -12
  147. akshare/stock/stock_zh_a_sina.py +53 -78
  148. akshare/stock/stock_zh_b_sina.py +32 -55
  149. akshare/stock/stock_zh_kcb_report.py +11 -9
  150. akshare/stock/stock_zh_kcb_sina.py +67 -64
  151. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  152. akshare/stock_feature/stock_a_high_low.py +5 -2
  153. akshare/stock_feature/stock_a_indicator.py +12 -9
  154. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  155. akshare/stock_feature/stock_account_em.py +58 -40
  156. akshare/stock_feature/stock_analyst_em.py +36 -27
  157. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  158. akshare/stock_feature/stock_comment_em.py +118 -85
  159. akshare/stock_feature/stock_concept_futu.py +183 -0
  160. akshare/stock_feature/stock_cyq_em.py +58 -54
  161. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  162. akshare/stock_feature/stock_esg_sina.py +216 -11
  163. akshare/stock_feature/stock_fhps_em.py +60 -25
  164. akshare/stock_feature/stock_fhps_ths.py +25 -6
  165. akshare/stock_feature/stock_fund_flow.py +38 -25
  166. akshare/stock_feature/stock_gdfx_em.py +180 -95
  167. akshare/stock_feature/stock_gdhs.py +73 -49
  168. akshare/stock_feature/stock_gpzy_em.py +78 -46
  169. akshare/stock_feature/stock_hist_em.py +55 -23
  170. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  171. akshare/stock_feature/stock_hsgt_em.py +184 -452
  172. akshare/stock_feature/stock_info.py +52 -29
  173. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  174. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  175. akshare/stock_feature/stock_jgdy_em.py +41 -38
  176. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  177. akshare/stock_feature/stock_lhb_em.py +135 -71
  178. akshare/stock_feature/stock_lhb_sina.py +93 -46
  179. akshare/stock_feature/stock_margin_em.py +102 -0
  180. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  181. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  182. akshare/stock_feature/stock_market_legu.py +13 -8
  183. akshare/stock_feature/stock_pankou_em.py +72 -34
  184. akshare/stock_feature/stock_report_em.py +244 -54
  185. akshare/stock_feature/stock_research_report_em.py +48 -19
  186. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  187. akshare/stock_feature/stock_sy_em.py +86 -33
  188. akshare/stock_feature/stock_technology_ths.py +152 -120
  189. akshare/stock_feature/stock_tfp_em.py +35 -13
  190. akshare/stock_feature/stock_three_report_em.py +119 -77
  191. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  192. akshare/stock_feature/stock_value_em.py +83 -0
  193. akshare/stock_feature/stock_wencai.py +21 -9
  194. akshare/stock_feature/stock_yjyg_em.py +63 -28
  195. akshare/stock_feature/stock_zf_pg.py +61 -38
  196. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  197. akshare/stock_feature/stock_ztb_em.py +62 -40
  198. akshare/stock_fundamental/stock_finance.py +150 -58
  199. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  200. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  201. akshare/stock_fundamental/stock_notice.py +29 -15
  202. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  203. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  204. akshare/stock_fundamental/stock_register_em.py +448 -0
  205. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  206. akshare/stock_fundamental/stock_zygc.py +10 -8
  207. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  208. akshare/tool/trade_date_hist.py +4 -3
  209. akshare/utils/cons.py +10 -0
  210. akshare/utils/context.py +43 -0
  211. akshare/utils/demjson.py +2 -2
  212. akshare/utils/func.py +26 -0
  213. akshare/utils/tqdm.py +13 -3
  214. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/METADATA +52 -69
  215. akshare-1.15.73.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/WHEEL +1 -1
  217. tests/test_func.py +3 -5
  218. akshare/bond/bond_futures.py +0 -50
  219. akshare/bond/bond_investing.py +0 -139
  220. akshare/crypto/crypto_hist_investing.py +0 -249
  221. akshare/fortune/fortune_it_juzi.py +0 -123
  222. akshare/futures/futures_international.py +0 -170
  223. akshare/futures/futures_news_baidu.py +0 -54
  224. akshare/futures/inventory_data.py +0 -100
  225. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  226. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  227. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  228. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  229. akshare/index/index_fear_greed_funddb.py +0 -71
  230. akshare/index/index_investing.py +0 -232
  231. akshare/sport/sport_olympic_winter.py +0 -39
  232. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  233. akshare/stock_fundamental/stock_register.py +0 -292
  234. akshare-1.12.99.dist-info/RECORD +0 -374
  235. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
@@ -1,297 +1,86 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/10 19:00
4
+ Date: 2024/12/23 20:00
5
5
  Desc: 99 期货网-大宗商品库存数据
6
- http://www.99qh.com/d/store.aspx
6
+ https://www.99qh.com/
7
7
  """
8
- from io import StringIO
9
8
 
9
+ import json
10
+ from functools import lru_cache
11
+ from datetime import datetime
10
12
  import pandas as pd
11
13
  import requests
12
14
  from bs4 import BeautifulSoup
13
15
 
14
- from akshare.futures.cons import (
15
- qh_headers,
16
- sample_headers,
17
- )
16
+
17
+ @lru_cache(maxsize=32)
18
+ def __get_99_symbol_map() -> pd.DataFrame:
19
+ """
20
+ 99 期货网-品种代码对照表
21
+ https://www.99qh.com/data/stockIn?productId=12
22
+ :return: 品种代码对照表
23
+ :rtype: pandas.DataFrame
24
+ """
25
+ url = "https://www.99qh.com/data/stockIn"
26
+ r = requests.get(url)
27
+ soup = BeautifulSoup(r.text, features="lxml")
28
+ raw_data = soup.find(attrs={"id": "__NEXT_DATA__"}).text
29
+ data_json = json.loads(raw_data)
30
+ df_list = []
31
+ for i, item in enumerate(
32
+ data_json["props"]["pageProps"]["data"]["varietyListData"]
33
+ ):
34
+ temp_df = pd.DataFrame(
35
+ data_json["props"]["pageProps"]["data"]["varietyListData"][i]["productList"]
36
+ )
37
+ df_list.append(temp_df)
38
+
39
+ big_df = pd.concat(df_list, ignore_index=True)
40
+ return big_df
18
41
 
19
42
 
20
- def futures_inventory_99(
21
- exchange: str = "大连商品交易所", symbol: str = "豆一"
22
- ) -> pd.DataFrame:
43
+ def futures_inventory_99(symbol: str = "豆一") -> pd.DataFrame:
23
44
  """
24
45
  99 期货网-大宗商品库存数据
25
- http://www.99qh.com/d/store.aspx
26
- :param exchange: 交易所名称; choice of {"上海期货交易所", "郑州商品交易所", "大连商品交易所", "LME", "NYMEX", "CBOT", "NYBOT", "TOCOM", "上海国际能源交易中心", "OSE"}
27
- :type exchange: str
46
+ https://www.99qh.com/data/stockIn?productId=12
28
47
  :param symbol: 交易所对应的具体品种; 如:大连商品交易所的 豆一
29
48
  :type symbol: str
30
49
  :return: 大宗商品库存数据
31
50
  :rtype: pandas.DataFrame
32
51
  """
33
- data_code = {
34
- "1": [
35
- "1",
36
- "2",
37
- "3",
38
- "12",
39
- "32",
40
- "36",
41
- "37",
42
- "40",
43
- "42",
44
- "47",
45
- "56",
46
- "63",
47
- "69",
48
- "70",
49
- "79",
50
- "85",
51
- ],
52
- "2": [
53
- "4",
54
- "14",
55
- "29",
56
- "31",
57
- "33",
58
- "38",
59
- "44",
60
- "45",
61
- "50",
62
- "51",
63
- "52",
64
- "55",
65
- "59",
66
- "64",
67
- "66",
68
- "67",
69
- "75",
70
- "76",
71
- "81",
72
- "82",
73
- "87",
74
- "92",
75
- "95",
76
- ],
77
- "3": [
78
- "6",
79
- "7",
80
- "8",
81
- "15",
82
- "30",
83
- "34",
84
- "35",
85
- "39",
86
- "43",
87
- "53",
88
- "57",
89
- "58",
90
- "61",
91
- "62",
92
- "68",
93
- "80",
94
- "84",
95
- "86",
96
- "88",
97
- "89",
98
- "94",
99
- ],
100
- "4": ["9", "10", "16", "17", "18", "23", "28"],
101
- "5": ["11", "20", "21"],
102
- "6": ["13", "24", "25", "26", "27"],
103
- "7": ["19"],
104
- "8": ["22"],
105
- "10": ["78", "83", "90", "93"],
106
- "11": ["91"],
107
- }
108
- data_name = {
109
- "1": [
110
- "铜",
111
- "铝",
112
- "橡胶",
113
- "燃料油",
114
- "锌",
115
- "黄金",
116
- "螺纹钢",
117
- "线材",
118
- "铅",
119
- "白银",
120
- "石油沥青",
121
- "热轧卷板",
122
- "锡",
123
- "镍",
124
- "纸浆",
125
- "不锈钢",
126
- ],
127
- "2": [
128
- "强麦",
129
- "一号棉",
130
- "白糖",
131
- "PTA",
132
- "菜籽油",
133
- "早籼稻",
134
- "甲醇",
135
- "普麦",
136
- "玻璃",
137
- "油菜籽",
138
- "菜籽粕",
139
- "动力煤",
140
- "粳稻",
141
- "晚籼稻",
142
- "硅铁",
143
- "锰硅",
144
- "棉纱",
145
- "苹果",
146
- "红枣",
147
- "尿素",
148
- "纯碱",
149
- "短纤",
150
- "花生",
151
- ],
152
- "3": [
153
- "豆一",
154
- "豆二",
155
- "豆粕",
156
- "玉米",
157
- "豆油",
158
- "聚乙烯",
159
- "棕榈油",
160
- "聚氯乙烯",
161
- "焦炭",
162
- "焦煤",
163
- "铁矿石",
164
- "鸡蛋",
165
- "胶合板",
166
- "聚丙烯",
167
- "玉米淀粉",
168
- "乙二醇",
169
- "粳米",
170
- "苯乙烯",
171
- "纤维板",
172
- "液化石油气",
173
- "生猪",
174
- ],
175
- "4": ["LME铜", "LME铝", "LME镍", "LME铅", "LME锌", "LME锡", "LME铝合金"],
176
- "5": ["COMEX铜", "COMEX金", "COMEX银"],
177
- "6": ["CBOT大豆", "CBOT小麦", "CBOT玉米", "CBOT燕麦", "CBOT糙米"],
178
- "7": ["NYBOT2号棉"],
179
- "8": ["TOCOM橡胶"],
180
- "10": ["原油", "20号胶", "低硫燃料油", "国际铜"],
181
- "11": ["OSE橡胶"],
182
- }
183
- temp_out_exchange_name = {
184
- "1": "上海期货交易所",
185
- "2": "郑州商品交易所",
186
- "3": "大连商品交易所",
187
- "4": "LME",
188
- "5": "NYMEX",
189
- "6": "CBOT",
190
- "7": "NYBOT",
191
- "8": "TOCOM",
192
- "10": "上海国际能源交易中心",
193
- "11": "OSE",
194
- }
195
- exchange_map = {
196
- value: key for key, value in temp_out_exchange_name.items()
52
+ temp_df = __get_99_symbol_map()
53
+ symbol_map = dict(zip(temp_df["name"], temp_df["productId"]))
54
+
55
+ url = "https://centerapi.fx168api.com/app/qh/api/stock/trend"
56
+ headers = {
57
+ "Content-Type": "application/json;charset=UTF-8",
58
+ "_pcc": "SGkj5avwu2h8Rs8/41r2LUwDHeEbaMKWe06+hWcEOO/uAQVbckWBHbwAvFbEI1eBBSvmTNqyjHKfFAn/kCpZ"
59
+ "IU7QNDvTrL2xGkQyuu+EVMU6RnZb/drmVGJRR6VhoHYMmzJvDuR6d43LnY219r44mGeL5x8qSUdh+cHjs0dm0AI=",
60
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
61
+ "Chrome/58.0.3029.110 Safari/537.3",
62
+ "referer": "https://www.99qh.com",
197
63
  }
198
- exchange = exchange_map[exchange]
199
- temp_symbol_code_map = dict(zip(data_name[exchange], data_code[exchange]))
200
- symbol = temp_symbol_code_map[symbol]
201
- out_exchange_name = {
202
- "1": "上海期货交易所",
203
- "2": "郑州商品交易所",
204
- "3": "大连商品交易所",
205
- "4": "LME",
206
- "5": "NYMEX",
207
- "6": "CBOT",
208
- "7": "NYBOT",
209
- "8": "TOCOM",
210
- "10": "上海国际能源交易中心",
211
- "11": "OSE",
64
+ params = {
65
+ "productId": symbol_map[symbol],
66
+ "type": "1",
67
+ "pageNo": "1",
68
+ "pageSize": "4000",
69
+ "startDate": "",
70
+ "endDate": f"{datetime.now().date().isoformat()}",
71
+ "appCategory": "web",
212
72
  }
213
- name_temp_dict = {}
214
- code_temp_dict = {}
215
- for num in data_code.keys():
216
- name_temp_dict[out_exchange_name[num]] = dict(
217
- zip(data_code[num], data_name[num])
218
- )
219
- code_temp_dict[num] = dict(zip(data_code[num], data_name[num]))
220
- n = 10
221
- while n != 0:
222
- try:
223
- n -= 1
224
- session = requests.Session()
225
- url = "http://service.99qh.com/Storage/Storage.aspx"
226
- params = {"page": "99qh"}
227
- r = session.post(url, params=params, headers=sample_headers)
228
- cookie = r.cookies.get_dict()
229
- url = "http://service.99qh.com/Storage/Storage.aspx"
230
- params = {"page": "99qh"}
231
- r = requests.post(
232
- url, params=params, headers=sample_headers, cookies=cookie
233
- )
234
- soup = BeautifulSoup(r.text, "lxml")
235
- view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
236
- even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[
237
- 0
238
- ]["value"]
239
- payload = {
240
- "__EVENTTARGET": "ddlExchName",
241
- "__EVENTARGUMENT": "",
242
- "__LASTFOCUS": "",
243
- "__VIEWSTATE": view_state,
244
- "__VIEWSTATEGENERATOR": "6EAC22FA",
245
- "__EVENTVALIDATION": even_validation,
246
- "ddlExchName": int(exchange),
247
- "ddlGoodsName": 1,
248
- }
249
- res = requests.post(
250
- url,
251
- params={"page": "99qh"},
252
- data=payload,
253
- headers=qh_headers,
254
- cookies=cookie,
255
- )
256
- soup = BeautifulSoup(res.text, "lxml")
257
- view_state = soup.find_all(attrs={"id": "__VIEWSTATE"})[0]["value"]
258
- even_validation = soup.find_all(attrs={"id": "__EVENTVALIDATION"})[
259
- 0
260
- ]["value"]
261
- payload = {
262
- "__EVENTTARGET": "ddlGoodsName",
263
- "__EVENTARGUMENT": "",
264
- "__LASTFOCUS": "",
265
- "__VIEWSTATE": view_state,
266
- "__VIEWSTATEGENERATOR": "6EAC22FA",
267
- "__EVENTVALIDATION": even_validation,
268
- "ddlExchName": int(exchange),
269
- "ddlGoodsName": int(symbol),
270
- }
271
- res = requests.post(
272
- url,
273
- params=params,
274
- data=payload,
275
- headers=qh_headers,
276
- cookies=cookie,
277
- )
278
- data_df = pd.read_html(StringIO(res.text))[-1].T
279
- data_df.columns = data_df.iloc[0, :]
280
- data_df = data_df.iloc[1:, :]
281
- data_df.reset_index(inplace=True, drop=True)
282
- data_df.columns.name = None
283
- data_df["日期"] = pd.to_datetime(data_df["日期"]).dt.date
284
- data_df["库存"] = pd.to_numeric(data_df["库存"])
285
- data_df["增减"] = pd.to_numeric(data_df["增减"])
286
- data_df.sort_values("日期", inplace=True)
287
- data_df.reset_index(inplace=True, drop=True)
288
- return data_df
289
- except:
290
- continue
73
+ r = requests.get(url, params, headers=headers)
74
+ data_json = r.json()
75
+ temp_df = pd.DataFrame(data_json["data"]["list"])
76
+ temp_df.columns = ["日期", "收盘价", "库存"]
77
+ temp_df.sort_values(by=["日期"], ignore_index=True, inplace=True)
78
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
79
+ temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
80
+ temp_df["库存"] = pd.to_numeric(temp_df["库存"], errors="coerce")
81
+ return temp_df
291
82
 
292
83
 
293
84
  if __name__ == "__main__":
294
- futures_inventory_99_df = futures_inventory_99(
295
- exchange="郑州商品交易所", symbol="菜籽油"
296
- )
85
+ futures_inventory_99_df = futures_inventory_99(symbol="豆一")
297
86
  print(futures_inventory_99_df)
@@ -1,10 +1,11 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2022/7/28 12:50
4
+ Date: 2024/12/26 18:00
5
5
  Desc: 上海金属网-快讯
6
6
  https://www.shmet.com/newsFlash/newsFlash.html?searchKeyword=
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -37,7 +38,7 @@ def futures_news_shmet(symbol: str = "全部") -> pd.DataFrame:
37
38
  }
38
39
  payload = {
39
40
  "currentPage": 1,
40
- "pageSize": 1000,
41
+ "pageSize": 2000,
41
42
  "content": "",
42
43
  "flashTag": symbol_map[symbol],
43
44
  }
@@ -80,6 +81,7 @@ def futures_news_shmet(symbol: str = "全部") -> pd.DataFrame:
80
81
  if __name__ == "__main__":
81
82
  futures_news_shmet_df = futures_news_shmet(symbol="铜")
82
83
  print(futures_news_shmet_df)
84
+
83
85
  for item in [
84
86
  "全部",
85
87
  "要闻",
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/1/12 16:58
4
+ Date: 2024/12/6 13:58
5
5
  Desc: 中国期货各合约展期收益率
6
6
  日线数据从 daily_bar 函数获取, 需要在收盘后运行
7
7
  """
8
+
8
9
  import datetime
9
10
  import re
10
11
  import warnings
@@ -31,9 +32,7 @@ def get_roll_yield(date=None, var="BB", symbol1=None, symbol2=None, df=None):
31
32
  df: DataFrame或None 从dailyBar得到合约价格,如果为空就在函数内部抓dailyBar,直接喂给数据可以让计算加快
32
33
  """
33
34
  # date = "20100104"
34
- date = (
35
- cons.convert_date(date) if date is not None else datetime.date.today()
36
- )
35
+ date = cons.convert_date(date) if date is not None else datetime.date.today()
37
36
  if date.strftime("%Y%m%d") not in calendar:
38
37
  warnings.warn("%s非交易日" % date.strftime("%Y%m%d"))
39
38
  return None
@@ -46,9 +45,7 @@ def get_roll_yield(date=None, var="BB", symbol1=None, symbol2=None, df=None):
46
45
  df = df[
47
46
  ~df["symbol"].str.contains("efp")
48
47
  ] # 20200304 由于交易所获取的数据中会有比如 "CUefp",所以在这里过滤
49
- df = df[df["variety"] == var].sort_values(
50
- "open_interest", ascending=False
51
- )
48
+ df = df[df["variety"] == var].sort_values("open_interest", ascending=False)
52
49
  # df["close"] = df["close"].astype("float")
53
50
  df["close"] = pd.to_numeric(df["close"])
54
51
  if len(df["close"]) < 2:
@@ -69,7 +66,7 @@ def get_roll_yield(date=None, var="BB", symbol1=None, symbol2=None, df=None):
69
66
  if close1 == 0 or close2 == 0:
70
67
  return False
71
68
  if c > 0:
72
- return math.log(close2 / close1) / c * 12, symbol2, symbol1
69
+ return math.log(close1 / close2) / c * 12, symbol2, symbol1
73
70
  else:
74
71
  return math.log(close2 / close1) / c * 12, symbol1, symbol2
75
72
 
@@ -93,20 +90,14 @@ def get_roll_yield_bar(
93
90
  ry 展期收益率
94
91
  index 日期或品种
95
92
  """
96
- date = (
97
- cons.convert_date(date) if date is not None else datetime.date.today()
98
- )
93
+ date = cons.convert_date(date) if date is not None else datetime.date.today()
99
94
  start_day = (
100
- cons.convert_date(start_day)
101
- if start_day is not None
102
- else datetime.date.today()
95
+ cons.convert_date(start_day) if start_day is not None else datetime.date.today()
103
96
  )
104
97
  end_day = (
105
98
  cons.convert_date(end_day)
106
99
  if end_day is not None
107
- else cons.convert_date(
108
- cons.get_latest_data_date(datetime.datetime.now())
109
- )
100
+ else cons.convert_date(cons.get_latest_data_date(datetime.datetime.now()))
110
101
  )
111
102
 
112
103
  if type_method == "symbol":
@@ -122,13 +113,11 @@ def get_roll_yield_bar(
122
113
  df = pd.concat(
123
114
  [
124
115
  df,
125
- get_futures_daily(
126
- start_date=date, end_date=date, market=market
127
- ),
116
+ get_futures_daily(start_date=date, end_date=date, market=market),
128
117
  ]
129
118
  )
130
119
  var_list = list(set(df["variety"]))
131
- for i_remove in ['IO', 'MO', 'HO']:
120
+ for i_remove in ["IO", "MO", "HO"]:
132
121
  if i_remove in var_list:
133
122
  var_list.remove(i_remove)
134
123
  df_l = pd.DataFrame()
@@ -165,7 +154,7 @@ def get_roll_yield_bar(
165
154
  ),
166
155
  ]
167
156
  )
168
- except:
157
+ except: # noqa: E722
169
158
  pass
170
159
  start_day += datetime.timedelta(days=1)
171
160
  return df_l
@@ -186,7 +175,5 @@ if __name__ == "__main__":
186
175
  )
187
176
  print(get_roll_yield_bar_range_df)
188
177
 
189
- get_roll_yield_bar_symbol = get_roll_yield_bar(
190
- type_method="var", date="20210201"
191
- )
178
+ get_roll_yield_bar_symbol = get_roll_yield_bar(type_method="var", date="20210201")
192
179
  print(get_roll_yield_bar_symbol)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/10/14 17:15
4
+ Date: 2024/3/21 12:00
5
5
  Desc: 东方财富网-数据中心-现货与股票
6
- http://data.eastmoney.com/ifdata/xhgp.html
6
+ https://data.eastmoney.com/ifdata/xhgp.html
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -14,7 +15,7 @@ from akshare.utils import demjson
14
15
  def futures_spot_stock(symbol: str = "能源") -> pd.DataFrame:
15
16
  """
16
17
  东方财富网-数据中心-现货与股票
17
- http://data.eastmoney.com/ifdata/xhgp.html
18
+ https://data.eastmoney.com/ifdata/xhgp.html
18
19
  :param symbol: choice of {'能源', '化工', '塑料', '纺织', '有色', '钢铁', '建材', '农副'}
19
20
  :type symbol: str
20
21
  :return: 现货与股票上下游对应数据
@@ -30,9 +31,10 @@ def futures_spot_stock(symbol: str = "能源") -> pd.DataFrame:
30
31
  "建材": 6,
31
32
  "农副": 7,
32
33
  }
33
- url = "http://data.eastmoney.com/ifdata/xhgp.html"
34
+ url = "https://data.eastmoney.com/ifdata/xhgp.html"
34
35
  headers = {
35
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
36
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,"
37
+ "image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
36
38
  "Accept-Encoding": "gzip, deflate",
37
39
  "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
38
40
  "Cache-Control": "no-cache",
@@ -40,13 +42,14 @@ def futures_spot_stock(symbol: str = "能源") -> pd.DataFrame:
40
42
  "Host": "data.eastmoney.com",
41
43
  "Pragma": "no-cache",
42
44
  "Upgrade-Insecure-Requests": "1",
43
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
45
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
46
+ "(KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
44
47
  }
45
48
  r = requests.get(url, headers=headers)
46
49
  data_text = r.text
47
50
  temp_json = demjson.decode(
48
51
  data_text[
49
- data_text.find("pagedata"): data_text.find(
52
+ data_text.find("pagedata") : data_text.find(
50
53
  "/newstatic/js/common/emdataview.js"
51
54
  )
52
55
  ]
@@ -79,16 +82,19 @@ def futures_spot_stock(symbol: str = "能源") -> pd.DataFrame:
79
82
  "生产商",
80
83
  "下游用户",
81
84
  ]
82
- temp_df[date_list[0]] = pd.to_numeric(temp_df[date_list[0]])
83
- temp_df[date_list[1]] = pd.to_numeric(temp_df[date_list[1]])
84
- temp_df[date_list[2]] = pd.to_numeric(temp_df[date_list[2]])
85
- temp_df[date_list[3]] = pd.to_numeric(temp_df[date_list[3]])
86
- temp_df['最新价格'] = pd.to_numeric(temp_df['最新价格'])
87
- temp_df['近半年涨跌幅'] = pd.to_numeric(temp_df['近半年涨跌幅'])
85
+ temp_df[date_list[0]] = pd.to_numeric(temp_df[date_list[0]], errors="coerce")
86
+ temp_df[date_list[1]] = pd.to_numeric(temp_df[date_list[1]], errors="coerce")
87
+ temp_df[date_list[2]] = pd.to_numeric(temp_df[date_list[2]], errors="coerce")
88
+ temp_df[date_list[3]] = pd.to_numeric(temp_df[date_list[3]], errors="coerce")
89
+ temp_df["最新价格"] = pd.to_numeric(temp_df["最新价格"], errors="coerce")
90
+ temp_df["近半年涨跌幅"] = pd.to_numeric(temp_df["近半年涨跌幅"], errors="coerce")
88
91
  return temp_df
89
92
 
90
93
 
91
94
  if __name__ == "__main__":
95
+ futures_spot_stock_df = futures_spot_stock(symbol="能源")
96
+ print(futures_spot_stock_df)
97
+
92
98
  for sector in ["能源", "化工", "塑料", "纺织", "有色", "钢铁", "建材", "农副"]:
93
99
  futures_spot_stock_df = futures_spot_stock(symbol=sector)
94
100
  print(futures_spot_stock_df)
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/2/24 15:30
4
+ Date: 2024/4/24 18:10
5
5
  Desc: 上海期货交易所指定交割仓库库存周报
6
6
  https://datacenter.jin10.com/reportType/dc_shfe_weekly_stock
7
- https://www.shfe.com.cn/statements/dataview.html?paramid=kx
7
+ https://tsite.shfe.com.cn/statements/dataview.html?paramid=kx
8
8
  """
9
+
9
10
  import pandas as pd
10
11
  import requests
11
12
 
12
13
 
13
- def futures_stock_shfe_js(date: str = "20240223") -> pd.DataFrame:
14
+ def futures_stock_shfe_js(date: str = "20240419") -> pd.DataFrame:
14
15
  """
15
16
  金十财经-上海期货交易所指定交割仓库库存周报
16
17
  https://datacenter.jin10.com/reportType/dc_shfe_weekly_stock
@@ -20,27 +21,28 @@ def futures_stock_shfe_js(date: str = "20240223") -> pd.DataFrame:
20
21
  :rtype: pandas.Series
21
22
  """
22
23
  headers = {
23
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
24
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
25
+ "Chrome/107.0.0.0 Safari/537.36",
24
26
  "x-app-id": "rU6QIu7JHe2gOUeR",
25
27
  "x-csrf-token": "x-csrf-token",
26
28
  "x-version": "1.0.0",
27
29
  }
28
30
  url = "https://datacenter-api.jin10.com/reports/list"
29
31
  params = {
30
- 'category': 'stock',
31
- 'date': '-'.join([date[:4], date[4:6], date[6:]]),
32
- 'attr_id': '1',
33
- '_': '1708761356458',
32
+ "category": "stock",
33
+ "date": "-".join([date[:4], date[4:6], date[6:]]),
34
+ "attr_id": "1",
35
+ "_": "1708761356458",
34
36
  }
35
37
  r = requests.get(url, params=params, headers=headers)
36
38
  data_json = r.json()
37
- columns_list = [item['name'] for item in data_json['data']['keys']]
38
- temp_df = pd.DataFrame(data_json['data']['values'], columns=columns_list)
39
+ columns_list = [item["name"] for item in data_json["data"]["keys"]]
40
+ temp_df = pd.DataFrame(data_json["data"]["values"], columns=columns_list)
39
41
  for item in columns_list[1:]:
40
42
  temp_df[item] = pd.to_numeric(temp_df[item], errors="coerce")
41
43
  return temp_df
42
44
 
43
45
 
44
- if __name__ == '__main__':
45
- futures_stock_shfe_js_df = futures_stock_shfe_js(date="20240223")
46
+ if __name__ == "__main__":
47
+ futures_stock_shfe_js_df = futures_stock_shfe_js(date="20240419")
46
48
  print(futures_stock_shfe_js_df)