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,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/18 17:40
4
+ Date: 2024/11/28 22:00
5
5
  Desc: 东方财富网-行情中心-期货市场-国际期货
6
6
  https://quote.eastmoney.com/center/gridlist.html#futures_global
7
7
  """
8
+
8
9
  import math
9
10
 
10
11
  import pandas as pd
@@ -13,7 +14,7 @@ import requests
13
14
  from akshare.utils.tqdm import get_tqdm
14
15
 
15
16
 
16
- def futures_global_em():
17
+ def futures_global_em() -> pd.DataFrame:
17
18
  """
18
19
  东方财富网-行情中心-期货市场-国际期货
19
20
  https://quote.eastmoney.com/center/gridlist.html#futures_global
@@ -22,77 +23,81 @@ def futures_global_em():
22
23
  """
23
24
  url = "https://futsseapi.eastmoney.com/list/COMEX,NYMEX,COBOT,SGX,NYBOT,LME,MDEX,TOCOM,IPE"
24
25
  params = {
25
- 'orderBy': 'zdf',
26
- 'sort': 'desc',
27
- 'pageSize': '20',
28
- 'pageIndex': '0',
29
- 'token': '58b2fa8f54638b60b87d69b31969089c',
30
- 'field': 'dm,sc,name,p,zsjd,zde,zdf,f152,o,h,l,zjsj,vol,wp,np,ccl',
31
- 'blockName': 'callback',
32
- '_': '1705570814466'
26
+ "orderBy": "zdf",
27
+ "sort": "desc",
28
+ "pageSize": "20",
29
+ "pageIndex": "0",
30
+ "token": "58b2fa8f54638b60b87d69b31969089c",
31
+ "field": "dm,sc,name,p,zsjd,zde,zdf,f152,o,h,l,zjsj,vol,wp,np,ccl",
32
+ "blockName": "callback",
33
33
  }
34
34
  r = requests.get(url, params=params)
35
35
  data_json = r.json()
36
- total_num = data_json['total']
36
+ total_num = data_json["total"]
37
37
  total_page = math.ceil(total_num / 20) - 1
38
38
  tqdm = get_tqdm()
39
39
  big_df = pd.DataFrame()
40
40
  for page in tqdm(range(total_page), leave=False):
41
- params.update({'pageIndex': page})
41
+ params.update({"pageIndex": page})
42
42
  r = requests.get(url, params=params)
43
43
  data_json = r.json()
44
- temp_df = pd.DataFrame(data_json['list'])
45
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
44
+ temp_df = pd.DataFrame(data_json["list"])
45
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
46
46
  big_df.reset_index(inplace=True)
47
- big_df['index'] = big_df['index'] + 1
48
- big_df.rename(columns={
49
- 'index': "序号",
50
- 'np': "卖盘",
51
- 'h': "最新价",
52
- 'dm': "代码",
53
- 'zsjd': "-",
54
- 'l': "最低",
55
- 'ccl': "持仓量",
56
- 'o': "今开",
57
- 'p': "最高",
58
- 'sc': "-",
59
- 'vol': "成交量",
60
- 'name': "名称",
61
- 'wp': "买盘",
62
- 'zde': "涨跌额",
63
- 'zdf': "涨跌幅",
64
- 'zjsj': "昨结"
65
- }, inplace=True)
66
- big_df = big_df[[
67
- "序号",
68
- "代码",
69
- "名称",
70
- "最新价",
71
- "涨跌额",
72
- "涨跌幅",
73
- "今开",
74
- "最高",
75
- "最低",
76
- "昨结",
77
- "成交量",
78
- "买盘",
79
- "卖盘",
80
- "持仓量",
81
- ]]
82
- big_df['最新价'] = pd.to_numeric(big_df['最新价'], errors="coerce")
83
- big_df['涨跌额'] = pd.to_numeric(big_df['涨跌额'], errors="coerce")
84
- big_df['涨跌幅'] = pd.to_numeric(big_df['涨跌幅'], errors="coerce")
85
- big_df['今开'] = pd.to_numeric(big_df['今开'], errors="coerce")
86
- big_df['最高'] = pd.to_numeric(big_df['最高'], errors="coerce")
87
- big_df['最低'] = pd.to_numeric(big_df['最低'], errors="coerce")
88
- big_df['昨结'] = pd.to_numeric(big_df['昨结'], errors="coerce")
89
- big_df['成交量'] = pd.to_numeric(big_df['成交量'], errors="coerce")
90
- big_df['买盘'] = pd.to_numeric(big_df['买盘'], errors="coerce")
91
- big_df['卖盘'] = pd.to_numeric(big_df['卖盘'], errors="coerce")
92
- big_df['持仓量'] = pd.to_numeric(big_df['持仓量'], errors="coerce")
47
+ big_df["index"] = big_df["index"] + 1
48
+ big_df.rename(
49
+ columns={
50
+ "index": "序号",
51
+ "np": "卖盘",
52
+ "h": "最高",
53
+ "dm": "代码",
54
+ "zsjd": "-",
55
+ "l": "最低",
56
+ "ccl": "持仓量",
57
+ "o": "今开",
58
+ "p": "最新价",
59
+ "sc": "-",
60
+ "vol": "成交量",
61
+ "name": "名称",
62
+ "wp": "买盘",
63
+ "zde": "涨跌额",
64
+ "zdf": "涨跌幅",
65
+ "zjsj": "昨结",
66
+ },
67
+ inplace=True,
68
+ )
69
+ big_df = big_df[
70
+ [
71
+ "序号",
72
+ "代码",
73
+ "名称",
74
+ "最新价",
75
+ "涨跌额",
76
+ "涨跌幅",
77
+ "今开",
78
+ "最高",
79
+ "最低",
80
+ "昨结",
81
+ "成交量",
82
+ "买盘",
83
+ "卖盘",
84
+ "持仓量",
85
+ ]
86
+ ]
87
+ big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
88
+ big_df["涨跌额"] = pd.to_numeric(big_df["涨跌额"], errors="coerce")
89
+ big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
90
+ big_df["今开"] = pd.to_numeric(big_df["今开"], errors="coerce")
91
+ big_df["最高"] = pd.to_numeric(big_df["最高"], errors="coerce")
92
+ big_df["最低"] = pd.to_numeric(big_df["最低"], errors="coerce")
93
+ big_df["昨结"] = pd.to_numeric(big_df["昨结"], errors="coerce")
94
+ big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
95
+ big_df["买盘"] = pd.to_numeric(big_df["买盘"], errors="coerce")
96
+ big_df["卖盘"] = pd.to_numeric(big_df["卖盘"], errors="coerce")
97
+ big_df["持仓量"] = pd.to_numeric(big_df["持仓量"], errors="coerce")
93
98
  return big_df
94
99
 
95
100
 
96
- if __name__ == '__main__':
101
+ if __name__ == "__main__":
97
102
  futures_global_em_df = futures_global_em()
98
103
  print(futures_global_em_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/10 17:00
4
+ Date: 2024/8/31 17:30
5
5
  Desc: 新浪财经-外盘期货
6
6
  https://finance.sina.com.cn/money/future/hf.html
7
7
  """
