akshare 1.14.49__py3-none-any.whl → 1.17.99__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.
Files changed (343) hide show
  1. akshare/__init__.py +595 -129
  2. akshare/air/air_hebei.py +77 -54
  3. akshare/air/air_zhenqi.py +0 -4
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/article/cons.py +1 -0
  8. akshare/article/epu_index.py +4 -3
  9. akshare/article/ff_factor.py +19 -8
  10. akshare/article/fred_md.py +4 -1
  11. akshare/article/risk_rv.py +3 -8
  12. akshare/bank/bank_cbirc_2020.py +11 -11
  13. akshare/bank/cons.py +7 -6
  14. akshare/bond/bond_buy_back_em.py +228 -0
  15. akshare/bond/bond_cb_sina.py +1 -0
  16. akshare/bond/bond_cb_ths.py +17 -9
  17. akshare/bond/bond_cbond.py +19 -14
  18. akshare/bond/bond_china.py +38 -39
  19. akshare/bond/bond_china_money.py +1 -1
  20. akshare/bond/bond_convert.py +10 -9
  21. akshare/bond/bond_em.py +37 -17
  22. akshare/bond/bond_summary.py +38 -37
  23. akshare/bond/bond_zh_cov.py +31 -40
  24. akshare/bond/bond_zh_sina.py +4 -0
  25. akshare/bond/cons.py +14 -11
  26. akshare/cal/__init__.py +0 -0
  27. akshare/cal/rv.py +170 -0
  28. akshare/cost/cost_living.py +7 -5
  29. akshare/crypto/__init__.py +1 -1
  30. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  31. akshare/crypto/crypto_hold.py +4 -2
  32. akshare/currency/currency.py +1 -0
  33. akshare/currency/currency_china_bank_sina.py +11 -6
  34. akshare/data/__init__.py +1 -1
  35. akshare/data/cninfo.js +1 -1
  36. akshare/datasets.py +10 -21
  37. akshare/economic/cons.py +10 -3
  38. akshare/economic/macro_australia.py +74 -69
  39. akshare/economic/macro_bank.py +95 -653
  40. akshare/economic/macro_canada.py +92 -81
  41. akshare/economic/macro_china.py +97 -105
  42. akshare/economic/macro_china_hk.py +0 -1
  43. akshare/economic/macro_euro.py +103 -56
  44. akshare/economic/macro_finance_ths.py +7 -5
  45. akshare/economic/macro_germany.py +1 -1
  46. akshare/economic/macro_japan.py +0 -1
  47. akshare/economic/macro_other.py +1 -6
  48. akshare/economic/macro_swiss.py +2 -3
  49. akshare/economic/macro_uk.py +1 -1
  50. akshare/economic/macro_usa.py +7 -9
  51. akshare/economic/marco_cnbs.py +11 -6
  52. akshare/energy/energy_carbon.py +0 -1
  53. akshare/energy/energy_oil_em.py +1 -2
  54. akshare/event/cons.py +1 -0
  55. akshare/exceptions.py +43 -0
  56. akshare/file_fold/calendar.json +245 -2
  57. akshare/forex/__init__.py +0 -0
  58. akshare/forex/cons.py +192 -0
  59. akshare/forex/forex_em.py +149 -0
  60. akshare/fortune/fortune_500.py +1 -37
  61. akshare/fortune/fortune_bloomberg.py +6 -3
  62. akshare/fortune/fortune_forbes_500.py +3 -6
  63. akshare/fortune/fortune_hurun.py +2 -1
  64. akshare/fortune/fortune_xincaifu_500.py +17 -14
  65. akshare/fund/fund_announcement_em.py +145 -0
  66. akshare/fund/fund_aum_em.py +49 -35
  67. akshare/fund/fund_em.py +251 -220
  68. akshare/fund/fund_etf_em.py +44 -35
  69. akshare/fund/fund_etf_sina.py +75 -27
  70. akshare/fund/fund_etf_ths.py +2 -0
  71. akshare/fund/fund_fee_em.py +172 -0
  72. akshare/fund/fund_fhsp_em.py +42 -32
  73. akshare/fund/fund_init_em.py +8 -5
  74. akshare/fund/fund_lof_em.py +12 -19
  75. akshare/fund/fund_manager.py +25 -11
  76. akshare/fund/fund_overview_em.py +42 -0
  77. akshare/fund/fund_portfolio_em.py +23 -21
  78. akshare/fund/fund_position_lg.py +19 -8
  79. akshare/fund/fund_rank_em.py +2 -5
  80. akshare/fund/fund_rating.py +33 -12
  81. akshare/fund/fund_scale_em.py +24 -13
  82. akshare/fund/fund_scale_sina.py +20 -10
  83. akshare/fund/fund_xq.py +3 -2
  84. akshare/futures/cons.py +135 -39
  85. akshare/futures/cot.py +55 -56
  86. akshare/futures/futures_basis.py +49 -11
  87. akshare/futures/futures_comex_em.py +1 -0
  88. akshare/futures/futures_comm_ctp.py +1 -1
  89. akshare/futures/futures_contract_detail.py +59 -9
  90. akshare/futures/futures_daily_bar.py +66 -59
  91. akshare/futures/futures_foreign.py +14 -8
  92. akshare/futures/futures_hf_em.py +215 -61
  93. akshare/futures/futures_hist_em.py +191 -0
  94. akshare/futures/futures_hq_sina.py +5 -3
  95. akshare/futures/futures_index_ccidx.py +24 -82
  96. akshare/futures/futures_inventory_99.py +70 -272
  97. akshare/futures/futures_inventory_em.py +14 -11
  98. akshare/futures/futures_news_shmet.py +2 -2
  99. akshare/futures/futures_roll_yield.py +11 -24
  100. akshare/futures/futures_rule.py +7 -3
  101. akshare/futures/futures_rule_em.py +38 -0
  102. akshare/futures/futures_settlement_price_sgx.py +21 -6
  103. akshare/futures/futures_stock_js.py +0 -1
  104. akshare/futures/futures_to_spot.py +5 -6
  105. akshare/futures/futures_warehouse_receipt.py +48 -47
  106. akshare/futures/futures_zh_sina.py +3 -3
  107. akshare/futures/receipt.py +298 -165
  108. akshare/futures/requests_fun.py +16 -3
  109. akshare/futures/symbol_var.py +32 -13
  110. akshare/futures_derivative/cons.py +100 -103
  111. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  112. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  113. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  114. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  115. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  116. akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
  117. akshare/futures_derivative/futures_cot_sina.py +8 -6
  118. akshare/futures_derivative/futures_index_sina.py +25 -13
  119. akshare/fx/cons.py +12 -7
  120. akshare/fx/fx_c_swap_cm.py +62 -0
  121. akshare/fx/fx_quote.py +3 -2
  122. akshare/fx/fx_quote_baidu.py +2 -1
  123. akshare/hf/__init__.py +1 -1
  124. akshare/hf/hf_sp500.py +8 -7
  125. akshare/index/cons.py +132 -28
  126. akshare/index/index_cni.py +7 -7
  127. akshare/index/index_cons.py +2 -2
  128. akshare/index/index_csindex.py +68 -0
  129. akshare/index/index_cx.py +20 -20
  130. akshare/index/index_drewry.py +17 -16
  131. akshare/index/index_eri.py +1 -0
  132. akshare/index/index_global_em.py +167 -0
  133. akshare/index/index_global_sina.py +82 -0
  134. akshare/index/index_kq_fz.py +17 -14
  135. akshare/index/index_kq_ss.py +1 -0
  136. akshare/index/index_option_qvix.py +351 -16
  137. akshare/index/index_research_sw.py +21 -21
  138. akshare/index/index_spot.py +9 -5
  139. akshare/index/index_stock_hk.py +5 -9
  140. akshare/index/index_stock_zh.py +111 -24
  141. akshare/index/index_stock_zh_csindex.py +3 -367
  142. akshare/index/index_sugar.py +18 -4
  143. akshare/index/index_sw.py +10 -2
  144. akshare/index/index_yw.py +53 -75
  145. akshare/index/index_zh_em.py +15 -82
  146. akshare/interest_rate/interbank_rate_em.py +0 -1
  147. akshare/movie/jm.js +0 -1
  148. akshare/news/__init__.py +1 -1
  149. akshare/news/news_baidu.py +395 -222
  150. akshare/news/news_stock.py +49 -16
  151. akshare/option/cons.py +2 -2
  152. akshare/option/option_commodity.py +341 -220
  153. akshare/option/option_commodity_sina.py +22 -26
  154. akshare/option/option_contract_info_ctp.py +63 -0
  155. akshare/option/option_current_sse.py +61 -0
  156. akshare/option/option_current_szse.py +84 -0
  157. akshare/option/option_czce.py +37 -9
  158. akshare/option/option_daily_stats_sse_szse.py +0 -1
  159. akshare/option/option_em.py +4 -8
  160. akshare/option/option_finance.py +60 -12
  161. akshare/option/option_finance_sina.py +7 -7
  162. akshare/option/option_lhb_em.py +0 -1
  163. akshare/option/option_margin.py +62 -0
  164. akshare/option/option_premium_analysis_em.py +58 -53
  165. akshare/option/option_risk_analysis_em.py +11 -8
  166. akshare/option/option_risk_indicator_sse.py +3 -4
  167. akshare/option/option_value_analysis_em.py +62 -55
  168. akshare/other/__init__.py +1 -1
  169. akshare/pro/__init__.py +0 -1
  170. akshare/pro/client.py +6 -4
  171. akshare/pro/cons.py +3 -2
  172. akshare/pro/data_pro.py +6 -5
  173. akshare/qdii/__init__.py +0 -0
  174. akshare/qdii/qdii_jsl.py +233 -0
  175. akshare/qhkc/__init__.py +1 -6
  176. akshare/qhkc/qhkc_api.py +64 -22
  177. akshare/qhkc_web/__init__.py +1 -6
  178. akshare/qhkc_web/qhkc_fund.py +10 -6
  179. akshare/qhkc_web/qhkc_index.py +28 -14
  180. akshare/qhkc_web/qhkc_tool.py +62 -59
  181. akshare/rate/__init__.py +1 -1
  182. akshare/rate/repo_rate.py +36 -32
  183. akshare/reits/__init__.py +1 -1
  184. akshare/reits/reits_basic.py +149 -13
  185. akshare/request.py +117 -0
  186. akshare/spot/__init__.py +1 -1
  187. akshare/spot/spot_hog_soozhu.py +165 -3
  188. akshare/spot/spot_sge.py +70 -9
  189. akshare/stock/cons.py +60 -23
  190. akshare/stock/stock_allotment_cninfo.py +8 -8
  191. akshare/stock/stock_ask_bid_em.py +3 -78
  192. akshare/stock/stock_board_concept_em.py +160 -35
  193. akshare/stock/stock_board_industry_em.py +163 -70
  194. akshare/stock/stock_dividend_cninfo.py +31 -17
  195. akshare/stock/stock_dzjy_em.py +347 -260
  196. akshare/stock/stock_fund_em.py +72 -64
  197. akshare/stock/stock_fund_hold.py +1 -2
  198. akshare/stock/stock_gsrl_em.py +1 -0
  199. akshare/stock/stock_hk_comparison_em.py +175 -0
  200. akshare/stock/stock_hk_famous.py +4 -5
  201. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  202. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  203. akshare/stock/stock_hk_sina.py +84 -36
  204. akshare/stock/stock_hold_control_cninfo.py +82 -0
  205. akshare/stock/stock_hold_control_em.py +0 -2
  206. akshare/stock/stock_hot_rank_em.py +4 -1
  207. akshare/stock/stock_hot_search_baidu.py +32 -19
  208. akshare/stock/stock_hot_up_em.py +4 -1
  209. akshare/stock/stock_hsgt_em.py +155 -0
  210. akshare/stock/stock_industry.py +1 -0
  211. akshare/stock/stock_industry_cninfo.py +1 -2
  212. akshare/stock/stock_info.py +6 -4
  213. akshare/stock/stock_info_em.py +17 -11
  214. akshare/stock/stock_intraday_em.py +4 -78
  215. akshare/stock/stock_intraday_sina.py +2 -2
  216. akshare/stock/stock_news_cx.py +39 -0
  217. akshare/stock/stock_profile_cninfo.py +7 -7
  218. akshare/stock/stock_profile_em.py +302 -0
  219. akshare/stock/stock_rank_forecast.py +6 -5
  220. akshare/stock/stock_repurchase_em.py +7 -2
  221. akshare/stock/stock_share_changes_cninfo.py +7 -5
  222. akshare/stock/stock_share_hold.py +24 -20
  223. akshare/stock/stock_stop.py +6 -6
  224. akshare/stock/stock_summary.py +153 -417
  225. akshare/stock/stock_us_famous.py +5 -6
  226. akshare/stock/stock_us_js.py +3 -2
  227. akshare/stock/stock_us_pink.py +38 -27
  228. akshare/stock/stock_us_sina.py +7 -3
  229. akshare/stock/stock_weibo_nlp.py +18 -20
  230. akshare/stock/stock_xq.py +24 -22
  231. akshare/stock/stock_zh_a_sina.py +8 -5
  232. akshare/stock/stock_zh_a_special.py +240 -243
  233. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  234. akshare/stock/stock_zh_ah_tx.py +23 -26
  235. akshare/stock/stock_zh_b_sina.py +2 -2
  236. akshare/stock/stock_zh_comparison_em.py +250 -0
  237. akshare/stock/stock_zh_kcb_sina.py +67 -64
  238. akshare/stock_a/__init__.py +0 -0
  239. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  240. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  241. akshare/stock_a/stock_zh_a_spot.py +212 -0
  242. akshare/stock_feature/cons.py +1 -0
  243. akshare/stock_feature/stock_a_indicator.py +9 -54
  244. akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
  245. akshare/stock_feature/stock_account_em.py +0 -1
  246. akshare/stock_feature/stock_all_pb.py +2 -1
  247. akshare/stock_feature/stock_analyst_em.py +36 -30
  248. akshare/stock_feature/stock_board_concept_ths.py +328 -0
  249. akshare/stock_feature/stock_board_industry_ths.py +57 -2
  250. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  251. akshare/stock_feature/stock_classify_sina.py +3 -6
  252. akshare/stock_feature/stock_comment_em.py +81 -144
  253. akshare/stock_feature/stock_congestion_lg.py +2 -1
  254. akshare/stock_feature/stock_cyq_em.py +5 -11
  255. akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
  256. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  257. akshare/stock_feature/stock_ebs_lg.py +5 -4
  258. akshare/stock_feature/stock_esg_sina.py +29 -7
  259. akshare/stock_feature/stock_fhps_em.py +2 -1
  260. akshare/stock_feature/stock_fhps_ths.py +15 -7
  261. akshare/stock_feature/stock_fund_flow.py +30 -22
  262. akshare/stock_feature/stock_gddh_em.py +19 -11
  263. akshare/stock_feature/stock_gdfx_em.py +226 -113
  264. akshare/stock_feature/stock_gdhs.py +75 -50
  265. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  266. akshare/stock_feature/stock_gpzy_em.py +78 -46
  267. akshare/stock_feature/stock_gxl_lg.py +3 -2
  268. akshare/stock_feature/stock_hist_em.py +137 -234
  269. akshare/stock_feature/stock_hist_tx.py +13 -10
  270. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  271. akshare/stock_feature/stock_hot_xq.py +4 -6
  272. akshare/stock_feature/stock_hsgt_em.py +269 -97
  273. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  274. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  275. akshare/stock_feature/stock_info.py +7 -80
  276. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  277. akshare/stock_feature/stock_jgdy_em.py +43 -40
  278. akshare/stock_feature/stock_lhb_em.py +119 -3
  279. akshare/stock_feature/stock_margin_em.py +0 -1
  280. akshare/stock_feature/stock_margin_sse.py +0 -2
  281. akshare/stock_feature/stock_pankou_em.py +71 -35
  282. akshare/stock_feature/stock_qsjy_em.py +13 -4
  283. akshare/stock_feature/stock_report_em.py +151 -7
  284. akshare/stock_feature/stock_research_report_em.py +55 -20
  285. akshare/stock_feature/stock_sy_em.py +20 -15
  286. akshare/stock_feature/stock_technology_ths.py +122 -77
  287. akshare/stock_feature/stock_tfp_em.py +2 -1
  288. akshare/stock_feature/stock_three_report_em.py +21 -5
  289. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  290. akshare/stock_feature/stock_value_em.py +83 -0
  291. akshare/stock_feature/stock_yjbb_em.py +58 -32
  292. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  293. akshare/stock_feature/stock_yjyg_em.py +1 -1
  294. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  295. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  296. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  297. akshare/stock_feature/stock_ztb_em.py +39 -24
  298. akshare/stock_fundamental/__init__.py +1 -1
  299. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  300. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  301. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
  302. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  303. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  304. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  305. akshare/stock_fundamental/stock_hold.py +26 -17
  306. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  307. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  308. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  309. akshare/stock_fundamental/stock_notice.py +12 -3
  310. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  311. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  312. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  313. akshare/stock_fundamental/stock_recommend.py +20 -4
  314. akshare/stock_fundamental/stock_zygc.py +5 -62
  315. akshare/utils/context.py +43 -0
  316. akshare/utils/demjson.py +2009 -1338
  317. akshare/utils/func.py +49 -2
  318. akshare/utils/multi_decrypt.py +53 -0
  319. akshare/utils/token_process.py +6 -5
  320. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
  321. akshare-1.17.99.dist-info/RECORD +409 -0
  322. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  323. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  324. tests/test_func.py +3 -5
  325. akshare/bond/bond_futures.py +0 -50
  326. akshare/bond/bond_investing.py +0 -139
  327. akshare/crypto/crypto_hist_investing.py +0 -249
  328. akshare/fund/fund_announcement.py +0 -56
  329. akshare/futures/futures_international.py +0 -170
  330. akshare/futures/futures_news_baidu.py +0 -54
  331. akshare/futures/inventory_data.py +0 -100
  332. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  333. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  334. akshare/futures_derivative/futures_index_volatility_nh.py +0 -53
  335. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  336. akshare/index/index_fear_greed_funddb.py +0 -78
  337. akshare/index/index_investing.py +0 -232
  338. akshare/sport/__init__.py +0 -6
  339. akshare/sport/sport_olympic.py +0 -27
  340. akshare/stock_feature/stock_wencai.py +0 -104
  341. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  342. akshare-1.14.49.dist-info/RECORD +0 -387
  343. {akshare-1.14.49.dist-info → akshare-1.17.99.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/22 18:00
4
+ Date: 2025/7/21 15:00
5
5
  Desc: 每日注册仓单数据
6
6
  大连商品交易所, 上海期货交易所, 郑州商品交易所, 广州期货交易所
7
7
  """
8
+
8
9
  import datetime
9
10
  import re
10
11
  import warnings
@@ -19,16 +20,24 @@ from akshare.futures.requests_fun import requests_link, pandas_read_html_link
19
20
  from akshare.futures.symbol_var import chinese_to_english
20
21
 
21
22
  calendar = cons.get_calendar()
22
- shfe_20100126 = pd.DataFrame({'var': ['CU', 'AL', 'ZN', 'RU', 'FU', 'AU', 'RB', 'WR'],
23
- 'receipt': [29783, 285396, 187713, 116435, 376200, 12, 145648, 0]})
24
- shfe_20101029 = pd.DataFrame({'var': ['CU', 'AL', 'ZN', 'RU', 'FU', 'AU', 'RB', 'WR'],
25
- 'receipt': [39214, 359729, 182562, 25990, 313600, 27, 36789, 0]})
23
+ shfe_20100126 = pd.DataFrame(
24
+ {
25
+ "var": ["CU", "AL", "ZN", "RU", "FU", "AU", "RB", "WR"],
26
+ "receipt": [29783, 285396, 187713, 116435, 376200, 12, 145648, 0],
27
+ }
28
+ )
29
+ shfe_20101029 = pd.DataFrame(
30
+ {
31
+ "var": ["CU", "AL", "ZN", "RU", "FU", "AU", "RB", "WR"],
32
+ "receipt": [39214, 359729, 182562, 25990, 313600, 27, 36789, 0],
33
+ }
34
+ )
26
35
 
27
36
 
28
37
  def get_dce_receipt(date: str = None, vars_list: List = cons.contract_symbols):
29
38
  """
30
39
  大连商品交易所-注册仓单数据
31
-
40
+ http://www.dce.com.cn/dce/channel/list/187.html
32
41
  :param date: 开始日期: YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象, 为空时为当天
33
42
  :type date: str
34
43
  :param vars_list: 合约品种如 RB, AL等列表, 为空时为所有商品数据从 20060106开始,每周五更新仓单数据。直到20090407起,每交易日都更新仓单数据
@@ -39,86 +48,114 @@ def get_dce_receipt(date: str = None, vars_list: List = cons.contract_symbols):
39
48
  if not isinstance(vars_list, list):
40
49
  return warnings.warn("vars_list: 必须是列表")
41
50
  date = cons.convert_date(date) if date is not None else datetime.date.today()
42
- if date.strftime('%Y%m%d') not in calendar:
51
+ if date.strftime("%Y%m%d") not in calendar:
43
52
  warnings.warn(f"{date.strftime('%Y%m%d')}非交易日")
44
53
  return None
54
+ url = "http://www.dce.com.cn/dcereport/publicweb/dailystat/wbillWeeklyQuotes"
45
55
  payload = {
46
- "weekQuotes.variety": "all",
47
- "year": date.year,
48
- "month": date.month - 1, # 网站月份描述少 1 个月, 属于网站问题
49
- "day": date.day
56
+ "tradeDate": date.strftime("%Y%m%d"),
57
+ "varietyId": "all",
50
58
  }
51
- data = pandas_read_html_link(cons.DCE_RECEIPT_URL, method="post", data=payload, headers=cons.dce_headers)[0]
59
+ r = requests.post(url, json=payload)
60
+ data_json = r.json()
61
+ temp_df = pd.DataFrame(data_json['data']['entityList'])
52
62
  records = pd.DataFrame()
53
- for x in data.to_dict(orient='records'):
54
- if isinstance(x['品种'], str):
55
- if x['品种'][-2:] == '小计':
56
- var = x['品种'][:-2]
57
- temp_data = {'var': chinese_to_english(var), 'receipt': int(x['今日仓单量']),
58
- 'receipt_chg': int(x['增减']),
59
- 'date': date.strftime('%Y%m%d')}
63
+ for x in temp_df.to_dict(orient="records"):
64
+ if isinstance(x["variety"], str):
65
+ if x["variety"][-2:] == "小计":
66
+ var = x["variety"][:-2]
67
+ temp_data = {
68
+ "var": chinese_to_english(var),
69
+ "receipt": int(x["wbillQty"]),
70
+ "receipt_chg": int(x["diff"]),
71
+ "date": date.strftime("%Y%m%d"),
72
+ }
60
73
  records = pd.concat([records, pd.DataFrame(temp_data, index=[0])])
61
74
 
62
75
  if len(records.index) != 0:
63
- records.index = records['var']
76
+ records.index = records["var"]
64
77
  vars_in_market = [i for i in vars_list if i in records.index]
65
78
  records = records.loc[vars_in_market, :]
66
79
  return records.reset_index(drop=True)
67
80
 
68
81
 
69
- def get_shfe_receipt_1(date: str = None, vars_list: List = cons.contract_symbols) -> pd.DataFrame:
82
+ def get_shfe_receipt_1(
83
+ date: str = None, vars_list: List = cons.contract_symbols
84
+ ) -> pd.DataFrame:
70
85
  """
71
86
  上海期货交易所-注册仓单数据-类型1
72
87
  适用 20081006 至 20140518(包括)、20100126、20101029日期交易所格式混乱,直接回复脚本中 pandas.DataFrame, 20100416、20130821日期交易所数据丢失
73
- :param date: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天
88
+ :param date: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象为空时为当天
74
89
  :type date: str
75
- :param vars_list: 合约品种如RB、AL等列表 为空时为所有商品
90
+ :param vars_list: 合约品种如RB、AL等列表为空时为所有商品
76
91
  :type vars_list: list
77
92
  :return: 注册仓单数据-类型1
78
93
  :rtype: pandas.DataFrame
79
94
  """
80
95
  if not isinstance(vars_list, list):
81
- raise warnings.warn(f"symbol_list: 必须是列表")
82
- date = cons.convert_date(date).strftime('%Y%m%d') if date is not None else datetime.date.today()
96
+ raise warnings.warn("symbol_list: 必须是列表")
97
+ date = (
98
+ cons.convert_date(date).strftime("%Y%m%d")
99
+ if date is not None
100
+ else datetime.date.today()
101
+ )
83
102
  if date not in calendar:
84
103
  warnings.warn(f"{date.strftime('%Y%m%d')}非交易日")
85
- return None
86
- if date == '20100126':
87
- shfe_20100126['date'] = date
104
+ return pd.DataFrame()
105
+ if date == "20100126":
106
+ shfe_20100126["date"] = date
88
107
  return shfe_20100126
89
- elif date == '20101029':
90
- shfe_20101029['date'] = date
108
+ elif date == "20101029":
109
+ shfe_20101029["date"] = date
91
110
  return shfe_20101029
92
- elif date in ['20100416', '20130821']:
93
- return warnings.warn('20100416、20130821交易所数据丢失')
111
+ elif date in ["20100416", "20130821"]:
112
+ print("20100416、20130821交易所数据丢失")
113
+ return pd.DataFrame()
94
114
  else:
95
- var_list = ['天然橡胶', '沥青仓库', '沥青厂库', '热轧卷板', '燃料油', '白银', '线材', '螺纹钢', '铅', '铜',
96
- '铝', '锌', '黄金', '锡', '镍']
115
+ var_list = [
116
+ "天然橡胶",
117
+ "沥青仓库",
118
+ "沥青厂库",
119
+ "热轧卷板",
120
+ "燃料油",
121
+ "白银",
122
+ "线材",
123
+ "螺纹钢",
124
+ "铅",
125
+ "铜",
126
+ "铝",
127
+ "锌",
128
+ "黄金",
129
+ "锡",
130
+ "镍",
131
+ ]
97
132
  url = cons.SHFE_RECEIPT_URL_1 % date
98
133
  data = pandas_read_html_link(url)[0]
99
134
  indexes = [x for x in data.index if (data[0].tolist()[x] in var_list)]
100
- last_index = [x for x in data.index if '' in str(data[0].tolist()[x])][0] - 1
135
+ last_index = [x for x in data.index if "" in str(data[0].tolist()[x])][0] - 1
101
136
  records = pd.DataFrame()
102
137
  for i in list(range(len(indexes))):
103
138
  if i != len(indexes) - 1:
104
- data_cut = data.loc[indexes[i]:indexes[i + 1] - 1, :]
139
+ data_cut = data.loc[indexes[i] : indexes[i + 1] - 1, :]
105
140
  else:
106
- data_cut = data.loc[indexes[i]:last_index, :]
107
- data_cut = data_cut.fillna(method='pad')
141
+ data_cut = data.loc[indexes[i] : last_index, :]
142
+ data_cut = data_cut.fillna(method="pad")
108
143
  data_dict = dict()
109
- data_dict['var'] = chinese_to_english(data_cut[0].tolist()[0])
110
- data_dict['receipt'] = int(data_cut[2].tolist()[-1])
111
- data_dict['receipt_chg'] = int(data_cut[3].tolist()[-1])
112
- data_dict['date'] = date
144
+ data_dict["var"] = chinese_to_english(data_cut[0].tolist()[0])
145
+ data_dict["receipt"] = int(data_cut[2].tolist()[-1])
146
+ data_dict["receipt_chg"] = int(data_cut[3].tolist()[-1])
147
+ data_dict["date"] = date
113
148
  records = pd.concat([records, pd.DataFrame(data_dict, index=[0])])
114
149
  if len(records.index) != 0:
115
- records.index = records['var']
150
+ records.index = records["var"]
116
151
  vars_in_market = [i for i in vars_list if i in records.index]
117
152
  records = records.loc[vars_in_market, :]
118
153
  return records.reset_index(drop=True)
119
154
 
120
155
 
121
- def get_shfe_receipt_2(date: str = None, vars_list: List = cons.contract_symbols) -> pd.DataFrame:
156
+ def get_shfe_receipt_2(
157
+ date: str = None, vars_list: List = cons.contract_symbols
158
+ ) -> pd.DataFrame:
122
159
  """
123
160
  上海商品交易所-注册仓单数据-类型2
124
161
  适用 20140519(包括)-至今
@@ -130,39 +167,49 @@ def get_shfe_receipt_2(date: str = None, vars_list: List = cons.contract_symbols
130
167
  :rtype: pandas.DataFrame
131
168
  """
132
169
  if not isinstance(vars_list, list):
133
- raise warnings.warn(f"symbol_list: 必须是列表")
134
- date = cons.convert_date(date).strftime('%Y%m%d') if date is not None else datetime.date.today()
170
+ raise warnings.warn("symbol_list: 必须是列表")
171
+ date = (
172
+ cons.convert_date(date).strftime("%Y%m%d")
173
+ if date is not None
174
+ else datetime.date.today()
175
+ )
135
176
  if date not in calendar:
136
- warnings.warn('%s 非交易日' % date.strftime('%Y%m%d'))
137
- return None
138
- url = cons.SHFE_RECEIPT_URL_2 % date
139
- r = requests_link(url, encoding='utf-8', headers=cons.shfe_headers)
177
+ warnings.warn("%s 非交易日" % date.strftime("%Y%m%d"))
178
+ return pd.DataFrame()
179
+ url = cons.SHFE_RECEIPT_URL_20250701 % date
180
+ r = requests_link(url, encoding="utf-8", headers=cons.shfe_headers)
140
181
  try:
141
182
  context = r.json()
142
- except:
183
+ except: # noqa: E722
143
184
  return pd.DataFrame()
144
- data = pd.DataFrame(context['o_cursor'])
185
+ data = pd.DataFrame(context["o_cursor"])
145
186
  if len(data.columns) < 1:
146
187
  return pd.DataFrame()
147
188
  records = pd.DataFrame()
148
- for var in set(data['VARNAME'].tolist()):
149
- data_cut = data[data['VARNAME'] == var]
189
+ for var in set(data["VARNAME"].tolist()):
190
+ data_cut = data[data["VARNAME"] == var]
150
191
  if "BC" in var:
151
- data_dict = {'var': "BC",
152
- 'receipt': int(data_cut['WRTWGHTS'].tolist()[-1]),
153
- 'receipt_chg': int(data_cut['WRTCHANGE'].tolist()[-1]),
154
- 'date': date}
192
+ data_dict = {
193
+ "var": "BC",
194
+ "receipt": int(data_cut["WRTWGHTS"].tolist()[-1]),
195
+ "receipt_chg": int(data_cut["WRTCHANGE"].tolist()[-1]),
196
+ "date": date,
197
+ }
155
198
  else:
156
- data_dict = {'var': chinese_to_english(re.sub(r"\W|[a-zA-Z]", "", var)),
157
- 'receipt': int(data_cut['WRTWGHTS'].tolist()[-1]),
158
- 'receipt_chg': int(data_cut['WRTCHANGE'].tolist()[-1]),
159
- 'date': date}
199
+ data_dict = {
200
+ "var": chinese_to_english(re.sub(r"\W|[a-zA-Z]", "", var)),
201
+ "receipt": int(data_cut["WRTWGHTS"].tolist()[-1]),
202
+ "receipt_chg": int(data_cut["WRTCHANGE"].tolist()[-1]),
203
+ "date": date,
204
+ }
160
205
  records = pd.concat([records, pd.DataFrame(data_dict, index=[0])])
161
- temp_records = records.groupby('var')[['receipt', 'receipt_chg']].sum().reset_index()
162
- temp_records['date'] = date
206
+ temp_records = (
207
+ records.groupby("var")[["receipt", "receipt_chg"]].sum().reset_index()
208
+ )
209
+ temp_records["date"] = date
163
210
  records = temp_records
164
211
  if len(records.index) != 0:
165
- records.index = records['var']
212
+ records.index = records["var"]
166
213
  vars_in_market = [i for i in vars_list if i in records.index]
167
214
  records = records.loc[vars_in_market, :]
168
215
  return records.reset_index(drop=True)
@@ -179,40 +226,49 @@ def get_czce_receipt_1(date: str = None, vars_list: List = cons.contract_symbols
179
226
  :return: 注册仓单数据
180
227
  :rtype: pandas.DataFrame
181
228
  """
182
- date = cons.convert_date(date).strftime('%Y%m%d') if date is not None else datetime.date.today()
229
+ date = (
230
+ cons.convert_date(date).strftime("%Y%m%d")
231
+ if date is not None
232
+ else datetime.date.today()
233
+ )
183
234
  if date not in calendar:
184
- warnings.warn('%s非交易日' % date.strftime('%Y%m%d'))
235
+ warnings.warn("%s非交易日" % date.strftime("%Y%m%d"))
185
236
  return None
186
- if date == '20090820':
237
+ if date == "20090820":
187
238
  return pd.DataFrame()
188
239
  url = cons.CZCE_RECEIPT_URL_1 % date
189
- r = requests_link(url, encoding='utf-8', headers=cons.shfe_headers)
240
+ r = requests_link(url, encoding="utf-8", headers=cons.shfe_headers)
190
241
  context = r.text
191
242
  data = pd.read_html(context)[1]
192
243
  records = pd.DataFrame()
193
- indexes = [x for x in data.index if '品种:' in str(data[0].tolist()[x])]
194
- ends = [x for x in data.index if '总计' in str(data[0].tolist()[x])]
244
+ indexes = [x for x in data.index if "品种:" in str(data[0].tolist()[x])]
245
+ ends = [x for x in data.index if "总计" in str(data[0].tolist()[x])]
195
246
  for i in list(range(len(indexes))):
196
247
  if i != len(indexes) - 1:
197
- data_cut = data.loc[indexes[i]:ends[i], :]
198
- data_cut = data_cut.fillna(method='pad')
248
+ data_cut = data.loc[indexes[i]: ends[i], :]
249
+ data_cut = data_cut.fillna(method="pad")
199
250
  else:
200
251
  data_cut = data.loc[indexes[i]:, :]
201
- data_cut = data_cut.fillna(method='pad')
202
- if 'PTA' in data_cut[0].tolist()[0]:
203
- var = 'TA'
252
+ data_cut = data_cut.fillna(method="pad")
253
+ if "PTA" in data_cut[0].tolist()[0]:
254
+ var = "TA"
204
255
  else:
205
- var = chinese_to_english(re.sub(r'[A-Z]+', '', data_cut[0].tolist()[0][3:]))
206
- if var == 'CF':
256
+ var = chinese_to_english(re.sub(r"[A-Z]+", "", data_cut[0].tolist()[0][3:]))
257
+ if var == "CF":
207
258
  receipt = data_cut[6].tolist()[-1]
208
259
  receipt_chg = data_cut[7].tolist()[-1]
209
260
  else:
210
261
  receipt = data_cut[5].tolist()[-1]
211
262
  receipt_chg = data_cut[6].tolist()[-1]
212
- data_dict = {'var': var, 'receipt': int(receipt), 'receipt_chg': int(receipt_chg), 'date': date}
263
+ data_dict = {
264
+ "var": var,
265
+ "receipt": int(receipt),
266
+ "receipt_chg": int(receipt_chg),
267
+ "date": date,
268
+ }
213
269
  records = pd.concat([records, pd.DataFrame(data_dict, index=[0])])
214
270
  if len(records.index) != 0:
215
- records.index = records['var']
271
+ records.index = records["var"]
216
272
  vars_in_market = [i for i in vars_list if i in records.index]
217
273
  records = records.loc[vars_in_market, :]
218
274
  return records.reset_index(drop=True)
@@ -231,41 +287,54 @@ def get_czce_receipt_2(date: str = None, vars_list: List = cons.contract_symbols
231
287
  :rtype: pandas.DataFrame
232
288
  """
233
289
  if not isinstance(vars_list, list):
234
- return warnings.warn(f"symbol_list: 必须是列表")
235
- date = cons.convert_date(date).strftime('%Y%m%d') if date is not None else datetime.date.today()
290
+ return warnings.warn("symbol_list: 必须是列表")
291
+ date = (
292
+ cons.convert_date(date).strftime("%Y%m%d")
293
+ if date is not None
294
+ else datetime.date.today()
295
+ )
236
296
  if date not in calendar:
237
- warnings.warn('%s非交易日' % date.strftime('%Y%m%d'))
297
+ warnings.warn("%s非交易日" % date.strftime("%Y%m%d"))
238
298
  return None
239
299
  url = cons.CZCE_RECEIPT_URL_2 % (date[:4], date)
240
300
  r = requests.get(url)
241
- r.encoding = 'utf-8'
301
+ r.encoding = "utf-8"
242
302
  data = pd.read_html(r.text)[3:]
243
303
  records = pd.DataFrame()
244
304
  for data_cut in data:
245
305
  if len(data_cut.columns) > 3:
246
- last_indexes = [x for x in data_cut.index if '注:' in str(data_cut[0].tolist()[x])]
306
+ last_indexes = [
307
+ x for x in data_cut.index if "注:" in str(data_cut[0].tolist()[x])
308
+ ]
247
309
  if len(last_indexes) > 0:
248
310
  last_index = last_indexes[0] - 1
249
311
  data_cut = data_cut.loc[:last_index, :]
250
- if 'PTA' in data_cut[0].tolist()[0]:
251
- var = 'TA'
312
+ if "PTA" in data_cut[0].tolist()[0]:
313
+ var = "TA"
252
314
  else:
253
315
  strings = data_cut[0].tolist()[0]
254
- string = strings.split(' ')[0][3:]
255
- var = chinese_to_english(re.sub(r'[A-Z]+', '', string))
316
+ string = strings.split(" ")[0][3:]
317
+ var = chinese_to_english(re.sub(r"[A-Z]+", "", string))
256
318
  data_cut.columns = data_cut.T[1].tolist()
257
- receipt = data_cut['仓单数量'].tolist()[-1]
258
- receipt_chg = data_cut['当日增减'].tolist()[-1]
259
- data_dict = {'var': var, 'receipt': int(receipt), 'receipt_chg': int(receipt_chg), 'date': date}
319
+ receipt = data_cut["仓单数量"].tolist()[-1]
320
+ receipt_chg = data_cut["当日增减"].tolist()[-1]
321
+ data_dict = {
322
+ "var": var,
323
+ "receipt": int(receipt),
324
+ "receipt_chg": int(receipt_chg),
325
+ "date": date,
326
+ }
260
327
  records = pd.concat([records, pd.DataFrame(data_dict, index=[0])])
261
328
  if len(records.index) != 0:
262
- records.index = records['var']
329
+ records.index = records["var"]
263
330
  vars_in_market = [i for i in vars_list if i in records.index]
264
331
  records = records.loc[vars_in_market, :]
265
332
  return records.reset_index(drop=True)
266
333
 
267
334
 
268
- def get_czce_receipt_3(date: str = None, vars_list: List = cons.contract_symbols) -> pd.DataFrame:
335
+ def get_czce_receipt_3(
336
+ date: str = None, vars_list: List = cons.contract_symbols
337
+ ) -> pd.DataFrame:
269
338
  """
270
339
  郑州商品交易所-注册仓单数据
271
340
  适用 20151008-至今
@@ -278,72 +347,110 @@ def get_czce_receipt_3(date: str = None, vars_list: List = cons.contract_symbols
278
347
  :rtype: pandas.DataFrame
279
348
  """
280
349
  if not isinstance(vars_list, list):
281
- return warnings.warn("vars_list: 必须是列表")
282
- date = cons.convert_date(date).strftime('%Y%m%d') if date is not None else datetime.date.today()
350
+ print("vars_list: 必须是列表")
351
+ return pd.DataFrame()
352
+ date = (
353
+ cons.convert_date(date).strftime("%Y%m%d")
354
+ if date is not None
355
+ else datetime.date.today()
356
+ )
283
357
  if date not in calendar:
284
- warnings.warn('%s非交易日' % date.strftime('%Y%m%d'))
285
- return None
286
- url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{date[:4]}/{date}/FutureDataWhsheet.xls"
287
- r = requests_link(url, encoding='utf-8', headers=cons.shfe_headers)
358
+ warnings.warn("%s非交易日" % date.strftime("%Y%m%d"))
359
+ return pd.DataFrame()
360
+ if int(date) > 20251101:
361
+ url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{date[:4]}/{date}/FutureDataWhsheet.xlsx"
362
+ else:
363
+ url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{date[:4]}/{date}/FutureDataWhsheet.xls"
364
+ r = requests_link(url, encoding="utf-8", headers=cons.shfe_headers)
288
365
  temp_df = pd.read_excel(BytesIO(r.content))
289
- temp_df = temp_df[[bool(1 - item) for item in
290
- [item if item is not pd.NA else False for item in temp_df.iloc[:, 0].str.contains("非农产品")]]]
366
+ temp_df = temp_df[
367
+ [
368
+ bool(1 - item)
369
+ for item in [
370
+ item if item is not pd.NA else False
371
+ for item in temp_df.iloc[:, 0].str.contains("非农产品")
372
+ ]
373
+ ]
374
+ ]
291
375
  temp_df.reset_index(inplace=True, drop=True)
292
376
  range_list_one = list(
293
- temp_df[[item if not pd.isnull(item) else False for item in temp_df.iloc[:, 0].str.contains("品种")]].index)
377
+ temp_df[
378
+ [
379
+ item if not pd.isnull(item) else False
380
+ for item in temp_df.iloc[:, 0].str.contains("品种")
381
+ ]
382
+ ].index
383
+ )
294
384
  range_list_two = list(
295
- temp_df[[item if not pd.isnull(item) else False for item in temp_df.iloc[:, 0].str.contains("品种")]].index)[1:]
385
+ temp_df[
386
+ [
387
+ item if not pd.isnull(item) else False
388
+ for item in temp_df.iloc[:, 0].str.contains("品种")
389
+ ]
390
+ ].index
391
+ )[1:]
296
392
  range_list_two.append(None)
