akshare 1.12.99__py3-none-any.whl → 1.15.73__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 +442 -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.73.dist-info}/METADATA +52 -69
  215. akshare-1.15.73.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.73.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.73.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python
2
2
  """
3
- Date: 2023/1/4 10:50
3
+ Date: 2024/6/21 18:00
4
4
  Desc: 新浪财经-股票期权
5
5
  https://stock.finance.sina.com.cn/option/quotes.html
6
6
  期权-中金所-沪深 300 指数
@@ -10,15 +10,18 @@ https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php
10
10
  期权-上交所-500ETF
11
11
  https://stock.finance.sina.com.cn/option/quotes.html
12
12
  """
13
- import json
13
+
14
14
  import datetime
15
+ import json
16
+ from functools import lru_cache
15
17
  from typing import Dict, List, Tuple
16
18
 
19
+ import pandas as pd
17
20
  import requests
18
21
  from bs4 import BeautifulSoup
19
- import pandas as pd
20
22
 
21
23
  from akshare.option.option_em import option_current_em
24
+ from akshare.utils.func import set_df_columns
22
25
 
23
26
 
24
27
  # 期权-中金所-上证50指数
@@ -31,7 +34,7 @@ def option_cffex_sz50_list_sina() -> Dict[str, List[str]]:
31
34
  """
32
35
  url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php/ho/cffex"
33
36
  r = requests.get(url)
34
- soup = BeautifulSoup(r.text, "lxml")
37
+ soup = BeautifulSoup(r.text, features="lxml")
35
38
  symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[0].text
36
39
  temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
37
40
  contract = [item.text for item in temp_attr]
@@ -48,7 +51,7 @@ def option_cffex_hs300_list_sina() -> Dict[str, List[str]]:
48
51
  """
49
52
  url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php"
50
53
  r = requests.get(url)
51
- soup = BeautifulSoup(r.text, "lxml")
54
+ soup = BeautifulSoup(r.text, features="lxml")
52
55
  symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[1].text
53
56
  temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
54
57
  contract = [item.text for item in temp_attr]
