akshare 1.14.49__py3-none-any.whl → 1.17.99__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. akshare/__init__.py +595 -129
  2. akshare/air/air_hebei.py +77 -54
  3. akshare/air/air_zhenqi.py +0 -4
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/article/cons.py +1 -0
  8. akshare/article/epu_index.py +4 -3
  9. akshare/article/ff_factor.py +19 -8
  10. akshare/article/fred_md.py +4 -1
  11. akshare/article/risk_rv.py +3 -8
  12. akshare/bank/bank_cbirc_2020.py +11 -11
  13. akshare/bank/cons.py +7 -6
  14. akshare/bond/bond_buy_back_em.py +228 -0
  15. akshare/bond/bond_cb_sina.py +1 -0
  16. akshare/bond/bond_cb_ths.py +17 -9
  17. akshare/bond/bond_cbond.py +19 -14
  18. akshare/bond/bond_china.py +38 -39
  19. akshare/bond/bond_china_money.py +1 -1
  20. akshare/bond/bond_convert.py +10 -9
  21. akshare/bond/bond_em.py +37 -17
  22. akshare/bond/bond_summary.py +38 -37
  23. akshare/bond/bond_zh_cov.py +31 -40
  24. akshare/bond/bond_zh_sina.py +4 -0
  25. akshare/bond/cons.py +14 -11
  26. akshare/cal/__init__.py +0 -0
  27. akshare/cal/rv.py +170 -0
  28. akshare/cost/cost_living.py +7 -5
  29. akshare/crypto/__init__.py +1 -1
  30. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  31. akshare/crypto/crypto_hold.py +4 -2
  32. akshare/currency/currency.py +1 -0
  33. akshare/currency/currency_china_bank_sina.py +11 -6
  34. akshare/data/__init__.py +1 -1
  35. akshare/data/cninfo.js +1 -1
  36. akshare/datasets.py +10 -21
  37. akshare/economic/cons.py +10 -3
  38. akshare/economic/macro_australia.py +74 -69
  39. akshare/economic/macro_bank.py +95 -653
  40. akshare/economic/macro_canada.py +92 -81
  41. akshare/economic/macro_china.py +97 -105
  42. akshare/economic/macro_china_hk.py +0 -1
  43. akshare/economic/macro_euro.py +103 -56
  44. akshare/economic/macro_finance_ths.py +7 -5
  45. akshare/economic/macro_germany.py +1 -1
  46. akshare/economic/macro_japan.py +0 -1
  47. akshare/economic/macro_other.py +1 -6
  48. akshare/economic/macro_swiss.py +2 -3
  49. akshare/economic/macro_uk.py +1 -1
  50. akshare/economic/macro_usa.py +7 -9
  51. akshare/economic/marco_cnbs.py +11 -6
  52. akshare/energy/energy_carbon.py +0 -1
  53. akshare/energy/energy_oil_em.py +1 -2
  54. akshare/event/cons.py +1 -0
  55. akshare/exceptions.py +43 -0
  56. akshare/file_fold/calendar.json +245 -2
  57. akshare/forex/__init__.py +0 -0
  58. akshare/forex/cons.py +192 -0
  59. akshare/forex/forex_em.py +149 -0
  60. akshare/fortune/fortune_500.py +1 -37
  61. akshare/fortune/fortune_bloomberg.py +6 -3
  62. akshare/fortune/fortune_forbes_500.py +3 -6
  63. akshare/fortune/fortune_hurun.py +2 -1
  64. akshare/fortune/fortune_xincaifu_500.py +17 -14
  65. akshare/fund/fund_announcement_em.py +145 -0
  66. akshare/fund/fund_aum_em.py +49 -35
  67. akshare/fund/fund_em.py +251 -220
  68. akshare/fund/fund_etf_em.py +44 -35
  69. akshare/fund/fund_etf_sina.py +75 -27
  70. akshare/fund/fund_etf_ths.py +2 -0
  71. akshare/fund/fund_fee_em.py +172 -0
  72. akshare/fund/fund_fhsp_em.py +42 -32
  73. akshare/fund/fund_init_em.py +8 -5
  74. akshare/fund/fund_lof_em.py +12 -19
  75. akshare/fund/fund_manager.py +25 -11
  76. akshare/fund/fund_overview_em.py +42 -0
  77. akshare/fund/fund_portfolio_em.py +23 -21
  78. akshare/fund/fund_position_lg.py +19 -8
  79. akshare/fund/fund_rank_em.py +2 -5
  80. akshare/fund/fund_rating.py +33 -12
  81. akshare/fund/fund_scale_em.py +24 -13
  82. akshare/fund/fund_scale_sina.py +20 -10
  83. akshare/fund/fund_xq.py +3 -2
  84. akshare/futures/cons.py +135 -39
  85. akshare/futures/cot.py +55 -56
  86. akshare/futures/futures_basis.py +49 -11
  87. akshare/futures/futures_comex_em.py +1 -0
  88. akshare/futures/futures_comm_ctp.py +1 -1
  89. akshare/futures/futures_contract_detail.py +59 -9
  90. akshare/futures/futures_daily_bar.py +66 -59
  91. akshare/futures/futures_foreign.py +14 -8
  92. akshare/futures/futures_hf_em.py +215 -61
  93. akshare/futures/futures_hist_em.py +191 -0
  94. akshare/futures/futures_hq_sina.py +5 -3
  95. akshare/futures/futures_index_ccidx.py +24 -82
  96. akshare/futures/futures_inventory_99.py +70 -272
  97. akshare/futures/futures_inventory_em.py +14 -11
  98. akshare/futures/futures_news_shmet.py +2 -2
  99. akshare/futures/futures_roll_yield.py +11 -24
  100. akshare/futures/futures_rule.py +7 -3
  101. akshare/futures/futures_rule_em.py +38 -0
  102. akshare/futures/futures_settlement_price_sgx.py +21 -6
  103. akshare/futures/futures_stock_js.py +0 -1
  104. akshare/futures/futures_to_spot.py +5 -6
  105. akshare/futures/futures_warehouse_receipt.py +48 -47
  106. akshare/futures/futures_zh_sina.py +3 -3
  107. akshare/futures/receipt.py +298 -165
  108. akshare/futures/requests_fun.py +16 -3
  109. akshare/futures/symbol_var.py +32 -13
  110. akshare/futures_derivative/cons.py +100 -103
  111. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  112. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  113. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  114. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  115. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  116. akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
  117. akshare/futures_derivative/futures_cot_sina.py +8 -6
  118. akshare/futures_derivative/futures_index_sina.py +25 -13
  119. akshare/fx/cons.py +12 -7
  120. akshare/fx/fx_c_swap_cm.py +62 -0
  121. akshare/fx/fx_quote.py +3 -2
  122. akshare/fx/fx_quote_baidu.py +2 -1
  123. akshare/hf/__init__.py +1 -1
  124. akshare/hf/hf_sp500.py +8 -7
  125. akshare/index/cons.py +132 -28
  126. akshare/index/index_cni.py +7 -7
  127. akshare/index/index_cons.py +2 -2
  128. akshare/index/index_csindex.py +68 -0
  129. akshare/index/index_cx.py +20 -20
  130. akshare/index/index_drewry.py +17 -16
  131. akshare/index/index_eri.py +1 -0
  132. akshare/index/index_global_em.py +167 -0
  133. akshare/index/index_global_sina.py +82 -0
  134. akshare/index/index_kq_fz.py +17 -14
  135. akshare/index/index_kq_ss.py +1 -0
  136. akshare/index/index_option_qvix.py +351 -16
  137. akshare/index/index_research_sw.py +21 -21
  138. akshare/index/index_spot.py +9 -5
  139. akshare/index/index_stock_hk.py +5 -9
  140. akshare/index/index_stock_zh.py +111 -24
  141. akshare/index/index_stock_zh_csindex.py +3 -367
  142. akshare/index/index_sugar.py +18 -4
  143. akshare/index/index_sw.py +10 -2
  144. akshare/index/index_yw.py +53 -75
  145. akshare/index/index_zh_em.py +15 -82
  146. akshare/interest_rate/interbank_rate_em.py +0 -1
  147. akshare/movie/jm.js +0 -1
  148. akshare/news/__init__.py +1 -1
  149. akshare/news/news_baidu.py +395 -222
  150. akshare/news/news_stock.py +49 -16
  151. akshare/option/cons.py +2 -2
  152. akshare/option/option_commodity.py +341 -220
  153. akshare/option/option_commodity_sina.py +22 -26
  154. akshare/option/option_contract_info_ctp.py +63 -0
  155. akshare/option/option_current_sse.py +61 -0
  156. akshare/option/option_current_szse.py +84 -0
  157. akshare/option/option_czce.py +37 -9
  158. akshare/option/option_daily_stats_sse_szse.py +0 -1
  159. akshare/option/option_em.py +4 -8
  160. akshare/option/option_finance.py +60 -12
  161. akshare/option/option_finance_sina.py +7 -7
  162. akshare/option/option_lhb_em.py +0 -1
  163. akshare/option/option_margin.py +62 -0
  164. akshare/option/option_premium_analysis_em.py +58 -53
  165. akshare/option/option_risk_analysis_em.py +11 -8
  166. akshare/option/option_risk_indicator_sse.py +3 -4
  167. akshare/option/option_value_analysis_em.py +62 -55
  168. akshare/other/__init__.py +1 -1
  169. akshare/pro/__init__.py +0 -1
  170. akshare/pro/client.py +6 -4
  171. akshare/pro/cons.py +3 -2
  172. akshare/pro/data_pro.py +6 -5
  173. akshare/qdii/__init__.py +0 -0
  174. akshare/qdii/qdii_jsl.py +233 -0
  175. akshare/qhkc/__init__.py +1 -6
  176. akshare/qhkc/qhkc_api.py +64 -22
  177. akshare/qhkc_web/__init__.py +1 -6
  178. akshare/qhkc_web/qhkc_fund.py +10 -6
  179. akshare/qhkc_web/qhkc_index.py +28 -14
  180. akshare/qhkc_web/qhkc_tool.py +62 -59
  181. akshare/rate/__init__.py +1 -1
  182. akshare/rate/repo_rate.py +36 -32
  183. akshare/reits/__init__.py +1 -1
  184. akshare/reits/reits_basic.py +149 -13
  185. akshare/request.py +117 -0
  186. akshare/spot/__init__.py +1 -1
  187. akshare/spot/spot_hog_soozhu.py +165 -3
  188. akshare/spot/spot_sge.py +70 -9
  189. akshare/stock/cons.py +60 -23
  190. akshare/stock/stock_allotment_cninfo.py +8 -8
  191. akshare/stock/stock_ask_bid_em.py +3 -78
  192. akshare/stock/stock_board_concept_em.py +160 -35
  193. akshare/stock/stock_board_industry_em.py +163 -70
  194. akshare/stock/stock_dividend_cninfo.py +31 -17
  195. akshare/stock/stock_dzjy_em.py +347 -260
  196. akshare/stock/stock_fund_em.py +72 -64
  197. akshare/stock/stock_fund_hold.py +1 -2
  198. akshare/stock/stock_gsrl_em.py +1 -0
  199. akshare/stock/stock_hk_comparison_em.py +175 -0
  200. akshare/stock/stock_hk_famous.py +4 -5
  201. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  202. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  203. akshare/stock/stock_hk_sina.py +84 -36
  204. akshare/stock/stock_hold_control_cninfo.py +82 -0
  205. akshare/stock/stock_hold_control_em.py +0 -2
  206. akshare/stock/stock_hot_rank_em.py +4 -1
  207. akshare/stock/stock_hot_search_baidu.py +32 -19
  208. akshare/stock/stock_hot_up_em.py +4 -1
  209. akshare/stock/stock_hsgt_em.py +155 -0
  210. akshare/stock/stock_industry.py +1 -0
  211. akshare/stock/stock_industry_cninfo.py +1 -2
  212. akshare/stock/stock_info.py +6 -4
  213. akshare/stock/stock_info_em.py +17 -11
  214. akshare/stock/stock_intraday_em.py +4 -78
  215. akshare/stock/stock_intraday_sina.py +2 -2
  216. akshare/stock/stock_news_cx.py +39 -0
  217. akshare/stock/stock_profile_cninfo.py +7 -7
  218. akshare/stock/stock_profile_em.py +302 -0
  219. akshare/stock/stock_rank_forecast.py +6 -5
  220. akshare/stock/stock_repurchase_em.py +7 -2
  221. akshare/stock/stock_share_changes_cninfo.py +7 -5
  222. akshare/stock/stock_share_hold.py +24 -20
  223. akshare/stock/stock_stop.py +6 -6
  224. akshare/stock/stock_summary.py +153 -417
  225. akshare/stock/stock_us_famous.py +5 -6
  226. akshare/stock/stock_us_js.py +3 -2
  227. akshare/stock/stock_us_pink.py +38 -27
  228. akshare/stock/stock_us_sina.py +7 -3
  229. akshare/stock/stock_weibo_nlp.py +18 -20
  230. akshare/stock/stock_xq.py +24 -22
  231. akshare/stock/stock_zh_a_sina.py +8 -5
  232. akshare/stock/stock_zh_a_special.py +240 -243
  233. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  234. akshare/stock/stock_zh_ah_tx.py +23 -26
  235. akshare/stock/stock_zh_b_sina.py +2 -2
  236. akshare/stock/stock_zh_comparison_em.py +250 -0
  237. akshare/stock/stock_zh_kcb_sina.py +67 -64
  238. akshare/stock_a/__init__.py +0 -0
  239. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  240. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  241. akshare/stock_a/stock_zh_a_spot.py +212 -0
  242. akshare/stock_feature/cons.py +1 -0
  243. akshare/stock_feature/stock_a_indicator.py +9 -54
  244. akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
  245. akshare/stock_feature/stock_account_em.py +0 -1
  246. akshare/stock_feature/stock_all_pb.py +2 -1
  247. akshare/stock_feature/stock_analyst_em.py +36 -30
  248. akshare/stock_feature/stock_board_concept_ths.py +328 -0
  249. akshare/stock_feature/stock_board_industry_ths.py +57 -2
  250. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  251. akshare/stock_feature/stock_classify_sina.py +3 -6
  252. akshare/stock_feature/stock_comment_em.py +81 -144
  253. akshare/stock_feature/stock_congestion_lg.py +2 -1
  254. akshare/stock_feature/stock_cyq_em.py +5 -11
  255. akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
  256. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  257. akshare/stock_feature/stock_ebs_lg.py +5 -4
  258. akshare/stock_feature/stock_esg_sina.py +29 -7
  259. akshare/stock_feature/stock_fhps_em.py +2 -1
  260. akshare/stock_feature/stock_fhps_ths.py +15 -7
  261. akshare/stock_feature/stock_fund_flow.py +30 -22
  262. akshare/stock_feature/stock_gddh_em.py +19 -11
  263. akshare/stock_feature/stock_gdfx_em.py +226 -113
  264. akshare/stock_feature/stock_gdhs.py +75 -50
  265. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  266. akshare/stock_feature/stock_gpzy_em.py +78 -46
  267. akshare/stock_feature/stock_gxl_lg.py +3 -2
  268. akshare/stock_feature/stock_hist_em.py +137 -234
  269. akshare/stock_feature/stock_hist_tx.py +13 -10
  270. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  271. akshare/stock_feature/stock_hot_xq.py +4 -6
  272. akshare/stock_feature/stock_hsgt_em.py +269 -97
  273. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  274. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  275. akshare/stock_feature/stock_info.py +7 -80
  276. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  277. akshare/stock_feature/stock_jgdy_em.py +43 -40
  278. akshare/stock_feature/stock_lhb_em.py +119 -3
  279. akshare/stock_feature/stock_margin_em.py +0 -1
  280. akshare/stock_feature/stock_margin_sse.py +0 -2
  281. akshare/stock_feature/stock_pankou_em.py +71 -35
  282. akshare/stock_feature/stock_qsjy_em.py +13 -4
  283. akshare/stock_feature/stock_report_em.py +151 -7
  284. akshare/stock_feature/stock_research_report_em.py +55 -20
  285. akshare/stock_feature/stock_sy_em.py +20 -15
  286. akshare/stock_feature/stock_technology_ths.py +122 -77
  287. akshare/stock_feature/stock_tfp_em.py +2 -1
  288. akshare/stock_feature/stock_three_report_em.py +21 -5
  289. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  290. akshare/stock_feature/stock_value_em.py +83 -0
  291. akshare/stock_feature/stock_yjbb_em.py +58 -32
  292. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  293. akshare/stock_feature/stock_yjyg_em.py +1 -1
  294. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  295. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  296. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  297. akshare/stock_feature/stock_ztb_em.py +39 -24
  298. akshare/stock_fundamental/__init__.py +1 -1
  299. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  300. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  301. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
  302. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  303. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  304. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  305. akshare/stock_fundamental/stock_hold.py +26 -17
  306. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  307. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  308. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  309. akshare/stock_fundamental/stock_notice.py +12 -3
  310. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  311. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  312. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  313. akshare/stock_fundamental/stock_recommend.py +20 -4
  314. akshare/stock_fundamental/stock_zygc.py +5 -62
  315. akshare/utils/context.py +43 -0
  316. akshare/utils/demjson.py +2009 -1338
  317. akshare/utils/func.py +49 -2
  318. akshare/utils/multi_decrypt.py +53 -0
  319. akshare/utils/token_process.py +6 -5
  320. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
  321. akshare-1.17.99.dist-info/RECORD +409 -0
  322. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  323. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  324. tests/test_func.py +3 -5
  325. akshare/bond/bond_futures.py +0 -50
  326. akshare/bond/bond_investing.py +0 -139
  327. akshare/crypto/crypto_hist_investing.py +0 -249
  328. akshare/fund/fund_announcement.py +0 -56
  329. akshare/futures/futures_international.py +0 -170
  330. akshare/futures/futures_news_baidu.py +0 -54
  331. akshare/futures/inventory_data.py +0 -100
  332. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  333. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  334. akshare/futures_derivative/futures_index_volatility_nh.py +0 -53
  335. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  336. akshare/index/index_fear_greed_funddb.py +0 -78
  337. akshare/index/index_investing.py +0 -232
  338. akshare/sport/__init__.py +0 -6
  339. akshare/sport/sport_olympic.py +0 -27
  340. akshare/stock_feature/stock_wencai.py +0 -104
  341. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  342. akshare-1.14.49.dist-info/RECORD +0 -387
  343. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/7/19 14:00