297
393
  symbol_list = []
298
394
  receipt_list = []
299
395
  receipt_chg_list = []
396
+ records = pd.DataFrame()
300
397
  for page in range(len(range_list_one)):
301
- inner_df = temp_df[range_list_one[page]: range_list_two[page]]
302
- reg = re.compile(r'[A-Z]+')
398
+ inner_df = temp_df[range_list_one[page] : range_list_two[page]]
399
+ reg = re.compile(r"[A-Z]+")
303
400
  try:
304
401
  symbol = reg.findall(inner_df.iloc[0, 0])[0]
305
- except:
402
+ except: # noqa: E722
306
403
  continue
307
404
  symbol_list.append(symbol)
308
405
  inner_df.columns = inner_df.iloc[1, :]
309
406
  inner_df = inner_df.iloc[2:, :]
310
- inner_df = inner_df.dropna(axis=1, how='all')
407
+ inner_df = inner_df.dropna(axis=1, how="all")
311
408
  if symbol == "PTA":
312
409
  try:
313
- receipt_list.append(inner_df['仓单数量(完税)'].iloc[-1] + int(
314
- inner_df['仓单数量(保税)'].iloc[-1])) # 20210316 TA 分为保税和完税
315
- except:
410
+ receipt_list.append(
411
+ inner_df["仓单数量(完税)"].iloc[-1]
412
+ + int(inner_df["仓单数量(保税)"].iloc[-1])
413
+ ) # 20210316 TA 分为保税和完税
414
+ except: # noqa: E722
316
415
  receipt_list.append(0)