8
+
8
9
  import time
9
10
  from typing import Union, List
10
11
 
@@ -27,8 +28,8 @@ def _get_real_name_list() -> list:
27
28
  r.encoding = "gb2312"
28
29
  data_text = r.text
29
30
  need_text = data_text[
30
- data_text.find("var oHF_1 = ") + 12: data_text.find("var oHF_2") - 2
31
- ].replace("\n\t", "")
31
+ data_text.find("var oHF_1 = ") + 12 : data_text.find("var oHF_2") - 2
32
+ ].replace("\n\t", "")
32
33
  data_json = demjson.decode(need_text)
33
34
  name_list = [item[0].strip() for item in data_json.values()]
34
35
  return name_list
@@ -47,7 +48,7 @@ def futures_foreign_commodity_subscribe_exchange_symbol() -> list:
47
48
  data_text = r.text
48
49
  data_json = demjson.decode(
49
50
  data_text[
50
- data_text.find("var oHF_1 = ") + 12: data_text.find("var oHF_2 = ") - 2
51
+ data_text.find("var oHF_1 = ") + 12 : data_text.find("var oHF_2 = ") - 2
51
52
  ]
52
53
  )
53
54
  code_list = list(data_json.keys())
@@ -62,39 +63,40 @@ def futures_hq_subscribe_exchange_symbol() -> pd.DataFrame:
62
63
  :rtype: pandas.DataFrame