4
+ Date: 2025/10/17 21:00
5
5
  Desc: 商品期权数据
6
6
  说明:
7
7
  (1) 价格:自2019年12月02日起,纤维板报价单位由元/张改为元/立方米
@@ -16,8 +16,7 @@ Desc: 商品期权数据
16
16
 
17
17
  import datetime
18
18
  import warnings
19
- from io import StringIO, BytesIO
20
- from typing import Tuple, Any, Optional
19
+ from io import StringIO
21
20
 
22
21
  import pandas as pd
23
22
  import requests
@@ -25,121 +24,163 @@ import requests
25
24
  from akshare.option.cons import (
26
25
  get_calendar,
27
26
  convert_date,
28
- DCE_DAILY_OPTION_URL,
29
- SHFE_OPTION_URL,
30
27
  CZCE_DAILY_OPTION_URL_3,
31
28
  SHFE_HEADERS,
32
29
  )
33
30
 
34
31
 
35
- def option_dce_daily(
36
- symbol: str = "聚乙烯期权", trade_date: str = "20210728"
37
- ) -> Optional[Tuple[Any, Any]]:
32
+ def option_hist_dce(
33
+ symbol: str = "聚丙烯期权", trade_date: str = "20251016"
34
+ ) -> pd.DataFrame:
38
35
  """
39
36
  大连商品交易所-期权-日频行情数据
40
37
  http://www.dce.com.cn/
41
38
  :param trade_date: 交易日
42
39
  :type trade_date: str
43
- :param symbol: choice of {"玉米期权", "豆粕期权", "铁矿石期权", "液化石油气期权", "聚乙烯期权", "聚氯乙烯期权", "聚丙烯期权", "棕榈油期权", "黄大豆1号期权", "黄大豆2号期权", "豆油期权", "乙二醇期权", "苯乙烯期权"}
40
+ :param symbol: choice of {"玉米期权", "豆粕期权", "铁矿石期权", "液化石油气期权", "聚乙烯期权", "聚氯乙烯期权",
41
+ "聚丙烯期权", "棕榈油期权", "黄大豆1号期权", "黄大豆2号期权", "豆油期权", "乙二醇期权", "苯乙烯期权",
42
+ "鸡蛋期权", "玉米淀粉期权", "生猪期权", "原木期权"}
44
43
  :type symbol: str
45
44
  :return: 日频行情数据
46
45
  :rtype: pandas.DataFrame
47
46
  """
