akshare 1.12.99__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 (236) hide show
  1. akshare/__init__.py +441 -138
  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_info_cm.py +28 -8
  10. akshare/bond/bond_issue_cninfo.py +73 -30
  11. akshare/bond/bond_zh_cov.py +1 -1
  12. akshare/bond/bond_zh_sina.py +57 -51
  13. akshare/cal/__init__.py +0 -0
  14. akshare/cal/rv.py +170 -0
  15. akshare/cost/cost_living.py +7 -5
  16. akshare/currency/currency_safe.py +7 -6
  17. akshare/data/cninfo.js +15 -0
  18. akshare/datasets.py +10 -21
  19. akshare/economic/macro_bank.py +95 -653
  20. akshare/economic/macro_china.py +772 -1024
  21. akshare/economic/macro_china_hk.py +65 -243
  22. akshare/economic/macro_china_nbs.py +24 -7
  23. akshare/economic/macro_constitute.py +17 -12
  24. akshare/economic/macro_euro.py +13 -6
  25. akshare/economic/macro_finance_ths.py +133 -0
  26. akshare/economic/macro_info_ws.py +100 -0
  27. akshare/economic/macro_japan.py +5 -4
  28. akshare/economic/macro_other.py +12 -9
  29. akshare/economic/macro_usa.py +376 -1940
  30. akshare/economic/marco_cnbs.py +11 -6
  31. akshare/energy/energy_carbon.py +94 -125
  32. akshare/event/migration.py +3 -2
  33. akshare/exceptions.py +43 -0
  34. akshare/file_fold/calendar.json +245 -2
  35. akshare/fortune/fortune_500.py +15 -48
  36. akshare/fund/fund_amac.py +157 -75
  37. akshare/fund/fund_em.py +191 -184
  38. akshare/fund/fund_etf_em.py +16 -15
  39. akshare/fund/fund_etf_sina.py +71 -23
  40. akshare/fund/fund_etf_ths.py +93 -0
  41. akshare/fund/fund_fee_em.py +98 -0
  42. akshare/fund/fund_portfolio_em.py +60 -50
  43. akshare/fund/fund_rank_em.py +91 -82
  44. akshare/fund/fund_report_cninfo.py +63 -48
  45. akshare/fund/fund_scale_sina.py +20 -10
  46. akshare/fund/fund_xq.py +139 -109
  47. akshare/futures/cons.py +8 -31
  48. akshare/futures/cot.py +185 -137
  49. akshare/futures/futures_basis.py +97 -32
  50. akshare/futures/futures_comm_ctp.py +37 -0
  51. akshare/futures/futures_comm_qihuo.py +74 -45
  52. akshare/futures/futures_daily_bar.py +121 -184
  53. akshare/futures/futures_hf_em.py +66 -61
  54. akshare/futures/futures_hq_sina.py +79 -61
  55. akshare/futures/futures_index_ccidx.py +6 -3
  56. akshare/futures/futures_inventory_99.py +61 -272
  57. akshare/futures/futures_news_shmet.py +4 -2
  58. akshare/futures/futures_roll_yield.py +12 -25
  59. akshare/futures/futures_spot_stock_em.py +19 -13
  60. akshare/futures/futures_stock_js.py +14 -12
  61. akshare/futures/futures_to_spot.py +38 -33
  62. akshare/futures/futures_warehouse_receipt.py +75 -71
  63. akshare/futures/futures_zh_sina.py +5 -5
  64. akshare/futures/symbol_var.py +18 -13
  65. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  66. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  67. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  68. akshare/futures_derivative/futures_cot_sina.py +26 -19
  69. akshare/futures_derivative/futures_spot_sys.py +21 -8
  70. akshare/fx/currency_investing.py +19 -285
  71. akshare/index/index_cflp.py +29 -26
  72. akshare/index/index_cni.py +86 -88
  73. akshare/index/index_cons.py +26 -10
  74. akshare/index/index_cx.py +248 -47
  75. akshare/index/index_drewry.py +17 -16
  76. akshare/index/index_option_qvix.py +329 -0
  77. akshare/index/index_research_fund_sw.py +134 -0
  78. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  79. akshare/index/index_spot.py +9 -5
  80. akshare/index/index_stock_hk.py +35 -16
  81. akshare/index/index_stock_us_sina.py +1 -1
  82. akshare/index/index_stock_zh.py +180 -89
  83. akshare/index/index_stock_zh_csindex.py +15 -369
  84. akshare/index/index_sw.py +62 -34
  85. akshare/index/index_yw.py +46 -23
  86. akshare/index/index_zh_a_scope.py +48 -0
  87. akshare/index/index_zh_em.py +6 -4
  88. akshare/interest_rate/interbank_rate_em.py +14 -9
  89. akshare/movie/artist_yien.py +32 -5
  90. akshare/movie/movie_yien.py +92 -18
  91. akshare/movie/video_yien.py +28 -5
  92. akshare/news/news_baidu.py +78 -44
  93. akshare/news/news_cctv.py +38 -38
  94. akshare/news/news_stock.py +6 -3
  95. akshare/nlp/nlp_interface.py +7 -8
  96. akshare/option/cons.py +11 -11
  97. akshare/option/option_comm_qihuo.py +86 -0
  98. akshare/option/option_commodity.py +178 -51
  99. akshare/option/option_daily_stats_sse_szse.py +146 -0
  100. akshare/option/option_em.py +147 -138
  101. akshare/option/option_finance_sina.py +160 -137
  102. akshare/option/option_lhb_em.py +62 -56
  103. akshare/option/option_risk_indicator_sse.py +17 -14
  104. akshare/other/other_car_cpca.py +934 -0
  105. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  106. akshare/qdii/__init__.py +0 -0
  107. akshare/qdii/qdii_jsl.py +233 -0
  108. akshare/request.py +117 -0
  109. akshare/spot/spot_hog_soozhu.py +232 -0
  110. akshare/spot/spot_price_qh.py +121 -0
  111. akshare/spot/spot_sge.py +63 -10
  112. akshare/stock/stock_allotment_cninfo.py +10 -9
  113. akshare/stock/stock_board_concept_em.py +23 -14
  114. akshare/stock/stock_board_industry_em.py +40 -34
  115. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  116. akshare/stock/stock_cg_guarantee.py +41 -51
  117. akshare/stock/stock_cg_lawsuit.py +36 -35
  118. akshare/stock/stock_dividend_cninfo.py +12 -6
  119. akshare/stock/stock_dzjy_em.py +347 -260
  120. akshare/stock/stock_fund_em.py +332 -84
  121. akshare/stock/stock_hk_famous.py +108 -0
  122. akshare/stock/stock_hk_sina.py +8 -7
  123. akshare/stock/stock_hold_control_cninfo.py +100 -15
  124. akshare/stock/stock_hold_control_em.py +4 -3
  125. akshare/stock/stock_hold_num_cninfo.py +18 -12
  126. akshare/stock/stock_hot_rank_em.py +2 -1
  127. akshare/stock/stock_hot_search_baidu.py +5 -2
  128. akshare/stock/stock_industry_cninfo.py +24 -18
  129. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  130. akshare/stock/stock_industry_sw.py +9 -10
  131. akshare/stock/stock_info.py +25 -15
  132. akshare/stock/stock_info_em.py +5 -2
  133. akshare/stock/stock_intraday_em.py +5 -2
  134. akshare/stock/stock_intraday_sina.py +22 -18
  135. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  136. akshare/stock/stock_new_cninfo.py +32 -19
  137. akshare/stock/stock_news_cx.py +39 -0
  138. akshare/stock/stock_profile_cninfo.py +9 -8
  139. akshare/stock/stock_rank_forecast.py +8 -6
  140. akshare/stock/stock_share_changes_cninfo.py +18 -14
  141. akshare/stock/stock_share_hold.py +24 -19
  142. akshare/stock/stock_summary.py +54 -26
  143. akshare/stock/stock_us_famous.py +15 -6
  144. akshare/stock/stock_us_pink.py +7 -5
  145. akshare/stock/stock_us_sina.py +15 -12
  146. akshare/stock/stock_xq.py +38 -12
  147. akshare/stock/stock_zh_a_sina.py +53 -78
  148. akshare/stock/stock_zh_b_sina.py +32 -55
  149. akshare/stock/stock_zh_kcb_report.py +11 -9
  150. akshare/stock/stock_zh_kcb_sina.py +67 -64
  151. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  152. akshare/stock_feature/stock_a_high_low.py +5 -2
  153. akshare/stock_feature/stock_a_indicator.py +12 -9
  154. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  155. akshare/stock_feature/stock_account_em.py +58 -40
  156. akshare/stock_feature/stock_analyst_em.py +36 -27
  157. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  158. akshare/stock_feature/stock_comment_em.py +118 -85
  159. akshare/stock_feature/stock_concept_futu.py +183 -0
  160. akshare/stock_feature/stock_cyq_em.py +58 -54
  161. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  162. akshare/stock_feature/stock_esg_sina.py +216 -11
  163. akshare/stock_feature/stock_fhps_em.py +60 -25
  164. akshare/stock_feature/stock_fhps_ths.py +25 -6
  165. akshare/stock_feature/stock_fund_flow.py +38 -25
  166. akshare/stock_feature/stock_gdfx_em.py +180 -95
  167. akshare/stock_feature/stock_gdhs.py +73 -49
  168. akshare/stock_feature/stock_gpzy_em.py +78 -46
  169. akshare/stock_feature/stock_hist_em.py +55 -23
  170. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  171. akshare/stock_feature/stock_hsgt_em.py +184 -452
  172. akshare/stock_feature/stock_info.py +52 -29
  173. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  174. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  175. akshare/stock_feature/stock_jgdy_em.py +41 -38
  176. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  177. akshare/stock_feature/stock_lhb_em.py +135 -71
  178. akshare/stock_feature/stock_lhb_sina.py +93 -46
  179. akshare/stock_feature/stock_margin_em.py +102 -0
  180. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  181. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  182. akshare/stock_feature/stock_market_legu.py +13 -8
  183. akshare/stock_feature/stock_pankou_em.py +72 -34
  184. akshare/stock_feature/stock_report_em.py +244 -54
  185. akshare/stock_feature/stock_research_report_em.py +48 -19
  186. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  187. akshare/stock_feature/stock_sy_em.py +86 -33
  188. akshare/stock_feature/stock_technology_ths.py +152 -120
  189. akshare/stock_feature/stock_tfp_em.py +35 -13
  190. akshare/stock_feature/stock_three_report_em.py +119 -77
  191. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  192. akshare/stock_feature/stock_value_em.py +83 -0
  193. akshare/stock_feature/stock_wencai.py +21 -9
  194. akshare/stock_feature/stock_yjyg_em.py +63 -28
  195. akshare/stock_feature/stock_zf_pg.py +61 -38
  196. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  197. akshare/stock_feature/stock_ztb_em.py +62 -40
  198. akshare/stock_fundamental/stock_finance.py +150 -58
  199. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  200. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  201. akshare/stock_fundamental/stock_notice.py +29 -15
  202. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  203. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  204. akshare/stock_fundamental/stock_register_em.py +448 -0
  205. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  206. akshare/stock_fundamental/stock_zygc.py +10 -8
  207. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  208. akshare/tool/trade_date_hist.py +4 -3
  209. akshare/utils/cons.py +10 -0
  210. akshare/utils/context.py +43 -0
  211. akshare/utils/demjson.py +2 -2
  212. akshare/utils/func.py +26 -0
  213. akshare/utils/tqdm.py +13 -3
  214. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  215. akshare-1.15.72.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  217. tests/test_func.py +3 -5
  218. akshare/bond/bond_futures.py +0 -50
  219. akshare/bond/bond_investing.py +0 -139
  220. akshare/crypto/crypto_hist_investing.py +0 -249
  221. akshare/fortune/fortune_it_juzi.py +0 -123
  222. akshare/futures/futures_international.py +0 -170
  223. akshare/futures/futures_news_baidu.py +0 -54
  224. akshare/futures/inventory_data.py +0 -100
  225. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  226. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  227. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  228. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  229. akshare/index/index_fear_greed_funddb.py +0 -71
  230. akshare/index/index_investing.py +0 -232
  231. akshare/sport/sport_olympic_winter.py +0 -39
  232. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  233. akshare/stock_fundamental/stock_register.py +0 -292
  234. akshare-1.12.99.dist-info/RECORD +0 -374
  235. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
