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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
Date: 2023/7/6 19:28
|
|
5
5
|
Desc: 新浪财经-科创板-实时行情数据和历史行情数据(包含前复权和后复权因子)
|
|
6
6
|
"""
|
|
7
|
+
|
|
7
8
|
import datetime
|
|
8
9
|
import re
|
|
9
10
|
|
|
@@ -61,59 +62,61 @@ def stock_zh_kcb_spot() -> pd.DataFrame:
|
|
|
61
62
|
"最新价",
|
|
62
63
|
"涨跌额",
|
|
63
64
|
"涨跌幅",
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
65
|
+
"买入",
|
|
66
|
+
"卖出",
|
|
67
|
+
"昨收",
|
|
68
|
+
"今开",
|
|
69
|
+
"最高",
|
|
70
|
+
"最低",
|
|
71
|
+
"成交量",
|
|
72
|
+
"成交额",
|
|
73
|
+
"时点",
|
|
74
|
+
"市盈率",
|
|
75
|
+
"市净率",
|
|
76
|
+
"流通市值",
|
|
77
|
+
"总市值",
|
|
78
|
+
"换手率",
|
|
79
|
+
]
|
|
80
|
+
big_df = big_df[
|
|
81
|
+
[
|
|
82
|
+
"代码",
|
|
83
|
+
"名称",
|
|
84
|
+
"最新价",
|
|
85
|
+
"涨跌额",
|
|
86
|
+
"涨跌幅",
|
|
87
|
+
"买入",
|
|
88
|
+
"卖出",
|
|
89
|
+
"昨收",
|
|
90
|
+
"今开",
|
|
91
|
+
"最高",
|
|
92
|
+
"最低",
|
|
93
|
+
"成交量",
|
|
94
|
+
"成交额",
|
|
95
|
+
"时点",
|
|
96
|
+
"市盈率",
|
|
97
|
+
"市净率",
|
|
98
|
+
"流通市值",
|
|
99
|
+
"总市值",
|
|
100
|
+
"换手率",
|
|
101
|
+
]
|
|
78
102
|
]
|
|
79
|
-
big_df = big_df[[
|
|
80
|
-
"代码",
|
|
81
|
-
"名称",
|
|
82
|
-
"最新价",
|
|
83
|
-
"涨跌额",
|
|
84
|
-
"涨跌幅",
|
|
85
|
-
'买入',
|
|
86
|
-
'卖出',
|
|
87
|
-
'昨收',
|
|
88
|
-
'今开',
|
|
89
|
-
'最高',
|
|
90
|
-
'最低',
|
|
91
|
-
'成交量',
|
|
92
|
-
'成交额',
|
|
93
|
-
'时点',
|
|
94
|
-
'市盈率',
|
|
95
|
-
'市净率',
|
|
96
|
-
'流通市值',
|
|
97
|
-
'总市值',
|
|
98
|
-
'换手率',
|
|
99
|
-
]]
|
|
100
103
|
|
|
101
|
-
big_df[
|
|
102
|
-
big_df[
|
|
103
|
-
big_df[
|
|
104
|
-
big_df[
|
|
105
|
-
big_df[
|
|
106
|
-
big_df[
|
|
107
|
-
big_df[
|
|
108
|
-
big_df[
|
|
109
|
-
big_df[
|
|
110
|
-
big_df[
|
|
111
|
-
big_df[
|
|
112
|
-
big_df[
|
|
113
|
-
big_df[
|
|
114
|
-
big_df[
|
|
115
|
-
big_df[
|
|
116
|
-
big_df[
|
|
104
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"])
|
|
105
|
+
big_df["涨跌额"] = pd.to_numeric(big_df["涨跌额"])
|
|
106
|
+
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"])
|
|
107
|
+
big_df["买入"] = pd.to_numeric(big_df["买入"])
|
|
108
|
+
big_df["卖出"] = pd.to_numeric(big_df["卖出"])
|
|
109
|
+
big_df["昨收"] = pd.to_numeric(big_df["昨收"])
|
|
110
|
+
big_df["今开"] = pd.to_numeric(big_df["今开"])
|
|
111
|
+
big_df["最高"] = pd.to_numeric(big_df["最高"])
|
|
112
|
+
big_df["最低"] = pd.to_numeric(big_df["最低"])
|
|
113
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
114
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
115
|
+
big_df["市盈率"] = pd.to_numeric(big_df["市盈率"])
|
|
116
|
+
big_df["市净率"] = pd.to_numeric(big_df["市净率"])
|
|
117
|
+
big_df["流通市值"] = pd.to_numeric(big_df["流通市值"])
|
|
118
|
+
big_df["总市值"] = pd.to_numeric(big_df["总市值"])
|
|
119
|
+
big_df["换手率"] = pd.to_numeric(big_df["换手率"])
|
|
117
120
|
return big_df
|
|
118
121
|
|
|
119
122
|
|
|
@@ -123,7 +126,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
123
126
|
https://finance.sina.com.cn/realstock/company/sh688005/nc.shtml
|
|
124
127
|
:param symbol: 股票代码; 带市场标识的股票代码
|
|
125
128
|
:type symbol: str
|
|
126
|
-
:param adjust: 默认不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子;
|
|
129
|
+
:param adjust: 默认不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子; qfq-factor: 返回前复权因子
|
|
127
130
|
:type adjust: str
|
|
128
131
|
:return: 科创板股票的历史行情数据
|
|
129
132
|
:rtype: pandas.DataFrame
|
|
@@ -150,12 +153,12 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
150
153
|
try:
|
|
151
154
|
# try for pandas >= 2.1.0
|
|
152
155
|
temp_df.ffill(inplace=True)
|
|
153
|
-
except Exception
|
|
156
|
+
except Exception:
|
|
154
157
|
try:
|
|
155
|
-
|
|
158
|
+
# try for pandas < 2.1.0
|
|
156
159
|
temp_df.fillna(method="ffill", inplace=True)
|
|
157
160
|
except Exception as e:
|
|
158
|
-
|
|
161
|
+
print("Error:", e)
|
|
159
162
|
temp_df = temp_df.astype(float)
|
|
160
163
|
temp_df["amount"] = temp_df["amount"] * 10000
|
|
161
164
|
temp_df["turnover"] = temp_df["v"] / temp_df["amount"]
|
|
@@ -173,7 +176,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
173
176
|
|
|
174
177
|
if not adjust:
|
|
175
178
|
temp_df.reset_index(inplace=True)
|
|
176
|
-
temp_df[
|
|
179
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
|
|
177
180
|
return temp_df
|
|
178
181
|
|
|
179
182
|
if adjust == "hfq":
|
|
@@ -191,9 +194,9 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
191
194
|
try:
|
|
192
195
|
# try for pandas >= 2.1.0
|
|
193
196
|
temp_df.ffill(inplace=True)
|
|
194
|
-
except Exception
|
|
197
|
+
except Exception:
|
|
195
198
|
try:
|
|
196
|
-
|
|
199
|
+
# try for pandas < 2.1.0
|
|
197
200
|
temp_df.fillna(method="ffill", inplace=True)
|
|
198
201
|
except Exception as e:
|
|
199
202
|
print("Error:", e)
|
|
@@ -204,7 +207,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
204
207
|
temp_df["low"] = temp_df["low"] * temp_df["hfq_factor"]
|
|
205
208
|
temp_df = temp_df.iloc[:, :-1]
|
|
206
209
|
temp_df.reset_index(inplace=True)
|
|
207
|
-
temp_df[
|
|
210
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
|
|
208
211
|
return temp_df
|
|
209
212
|
|
|
210
213
|
if adjust == "qfq":
|
|
@@ -222,9 +225,9 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
222
225
|
try:
|
|
223
226
|
# try for pandas >= 2.1.0
|
|
224
227
|
temp_df.ffill(inplace=True)
|
|
225
|
-
except Exception
|
|
228
|
+
except Exception:
|
|
226
229
|
try:
|
|
227
|
-
|
|
230
|
+
# try for pandas < 2.1.0
|
|
228
231
|
temp_df.fillna(method="ffill", inplace=True)
|
|
229
232
|
except Exception as e:
|
|
230
233
|
print("Error:", e)
|
|
@@ -235,7 +238,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
235
238
|
temp_df["low"] = temp_df["low"] / temp_df["qfq_factor"]
|
|
236
239
|
temp_df = temp_df.iloc[:, :-1]
|
|
237
240
|
temp_df.reset_index(inplace=True)
|
|
238
|
-
temp_df[
|
|
241
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
|
|
239
242
|
return temp_df
|
|
240
243
|
|
|
241
244
|
if adjust == "hfq-factor":
|
|
@@ -247,7 +250,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
247
250
|
hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date)
|
|
248
251
|
del hfq_factor_df["date"]
|
|
249
252
|
hfq_factor_df.reset_index(inplace=True)
|
|
250
|
-
hfq_factor_df[
|
|
253
|
+
hfq_factor_df["date"] = pd.to_datetime(hfq_factor_df["date"]).dt.date
|
|
251
254
|
return hfq_factor_df
|
|
252
255
|
|
|
253
256
|
if adjust == "qfq-factor":
|
|
@@ -259,7 +262,7 @@ def stock_zh_kcb_daily(symbol: str = "sh688399", adjust: str = "") -> pd.DataFra
|
|
|
259
262
|
qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date)
|
|
260
263
|
del qfq_factor_df["date"]
|
|
261
264
|
qfq_factor_df.reset_index(inplace=True)
|
|
262
|
-
qfq_factor_df[
|
|
265
|
+
qfq_factor_df["date"] = pd.to_datetime(qfq_factor_df["date"]).dt.date
|
|
263
266
|
return qfq_factor_df
|
|
264
267
|
|
|
265
268
|
|
|
File without changes
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding:utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Date: 2025/3/22 18:00
|
|
5
|
+
Desc: 东方财富网-行情中心-沪深京板块-概念板块-名称
|
|
6
|
+
https://quote.eastmoney.com/center/boardlist.html#concept_board
|
|
7
|
+
异步接口-测试版
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
from typing import Dict, List
|
|
12
|
+
|
|
13
|
+
import aiohttp
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def fetch_single_page(
|
|
18
|
+
session: aiohttp.ClientSession, url: str, params: Dict
|
|
19
|
+
) -> Dict:
|
|
20
|
+
"""异步获取单页数据"""
|
|
21
|
+
async with session.get(url, params=params, ssl=False) as response:
|
|
22
|
+
return await response.json()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def fetch_all_pages_async(url: str, base_params: Dict) -> List[Dict]:
|
|
26
|
+
"""异步获取所有页面数据"""
|
|
27
|
+
# 首先获取总数以计算页数
|
|
28
|
+
first_page_params = base_params.copy()
|
|
29
|
+
first_page_params["pn"] = "1"
|
|
30
|
+
|
|
31
|
+
async with aiohttp.ClientSession() as session:
|
|
32
|
+
first_page_data = await fetch_single_page(session, url, first_page_params)
|
|
33
|
+
|
|
34
|
+
# 检查是否成功获取数据
|
|
35
|
+
if first_page_data.get("rc") != 0 or not first_page_data.get("data"):
|
|
36
|
+
return [first_page_data] # 返回错误信息
|
|
37
|
+
|
|
38
|
+
total = first_page_data["data"]["total"]
|
|
39
|
+
page_size = int(base_params["pz"])
|
|
40
|
+
total_pages = (total + page_size - 1) // page_size
|
|
41
|
+
|
|
42
|
+
# 限制页数,避免过大请求
|
|
43
|
+
total_pages = min(total_pages, 100)
|
|
44
|
+
|
|
45
|
+
# 创建所有页面的任务
|
|
46
|
+
tasks = []
|
|
47
|
+
for page in range(1, total_pages + 1):
|
|
48
|
+
page_params = base_params.copy()
|
|
49
|
+
page_params["pn"] = str(page)
|
|
50
|
+
tasks.append(fetch_single_page(session, url, page_params))
|
|
51
|
+
|
|
52
|
+
# 并发执行所有任务
|
|
53
|
+
results = await asyncio.gather(*tasks)
|
|
54
|
+
return results
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def process_concept_board_data(page_results: List[Dict]) -> pd.DataFrame:
|
|
58
|
+
"""处理概念板块数据,转换为DataFrame"""
|
|
59
|
+
all_data = []
|
|
60
|
+
|
|
61
|
+
for result in page_results:
|
|
62
|
+
if result.get("data") and result["data"].get("diff"):
|
|
63
|
+
page_data = result["data"]["diff"]
|
|
64
|
+
all_data.extend(page_data)
|
|
65
|
+
|
|
66
|
+
if not all_data:
|
|
67
|
+
return pd.DataFrame()
|
|
68
|
+
|
|
69
|
+
temp_df = pd.DataFrame(all_data)
|
|
70
|
+
|
|
71
|
+
# 转换数值类型,确保排序正确
|
|
72
|
+
numeric_columns = ["f2", "f3", "f4", "f8", "f20", "f104", "f105", "f136"]
|
|
73
|
+
for col in numeric_columns:
|
|
74
|
+
if col in temp_df.columns:
|
|
75
|
+
temp_df[col] = pd.to_numeric(temp_df[col], errors="coerce")
|
|
76
|
+
|
|
77
|
+
# 按涨跌幅(f3)降序排序
|
|
78
|
+
if "f3" in temp_df.columns:
|
|
79
|
+
temp_df.sort_values(by="f3", ascending=False, inplace=True)
|
|
80
|
+
|
|
81
|
+
# 重命名列
|
|
82
|
+
columns_map = {
|
|
83
|
+
"f2": "最新价",
|
|
84
|
+
"f3": "涨跌幅",
|
|
85
|
+
"f4": "涨跌额",
|
|
86
|
+
"f8": "换手率",
|
|
87
|
+
"f12": "板块代码",
|
|
88
|
+
"f14": "板块名称",
|
|
89
|
+
"f20": "总市值",
|
|
90
|
+
"f104": "上涨家数",
|
|
91
|
+
"f105": "下跌家数",
|
|
92
|
+
"f128": "领涨股票",
|
|
93
|
+
"f136": "领涨股票-涨跌幅",
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# 选择需要的列并重命名
|
|
97
|
+
selected_columns = list(columns_map.keys())
|
|
98
|
+
available_columns = [col for col in selected_columns if col in temp_df.columns]
|
|
99
|
+
temp_df = temp_df[available_columns]
|
|
100
|
+
temp_df.rename(columns=columns_map, inplace=True)
|
|
101
|
+
|
|
102
|
+
# 重置索引并添加排名列
|
|
103
|
+
temp_df.reset_index(drop=True, inplace=True)
|
|
104
|
+
temp_df.insert(0, "排名", range(1, len(temp_df) + 1))
|
|
105
|
+
|
|
106
|
+
# 调整列顺序,与原函数保持一致
|
|
107
|
+
final_columns = [
|
|
108
|
+
"排名",
|
|
109
|
+
"板块名称",
|
|
110
|
+
"板块代码",
|
|
111
|
+
"最新价",
|
|
112
|
+
"涨跌额",
|
|
113
|
+
"涨跌幅",
|
|
114
|
+
"总市值",
|
|
115
|
+
"换手率",
|
|
116
|
+
"上涨家数",
|
|
117
|
+
"下跌家数",
|
|
118
|
+
"领涨股票",
|
|
119
|
+
"领涨股票-涨跌幅",
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
# 只保留存在的列
|
|
123
|
+
final_columns = [col for col in final_columns if col in temp_df.columns]
|
|
124
|
+
temp_df = temp_df[final_columns]
|
|
125
|
+
|
|
126
|
+
return temp_df
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
async def stock_board_concept_name_em_async() -> pd.DataFrame:
|
|
130
|
+
"""
|
|
131
|
+
异步获取东方财富网-行情中心-沪深京板块-概念板块-名称
|
|
132
|
+
https://quote.eastmoney.com/center/boardlist.html#concept_board
|
|
133
|
+
:return: 概念板块-名称
|
|
134
|
+
:rtype: pandas.DataFrame
|
|
135
|
+
"""
|
|
136
|
+
url = "https://79.push2.eastmoney.com/api/qt/clist/get"
|
|
137
|
+
params = {
|
|
138
|
+
"pn": "1",
|
|
139
|
+
"pz": "100",
|
|
140
|
+
"po": "1", # 按涨跌幅排序,1为降序
|
|
141
|
+
"np": "1",
|
|
142
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
143
|
+
"fltt": "2",
|
|
144
|
+
"invt": "2",
|
|
145
|
+
"fid": "f3", # 按涨跌幅排序
|
|
146
|
+
"fs": "m:90 t:3 f:!50",
|
|
147
|
+
"fields": "f2,f3,f4,f8,f12,f14,f15,f16,f17,f18,f20,f21,f24,f25,f22,f33,f11,f62,f128,f124,f107,f104,f105,f136",
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
results = await fetch_all_pages_async(url, params)
|
|
151
|
+
return process_concept_board_data(results)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def stock_board_concept_name_em() -> pd.DataFrame:
|
|
155
|
+
"""
|
|
156
|
+
东方财富网-行情中心-沪深京板块-概念板块-名称 (同步接口)
|
|
157
|
+
https://quote.eastmoney.com/center/boardlist.html#concept_board
|
|
158
|
+
:return: 概念板块-名称
|
|
159
|
+
:rtype: pandas.DataFrame
|
|
160
|
+
"""
|
|
161
|
+
import nest_asyncio
|
|
162
|
+
|
|
163
|
+
nest_asyncio.apply()
|
|
164
|
+
return asyncio.run(stock_board_concept_name_em_async())
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
if __name__ == "__main__":
|
|
168
|
+
# 测试同步接口
|
|
169
|
+
stock_board_concept_name_em_df = stock_board_concept_name_em()
|
|
170
|
+
print(stock_board_concept_name_em_df)
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding:utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Date: 2025/3/22 18:00
|
|
5
|
+
Desc: 东方财富网-数据中心-资金流向-排名
|
|
6
|
+
https://data.eastmoney.com/zjlx/detail.html
|
|
7
|
+
异步接口-测试版
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
from typing import Dict, List
|
|
12
|
+
|
|
13
|
+
import aiohttp
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def fetch_single_page(
|
|
18
|
+
session: aiohttp.ClientSession, url: str, params: Dict
|
|
19
|
+
) -> Dict:
|
|
20
|
+
"""异步获取单页数据"""
|
|
21
|
+
async with session.get(url, params=params, ssl=False) as response:
|
|
22
|
+
return await response.json()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def fetch_all_pages_async(url: str, base_params: Dict) -> List[Dict]:
|
|
26
|
+
"""异步获取所有页面数据"""
|
|
27
|
+
# 首先获取总数以计算页数
|
|
28
|
+
first_page_params = base_params.copy()
|
|
29
|
+
first_page_params["pn"] = "1"
|
|
30
|
+
|
|
31
|
+
async with aiohttp.ClientSession() as session:
|
|
32
|
+
first_page_data = await fetch_single_page(session, url, first_page_params)
|
|
33
|
+
|
|
34
|
+
# 检查是否成功获取数据
|
|
35
|
+
if first_page_data.get("rc") != 0 or not first_page_data.get("data"):
|
|
36
|
+
return [first_page_data] # 返回错误信息
|
|
37
|
+
|
|
38
|
+
total = first_page_data["data"]["total"]
|
|
39
|
+
page_size = int(base_params["pz"])
|
|
40
|
+
total_pages = (total + page_size - 1) // page_size
|
|
41
|
+
|
|
42
|
+
# 限制页数,避免过大请求
|
|
43
|
+
total_pages = min(total_pages, 100)
|
|
44
|
+
|
|
45
|
+
# 创建所有页面的任务
|
|
46
|
+
tasks = []
|
|
47
|
+
for page in range(1, total_pages + 1):
|
|
48
|
+
page_params = base_params.copy()
|
|
49
|
+
page_params["pn"] = str(page)
|
|
50
|
+
tasks.append(fetch_single_page(session, url, page_params))
|
|
51
|
+
|
|
52
|
+
# 并发执行所有任务
|
|
53
|
+
results = await asyncio.gather(*tasks)
|
|
54
|
+
return results
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def process_fund_flow_data(page_results: List[Dict], indicator: str) -> pd.DataFrame:
|
|
58
|
+
"""处理资金流向排名数据,转换为DataFrame"""
|
|
59
|
+
all_data = []
|
|
60
|
+
|
|
61
|
+
for result in page_results:
|
|
62
|
+
if result.get("data") and result["data"].get("diff"):
|
|
63
|
+
page_data = result["data"]["diff"]
|
|
64
|
+
all_data.extend(page_data)
|
|
65
|
+
|
|
66
|
+
if not all_data:
|
|
67
|
+
return pd.DataFrame()
|
|
68
|
+
|
|
69
|
+
temp_df = pd.DataFrame(all_data)
|
|
70
|
+
|
|
71
|
+
# 根据不同的指标设置列名并选择需要的列
|
|
72
|
+
if indicator == "今日":
|
|
73
|
+
columns_map = {
|
|
74
|
+
"f12": "代码",
|
|
75
|
+
"f14": "名称",
|
|
76
|
+
"f2": "最新价",
|
|
77
|
+
"f3": "今日涨跌幅",
|
|
78
|
+
"f62": "今日主力净流入-净额",
|
|
79
|
+
"f184": "今日主力净流入-净占比",
|
|
80
|
+
"f66": "今日超大单净流入-净额",
|
|
81
|
+
"f69": "今日超大单净流入-净占比",
|
|
82
|
+
"f72": "今日大单净流入-净额",
|
|
83
|
+
"f75": "今日大单净流入-净占比",
|
|
84
|
+
"f78": "今日中单净流入-净额",
|
|
85
|
+
"f81": "今日中单净流入-净占比",
|
|
86
|
+
"f84": "今日小单净流入-净额",
|
|
87
|
+
"f87": "今日小单净流入-净占比",
|
|
88
|
+
}
|
|
89
|
+
main_column = "f62" # 今日主力净流入-净额
|
|
90
|
+
|
|
91
|
+
elif indicator == "3日":
|
|
92
|
+
columns_map = {
|
|
93
|
+
"f12": "代码",
|
|
94
|
+
"f14": "名称",
|
|
95
|
+
"f2": "最新价",
|
|
96
|
+
"f127": "3日涨跌幅",
|
|
97
|
+
"f267": "3日主力净流入-净额",
|
|
98
|
+
"f268": "3日主力净流入-净占比",
|
|
99
|
+
"f269": "3日超大单净流入-净额",
|
|
100
|
+
"f270": "3日超大单净流入-净占比",
|
|
101
|
+
"f271": "3日大单净流入-净额",
|
|
102
|
+
"f272": "3日大单净流入-净占比",
|
|
103
|
+
"f273": "3日中单净流入-净额",
|
|
104
|
+
"f274": "3日中单净流入-净占比",
|
|
105
|
+
"f275": "3日小单净流入-净额",
|
|
106
|
+
"f276": "3日小单净流入-净占比",
|
|
107
|
+
}
|
|
108
|
+
main_column = "f267" # 3日主力净流入-净额
|
|
109
|
+
|
|
110
|
+
elif indicator == "5日":
|
|
111
|
+
columns_map = {
|
|
112
|
+
"f12": "代码",
|
|
113
|
+
"f14": "名称",
|
|
114
|
+
"f2": "最新价",
|
|
115
|
+
"f109": "5日涨跌幅",
|
|
116
|
+
"f164": "5日主力净流入-净额",
|
|
117
|
+
"f165": "5日主力净流入-净占比",
|
|
118
|
+
"f166": "5日超大单净流入-净额",
|
|
119
|
+
"f167": "5日超大单净流入-净占比",
|
|
120
|
+
"f168": "5日大单净流入-净额",
|
|
121
|
+
"f169": "5日大单净流入-净占比",
|
|
122
|
+
"f170": "5日中单净流入-净额",
|
|
123
|
+
"f171": "5日中单净流入-净占比",
|
|
124
|
+
"f172": "5日小单净流入-净额",
|
|
125
|
+
"f173": "5日小单净流入-净占比",
|
|
126
|
+
}
|
|
127
|
+
main_column = "f164" # 5日主力净流入-净额
|
|
128
|
+
|
|
129
|
+
elif indicator == "10日":
|
|
130
|
+
columns_map = {
|
|
131
|
+
"f12": "代码",
|
|
132
|
+
"f14": "名称",
|
|
133
|
+
"f2": "最新价",
|
|
134
|
+
"f160": "10日涨跌幅",
|
|
135
|
+
"f174": "10日主力净流入-净额",
|
|
136
|
+
"f175": "10日主力净流入-净占比",
|
|
137
|
+
"f176": "10日超大单净流入-净额",
|
|
138
|
+
"f177": "10日超大单净流入-净占比",
|
|
139
|
+
"f178": "10日大单净流入-净额",
|
|
140
|
+
"f179": "10日大单净流入-净占比",
|
|
141
|
+
"f180": "10日中单净流入-净额",
|
|
142
|
+
"f181": "10日中单净流入-净占比",
|
|
143
|
+
"f182": "10日小单净流入-净额",
|
|
144
|
+
"f183": "10日小单净流入-净占比",
|
|
145
|
+
}
|
|
146
|
+
main_column = "f174" # 10日主力净流入-净额
|
|
147
|
+
|
|
148
|
+
# 确保数值型列为数值类型
|
|
149
|
+
numeric_columns = [
|
|
150
|
+
col
|
|
151
|
+
for col in temp_df.columns
|
|
152
|
+
if col.startswith("f") and col not in ["f12", "f14"]
|
|
153
|
+
]
|
|
154
|
+
for col in numeric_columns:
|
|
155
|
+
if col in temp_df.columns:
|
|
156
|
+
temp_df[col] = pd.to_numeric(temp_df[col], errors="coerce")
|
|
157
|
+
|
|
158
|
+
# 按照主力净流入额降序排序
|
|
159
|
+
if main_column in temp_df.columns:
|
|
160
|
+
temp_df.sort_values(by=main_column, ascending=False, inplace=True)
|
|
161
|
+
|
|
162
|
+
# 首先重命名列
|
|
163
|
+
temp_df.rename(columns=columns_map, inplace=True)
|
|
164
|
+
|
|
165
|
+
# 选择需要的列
|
|
166
|
+
selected_columns = list(columns_map.values())
|
|
167
|
+
available_columns = [col for col in selected_columns if col in temp_df.columns]
|
|
168
|
+
temp_df = temp_df[available_columns]
|
|
169
|
+
|
|
170
|
+
# 重置索引并生成序号列
|
|
171
|
+
temp_df.reset_index(drop=True, inplace=True)
|
|
172
|
+
temp_df.insert(0, "序号", range(1, len(temp_df) + 1))
|
|
173
|
+
|
|
174
|
+
return temp_df
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
async def stock_individual_fund_flow_rank_async(indicator: str = "5日") -> pd.DataFrame:
|
|
178
|
+
"""
|
|
179
|
+
异步获取东方财富网-数据中心-资金流向-排名
|
|
180
|
+
https://data.eastmoney.com/zjlx/detail.html
|
|
181
|
+
:param indicator: choice of {"今日", "3日", "5日", "10日"}
|
|
182
|
+
:type indicator: str
|
|
183
|
+
:return: 指定 indicator 资金流向排行
|
|
184
|
+
:rtype: pandas.DataFrame
|
|
185
|
+
"""
|
|
186
|
+
indicator_map = {
|
|
187
|
+
"今日": [
|
|
188
|
+
"f62",
|
|
189
|
+
"f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124",
|
|
190
|
+
],
|
|
191
|
+
"3日": [
|
|
192
|
+
"f267",
|
|
193
|
+
"f12,f14,f2,f127,f267,f268,f269,f270,f271,f272,f273,f274,f275,f276,f257,f258,f124",
|
|
194
|
+
],
|
|
195
|
+
"5日": [
|
|
196
|
+
"f164",
|
|
197
|
+
"f12,f14,f2,f109,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f257,f258,f124",
|
|
198
|
+
],
|
|
199
|
+
"10日": [
|
|
200
|
+
"f174",
|
|
201
|
+
"f12,f14,f2,f160,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f260,f261,f124",
|
|
202
|
+
],
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
url = "https://push2.eastmoney.com/api/qt/clist/get"
|
|
206
|
+
params = {
|
|
207
|
+
"fid": indicator_map[indicator][0],
|
|
208
|
+
"po": "1", # 按照降序排列
|
|
209
|
+
"pz": "100", # 每页100条
|
|
210
|
+
"pn": "1", # 从第1页开始
|
|
211
|
+
"np": "1",
|
|
212
|
+
"fltt": "2",
|
|
213
|
+
"invt": "2",
|
|
214
|
+
"ut": "b2884a393a59ad64002292a3e90d46a5",
|
|
215
|
+
"fs": "m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2",
|
|
216
|
+
"fields": indicator_map[indicator][1],
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
results = await fetch_all_pages_async(url, params)
|
|
220
|
+
return process_fund_flow_data(results, indicator)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def stock_individual_fund_flow_rank(indicator: str = "5日") -> pd.DataFrame:
|
|
224
|
+
"""
|
|
225
|
+
东方财富网-数据中心-资金流向-排名 (同步接口)
|
|
226
|
+
https://data.eastmoney.com/zjlx/detail.html
|
|
227
|
+
:param indicator: choice of {"今日", "3日", "5日", "10日"}
|
|
228
|
+
:type indicator: str
|
|
229
|
+
:return: 指定 indicator 资金流向排行
|
|
230
|
+
:rtype: pandas.DataFrame
|
|
231
|
+
"""
|
|
232
|
+
import nest_asyncio
|
|
233
|
+
|
|
234
|
+
nest_asyncio.apply()
|
|
235
|
+
return asyncio.run(stock_individual_fund_flow_rank_async(indicator))
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
if __name__ == "__main__":
|
|
239
|
+
# 测试同步接口
|
|
240
|
+
stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(
|
|
241
|
+
indicator="今日"
|
|
242
|
+
)
|
|
243
|
+
print(stock_individual_fund_flow_rank_df)
|
|
244
|
+
|
|
245
|
+
stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(
|
|
246
|
+
indicator="3日"
|
|
247
|
+
)
|
|
248
|
+
print(stock_individual_fund_flow_rank_df)
|
|
249
|
+
|
|
250
|
+
stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(
|
|
251
|
+
indicator="5日"
|
|
252
|
+
)
|
|
253
|
+
print(stock_individual_fund_flow_rank_df)
|
|
254
|
+
|
|
255
|
+
stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(
|
|
256
|
+
indicator="10日"
|
|
257
|
+
)
|
|
258
|
+
print(stock_individual_fund_flow_rank_df)
|