317
416
  elif symbol == "MA":
318
417
  try:
319
418
  try:
320
- receipt_list.append(inner_df['仓单数量(完税)'].iloc[-2] + int(
321
- inner_df['仓单数量(保税)'].iloc[-2])) # 20210316 MA 分为保税和完税
322
- except:
323
- receipt_list.append(inner_df['仓单数量(完税)'].iloc[-2]) # 处理 MA 的特殊格式
324
- except:
419
+ receipt_list.append(
420
+ inner_df["仓单数量(完税)"].iloc[-2]
421
+ + int(inner_df["仓单数量(保税)"].iloc[-2])
422
+ ) # 20210316 MA 分为保税和完税
423
+ except: # noqa: E722
424
+ receipt_list.append(
425
+ inner_df["仓单数量(完税)"].iloc[-2]
426
+ ) # 处理 MA 的特殊格式
427
+ except: # noqa: E722
325
428
  receipt_list.append(0)
326
429
  else:
327
430
  try:
328
- receipt_list.append(inner_df['仓单数量'].iloc[-1])
329
- except:
431
+ receipt_list.append(inner_df["仓单数量"].iloc[-1])
432
+ except: # noqa: E722
330
433
  receipt_list.append(0)
331
434
  if symbol == "MA":
332
- receipt_chg_list.append(inner_df['当日增减'].iloc[-2])
435
+ receipt_chg_list.append(inner_df["当日增减"].iloc[-2])
333
436
  else:
334
- receipt_chg_list.append(inner_df['当日增减'].iloc[-1])
335
- data_df = pd.DataFrame([symbol_list, receipt_list, receipt_chg_list, [date] * len(receipt_chg_list)]).T
336
- data_df.columns = ['var', 'receipt', 'receipt_chg', 'date']
337
- temp_list = data_df['var'].tolist()
338
- data_df['var'] = [item if item != "PTA" else "TA" for item in temp_list]
437
+ receipt_chg_list.append(inner_df["当日增减"].iloc[-1])
438
+ data_df = pd.DataFrame(
439
+ [symbol_list, receipt_list, receipt_chg_list, [date] * len(receipt_chg_list)]
440
+ ).T
441
+ data_df.columns = ["var", "receipt", "receipt_chg", "date"]
442
+ temp_list = data_df["var"].tolist()
443
+ data_df["var"] = [item if item != "PTA" else "TA" for item in temp_list]
339
444
  if len(data_df.index) != 0:
340
- data_df.index = data_df['var']
445
+ data_df.index = data_df["var"]
341
446
  vars_in_market = [i for i in vars_list if i in data_df.index]
342
447
  records = data_df.loc[vars_in_market, :]
343
448
  return records.reset_index(drop=True)
344
449
 
345
450
 
346
- def get_gfex_receipt(date: str = None, vars_list: List = cons.contract_symbols) -> pd.DataFrame:
451
+ def get_gfex_receipt(
452
+ date: str = None, vars_list: List = cons.contract_symbols
453
+ ) -> pd.DataFrame:
347
454
  """
348
455
  广州期货交易所-注册仓单数据
349
456
  http://www.gfex.com.cn/gfex/cdrb/hqsj_tjsj.shtml
@@ -357,13 +464,11 @@ def get_gfex_receipt(date: str = None, vars_list: List = cons.contract_symbols)
357
464
  if not isinstance(vars_list, list):
358
465
  raise warnings.warn("vars_list: 必须是列表")
359
466
  date = cons.convert_date(date) if date is not None else datetime.date.today()
360
- if date.strftime('%Y%m%d') not in calendar:
467
+ if date.strftime("%Y%m%d") not in calendar:
361
468
  warnings.warn(f"{date.strftime('%Y%m%d')}非交易日")
362
469
  return pd.DataFrame()
363
470
  url = "http://www.gfex.com.cn/u/interfacesWebTdWbillWeeklyQuotes/loadList"
364
- payload = {
365
- "gen_date": date.isoformat().replace("-", "")
366
- }
471
+ payload = {"gen_date": date.isoformat().replace("-", "")}
367
472
  headers = {
368
473
  "Accept": "application/json, text/javascript, */*; q=0.01",
369
474
  "Accept-Encoding": "gzip, deflate",
@@ -378,35 +483,44 @@ def get_gfex_receipt(date: str = None, vars_list: List = cons.contract_symbols)
378
483
  "Referer": "http://www.gfex.com.cn/gfex/rihq/hqsj_tjsj.shtml",
379
484
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
380
485
  "X-Requested-With": "XMLHttpRequest",
381
- "content-type": "application/x-www-form-urlencoded"
486
+ "content-type": "application/x-www-form-urlencoded",
382
487
  }
383
488
  r = requests.post(url, data=payload, headers=headers)
384
489
  data_json = r.json()
385
- temp_df = pd.DataFrame(data_json['data'])
386
- temp_df = temp_df[temp_df['variety'].str.contains("小计")]
387
- result_df = temp_df[['wbillQty', 'diff']].copy()
490
+ temp_df = pd.DataFrame(data_json["data"])
491
+ temp_df = temp_df[temp_df["variety"].str.contains("小计")]
492
+ result_df = temp_df[["wbillQty", "diff"]].copy()
388
493
  if result_df.empty:
389
494
  return pd.DataFrame()
390
495
 
391
- result_df.loc[:, 'date'] = date.isoformat().replace("-", "")
392
- result_df.loc[:, 'var'] = [item.upper() for item in temp_df['varietyOrder'].tolist()]
496
+ result_df.loc[:, "date"] = date.isoformat().replace("-", "")
497
+ result_df.loc[:, "var"] = [
498
+ item.upper() for item in temp_df["varietyOrder"].tolist()
499
+ ]
393
500
  result_df.reset_index(drop=True, inplace=True)
394
- result_df.rename(columns={
395
- "wbillQty": "receipt",
396
- "diff": "receipt_chg",
397
- }, inplace=True)
398
- result_df = result_df[[
399
- 'var', 'receipt', 'receipt_chg', 'date'
400
- ]]
401
- result_df.set_index(['var'], inplace=True)
402
- if 'LC' not in result_df.index:
403
- vars_list.remove('LC')
501
+ result_df.rename(
502
+ columns={
503
+ "wbillQty": "receipt",
504
+ "diff": "receipt_chg",
505
+ },
506
+ inplace=True,
507
+ )
508
+ result_df = result_df[["var", "receipt", "receipt_chg", "date"]]
509
+ result_df.set_index(keys=["var"], inplace=True)
510
+ if "LC" not in result_df.index:
511
+ vars_list.remove("LC")
512
+ if "PS" not in result_df.index:
513
+ vars_list.remove("PS")
404
514
  result_df = result_df.loc[vars_list, :]
405
515
  result_df.reset_index(inplace=True)
406
516
  return result_df
407
517
 
408
518
 
409
- def get_receipt(start_date: str = None, end_date: str = None, vars_list: List = cons.contract_symbols):
519
+ def get_receipt(
520
+ start_date: str = None,
521
+ end_date: str = None,
522
+ vars_list: List = cons.contract_symbols,
523
+ ):
410
524
  """