akshare/fund/fund_xq.py CHANGED
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/01/16 23:40
4
+ Date: 2024/10/27 22:30
5
5
  Desc: 雪球基金-基金详情
6
6
  https://danjuanfunds.com/funding/003545
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
11
12
 
12
13
  def fund_individual_basic_info_xq(
13
- symbol: str = "000001", timeout: float = None
14
+ symbol: str = "000001", timeout: float = None
14
15
  ) -> pd.DataFrame:
15
16
  """
16
17
  雪球基金-基金详情
@@ -24,52 +25,58 @@ def fund_individual_basic_info_xq(
24
25
  """
25
26
  url = f"https://danjuanfunds.com/djapi/fund/{symbol}"
26
27
  headers = {
27
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
28
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
29
+ "Chrome/80.0.3987.149 Safari/537.36"
28
30
  }
29
31
  r = requests.get(url, headers=headers, timeout=timeout)
30
32
  json_data = r.json()["data"]
31
33
  temp_df = pd.json_normalize(json_data)
32
- temp_df.rename(columns={
33
- "fd_code": "基金代码",
34
- "fd_name": "基金名称",
35
- "fd_full_name": "基金全称",
36
- "found_date": "成立时间",
37
- "totshare": "最新规模",
38
- "keeper_name": "基金公司",
39
- "manager_name": "基金经理",
40
- "trup_name": "托管银行",
41
- "type_desc": "基金类型",
42
- "rating_source": "评级机构",
43
- "rating_desc": "基金评级",
44
- "invest_orientation": "投资策略",
45
- "invest_target": "投资目标",
46
- "performance_bench_mark": "业绩比较基准",
47
- }, inplace=True)
34
+ temp_df.rename(
35
+ columns={
36
+ "fd_code": "基金代码",
37
+ "fd_name": "基金名称",
38
+ "fd_full_name": "基金全称",
39
+ "found_date": "成立时间",
40
+ "totshare": "最新规模",
41
+ "keeper_name": "基金公司",
42
+ "manager_name": "基金经理",
43
+ "trup_name": "托管银行",
44
+ "type_desc": "基金类型",
45
+ "rating_source": "评级机构",
46
+ "rating_desc": "基金评级",
47
+ "invest_orientation": "投资策略",
48
+ "invest_target": "投资目标",
49
+ "performance_bench_mark": "业绩比较基准",
50
+ },
51
+ inplace=True,
52
+ )
48
53
  if "评级机构" not in temp_df.columns:
