akshare 1.13.46__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.
- akshare/__init__.py +757 -161
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +3 -7
- akshare/air/cons.py +1 -0
- akshare/air/crypto.js +1 -1
- akshare/air/outcrypto.js +1 -1
- akshare/air/sunrise_tad.py +32 -17
- akshare/article/cons.py +1 -0
- akshare/article/epu_index.py +4 -3
- akshare/article/ff_factor.py +19 -8
- akshare/article/fred_md.py +4 -1
- akshare/article/risk_rv.py +3 -8
- akshare/bank/bank_cbirc_2020.py +11 -11
- akshare/bank/cons.py +7 -6
- akshare/bond/bond_buy_back_em.py +228 -0
- akshare/bond/bond_cb_sina.py +1 -0
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_cbond.py +19 -14
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +75 -48
- akshare/bond/bond_convert.py +10 -9
- akshare/bond/bond_em.py +37 -17
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_summary.py +38 -37
- akshare/bond/bond_zh_cov.py +31 -40
- akshare/bond/bond_zh_sina.py +61 -51
- akshare/bond/cons.py +14 -11
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/crypto/__init__.py +1 -1
- akshare/crypto/crypto_bitcoin_cme.py +9 -7
- akshare/crypto/crypto_hold.py +4 -2
- akshare/currency/currency.py +1 -0
- akshare/currency/currency_china_bank_sina.py +11 -6
- akshare/currency/currency_safe.py +7 -6
- akshare/data/__init__.py +1 -1
- akshare/data/cninfo.js +1 -1
- akshare/datasets.py +10 -21
- akshare/economic/cons.py +10 -3
- akshare/economic/macro_australia.py +74 -69
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_canada.py +92 -81
- akshare/economic/macro_china.py +163 -117
- akshare/economic/macro_china_hk.py +0 -1
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_euro.py +103 -56
- akshare/economic/macro_finance_ths.py +135 -0
- akshare/economic/macro_germany.py +1 -1
- akshare/economic/macro_info_ws.py +100 -0
- akshare/economic/macro_japan.py +0 -1
- akshare/economic/macro_other.py +1 -6
- akshare/economic/macro_swiss.py +2 -3
- akshare/economic/macro_uk.py +1 -1
- akshare/economic/macro_usa.py +7 -9
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +94 -126
- akshare/energy/energy_oil_em.py +1 -2
- akshare/event/cons.py +1 -0
- akshare/event/migration.py +3 -2
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/forex/__init__.py +0 -0
- akshare/forex/cons.py +192 -0
- akshare/forex/forex_em.py +149 -0
- akshare/fortune/fortune_500.py +15 -48
- akshare/fortune/fortune_bloomberg.py +6 -3
- akshare/fortune/fortune_forbes_500.py +3 -6
- akshare/fortune/fortune_hurun.py +2 -1
- akshare/fortune/fortune_xincaifu_500.py +17 -14
- akshare/fund/fund_amac.py +38 -15
- akshare/fund/fund_announcement_em.py +145 -0
- akshare/fund/fund_aum_em.py +49 -35
- akshare/fund/fund_em.py +251 -220
- akshare/fund/fund_etf_em.py +44 -35
- akshare/fund/fund_etf_sina.py +76 -27
- akshare/fund/fund_etf_ths.py +95 -0
- akshare/fund/fund_fee_em.py +172 -0
- akshare/fund/fund_fhsp_em.py +42 -32
- akshare/fund/fund_init_em.py +8 -5
- akshare/fund/fund_lof_em.py +12 -19
- akshare/fund/fund_manager.py +25 -11
- akshare/fund/fund_overview_em.py +42 -0
- akshare/fund/fund_portfolio_em.py +78 -66
- akshare/fund/fund_position_lg.py +19 -8
- akshare/fund/fund_rank_em.py +90 -84
- akshare/fund/fund_rating.py +33 -12
- akshare/fund/fund_report_cninfo.py +63 -48
- akshare/fund/fund_scale_em.py +24 -13
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +3 -2
- akshare/futures/cons.py +141 -46
- akshare/futures/cot.py +89 -88
- akshare/futures/futures_basis.py +99 -33
- akshare/futures/futures_comex_em.py +1 -0
- akshare/futures/futures_comm_ctp.py +13 -2
- akshare/futures/futures_contract_detail.py +59 -9
- akshare/futures/futures_daily_bar.py +75 -62
- akshare/futures/futures_foreign.py +14 -8
- akshare/futures/futures_hf_em.py +215 -61
- akshare/futures/futures_hist_em.py +191 -0
- akshare/futures/futures_hq_sina.py +79 -61
- akshare/futures/futures_index_ccidx.py +24 -82
- akshare/futures/futures_inventory_99.py +70 -272
- akshare/futures/futures_inventory_em.py +14 -11
- akshare/futures/futures_news_shmet.py +2 -2
- akshare/futures/futures_roll_yield.py +11 -24
- akshare/futures/futures_rule.py +7 -3
- akshare/futures/futures_rule_em.py +38 -0
- akshare/futures/futures_settlement_price_sgx.py +21 -6
- akshare/futures/futures_stock_js.py +1 -2
- akshare/futures/futures_to_spot.py +43 -39
- akshare/futures/futures_warehouse_receipt.py +53 -48
- akshare/futures/futures_zh_sina.py +4 -4
- akshare/futures/receipt.py +298 -165
- akshare/futures/requests_fun.py +16 -3
- akshare/futures/symbol_var.py +32 -13
- akshare/futures_derivative/cons.py +100 -103
- akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
- akshare/futures_derivative/futures_contract_info_czce.py +2 -0
- akshare/futures_derivative/futures_contract_info_dce.py +43 -17
- akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +7 -8
- akshare/futures_derivative/futures_cot_sina.py +28 -19
- akshare/futures_derivative/futures_index_sina.py +25 -13
- akshare/fx/cons.py +12 -7
- akshare/fx/currency_investing.py +19 -285
- akshare/fx/fx_c_swap_cm.py +62 -0
- akshare/fx/fx_quote.py +3 -2
- akshare/fx/fx_quote_baidu.py +2 -1
- akshare/hf/__init__.py +1 -1
- akshare/hf/hf_sp500.py +8 -7
- akshare/index/cons.py +132 -28
- akshare/index/index_cflp.py +29 -26
- akshare/index/index_cni.py +89 -91
- akshare/index/index_cons.py +26 -10
- akshare/index/index_csindex.py +68 -0
- akshare/index/index_cx.py +263 -62
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_eri.py +1 -0
- akshare/index/index_global_em.py +167 -0
- akshare/index/index_global_sina.py +82 -0
- akshare/index/index_kq_fz.py +17 -14
- akshare/index/index_kq_ss.py +1 -0
- akshare/index/index_option_qvix.py +351 -16
- akshare/index/index_research_sw.py +38 -38
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +6 -10
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +193 -101
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sugar.py +18 -4
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +53 -75
- akshare/index/index_zh_em.py +15 -82
- akshare/interest_rate/interbank_rate_em.py +14 -10
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/jm.js +0 -1
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/__init__.py +1 -1
- akshare/news/news_baidu.py +395 -220
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +49 -13
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +12 -12
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +355 -211
- akshare/option/option_commodity_sina.py +22 -26
- akshare/option/option_contract_info_ctp.py +63 -0
- akshare/option/option_current_sse.py +61 -0
- akshare/option/option_current_szse.py +84 -0
- akshare/option/option_czce.py +37 -9
- akshare/option/option_daily_stats_sse_szse.py +145 -0
- akshare/option/option_em.py +4 -8
- akshare/option/option_finance.py +60 -12
- akshare/option/option_finance_sina.py +28 -26
- akshare/option/option_lhb_em.py +62 -57
- akshare/option/option_margin.py +62 -0
- akshare/option/option_premium_analysis_em.py +58 -53
- akshare/option/option_risk_analysis_em.py +11 -8
- akshare/option/option_risk_indicator_sse.py +18 -16
- akshare/option/option_value_analysis_em.py +62 -55
- akshare/other/__init__.py +1 -1
- akshare/other/other_car_cpca.py +20 -20
- akshare/pro/__init__.py +0 -1
- akshare/pro/client.py +6 -4
- akshare/pro/cons.py +3 -2
- akshare/pro/data_pro.py +6 -5
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/qhkc/__init__.py +1 -6
- akshare/qhkc/qhkc_api.py +64 -22
- akshare/qhkc_web/__init__.py +1 -6
- akshare/qhkc_web/qhkc_fund.py +10 -6
- akshare/qhkc_web/qhkc_index.py +28 -14
- akshare/qhkc_web/qhkc_tool.py +62 -59
- akshare/rate/__init__.py +1 -1
- akshare/rate/repo_rate.py +36 -32
- akshare/reits/__init__.py +1 -1
- akshare/reits/reits_basic.py +149 -13
- akshare/request.py +117 -0
- akshare/spot/__init__.py +1 -1
- akshare/spot/spot_hog_soozhu.py +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +70 -9
- akshare/stock/cons.py +60 -23
- akshare/stock/stock_allotment_cninfo.py +10 -9
- akshare/stock/stock_ask_bid_em.py +3 -78
- akshare/stock/stock_board_concept_em.py +160 -35
- akshare/stock/stock_board_industry_em.py +163 -70
- akshare/stock/stock_cg_equity_mortgage.py +15 -11
- akshare/stock/stock_cg_guarantee.py +41 -51
- akshare/stock/stock_cg_lawsuit.py +36 -35
- akshare/stock/stock_dividend_cninfo.py +36 -16
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +73 -64
- akshare/stock/stock_fund_hold.py +1 -2
- akshare/stock/stock_gsrl_em.py +1 -0
- akshare/stock/stock_hk_comparison_em.py +175 -0
- akshare/stock/stock_hk_famous.py +107 -0
- akshare/stock/stock_hk_fhpx_ths.py +2 -1
- akshare/stock/stock_hk_hot_rank_em.py +1 -0
- akshare/stock/stock_hk_sina.py +91 -42
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -5
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- akshare/stock/stock_hot_rank_em.py +4 -1
- akshare/stock/stock_hot_search_baidu.py +32 -19
- akshare/stock/stock_hot_up_em.py +4 -1
- akshare/stock/stock_hsgt_em.py +155 -0
- akshare/stock/stock_industry.py +1 -0
- akshare/stock/stock_industry_cninfo.py +25 -20
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +5 -9
- akshare/stock/stock_info.py +31 -19
- akshare/stock/stock_info_em.py +17 -11
- akshare/stock/stock_intraday_em.py +9 -80
- akshare/stock/stock_intraday_sina.py +2 -2
- akshare/stock/stock_ipo_summary_cninfo.py +25 -10
- akshare/stock/stock_new_cninfo.py +32 -19
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +9 -8
- akshare/stock/stock_profile_em.py +302 -0
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_repurchase_em.py +7 -2
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- akshare/stock/stock_share_hold.py +24 -20
- akshare/stock/stock_stop.py +6 -6
- akshare/stock/stock_summary.py +153 -417
- akshare/stock/stock_us_famous.py +19 -11
- akshare/stock/stock_us_js.py +3 -2
- akshare/stock/stock_us_pink.py +38 -27
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_weibo_nlp.py +18 -20
- akshare/stock/stock_xq.py +36 -9
- akshare/stock/stock_zh_a_sina.py +58 -80
- akshare/stock/stock_zh_a_special.py +240 -243
- akshare/stock/stock_zh_a_tick_tx.py +11 -3
- akshare/stock/stock_zh_ah_tx.py +23 -26
- akshare/stock/stock_zh_b_sina.py +32 -55
- akshare/stock/stock_zh_comparison_em.py +250 -0
- akshare/stock/stock_zh_kcb_report.py +11 -9
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_a/__init__.py +0 -0
- akshare/stock_a/stock_board_concept_name_em.py +170 -0
- akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
- akshare/stock_a/stock_zh_a_spot.py +212 -0
- akshare/stock_feature/cons.py +1 -0
- akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +15 -57
- akshare/stock_feature/stock_a_pe_and_pb.py +39 -9
- akshare/stock_feature/stock_account_em.py +0 -1
- akshare/stock_feature/stock_all_pb.py +2 -1
- akshare/stock_feature/stock_analyst_em.py +36 -30
- akshare/stock_feature/stock_board_concept_ths.py +144 -252
- akshare/stock_feature/stock_board_industry_ths.py +137 -401
- akshare/stock_feature/stock_buffett_index_lg.py +10 -8
- akshare/stock_feature/stock_classify_sina.py +3 -6
- akshare/stock_feature/stock_comment_em.py +81 -144
- akshare/stock_feature/stock_concept_futu.py +183 -0
- akshare/stock_feature/stock_congestion_lg.py +2 -1
- akshare/stock_feature/stock_cyq_em.py +5 -11
- akshare/stock_feature/stock_disclosure_cninfo.py +20 -10
- akshare/stock_feature/stock_dxsyl_em.py +121 -74
- akshare/stock_feature/stock_ebs_lg.py +5 -4
- akshare/stock_feature/stock_esg_sina.py +33 -15
- akshare/stock_feature/stock_fhps_em.py +62 -26
- akshare/stock_feature/stock_fhps_ths.py +34 -7
- akshare/stock_feature/stock_fund_flow.py +38 -25
- akshare/stock_feature/stock_gddh_em.py +19 -11
- akshare/stock_feature/stock_gdfx_em.py +226 -113
- akshare/stock_feature/stock_gdhs.py +75 -50
- akshare/stock_feature/stock_gdzjc_em.py +21 -10
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_gxl_lg.py +3 -2
- akshare/stock_feature/stock_hist_em.py +158 -237
- akshare/stock_feature/stock_hist_tx.py +13 -10
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hot_xq.py +4 -6
- akshare/stock_feature/stock_hsgt_em.py +269 -97
- akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
- akshare/stock_feature/stock_hsgt_min_em.py +13 -16
- akshare/stock_feature/stock_info.py +8 -81
- akshare/stock_feature/stock_inner_trade_xq.py +38 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +43 -40
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +165 -35
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +101 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -17
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +7 -7
- akshare/stock_feature/stock_market_legu.py +4 -2
- akshare/stock_feature/stock_pankou_em.py +71 -35
- akshare/stock_feature/stock_qsjy_em.py +13 -4
- akshare/stock_feature/stock_report_em.py +152 -8
- akshare/stock_feature/stock_research_report_em.py +55 -20
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +20 -15
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +37 -14
- akshare/stock_feature/stock_three_report_em.py +120 -78
- akshare/stock_feature/stock_ttm_lyr.py +18 -9
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_yjbb_em.py +58 -32
- akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
- akshare/stock_feature/stock_yjyg_em.py +1 -1
- akshare/stock_feature/stock_yzxdr_em.py +24 -22
- akshare/stock_feature/stock_zdhtmx_em.py +20 -6
- akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
- akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
- akshare/stock_feature/stock_ztb_em.py +39 -24
- akshare/stock_fundamental/__init__.py +1 -1
- akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
- akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
- akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +203 -59
- akshare/stock_fundamental/stock_finance_ths.py +524 -57
- akshare/stock_fundamental/stock_finance_us_em.py +268 -0
- akshare/stock_fundamental/stock_gbjg_em.py +80 -0
- akshare/stock_fundamental/stock_hold.py +26 -17
- akshare/stock_fundamental/stock_ipo_declare.py +1 -0
- akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
- akshare/stock_fundamental/stock_kcb_sse.py +26 -25
- akshare/stock_fundamental/stock_notice.py +41 -18
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
- akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
- akshare/stock_fundamental/stock_recommend.py +20 -4
- akshare/stock_fundamental/stock_register_em.py +448 -0
- akshare/stock_fundamental/stock_zygc.py +5 -62
- akshare/tool/trade_date_hist.py +1 -1
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2009 -1338
- akshare/utils/func.py +49 -2
- akshare/utils/multi_decrypt.py +53 -0
- akshare/utils/token_process.py +6 -5
- akshare/utils/tqdm.py +13 -3
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/METADATA +56 -86
- akshare-1.17.99.dist-info/RECORD +409 -0
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
- tests/test_func.py +3 -5
- akshare/bond/bond_futures.py +0 -50
- akshare/bond/bond_investing.py +0 -139
- akshare/crypto/crypto_hist_investing.py +0 -249
- akshare/fortune/fortune_it_juzi.py +0 -123
- akshare/fund/fund_announcement.py +0 -56
- akshare/futures/futures_international.py +0 -170
- akshare/futures/futures_news_baidu.py +0 -54
- akshare/futures/inventory_data.py +0 -100
- akshare/futures_derivative/futures_index_price_nh.py +0 -61
- akshare/futures_derivative/futures_index_return_nh.py +0 -47
- akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -78
- akshare/index/index_investing.py +0 -232
- akshare/sport/__init__.py +0 -6
- akshare/sport/sport_olympic.py +0 -27
- akshare/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_wencai.py +0 -104
- akshare/stock_fundamental/stock_mda_ym.py +0 -40
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.13.46.dist-info/RECORD +0 -380
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
akshare/futures/receipt.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
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(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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(
|
|
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
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"month": date.month - 1, # 网站月份描述少 1 个月, 属于网站问题
|
|
49
|
-
"day": date.day
|
|
56
|
+
"tradeDate": date.strftime("%Y%m%d"),
|
|
57
|
+
"varietyId": "all",
|
|
50
58
|
}
|
|
51
|
-
|
|
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
|
|
54
|
-
if isinstance(x[
|
|
55
|
-
if x[
|
|
56
|
-
var = x[
|
|
57
|
-
temp_data = {
|
|
58
|
-
|
|
59
|
-
|
|
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[
|
|
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(
|
|
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(
|
|
82
|
-
date =
|
|
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
|
|
86
|
-
if date ==
|
|
87
|
-
shfe_20100126[
|
|
104
|
+
return pd.DataFrame()
|
|
105
|
+
if date == "20100126":
|
|
106
|
+
shfe_20100126["date"] = date
|
|
88
107
|
return shfe_20100126
|
|
89
|
-
elif date ==
|
|
90
|
-
shfe_20101029[
|
|
108
|
+
elif date == "20101029":
|
|
109
|
+
shfe_20101029["date"] = date
|
|
91
110
|
return shfe_20101029
|
|
92
|
-
elif date in [
|
|
93
|
-
|
|
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
|
|
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=
|
|
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[
|
|
110
|
-
data_dict[
|
|
111
|
-
data_dict[
|
|
112
|
-
data_dict[
|
|
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[
|
|
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(
|
|
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(
|
|
134
|
-
date =
|
|
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(
|
|
137
|
-
return
|
|
138
|
-
url = cons.
|
|
139
|
-
r = requests_link(url, encoding=
|
|
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[
|
|
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[
|
|
149
|
-
data_cut = data[data[
|
|
189
|
+
for var in set(data["VARNAME"].tolist()):
|
|
190
|
+
data_cut = data[data["VARNAME"] == var]
|
|
150
191
|
if "BC" in var:
|
|
151
|
-
data_dict = {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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 = {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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 =
|
|
162
|
-
|
|
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[
|
|
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 =
|
|
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(
|
|
235
|
+
warnings.warn("%s非交易日" % date.strftime("%Y%m%d"))
|
|
185
236
|
return None
|
|
186
|
-
if date ==
|
|
237
|
+
if date == "20090820":
|
|
187
238
|
return pd.DataFrame()
|
|
188
239
|
url = cons.CZCE_RECEIPT_URL_1 % date
|
|
189
|
-
r = requests_link(url, encoding=
|
|
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
|
|
194
|
-
ends = [x for x in data.index if
|
|
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=
|
|
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=
|
|
202
|
-
if
|
|
203
|
-
var =
|
|
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
|
|
206
|
-
if var ==
|
|
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 = {
|
|
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[
|
|
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(
|
|
235
|
-
date =
|
|
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(
|
|
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 =
|
|
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 = [
|
|
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
|
|
251
|
-
var =
|
|
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(
|
|
255
|
-
var = chinese_to_english(re.sub(r
|
|
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[
|
|
258
|
-
receipt_chg = data_cut[
|
|
259
|
-
data_dict = {
|
|
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[
|
|
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(
|
|
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
|
-
|
|
282
|
-
|
|
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(
|
|
285
|
-
return
|
|
286
|
-
|
|
287
|
-
|
|
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[
|
|
290
|
-
|
|
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[
|
|
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[
|
|
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
|
|
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=
|
|
407
|
+
inner_df = inner_df.dropna(axis=1, how="all")
|
|
311
408
|
if symbol == "PTA":
|
|
312
409
|
try:
|
|
313
|
-
receipt_list.append(
|
|
314
|
-
inner_df[
|
|
315
|
-
|
|
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(
|
|
321
|
-
inner_df[
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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[
|
|
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[
|
|
435
|
+
receipt_chg_list.append(inner_df["当日增减"].iloc[-2])
|
|
333
436
|
else:
|
|
334
|
-
receipt_chg_list.append(inner_df[
|
|
335
|
-
data_df = pd.DataFrame(
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
data_df
|
|
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[
|
|
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(
|
|
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(
|
|
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[
|
|
386
|
-
temp_df = temp_df[temp_df[
|
|
387
|
-
result_df = temp_df[[
|
|
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[:,
|
|
392
|
-
result_df.loc[:,
|
|
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(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
result_df
|
|
402
|
-
|
|
403
|
-
|
|
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(
|
|
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(
|
|
423
|
-
start_date =
|
|
424
|
-
|
|
425
|
-
|
|
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(
|
|
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 ==
|
|
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(
|
|
558
|
+
print("20090407 起,大连商品交易所每个交易日更新仓单数据")
|
|
438
559
|
f = None
|
|
439
|
-
elif market ==
|
|
440
|
-
if
|
|
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(
|
|
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(
|
|
453
|
-
elif market ==
|
|
454
|
-
if
|
|
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
|
|
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(
|
|
595
|
+
print("20080303 起,郑州商品交易所每个交易日更新仓单数据")
|
|
463
596
|
get_vars = [var for var in vars_list if var in market_vars]
|
|
464
|
-
if market !=
|
|
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__ ==
|
|
475
|
-
get_receipt_df = get_receipt(start_date=
|
|
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)
|