akshare 1.12.95__py3-none-any.whl → 1.15.72__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.

Potentially problematic release.


This version of akshare might be problematic. Click here for more details.

Files changed (240) hide show
  1. akshare/__init__.py +446 -139
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +29 -43
  4. akshare/air/sunrise_tad.py +32 -17
  5. akshare/bank/bank_cbirc_2020.py +12 -9
  6. akshare/bond/bond_cb_ths.py +17 -9
  7. akshare/bond/bond_china.py +38 -39
  8. akshare/bond/bond_china_money.py +75 -48
  9. akshare/bond/bond_convert.py +40 -16
  10. akshare/bond/bond_info_cm.py +28 -8
  11. akshare/bond/bond_issue_cninfo.py +73 -30
  12. akshare/bond/{bond_zh_cov_sina.py → bond_zh_cov.py} +41 -17
  13. akshare/bond/bond_zh_sina.py +57 -51
  14. akshare/cal/__init__.py +0 -0
  15. akshare/cal/rv.py +170 -0
  16. akshare/cost/cost_living.py +7 -5
  17. akshare/currency/currency_safe.py +7 -6
  18. akshare/data/cninfo.js +15 -0
  19. akshare/datasets.py +10 -21
  20. akshare/economic/macro_bank.py +95 -653
  21. akshare/economic/macro_china.py +772 -1024
  22. akshare/economic/macro_china_hk.py +65 -243
  23. akshare/economic/macro_china_nbs.py +24 -7
  24. akshare/economic/macro_constitute.py +17 -12
  25. akshare/economic/macro_euro.py +13 -6
  26. akshare/economic/macro_finance_ths.py +133 -0
  27. akshare/economic/macro_info_ws.py +100 -0
  28. akshare/economic/macro_japan.py +5 -4
  29. akshare/economic/macro_other.py +12 -9
  30. akshare/economic/macro_usa.py +376 -1940
  31. akshare/economic/marco_cnbs.py +11 -6
  32. akshare/energy/energy_carbon.py +94 -125
  33. akshare/event/migration.py +3 -2
  34. akshare/exceptions.py +43 -0
  35. akshare/file_fold/calendar.json +245 -2
  36. akshare/fortune/fortune_500.py +15 -48
  37. akshare/fund/fund_amac.py +157 -75
  38. akshare/fund/fund_em.py +191 -184
  39. akshare/fund/fund_etf_em.py +20 -19
  40. akshare/fund/fund_etf_sina.py +71 -23
  41. akshare/fund/fund_etf_ths.py +93 -0
  42. akshare/fund/fund_fee_em.py +98 -0
  43. akshare/fund/fund_lof_em.py +10 -8
  44. akshare/fund/fund_portfolio_em.py +60 -50
  45. akshare/fund/fund_rank_em.py +91 -82
  46. akshare/fund/fund_report_cninfo.py +63 -48
  47. akshare/fund/fund_scale_sina.py +20 -10
  48. akshare/fund/fund_xq.py +139 -109
  49. akshare/futures/cons.py +8 -31
  50. akshare/futures/cot.py +185 -137
  51. akshare/futures/futures_basis.py +97 -32
  52. akshare/futures/futures_comm_ctp.py +37 -0
  53. akshare/futures/futures_comm_qihuo.py +74 -45
  54. akshare/futures/futures_daily_bar.py +121 -184
  55. akshare/futures/futures_hf_em.py +66 -61
  56. akshare/futures/futures_hq_sina.py +79 -61
  57. akshare/futures/futures_index_ccidx.py +6 -3
  58. akshare/futures/futures_inventory_99.py +61 -272
  59. akshare/futures/futures_news_shmet.py +4 -2
  60. akshare/futures/futures_roll_yield.py +12 -25
  61. akshare/futures/futures_spot_stock_em.py +19 -13
  62. akshare/futures/futures_stock_js.py +14 -12
  63. akshare/futures/futures_to_spot.py +38 -33
  64. akshare/futures/futures_warehouse_receipt.py +75 -71
  65. akshare/futures/futures_zh_sina.py +73 -50
  66. akshare/futures/symbol_var.py +18 -13
  67. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  68. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  69. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  70. akshare/futures_derivative/futures_cot_sina.py +26 -19
  71. akshare/futures_derivative/futures_spot_sys.py +21 -8
  72. akshare/fx/currency_investing.py +19 -285
  73. akshare/index/index_cflp.py +29 -26
  74. akshare/index/index_cni.py +86 -88
  75. akshare/index/index_cons.py +26 -10
  76. akshare/index/index_cx.py +248 -47
  77. akshare/index/index_drewry.py +17 -16
  78. akshare/index/index_hog.py +27 -26
  79. akshare/index/index_option_qvix.py +329 -0
  80. akshare/index/index_research_fund_sw.py +134 -0
  81. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  82. akshare/index/index_spot.py +9 -5
  83. akshare/index/index_stock_hk.py +35 -16
  84. akshare/index/index_stock_us_sina.py +1 -1
  85. akshare/index/index_stock_zh.py +180 -89
  86. akshare/index/index_stock_zh_csindex.py +15 -369
  87. akshare/index/index_sw.py +62 -34
  88. akshare/index/index_yw.py +46 -23
  89. akshare/index/index_zh_a_scope.py +48 -0
  90. akshare/index/index_zh_em.py +17 -14
  91. akshare/interest_rate/interbank_rate_em.py +14 -9
  92. akshare/movie/artist_yien.py +32 -5
  93. akshare/movie/movie_yien.py +92 -18
  94. akshare/movie/video_yien.py +28 -5
  95. akshare/news/news_baidu.py +78 -44
  96. akshare/news/news_cctv.py +38 -38
  97. akshare/news/news_stock.py +6 -3
  98. akshare/nlp/nlp_interface.py +7 -8
  99. akshare/option/cons.py +11 -11
  100. akshare/option/option_comm_qihuo.py +86 -0
  101. akshare/option/option_commodity.py +178 -51
  102. akshare/option/option_daily_stats_sse_szse.py +146 -0
  103. akshare/option/option_em.py +147 -138
  104. akshare/option/option_finance_sina.py +160 -137
  105. akshare/option/option_lhb_em.py +62 -56
  106. akshare/option/option_risk_indicator_sse.py +17 -14
  107. akshare/other/other_car_cpca.py +934 -0
  108. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  109. akshare/qdii/__init__.py +0 -0
  110. akshare/qdii/qdii_jsl.py +233 -0
  111. akshare/request.py +117 -0
  112. akshare/spot/spot_hog_soozhu.py +232 -0
  113. akshare/spot/spot_price_qh.py +121 -0
  114. akshare/spot/spot_sge.py +63 -10
  115. akshare/stock/stock_allotment_cninfo.py +10 -9
  116. akshare/stock/stock_ask_bid_em.py +27 -3
  117. akshare/stock/stock_board_concept_em.py +23 -14
  118. akshare/stock/stock_board_industry_em.py +40 -34
  119. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  120. akshare/stock/stock_cg_guarantee.py +41 -51
  121. akshare/stock/stock_cg_lawsuit.py +36 -35
  122. akshare/stock/stock_dividend_cninfo.py +12 -6
  123. akshare/stock/stock_dzjy_em.py +347 -260
  124. akshare/stock/stock_fund_em.py +332 -84
  125. akshare/stock/stock_hk_famous.py +108 -0
  126. akshare/stock/stock_hk_sina.py +8 -7
  127. akshare/stock/stock_hold_control_cninfo.py +100 -15
  128. akshare/stock/stock_hold_control_em.py +4 -3
  129. akshare/stock/stock_hold_num_cninfo.py +18 -12
  130. akshare/stock/stock_hot_rank_em.py +2 -1
  131. akshare/stock/stock_hot_search_baidu.py +5 -2
  132. akshare/stock/stock_industry_cninfo.py +24 -18
  133. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  134. akshare/stock/stock_industry_sw.py +9 -10
  135. akshare/stock/stock_info.py +25 -15
  136. akshare/stock/stock_info_em.py +5 -2
  137. akshare/stock/stock_intraday_em.py +5 -2
  138. akshare/stock/stock_intraday_sina.py +22 -18
  139. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  140. akshare/stock/stock_new_cninfo.py +32 -19
  141. akshare/stock/stock_news_cx.py +39 -0
  142. akshare/stock/stock_profile_cninfo.py +9 -8
  143. akshare/stock/stock_rank_forecast.py +8 -6
  144. akshare/stock/stock_share_changes_cninfo.py +18 -14
  145. akshare/stock/stock_share_hold.py +24 -19
  146. akshare/stock/stock_summary.py +54 -26
  147. akshare/stock/stock_us_famous.py +15 -6
  148. akshare/stock/stock_us_pink.py +7 -5
  149. akshare/stock/stock_us_sina.py +15 -12
  150. akshare/stock/stock_xq.py +38 -12
  151. akshare/stock/stock_zh_a_sina.py +53 -78
  152. akshare/stock/stock_zh_b_sina.py +32 -55
  153. akshare/stock/stock_zh_kcb_report.py +11 -9
  154. akshare/stock/stock_zh_kcb_sina.py +67 -64
  155. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  156. akshare/stock_feature/stock_a_high_low.py +5 -2
  157. akshare/stock_feature/stock_a_indicator.py +12 -9
  158. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  159. akshare/stock_feature/stock_account_em.py +58 -40
  160. akshare/stock_feature/stock_analyst_em.py +36 -27
  161. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  162. akshare/stock_feature/stock_comment_em.py +118 -85
  163. akshare/stock_feature/stock_concept_futu.py +183 -0
  164. akshare/stock_feature/stock_cyq_em.py +58 -54
  165. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  166. akshare/stock_feature/stock_esg_sina.py +216 -11
  167. akshare/stock_feature/stock_fhps_em.py +60 -25
  168. akshare/stock_feature/stock_fhps_ths.py +25 -6
  169. akshare/stock_feature/stock_fund_flow.py +38 -25
  170. akshare/stock_feature/stock_gdfx_em.py +180 -95
  171. akshare/stock_feature/stock_gdhs.py +73 -49
  172. akshare/stock_feature/stock_gpzy_em.py +78 -46
  173. akshare/stock_feature/stock_hist_em.py +164 -111
  174. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  175. akshare/stock_feature/stock_hsgt_em.py +184 -452
  176. akshare/stock_feature/stock_info.py +52 -29
  177. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  178. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  179. akshare/stock_feature/stock_jgdy_em.py +41 -38
  180. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  181. akshare/stock_feature/stock_lhb_em.py +135 -71
  182. akshare/stock_feature/stock_lhb_sina.py +93 -46
  183. akshare/stock_feature/stock_margin_em.py +102 -0
  184. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  185. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  186. akshare/stock_feature/stock_market_legu.py +13 -8
  187. akshare/stock_feature/stock_pankou_em.py +72 -34
  188. akshare/stock_feature/stock_report_em.py +244 -54
  189. akshare/stock_feature/stock_research_report_em.py +48 -19
  190. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  191. akshare/stock_feature/stock_sy_em.py +86 -33
  192. akshare/stock_feature/stock_technology_ths.py +152 -120
  193. akshare/stock_feature/stock_tfp_em.py +35 -13
  194. akshare/stock_feature/stock_three_report_em.py +119 -77
  195. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  196. akshare/stock_feature/stock_value_em.py +83 -0
  197. akshare/stock_feature/stock_wencai.py +21 -9
  198. akshare/stock_feature/stock_yjyg_em.py +63 -28
  199. akshare/stock_feature/stock_zf_pg.py +61 -38
  200. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  201. akshare/stock_feature/stock_ztb_em.py +62 -40
  202. akshare/stock_fundamental/stock_finance.py +150 -58
  203. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  204. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  205. akshare/stock_fundamental/stock_notice.py +29 -15
  206. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  207. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  208. akshare/stock_fundamental/stock_register_em.py +448 -0
  209. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  210. akshare/stock_fundamental/stock_zygc.py +10 -8
  211. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  212. akshare/tool/trade_date_hist.py +4 -3
  213. akshare/utils/cons.py +10 -0
  214. akshare/utils/context.py +43 -0
  215. akshare/utils/demjson.py +2 -2
  216. akshare/utils/func.py +26 -0
  217. akshare/utils/tqdm.py +13 -3
  218. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  219. akshare-1.15.72.dist-info/RECORD +385 -0
  220. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  221. tests/test_func.py +3 -5
  222. akshare/bond/bond_futures.py +0 -50
  223. akshare/bond/bond_investing.py +0 -139
  224. akshare/crypto/crypto_hist_investing.py +0 -249
  225. akshare/fortune/fortune_it_juzi.py +0 -123
  226. akshare/futures/futures_international.py +0 -170
  227. akshare/futures/futures_news_baidu.py +0 -54
  228. akshare/futures/inventory_data.py +0 -100
  229. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  230. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  231. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  232. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  233. akshare/index/index_fear_greed_funddb.py +0 -71
  234. akshare/index/index_investing.py +0 -232
  235. akshare/sport/sport_olympic_winter.py +0 -39
  236. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  237. akshare/stock_fundamental/stock_register.py +0 -292
  238. akshare-1.12.95.dist-info/RECORD +0 -374
  239. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  240. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