@@ -64,7 +67,7 @@ def option_cffex_zz1000_list_sina() -> Dict[str, List[str]]:
64
67
  """
65
68
  url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php/mo/cffex"
66
69
  r = requests.get(url)
67
- soup = BeautifulSoup(r.text, "lxml")
70
+ soup = BeautifulSoup(r.text, features="lxml")
68
71
  symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[2].text
69
72
  temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
70
73
  contract = [item.text for item in temp_attr]
@@ -89,9 +92,7 @@ def option_cffex_sz50_spot_sina(symbol: str = "ho2303") -> pd.DataFrame:
89
92
  }
90
93
  r = requests.get(url, params=params)
91
94
  data_text = r.text
92
- data_json = json.loads(
93
- data_text[data_text.find("{") : data_text.rfind("}") + 1]
94
- )
95
+ data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
95
96
  option_call_df = pd.DataFrame(
96
97
  data_json["result"]["data"]["up"],
97
98
  columns=[
@@ -119,21 +120,29 @@ def option_cffex_sz50_spot_sina(symbol: str = "ho2303") -> pd.DataFrame:
119
120
  "看跌合约-标识",
120
121
  ],
121
122
  )
122
- data_df = pd.concat([option_call_df, option_put_df], axis=1)
123
+ data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
123
124
  data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
124
125
  data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
125
- data_df["看涨合约-最新价"] = pd.to_numeric(data_df["看涨合约-最新价"], errors="coerce")
126
+ data_df["看涨合约-最新价"] = pd.to_numeric(
127
+ data_df["看涨合约-最新价"], errors="coerce"
128
+ )
126
129
  data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
127
130
  data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
128
- data_df["看涨合约-持仓量"] = pd.to_numeric(data_df["看涨合约-持仓量"], errors="coerce")
131
+ data_df["看涨合约-持仓量"] = pd.to_numeric(
132
+ data_df["看涨合约-持仓量"], errors="coerce"
133
+ )
129
134
  data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
130
135
  data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
131
136
  data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
132
137
  data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
133
- data_df["看跌合约-最新价"] = pd.to_numeric(data_df["看跌合约-最新价"], errors="coerce")
138
+ data_df["看跌合约-最新价"] = pd.to_numeric(
139
+ data_df["看跌合约-最新价"], errors="coerce"
140
+ )
134
141
  data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
135
142
  data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
136
- data_df["看跌合约-持仓量"] = pd.to_numeric(data_df["看跌合约-持仓量"], errors="coerce")
143
+ data_df["看跌合约-持仓量"] = pd.to_numeric(
144
+ data_df["看跌合约-持仓量"], errors="coerce"
145
+ )
137
146
  data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
138
147
  return data_df
139
148
 
@@ -156,9 +165,7 @@ def option_cffex_hs300_spot_sina(symbol: str = "io2204") -> pd.DataFrame:
156
165
  }
157
166
  r = requests.get(url, params=params)
158
167
  data_text = r.text
159
- data_json = json.loads(
160
- data_text[data_text.find("{") : data_text.rfind("}") + 1]
161
- )
168
+ data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
162
169
  option_call_df = pd.DataFrame(
163
170
  data_json["result"]["data"]["up"],
164
171
  columns=[
@@ -186,21 +193,29 @@ def option_cffex_hs300_spot_sina(symbol: str = "io2204") -> pd.DataFrame:
186
193
  "看跌合约-标识",
187
194
  ],
188
195
  )
189
- data_df = pd.concat([option_call_df, option_put_df], axis=1)
196
+ data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
190
197
  data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
191
198
  data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
192
- data_df["看涨合约-最新价"] = pd.to_numeric(data_df["看涨合约-最新价"], errors="coerce")
199
+ data_df["看涨合约-最新价"] = pd.to_numeric(
200
+ data_df["看涨合约-最新价"], errors="coerce"
201
+ )
193
202
  data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
194
203
  data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
195
- data_df["看涨合约-持仓量"] = pd.to_numeric(data_df["看涨合约-持仓量"], errors="coerce")
204
+ data_df["看涨合约-持仓量"] = pd.to_numeric(
205
+ data_df["看涨合约-持仓量"], errors="coerce"
206
+ )
196
207
  data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
197
208
  data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
198
209
  data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
199
210
  data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
200
- data_df["看跌合约-最新价"] = pd.to_numeric(data_df["看跌合约-最新价"], errors="coerce")
211
+ data_df["看跌合约-最新价"] = pd.to_numeric(
212
+ data_df["看跌合约-最新价"], errors="coerce"
213
+ )
201
214
  data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
202
215
  data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
203
- data_df["看跌合约-持仓量"] = pd.to_numeric(data_df["看跌合约-持仓量"], errors="coerce")
216
+ data_df["看跌合约-持仓量"] = pd.to_numeric(
217
+ data_df["看跌合约-持仓量"], errors="coerce"
218
+ )
204
219
  data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
205
220
  return data_df
206
221
 
@@ -223,9 +238,7 @@ def option_cffex_zz1000_spot_sina(symbol: str = "mo2208") -> pd.DataFrame:
223
238
  }
224
239
  r = requests.get(url, params=params)
225
240
  data_text = r.text
226
- data_json = json.loads(
227
- data_text[data_text.find("{") : data_text.rfind("}") + 1]
228
- )
241
+ data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
229
242
  option_call_df = pd.DataFrame(
230
243
  data_json["result"]["data"]["up"],
231
244
  columns=[
@@ -253,21 +266,29 @@ def option_cffex_zz1000_spot_sina(symbol: str = "mo2208") -> pd.DataFrame:
253
266
  "看跌合约-标识",
254
267
  ],
255
268
  )
256
- data_df = pd.concat([option_call_df, option_put_df], axis=1)
269
+ data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
257
270
  data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
258
271
  data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
259
- data_df["看涨合约-最新价"] = pd.to_numeric(data_df["看涨合约-最新价"], errors="coerce")
272
+ data_df["看涨合约-最新价"] = pd.to_numeric(
273
+ data_df["看涨合约-最新价"], errors="coerce"
274
+ )
260
275
  data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
261
276
  data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
262
- data_df["看涨合约-持仓量"] = pd.to_numeric(data_df["看涨合约-持仓量"], errors="coerce")
277
+ data_df["看涨合约-持仓量"] = pd.to_numeric(
278
+ data_df["看涨合约-持仓量"], errors="coerce"
279
+ )
263
280
  data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
264
281
  data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
265
282
  data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
266
283
  data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
267
- data_df["看跌合约-最新价"] = pd.to_numeric(data_df["看跌合约-最新价"], errors="coerce")
284
+ data_df["看跌合约-最新价"] = pd.to_numeric(
285
+ data_df["看跌合约-最新价"], errors="coerce"
286
+ )
268
287
  data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
269
288
  data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
270
- data_df["看跌合约-持仓量"] = pd.to_numeric(data_df["看跌合约-持仓量"], errors="coerce")
289
+ data_df["看跌合约-持仓量"] = pd.to_numeric(
290
+ data_df["看跌合约-持仓量"], errors="coerce"
291
+ )
271
292
  data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
272
293
  return data_df
273
294
 
@@ -283,7 +304,10 @@ def option_cffex_sz50_daily_sina(symbol: str = "ho2303P2350") -> pd.DataFrame:
283
304
  year = datetime.datetime.now().year
284
305
  month = datetime.datetime.now().month
285
306
  day = datetime.datetime.now().day
286
- url = f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}=/FutureOptionAllService.getOptionDayline"
307
+ url = (
308
+ f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
309
+ f"=/FutureOptionAllService.getOptionDayline"
310
+ )
287
311
  params = {"symbol": symbol}
288
312
  r = requests.get(url, params=params)
289
313
  data_text = r.text
@@ -301,12 +325,12 @@ def option_cffex_sz50_daily_sina(symbol: str = "ho2303P2350") -> pd.DataFrame:
301
325
  "volume",
302
326
  ]
303
327
  ]
304
- data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
305
- data_df["open"] = pd.to_numeric(data_df["open"])
306
- data_df["high"] = pd.to_numeric(data_df["high"])
307
- data_df["low"] = pd.to_numeric(data_df["low"])
308
- data_df["close"] = pd.to_numeric(data_df["close"])
309
- data_df["volume"] = pd.to_numeric(data_df["volume"])
328
+ data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
329
+ data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
330
+ data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
331
+ data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
332
+ data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
333
+ data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
310
334
  return data_df
311
335
 
312
336
 
@@ -321,7 +345,10 @@ def option_cffex_hs300_daily_sina(symbol: str = "io2202P4350") -> pd.DataFrame:
321
345
  year = datetime.datetime.now().year
322
346
  month = datetime.datetime.now().month
323
347
  day = datetime.datetime.now().day
324
- url = f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}=/FutureOptionAllService.getOptionDayline"
348
+ url = (
349
+ f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
350
+ f"=/FutureOptionAllService.getOptionDayline"
351
+ )
325
352
  params = {"symbol": symbol}
326
353
  r = requests.get(url, params=params)
327
354
  data_text = r.text
@@ -339,12 +366,12 @@ def option_cffex_hs300_daily_sina(symbol: str = "io2202P4350") -> pd.DataFrame:
339
366
  "volume",
340
367
  ]
341
368
  ]
342
- data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
343
- data_df["open"] = pd.to_numeric(data_df["open"])
344
- data_df["high"] = pd.to_numeric(data_df["high"])
345
- data_df["low"] = pd.to_numeric(data_df["low"])
346
- data_df["close"] = pd.to_numeric(data_df["close"])
347
- data_df["volume"] = pd.to_numeric(data_df["volume"])
369
+ data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
370
+ data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
371
+ data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
372
+ data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
373
+ data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
374
+ data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
348
375
  return data_df
349
376
 
350
377
 
@@ -361,7 +388,10 @@ def option_cffex_zz1000_daily_sina(
361
388
  year = datetime.datetime.now().year
362
389
  month = datetime.datetime.now().month
363
390
  day = datetime.datetime.now().day
364
- url = f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}=/FutureOptionAllService.getOptionDayline"
391
+ url = (
392
+ f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
393
+ f"=/FutureOptionAllService.getOptionDayline"
394
+ )
365
395
  params = {"symbol": symbol}
366
396
  r = requests.get(url, params=params)
367
397
  data_text = r.text
@@ -379,19 +409,17 @@ def option_cffex_zz1000_daily_sina(
379
409
  "volume",
380
410
  ]
381
411
  ]
382
- data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
383
- data_df["open"] = pd.to_numeric(data_df["open"])
384
- data_df["high"] = pd.to_numeric(data_df["high"])
385
- data_df["low"] = pd.to_numeric(data_df["low"])
386
- data_df["close"] = pd.to_numeric(data_df["close"])
387
- data_df["volume"] = pd.to_numeric(data_df["volume"])
412
+ data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
413
+ data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
414
+ data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
415
+ data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
416
+ data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
417
+ data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
388
418
  return data_df
389
419
 
390
420
 
391
421
  # 期权-上交所-50ETF
392
- def option_sse_list_sina(
393
- symbol: str = "50ETF", exchange: str = "null"
394
- ) -> List[str]:
422
+ def option_sse_list_sina(symbol: str = "50ETF", exchange: str = "null") -> List[str]:
395
423
  """