49
- temp_df['评级机构'] = pd.NA
50
- temp_df = temp_df[[
51
- "基金代码",
52
- "基金名称",
53
- "基金全称",
54
- "成立时间",
55
- "最新规模",
56
- "基金公司",
57
- "基金经理",
58
- "托管银行",
59
- "基金类型",
60
- "评级机构",
61
- "基金评级",
62
- "投资策略",
63
- "投资目标",
64
- "业绩比较基准",
65
- ]]
54
+ temp_df["评级机构"] = pd.NA
55
+ temp_df = temp_df[
56
+ [
57
+ "基金代码",
58
+ "基金名称",
59
+ "基金全称",
60
+ "成立时间",
61
+ "最新规模",
62
+ "基金公司",
63
+ "基金经理",
64
+ "托管银行",
65
+ "基金类型",
66
+ "评级机构",
67
+ "基金评级",
68
+ "投资策略",
69
+ "投资目标",
70
+ "业绩比较基准",
71
+ ]
72
+ ]
66
73
  temp_df = temp_df.T.reset_index()
67
74
  temp_df.columns = ["item", "value"]
68
75
  return temp_df
69
76
 
70
77
 
71
78
  def fund_individual_achievement_xq(
72
- symbol: str = "000001", timeout: float = None
79
+ symbol: str = "000001", timeout: float = None
73
80
  ) -> pd.DataFrame:
74
81
  """
75
82
  雪球基金-基金业绩
@@ -81,11 +88,10 @@ def fund_individual_achievement_xq(
81
88
  :return: 基金业绩
82
89
  :rtype: pandas.DataFrame
83
90
  """
84
- url = (
85
- f"https://danjuanfunds.com/djapi/fundx/base/fund/achievement/{symbol}"
86
- )
91
+ url = f"https://danjuanfunds.com/djapi/fundx/base/fund/achievement/{symbol}"
87
92
  headers = {
88
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
93
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
94
+ "Chrome/80.0.3987.149 Safari/537.36"
89
95
  }
90
96
  r = requests.get(url, headers=headers, timeout=timeout)
91
97
  json_data = r.json()["data"]
@@ -124,7 +130,7 @@ def fund_individual_achievement_xq(
124
130
 
125
131
 
126
132
  def fund_individual_analysis_xq(
127
- symbol: str = "000001", timeout: float = None
133
+ symbol: str = "000001", timeout: float = None
128
134
  ) -> pd.DataFrame:
129
135
  """
130
136
  雪球基金-基金数据分析
@@ -138,7 +144,8 @@ def fund_individual_analysis_xq(
138
144
  """
139
145
  url = f"https://danjuanfunds.com/djapi/fund/base/quote/data/index/analysis/{symbol}"
140
146
  headers = {
141
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
147
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
148
+ "Chrome/80.0.3987.149 Safari/537.36"
142
149
  }
143
150
  r = requests.get(url, headers=headers, timeout=timeout)
144
151
  json_data = r.json()["data"]["index_data_list"]
@@ -161,20 +168,22 @@ def fund_individual_analysis_xq(
161
168
  "年化夏普比率",
162
169
  "最大回撤",
163
170
  ]
164
- temp_df = temp_df.map(
165
- lambda x: x if "%" not in str(x) else x.replace("%", "")
166
- )
171
+ temp_df = temp_df.map(lambda x: x if "%" not in str(x) else x.replace("%", ""))
167
172
  temp_df[["年化波动率", "最大回撤"]] *= 100
168
- temp_df['较同类风险收益比'] = pd.to_numeric(temp_df['较同类风险收益比'], errors="coerce")
169
- temp_df['较同类抗风险波动'] = pd.to_numeric(temp_df['较同类抗风险波动'], errors="coerce")
170
- temp_df['年化波动率'] = pd.to_numeric(temp_df['年化波动率'], errors="coerce")
171
- temp_df['年化夏普比率'] = pd.to_numeric(temp_df['年化夏普比率'], errors="coerce")
172
- temp_df['最大回撤'] = pd.to_numeric(temp_df['最大回撤'], errors="coerce")
173
+ temp_df["较同类风险收益比"] = pd.to_numeric(
174
+ temp_df["较同类风险收益比"], errors="coerce"
175
+ )
176
+ temp_df["较同类抗风险波动"] = pd.to_numeric(
177
+ temp_df["较同类抗风险波动"], errors="coerce"
178
+ )
179
+ temp_df["年化波动率"] = pd.to_numeric(temp_df["年化波动率"], errors="coerce")
180
+ temp_df["年化夏普比率"] = pd.to_numeric(temp_df["年化夏普比率"], errors="coerce")
181
+ temp_df["最大回撤"] = pd.to_numeric(temp_df["最大回撤"], errors="coerce")
173
182
  return temp_df
174
183
 
175
184
 
176
185
  def fund_individual_profit_probability_xq(
177
- symbol: str = "000001", timeout: float = None
186
+ symbol: str = "000001", timeout: float = None
178
187
  ) -> pd.DataFrame:
179
188
  """
180
189
  雪球基金-盈利概率-历史任意时点买入,持有满 X 年,盈利概率 Y%
@@ -186,11 +195,10 @@ def fund_individual_profit_probability_xq(
186
195
  :return: 盈利概率
187
196
  :rtype: pandas.DataFrame
188
197
  """
189
- url = (
190
- f"https://danjuanfunds.com/djapi/fundx/base/fund/profit/ratio/{symbol}"
191
- )
198
+ url = f"https://danjuanfunds.com/djapi/fundx/base/fund/profit/ratio/{symbol}"
192
199
  headers = {
193
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
200
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
201
+ "Chrome/80.0.3987.149 Safari/537.36"
194
202
  }
195
203
  r = requests.get(url, headers=headers, timeout=timeout)
196
204
  json_data = r.json()["data"]["data_list"]
@@ -207,79 +215,97 @@ def fund_individual_profit_probability_xq(
207
215
  "盈利概率",
208
216
  "平均收益",
209
217
  ]
210
- temp_df = temp_df.map(
211
- lambda x: x if "%" not in str(x) else x.replace("%", "")
212
- )
213
- temp_df['盈利概率'] = pd.to_numeric(temp_df['盈利概率'], errors="coerce")
214
- temp_df['平均收益'] = pd.to_numeric(temp_df['平均收益'], errors="coerce")
218
+ temp_df = temp_df.map(lambda x: x if "%" not in str(x) else x.replace("%", ""))
219
+ temp_df["盈利概率"] = pd.to_numeric(temp_df["盈利概率"], errors="coerce")
220
+ temp_df["平均收益"] = pd.to_numeric(temp_df["平均收益"], errors="coerce")
215
221
  return temp_df
216
222
 
217
223
 
218
224
  def fund_individual_detail_info_xq(
219
- symbol: str = "000001", indicator: str = "交易规则", timeout: float = None
225
+ symbol: str = "000001", timeout: float = None
220
226
  ) -> pd.DataFrame:
221
227
  """
222
- 雪球基金-详细信息
228
+ 雪球基金-交易规则
223
229
  https://danjuanfunds.com/djapi/fund/detail/675091
224
230
  :param symbol: 基金代码
225
231
  :type symbol: str
226
- :param indicator: 信息类型; choice of {"交易规则", "持仓资产比例"}
227
- :type symbol: str
228
232
  :param timeout: choice of None or a positive float number
229
233
  :type timeout: float
230
- :return: 盈利概率
234
+ :return: 交易规则
231
235
  :rtype: pandas.DataFrame
232
236
  """
233
237
  url = f"https://danjuanfunds.com/djapi/fund/detail/{symbol}"
234
238
  headers = {
235
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
239
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
240
+ "Chrome/80.0.3987.149 Safari/537.36"
236
241
  }
237
242
  r = requests.get(url, headers=headers, timeout=timeout)
238
243
  json_data = r.json()["data"]
239
-
240
- if indicator == "持仓资产比例":
241
- temp_df = pd.DataFrame.from_dict(
242
- json_data["fund_position"]["chart_list"], orient="columns"
243
- )
244
+ combined_df = None
245
+ rate_type_dict = {
246
+ "declare_rate_table": "买入规则",
247
+ "withdraw_rate_table": "卖出规则",
248
+ "other_rate_table": "其他费用",
249
+ }
250
+ for k, v in rate_type_dict.items():
251
+ temp_df = pd.DataFrame.from_dict(json_data["fund_rates"][k], orient="columns")
252
+ temp_df["rate_type"] = v
244
253
  temp_df = temp_df[
245
254
  [
246
- "type_desc",
247
- "percent",
255
+ "rate_type",
256
+ "name",
257
+ "value",
248
258
  ]
249
259
  ]
250
260
  temp_df.columns = [
251
- "资产类型",
252
- "仓位占比",
261
+ "费用类型",
262
+ "条件或名称",
263
+ "费用",
253
264
  ]
254
- temp_df['仓位占比'] = pd.to_numeric(temp_df['仓位占比'], errors="coerce")
255
- return temp_df
256
- elif indicator == "交易规则":
257
- combined_df = None
258
- rate_type_dict = {
259
- "declare_rate_table": "买入规则",
260
- "withdraw_rate_table": "卖出规则",
261
- "other_rate_table": "其他费用",
262
- }
263
- for k, v in rate_type_dict.items():
264
- temp_df = pd.DataFrame.from_dict(
265
- json_data["fund_rates"][k], orient="columns"
266
- )
267
- temp_df["rate_type"] = v
268
- temp_df = temp_df[
269
- [
270
- "rate_type",
271
- "name",
272
- "value",
273
- ]
274
- ]
275
- temp_df.columns = [
276
- "费用类型",
277
- "条件或名称",
278
- "费用",
279
- ]
280
- combined_df = pd.concat([combined_df, temp_df], ignore_index=True)
281
- combined_df['费用'] = pd.to_numeric(combined_df['费用'], errors="coerce")
282
- return combined_df
265
+ combined_df = pd.concat(objs=[combined_df, temp_df], ignore_index=True)
266
+ combined_df["费用"] = pd.to_numeric(combined_df["费用"], errors="coerce")
267
+ return combined_df
268
+
269
+
270
+ def fund_individual_detail_hold_xq(
271
+ symbol: str = "002804", date: str = "20231231", timeout: float = None
272
+ ) -> pd.DataFrame:
273
+ """
274
+ 雪球基金-持仓
275
+ https://danjuanfunds.com/rn/fund-detail/archive?id=103&code=002804
276
+ :param symbol: 基金代码
277
+ :type symbol: str
278
+ :param date: 财报日期
279
+ :type date: str
280
+ :param timeout: choice of None or a positive float number
281
+ :type timeout: float
282
+ :return: 雪球基金-持仓
283
+ :rtype: pandas.DataFrame
284
+ """
285
+ url = "https://danjuanfunds.com/djapi/fundx/base/fund/record/asset/percent"
286
+ headers = {
287
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
288
+ "Chrome/80.0.3987.149 Safari/537.36"
289
+ }
290
+ params = {
291
+ "fund_code": f"{symbol}",
292
+ "report_date": f"{'-'.join([date[:4], date[4:6], date[6:]])}",
293
+ }
294
+ r = requests.get(url, headers=headers, params=params, timeout=timeout)
295
+ data_json = r.json()
296
+ temp_df = pd.DataFrame.from_dict(data_json["data"]["chart_list"], orient="columns")
297
+ temp_df = temp_df[
298
+ [
299
+ "type_desc",
300
+ "percent",
301
+ ]
302
+ ]
303
+ temp_df.columns = [
304
+ "资产类型",
305
+ "仓位占比",
306
+ ]
307
+ temp_df["仓位占比"] = pd.to_numeric(temp_df["仓位占比"], errors="coerce")
308
+ return temp_df
283
309
 
284
310
 
285
311
  if __name__ == "__main__":
@@ -292,11 +318,15 @@ if __name__ == "__main__":
292
318
  fund_individual_analysis_xq_df = fund_individual_analysis_xq(symbol="000001")
293
319
  print(fund_individual_analysis_xq_df)
294
320
 
295
- fund_individual_profit_probability_xq_df = fund_individual_profit_probability_xq(symbol="000001")
321
+ fund_individual_profit_probability_xq_df = fund_individual_profit_probability_xq(
322
+ symbol="000001"
323
+ )
296
324
  print(fund_individual_profit_probability_xq_df)
297
325
 
298
- fund_individual_detail_info_xq_df = fund_individual_detail_info_xq(indicator="交易规则")
326
+ fund_individual_detail_info_xq_df = fund_individual_detail_info_xq(symbol="000001")
299
327
  print(fund_individual_detail_info_xq_df)
300
328
 
301
- fund_individual_detail_info_xq_df = fund_individual_detail_info_xq(indicator="持仓资产比例")
302
- print(fund_individual_detail_info_xq_df)
329
+ fund_individual_detail_hold_xq_df = fund_individual_detail_hold_xq(
330
+ symbol="002804", date="20231231"
331
+ )
332
+ print(fund_individual_detail_hold_xq_df)
akshare/futures/cons.py CHANGED
@@ -64,30 +64,6 @@ inventory_temp_headers = {
64
64
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
65
65
  }
66
66
 
67
- sample_headers = {
68
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
69
- "Host": "service.99qh.com",
70
- "Origin": "http://service.99qh.com",
71
- "Referer": "http://www.99qh.com/d/store.aspx",
72
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
73
- }
74
-
75
- qh_headers = {
76
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
77
- "Accept-Encoding": "gzip, deflate",
78
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
79
- "Cache-Control": "no-cache",
80
- "Connection": "keep-alive",
81
- "Content-Length": "8429",
82
- "Content-Type": "application/x-www-form-urlencoded",
83
- "Host": "service.99qh.com",
84
- "Origin": "http://service.99qh.com",
85
- "Pragma": "no-cache",
86
- "Cookie": "__utma=181566328.985082941.1656754961.1656754961.1656754961.1; __utmc=181566328; __utmz=181566328.1656754961.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ASP.NET_SessionId=42k0mpzfu3fv5cxqmtrwc20y; tgw_l7_route=b26adbec28f4b4e1f7290033d59c43a7; __utmt=1; __utmb=181566328.2.10.1656754961",
87
- "Referer": "http://service.99qh.com/Storage/Storage.aspx?page=99qh",
88
- "Upgrade-Insecure-Requests": "1",
89
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",
90
- }
91
67
  # 奇货可查
92
68
  QHKC_INDEX_URL = "https://www.qhkch.com/ajax/index_show.php"
93
69
  QHKC_INDEX_TREND_URL = "https://qhkch.com/ajax/indexes_trend.php"
@@ -100,7 +76,6 @@ QHKC_FUND_BIG_CHANGE_URL = "https://qhkch.com/ajax/fund_big_chge.php"
100
76
  QHKC_TOOL_FOREIGN_URL = "https://qhkch.com/ajax/toolbox_foreign.php"
101
77
  QHKC_TOOL_GDP_URL = "https://qhkch.com/dist/views/toolbox/gdp.html?v=1.10.7.1"
102
78
 
103
-
104
79
  # 键值对: 键为交易所代码, 值为具体合约代码
105
80
  market_exchange_symbols = {
106
81
  "cffex": ["IF", "IC", "IM", "IH", "T", "TF", "TS", "TL"],
@@ -126,6 +101,7 @@ market_exchange_symbols = {
126
101
  "EB", # 20191009
127
102
  "PG",
128
103
  "LH", # 20210108 生猪期货
104
+ "LG", # 20241118 原木期货
129
105
  ],
130
106
  "czce": [
131
107
  "WH",
@@ -228,7 +204,7 @@ dce_headers = {
228
204
  SYS_SPOT_PRICE_URL = "http://www.100ppi.com/sf/day-{}.html"
229
205
  SYS_SPOT_PRICE_LATEST_URL = "http://www.100ppi.com/sf/"
230
206
 
231
- SHFE_VOL_RANK_URL = "http://www.shfe.com.cn/data/dailydata/kx/pm%s.dat"
207
+ SHFE_VOL_RANK_URL = "https://tsite.shfe.com.cn/data/dailydata/kx/pm%s.dat"
232
208
  CFFEX_VOL_RANK_URL = "http://www.cffex.com.cn/sj/ccpm/%s/%s/%s_1.csv"
233
209
  DCE_VOL_RANK_URL_1 = "http://www.dce.com.cn/publicweb/quotesdata/exportMemberDealPosiQuotesData.html?memberDealPosiQuotes.variety=%s&memberDealPosiQuotes.trade_type=0&contract.contract_id=%s&contract.variety_id=%s&year=%s&month=%s&day=%s&exportFlag=txt"
234
210
  DCE_VOL_RANK_URL_2 = "http://www.dce.com.cn/publicweb/quotesdata/memberDealPosiQuotes.html?memberDealPosiQuotes.variety=%s&memberDealPosiQuotes.trade_type=0&contract.contract_id=all&contract.variety_id=%s&year=%s&month=%s&day=%s"
@@ -240,8 +216,8 @@ CZCE_VOL_RANK_URL_3 = (
240
216
 
241
217
  DCE_RECEIPT_URL = "http://www.dce.com.cn/publicweb/quotesdata/wbillWeeklyQuotes.html"
242
218
 
243
- SHFE_RECEIPT_URL_1 = "http://www.shfe.com.cn/data/dailydata/%sdailystock.html"
244
- SHFE_RECEIPT_URL_2 = "http://www.shfe.com.cn/data/dailydata/%sdailystock.dat"
219
+ SHFE_RECEIPT_URL_1 = "http://tsite.shfe.com.cn/data/dailydata/%sdailystock.html"
220
+ SHFE_RECEIPT_URL_2 = "http://tsite.shfe.com.cn/data/dailydata/%sdailystock.dat"
245
221
  CZCE_RECEIPT_URL_1 = "http://www.czce.com.cn/cn/exchange/jyxx/sheet/sheet%s.html"
246
222
  CZCE_RECEIPT_URL_2 = "http://www.czce.com.cn/cn/exchange/%s/datawhsheet/%s.htm"
247
223
  CZCE_RECEIPT_URL_3 = (
@@ -249,8 +225,8 @@ CZCE_RECEIPT_URL_3 = (
249
225
  )
250
226
 
251
227
  CFFEX_DAILY_URL = "http://www.cffex.com.cn/fzjy/mrhq/{}/{}/{}_1.csv"
252
- SHFE_DAILY_URL = "http://www.shfe.com.cn/data/dailydata/kx/kx%s.dat"
253
- SHFE_V_WAP_URL = "http://www.shfe.com.cn/data/dailydata/ck/%sdailyTimePrice.dat"
228
+ SHFE_DAILY_URL = "http://tsite.shfe.com.cn/data/dailydata/kx/kx%s.dat"
229
+ SHFE_V_WAP_URL = "http://tsite.shfe.com.cn/data/dailydata/ck/%sdailyTimePrice.dat"
254
230
  DCE_DAILY_URL = "http://www.dce.com.cn//publicweb/quotesdata/dayQuotesCh.html"
255
231
  CZCE_DAILY_URL_1 = "http://www.czce.com.cn/cn/exchange/jyxx/hq/hq%s.html"
256
232
  CZCE_DAILY_URL_2 = "http://www.czce.com.cn/cn/exchange/%s/datadaily/%s.txt"
@@ -412,6 +388,7 @@ DCE_MAP = {
412
388
  "苯乙烯": "EB",
413
389
  "液化石油气": "PG",
414
390
  "生猪": "LH",
391
+ "原木": "LG",
415
392
  }
416
393
 
417
394
 
@@ -478,7 +455,7 @@ def get_calendar():
478
455
  """
479
456
  setting_file_name = "calendar.json"
480
457
  setting_file_path = get_json_path(setting_file_name, __file__)
481
- with open(setting_file_path, "r") as f:
458
+ with open(setting_file_path, "r", encoding="utf-8") as f:
482
459
  data_json = json.load(f)
483
460
  return data_json
484
461