@@ -1,59 +1,70 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/2/27 17:00
4
+ Date: 2024/5/13 17:45
5
5
  Desc: 上海期货交易所-交易所服务-业务数据-交易参数汇总查询
6
- https://www.shfe.com.cn/bourseService/businessdata/summaryinquiry/
6
+ https://tsite.shfe.com.cn/bourseService/businessdata/summaryinquiry/
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
11
12
 
12
- def futures_contract_info_shfe(date: str = "20240227") -> pd.DataFrame:
13
+ def futures_contract_info_shfe(date: str = "20240513") -> pd.DataFrame:
13
14
  """
14
15
  上海期货交易所-交易所服务-业务数据-交易参数汇总查询
15
- https://www.shfe.com.cn/bourseService/businessdata/summaryinquiry/
16
+ https://tsite.shfe.com.cn/bourseService/businessdata/summaryinquiry/
16
17
  :param date: 查询日期; 交易日
17
18
  :type date: str
18
19
  :return: 交易参数汇总查询
19
20
  :rtype: pandas.DataFrame
20
21
  """
21
- url = f"https://www.shfe.com.cn/data/instrument/ContractBaseInfo{date}.dat"
22
+ url = f"https://tsite.shfe.com.cn/data/instrument/ContractBaseInfo{date}.dat"
22
23
  headers = {
23
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
24
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
25
+ "Chrome/119.0.0.0 Safari/537.36"
24
26
  }