411
525
  大宗商品-注册仓单数据
412
526
  :param start_date: 开始日期 format:YYYY-MM-DD 或 YYYYMMDD 或 datetime.date 对象 为空时为当天
@@ -419,49 +533,68 @@ def get_receipt(start_date: str = None, end_date: str = None, vars_list: List =
419
533
  :rtype: pandas.DataFrame
420
534
  """
421
535
  if not isinstance(vars_list, list):
422
- return warnings.warn(f"vars_list: 必须是列表")
423
- start_date = cons.convert_date(start_date) if start_date is not None else datetime.date.today()
424
- end_date = cons.convert_date(end_date) if end_date is not None else cons.convert_date(
425
- cons.get_latest_data_date(datetime.datetime.now()))
536
+ return warnings.warn("vars_list: 必须是列表")
537
+ start_date = (
538
+ cons.convert_date(start_date)
539
+ if start_date is not None
540
+ else datetime.date.today()
541
+ )
542
+ end_date = (
543
+ cons.convert_date(end_date)
544
+ if end_date is not None
545
+ else cons.convert_date(cons.get_latest_data_date(datetime.datetime.now()))
546
+ )
426
547
  records = pd.DataFrame()
427
548
  while start_date <= end_date:
428
- if start_date.strftime('%Y%m%d') not in calendar:
549
+ if start_date.strftime("%Y%m%d") not in calendar:
429
550
  warnings.warn(f"{start_date.strftime('%Y%m%d')} 非交易日")
430
551
  else:
431
552
  print(start_date)
432
553
  for market, market_vars in cons.market_exchange_symbols.items():
433
- if market == 'dce':
554
+ if market == "dce":
434
555
  if start_date >= datetime.date(2009, 4, 7):
435
556
  f = get_dce_receipt
436
557
  else:
437
- print('20090407 起,大连商品交易所每个交易日更新仓单数据')
558
+ print("20090407 起,大连商品交易所每个交易日更新仓单数据")
438
559
  f = None
439
- elif market == 'shfe':
440
- if datetime.date(2008, 10, 6) <= start_date <= datetime.date(2014, 5, 16):
560
+ elif market == "shfe":
561
+ if (
562
+ datetime.date(2008, 10, 6)
563
+ <= start_date
564
+ <= datetime.date(2014, 5, 16)
565
+ ):
441
566
  f = get_shfe_receipt_1
442
567
  elif start_date > datetime.date(2014, 5, 16):
443
568
  f = get_shfe_receipt_2
444
569
  else:
445
570
  f = None
446
- print('20081006 起,上海期货交易所每个交易日更新仓单数据')
571
+ print("20081006 起,上海期货交易所每个交易日更新仓单数据")
447
572
  elif market == "gfex":
448
573
  if start_date > datetime.date(2022, 12, 22):
449
574
  f = get_gfex_receipt
450
575
  else:
451
576
  f = None
452
- print('20081006 起,上海期货交易所每个交易日更新仓单数据')
453
- elif market == 'czce':
454
- if datetime.date(2008, 3, 3) <= start_date <= datetime.date(2010, 8, 24):
577
+ print("20081006 起,上海期货交易所每个交易日更新仓单数据")
578
+ elif market == "czce":
579
+ if (
580
+ datetime.date(2008, 3, 3)
581
+ <= start_date
582
+ <= datetime.date(2010, 8, 24)
583
+ ):
455
584
  f = get_czce_receipt_1
456
- elif datetime.date(2010, 8, 24) < start_date <= datetime.date(2015, 11, 11):
585
+ elif (
586
+ datetime.date(2010, 8, 24)
587
+ < start_date
588
+ <= datetime.date(2015, 11, 11)
589
+ ):
457
590
  f = get_czce_receipt_2
458
591
  elif start_date > datetime.date(2015, 11, 11):
459
592
  f = get_czce_receipt_3
460
593
  else:
461
594
  f = None
462
- print('20080303 起,郑州商品交易所每个交易日更新仓单数据')
595
+ print("20080303 起,郑州商品交易所每个交易日更新仓单数据")
463
596
  get_vars = [var for var in vars_list if var in market_vars]
464
- if market != 'cffex' and get_vars != []:
597
+ if market != "cffex" and get_vars != []:
465
598
  if f is not None:
466
599
  records = pd.concat([records, f(start_date, get_vars)])
467
600
  start_date += datetime.timedelta(days=1)
@@ -471,6 +604,6 @@ def get_receipt(start_date: str = None, end_date: str = None, vars_list: List =
471
604
  return records
472
605
 
473
606
 
474
- if __name__ == '__main__':
475
- get_receipt_df = get_receipt(start_date='20230601', end_date='20230615')
607
+ if __name__ == "__main__":
608
+ get_receipt_df = get_receipt(start_date="20251031", end_date="20251103", vars_list=['MA'])
476
609
  print(get_receipt_df)