63
64
  """
64
65
  inner_dict = {
65
- "新交所 TSI CFR 中国铁矿石(62%铁粉)指数": 'FEF',
66
- "马棕油": 'FCPO',
67
- "日橡胶": 'RSS3',
68
- "CME比特币期货": 'BTC',
69
- "NYBOT-棉花": 'CT',
70
- "LME镍3个月": 'NID',
71
- "LME3个月": 'PBD',
72
- "LME3个月": 'SND',
73
- "LME3个月": 'ZSD',
74
- "LME3个月": 'AHD',
75
- "LME3个月": 'CAD',
76
- "CBOT-黄豆": 'S',
77
- "CBOT-小麦": 'W',
78
- "CBOT-玉米": 'C',
79
- "CBOT-黄豆油": 'BO',
80
- "CBOT-黄豆粉": 'SM',
81
- "日本橡胶": 'TRB',
82
- "COMEX铜": 'HG',
83
- "NYMEX天然气": 'NG',
84
- "NYMEX原油": 'CL',
85
- "COMEX白银": 'SI',
86
- "COMEX黄金": 'GC',
87
- "CME-瘦肉猪": 'LHC',
88
- "布伦特原油": 'OIL',
89
- "伦敦金": 'XAU',
90
- "伦敦银": 'XAG',
91
- "伦敦铂金": 'XPT',
92
- "伦敦钯金": 'XPD',
93
- "欧洲碳排放": 'EUA',
66
+ "新加坡铁矿石": "FEF",
67
+ "马棕油": "FCPO",
68
+ "日橡胶": "RSS3",
69
+ "美国原糖": "RS",
70
+ "CME比特币期货": "BTC",
71
+ "NYBOT-棉花": "CT",
72
+ "LME3个月": "NID",
73
+ "LME3个月": "PBD",
74
+ "LME3个月": "SND",
75
+ "LME3个月": "ZSD",
76
+ "LME3个月": "AHD",
77
+ "LME铜3个月": "CAD",
78
+ "CBOT-黄豆": "S",
79
+ "CBOT-小麦": "W",
80
+ "CBOT-玉米": "C",
81
+ "CBOT-黄豆油": "BO",
82
+ "CBOT-黄豆粉": "SM",
83
+ "日本橡胶": "TRB",
84
+ "COMEX铜": "HG",
85
+ "NYMEX天然气": "NG",
86
+ "NYMEX原油": "CL",
87
+ "COMEX白银": "SI",
88
+ "COMEX黄金": "GC",
89
+ "CME-瘦肉猪": "LHC",
90
+ "布伦特原油": "OIL",
91
+ "伦敦金": "XAU",
92
+ "伦敦银": "XAG",
93
+ "伦敦铂金": "XPT",
94
+ "伦敦钯金": "XPD",
95
+ "欧洲碳排放": "EUA",
94
96
  }
95
- temp_df = pd.DataFrame.from_dict(inner_dict, orient='index')
97
+ temp_df = pd.DataFrame.from_dict(inner_dict, orient="index")
96
98
  temp_df.reset_index(inplace=True)
97
- temp_df.columns = ['symbol', 'code']
99
+ temp_df.columns = ["symbol", "code"]
98
100
  return temp_df
99
101
 
100
102
 
@@ -114,21 +116,22 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
114
116
  payload = "?list=" + ",".join(["hf_" + item for item in symbol])
115
117
  url = "https://hq.sinajs.cn/" + payload
116
118
  headers = {
117
- 'Accept': '*/*',
118
- 'Accept-Encoding': 'gzip, deflate, br',
119
- 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
120
- 'Cache-Control': 'no-cache',
121
- 'Connection': 'keep-alive',
122
- 'Host': 'hq.sinajs.cn',
123
- 'Pragma': 'no-cache',
124
- 'Referer': 'https://finance.sina.com.cn/',
125
- 'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
126
- 'sec-ch-ua-mobile': '?0',
127
- 'sec-ch-ua-platform': '"Windows"',
128
- 'Sec-Fetch-Dest': 'script',
129
- 'Sec-Fetch-Mode': 'no-cors',
130
- 'Sec-Fetch-Site': 'cross-site',
131
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
119
+ "Accept": "*/*",
120
+ "Accept-Encoding": "gzip, deflate, br",
121
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
122
+ "Cache-Control": "no-cache",
123
+ "Connection": "keep-alive",
124
+ "Host": "hq.sinajs.cn",
125
+ "Pragma": "no-cache",
126
+ "Referer": "https://finance.sina.com.cn/",
127
+ "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
128
+ "sec-ch-ua-mobile": "?0",
129
+ "sec-ch-ua-platform": '"Windows"',
130
+ "Sec-Fetch-Dest": "script",
131
+ "Sec-Fetch-Mode": "no-cors",
132
+ "Sec-Fetch-Site": "cross-site",
133
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
134
+ "Chrome/97.0.4692.71 Safari/537.36",
132
135
  }
133
136
  r = requests.get(url, headers=headers)
134
137
  data_text = r.text
@@ -141,6 +144,11 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
141
144
  )
142
145
  data_df.iloc[:, 0] = data_df.iloc[:, 0].str.replace('"', "")
143
146
  data_df.iloc[:, -1] = data_df.iloc[:, -1].str.replace('"', "")
147
+
148
+ # 处理伦敦金 XAU 的情况
149
+ if len(data_df.columns) == 14:
150
+ data_df["temp"] = None
151
+
144
152
  data_df.columns = [
145
153
  "current_price",
146
154
  "-",
@@ -159,7 +167,9 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
159
167
  "current_price_rmb",
160
168
  ]
161
169
  temp_symbol_code_df = futures_hq_subscribe_exchange_symbol()
162
- temp_symbol_code_dict = dict(zip(temp_symbol_code_df['code'], temp_symbol_code_df['symbol']))
170
+ temp_symbol_code_dict = dict(
171
+ zip(temp_symbol_code_df["code"], temp_symbol_code_df["symbol"])
172
+ )
163
173
  data_df["symbol"] = [temp_symbol_code_dict[subscribe] for subscribe in symbol]
164
174
  data_df = data_df[
165
175
  [
@@ -202,7 +212,9 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
202
212
  data_df["开盘价"] = pd.to_numeric(data_df["开盘价"], errors="coerce")
203
213
  data_df["持仓量"] = pd.to_numeric(data_df["持仓量"], errors="coerce")
204
214
  data_df["涨跌额"] = data_df["最新价"] - data_df["昨日结算价"]
205
- data_df["涨跌幅"] = (data_df["最新价"] - data_df["昨日结算价"]) / data_df["昨日结算价"] * 100
215
+ data_df["涨跌幅"] = (
216
+ (data_df["最新价"] - data_df["昨日结算价"]) / data_df["昨日结算价"] * 100
217
+ )
206
218
  data_df = data_df[
207
219
  [
208
220
  "名称",
@@ -225,13 +237,13 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
225
237
  # 获取转换比例数据
226
238
  url = "https://finance.sina.com.cn/money/future/hf.html"
227
239
  r = requests.get(url)
228
- r.encoding = "gb2312"
229
- soup = BeautifulSoup(r.text, "lxml")
230
- data_text = soup.find_all("script", attrs={"type": "text/javascript"})[
240
+ r.encoding = "utf-8"
241
+ soup = BeautifulSoup(r.text, features="lxml")
242
+ data_text = soup.find_all(name="script", attrs={"type": "text/javascript"})[
231
243
  -2
232
244
  ].string.strip()
233
- raw_text = data_text[data_text.find("oHF_1 = "): data_text.find("oHF_2")]
234
- need_text = raw_text[raw_text.find("{"): raw_text.rfind("}") + 1]
245
+ raw_text = data_text[data_text.find("oHF_1 = ") : data_text.find("oHF_2")]
246
+ need_text = raw_text[raw_text.find("{") : raw_text.rfind("}") + 1]
235
247
  data_json = demjson.decode(need_text)
236
248
  price_mul = pd.DataFrame(
237
249
  [
@@ -240,17 +252,23 @@ def futures_foreign_commodity_realtime(symbol: Union[str, List[str]]) -> pd.Data
240
252
  ]
241
253
  ).T
242
254
  price_mul.columns = ["symbol", "price"]
255
+ price_mul = price_mul[price_mul["symbol"].isin(data_df["名称"])]
256
+ price_mul.reset_index(inplace=True, drop=True)
257
+ price_mul["price"] = pd.to_numeric(price_mul["price"], errors="coerce")
243
258
 
244
259
  # 获取汇率数据
245
260
  url = "https://hq.sinajs.cn/?list=USDCNY"
246
261
  r = requests.get(url, headers=headers)
247
262
  data_text = r.text
248
263
  usd_rmb = float(
249
- data_text[data_text.find('"') + 1: data_text.find(",美元人民币")].split(",")[-1]
264
+ data_text[data_text.find('"') + 1 : data_text.find(",美元人民币")].split(",")[
265
+ -1
266
+ ]
250
267
  )
251
268
 
252
269
  # 计算人民币报价
253
- data_df["人民币报价"] = data_df["最新价"] * price_mul["price"] * usd_rmb
270
+ data_df["最新价"] = pd.to_numeric(data_df["最新价"], errors="coerce")
271
+ data_df["人民币报价"] = data_df["最新价"] * price_mul["price"] * float(usd_rmb)
254
272
  data_df.dropna(thresh=4, inplace=True)
255
273
  return data_df
256
274
 
@@ -263,12 +281,12 @@ if __name__ == "__main__":
263
281
  subscribes = futures_foreign_commodity_subscribe_exchange_symbol()
264
282
 
265
283
  futures_foreign_commodity_realtime_df = futures_foreign_commodity_realtime(
266
- symbol='CT,NID'
284
+ symbol="CT,NID"
267
285
  )
268
286
  print(futures_foreign_commodity_realtime_df)
269
287
 
270
288
  futures_foreign_commodity_realtime_df = futures_foreign_commodity_realtime(
271
- symbol=['CT', 'NID']
289
+ symbol=["XAU"]
272
290
  )
273
291
  print(futures_foreign_commodity_realtime_df)
274
292
 
@@ -5,6 +5,7 @@ Date: 2023/11/9 14:00
5
5
  Desc: 中证商品指数
6
6
  http://www.ccidx.com/
7
7
  """