396
424
  新浪财经-期权-上交所-50ETF-合约到期月份列表
397
425
  https://stock.finance.sina.com.cn/option/quotes.html
@@ -402,7 +430,7 @@ def option_sse_list_sina(
402
430
  :return: 合约到期时间
403
431
  :rtype: list
404
432
  """
405
- url = "http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName"
433
+ url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName"
406
434
  params = {"exchange": f"{exchange}", "cate": f"{symbol}"}
407
435
  r = requests.get(url, params=params)
408
436
  data_json = r.json()
@@ -424,7 +452,7 @@ def option_sse_expire_day_sina(
424
452
  :return: (到期时间, 剩余时间)
425
453
  :rtype: tuple
426
454
  """
427
- url = "http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
455
+ url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
428
456
  params = {
429
457
  "exchange": f"{exchange}",
430
458
  "cate": f"{symbol}",
@@ -434,7 +462,7 @@ def option_sse_expire_day_sina(
434
462
  data_json = r.json()
435
463
  data = data_json["result"]["data"]
436
464
  if int(data["remainderDays"]) < 0:
437
- url = "http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
465
+ url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
438
466
  params = {
439
467
  "exchange": f"{exchange}",
440
468
  "cate": f"{'XD' + symbol}",
@@ -466,7 +494,7 @@ def option_sse_codes_sina(
466
494
  if symbol == "看涨期权":
467
495
  url = "".join(
468
496
  [
469
- "http://hq.sinajs.cn/list=OP_UP_",
497
+ "https://hq.sinajs.cn/list=OP_UP_",
470
498
  underlying,
471
499
  str(trade_date)[-4:],
472
500
  ]
@@ -474,7 +502,7 @@ def option_sse_codes_sina(
474
502
  else:
475
503
  url = "".join(
476
504
  [
477
- "http://hq.sinajs.cn/list=OP_DOWN_",
505
+ "https://hq.sinajs.cn/list=OP_DOWN_",
478
506
  underlying,
479
507
  str(trade_date)[-4:],
480
508
  ]
@@ -494,7 +522,8 @@ def option_sse_codes_sina(
494
522
  "Sec-Fetch-Dest": "script",
495
523
  "Sec-Fetch-Mode": "no-cors",
496
524
  "Sec-Fetch-Site": "cross-site",
497
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
525
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
526
+ "Chrome/97.0.4692.71 Safari/537.36",
498
527
  }
499
528
  r = requests.get(url, headers=headers)
500
529
  data_text = r.text
@@ -518,7 +547,7 @@ def option_sse_spot_price_sina(symbol: str = "10003720") -> pd.DataFrame:
518
547
  :return: 期权量价数据
519
548
  :rtype: pandas.DataFrame
520
549
  """
521
- url = f"http://hq.sinajs.cn/list=CON_OP_{symbol}"
550
+ url = f"https://hq.sinajs.cn/list=CON_OP_{symbol}"
522
551
  headers = {
523
552
  "Accept": "*/*",
524
553
  "Accept-Encoding": "gzip, deflate, br",
@@ -534,13 +563,12 @@ def option_sse_spot_price_sina(symbol: str = "10003720") -> pd.DataFrame:
534
563
  "Sec-Fetch-Dest": "script",
535
564
  "Sec-Fetch-Mode": "no-cors",
536
565
  "Sec-Fetch-Site": "cross-site",
537
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
566
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
567
+ "Chrome/97.0.4692.71 Safari/537.36",
538
568
  }
539
569
  r = requests.get(url, headers=headers)
540
570
  data_text = r.text
541
- data_list = data_text[
542
- data_text.find('"') + 1 : data_text.rfind('"')
543
- ].split(",")
571
+ data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
544
572
  field_list = [
545
573
  "买量",
546
574
  "买价",
@@ -586,9 +614,7 @@ def option_sse_spot_price_sina(symbol: str = "10003720") -> pd.DataFrame:
586
614
  "成交量",
587
615
  "成交额",
588
616
  ]
589
- data_df = pd.DataFrame(
590
- list(zip(field_list, data_list)), columns=["字段", "值"]
591
- )
617
+ data_df = pd.DataFrame(list(zip(field_list, data_list)), columns=["字段", "值"])
592
618
  return data_df
593
619
 
594
620
 
@@ -602,7 +628,7 @@ def option_sse_underlying_spot_price_sina(
602
628
  :return: 期权标的物的信息
603
629
  :rtype: pandas.DataFrame
604
630
  """
605
- url = f"http://hq.sinajs.cn/list={symbol}"
631
+ url = f"https://hq.sinajs.cn/list={symbol}"
606
632
  headers = {
607
633
  "Accept": "*/*",
608
634
  "Accept-Encoding": "gzip, deflate",
@@ -611,14 +637,13 @@ def option_sse_underlying_spot_price_sina(
611
637
  "Host": "hq.sinajs.cn",
612
638
  "Pragma": "no-cache",
613
639
  "Proxy-Connection": "keep-alive",
614
- "Referer": "http://vip.stock.finance.sina.com.cn/",
615
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
640
+ "Referer": "https://vip.stock.finance.sina.com.cn/",
641
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
642
+ "Chrome/97.0.4692.71 Safari/537.36",
616
643
  }
617
644
  r = requests.get(url, headers=headers)
618
645
  data_text = r.text
619
- data_list = data_text[
620
- data_text.find('"') + 1 : data_text.rfind('"')
621
- ].split(",")
646
+ data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
622
647
  field_list = [
623
648
  "证券简称",
624
649
  "今日开盘价",
@@ -654,9 +679,7 @@ def option_sse_underlying_spot_price_sina(
654
679
  "行情时间",
655
680
  "停牌状态",
656
681
  ]
657
- data_df = pd.DataFrame(
658
- list(zip(field_list, data_list)), columns=["字段", "值"]
659
- )
682
+ data_df = pd.DataFrame(list(zip(field_list, data_list)), columns=["字段", "值"])
660
683
  return data_df
661
684
 
662
685
 
@@ -668,7 +691,7 @@ def option_sse_greeks_sina(symbol: str = "10003045") -> pd.DataFrame:
668
691
  :return: 期权基本信息表
669
692
  :rtype: pandas.DataFrame
670
693
  """
671
- url = f"http://hq.sinajs.cn/list=CON_SO_{symbol}"
694
+ url = f"https://hq.sinajs.cn/list=CON_SO_{symbol}"
672
695
  headers = {
673
696
  "Accept": "*/*",
674
697
  "Accept-Encoding": "gzip, deflate",
@@ -677,14 +700,13 @@ def option_sse_greeks_sina(symbol: str = "10003045") -> pd.DataFrame:
677
700
  "Host": "hq.sinajs.cn",
678
701
  "Pragma": "no-cache",
679
702
  "Proxy-Connection": "keep-alive",
680
- "Referer": "http://vip.stock.finance.sina.com.cn/",
681
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
703
+ "Referer": "https://vip.stock.finance.sina.com.cn/",
704
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
705
+ "Chrome/97.0.4692.71 Safari/537.36",
682
706
  }
683
707
  r = requests.get(url, headers=headers)
684
708
  data_text = r.text
685
- data_list = data_text[
686
- data_text.find('"') + 1 : data_text.rfind('"')
687
- ].split(",")
709
+ data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
688
710
  field_list = [
689
711
  "期权合约简称",
690
712
  "成交量",
@@ -731,20 +753,23 @@ def option_sse_minute_sina(symbol: str = "10003720") -> pd.DataFrame:
731
753
  "sec-fetch-dest": "script",
732
754
  "sec-fetch-mode": "no-cors",
733
755
  "sec-fetch-site": "same-origin",
734
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
756
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
757
+ "Chrome/97.0.4692.71 Safari/537.36",
735
758
  }
736
759
  r = requests.get(url, params=params, headers=headers)
737
760
  data_json = r.json()
738
761
  temp_df = data_json["result"]["data"]
739
762
  data_df = pd.DataFrame(temp_df)
740
- data_df.columns = ["时间", "价格", "成交", "持仓", "均价", "日期"]
763
+ data_df = set_df_columns(
764
+ df=data_df, cols=["时间", "价格", "成交", "持仓", "均价", "日期"]
765
+ )
741
766
  data_df = data_df[["日期", "时间", "价格", "成交", "持仓", "均价"]]
742
- data_df["日期"] = pd.to_datetime(data_df["日期"]).dt.date
743
- data_df["日期"].ffill(inplace=True)
744
- data_df["价格"] = pd.to_numeric(data_df["价格"])
745
- data_df["成交"] = pd.to_numeric(data_df["成交"])
746
- data_df["持仓"] = pd.to_numeric(data_df["持仓"])
747
- data_df["均价"] = pd.to_numeric(data_df["均价"])
767
+ data_df["日期"] = pd.to_datetime(data_df["日期"], errors="coerce").dt.date
768
+ data_df["日期"] = data_df["日期"].ffill()
769
+ data_df["价格"] = pd.to_numeric(data_df["价格"], errors="coerce")
770
+ data_df["成交"] = pd.to_numeric(data_df["成交"], errors="coerce")
771
+ data_df["持仓"] = pd.to_numeric(data_df["持仓"], errors="coerce")
772
+ data_df["均价"] = pd.to_numeric(data_df["均价"], errors="coerce")
748
773
  return data_df
749
774
 
750
775
 
@@ -756,7 +781,7 @@ def option_sse_daily_sina(symbol: str = "10003889") -> pd.DataFrame:
756
781
  :return: 指定期权的所有日频率历史数据
757
782
  :rtype: pandas.DataFrame
758
783
  """
759
- url = "http://stock.finance.sina.com.cn/futures/api/jsonp_v2.php//StockOptionDaylineService.getSymbolInfo"
784
+ url = "https://stock.finance.sina.com.cn/futures/api/jsonp_v2.php//StockOptionDaylineService.getSymbolInfo"
760
785
  params = {"symbol": f"CON_OP_{symbol}"}
761
786
  headers = {
762
787
  "accept": "*/*",
@@ -771,21 +796,20 @@ def option_sse_daily_sina(symbol: str = "10003889") -> pd.DataFrame:
771
796
  "sec-fetch-dest": "script",
772
797
  "sec-fetch-mode": "no-cors",
773
798
  "sec-fetch-site": "same-origin",
774
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
799
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
800
+ "Chrome/97.0.4692.71 Safari/537.36",
775
801
  }
776
802
  r = requests.get(url, params=params, headers=headers)
777
803
  data_text = r.text
778
- data_json = json.loads(
779
- data_text[data_text.find("(") + 1 : data_text.rfind(")")]
780
- )
804
+ data_json = json.loads(data_text[data_text.find("(") + 1 : data_text.rfind(")")])
781
805
  temp_df = pd.DataFrame(data_json)
782
806
  temp_df.columns = ["日期", "开盘", "最高", "最低", "收盘", "成交量"]
783
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
784
- temp_df["开盘"] = pd.to_numeric(temp_df["开盘"])
785
- temp_df["最高"] = pd.to_numeric(temp_df["最高"])
786
- temp_df["最低"] = pd.to_numeric(temp_df["最低"])
787
- temp_df["收盘"] = pd.to_numeric(temp_df["收盘"])
788
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
807
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
808
+ temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
809
+ temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
810
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
811
+ temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
812
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
789
813
  return temp_df
790
814
 
791
815
 
@@ -815,23 +839,30 @@ def option_finance_minute_sina(symbol: str = "10002530") -> pd.DataFrame:
815
839
  "sec-fetch-dest": "script",
816
840
  "sec-fetch-mode": "no-cors",
817
841
  "sec-fetch-site": "same-origin",
818
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
842
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
843
+ "Chrome/97.0.4692.71 Safari/537.36",
819
844
  }
820
845
  r = requests.get(url, params=params, headers=headers)
821
846
  data_text = r.json()
822
847
  temp_df = pd.DataFrame()
823
848
  for item in data_text["result"]["data"]:
824
- temp_df = pd.concat([temp_df, pd.DataFrame(item)], ignore_index=True)
825
- temp_df.fillna(method="ffill", inplace=True)
849
+ temp_df = pd.concat(objs=[temp_df, pd.DataFrame(item)], ignore_index=True)
850
+ temp_df.ffill(inplace=True)
826
851
  temp_df.columns = ["time", "price", "volume", "_", "average_price", "date"]
827
852
  temp_df = temp_df[["date", "time", "price", "average_price", "volume"]]
828
- temp_df["price"] = pd.to_numeric(temp_df["price"])
829
- temp_df["average_price"] = pd.to_numeric(temp_df["average_price"])
830
- temp_df["volume"] = pd.to_numeric(temp_df["volume"])
853
+ temp_df["price"] = pd.to_numeric(temp_df["price"], errors="coerce")
854
+ temp_df["average_price"] = pd.to_numeric(temp_df["average_price"], errors="coerce")
855
+ temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
831
856
  return temp_df
832
857
 
833
858
 
834
- def option_minute_em(symbol: str = "MO2402-C-5400") -> pd.DataFrame:
859
+ @lru_cache()
860
+ def __option_current_em() -> pd.DataFrame:
861
+ inner_option_current_em_df = option_current_em()
862
+ return inner_option_current_em_df
863
+
864
+
865
+ def option_minute_em(symbol: str = "MO2404-P-4450") -> pd.DataFrame:
835
866
  """
836
867
  东方财富网-行情中心-期权市场-分时行情
837
868
  https://wap.eastmoney.com/quote/stock/151.cu2404P61000.html
@@ -840,9 +871,15 @@ def option_minute_em(symbol: str = "MO2402-C-5400") -> pd.DataFrame:
840
871
  :return: 指定期权的分钟频率数据
841
872
  :rtype: pandas.DataFrame
842
873
  """
843
- option_current_em_df = option_current_em()
844
- option_current_em_df['标识'] = option_current_em_df['市场标识'].astype(str) + '.' + option_current_em_df['代码']
845
- id_ = option_current_em_df[option_current_em_df['代码'] == symbol]['标识'].values[0]
874
+ inner_option_current_em_df = __option_current_em()
875
+ inner_option_current_em_df["标识"] = (
876
+ inner_option_current_em_df["市场标识"].astype(str)
877
+ + "."
878
+ + inner_option_current_em_df["代码"]
879
+ )
880
+ id_ = inner_option_current_em_df[inner_option_current_em_df["代码"] == symbol][
881
+ "标识"
882
+ ].values[0]
846
883
  url = "https://push2.eastmoney.com/api/qt/stock/trends2/get"
847
884
  params = {
848
885
  "secid": id_,
@@ -857,7 +894,7 @@ def option_minute_em(symbol: str = "MO2402-C-5400") -> pd.DataFrame:
857
894
  r = requests.get(url, params=params)
858
895
  data_text = r.text
859
896
  data_json = json.loads(data_text[data_text.find("(") + 1 : data_text.rfind(")")])
860
- temp_df = pd.DataFrame([item.split(",") for item in data_json['data']['trends']])
897
+ temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["trends"]])
861
898
  temp_df.columns = ["time", "close", "high", "low", "volume", "amount", "-"]
862
899
  temp_df = temp_df[["time", "close", "high", "low", "volume", "amount"]]
863
900
  temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
@@ -879,24 +916,16 @@ if __name__ == "__main__":
879
916
  option_cffex_zz1000_list_sina_df = option_cffex_zz1000_list_sina()
880
917
  print(option_cffex_zz1000_list_sina_df)
881
918
 
882
- option_cffex_sz50_spot_sina_df = option_cffex_sz50_spot_sina(
883
- symbol="ho2303"
884
- )
919
+ option_cffex_sz50_spot_sina_df = option_cffex_sz50_spot_sina(symbol="ho2303")
885
920
  print(option_cffex_sz50_spot_sina_df)
886
921
 
887
- option_cffex_hs300_spot_sina_df = option_cffex_hs300_spot_sina(
888
- symbol="io2209"
889
- )
922
+ option_cffex_hs300_spot_sina_df = option_cffex_hs300_spot_sina(symbol="io2209")
890
923
  print(option_cffex_hs300_spot_sina_df)
891
924
 
892
- option_cffex_zz1000_spot_sina_df = option_cffex_zz1000_spot_sina(
893
- symbol="mo2209"
894
- )
925
+ option_cffex_zz1000_spot_sina_df = option_cffex_zz1000_spot_sina(symbol="mo2209")
895
926
  print(option_cffex_zz1000_spot_sina_df)
896
927
 
897
- option_cffex_sz50_daily_sina_df = option_cffex_sz50_daily_sina(
898
- symbol="ho2303P2350"
899
- )
928
+ option_cffex_sz50_daily_sina_df = option_cffex_sz50_daily_sina(symbol="ho2303P2350")
900
929
  print(option_cffex_sz50_daily_sina_df)
901
930
 
902
931
  option_cffex_hs300_daily_sina_df = option_cffex_hs300_daily_sina(
@@ -910,9 +939,7 @@ if __name__ == "__main__":
910
939
  print(option_cffex_zz1000_daily_sina_df)
911
940
 
912
941
  # 期权-上交所-50ETF
913
- option_sse_list_sina_df = option_sse_list_sina(
914
- symbol="50ETF", exchange="null"
915
- )
942
+ option_sse_list_sina_df = option_sse_list_sina(symbol="50ETF", exchange="null")
916
943
  print(option_sse_list_sina_df)
917
944
 
918
945
  option_sse_expire_day_sina_df = option_sse_expire_day_sina(
@@ -925,13 +952,11 @@ if __name__ == "__main__":
925
952
  )
926
953
  print(option_sse_codes_sina_df)
927
954
 
928
- option_sse_spot_price_sina_df = option_sse_spot_price_sina(
929
- symbol="10003686"
930
- )
955
+ option_sse_spot_price_sina_df = option_sse_spot_price_sina(symbol="10003686")
931
956
  print(option_sse_spot_price_sina_df)
932
957
 
933
- option_sse_underlying_spot_price_sina_df = (
934
- option_sse_underlying_spot_price_sina(symbol="sh510300")
958
+ option_sse_underlying_spot_price_sina_df = option_sse_underlying_spot_price_sina(
959
+ symbol="sh510300"
935
960
  )
936
961
  print(option_sse_underlying_spot_price_sina_df)
937
962
 
@@ -944,13 +969,11 @@ if __name__ == "__main__":
944
969
  option_sse_daily_sina_df = option_sse_daily_sina(symbol="10004023")
945
970
  print(option_sse_daily_sina_df)
946
971
 
947
- option_finance_minute_sina_df = option_finance_minute_sina(
948
- symbol="10004023"
949
- )
972
+ option_finance_minute_sina_df = option_finance_minute_sina(symbol="10004023")
950
973
  print(option_finance_minute_sina_df)
951
974
 
952
975
  option_current_em_df = option_current_em()
953
976
  print(option_current_em_df)
954
977
 
955
- option_minute_em_df = option_minute_em(symbol="MO2402-C-5400")
978
+ option_minute_em_df = option_minute_em(symbol="IO2406-C-3500")
956
979
  print(option_minute_em_df)