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.
- akshare/__init__.py +441 -138
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +29 -43
- akshare/air/sunrise_tad.py +32 -17
- akshare/bank/bank_cbirc_2020.py +12 -9
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +75 -48
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_zh_cov.py +1 -1
- akshare/bond/bond_zh_sina.py +57 -51
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/currency/currency_safe.py +7 -6
- akshare/data/cninfo.js +15 -0
- akshare/datasets.py +10 -21
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_china.py +772 -1024
- akshare/economic/macro_china_hk.py +65 -243
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_constitute.py +17 -12
- akshare/economic/macro_euro.py +13 -6
- akshare/economic/macro_finance_ths.py +133 -0
- akshare/economic/macro_info_ws.py +100 -0
- akshare/economic/macro_japan.py +5 -4
- akshare/economic/macro_other.py +12 -9
- akshare/economic/macro_usa.py +376 -1940
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +94 -125
- akshare/event/migration.py +3 -2
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/fortune/fortune_500.py +15 -48
- akshare/fund/fund_amac.py +157 -75
- akshare/fund/fund_em.py +191 -184
- akshare/fund/fund_etf_em.py +16 -15
- akshare/fund/fund_etf_sina.py +71 -23
- akshare/fund/fund_etf_ths.py +93 -0
- akshare/fund/fund_fee_em.py +98 -0
- akshare/fund/fund_portfolio_em.py +60 -50
- akshare/fund/fund_rank_em.py +91 -82
- akshare/fund/fund_report_cninfo.py +63 -48
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +139 -109
- akshare/futures/cons.py +8 -31
- akshare/futures/cot.py +185 -137
- akshare/futures/futures_basis.py +97 -32
- akshare/futures/futures_comm_ctp.py +37 -0
- akshare/futures/futures_comm_qihuo.py +74 -45
- akshare/futures/futures_daily_bar.py +121 -184
- akshare/futures/futures_hf_em.py +66 -61
- akshare/futures/futures_hq_sina.py +79 -61
- akshare/futures/futures_index_ccidx.py +6 -3
- akshare/futures/futures_inventory_99.py +61 -272
- akshare/futures/futures_news_shmet.py +4 -2
- akshare/futures/futures_roll_yield.py +12 -25
- akshare/futures/futures_spot_stock_em.py +19 -13
- akshare/futures/futures_stock_js.py +14 -12
- akshare/futures/futures_to_spot.py +38 -33
- akshare/futures/futures_warehouse_receipt.py +75 -71
- akshare/futures/futures_zh_sina.py +5 -5
- akshare/futures/symbol_var.py +18 -13
- akshare/futures_derivative/futures_contract_info_czce.py +60 -52
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
- akshare/futures_derivative/futures_cot_sina.py +26 -19
- akshare/futures_derivative/futures_spot_sys.py +21 -8
- akshare/fx/currency_investing.py +19 -285
- akshare/index/index_cflp.py +29 -26
- akshare/index/index_cni.py +86 -88
- akshare/index/index_cons.py +26 -10
- akshare/index/index_cx.py +248 -47
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_option_qvix.py +329 -0
- akshare/index/index_research_fund_sw.py +134 -0
- akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +35 -16
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +180 -89
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +46 -23
- akshare/index/index_zh_a_scope.py +48 -0
- akshare/index/index_zh_em.py +6 -4
- akshare/interest_rate/interbank_rate_em.py +14 -9
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/news_baidu.py +78 -44
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +6 -3
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +11 -11
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +178 -51
- akshare/option/option_daily_stats_sse_szse.py +146 -0
- akshare/option/option_em.py +147 -138
- akshare/option/option_finance_sina.py +160 -137
- akshare/option/option_lhb_em.py +62 -56
- akshare/option/option_risk_indicator_sse.py +17 -14
- akshare/other/other_car_cpca.py +934 -0
- akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/request.py +117 -0
- akshare/spot/spot_hog_soozhu.py +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +63 -10
- akshare/stock/stock_allotment_cninfo.py +10 -9
- akshare/stock/stock_board_concept_em.py +23 -14
- akshare/stock/stock_board_industry_em.py +40 -34
- akshare/stock/stock_cg_equity_mortgage.py +15 -11
- akshare/stock/stock_cg_guarantee.py +41 -51
- akshare/stock/stock_cg_lawsuit.py +36 -35
- akshare/stock/stock_dividend_cninfo.py +12 -6
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +332 -84
- akshare/stock/stock_hk_famous.py +108 -0
- akshare/stock/stock_hk_sina.py +8 -7
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -3
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- akshare/stock/stock_hot_rank_em.py +2 -1
- akshare/stock/stock_hot_search_baidu.py +5 -2
- akshare/stock/stock_industry_cninfo.py +24 -18
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +9 -10
- akshare/stock/stock_info.py +25 -15
- akshare/stock/stock_info_em.py +5 -2
- akshare/stock/stock_intraday_em.py +5 -2
- akshare/stock/stock_intraday_sina.py +22 -18
- akshare/stock/stock_ipo_summary_cninfo.py +25 -10
- akshare/stock/stock_new_cninfo.py +32 -19
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +9 -8
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- akshare/stock/stock_share_hold.py +24 -19
- akshare/stock/stock_summary.py +54 -26
- akshare/stock/stock_us_famous.py +15 -6
- akshare/stock/stock_us_pink.py +7 -5
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_xq.py +38 -12
- akshare/stock/stock_zh_a_sina.py +53 -78
- akshare/stock/stock_zh_b_sina.py +32 -55
- akshare/stock/stock_zh_kcb_report.py +11 -9
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +12 -9
- akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
- akshare/stock_feature/stock_account_em.py +58 -40
- akshare/stock_feature/stock_analyst_em.py +36 -27
- akshare/stock_feature/stock_board_industry_ths.py +136 -400
- akshare/stock_feature/stock_comment_em.py +118 -85
- akshare/stock_feature/stock_concept_futu.py +183 -0
- akshare/stock_feature/stock_cyq_em.py +58 -54
- akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
- akshare/stock_feature/stock_esg_sina.py +216 -11
- akshare/stock_feature/stock_fhps_em.py +60 -25
- akshare/stock_feature/stock_fhps_ths.py +25 -6
- akshare/stock_feature/stock_fund_flow.py +38 -25
- akshare/stock_feature/stock_gdfx_em.py +180 -95
- akshare/stock_feature/stock_gdhs.py +73 -49
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_hist_em.py +55 -23
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hsgt_em.py +184 -452
- akshare/stock_feature/stock_info.py +52 -29
- akshare/stock_feature/stock_inner_trade_xq.py +39 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +41 -38
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +135 -71
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +102 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
- akshare/stock_feature/stock_market_legu.py +13 -8
- akshare/stock_feature/stock_pankou_em.py +72 -34
- akshare/stock_feature/stock_report_em.py +244 -54
- akshare/stock_feature/stock_research_report_em.py +48 -19
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +86 -33
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +35 -13
- akshare/stock_feature/stock_three_report_em.py +119 -77
- akshare/stock_feature/stock_ttm_lyr.py +4 -7
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_wencai.py +21 -9
- akshare/stock_feature/stock_yjyg_em.py +63 -28
- akshare/stock_feature/stock_zf_pg.py +61 -38
- akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
- akshare/stock_feature/stock_ztb_em.py +62 -40
- akshare/stock_fundamental/stock_finance.py +150 -58
- akshare/stock_fundamental/stock_finance_ths.py +116 -31
- akshare/stock_fundamental/stock_mda_ym.py +5 -3
- akshare/stock_fundamental/stock_notice.py +29 -15
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
- akshare/stock_fundamental/stock_register_em.py +448 -0
- akshare/stock_fundamental/stock_restricted_em.py +79 -32
- akshare/stock_fundamental/stock_zygc.py +10 -8
- akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
- akshare/tool/trade_date_hist.py +4 -3
- akshare/utils/cons.py +10 -0
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2 -2
- akshare/utils/func.py +26 -0
- akshare/utils/tqdm.py +13 -3
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
- akshare-1.15.72.dist-info/RECORD +385 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
- tests/test_func.py +3 -5
- akshare/bond/bond_futures.py +0 -50
- akshare/bond/bond_investing.py +0 -139
- akshare/crypto/crypto_hist_investing.py +0 -249
- akshare/fortune/fortune_it_juzi.py +0 -123
- akshare/futures/futures_international.py +0 -170
- akshare/futures/futures_news_baidu.py +0 -54
- akshare/futures/inventory_data.py +0 -100
- akshare/futures_derivative/futures_index_price_nh.py +0 -61
- akshare/futures_derivative/futures_index_return_nh.py +0 -47
- akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -71
- akshare/index/index_investing.py +0 -232
- akshare/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_board_concept_ths.py +0 -422
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.12.99.dist-info/RECORD +0 -374
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
"""
|
|
3
|
-
Date:
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 = "
|
|
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 = "
|
|
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 = "
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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)
|
|
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"
|
|
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)
|
|
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"
|
|
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": "
|
|
615
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
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"
|
|
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": "
|
|
681
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
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)
|
|
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
|
|
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(
|
|
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 = "
|
|
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)
|
|
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)
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
844
|
-
|
|
845
|
-
|
|
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[
|
|
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
|
-
|
|
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="
|
|
978
|
+
option_minute_em_df = option_minute_em(symbol="IO2406-C-3500")
|
|
956
979
|
print(option_minute_em_df)
|