47
+ option_code_map = {
48
+ "玉米期权": "c",
49
+ "豆粕期权": "m",
50
+ "铁矿石期权": "i",
51
+ "液化石油气期权": "pg",
52
+ "聚乙烯期权": "l",
53
+ "聚氯乙烯期权": "v",
54
+ "聚丙烯期权": "pp",
55
+ "棕榈油期权": "p",
56
+ "黄大豆1号期权": "a",
57
+ "黄大豆2号期权": "b",
58
+ "豆油期权": "y",
59
+ "乙二醇期权": "eg",
60
+ "苯乙烯期权": "eb",
61
+ "鸡蛋期权": "jd",
62
+ "玉米淀粉期权": "cs",
63
+ "生猪期权": "lh",
64
+ "原木期权": "lg"
65
+ }
48
66
  calendar = get_calendar()
49
67
  day = convert_date(trade_date) if trade_date is not None else datetime.date.today()
50
68
  if day.strftime("%Y%m%d") not in calendar:
51
69
  warnings.warn("%s非交易日" % day.strftime("%Y%m%d"))
52
- return
53
- url = DCE_DAILY_OPTION_URL
70
+ return pd.DataFrame()
71
+ url = "http://www.dce.com.cn/dcereport/publicweb/dailystat/dayQuotes"
54
72
  payload = {
55
- "dayQuotes.variety": "all",
56
- "dayQuotes.trade_type": "1",
57
- "year": str(day.year),
58
- "month": str(day.month - 1),
59
- "day": str(day.day),
60
- "exportFlag": "excel",
73
+ "contractId": "",
74
+ "lang": "zh",
75
+ "optionSeries": "",
76
+ "statisticsType": 0,
77
+ "tradeDate": f"{trade_date}",
78
+ "tradeType": "2",
79
+ "varietyId": f"{option_code_map[symbol]}",
61
80
  }
