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/stock/stock_hk_sina.py
CHANGED
|
@@ -1,68 +1,115 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/2/18 16:00
|
|
5
5
|
Desc: 新浪财经-港股-实时行情数据和历史行情数据(包含前复权和后复权因子)
|
|
6
|
-
|
|
6
|
+
https://stock.finance.sina.com.cn/hkstock/quotes/00700.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
10
|
+
import py_mini_racer
|
|
9
11
|
import requests
|
|
10
|
-
from py_mini_racer import py_mini_racer
|
|
11
12
|
|
|
12
13
|
from akshare.stock.cons import (
|
|
13
14
|
hk_js_decode,
|
|
14
|
-
hk_sina_stock_dict_payload,
|
|
15
|
-
hk_sina_stock_list_url,
|
|
16
15
|
hk_sina_stock_hist_url,
|
|
17
16
|
hk_sina_stock_hist_hfq_url,
|
|
18
17
|
hk_sina_stock_hist_qfq_url,
|
|
19
18
|
)
|
|
20
|
-
from akshare.utils import demjson
|
|
21
19
|
|
|
22
20
|
|
|
23
21
|
def stock_hk_spot() -> pd.DataFrame:
|
|
24
22
|
"""
|
|
25
23
|
新浪财经-港股的所有港股的实时行情数据
|
|
26
|
-
|
|
24
|
+
https://vip.stock.finance.sina.com.cn/mkt/#qbgg_hk
|
|
27
25
|
:return: 实时行情数据
|
|
28
26
|
:rtype: pandas.DataFrame
|
|
29
27
|
"""
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
28
|
+
url = "https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHKStockData"
|
|
29
|
+
params = {
|
|
30
|
+
"page": "1",
|
|
31
|
+
"num": "60",
|
|
32
|
+
"sort": "symbol",
|
|
33
|
+
"asc": "1",
|
|
34
|
+
"node": "qbgg_hk",
|
|
35
|
+
"_s_r_a": "init",
|
|
36
|
+
}
|
|
37
|
+
big_df = pd.DataFrame()
|
|
38
|
+
from akshare.utils.tqdm import get_tqdm
|
|
39
|
+
tqdm = get_tqdm()
|
|
40
|
+
for page in tqdm(range(1, 100), leave=False):
|
|
41
|
+
params["page"] = str(page)
|
|
42
|
+
r = requests.get(url, params=params)
|
|
43
|
+
data_json = r.json()
|
|
44
|
+
if not data_json:
|
|
45
|
+
break
|
|
46
|
+
temp_df = pd.DataFrame(data_json)
|
|
47
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
big_df.columns = [
|
|
51
|
+
"代码",
|
|
52
|
+
"中文名称",
|
|
53
|
+
"英文名称",
|
|
54
|
+
"交易类型",
|
|
55
|
+
"最新价",
|
|
56
|
+
"昨收",
|
|
57
|
+
"今开",
|
|
58
|
+
"最高",
|
|
59
|
+
"最低",
|
|
60
|
+
"成交量",
|
|
61
|
+
"-",
|
|
62
|
+
"成交额",
|
|
63
|
+
"日期时间",
|
|
64
|
+
"买一",
|
|
65
|
+
"卖一",
|
|
66
|
+
"-",
|
|
67
|
+
"-",
|
|
68
|
+
"-",
|
|
69
|
+
"-",
|
|
70
|
+
"-",
|
|
71
|
+
"涨跌额",
|
|
72
|
+
"涨跌幅",
|
|
73
|
+
"-",
|
|
74
|
+
"-",
|
|
57
75
|
]
|
|
58
|
-
|
|
76
|
+
big_df = big_df[[
|
|
77
|
+
"日期时间",
|
|
78
|
+
"代码",
|
|
79
|
+
"中文名称",
|
|
80
|
+
"英文名称",
|
|
81
|
+
"交易类型",
|
|
82
|
+
"最新价",
|
|
83
|
+
"涨跌额",
|
|
84
|
+
"涨跌幅",
|
|
85
|
+
"昨收",
|
|
86
|
+
"今开",
|
|
87
|
+
"最高",
|
|
88
|
+
"最低",
|
|
89
|
+
"成交量",
|
|
90
|
+
"成交额",
|
|
91
|
+
"买一",
|
|
92
|
+
"卖一",
|
|
93
|
+
]]
|
|
94
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
|
|
95
|
+
big_df["涨跌额"] = pd.to_numeric(big_df["涨跌额"], errors="coerce")
|
|
96
|
+
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
|
|
97
|
+
big_df["昨收"] = pd.to_numeric(big_df["昨收"], errors="coerce")
|
|
98
|
+
big_df["今开"] = pd.to_numeric(big_df["今开"], errors="coerce")
|
|
99
|
+
big_df["最高"] = pd.to_numeric(big_df["最高"], errors="coerce")
|
|
100
|
+
big_df["最低"] = pd.to_numeric(big_df["最低"], errors="coerce")
|
|
101
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
102
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
103
|
+
big_df["买一"] = pd.to_numeric(big_df["买一"], errors="coerce")
|
|
104
|
+
big_df["卖一"] = pd.to_numeric(big_df["卖一"], errors="coerce")
|
|
105
|
+
return big_df
|
|
59
106
|
|
|
60
107
|
|
|
61
108
|
def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
62
109
|
"""
|
|
63
110
|
新浪财经-港股-个股的历史行情数据
|
|
64
111
|
https://stock.finance.sina.com.cn/hkstock/quotes/02912.html
|
|
65
|
-
:param symbol: 可以使用 stock_hk_spot 获取
|
|
112
|
+
:param symbol: 可以使用 ak.stock_hk_spot() 获取
|
|
66
113
|
:type symbol: str
|
|
67
114
|
:param adjust: "": 返回未复权的数据 ; qfq: 返回前复权后的数据; qfq-factor: 返回前复权因子和调整;
|
|
68
115
|
:type adjust: str
|
|
@@ -95,7 +142,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
95
142
|
data_df.reset_index(inplace=True)
|
|
96
143
|
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
|
|
97
144
|
return data_df
|
|
98
|
-
except SyntaxError
|
|
145
|
+
except SyntaxError:
|
|
99
146
|
data_df.reset_index(inplace=True)
|
|
100
147
|
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
|
|
101
148
|
return data_df
|
|
@@ -114,7 +161,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
114
161
|
try:
|
|
115
162
|
# try for pandas >= 2.1.0
|
|
116
163
|
new_range.ffill(inplace=True)
|
|
117
|
-
except Exception
|
|
164
|
+
except Exception:
|
|
118
165
|
try:
|
|
119
166
|
new_range.fillna(method="ffill", inplace=True)
|
|
120
167
|
except Exception as e:
|
|
@@ -127,7 +174,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
127
174
|
try:
|
|
128
175
|
# try for pandas >= 2.1.0
|
|
129
176
|
temp_df.ffill(inplace=True)
|
|
130
|
-
except Exception
|
|
177
|
+
except Exception:
|
|
131
178
|
try:
|
|
132
179
|
# try for pandas < 2.1.0
|
|
133
180
|
temp_df.fillna(method="ffill", inplace=True)
|
|
@@ -160,7 +207,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
160
207
|
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
|
|
161
208
|
return data_df
|
|
162
209
|
|
|
163
|
-
except SyntaxError
|
|
210
|
+
except SyntaxError:
|
|
164
211
|
data_df.reset_index(inplace=True)
|
|
165
212
|
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
|
|
166
213
|
return data_df
|
|
@@ -178,7 +225,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
178
225
|
try:
|
|
179
226
|
# try for pandas >= 2.1.0
|
|
180
227
|
new_range.ffill(inplace=True)
|
|
181
|
-
except Exception
|
|
228
|
+
except Exception:
|
|
182
229
|
try:
|
|
183
230
|
# try for pandas < 2.1.0
|
|
184
231
|
new_range.fillna(method="ffill", inplace=True)
|
|
@@ -192,7 +239,7 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
192
239
|
try:
|
|
193
240
|
# try for pandas >= 2.1.0
|
|
194
241
|
temp_df.ffill(inplace=True)
|
|
195
|
-
except Exception
|
|
242
|
+
except Exception:
|
|
196
243
|
try:
|
|
197
244
|
# try for pandas < 2.1.0
|
|
198
245
|
temp_df.fillna(method="ffill", inplace=True)
|
|
@@ -233,6 +280,8 @@ def stock_hk_daily(symbol: str = "00981", adjust: str = "") -> pd.DataFrame:
|
|
|
233
280
|
qfq_factor_df.reset_index(inplace=True)
|
|
234
281
|
qfq_factor_df["date"] = pd.to_datetime(qfq_factor_df["date"]).dt.date
|
|
235
282
|
return qfq_factor_df
|
|
283
|
+
else:
|
|
284
|
+
return pd.DataFrame()
|
|
236
285
|
|
|
237
286
|
|
|
238
287
|
if __name__ == "__main__":
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/7/24 23:30
|
|
5
5
|
Desc: 巨潮资讯-数据中心-专题统计-股东股本-实际控制人持股变动
|
|
6
|
-
|
|
6
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
7
7
|
|
|
8
8
|
巨潮资讯-数据中心-专题统计-股东股本-高管持股变动明细
|
|
9
|
-
|
|
9
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
10
10
|
"""
|
|
11
|
+
|
|
11
12
|
import datetime
|
|
12
13
|
|
|
13
14
|
import pandas as pd
|
|
15
|
+
import py_mini_racer
|
|
14
16
|
import requests
|
|
15
|
-
from py_mini_racer import py_mini_racer
|
|
16
17
|
|
|
17
18
|
from akshare.datasets import get_ths_js
|
|
18
19
|
|
|
@@ -26,7 +27,7 @@ def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
|
|
|
26
27
|
:rtype: str
|
|
27
28
|
"""
|
|
28
29
|
setting_file_path = get_ths_js(file)
|
|
29
|
-
with open(setting_file_path) as f:
|
|
30
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
30
31
|
file_data = f.read()
|
|
31
32
|
return file_data
|
|
32
33
|
|
|
@@ -34,7 +35,7 @@ def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
|
|
|
34
35
|
def stock_hold_control_cninfo(symbol: str = "全部") -> pd.DataFrame:
|
|
35
36
|
"""
|
|
36
37
|
巨潮资讯-数据中心-专题统计-股东股本-实际控制人持股变动
|
|
37
|
-
|
|
38
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
38
39
|
:param symbol: choice of {"单独控制", "实际控制人", "一致行动人", "家族控制", "全部"}; 从 2010 开始
|
|
39
40
|
:type symbol: str
|
|
40
41
|
:return: 实际控制人持股变动
|
|
@@ -47,7 +48,7 @@ def stock_hold_control_cninfo(symbol: str = "全部") -> pd.DataFrame:
|
|
|
47
48
|
"家族控制": "069004",
|
|
48
49
|
"全部": "",
|
|
49
50
|
}
|
|
50
|
-
url = "
|
|
51
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1033"
|
|
51
52
|
js_code = py_mini_racer.MiniRacer()
|
|
52
53
|
js_content = _get_file_content_cninfo("cninfo.js")
|
|
53
54
|
js_code.eval(js_content)
|
|
@@ -60,11 +61,12 @@ def stock_hold_control_cninfo(symbol: str = "全部") -> pd.DataFrame:
|
|
|
60
61
|
"Cache-Control": "no-cache",
|
|
61
62
|
"Content-Length": "0",
|
|
62
63
|
"Host": "webapi.cninfo.com.cn",
|
|
63
|
-
"Origin": "
|
|
64
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
64
65
|
"Pragma": "no-cache",
|
|
65
66
|
"Proxy-Connection": "keep-alive",
|
|
66
|
-
"Referer": "
|
|
67
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
67
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
68
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
69
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
68
70
|
"X-Requested-With": "XMLHttpRequest",
|
|
69
71
|
}
|
|
70
72
|
params = {
|
|
@@ -104,7 +106,7 @@ def stock_hold_control_cninfo(symbol: str = "全部") -> pd.DataFrame:
|
|
|
104
106
|
def stock_hold_management_detail_cninfo(symbol: str = "增持") -> pd.DataFrame:
|
|
105
107
|
"""
|
|
106
108
|
巨潮资讯-数据中心-专题统计-股东股本-高管持股变动明细
|
|
107
|
-
|
|
109
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
108
110
|
:param symbol: choice of {"增持", "减持"}
|
|
109
111
|
:type symbol: str
|
|
110
112
|
:return: 高管持股变动明细
|
|
@@ -115,7 +117,7 @@ def stock_hold_management_detail_cninfo(symbol: str = "增持") -> pd.DataFrame:
|
|
|
115
117
|
"减持": "S",
|
|
116
118
|
}
|
|
117
119
|
current_date = datetime.datetime.now().date().isoformat()
|
|
118
|
-
url = "
|
|
120
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1030"
|
|
119
121
|
js_code = py_mini_racer.MiniRacer()
|
|
120
122
|
js_content = _get_file_content_cninfo("cninfo.js")
|
|
121
123
|
js_code.eval(js_content)
|
|
@@ -128,11 +130,12 @@ def stock_hold_management_detail_cninfo(symbol: str = "增持") -> pd.DataFrame:
|
|
|
128
130
|
"Content-Length": "0",
|
|
129
131
|
"Host": "webapi.cninfo.com.cn",
|
|
130
132
|
"Accept-Enckey": mcode,
|
|
131
|
-
"Origin": "
|
|
133
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
132
134
|
"Pragma": "no-cache",
|
|
133
135
|
"Proxy-Connection": "keep-alive",
|
|
134
|
-
"Referer": "
|
|
135
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
136
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
137
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
138
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
136
139
|
"X-Requested-With": "XMLHttpRequest",
|
|
137
140
|
}
|
|
138
141
|
params = {
|
|
@@ -192,6 +195,85 @@ def stock_hold_management_detail_cninfo(symbol: str = "增持") -> pd.DataFrame:
|
|
|
192
195
|
return temp_df
|
|
193
196
|
|
|
194
197
|
|
|
198
|
+
def stock_hold_change_cninfo(symbol: str = "全部") -> pd.DataFrame:
|
|
199
|
+
"""
|
|
200
|
+
巨潮资讯-数据中心-专题统计-股东股本-股本变动
|
|
201
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
202
|
+
:param symbol: choice of {"深市主板", "沪市", "创业板", "科创板", "北交所", "全部"}
|
|
203
|
+
:type symbol: str
|
|
204
|
+
:return: 股本变动
|
|
205
|
+
:rtype: pandas.DataFrame
|
|
206
|
+
"""
|
|
207
|
+
symbol_map = {
|
|
208
|
+
"深市主板": "012002",
|
|
209
|
+
"沪市": "012001",
|
|
210
|
+
"创业板": "012015",
|
|
211
|
+
"科创板": "012029",
|
|
212
|
+
"北交所": "012046",
|
|
213
|
+
"全部": "",
|
|
214
|
+
}
|
|
215
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1029"
|
|
216
|
+
js_code = py_mini_racer.MiniRacer()
|
|
217
|
+
js_content = _get_file_content_cninfo("cninfo.js")
|
|
218
|
+
js_code.eval(js_content)
|
|
219
|
+
mcode = js_code.call("getResCode1")
|
|
220
|
+
headers = {
|
|
221
|
+
"Accept": "/",
|
|
222
|
+
"Accept-Enckey": mcode,
|
|
223
|
+
"Accept-Encoding": "gzip, deflate",
|
|
224
|
+
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
225
|
+
"Cache-Control": "no-cache",
|
|
226
|
+
"Content-Length": "0",
|
|
227
|
+
"Host": "webapi.cninfo.com.cn",
|
|
228
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
229
|
+
"Pragma": "no-cache",
|
|
230
|
+
"Proxy-Connection": "keep-alive",
|
|
231
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
232
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
233
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
234
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
235
|
+
}
|
|
236
|
+
params = {
|
|
237
|
+
"market": symbol_map[symbol],
|
|
238
|
+
}
|
|
239
|
+
r = requests.get(url, headers=headers, params=params)
|
|
240
|
+
data_json = r.json()
|
|
241
|
+
temp_df = pd.DataFrame(data_json["records"])
|
|
242
|
+
temp_df.columns = [
|
|
243
|
+
"已流通股份",
|
|
244
|
+
"总股本",
|
|
245
|
+
"交易市场",
|
|
246
|
+
"证券简称",
|
|
247
|
+
"公告日期",
|
|
248
|
+
"变动原因",
|
|
249
|
+
"证券代码",
|
|
250
|
+
"变动日期",
|
|
251
|
+
"流通受限股份",
|
|
252
|
+
"已流通比例",
|
|
253
|
+
]
|
|
254
|
+
temp_df = temp_df[
|
|
255
|
+
[
|
|
256
|
+
"证券代码",
|
|
257
|
+
"证券简称",
|
|
258
|
+
"交易市场",
|
|
259
|
+
"公告日期",
|
|
260
|
+
"变动日期",
|
|
261
|
+
"变动原因",
|
|
262
|
+
"总股本",
|
|
263
|
+
"已流通股份",
|
|
264
|
+
"已流通比例",
|
|
265
|
+
"流通受限股份",
|
|
266
|
+
]
|
|
267
|
+
]
|
|
268
|
+
temp_df["变动日期"] = pd.to_datetime(temp_df["变动日期"], errors="coerce").dt.date
|
|
269
|
+
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
270
|
+
temp_df["总股本"] = pd.to_numeric(temp_df["总股本"], errors="coerce")
|
|
271
|
+
temp_df["已流通股份"] = pd.to_numeric(temp_df["已流通股份"], errors="coerce")
|
|
272
|
+
temp_df["已流通比例"] = pd.to_numeric(temp_df["已流通比例"], errors="coerce")
|
|
273
|
+
temp_df["流通受限股份"] = pd.to_numeric(temp_df["流通受限股份"], errors="coerce")
|
|
274
|
+
return temp_df
|
|
275
|
+
|
|
276
|
+
|
|
195
277
|
if __name__ == "__main__":
|
|
196
278
|
stock_hold_control_cninfo_df = stock_hold_control_cninfo(symbol="全部")
|
|
197
279
|
print(stock_hold_control_cninfo_df)
|
|
@@ -200,3 +282,6 @@ if __name__ == "__main__":
|
|
|
200
282
|
symbol="增持"
|
|
201
283
|
)
|
|
202
284
|
print(stock_hold_management_detail_cninfo_df)
|
|
285
|
+
|
|
286
|
+
stock_hold_change_cninfo_df = stock_hold_change_cninfo(symbol="全部")
|
|
287
|
+
print(stock_hold_change_cninfo_df)
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/5/19 18:30
|
|
5
5
|
Desc: 东方财富网-数据中心-特色数据-高管持股
|
|
6
6
|
https://data.eastmoney.com/executive/list.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
from tqdm import tqdm
|
|
@@ -32,7 +33,6 @@ def stock_hold_management_detail_em() -> pd.DataFrame:
|
|
|
32
33
|
"p": "1",
|
|
33
34
|
"pageNo": "1",
|
|
34
35
|
"pageNum": "1",
|
|
35
|
-
"_": "1691501763413",
|
|
36
36
|
}
|
|
37
37
|
r = requests.get(url, params=params)
|
|
38
38
|
data_json = r.json()
|
|
@@ -47,10 +47,10 @@ def stock_hold_management_detail_em() -> pd.DataFrame:
|
|
|
47
47
|
"pageNum": page,
|
|
48
48
|
}
|
|
49
49
|
)
|
|
50
|
-
r = requests.
|
|
50
|
+
r = requests.get(url, params=params)
|
|
51
51
|
data_json = r.json()
|
|
52
52
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
53
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
53
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
54
54
|
|
|
55
55
|
big_df.rename(
|
|
56
56
|
columns={
|
|
@@ -133,7 +133,6 @@ def stock_hold_management_person_em(
|
|
|
133
133
|
"sortColumns": "CHANGE_DATE,SECURITY_CODE,PERSON_NAME",
|
|
134
134
|
"source": "WEB",
|
|
135
135
|
"client": "WEB",
|
|
136
|
-
"_": "1691503078611",
|
|
137
136
|
}
|
|
138
137
|
r = requests.get(url, params=params)
|
|
139
138
|
data_json = r.json()
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/7/24 23:30
|
|
5
5
|
Desc: 巨潮资讯-数据中心-专题统计-股东股本-股东人数及持股集中度
|
|
6
|
-
|
|
6
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
10
|
+
import py_mini_racer
|
|
9
11
|
import requests
|
|
10
|
-
from py_mini_racer import py_mini_racer
|
|
11
12
|
|
|
12
13
|
from akshare.datasets import get_ths_js
|
|
13
14
|
|
|
@@ -21,7 +22,7 @@ def _get_file_content_ths(file: str = "cninfo.js") -> str:
|
|
|
21
22
|
:rtype: str
|
|
22
23
|
"""
|
|
23
24
|
setting_file_path = get_ths_js(file)
|
|
24
|
-
with open(setting_file_path) as f:
|
|
25
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
25
26
|
file_data = f.read()
|
|
26
27
|
return file_data
|
|
27
28
|
|
|
@@ -29,13 +30,13 @@ def _get_file_content_ths(file: str = "cninfo.js") -> str:
|
|
|
29
30
|
def stock_hold_num_cninfo(date: str = "20210630") -> pd.DataFrame:
|
|
30
31
|
"""
|
|
31
32
|
巨潮资讯-数据中心-专题统计-股东股本-股东人数及持股集中度
|
|
32
|
-
|
|
33
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
33
34
|
:param date: choice of {"XXXX0331", "XXXX0630", "XXXX0930", "XXXX1231"}; 从 20170331 开始
|
|
34
35
|
:type date: str
|
|
35
36
|
:return: 股东人数及持股集中度
|
|
36
37
|
:rtype: pandas.DataFrame
|
|
37
38
|
"""
|
|
38
|
-
url = "
|
|
39
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1034"
|
|
39
40
|
js_code = py_mini_racer.MiniRacer()
|
|
40
41
|
js_content = _get_file_content_ths("cninfo.js")
|
|
41
42
|
js_code.eval(js_content)
|
|
@@ -48,11 +49,12 @@ def stock_hold_num_cninfo(date: str = "20210630") -> pd.DataFrame:
|
|
|
48
49
|
"Cache-Control": "no-cache",
|
|
49
50
|
"Content-Length": "0",
|
|
50
51
|
"Host": "webapi.cninfo.com.cn",
|
|
51
|
-
"Origin": "
|
|
52
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
52
53
|
"Pragma": "no-cache",
|
|
53
54
|
"Proxy-Connection": "keep-alive",
|
|
54
|
-
"Referer": "
|
|
55
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
55
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
56
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
57
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
56
58
|
"X-Requested-With": "XMLHttpRequest",
|
|
57
59
|
}
|
|
58
60
|
params = {
|
|
@@ -85,15 +87,19 @@ def stock_hold_num_cninfo(date: str = "20210630") -> pd.DataFrame:
|
|
|
85
87
|
"人均持股数量增幅",
|
|
86
88
|
]
|
|
87
89
|
]
|
|
88
|
-
temp_df["变动日期"] = pd.to_datetime(temp_df["变动日期"]).dt.date
|
|
90
|
+
temp_df["变动日期"] = pd.to_datetime(temp_df["变动日期"], errors="coerce").dt.date
|
|
89
91
|
temp_df["本期人均持股数量"] = pd.to_numeric(
|
|
90
92
|
temp_df["本期人均持股数量"], errors="coerce"
|
|
91
93
|
)
|
|
92
94
|
temp_df["股东人数增幅"] = pd.to_numeric(temp_df["股东人数增幅"], errors="coerce")
|
|
93
95
|
temp_df["上期股东人数"] = pd.to_numeric(temp_df["上期股东人数"], errors="coerce")
|
|
94
96
|
temp_df["本期股东人数"] = pd.to_numeric(temp_df["本期股东人数"], errors="coerce")
|
|
95
|
-
temp_df["人均持股数量增幅"] = pd.to_numeric(
|
|
96
|
-
|
|
97
|
+
temp_df["人均持股数量增幅"] = pd.to_numeric(
|
|
98
|
+
temp_df["人均持股数量增幅"], errors="coerce"
|
|
99
|
+
)
|
|
100
|
+
temp_df["上期人均持股数量"] = pd.to_numeric(
|
|
101
|
+
temp_df["上期人均持股数量"], errors="coerce"
|
|
102
|
+
)
|
|
97
103
|
return temp_df
|
|
98
104
|
|
|
99
105
|
|
|
@@ -5,6 +5,7 @@ Date: 2023/7/8 17:15
|
|
|
5
5
|
Desc: 东方财富个股人气榜
|
|
6
6
|
https://guba.eastmoney.com/rank/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
|
|
@@ -79,6 +80,7 @@ def stock_hot_rank_detail_em(symbol: str = "SZ000665") -> pd.DataFrame:
|
|
|
79
80
|
"globalId": "786e4c21-70dc-435a-93bb-38",
|
|
80
81
|
"marketType": "",
|
|
81
82
|
"srcSecurityCode": symbol,
|
|
83
|
+
"yearType": "5",
|
|
82
84
|
}
|
|
83
85
|
r = requests.post(url_rank, json=payload)
|
|
84
86
|
data_json = r.json()
|
|
@@ -96,6 +98,7 @@ def stock_hot_rank_detail_em(symbol: str = "SZ000665") -> pd.DataFrame:
|
|
|
96
98
|
temp_df["铁杆粉丝"] = (
|
|
97
99
|
pd.DataFrame(data_json["data"])["oldUidRate"].str.strip("%").astype(float) / 100
|
|
98
100
|
)
|
|
101
|
+
temp_df.sort_values(['时间'], inplace=True)
|
|
99
102
|
return temp_df
|
|
100
103
|
|
|
101
104
|
|
|
@@ -190,7 +193,7 @@ def stock_hot_rank_relate_em(symbol: str = "SZ000665") -> pd.DataFrame:
|
|
|
190
193
|
temp_df.columns = ["时间", "-", "股票代码", "-", "相关股票代码", "涨跌幅", "-"]
|
|
191
194
|
temp_df = temp_df[["时间", "股票代码", "相关股票代码", "涨跌幅"]]
|
|
192
195
|
temp_df["涨跌幅"] = temp_df["涨跌幅"].str.strip("%")
|
|
193
|
-
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"])
|
|
196
|
+
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
194
197
|
return temp_df
|
|
195
198
|
|
|
196
199
|
|
|
@@ -1,60 +1,73 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/6/16 18:19
|
|
5
5
|
Desc: 百度股市通-热搜股票
|
|
6
|
-
https://gushitong.baidu.com/
|
|
6
|
+
https://gushitong.baidu.com/hotlist?mainTab=hotSearch&market=all
|
|
7
7
|
"""
|
|
8
|
+
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
|
|
8
11
|
import pandas as pd
|
|
9
12
|
import requests
|
|
10
|
-
from datetime import datetime
|
|
11
13
|
|
|
12
14
|
|
|
13
|
-
def stock_hot_search_baidu(
|
|
15
|
+
def stock_hot_search_baidu(
|
|
16
|
+
symbol: str = "A股", date: str = "20250616", time: str = "今日"
|
|
17
|
+
):
|
|
14
18
|
"""
|
|
15
19
|
百度股市通-热搜股票
|
|
16
|
-
https://gushitong.baidu.com/
|
|
20
|
+
https://gushitong.baidu.com/hotlist?mainTab=hotSearch&market=all
|
|
17
21
|
:param symbol: choice of {"全部", "A股", "港股", "美股"}
|
|
18
22
|
:type symbol: str
|
|
19
23
|
:param date: 日期
|
|
20
24
|
:type date: str
|
|
21
25
|
:param time: time="今日";choice of {"今日", "1小时"}
|
|
22
26
|
:type time: str
|
|
23
|
-
:return:
|
|
27
|
+
:return: 热搜股票
|
|
24
28
|
:rtype: pandas.DataFrame
|
|
25
29
|
"""
|
|
26
30
|
hour_str = datetime.now().hour
|
|
27
31
|
symbol_map = {
|
|
28
|
-
"
|
|
32
|
+
"全市场": "all",
|
|
29
33
|
"A股": "ab",
|
|
30
34
|
"港股": "hk",
|
|
31
35
|
"美股": "us",
|
|
32
36
|
}
|
|
33
|
-
url = "https://finance.pae.baidu.com/
|
|
37
|
+
url = "https://finance.pae.baidu.com/selfselect/listsugrecomm"
|
|
34
38
|
params = {
|
|
35
|
-
"
|
|
39
|
+
"bizType": "wisexmlnew",
|
|
36
40
|
"dsp": "iphone",
|
|
37
|
-
"product": "
|
|
41
|
+
"product": "search",
|
|
42
|
+
"style": "tablelist",
|
|
43
|
+
"market": symbol_map[symbol],
|
|
44
|
+
"type": time,
|
|
38
45
|
"day": date,
|
|
39
46
|
"hour": hour_str,
|
|
40
47
|
"pn": "0",
|
|
41
|
-
"rn": "
|
|
42
|
-
"market": symbol_map[symbol],
|
|
43
|
-
"type": "day" if time == "今日" else "hour",
|
|
48
|
+
"rn": "12",
|
|
44
49
|
"finClientType": "pc",
|
|
45
50
|
}
|
|
46
51
|
r = requests.get(url, params=params)
|
|
47
52
|
data_json = r.json()
|
|
48
|
-
temp_df = pd.DataFrame(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
temp_df = pd.DataFrame(data_json["Result"]['list']["body"])
|
|
54
|
+
temp_df.rename(columns={
|
|
55
|
+
'name': "名称/代码",
|
|
56
|
+
'pxChangeRate': "涨跌幅",
|
|
57
|
+
'heat': "综合热度",
|
|
58
|
+
|
|
59
|
+
}, inplace=True)
|
|
60
|
+
temp_df = temp_df[[
|
|
61
|
+
"名称/代码",
|
|
62
|
+
"涨跌幅",
|
|
63
|
+
"综合热度",
|
|
64
|
+
]]
|
|
65
|
+
temp_df['综合热度'] = pd.to_numeric(temp_df['综合热度'], errors='coerce')
|
|
53
66
|
return temp_df
|
|
54
67
|
|
|
55
68
|
|
|
56
69
|
if __name__ == "__main__":
|
|
57
70
|
stock_hot_search_baidu_df = stock_hot_search_baidu(
|
|
58
|
-
symbol="A股", date="
|
|
71
|
+
symbol="A股", date="20250616", time="今日"
|
|
59
72
|
)
|
|
60
73
|
print(stock_hot_search_baidu_df)
|