25
27
  r = requests.get(url, headers=headers)
26
28
  data_json = r.json()
27
- temp_df = pd.DataFrame(data_json['ContractBaseInfo'])
28
- temp_df.rename(columns={
29
- 'BASISPRICE': "挂牌基准价",
30
- 'ENDDELIVDATE': "最后交割日",
31
- 'EXPIREDATE': "到期日",
32
- 'INSTRUMENTID': "合约代码",
33
- 'OPENDATE': "上市日",
34
- 'STARTDELIVDATE': "开始交割日",
35
- 'TRADINGDAY': "交易日",
36
- 'UPDATE_DATE': "更新时间",
37
- }, inplace=True)
38
- temp_df = temp_df[[
39
- "合约代码",
40
- "上市日",
41
- "到期日",
42
- "开始交割日",
43
- "最后交割日",
44
- "挂牌基准价",
45
- "交易日",
46
- "更新时间",
47
- ]]
48
- temp_df['上市日'] = pd.to_datetime(temp_df['上市日'], errors="coerce").dt.date
49
- temp_df['到期日'] = pd.to_datetime(temp_df['到期日'], errors="coerce").dt.date
50
- temp_df['开始交割日'] = pd.to_datetime(temp_df['开始交割日'], errors="coerce").dt.date
51
- temp_df['最后交割日'] = pd.to_datetime(temp_df['最后交割日'], errors="coerce").dt.date
52
- temp_df['交易日'] = pd.to_datetime(temp_df['交易日'], errors="coerce").dt.date
53
- temp_df['挂牌基准价'] = pd.to_numeric(temp_df['挂牌基准价'], errors="coerce")
29
+ temp_df = pd.DataFrame(data_json["ContractBaseInfo"])
30
+ temp_df.rename(
31
+ columns={
32
+ "BASISPRICE": "挂牌基准价",
33
+ "ENDDELIVDATE": "最后交割日",
34
+ "EXPIREDATE": "到期日",
35
+ "INSTRUMENTID": "合约代码",
36
+ "OPENDATE": "上市日",
37
+ "STARTDELIVDATE": "开始交割日",
38
+ "TRADINGDAY": "交易日",
39
+ "UPDATE_DATE": "更新时间",
40
+ },
41
+ inplace=True,
42
+ )
43
+ temp_df = temp_df[
44
+ [
45
+ "合约代码",
46
+ "上市日",
47
+ "到期日",
48
+ "开始交割日",
49
+ "最后交割日",
50
+ "挂牌基准价",
51
+ "交易日",
52
+ "更新时间",
53
+ ]
54
+ ]
55
+ temp_df["上市日"] = pd.to_datetime(temp_df["上市日"], errors="coerce").dt.date
56
+ temp_df["到期日"] = pd.to_datetime(temp_df["到期日"], errors="coerce").dt.date
57
+ temp_df["开始交割日"] = pd.to_datetime(
58
+ temp_df["开始交割日"], errors="coerce"
59
+ ).dt.date
60
+ temp_df["最后交割日"] = pd.to_datetime(
61
+ temp_df["最后交割日"], errors="coerce"
62
+ ).dt.date
63
+ temp_df["交易日"] = pd.to_datetime(temp_df["交易日"], errors="coerce").dt.date
64
+ temp_df["挂牌基准价"] = pd.to_numeric(temp_df["挂牌基准价"], errors="coerce")
54
65
  return temp_df