62
- res = requests.post(url, data=payload)
63
- table_df = pd.read_excel(BytesIO(res.content), header=1)
64
- another_df = table_df.iloc[
65
- table_df[table_df.iloc[:, 0].str.contains("合约")].iloc[-1].name :,
66
- [0, 1],
67
- ]
68
- another_df.reset_index(inplace=True, drop=True)
69
- another_df.columns = another_df.iloc[0]
70
- another_df = another_df.iloc[1:, :]
71
- if symbol == "豆粕期权":
72
- result_one_df, result_two_df = (
73
- table_df[table_df["商品名称"] == "豆粕"],
74
- another_df[another_df.iloc[:, 0].str.contains("m")],
75
- )
76
- elif symbol == "玉米期权":
77
- result_one_df, result_two_df = (
78
- table_df[table_df["商品名称"] == "玉米"],
79
- another_df[another_df.iloc[:, 0].str.contains("c")],
80
- )
81
- elif symbol == "铁矿石期权":
82
- result_one_df, result_two_df = (
83
- table_df[table_df["商品名称"] == "铁矿石"],
84
- another_df[another_df.iloc[:, 0].str.contains("i")],
85
- )
86
- elif symbol == "液化石油气期权":
87
- result_one_df, result_two_df = (
88
- table_df[table_df["商品名称"] == "液化石油气"],
89
- another_df[another_df.iloc[:, 0].str.contains("pg")],
90
- )
91
- elif symbol == "聚乙烯期权":
92
- result_one_df, result_two_df = (
93
- table_df[table_df["商品名称"] == "聚乙烯"],
94
- another_df[another_df.iloc[:, 0].str.contains("l")],
95
- )
96
- elif symbol == "聚氯乙烯期权":
97
- result_one_df, result_two_df = (
98
- table_df[table_df["商品名称"] == "聚氯乙烯"],
99
- another_df[another_df.iloc[:, 0].str.contains("v")],
100
- )
101
- elif symbol == "聚丙烯期权":
102
- result_one_df, result_two_df = (
103
- table_df[table_df["商品名称"] == "聚丙烯"],
104
- another_df[another_df.iloc[:, 0].str.contains("pp")],
105
- )
106
- elif symbol == "棕榈油期权":
107
- result_one_df, result_two_df = (
108
- table_df[table_df["商品名称"] == "棕榈油"],
109
- another_df[another_df.iloc[:, 0].str.contains(r"^p\d")],
110
- )
111
- elif symbol == "黄大豆1号期权":
112
- result_one_df, result_two_df = (
113
- table_df[table_df["商品名称"] == "豆一"],
114
- another_df[another_df.iloc[:, 0].str.contains("a")],
115
- )
116
- elif symbol == "黄大豆2号期权":
117
- result_one_df, result_two_df = (
118
- table_df[table_df["商品名称"] == "豆二"],
119
- another_df[another_df.iloc[:, 0].str.contains("b")],
120
- )
121
- elif symbol == "豆油期权":
122
- result_one_df, result_two_df = (
123
- table_df[table_df["商品名称"] == "豆油"],
124
- another_df[another_df.iloc[:, 0].str.contains("y")],
125
- )
126
- elif symbol == "乙二醇期权":
127
- result_one_df, result_two_df = (
128
- table_df[table_df["商品名称"] == "乙二醇"],
129
- another_df[another_df.iloc[:, 0].str.contains("eg")],
130
- )
131
- elif symbol == "苯乙烯期权":
132
- result_one_df, result_two_df = (
133
- table_df[table_df["商品名称"] == "苯乙烯"],
134
- another_df[another_df.iloc[:, 0].str.contains("eb")],
81
+ r = requests.post(url, json=payload)
82
+ data_json = r.json()
83
+ temp_df = pd.DataFrame(data_json["data"])
84
+ temp_df.rename(
85
+ columns={
86
+ 'variety': '品种名称',
87
+ 'contractId': '合约',
88
+ 'open': '开盘价',
89
+ 'high': '最高价',
90
+ 'low': '最低价',
91
+ 'close': '收盘价',
92
+ 'lastClear': '前结算价',
93
+ 'clearPrice': '结算价',
94
+ 'diff': '涨跌',
95
+ 'diff1': '涨跌1',
96
+ 'delta': 'Delta',
97
+ 'volumn': '成交量', # 注意:你写的是“volumn”,可能是拼写错误,应为“volume”
98
+ 'openInterest': '持仓量',
99
+ 'diffI': '持仓量变化',
100
+ 'turnover': '成交额',
101
+ 'matchQtySum': '行权量',
102
+ 'impliedVolatility': '隐含波动率(%)',
103
+ }, inplace=True
104
+ )
105
+ temp_df = temp_df[[
106
+ '品种名称',
107
+ '合约',
108
+ '开盘价',
109
+ '最高价',
110
+ '最低价',
111
+ '收盘价',
112
+ '前结算价',
113
+ '结算价',
114
+ '涨跌',
115
+ '涨跌1',
116
+ 'Delta',
117
+ '隐含波动率(%)',
118
+ '成交量',
119
+ '持仓量',
120
+ '持仓量变化',
121
+ '成交额',
122
+ '行权量'
123
+ ]]
124
+ comma_cols = ['开盘价',
125
+ '最高价',
126
+ '最低价',
127
+ '收盘价',
128
+ '前结算价',
129
+ '结算价',
130
+ '涨跌',
131
+ '涨跌1',
132
+ 'Delta',
133
+ '隐含波动率(%)',
134
+ '成交额',
135
+ ] # 需要处理的列
136
+ for col in comma_cols:
137
+ temp_df[col] = (
138
+ temp_df[col]
139
+ .astype(str)
140
+ .str.replace(',', '')
141
+ .pipe(pd.to_numeric, errors='coerce')
135
142
  )
136
- result_one_df.reset_index(inplace=True, drop=True)
137
- result_two_df.reset_index(inplace=True, drop=True)
138
- result_two_df.columns.name = None
139
- return result_one_df, result_two_df
143
+ return temp_df
144
+
145
+
146
+ def __option_czce_daily_convert_numeric_columns(df):
147
+ # 定义要处理的列
148
+ columns_to_convert = [
149
+ "昨结算",
150
+ "今开盘",
151
+ "最高价",
152
+ "最低价",
153
+ "今收盘",
154
+ "今结算",
155
+ "涨跌1",
156
+ "涨跌2",
157
+ "成交量(手)",
158
+ "持仓量",
159
+ "增减量",
160
+ "成交额(万元)",
161
+ "DELTA",
162
+ "隐含波动率",
163
+ "行权量",
164
+ ]
165
+
166
+ # 转换函数:去除逗号并转换为float
167
+ def convert_to_float(x):
168
+ try:
169
+ return float(str(x).replace(",", ""))
170
+ except: # noqa: E722
171
+ return x
140
172
 
173
+ # 创建 DataFrame 的副本以避免 SettingWithCopyWarning
174
+ df_copy = df.copy()
175
+ df_copy.columns = [item.strip() for item in df_copy]
176
+ # 应用转换
177
+ for col in columns_to_convert:
178
+ df_copy[col] = df_copy[col].apply(convert_to_float)
141
179
 
142
- def option_czce_daily(
180
+ return df_copy
181
+
182
+
183
+ def option_hist_czce(
143
184
  symbol: str = "白糖期权", trade_date: str = "20191017"
144
185
  ) -> pd.DataFrame:
145
186
  """
@@ -147,8 +188,9 @@ def option_czce_daily(
147
188
  http://www.czce.com.cn/cn/sspz/dejbqhqq/H770227index_1.htm#tabs-2
148
189
  :param trade_date: 交易日
149
190
  :type trade_date: str
150
- :param symbol: choice of {"白糖期权", "棉花期权", "甲醇期权", "PTA期权", "菜籽粕期权", "动力煤期权", "短纤期权",
151
- "菜籽油期权", "花生期权", "棉花期权", "短纤期权", "纯碱期权", "锰硅期权", "硅铁期权", "尿素期权", "对二甲苯期权", "烧碱期权", "玻璃期权"}
191
+ :param symbol: choice of {"白糖期权", "棉花期权", "甲醇期权", "PTA期权", "动力煤期权", "菜籽粕期权", "菜籽油期权",
192
+ "花生期权", "对二甲苯期权", "烧碱期权", "纯碱期权", "短纤期权", "锰硅期权", "硅铁期权", "尿素期权", "苹果期权", "红枣期权",
193
+ "玻璃期权", "瓶片期权", "丙烯期货"}
152
194
  :type symbol: str
153
195
  :return: 日频行情数据
154
196
  :rtype: pandas.DataFrame
@@ -164,91 +206,168 @@ def option_czce_daily(
164
206
  r = requests.get(url)
165
207
  f = StringIO(r.text)
166
208
  table_df = pd.read_table(f, encoding="utf-8", skiprows=1, sep="|")
209
+ table_df.columns = [
210
+ "合约代码",
211
+ "昨结算",
212
+ "今开盘",
213
+ "最高价",
214
+ "最低价",
215
+ "今收盘",
216
+ "今结算",
217
+ "涨跌1",
218
+ "涨跌2",
219
+ "成交量(手)",
220
+ "持仓量",
221
+ "增减量",
222
+ "成交额(万元)",
223
+ "DELTA",
224
+ "隐含波动率",
225
+ "行权量",
226
+ ]
167
227
  if symbol == "白糖期权":
168
228
  temp_df = table_df[table_df.iloc[:, 0].str.contains("SR")]
169
229
  temp_df.reset_index(inplace=True, drop=True)
170
- return temp_df.iloc[:-1, :]
171
- elif symbol == "PTA期权":
172
- temp_df = table_df[table_df.iloc[:, 0].str.contains("TA")]
230
+ temp_df = temp_df.iloc[:-1, :].copy()
231
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
232
+ return new_df
233
+ elif symbol == "棉花期权":
234
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("CF")]
173
235
  temp_df.reset_index(inplace=True, drop=True)
174
- return temp_df.iloc[:-1, :]
236
+ temp_df = temp_df.iloc[:-1, :].copy()
237
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
238
+ return new_df
175
239
  elif symbol == "甲醇期权":
176
240
  temp_df = table_df[table_df.iloc[:, 0].str.contains("MA")]
177
241
  temp_df.reset_index(inplace=True, drop=True)
178
- return temp_df.iloc[:-1, :]
179
- elif symbol == "菜籽粕期权":
180
- temp_df = table_df[table_df.iloc[:, 0].str.contains("RM")]
242
+ temp_df = temp_df.iloc[:-1, :].copy()
243
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
244
+ return new_df
245
+ elif symbol == "PTA期权":
246
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("TA")]
181
247
  temp_df.reset_index(inplace=True, drop=True)
182
- return temp_df.iloc[:-1, :]
248
+ temp_df = temp_df.iloc[:-1, :].copy()
249
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
250
+ return new_df
183
251
  elif symbol == "动力煤期权":
184
252
  temp_df = table_df[table_df.iloc[:, 0].str.contains("ZC")]
185
253
  temp_df.reset_index(inplace=True, drop=True)
186
- return temp_df.iloc[:-1, :]
254
+ temp_df = temp_df.iloc[:-1, :].copy()
255
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
256
+ return new_df
257
+ elif symbol == "菜籽粕期权":
258
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("RM")]
259
+ temp_df.reset_index(inplace=True, drop=True)
260
+ temp_df = temp_df.iloc[:-1, :].copy()
261
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
262
+ return new_df
187
263
  elif symbol == "菜籽油期权":
188
264
  temp_df = table_df[table_df.iloc[:, 0].str.contains("OI")]
189
265
  temp_df.reset_index(inplace=True, drop=True)
190
- return temp_df.iloc[:-1, :]
266
+ temp_df = temp_df.iloc[:-1, :].copy()
267
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
268
+ return new_df
191
269
  elif symbol == "花生期权":
192
270
  temp_df = table_df[table_df.iloc[:, 0].str.contains("PK")]
193
271
  temp_df.reset_index(inplace=True, drop=True)
194
- return temp_df.iloc[:-1, :]
195
- elif symbol == "棉花期权":
196
- temp_df = table_df[table_df.iloc[:, 0].str.contains("CF")]
197
- temp_df.reset_index(inplace=True, drop=True)
198
- return temp_df.iloc[:-1, :]
272
+ temp_df = temp_df.iloc[:-1, :].copy()
273
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
274
+ return new_df
199
275
  elif symbol == "短纤期权":
200
276
  temp_df = table_df[table_df.iloc[:, 0].str.contains("PF")]
201
277
  temp_df.reset_index(inplace=True, drop=True)
202
- return temp_df.iloc[:-1, :]
278
+ temp_df = temp_df.iloc[:-1, :].copy()
279
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
280
+ return new_df
281
+ elif symbol == "对二甲苯期权":
282
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("PX")]
283
+ temp_df.reset_index(inplace=True, drop=True)
284
+ temp_df = temp_df.iloc[:-1, :].copy()
285
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
286
+ return new_df
287
+ elif symbol == "烧碱期权":
288
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("SH")]
289
+ temp_df.reset_index(inplace=True, drop=True)
290
+ temp_df = temp_df.iloc[:-1, :].copy()
291
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
292
+ return new_df
203
293
  elif symbol == "纯碱期权":
204
294
  temp_df = table_df[table_df.iloc[:, 0].str.contains("SA")]
205
295
  temp_df.reset_index(inplace=True, drop=True)
206
- return temp_df.iloc[:-1, :]
296
+ temp_df = temp_df.iloc[:-1, :].copy()
297
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
298
+ return new_df
299
+ elif symbol == "短纤期权":
300
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("PF")]
301
+ temp_df.reset_index(inplace=True, drop=True)
302
+ temp_df = temp_df.iloc[:-1, :].copy()
303
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
304
+ return new_df
207
305
  elif symbol == "锰硅期权":
208
306
  temp_df = table_df[table_df.iloc[:, 0].str.contains("SM")]
209
307
  temp_df.reset_index(inplace=True, drop=True)
210
- return temp_df.iloc[:-1, :]
308
+ temp_df = temp_df.iloc[:-1, :].copy()
309
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
310
+ return new_df
211
311
  elif symbol == "硅铁期权":
212
312
  temp_df = table_df[table_df.iloc[:, 0].str.contains("SF")]
213
313
  temp_df.reset_index(inplace=True, drop=True)
214
- return temp_df.iloc[:-1, :]
314
+ temp_df = temp_df.iloc[:-1, :].copy()
315
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
316
+ return new_df
215
317
  elif symbol == "尿素期权":
216
318
  temp_df = table_df[table_df.iloc[:, 0].str.contains("UR")]
217
319
  temp_df.reset_index(inplace=True, drop=True)
218
- return temp_df.iloc[:-1, :]
219
- elif symbol == "对二甲苯期权":
220
- temp_df = table_df[table_df.iloc[:, 0].str.contains("PX")]
320
+ temp_df = temp_df.iloc[:-1, :].copy()
321
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
322
+ return new_df
323
+ elif symbol == "苹果期权":
324
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("AP")]
221
325
  temp_df.reset_index(inplace=True, drop=True)
222
- return temp_df.iloc[:-1, :]
223
- elif symbol == "烧碱期权":
224
- temp_df = table_df[table_df.iloc[:, 0].str.contains("SH")]
326
+ temp_df = temp_df.iloc[:-1, :].copy()
327
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
328
+ return new_df
329
+ elif symbol == "红枣期权":
330
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("CJ")]
225
331
  temp_df.reset_index(inplace=True, drop=True)
226
- return temp_df.iloc[:-1, :]
332
+ temp_df = temp_df.iloc[:-1, :].copy()
333
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
334
+ return new_df
227
335
  elif symbol == "玻璃期权":
228
336
  temp_df = table_df[table_df.iloc[:, 0].str.contains("FG")]
229
337
  temp_df.reset_index(inplace=True, drop=True)
230
- return temp_df.iloc[:-1, :]
231
- elif symbol == "短纤期权":
232
- temp_df = table_df[table_df.iloc[:, 0].str.contains("PF")]
338
+ temp_df = temp_df.iloc[:-1, :].copy()
339
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
340
+ return new_df
341
+ elif symbol == "瓶片期权":
342
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("PR")]
233
343
  temp_df.reset_index(inplace=True, drop=True)
234
- return temp_df.iloc[:-1, :]
235
- else:
236
- temp_df = table_df[table_df.iloc[:, 0].str.contains("AP")]
344
+ temp_df = temp_df.iloc[:-1, :].copy()
345
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
346
+ return new_df
347
+ elif symbol == "丙烯期权":
348
+ temp_df = table_df[table_df.iloc[:, 0].str.contains("PL")]
237
349
  temp_df.reset_index(inplace=True, drop=True)
238
- return temp_df.iloc[:-1, :]
350
+ temp_df = temp_df.iloc[:-1, :].copy()
351
+ new_df = __option_czce_daily_convert_numeric_columns(temp_df)
352
+ return new_df
353
+ else:
354
+ return pd.DataFrame()
239
355
  except: # noqa: E722
240
356
  return pd.DataFrame()
357
+ else:
358
+ return pd.DataFrame()
241
359
 
242
360
 
243
- def option_shfe_daily(
244
- symbol: str = "铝期权", trade_date: str = "20200827"
245
- ) -> Optional[pd.DataFrame]:
361
+ def option_hist_shfe(
362
+ symbol: str = "铝期权", trade_date: str = "20250418"
363
+ ) -> pd.DataFrame:
246
364
  """
247
365
  上海期货交易所-期权-日频行情数据
248
- https://tsite.shfe.com.cn/statements/dataview.html?paramid=kxQ
366
+ https://www.shfe.com.cn/reports/tradedata/dailyandweeklydata/
249
367
  :param trade_date: 交易日
250
368
  :type trade_date: str
251
- :param symbol: choice of {"铜期权", "天胶期权", "黄金期权", "铝期权", "锌期权"}
369
+ :param symbol: choice of {'原油期权', '铜期权', '铝期权', '锌期权', '铅期权', '螺纹钢期权', '镍期权', '锡期权', '氧化铝期权',
370
+ '黄金期权', '白银期权', '丁二烯橡胶期权', '天胶期权'}
252
371
  :type symbol: str
253
372
  :return: 日频行情数据
254
373
  :rtype: pandas.DataFrame
@@ -258,8 +377,8 @@ def option_shfe_daily(
258
377
  if day.strftime("%Y%m%d") not in calendar:
259
378
  warnings.warn("%s非交易日" % day.strftime("%Y%m%d"))
260
379
  return pd.DataFrame()
261
- if day > datetime.date(2010, 8, 24):
262
- url = SHFE_OPTION_URL.format(day.strftime("%Y%m%d"))
380
+ if day > datetime.date(year=2010, month=8, day=24):
381
+ url = f"""https://www.shfe.com.cn/data/tradedata/option/dailydata/kx{day.strftime("%Y%m%d")}.dat"""
263
382
  try:
264
383
  r = requests.get(url, headers=SHFE_HEADERS)
265
384
  json_data = r.json()
@@ -268,39 +387,29 @@ def option_shfe_daily(
268
387
  row
269
388
  for row in json_data["o_curinstrument"]
270
389
  if row["INSTRUMENTID"] not in ["小计", "合计"]
271
- and row["INSTRUMENTID"] != ""
390
+ and row["INSTRUMENTID"] != ""
272
391
  ]
273
392
  )
274
393
  contract_df = table_df[table_df["PRODUCTNAME"].str.strip() == symbol]
275
- volatility_df = pd.DataFrame(json_data["o_cursigma"])
276
- volatility_df = volatility_df[
277
- volatility_df["PRODUCTNAME"].str.strip() == symbol
278
- ]
279
- contract_df.columns = [
280
- "_",
281
- "_",
282
- "_",
283
- "合约代码",
284
- "前结算价",
285
- "开盘价",
286
- "最高价",
287
- "最低价",
288
- "收盘价",
289
- "结算价",
290
- "涨跌1",
291
- "涨跌2",
292
- "成交量",
293
- "持仓量",
294
- "持仓量变化",
295
- "_",
296
- "行权量",
297
- "成交额",
298
- "德尔塔",
299
- "_",
300
- "_",
301
- "_",
302
- "_",
303
- ]
394
+ contract_df.rename(
395
+ columns={
396
+ "INSTRUMENTID": "合约代码",
397
+ "OPENPRICE": "开盘价",
398
+ "HIGHESTPRICE": "最高价",
399
+ "LOWESTPRICE": "最低价",
400
+ "CLOSEPRICE": "收盘价",
401
+ "PRESETTLEMENTPRICE": "前结算价",
402
+ "SETTLEMENTPRICE": "结算价",
403
+ "ZD1_CHG": "涨跌1",
404
+ "ZD2_CHG": "涨跌2",
405
+ "VOLUME": "成交量",
406
+ "OPENINTEREST": "持仓量",
407
+ "OPENINTERESTCHG": "持仓量变化",
408
+ "TURNOVER": "成交额",
409
+ "DELTA": "德尔塔",
410
+ "EXECVOLUME": "行权量"
411
+ }, inplace=True
412
+ )
304
413
  contract_df = contract_df[
305
414
  [
306
415
  "合约代码",
@@ -320,21 +429,51 @@ def option_shfe_daily(
320
429
  "行权量",
321
430
  ]
322
431
  ]
432
+ contract_df.reset_index(inplace=True, drop=True)
433
+ return contract_df
434
+ except: # noqa: E722
435
+ return pd.DataFrame()
436
+ else:
437
+ return pd.DataFrame()
323
438
 
324
- volatility_df.columns = [
325
- "_",
326
- "_",
327
- "_",
328
- "合约系列",
329
- "成交量",
330
- "持仓量",
331
- "持仓量变化",
332
- "行权量",
333
- "成交额",
334
- "隐含波动率",
335
- "_",
336
- ]
337
439
 
440
+ def option_vol_shfe(
441
+ symbol: str = "铝期权", trade_date: str = "20250418"
442
+ ) -> pd.DataFrame:
443
+ """
444
+ 上海期货交易所-期权-日频行情数据
445
+ https://www.shfe.com.cn/reports/tradedata/dailyandweeklydata/
446
+ :param trade_date: 交易日
447
+ :type trade_date: str
448
+ :param symbol: choice of {'原油期权', '铜期权', '铝期权', '锌期权', '铅期权', '螺纹钢期权', '镍期权', '锡期权', '氧化铝期权',
449
+ '黄金期权', '白银期权', '丁二烯橡胶期权', '天胶期权'}
450
+ :type symbol: str
451
+ :return: 日频行情数据
452
+ :rtype: pandas.DataFrame
453
+ """
454
+ calendar = get_calendar()
455
+ day = convert_date(trade_date) if trade_date is not None else datetime.date.today()
456
+ if day.strftime("%Y%m%d") not in calendar:
457
+ warnings.warn("%s非交易日" % day.strftime("%Y%m%d"))
458
+ return pd.DataFrame()
459
+ if day > datetime.date(year=2010, month=8, day=24):
460
+ url = f"""https://www.shfe.com.cn/data/tradedata/option/dailydata/kx{day.strftime("%Y%m%d")}.dat"""
461
+ try:
462
+ r = requests.get(url, headers=SHFE_HEADERS)
463
+ json_data = r.json()
464
+ volatility_df = pd.DataFrame(json_data["o_cursigma"])
465
+ volatility_df = volatility_df[
466
+ volatility_df["PRODUCTNAME"].str.strip() == symbol
467
+ ]
468
+ volatility_df.rename(columns={
469
+ "INSTRUMENTID": "合约系列",
470
+ "VOLUME": "成交量",
471
+ "OPENINTEREST": "持仓量",
472
+ "OPENINTERESTCHG": "持仓量变化",
473
+ "TURNOVER": "成交额",
474
+ "EXECVOLUME": "行权量",
475
+ "SIGMA": "隐含波动率"
476
+ }, inplace=True)
338
477
  volatility_df = volatility_df[
339
478
  [
340
479
  "合约系列",
@@ -346,14 +485,15 @@ def option_shfe_daily(
346
485
  "隐含波动率",
347
486
  ]
348
487
  ]
349
- contract_df.reset_index(inplace=True, drop=True)
350
488
  volatility_df.reset_index(inplace=True, drop=True)
351
- return contract_df, volatility_df
489
+ return volatility_df
352
490
  except: # noqa: E722
353
- return
491
+ return pd.DataFrame()
492
+ else:
493
+ return pd.DataFrame()
354
494
 
355
495
 
356
- def option_gfex_daily(symbol: str = "工业硅", trade_date: str = "20230724"):
496
+ def option_hist_gfex(symbol: str = "工业硅", trade_date: str = "20230724") -> pd.DataFrame:
357
497
  """
358
498
  广州期货交易所-日频率-量价数据
359
499
  http://www.gfex.com.cn/gfex/rihq/hqsj_tjsj.shtml
@@ -368,7 +508,7 @@ def option_gfex_daily(symbol: str = "工业硅", trade_date: str = "20230724"):
368
508
  day = convert_date(trade_date) if trade_date is not None else datetime.date.today()
369
509
  if day.strftime("%Y%m%d") not in calendar:
370
510
  warnings.warn("%s非交易日" % day.strftime("%Y%m%d"))
371
- return
511
+ return pd.DataFrame()
372
512
  url = "http://www.gfex.com.cn/u/interfacesWebTiDayQuotes/loadList"
373
513
  payload = {"trade_date": day.strftime("%Y%m%d"), "trade_type": "1"}
374
514
  headers = {
@@ -384,7 +524,7 @@ def option_gfex_daily(symbol: str = "工业硅", trade_date: str = "20230724"):
384
524
  "Proxy-Connection": "keep-alive",
385
525
  "Referer": "http://www.gfex.com.cn/gfex/rihq/hqsj_tjsj.shtml",
386
526
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
387
- "Chrome/108.0.0.0 Safari/537.36",
527
+ "Chrome/108.0.0.0 Safari/537.36",
388
528
  "X-Requested-With": "XMLHttpRequest",
389
529
  "content-type": "application/x-www-form-urlencoded",
390
530
  }
@@ -440,7 +580,7 @@ def option_gfex_daily(symbol: str = "工业硅", trade_date: str = "20230724"):
440
580
  return temp_df
441
581
 
442
582
 
443
- def option_gfex_vol_daily(symbol: str = "碳酸锂", trade_date: str = "20230724"):
583
+ def option_vol_gfex(symbol: str = "碳酸锂", trade_date: str = "20230724"):
444
584
  """
445
585
  广州期货交易所-日频率-合约隐含波动率
446
586
  http://www.gfex.com.cn/gfex/rihq/hqsj_tjsj.shtml
@@ -454,6 +594,7 @@ def option_gfex_vol_daily(symbol: str = "碳酸锂", trade_date: str = "20230724
454
594
  symbol_code_map = {
455
595
  "工业硅": "si",
456
596
  "碳酸锂": "lc",
597
+ "多晶硅": "ps",
457
598
  }
458
599
  calendar = get_calendar()
459
600
  day = convert_date(trade_date) if trade_date is not None else datetime.date.today()
@@ -475,7 +616,7 @@ def option_gfex_vol_daily(symbol: str = "碳酸锂", trade_date: str = "20230724
475
616
  "Proxy-Connection": "keep-alive",
476
617
  "Referer": "http://www.gfex.com.cn/gfex/rihq/hqsj_tjsj.shtml",
477
618
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
478
- "Chrome/108.0.0.0 Safari/537.36",
619
+ "Chrome/108.0.0.0 Safari/537.36",
479
620
  "X-Requested-With": "XMLHttpRequest",
480
621
  "content-type": "application/x-www-form-urlencoded",
481
622
  }
@@ -502,40 +643,20 @@ def option_gfex_vol_daily(symbol: str = "碳酸锂", trade_date: str = "20230724
502
643
 
503
644
 
504
645
  if __name__ == "__main__":
505
- option_czce_daily_df = option_czce_daily(symbol="短纤期权", trade_date="20240718")
506
- print(option_czce_daily_df)
507
-
508
- option_dce_daily_one, option_dce_daily_two = option_dce_daily(
509
- symbol="黄大豆2号期权", trade_date="20220808"
510
- )
511
- print(option_dce_daily_one)
512
- print(option_dce_daily_two)
513
-
514
- option_dce_daily_one, option_dce_daily_two = option_dce_daily(
515
- symbol="苯乙烯期权", trade_date="20230516"
516
- )
517
- print(option_dce_daily_one)
518
- print(option_dce_daily_two)
646
+ option_hist_czce_df = option_hist_czce(symbol="白糖期权", trade_date="20250812")
647
+ print(option_hist_czce_df)
519
648
 
520
- option_dce_daily_one, option_dce_daily_two = option_dce_daily(
521
- symbol="乙二醇期权", trade_date="20230516"
522
- )
523
- print(option_dce_daily_one)
524
- print(option_dce_daily_two)
649
+ option_hist_dce_df = option_hist_dce(symbol="聚丙烯期权", trade_date="20250812")
650
+ print(option_hist_dce_df)
525
651
 
526
- option_shfe_daily_one, option_shfe_daily_two = option_shfe_daily(
527
- symbol="天胶期权", trade_date="20210312"
528
- )
529
- print(option_shfe_daily_one)
530
- print(option_shfe_daily_two)
652
+ option_hist_shfe_df = option_hist_shfe(symbol="天胶期权", trade_date="20250418")
653
+ print(option_hist_shfe_df)
531
654
 
532
- option_gfex_daily_df = option_gfex_daily(symbol="工业硅", trade_date="20240102")
533
- print(option_gfex_daily_df)
655
+ option_vol_shfe_df = option_vol_shfe(symbol="天胶期权", trade_date="20250418")
656
+ print(option_vol_shfe_df)
534
657
 
535
- option_gfex_vol_daily_df = option_gfex_vol_daily(
536
- symbol="工业硅", trade_date="20230418"
537
- )
538
- print(option_gfex_vol_daily_df)
658
+ option_hist_gfex_df = option_hist_gfex(symbol="工业硅", trade_date="20250801")
659
+ print(option_hist_gfex_df)
539
660
 
540
- option_czce_daily_df = option_czce_daily(symbol="短纤期权", trade_date="20231116")
541
- print(option_czce_daily_df)
661
+ option_vol_gfex_df = option_vol_gfex(symbol="多晶硅", trade_date="20250123")
662
+ print(option_vol_gfex_df)