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
|
@@ -8,7 +8,7 @@ https://data.eastmoney.com/stock/tradedetail.html
|
|
|
8
8
|
|
|
9
9
|
import pandas as pd
|
|
10
10
|
import requests
|
|
11
|
-
from tqdm import
|
|
11
|
+
from akshare.utils.tqdm import get_tqdm
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def stock_lhb_detail_em(
|
|
@@ -45,7 +45,8 @@ def stock_lhb_detail_em(
|
|
|
45
45
|
data_json = r.json()
|
|
46
46
|
total_page_num = data_json["result"]["pages"]
|
|
47
47
|
big_df = pd.DataFrame()
|
|
48
|
-
|
|
48
|
+
tqdm = get_tqdm()
|
|
49
|
+
for page in tqdm(range(1, total_page_num + 1), leave=False):
|
|
49
50
|
params.update(
|
|
50
51
|
{
|
|
51
52
|
"pageNumber": page,
|
|
@@ -111,7 +112,6 @@ def stock_lhb_detail_em(
|
|
|
111
112
|
]
|
|
112
113
|
]
|
|
113
114
|
big_df["上榜日"] = pd.to_datetime(big_df["上榜日"], errors="coerce").dt.date
|
|
114
|
-
|
|
115
115
|
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
116
116
|
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
|
|
117
117
|
big_df["龙虎榜净买额"] = pd.to_numeric(big_df["龙虎榜净买额"], errors="coerce")
|
|
@@ -224,7 +224,7 @@ def stock_lhb_stock_statistic_em(symbol: str = "近一月") -> pd.DataFrame:
|
|
|
224
224
|
|
|
225
225
|
|
|
226
226
|
def stock_lhb_jgmmtj_em(
|
|
227
|
-
start_date: str = "
|
|
227
|
+
start_date: str = "20240417", end_date: str = "20240430"
|
|
228
228
|
) -> pd.DataFrame:
|
|
229
229
|
"""
|
|
230
230
|
东方财富网-数据中心-龙虎榜单-机构买卖每日统计
|
|
@@ -242,7 +242,7 @@ def stock_lhb_jgmmtj_em(
|
|
|
242
242
|
params = {
|
|
243
243
|
"sortColumns": "NET_BUY_AMT,TRADE_DATE,SECURITY_CODE",
|
|
244
244
|
"sortTypes": "-1,-1,1",
|
|
245
|
-
"pageSize": "
|
|
245
|
+
"pageSize": "500",
|
|
246
246
|
"pageNumber": "1",
|
|
247
247
|
"reportName": "RPT_ORGANIZATION_TRADE_DETAILS",
|
|
248
248
|
"columns": "ALL",
|
|
@@ -252,10 +252,22 @@ def stock_lhb_jgmmtj_em(
|
|
|
252
252
|
}
|
|
253
253
|
r = requests.get(url, params=params)
|
|
254
254
|
data_json = r.json()
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
255
|
+
total_page = data_json["result"]["pages"]
|
|
256
|
+
big_df = pd.DataFrame()
|
|
257
|
+
tqdm = get_tqdm()
|
|
258
|
+
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
259
|
+
params.update(
|
|
260
|
+
{
|
|
261
|
+
"pageNumber": page,
|
|
262
|
+
}
|
|
263
|
+
)
|
|
264
|
+
r = requests.get(url, params=params)
|
|
265
|
+
data_json = r.json()
|
|
266
|
+
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
267
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
268
|
+
big_df.reset_index(inplace=True)
|
|
269
|
+
big_df["index"] = big_df.index + 1
|
|
270
|
+
big_df.columns = [
|
|
259
271
|
"序号",
|
|
260
272
|
"-",
|
|
261
273
|
"名称",
|
|
@@ -283,7 +295,7 @@ def stock_lhb_jgmmtj_em(
|
|
|
283
295
|
"-",
|
|
284
296
|
"-",
|
|
285
297
|
]
|
|
286
|
-
|
|
298
|
+
big_df = big_df[
|
|
287
299
|
[
|
|
288
300
|
"序号",
|
|
289
301
|
"代码",
|
|
@@ -303,22 +315,21 @@ def stock_lhb_jgmmtj_em(
|
|
|
303
315
|
"上榜日期",
|
|
304
316
|
]
|
|
305
317
|
]
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
318
|
+
big_df["上榜日期"] = pd.to_datetime(big_df["上榜日期"], errors="coerce").dt.date
|
|
319
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
320
|
+
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
|
|
321
|
+
big_df["买方机构数"] = pd.to_numeric(big_df["买方机构数"], errors="coerce")
|
|
322
|
+
big_df["卖方机构数"] = pd.to_numeric(big_df["卖方机构数"], errors="coerce")
|
|
323
|
+
big_df["机构买入总额"] = pd.to_numeric(big_df["机构买入总额"], errors="coerce")
|
|
324
|
+
big_df["机构卖出总额"] = pd.to_numeric(big_df["机构卖出总额"], errors="coerce")
|
|
325
|
+
big_df["机构买入净额"] = pd.to_numeric(big_df["机构买入净额"], errors="coerce")
|
|
326
|
+
big_df["市场总成交额"] = pd.to_numeric(big_df["市场总成交额"], errors="coerce")
|
|
327
|
+
big_df["机构净买额占总成交额比"] = pd.to_numeric(
|
|
328
|
+
big_df["机构净买额占总成交额比"], errors="coerce"
|
|
317
329
|
)
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return temp_df
|
|
330
|
+
big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
|
|
331
|
+
big_df["流通市值"] = pd.to_numeric(big_df["流通市值"], errors="coerce")
|
|
332
|
+
return big_df
|
|
322
333
|
|
|
323
334
|
|
|
324
335
|
def stock_lhb_jgstatistic_em(symbol: str = "近一月") -> pd.DataFrame:
|
|
@@ -352,12 +363,13 @@ def stock_lhb_jgstatistic_em(symbol: str = "近一月") -> pd.DataFrame:
|
|
|
352
363
|
data_json = r.json()
|
|
353
364
|
total_page = data_json["result"]["pages"]
|
|
354
365
|
big_df = pd.DataFrame()
|
|
366
|
+
tqdm = get_tqdm()
|
|
355
367
|
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
356
368
|
params.update({"pageNumber": page})
|
|
357
369
|
r = requests.get(url, params=params)
|
|
358
370
|
data_json = r.json()
|
|
359
371
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
360
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
372
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
361
373
|
big_df.reset_index(inplace=True)
|
|
362
374
|
big_df["index"] = big_df.index + 1
|
|
363
375
|
big_df.rename(
|
|
@@ -423,7 +435,7 @@ def stock_lhb_hyyyb_em(
|
|
|
423
435
|
) -> pd.DataFrame:
|
|
424
436
|
"""
|
|
425
437
|
东方财富网-数据中心-龙虎榜单-每日活跃营业部
|
|
426
|
-
https://data.eastmoney.com/stock/
|
|
438
|
+
https://data.eastmoney.com/stock/hyyyb.html
|
|
427
439
|
:param start_date: 开始日期
|
|
428
440
|
:type start_date: str
|
|
429
441
|
:param end_date: 结束日期
|
|
@@ -448,14 +460,14 @@ def stock_lhb_hyyyb_em(
|
|
|
448
460
|
r = requests.get(url, params=params)
|
|
449
461
|
data_json = r.json()
|
|
450
462
|
total_page = data_json["result"]["pages"]
|
|
451
|
-
|
|
452
463
|
big_df = pd.DataFrame()
|
|
464
|
+
tqdm = get_tqdm()
|
|
453
465
|
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
454
466
|
params.update({"pageNumber": page})
|
|
455
467
|
r = requests.get(url, params=params)
|
|
456
468
|
data_json = r.json()
|
|
457
469
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
458
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
470
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
459
471
|
big_df.reset_index(inplace=True)
|
|
460
472
|
big_df["index"] = big_df.index + 1
|
|
461
473
|
big_df.columns = [
|
|
@@ -468,7 +480,7 @@ def stock_lhb_hyyyb_em(
|
|
|
468
480
|
"卖出总金额",
|
|
469
481
|
"总买卖净额",
|
|
470
482
|
"-",
|
|
471
|
-
"
|
|
483
|
+
"营业部代码",
|
|
472
484
|
"买入股票",
|
|
473
485
|
"-",
|
|
474
486
|
"-",
|
|
@@ -484,6 +496,7 @@ def stock_lhb_hyyyb_em(
|
|
|
484
496
|
"卖出总金额",
|
|
485
497
|
"总买卖净额",
|
|
486
498
|
"买入股票",
|
|
499
|
+
"营业部代码",
|
|
487
500
|
]
|
|
488
501
|
]
|
|
489
502
|
|
|
@@ -527,6 +540,7 @@ def stock_lhb_yybph_em(symbol: str = "近一月") -> pd.DataFrame:
|
|
|
527
540
|
data_json = r.json()
|
|
528
541
|
total_page = data_json["result"]["pages"]
|
|
529
542
|
big_df = pd.DataFrame()
|
|
543
|
+
tqdm = get_tqdm()
|
|
530
544
|
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
531
545
|
params.update({"pageNumber": page})
|
|
532
546
|
r = requests.get(url, params=params)
|
|
@@ -662,6 +676,7 @@ def stock_lhb_traderstatistic_em(symbol: str = "近一月") -> pd.DataFrame:
|
|
|
662
676
|
data_json = r.json()
|
|
663
677
|
total_page = data_json["result"]["pages"]
|
|
664
678
|
big_df = pd.DataFrame()
|
|
679
|
+
tqdm = get_tqdm()
|
|
665
680
|
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
666
681
|
params.update({"pageNumber": page})
|
|
667
682
|
r = requests.get(url, params=params)
|
|
@@ -782,7 +797,6 @@ def stock_lhb_stock_detail_em(
|
|
|
782
797
|
"sortColumns": flag_map[flag],
|
|
783
798
|
"source": "WEB",
|
|
784
799
|
"client": "WEB",
|
|
785
|
-
"_": "1647338693644",
|
|
786
800
|
}
|
|
787
801
|
r = requests.get(url, params=params)
|
|
788
802
|
data_json = r.json()
|
|
@@ -887,9 +901,122 @@ def stock_lhb_stock_detail_em(
|
|
|
887
901
|
return temp_df
|
|
888
902
|
|
|
889
903
|
|
|
904
|
+
def stock_lhb_yyb_detail_em(symbol: str = "10188715") -> pd.DataFrame:
|
|
905
|
+
"""
|
|
906
|
+
东方财富网-数据中心-龙虎榜单-营业部历史交易明细-营业部交易明细
|
|
907
|
+
https://data.eastmoney.com/stock/lhb/yyb/10188715.html
|
|
908
|
+
:param symbol: 营业部代码, 如 "10188715", 通过 ak.stock_lhb_hyyyb_em() 接口获取
|
|
909
|
+
:type symbol: str
|
|
910
|
+
:return: 营业部交易明细数据
|
|
911
|
+
:rtype: pandas.DataFrame
|
|
912
|
+
"""
|
|
913
|
+
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
|
|
914
|
+
params = {
|
|
915
|
+
"sortColumns": "TRADE_DATE,SECURITY_CODE",
|
|
916
|
+
"sortTypes": "-1,1",
|
|
917
|
+
"pageSize": '100',
|
|
918
|
+
"pageNumber": "1",
|
|
919
|
+
"reportName": "RPT_OPERATEDEPT_TRADE_DETAILSNEW",
|
|
920
|
+
"columns": "ALL",
|
|
921
|
+
"source": "WEB",
|
|
922
|
+
"client": "WEB",
|
|
923
|
+
"filter": f'(OPERATEDEPT_CODE="{symbol}")',
|
|
924
|
+
}
|
|
925
|
+
r = requests.get(url, params=params)
|
|
926
|
+
data_json = r.json()
|
|
927
|
+
total_page = data_json["result"]["pages"]
|
|
928
|
+
big_df = pd.DataFrame()
|
|
929
|
+
tqdm = get_tqdm()
|
|
930
|
+
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
931
|
+
params.update({"pageNumber": page})
|
|
932
|
+
r = requests.get(url, params=params)
|
|
933
|
+
data_json = r.json()
|
|
934
|
+
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
935
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
936
|
+
|
|
937
|
+
# 检查DataFrame是否为空
|
|
938
|
+
if big_df.empty:
|
|
939
|
+
return pd.DataFrame()
|
|
940
|
+
|
|
941
|
+
# 确保列名与实际返回的JSON数据结构一致
|
|
942
|
+
column_map = {
|
|
943
|
+
"OPERATEDEPT_CODE": "营业部代码",
|
|
944
|
+
"OPERATEDEPT_NAME": "营业部名称",
|
|
945
|
+
"TRADE_DATE": "交易日期",
|
|
946
|
+
"D1_CLOSE_ADJCHRATE": "1日后涨跌幅",
|
|
947
|
+
"D2_CLOSE_ADJCHRATE": "2日后涨跌幅",
|
|
948
|
+
"D3_CLOSE_ADJCHRATE": "3日后涨跌幅",
|
|
949
|
+
"D5_CLOSE_ADJCHRATE": "5日后涨跌幅",
|
|
950
|
+
"D10_CLOSE_ADJCHRATE": "10日后涨跌幅",
|
|
951
|
+
"SECURITY_CODE": "股票代码",
|
|
952
|
+
"SECURITY_NAME_ABBR": "股票名称",
|
|
953
|
+
"ACT_BUY": "买入金额",
|
|
954
|
+
"ACT_SELL": "卖出金额",
|
|
955
|
+
"NET_AMT": "净额",
|
|
956
|
+
"EXPLANATION": "上榜原因",
|
|
957
|
+
"D20_CLOSE_ADJCHRATE": "20日后涨跌幅",
|
|
958
|
+
"D30_CLOSE_ADJCHRATE": "30日后涨跌幅",
|
|
959
|
+
"SECUCODE": "证券代码",
|
|
960
|
+
"OPERATEDEPT_CODE_OLD": "营业部旧代码",
|
|
961
|
+
"ORG_NAME_ABBR": "营业部简称",
|
|
962
|
+
"CHANGE_RATE": "涨跌幅"
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
# 重命名列
|
|
966
|
+
big_df.rename(columns=column_map, inplace=True)
|
|
967
|
+
|
|
968
|
+
# 添加序号列
|
|
969
|
+
big_df.reset_index(inplace=True)
|
|
970
|
+
big_df["序号"] = big_df.index + 1
|
|
971
|
+
|
|
972
|
+
# 选择需要的列并排序
|
|
973
|
+
result_columns = [
|
|
974
|
+
"序号",
|
|
975
|
+
"营业部代码",
|
|
976
|
+
"营业部名称",
|
|
977
|
+
"营业部简称",
|
|
978
|
+
"交易日期",
|
|
979
|
+
"股票代码",
|
|
980
|
+
"股票名称",
|
|
981
|
+
"涨跌幅",
|
|
982
|
+
"买入金额",
|
|
983
|
+
"卖出金额",
|
|
984
|
+
"净额",
|
|
985
|
+
"上榜原因",
|
|
986
|
+
"1日后涨跌幅",
|
|
987
|
+
"2日后涨跌幅",
|
|
988
|
+
"3日后涨跌幅",
|
|
989
|
+
"5日后涨跌幅",
|
|
990
|
+
"10日后涨跌幅",
|
|
991
|
+
"20日后涨跌幅",
|
|
992
|
+
"30日后涨跌幅",
|
|
993
|
+
]
|
|
994
|
+
|
|
995
|
+
# 确保所有列都存在
|
|
996
|
+
for col in result_columns:
|
|
997
|
+
if col not in big_df.columns and col != "序号":
|
|
998
|
+
big_df[col] = None
|
|
999
|
+
|
|
1000
|
+
big_df = big_df[result_columns]
|
|
1001
|
+
|
|
1002
|
+
# 处理日期格式
|
|
1003
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
1004
|
+
|
|
1005
|
+
# 处理数值列
|
|
1006
|
+
numeric_cols = [
|
|
1007
|
+
"涨跌幅", "买入金额", "卖出金额", "净额",
|
|
1008
|
+
"1日后涨跌幅", "2日后涨跌幅", "3日后涨跌幅",
|
|
1009
|
+
"5日后涨跌幅", "10日后涨跌幅", "20日后涨跌幅", "30日后涨跌幅"
|
|
1010
|
+
]
|
|
1011
|
+
for col in numeric_cols:
|
|
1012
|
+
big_df[col] = pd.to_numeric(big_df[col], errors="coerce")
|
|
1013
|
+
|
|
1014
|
+
return big_df
|
|
1015
|
+
|
|
1016
|
+
|
|
890
1017
|
if __name__ == "__main__":
|
|
891
1018
|
stock_lhb_detail_em_df = stock_lhb_detail_em(
|
|
892
|
-
start_date="
|
|
1019
|
+
start_date="20250201", end_date="20250228"
|
|
893
1020
|
)
|
|
894
1021
|
print(stock_lhb_detail_em_df)
|
|
895
1022
|
|
|
@@ -906,7 +1033,7 @@ if __name__ == "__main__":
|
|
|
906
1033
|
print(stock_lhb_stock_statistic_em_df)
|
|
907
1034
|
|
|
908
1035
|
stock_lhb_jgmmtj_em_df = stock_lhb_jgmmtj_em(
|
|
909
|
-
start_date="
|
|
1036
|
+
start_date="20240417", end_date="20240430"
|
|
910
1037
|
)
|
|
911
1038
|
print(stock_lhb_jgmmtj_em_df)
|
|
912
1039
|
|
|
@@ -914,7 +1041,7 @@ if __name__ == "__main__":
|
|
|
914
1041
|
print(stock_lhb_jgstatistic_em_df)
|
|
915
1042
|
|
|
916
1043
|
stock_lhb_hyyyb_em_df = stock_lhb_hyyyb_em(
|
|
917
|
-
start_date="
|
|
1044
|
+
start_date="20240401", end_date="20240430"
|
|
918
1045
|
)
|
|
919
1046
|
print(stock_lhb_hyyyb_em_df)
|
|
920
1047
|
|
|
@@ -933,6 +1060,9 @@ if __name__ == "__main__":
|
|
|
933
1060
|
print(stock_lhb_stock_detail_em_df)
|
|
934
1061
|
|
|
935
1062
|
stock_lhb_stock_detail_em_df = stock_lhb_stock_detail_em(
|
|
936
|
-
symbol="
|
|
1063
|
+
symbol="600077", date="20070416", flag="买入"
|
|
937
1064
|
)
|
|
938
1065
|
print(stock_lhb_stock_detail_em_df)
|
|
1066
|
+
|
|
1067
|
+
stock_lhb_yyb_detail_em_df = stock_lhb_yyb_detail_em(symbol="10188715")
|
|
1068
|
+
print(stock_lhb_yyb_detail_em_df)
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/5/10 00:00
|
|
5
5
|
Desc: 新浪财经-龙虎榜
|
|
6
6
|
https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lhb/index.phtml
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from io import StringIO
|
|
9
10
|
|
|
10
11
|
import pandas as pd
|
|
@@ -39,16 +40,27 @@ def stock_lhb_detail_daily_sina(date: str = "20240222") -> pd.DataFrame:
|
|
|
39
40
|
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
40
41
|
big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
|
|
41
42
|
del big_df["查看详情"]
|
|
42
|
-
big_df.columns = [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
big_df.columns = [
|
|
44
|
+
"序号",
|
|
45
|
+
"股票代码",
|
|
46
|
+
"股票名称",
|
|
47
|
+
"收盘价",
|
|
48
|
+
"对应值",
|
|
49
|
+
"成交量",
|
|
50
|
+
"成交额",
|
|
51
|
+
"指标",
|
|
52
|
+
]
|
|
53
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
54
|
+
big_df["对应值"] = pd.to_numeric(big_df["对应值"], errors="coerce")
|
|
55
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
56
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
47
57
|
return big_df
|
|
48
58
|
|
|
49
59
|
|
|
50
|
-
def _find_last_page(
|
|
51
|
-
|
|
60
|
+
def _find_last_page(
|
|
61
|
+
url: str = "https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml",
|
|
62
|
+
recent_day: str = "60",
|
|
63
|
+
):
|
|
52
64
|
params = {
|
|
53
65
|
"last": recent_day,
|
|
54
66
|
"p": "1",
|
|
@@ -57,7 +69,7 @@ def _find_last_page(url: str = "https://vip.stock.finance.sina.com.cn/q/go.php/v
|
|
|
57
69
|
soup = BeautifulSoup(r.text, "lxml")
|
|
58
70
|
try:
|
|
59
71
|
previous_page = int(soup.find_all(attrs={"class": "page"})[-2].text)
|
|
60
|
-
except
|
|
72
|
+
except: # noqa: E722
|
|
61
73
|
previous_page = 1
|
|
62
74
|
if previous_page != 1:
|
|
63
75
|
while True:
|
|
@@ -66,7 +78,7 @@ def _find_last_page(url: str = "https://vip.stock.finance.sina.com.cn/q/go.php/v
|
|
|
66
78
|
"p": previous_page,
|
|
67
79
|
}
|
|
68
80
|
r = requests.get(url, params=params)
|
|
69
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
81
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
70
82
|
last_page = int(soup.find_all(attrs={"class": "page"})[-2].text)
|
|
71
83
|
if last_page != previous_page:
|
|
72
84
|
previous_page = last_page
|
|
@@ -76,44 +88,56 @@ def _find_last_page(url: str = "https://vip.stock.finance.sina.com.cn/q/go.php/v
|
|
|
76
88
|
return previous_page
|
|
77
89
|
|
|
78
90
|
|
|
79
|
-
def stock_lhb_ggtj_sina(
|
|
91
|
+
def stock_lhb_ggtj_sina(symbol: str = "5") -> pd.DataFrame:
|
|
80
92
|
"""
|
|
81
93
|
龙虎榜-个股上榜统计
|
|
82
94
|
https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml
|
|
83
|
-
:param
|
|
84
|
-
:type
|
|
85
|
-
:return:
|
|
95
|
+
:param symbol: choice of {"5": 最近 5 天; "10": 最近 10 天; "30": 最近 30 天; "60": 最近 60 天;}
|
|
96
|
+
:type symbol: str
|
|
97
|
+
:return: 龙虎榜-个股上榜统计
|
|
86
98
|
:rtype: pandas.DataFrame
|
|
87
99
|
"""
|
|
88
|
-
url =
|
|
89
|
-
|
|
100
|
+
url = (
|
|
101
|
+
"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml"
|
|
102
|
+
)
|
|
103
|
+
last_page_num = _find_last_page(url, symbol)
|
|
90
104
|
big_df = pd.DataFrame()
|
|
91
105
|
tqdm = get_tqdm()
|
|
92
106
|
for page in tqdm(range(1, last_page_num + 1), leave=False):
|
|
93
107
|
params = {
|
|
94
|
-
"last":
|
|
108
|
+
"last": symbol,
|
|
95
109
|
"p": page,
|
|
96
110
|
}
|
|
97
111
|
r = requests.get(url, params=params)
|
|
98
112
|
temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]
|
|
99
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
113
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
100
114
|
big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
|
|
101
|
-
big_df.columns = [
|
|
102
|
-
|
|
115
|
+
big_df.columns = [
|
|
116
|
+
"股票代码",
|
|
117
|
+
"股票名称",
|
|
118
|
+
"上榜次数",
|
|
119
|
+
"累积购买额",
|
|
120
|
+
"累积卖出额",
|
|
121
|
+
"净额",
|
|
122
|
+
"买入席位数",
|
|
123
|
+
"卖出席位数",
|
|
124
|
+
]
|
|
103
125
|
return big_df
|
|
104
126
|
|
|
105
127
|
|
|
106
|
-
def stock_lhb_yytj_sina(
|
|
128
|
+
def stock_lhb_yytj_sina(symbol: str = "5") -> pd.DataFrame:
|
|
107
129
|
"""
|
|
108
130
|
龙虎榜-营业部上榜统计
|
|
109
131
|
https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml
|
|
110
|
-
:param
|
|
111
|
-
:type
|
|
132
|
+
:param symbol: choice of {"5": 最近 5 天; "10": 最近 10 天; "30": 最近 30 天; "60": 最近 60 天;}
|
|
133
|
+
:type symbol: str
|
|
112
134
|
:return: 龙虎榜-营业部上榜统计
|
|
113
135
|
:rtype: pandas.DataFrame
|
|
114
136
|
"""
|
|
115
|
-
url =
|
|
116
|
-
|
|
137
|
+
url = (
|
|
138
|
+
"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml"
|
|
139
|
+
)
|
|
140
|
+
last_page_num = _find_last_page(url, symbol)
|
|
117
141
|
big_df = pd.DataFrame()
|
|
118
142
|
tqdm = get_tqdm()
|
|
119
143
|
for page in tqdm(range(1, last_page_num + 1), leave=False):
|
|
@@ -124,29 +148,39 @@ def stock_lhb_yytj_sina(recent_day: str = "5") -> pd.DataFrame:
|
|
|
124
148
|
r = requests.get(url, params=params)
|
|
125
149
|
temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]
|
|
126
150
|
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
127
|
-
big_df.columns = [
|
|
151
|
+
big_df.columns = [
|
|
152
|
+
"营业部名称",
|
|
153
|
+
"上榜次数",
|
|
154
|
+
"累积购买额",
|
|
155
|
+
"买入席位数",
|
|
156
|
+
"累积卖出额",
|
|
157
|
+
"卖出席位数",
|
|
158
|
+
"买入前三股票",
|
|
159
|
+
]
|
|
128
160
|
big_df["上榜次数"] = pd.to_numeric(big_df["上榜次数"], errors="coerce")
|
|
129
161
|
big_df["买入席位数"] = pd.to_numeric(big_df["买入席位数"], errors="coerce")
|
|
130
162
|
big_df["卖出席位数"] = pd.to_numeric(big_df["卖出席位数"], errors="coerce")
|
|
131
163
|
return big_df
|
|
132
164
|
|
|
133
165
|
|
|
134
|
-
def stock_lhb_jgzz_sina(
|
|
166
|
+
def stock_lhb_jgzz_sina(symbol: str = "5") -> pd.DataFrame:
|
|
135
167
|
"""
|
|
136
168
|
龙虎榜-机构席位追踪
|
|
137
169
|
https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml
|
|
138
|
-
:param
|
|
139
|
-
:type
|
|
170
|
+
:param symbol: choice of {"5": 最近 5 天; "10": 最近 10 天; "30": 最近 30 天; "60": 最近 60 天;}
|
|
171
|
+
:type symbol: str
|
|
140
172
|
:return: 龙虎榜-机构席位追踪
|
|
141
173
|
:rtype: pandas.DataFrame
|
|
142
174
|
"""
|
|
143
|
-
url =
|
|
144
|
-
|
|
175
|
+
url = (
|
|
176
|
+
"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml"
|
|
177
|
+
)
|
|
178
|
+
last_page_num = _find_last_page(url, symbol)
|
|
145
179
|
big_df = pd.DataFrame()
|
|
146
180
|
tqdm = get_tqdm()
|
|
147
181
|
for page in tqdm(range(1, last_page_num + 1), leave=False):
|
|
148
182
|
params = {
|
|
149
|
-
"last":
|
|
183
|
+
"last": symbol,
|
|
150
184
|
"p": page,
|
|
151
185
|
}
|
|
152
186
|
r = requests.get(url, params=params)
|
|
@@ -157,7 +191,15 @@ def stock_lhb_jgzz_sina(recent_day: str = "5") -> pd.DataFrame:
|
|
|
157
191
|
big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
|
|
158
192
|
del big_df["当前价"]
|
|
159
193
|
del big_df["涨跌幅"]
|
|
160
|
-
big_df.columns = [
|
|
194
|
+
big_df.columns = [
|
|
195
|
+
"股票代码",
|
|
196
|
+
"股票名称",
|
|
197
|
+
"累积买入额",
|
|
198
|
+
"买入次数",
|
|
199
|
+
"累积卖出额",
|
|
200
|
+
"卖出次数",
|
|
201
|
+
"净额",
|
|
202
|
+
]
|
|
161
203
|
big_df["买入次数"] = pd.to_numeric(big_df["买入次数"], errors="coerce")
|
|
162
204
|
big_df["卖出次数"] = pd.to_numeric(big_df["卖出次数"], errors="coerce")
|
|
163
205
|
return big_df
|
|
@@ -170,7 +212,9 @@ def stock_lhb_jgmx_sina() -> pd.DataFrame:
|
|
|
170
212
|
:return: 龙虎榜-机构席位成交明细
|
|
171
213
|
:rtype: pandas.DataFrame
|
|
172
214
|
"""
|
|
173
|
-
url =
|
|
215
|
+
url = (
|
|
216
|
+
"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgmx/index.phtml"
|
|
217
|
+
)
|
|
174
218
|
params = {
|
|
175
219
|
"p": "1",
|
|
176
220
|
}
|
|
@@ -178,7 +222,7 @@ def stock_lhb_jgmx_sina() -> pd.DataFrame:
|
|
|
178
222
|
soup = BeautifulSoup(r.text, features="lxml")
|
|
179
223
|
try:
|
|
180
224
|
last_page_num = int(soup.find_all(attrs={"class": "page"})[-2].text)
|
|
181
|
-
except:
|
|
225
|
+
except: # noqa: E722
|
|
182
226
|
last_page_num = 1
|
|
183
227
|
big_df = pd.DataFrame()
|
|
184
228
|
tqdm = get_tqdm()
|
|
@@ -190,27 +234,30 @@ def stock_lhb_jgmx_sina() -> pd.DataFrame:
|
|
|
190
234
|
temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]
|
|
191
235
|
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
192
236
|
big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
|
|
193
|
-
big_df[
|
|
194
|
-
big_df.rename(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
237
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
238
|
+
big_df.rename(
|
|
239
|
+
columns={
|
|
240
|
+
"机构席位买入额(万)": "机构席位买入额",
|
|
241
|
+
"机构席位卖出额(万)": "机构席位卖出额",
|
|
242
|
+
},
|
|
243
|
+
inplace=True,
|
|
244
|
+
)
|
|
245
|
+
big_df["机构席位买入额"] = pd.to_numeric(big_df["机构席位买入额"], errors="coerce")
|
|
246
|
+
big_df["机构席位卖出额"] = pd.to_numeric(big_df["机构席位卖出额"], errors="coerce")
|
|
198
247
|
return big_df
|
|
199
248
|
|
|
200
249
|
|
|
201
250
|
if __name__ == "__main__":
|
|
202
|
-
stock_lhb_detail_daily_sina_df = stock_lhb_detail_daily_sina(
|
|
203
|
-
date="20240222"
|
|
204
|
-
)
|
|
251
|
+
stock_lhb_detail_daily_sina_df = stock_lhb_detail_daily_sina(date="20240222")
|
|
205
252
|
print(stock_lhb_detail_daily_sina_df)
|
|
206
253
|
|
|
207
|
-
stock_lhb_ggtj_sina_df = stock_lhb_ggtj_sina(
|
|
254
|
+
stock_lhb_ggtj_sina_df = stock_lhb_ggtj_sina(symbol="5")
|
|
208
255
|
print(stock_lhb_ggtj_sina_df)
|
|
209
256
|
|
|
210
|
-
stock_lhb_yytj_sina_df = stock_lhb_yytj_sina(
|
|
257
|
+
stock_lhb_yytj_sina_df = stock_lhb_yytj_sina(symbol="5")
|
|
211
258
|
print(stock_lhb_yytj_sina_df)
|
|
212
259
|
|
|
213
|
-
stock_lhb_jgzz_sina_df = stock_lhb_jgzz_sina(
|
|
260
|
+
stock_lhb_jgzz_sina_df = stock_lhb_jgzz_sina(symbol="5")
|
|
214
261
|
print(stock_lhb_jgzz_sina_df)
|
|
215
262
|
|
|
216
263
|
stock_lhb_jgmx_sina_df = stock_lhb_jgmx_sina()
|