55
66
 
56
67
 
57
- if __name__ == '__main__':
58
- futures_contract_info_shfe_df = futures_contract_info_shfe(date="20240227")
68
+ if __name__ == "__main__":
69
+ futures_contract_info_shfe_df = futures_contract_info_shfe(date="20240513")
59
70
  print(futures_contract_info_shfe_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/2/25 15:30
5
- Desc: 新浪财经-商品期货-成交持仓
4
+ Date: 2024/12/27 21:00
5
+ Desc: 新浪财经-期货-成交持仓
6
6
  https://vip.stock.finance.sina.com.cn/q/view/vFutures_Positions_cjcc.php
7
7
  """
8
+
8
9
  from io import StringIO
9
10
 
10
11
  import pandas as pd
@@ -12,10 +13,10 @@ import requests
12
13
 
13
14
 
14
15
  def futures_hold_pos_sina(
15
- symbol: str = "成交量", contract: str = "IC2403", date: str = "20240223"
16
+ symbol: str = "成交量", contract: str = "OI2501", date: str = "20240223"
16
17
  ) -> pd.DataFrame:
17
18
  """
18
- 新浪财经-商品期货-成交持仓
19
+ 新浪财经-期货-成交持仓
19
20
  https://vip.stock.finance.sina.com.cn/q/view/vFutures_Positions_cjcc.php
20
21
  :param symbol: choice of {"成交量", "多单持仓", "空单持仓"}
21
22
  :type symbol: str
@@ -26,42 +27,48 @@ def futures_hold_pos_sina(
26
27
  :return: 成交持仓
27
28
  :rtype: pandas.DataFrame
28
29
  """
29
- date = '-'.join([date[:4], date[4:6], date[6:]])
30
- url = "https://vip.stock.finance.sina.com.cn/q/view/vCffex_Positions_cjcc.php"
31
- params = {"symbol": contract, "date": date}
30
+ date = "-".join([date[:4], date[4:6], date[6:]])
31
+ url = "https://vip.stock.finance.sina.com.cn/q/view/vFutures_Positions_cjcc.php"
32
+ params = {"t_breed": contract, "t_date": date}
32
33
  r = requests.get(url, params=params)
33
34
  if symbol == "成交量":
34
35
  temp_df = pd.read_html(StringIO(r.text))[2].iloc[:-1, :]
35
- temp_df['名次'] = pd.to_numeric(temp_df['名次'], errors="coerce")
36
- temp_df['成交量'] = pd.to_numeric(temp_df['成交量'], errors="coerce")
37
- temp_df['比上交易增减'] = pd.to_numeric(temp_df['比上交易增减'], errors="coerce")
36
+ temp_df["名次"] = pd.to_numeric(temp_df["名次"], errors="coerce")
37
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
38
+ temp_df["比上交易增减"] = pd.to_numeric(
39
+ temp_df["比上交易增减"], errors="coerce"
40
+ )
38
41
  return temp_df
39
42
  elif symbol == "多单持仓":
40
43
  temp_df = pd.read_html(StringIO(r.text))[3].iloc[:-1, :]
41
- temp_df['名次'] = pd.to_numeric(temp_df['名次'], errors="coerce")
42
- temp_df['多单持仓'] = pd.to_numeric(temp_df['多单持仓'], errors="coerce")
43
- temp_df['比上交易增减'] = pd.to_numeric(temp_df['比上交易增减'], errors="coerce")
44
+ temp_df["名次"] = pd.to_numeric(temp_df["名次"], errors="coerce")
45
+ temp_df["多单持仓"] = pd.to_numeric(temp_df["多单持仓"], errors="coerce")
46
+ temp_df["比上交易增减"] = pd.to_numeric(
47
+ temp_df["比上交易增减"], errors="coerce"
48
+ )
44
49
  return temp_df
45
50
  elif symbol == "空单持仓":
46
51
  temp_df = pd.read_html(StringIO(r.text))[4].iloc[:-1, :]
47
- temp_df['名次'] = pd.to_numeric(temp_df['名次'], errors="coerce")
48
- temp_df['空单持仓'] = pd.to_numeric(temp_df['空单持仓'], errors="coerce")
49
- temp_df['比上交易增减'] = pd.to_numeric(temp_df['比上交易增减'], errors="coerce")
52
+ temp_df["名次"] = pd.to_numeric(temp_df["名次"], errors="coerce")
53
+ temp_df["空单持仓"] = pd.to_numeric(temp_df["空单持仓"], errors="coerce")
54
+ temp_df["比上交易增减"] = pd.to_numeric(
55
+ temp_df["比上交易增减"], errors="coerce"
56
+ )
50
57
  return temp_df
51
58
 
52
59
 
53
60
  if __name__ == "__main__":
54
61
  futures_hold_pos_sina_df = futures_hold_pos_sina(
55
- symbol="成交量", contract="IC2403", date="20240223"
62
+ symbol="成交量", contract="IC2403", date="20240203"
56
63
  )
57
64
  print(futures_hold_pos_sina_df)
58
65
 
59
66
  futures_hold_pos_sina_df = futures_hold_pos_sina(
60
- symbol="多单持仓", contract="IC2403", date="20240223"
67
+ symbol="多单持仓", contract="OI2501", date="20241016"
61
68
  )
62
69
  print(futures_hold_pos_sina_df)
63
70
 
64
71
  futures_hold_pos_sina_df = futures_hold_pos_sina(
65
- symbol="空单持仓", contract="IC2403", date="20240223"
72
+ symbol="空单持仓", contract="OI2501", date="20241016"
66
73
  )
67
74
  print(futures_hold_pos_sina_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/2/24 16:20
4
+ Date: 2024/4/5 20:20
5
5
  Desc: 生意社-商品与期货-现期图
6
6
  https://www.100ppi.com/sf/792.html
7
7
  """
8
+
8
9
  from io import StringIO
9
10
 
10
11
  import pandas as pd
@@ -24,7 +25,11 @@ def __get_sys_spot_futures_dict() -> dict:
24
25
  soup = BeautifulSoup(res.text, features="lxml")
25
26
  temp_item = soup.find(name="div", attrs={"class": "q8"}).find_all("li")
26
27
  name_url_dict = dict(
27
- zip([item.find("a").get_text().strip() for item in temp_item], [item.find("a")["href"] for item in temp_item]))
28
+ zip(
29
+ [item.find("a").get_text().strip() for item in temp_item],
30
+ [item.find("a")["href"] for item in temp_item],
31
+ )
32
+ )
28
33
  return name_url_dict
29
34
 
30
35
 
@@ -44,24 +49,32 @@ def futures_spot_sys(symbol: str = "铜", indicator: str = "市场价格") -> pd
44
49
  r = requests.get("https://www.100ppi.com" + url)
45
50
  if indicator == "市场价格":
46
51
  table_df_one = pd.read_html(StringIO(r.text), header=0, index_col=0)[1].T
47
- table_df_one['现货价格'] = pd.to_numeric(table_df_one['现货价格'], errors="coerce")
48
- table_df_one['主力合约'] = pd.to_numeric(table_df_one['主力合约'], errors="coerce")
49
- table_df_one['最近合约'] = pd.to_numeric(table_df_one['最近合约'], errors="coerce")
52
+ table_df_one["现货价格"] = pd.to_numeric(
53
+ table_df_one["现货价格"], errors="coerce"
54
+ )
55
+ table_df_one["主力合约"] = pd.to_numeric(
56
+ table_df_one["主力合约"], errors="coerce"
57
+ )
58
+ table_df_one["最近合约"] = pd.to_numeric(
59
+ table_df_one["最近合约"], errors="coerce"
60
+ )
50
61
  table_df_one.reset_index(inplace=True)
51
62
  table_df_one.columns.name = None
52
63
  table_df_one.rename(columns={"index": "日期"}, inplace=True)
53
64
  return table_df_one
54
65
  elif indicator == "基差率":
55
66
  table_df_two = pd.read_html(StringIO(r.text), header=0, index_col=0)[2].T
56
- table_df_two['基差率'] = table_df_two['基差率'].str.replace("%", "")
57
- table_df_two['基差率'] = pd.to_numeric(table_df_two['基差率'], errors="coerce")
67
+ table_df_two["基差率"] = table_df_two["基差率"].str.replace("%", "")
68
+ table_df_two["基差率"] = pd.to_numeric(table_df_two["基差率"], errors="coerce")
58
69
  table_df_two.reset_index(inplace=True)
59
70
  table_df_two.columns.name = None
60
71
  table_df_two.rename(columns={"index": "日期"}, inplace=True)
61
72
  return table_df_two
62
73
  else:
63
74
  table_df_three = pd.read_html(StringIO(r.text), header=0, index_col=0)[3].T
64
- table_df_three['主力基差'] = pd.to_numeric(table_df_three['主力基差'], errors="coerce")
75
+ table_df_three["主力基差"] = pd.to_numeric(
76
+ table_df_three["主力基差"], errors="coerce"
77
+ )
65
78
  table_df_three.reset_index(inplace=True)
66
79
  table_df_three.columns.name = None
67
80
  table_df_three.rename(columns={"index": "日期"}, inplace=True)
@@ -1,229 +1,29 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/8/8 20:33
4
+ Date: 2024/6/26 15:33
5
5
  Desc: 英为财情-外汇-货币对历史数据
6
6
  https://cn.investing.com/currencies/
7
7
  https://cn.investing.com/currencies/eur-usd-historical-data
8
8
  """
9
- import json
10
9
 
11
10
  import pandas as pd
12
11
  import requests
13
12
  from bs4 import BeautifulSoup
14
- from tqdm import tqdm
13
+ from akshare.utils.tqdm import get_tqdm
15
14
 
16
- from akshare.index.cons import short_headers
17
15
 
18
-
19
- def _currency_name_url() -> dict:
20
- """
21
- 货币键值对
22
- :return: 货币键值对
23
- :rtype: dict
24
- """
25
- url = "https://cn.investing.com/currencies/"
26
- res = requests.post(url, headers=short_headers)
27
- data_table = pd.read_html(res.text)[0].iloc[:, 1:] # 实时货币行情
28
- data_table.columns = ["中文名称", "英文名称", "最新", "最高", "最低", "涨跌额", "涨跌幅", "时间"]
29
- name_code_dict = dict(
30
- zip(
31
- data_table["中文名称"].tolist(),
32
- [
33
- item.lower().replace("/", "-")
34
- for item in data_table["英文名称"].tolist()
35
- ],
36
- )
37
- )
38
- return name_code_dict
39
-
40
-
41
- def currency_hist_area_index_name_code(symbol: str = "usd-jpy") -> dict:
42
- """
43
- 指定 symbol 的所有指数和代码
44
- https://cn.investing.com/indices/
45
- :param symbol: 指定的国家或地区;ak._get_global_country_name_url() 函数返回的国家或地区的名称
46
- :type symbol: str
47
- :return: 指定 area 的所有指数和代码
48
- :rtype: dict
49
- """
50
- pd.set_option("mode.chained_assignment", None)
51
- url = f"https://cn.investing.com/currencies/{symbol}-historical-data"
52
- r = requests.get(url)
53
- soup = BeautifulSoup(r.text, "lxml")
54
- data_text = soup.find("script", attrs={"id": "__NEXT_DATA__"}).text
55
- data_json = json.loads(data_text)
56
- code = json.loads(data_json["props"]["pageProps"]["state"])["dataStore"][
57
- "pageInfoStore"
58
- ]["identifiers"]["instrument_id"]
59
- return code
60
-
61
-
62
- def currency_hist(
63
- symbol: str = "usd-jpy",
64
- period: str = "每日",
65
- start_date: str = "20030101",
66
- end_date: str = "20220808",
67
- ) -> pd.DataFrame:
68
- """
69
- 外汇历史数据, 注意获取数据区间的长短, 输入任意货币对, 具体能否获取, 通过 currency_name_code_dict 查询
70
- https://www.investing.com/
71
- :param symbol: 货币对
72
- :type symbol: str
73
- :param period: choice of {"每日", "每周", "每月"}
74
- :type period: str
75
- :param start_date: 日期
76
- :type start_date: str
77
- :param end_date: 日期
78
- :type end_date: str
79
- :return: 货币对历史数据
80
- :rtype: pandas.DataFrame
81
- """
82
- start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
83
- end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
84
- code = currency_hist_area_index_name_code(symbol)
85
- url = f"https://api.investing.com/api/financialdata/historical/{code}"
86
- period_map = {"每日": "Daily", "每周": "Weekly", "每月": "Monthly"}
87
- params = {
88
- "start-date": start_date,
89
- "end-date": end_date,
90
- "time-frame": period_map[period],
91
- "add-missing-rows": "false",
92
- }
93
- headers = {
94
- "accept": "application/json, text/plain, */*",
95
- "accept-encoding": "gzip, deflate, br",
96
- "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
97
- "cache-control": "no-cache",
98
- "domain-id": "cn",
99
- "origin": "https://cn.investing.com",
100
- "pragma": "no-cache",
101
- "referer": "https://cn.investing.com/",
102
- "sec-ch-ua": '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"',
103
- "sec-ch-ua-mobile": '"?0"',
104
- "sec-ch-ua-platform": '"Windows"',
105
- "sec-fetch-dest": "empty",
106
- "sec-fetch-mode": "cors",
107
- "sec-fetch-site": "same-site",
108
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
109
- }
110
- r = requests.get(url, params=params, headers=headers)
111
- data_json = r.json()
112
- df_data = pd.DataFrame(data_json["data"])
113
- df_data.columns = [
114
- "-",
115
- "-",
116
- "-",
117
- "日期",
118
- "-",
119
- "-",
120
- "-",
121
- "-",
122
- "-",
123
- "交易量",
124
- "-",
125
- "收盘",
126
- "开盘",
127
- "高",
128
- "低",
129
- "涨跌幅",
130
- ]
131
- df_data = df_data[["日期", "收盘", "开盘", "高", "低", "交易量", "涨跌幅"]]
132
- df_data["日期"] = pd.to_datetime(df_data["日期"]).dt.date
133
- df_data["收盘"] = pd.to_numeric(df_data["收盘"])
134
- df_data["开盘"] = pd.to_numeric(df_data["开盘"])
135
- df_data["高"] = pd.to_numeric(df_data["高"])
136
- df_data["低"] = pd.to_numeric(df_data["低"])
137
- df_data["交易量"] = pd.to_numeric(df_data["交易量"])
138
- df_data["涨跌幅"] = pd.to_numeric(df_data["涨跌幅"])
139
- df_data.sort_values("日期", inplace=True)
140
- df_data.reset_index(inplace=True, drop=True)
141
- return df_data
142
-
143
-
144
- def _currency_single() -> pd.DataFrame:
145
- """
146
- 英为财情-外汇-单种货币兑换汇率-单种货币列表
147
- :return: 单种货币列表
148
- :rtype: pandas.DataFrame
149
- """
150
- url = "https://cn.investing.com/currencies/single-currency-crosses"
151
- res = requests.post(url, headers=short_headers)
152
- soup = BeautifulSoup(res.text, "lxml")
153
- name_url_option_list = soup.find(
154
- "select", attrs={"class": "newInput selectBox"}
155
- ).find_all("option")
156
- temp_df = pd.DataFrame(
157
- [item.get_text().split("-", 1) for item in name_url_option_list]
158
- )
159
- temp_df.columns = ["short_name", "name"]
160
- temp_df["short_name"] = temp_df["short_name"].str.strip()
161
- temp_df["name"] = temp_df["name"].str.strip()
162
- temp_df["code"] = [item["value"] for item in name_url_option_list]
163
- return temp_df
164
-
165
-
166
- def currency_name_code(symbol: str = "usd/jpy") -> pd.DataFrame:
16
+ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
167
17
  """
168
- 当前所有可兑换货币对
169
- :param symbol: "usd/jpy"
18
+ 指定货币的所有可获取货币对的数据
19
+ https://cn.investing.com/currencies/cny-jmd
20
+ :param symbol: 指定货币
170
21
  :type symbol: str
171
- :return: 中英文货币对
22
+ :return: 指定货币的所有可获取货币对的数据
172
23
  :rtype: pandas.DataFrame
173
- name code
174
- 0 欧元/美元 eur-usd
175
- 1 英镑/美元 gbp-usd
176
- 2 美元/日元 usd-jpy
177
- 3 美元/瑞士法郎 usd-chf
178
- 4 澳大利亚元/美元 aud-usd
179
- .. ... ...
180
- 268 日元/新加坡元 jpy-sgd
181
- 269 科威特第纳尔/日元 kwd-jpy
182
- 270 日元/白俄罗斯卢布 jpy-byn
183
- 271 日元/乌克兰赫里纳 jpy-uah
184
- 272 日元/土耳其里拉 jpy-try
185
24
  """
186
- symbol = symbol.upper()
187
- currency_df = _currency_single()
188
- url = "https://cn.investing.com/currencies/Service/ChangeCurrency"
189
- params = {
190
- "session_uniq_id": "53bee677662a2336ec07b40738753fc1",
191
- "currencies": currency_df[
192
- currency_df["short_name"] == symbol.split("/")[0]
193
- ]["code"].values[0],
194
- }
195
- headers = {
196
- "Accept": "application/json, text/javascript, */*; q=0.01",
197
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
198
- "Cache-Control": "no-cache",
199
- "Connection": "keep-alive",
200
- "Host": "cn.investing.com",
201
- "Pragma": "no-cache",
202
- "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
203
- "Sec-Fetch-Mode": "cors",
204
- "Sec-Fetch-Site": "same-origin",
205
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
206
- "X-Requested-With": "XMLHttpRequest",
207
- }
208
- r = requests.get(url, params=params, headers=headers)
209
- temp_df = pd.read_html(r.json()["HTML"])[0].iloc[:, 1:]
210
- temp_df.rename(columns={"名称.1": "简称"}, inplace=True)
211
- temp_df["pids"] = [item[:-1] for item in r.json()["pids"]]
212
- name_code_dict_one = dict(
213
- zip(
214
- temp_df["名称"].tolist(),
215
- [
216
- item.lower().replace("/", "-")
217
- for item in temp_df["简称"].tolist()
218
- ],
219
- )
220
- )
221
- params = {
222
- "session_uniq_id": "53bee677662a2336ec07b40738753fc1",
223
- "currencies": currency_df[
224
- currency_df["short_name"] == symbol.split("/")[1]
225
- ]["code"].values[0],
226
- }
25
+ region_code = []
26
+ region_name = []
227
27
  headers = {
228
28
  "Accept": "application/json, text/javascript, */*; q=0.01",
229
29
  # "Accept-Encoding": "gzip, deflate, br",
@@ -235,64 +35,21 @@ def currency_name_code(symbol: str = "usd/jpy") -> pd.DataFrame:
235
35
  "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
236
36
  "Sec-Fetch-Mode": "cors",
237
37
  "Sec-Fetch-Site": "same-origin",
238
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
38
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
39
+ "Chrome/79.0.3945.130 Safari/537.36",
239
40
  "X-Requested-With": "XMLHttpRequest",
240
41
  }
241
- r = requests.get(url, params=params, headers=headers)
242
- temp_df = pd.read_html(r.json()["HTML"])[0].iloc[:, 1:]
243
- temp_df.rename(columns={"名称.1": "简称"}, inplace=True)
244
- temp_df["pids"] = [item[:-1] for item in r.json()["pids"]]
245
- name_code_dict_two = dict(
246
- zip(
247
- temp_df["名称"].tolist(),
248
- [
249
- item.lower().replace("/", "-")
250
- for item in temp_df["简称"].tolist()
251
- ],
252
- )
253
- )
254
- name_code_dict_one.update(name_code_dict_two)
255
- temp_df = pd.DataFrame.from_dict(
256
- name_code_dict_one, orient="index"
257
- ).reset_index()
258
- temp_df.columns = ["name", "code"]
259
- return temp_df
260
-
261
-
262
- def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
263
- """
264
- 指定货币的所有可获取货币对的数据
265
- https://cn.investing.com/currencies/cny-jmd
266
- :param symbol: 指定货币
267
- :type symbol: str
268
- :return: 指定货币的所有可获取货币对的数据
269
- :rtype: pandas.DataFrame
270
- """
271
- region_code = []
272
- region_name = []
273
42
 
274
43
  def has_data_sml_id_but_no_id(tag):
275
44
  return tag.has_attr("data-sml-id") and not tag.has_attr("title")
276
45
 
46
+ tqdm = get_tqdm()
277
47
  for region_id in tqdm(["4", "1", "8", "7", "6"], leave=False):
278
48
  url = "https://cn.investing.com/currencies/Service/region"
279
49
  params = {"region_ID": region_id, "currency_ID": "false"}
280
- headers = {
281
- "Accept": "application/json, text/javascript, */*; q=0.01",
282
- # "Accept-Encoding": "gzip, deflate, br",
283
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
284
- "Cache-Control": "no-cache",
285
- "Connection": "keep-alive",
286
- "Host": "cn.investing.com",
287
- "Pragma": "no-cache",
288
- "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
289
- "Sec-Fetch-Mode": "cors",
290
- "Sec-Fetch-Site": "same-origin",
291
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
292
- "X-Requested-With": "XMLHttpRequest",
293
- }
50
+
294
51
  r = requests.get(url, params=params, headers=headers)
295
- soup = BeautifulSoup(r.text, "lxml")
52
+ soup = BeautifulSoup(r.text, features="lxml")
296
53
  region_code.extend(
297
54
  [
298
55
  item["continentid"] + "-" + region_id
@@ -300,10 +57,7 @@ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
300
57
  ]
301
58
  )
302
59
  region_name.extend(
303
- [
304
- item.find("i").text
305
- for item in soup.find_all(has_data_sml_id_but_no_id)
306
- ]
60
+ [item.find("i").text for item in soup.find_all(has_data_sml_id_but_no_id)]
307
61
  )
308
62
 
309
63
  name_id_map = dict(zip(region_name, region_code))
@@ -313,34 +67,14 @@ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
313
67
  "currency_ID": name_id_map[symbol].split("-")[0],
314
68
  }
315
69
  r = requests.get(url, params=params, headers=headers)
316
- soup = BeautifulSoup(r.text, "lxml")
70
+ soup = BeautifulSoup(r.text, features="lxml")
317
71
 
318
- temp_code = [
319
- item["href"].split("/")[-1] for item in soup.find_all("a")
320
- ] # need
321
- temp_name = [
322
- item["title"].replace(" ", "-") for item in soup.find_all("a")
323
- ]
324
- temp_df = pd.DataFrame([temp_name, temp_code], index=["name", "code"]).T
72
+ temp_code = [item["href"].split("/")[-1] for item in soup.find_all("a")] # need
73
+ temp_name = [item["title"].replace(" ", "-") for item in soup.find_all("a")]
74
+ temp_df = pd.DataFrame(data=[temp_name, temp_code], index=["name", "code"]).T
325
75
  return temp_df
326
76
 
327
77
 
328
78
  if __name__ == "__main__":
329
- currency_hist_area_index_name_code_df = currency_hist_area_index_name_code(
330
- symbol="usd-jpy"
331
- )
332
- print(currency_hist_area_index_name_code_df)
333
-
334
79
  currency_pair_map_df = currency_pair_map(symbol="人民币")
335
80
  print(currency_pair_map_df)
336
-
337
- currency_name_code_df = currency_name_code(symbol="cny/dkk")
338
- print(currency_name_code_df)
339
-
340
- currency_hist_df = currency_hist(
341
- symbol="usd-jpy",
342
- period="每日",
343
- start_date="20050101",
344
- end_date="20220808",
345
- )
346
- print(currency_hist_df)