8
+
8
9
  from io import BytesIO
9
10
 
10
11
  import pandas as pd
@@ -51,7 +52,7 @@ def futures_index_ccidx(symbol: str = "中证商品期货指数") -> pd.DataFram
51
52
  temp_df["结算"] = pd.to_numeric(temp_df["结算"], errors="coerce")
52
53
  temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
53
54
  temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
54
- temp_df.sort_values(by=['日期'], inplace=True)
55
+ temp_df.sort_values(by=["日期"], inplace=True)
55
56
  temp_df.reset_index(inplace=True, drop=True)
56
57
  return temp_df
57
58
 
@@ -60,7 +61,8 @@ def futures_index_min_ccidx(symbol: str = "中证监控油脂油料期货指数"
60
61
  """
61
62
  中证商品指数-商品指数-分时数据
62
63
  http://www.ccidx.com/index.html
63
- :param symbol: choice of {"中证商品期货指数", "中证商品期货价格指数", "中证监控油脂油料期货指数", "中证监控软商品期货指数", "中证监控能化期货指数", "中证监控钢铁期货指数"}
64
+ :param symbol: choice of {"中证商品期货指数", "中证商品期货价格指数", "中证监控油脂油料期货指数", "中证监控软商品期货指数",
65
+ "中证监控能化期货指数", "中证监控钢铁期货指数"}
64
66
  :type symbol: str
65
67
  :return: 商品指数-分时数据
66
68
  :rtype: pandas.DataFrame
@@ -93,7 +95,8 @@ def futures_index_min_ccidx(symbol: str = "中证监控油脂油料期货指数"
93
95
  "Pragma": "no-cache",
94
96
  "Proxy-Connection": "keep-alive",
95
97
  "Referer": "http://www.ccidx.com/cscidx/quote1",
96
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
98
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
99
+ "Chrome/92.0.4515.159 Safari/537.36",
97
100
  "X-Requested-With": "XMLHttpRequest",
98
101
  }
99
102
  r = requests.post(url, params=params, data=payload, headers=headers)