fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
980 lines
37 KiB
Python
980 lines
37 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Date: 2024/6/21 18:00
|
|
Desc: 新浪财经-股票期权
|
|
https://stock.finance.sina.com.cn/option/quotes.html
|
|
期权-中金所-沪深 300 指数
|
|
https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php
|
|
期权-上交所-50ETF
|
|
期权-上交所-300ETF
|
|
期权-上交所-500ETF
|
|
https://stock.finance.sina.com.cn/option/quotes.html
|
|
"""
|
|
|
|
import datetime
|
|
import json
|
|
from functools import lru_cache
|
|
from typing import Dict, List, Tuple
|
|
|
|
import pandas as pd
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
|
|
from akshare.option.option_em import option_current_em
|
|
from akshare.utils.func import set_df_columns
|
|
|
|
|
|
# 期权-中金所-上证50指数
|
|
def option_cffex_sz50_list_sina() -> Dict[str, List[str]]:
|
|
"""
|
|
新浪财经-中金所-上证 50 指数-所有合约, 返回的第一个合约为主力合约
|
|
目前新浪财经-中金所有上证 50 指数,沪深 300 指数和中证 1000 指数
|
|
:return: 中金所-上证 50 指数-所有合约
|
|
:rtype: dict
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php/ho/cffex"
|
|
r = requests.get(url)
|
|
soup = BeautifulSoup(r.text, features="lxml")
|
|
symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[0].text
|
|
temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
|
|
contract = [item.text for item in temp_attr]
|
|
return {symbol: contract}
|
|
|
|
|
|
# 期权-中金所-沪深300指数
|
|
def option_cffex_hs300_list_sina() -> Dict[str, List[str]]:
|
|
"""
|
|
新浪财经-中金所-沪深 300 指数-所有合约, 返回的第一个合约为主力合约
|
|
目前新浪财经-中金所有沪深 300 指数和中证 1000 指数
|
|
:return: 中金所-沪深300指数-所有合约
|
|
:rtype: dict
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php"
|
|
r = requests.get(url)
|
|
soup = BeautifulSoup(r.text, features="lxml")
|
|
symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[1].text
|
|
temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
|
|
contract = [item.text for item in temp_attr]
|
|
return {symbol: contract}
|
|
|
|
|
|
def option_cffex_zz1000_list_sina() -> Dict[str, List[str]]:
|
|
"""
|
|
新浪财经-中金所-中证 1000 指数-所有合约, 返回的第一个合约为主力合约
|
|
目前新浪财经-中金所有沪深 300 指数和中证 1000 指数
|
|
:return: 中金所-中证 1000 指数-所有合约
|
|
:rtype: dict
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php/mo/cffex"
|
|
r = requests.get(url)
|
|
soup = BeautifulSoup(r.text, features="lxml")
|
|
symbol = soup.find(attrs={"id": "option_symbol"}).find_all("li")[2].text
|
|
temp_attr = soup.find(attrs={"id": "option_suffix"}).find_all("li")
|
|
contract = [item.text for item in temp_attr]
|
|
return {symbol: contract}
|
|
|
|
|
|
def option_cffex_sz50_spot_sina(symbol: str = "ho2303") -> pd.DataFrame:
|
|
"""
|
|
中金所-上证 50 指数-指定合约-实时行情
|
|
https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php/ho/cffex
|
|
:param symbol: 合约代码; 用 ak.option_cffex_sz300_list_sina() 函数查看
|
|
:type symbol: str
|
|
:return: 中金所-上证 50 指数-指定合约-看涨看跌实时行情
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/OptionService.getOptionData"
|
|
params = {
|
|
"type": "futures",
|
|
"product": "ho",
|
|
"exchange": "cffex",
|
|
"pinzhong": symbol,
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
|
|
option_call_df = pd.DataFrame(
|
|
data_json["result"]["data"]["up"],
|
|
columns=[
|
|
"看涨合约-买量",
|
|
"看涨合约-买价",
|
|
"看涨合约-最新价",
|
|
"看涨合约-卖价",
|
|
"看涨合约-卖量",
|
|
"看涨合约-持仓量",
|
|
"看涨合约-涨跌",
|
|
"行权价",
|
|
"看涨合约-标识",
|
|
],
|
|
)
|
|
option_put_df = pd.DataFrame(
|
|
data_json["result"]["data"]["down"],
|
|
columns=[
|
|
"看跌合约-买量",
|
|
"看跌合约-买价",
|
|
"看跌合约-最新价",
|
|
"看跌合约-卖价",
|
|
"看跌合约-卖量",
|
|
"看跌合约-持仓量",
|
|
"看跌合约-涨跌",
|
|
"看跌合约-标识",
|
|
],
|
|
)
|
|
data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
|
|
data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
|
|
data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
|
|
data_df["看涨合约-最新价"] = pd.to_numeric(
|
|
data_df["看涨合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
|
|
data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
|
|
data_df["看涨合约-持仓量"] = pd.to_numeric(
|
|
data_df["看涨合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
|
|
data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
|
|
data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
|
|
data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
|
|
data_df["看跌合约-最新价"] = pd.to_numeric(
|
|
data_df["看跌合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
|
|
data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
|
|
data_df["看跌合约-持仓量"] = pd.to_numeric(
|
|
data_df["看跌合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_cffex_hs300_spot_sina(symbol: str = "io2204") -> pd.DataFrame:
|
|
"""
|
|
中金所-沪深 300 指数-指定合约-实时行情
|
|
https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php
|
|
:param symbol: 合约代码; 用 option_cffex_hs300_list_sina 函数查看
|
|
:type symbol: str
|
|
:return: 中金所-沪深300指数-指定合约-看涨看跌实时行情
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/OptionService.getOptionData"
|
|
params = {
|
|
"type": "futures",
|
|
"product": "io",
|
|
"exchange": "cffex",
|
|
"pinzhong": symbol,
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
|
|
option_call_df = pd.DataFrame(
|
|
data_json["result"]["data"]["up"],
|
|
columns=[
|
|
"看涨合约-买量",
|
|
"看涨合约-买价",
|
|
"看涨合约-最新价",
|
|
"看涨合约-卖价",
|
|
"看涨合约-卖量",
|
|
"看涨合约-持仓量",
|
|
"看涨合约-涨跌",
|
|
"行权价",
|
|
"看涨合约-标识",
|
|
],
|
|
)
|
|
option_put_df = pd.DataFrame(
|
|
data_json["result"]["data"]["down"],
|
|
columns=[
|
|
"看跌合约-买量",
|
|
"看跌合约-买价",
|
|
"看跌合约-最新价",
|
|
"看跌合约-卖价",
|
|
"看跌合约-卖量",
|
|
"看跌合约-持仓量",
|
|
"看跌合约-涨跌",
|
|
"看跌合约-标识",
|
|
],
|
|
)
|
|
data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
|
|
data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
|
|
data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
|
|
data_df["看涨合约-最新价"] = pd.to_numeric(
|
|
data_df["看涨合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
|
|
data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
|
|
data_df["看涨合约-持仓量"] = pd.to_numeric(
|
|
data_df["看涨合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
|
|
data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
|
|
data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
|
|
data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
|
|
data_df["看跌合约-最新价"] = pd.to_numeric(
|
|
data_df["看跌合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
|
|
data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
|
|
data_df["看跌合约-持仓量"] = pd.to_numeric(
|
|
data_df["看跌合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_cffex_zz1000_spot_sina(symbol: str = "mo2208") -> pd.DataFrame:
|
|
"""
|
|
中金所-中证 1000 指数-指定合约-实时行情
|
|
https://stock.finance.sina.com.cn/futures/view/optionsCffexDP.php
|
|
:param symbol: 合约代码; 用 option_cffex_zz1000_list_sina 函数查看
|
|
:type symbol: str
|
|
:return: 中金所-中证 1000 指数-指定合约-看涨看跌实时行情
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/OptionService.getOptionData"
|
|
params = {
|
|
"type": "futures",
|
|
"product": "mo",
|
|
"exchange": "cffex",
|
|
"pinzhong": symbol,
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_json = json.loads(data_text[data_text.find("{") : data_text.rfind("}") + 1])
|
|
option_call_df = pd.DataFrame(
|
|
data_json["result"]["data"]["up"],
|
|
columns=[
|
|
"看涨合约-买量",
|
|
"看涨合约-买价",
|
|
"看涨合约-最新价",
|
|
"看涨合约-卖价",
|
|
"看涨合约-卖量",
|
|
"看涨合约-持仓量",
|
|
"看涨合约-涨跌",
|
|
"行权价",
|
|
"看涨合约-标识",
|
|
],
|
|
)
|
|
option_put_df = pd.DataFrame(
|
|
data_json["result"]["data"]["down"],
|
|
columns=[
|
|
"看跌合约-买量",
|
|
"看跌合约-买价",
|
|
"看跌合约-最新价",
|
|
"看跌合约-卖价",
|
|
"看跌合约-卖量",
|
|
"看跌合约-持仓量",
|
|
"看跌合约-涨跌",
|
|
"看跌合约-标识",
|
|
],
|
|
)
|
|
data_df = pd.concat(objs=[option_call_df, option_put_df], axis=1)
|
|
data_df["看涨合约-买量"] = pd.to_numeric(data_df["看涨合约-买量"], errors="coerce")
|
|
data_df["看涨合约-买价"] = pd.to_numeric(data_df["看涨合约-买价"], errors="coerce")
|
|
data_df["看涨合约-最新价"] = pd.to_numeric(
|
|
data_df["看涨合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-卖价"] = pd.to_numeric(data_df["看涨合约-卖价"], errors="coerce")
|
|
data_df["看涨合约-卖量"] = pd.to_numeric(data_df["看涨合约-卖量"], errors="coerce")
|
|
data_df["看涨合约-持仓量"] = pd.to_numeric(
|
|
data_df["看涨合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看涨合约-涨跌"] = pd.to_numeric(data_df["看涨合约-涨跌"], errors="coerce")
|
|
data_df["行权价"] = pd.to_numeric(data_df["行权价"], errors="coerce")
|
|
data_df["看跌合约-买量"] = pd.to_numeric(data_df["看跌合约-买量"], errors="coerce")
|
|
data_df["看跌合约-买价"] = pd.to_numeric(data_df["看跌合约-买价"], errors="coerce")
|
|
data_df["看跌合约-最新价"] = pd.to_numeric(
|
|
data_df["看跌合约-最新价"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-卖价"] = pd.to_numeric(data_df["看跌合约-卖价"], errors="coerce")
|
|
data_df["看跌合约-卖量"] = pd.to_numeric(data_df["看跌合约-卖量"], errors="coerce")
|
|
data_df["看跌合约-持仓量"] = pd.to_numeric(
|
|
data_df["看跌合约-持仓量"], errors="coerce"
|
|
)
|
|
data_df["看跌合约-涨跌"] = pd.to_numeric(data_df["看跌合约-涨跌"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_cffex_sz50_daily_sina(symbol: str = "ho2303P2350") -> pd.DataFrame:
|
|
"""
|
|
新浪财经-中金所-上证 50 指数-指定合约-日频行情
|
|
:param symbol: 具体合约代码(包括看涨和看跌标识), 可以通过 ak.option_cffex_sz50_spot_sina 中的 call-标识 获取
|
|
:type symbol: str
|
|
:return: 日频率数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
year = datetime.datetime.now().year
|
|
month = datetime.datetime.now().month
|
|
day = datetime.datetime.now().day
|
|
url = (
|
|
f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
|
|
f"=/FutureOptionAllService.getOptionDayline"
|
|
)
|
|
params = {"symbol": symbol}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_df = pd.DataFrame(
|
|
eval(data_text[data_text.find("[") : data_text.rfind("]") + 1])
|
|
)
|
|
data_df.columns = ["open", "high", "low", "close", "volume", "date"]
|
|
data_df = data_df[
|
|
[
|
|
"date",
|
|
"open",
|
|
"high",
|
|
"low",
|
|
"close",
|
|
"volume",
|
|
]
|
|
]
|
|
data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
|
|
data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
|
|
data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
|
|
data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
|
|
data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
|
|
data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_cffex_hs300_daily_sina(symbol: str = "io2202P4350") -> pd.DataFrame:
|
|
"""
|
|
新浪财经-中金所-沪深300指数-指定合约-日频行情
|
|
:param symbol: 具体合约代码(包括看涨和看跌标识), 可以通过 ak.option_cffex_hs300_spot_sina 中的 call-标识 获取
|
|
:type symbol: str
|
|
:return: 日频率数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
year = datetime.datetime.now().year
|
|
month = datetime.datetime.now().month
|
|
day = datetime.datetime.now().day
|
|
url = (
|
|
f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
|
|
f"=/FutureOptionAllService.getOptionDayline"
|
|
)
|
|
params = {"symbol": symbol}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_df = pd.DataFrame(
|
|
eval(data_text[data_text.find("[") : data_text.rfind("]") + 1])
|
|
)
|
|
data_df.columns = ["open", "high", "low", "close", "volume", "date"]
|
|
data_df = data_df[
|
|
[
|
|
"date",
|
|
"open",
|
|
"high",
|
|
"low",
|
|
"close",
|
|
"volume",
|
|
]
|
|
]
|
|
data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
|
|
data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
|
|
data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
|
|
data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
|
|
data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
|
|
data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_cffex_zz1000_daily_sina(
|
|
symbol: str = "mo2208P6200",
|
|
) -> pd.DataFrame:
|
|
"""
|
|
新浪财经-中金所-中证 1000 指数-指定合约-日频行情
|
|
:param symbol: 具体合约代码(包括看涨和看跌标识), 可以通过 ak.option_cffex_zz1000_spot_sina 中的 call-标识 获取
|
|
:type symbol: str
|
|
:return: 日频率数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
year = datetime.datetime.now().year
|
|
month = datetime.datetime.now().month
|
|
day = datetime.datetime.now().day
|
|
url = (
|
|
f"https://stock.finance.sina.com.cn/futures/api/jsonp.php/var%20_{symbol}{year}_{month}_{day}"
|
|
f"=/FutureOptionAllService.getOptionDayline"
|
|
)
|
|
params = {"symbol": symbol}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_df = pd.DataFrame(
|
|
eval(data_text[data_text.find("[") : data_text.rfind("]") + 1])
|
|
)
|
|
data_df.columns = ["open", "high", "low", "close", "volume", "date"]
|
|
data_df = data_df[
|
|
[
|
|
"date",
|
|
"open",
|
|
"high",
|
|
"low",
|
|
"close",
|
|
"volume",
|
|
]
|
|
]
|
|
data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
|
|
data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
|
|
data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
|
|
data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
|
|
data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
|
|
data_df["volume"] = pd.to_numeric(data_df["volume"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
# 期权-上交所-50ETF
|
|
def option_sse_list_sina(symbol: str = "50ETF", exchange: str = "null") -> List[str]:
|
|
"""
|
|
新浪财经-期权-上交所-50ETF-合约到期月份列表
|
|
https://stock.finance.sina.com.cn/option/quotes.html
|
|
:param symbol: 50ETF or 300ETF
|
|
:type symbol: str
|
|
:param exchange: null
|
|
:type exchange: str
|
|
:return: 合约到期时间
|
|
:rtype: list
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName"
|
|
params = {"exchange": f"{exchange}", "cate": f"{symbol}"}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
date_list = data_json["result"]["data"]["contractMonth"]
|
|
return ["".join(i.split("-")) for i in date_list][1:]
|
|
|
|
|
|
def option_sse_expire_day_sina(
|
|
trade_date: str = "202102", symbol: str = "50ETF", exchange: str = "null"
|
|
) -> Tuple[str, int]:
|
|
"""
|
|
指定到期月份指定品种的剩余到期时间
|
|
:param trade_date: 到期月份: 202002, 20203, 20206, 20209
|
|
:type trade_date: str
|
|
:param symbol: 50ETF or 300ETF
|
|
:type symbol: str
|
|
:param exchange: null
|
|
:type exchange: str
|
|
:return: (到期时间, 剩余时间)
|
|
:rtype: tuple
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
|
|
params = {
|
|
"exchange": f"{exchange}",
|
|
"cate": f"{symbol}",
|
|
"date": f"{trade_date[:4]}-{trade_date[4:]}",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
data = data_json["result"]["data"]
|
|
if int(data["remainderDays"]) < 0:
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay"
|
|
params = {
|
|
"exchange": f"{exchange}",
|
|
"cate": f"{'XD' + symbol}",
|
|
"date": f"{trade_date[:4]}-{trade_date[4:]}",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_json = r.json()
|
|
data = data_json["result"]["data"]
|
|
return data["expireDay"], int(data["remainderDays"])
|
|
|
|
|
|
def option_sse_codes_sina(
|
|
symbol: str = "看涨期权",
|
|
trade_date: str = "202202",
|
|
underlying: str = "510050",
|
|
) -> pd.DataFrame:
|
|
"""
|
|
上海证券交易所-所有看涨和看跌合约的代码
|
|
|
|
:param symbol: choice of {"看涨期权", "看跌期权"}
|
|
:type symbol: str
|
|
:param trade_date: 期权到期月份
|
|
:type trade_date: "202002"
|
|
:param underlying: 标的产品代码 华夏上证 50ETF: 510050 or 华泰柏瑞沪深 300ETF: 510300
|
|
:type underlying: str
|
|
:return: 看涨看跌合约的代码
|
|
:rtype: Tuple[List, List]
|
|
"""
|
|
if symbol == "看涨期权":
|
|
url = "".join(
|
|
[
|
|
"https://hq.sinajs.cn/list=OP_UP_",
|
|
underlying,
|
|
str(trade_date)[-4:],
|
|
]
|
|
)
|
|
else:
|
|
url = "".join(
|
|
[
|
|
"https://hq.sinajs.cn/list=OP_DOWN_",
|
|
underlying,
|
|
str(trade_date)[-4:],
|
|
]
|
|
)
|
|
headers = {
|
|
"Accept": "*/*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"Cache-Control": "no-cache",
|
|
"Connection": "keep-alive",
|
|
"Host": "hq.sinajs.cn",
|
|
"Pragma": "no-cache",
|
|
"Referer": "https://stock.finance.sina.com.cn/",
|
|
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"Sec-Fetch-Dest": "script",
|
|
"Sec-Fetch-Mode": "no-cors",
|
|
"Sec-Fetch-Site": "cross-site",
|
|
"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",
|
|
}
|
|
r = requests.get(url, headers=headers)
|
|
data_text = r.text
|
|
data_temp = data_text.replace('"', ",").split(",")
|
|
temp_list = [i[7:] for i in data_temp if i.startswith("CON_OP_")]
|
|
temp_df = pd.DataFrame(temp_list)
|
|
temp_df.reset_index(inplace=True)
|
|
temp_df["index"] = temp_df.index + 1
|
|
temp_df.columns = [
|
|
"序号",
|
|
"期权代码",
|
|
]
|
|
return temp_df
|
|
|
|
|
|
def option_sse_spot_price_sina(symbol: str = "10003720") -> pd.DataFrame:
|
|
"""
|
|
新浪财经-期权-期权实时数据
|
|
:param symbol: 期权代码
|
|
:type symbol: str
|
|
:return: 期权量价数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = f"https://hq.sinajs.cn/list=CON_OP_{symbol}"
|
|
headers = {
|
|
"Accept": "*/*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"Cache-Control": "no-cache",
|
|
"Connection": "keep-alive",
|
|
"Host": "hq.sinajs.cn",
|
|
"Pragma": "no-cache",
|
|
"Referer": "https://stock.finance.sina.com.cn/",
|
|
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"Sec-Fetch-Dest": "script",
|
|
"Sec-Fetch-Mode": "no-cors",
|
|
"Sec-Fetch-Site": "cross-site",
|
|
"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",
|
|
}
|
|
r = requests.get(url, headers=headers)
|
|
data_text = r.text
|
|
data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
|
|
field_list = [
|
|
"买量",
|
|
"买价",
|
|
"最新价",
|
|
"卖价",
|
|
"卖量",
|
|
"持仓量",
|
|
"涨幅",
|
|
"行权价",
|
|
"昨收价",
|
|
"开盘价",
|
|
"涨停价",
|
|
"跌停价",
|
|
"申卖价五",
|
|
"申卖量五",
|
|
"申卖价四",
|
|
"申卖量四",
|
|
"申卖价三",
|
|
"申卖量三",
|
|
"申卖价二",
|
|
"申卖量二",
|
|
"申卖价一",
|
|
"申卖量一",
|
|
"申买价一",
|
|
"申买量一 ",
|
|
"申买价二",
|
|
"申买量二",
|
|
"申买价三",
|
|
"申买量三",
|
|
"申买价四",
|
|
"申买量四",
|
|
"申买价五",
|
|
"申买量五",
|
|
"行情时间",
|
|
"主力合约标识",
|
|
"状态码",
|
|
"标的证券类型",
|
|
"标的股票",
|
|
"期权合约简称",
|
|
"振幅",
|
|
"最高价",
|
|
"最低价",
|
|
"成交量",
|
|
"成交额",
|
|
]
|
|
data_df = pd.DataFrame(list(zip(field_list, data_list)), columns=["字段", "值"])
|
|
return data_df
|
|
|
|
|
|
def option_sse_underlying_spot_price_sina(
|
|
symbol: str = "sh510300",
|
|
) -> pd.DataFrame:
|
|
"""
|
|
期权标的物的实时数据
|
|
:param symbol: sh510050 or sh510300
|
|
:type symbol: str
|
|
:return: 期权标的物的信息
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = f"https://hq.sinajs.cn/list={symbol}"
|
|
headers = {
|
|
"Accept": "*/*",
|
|
"Accept-Encoding": "gzip, deflate",
|
|
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"Cache-Control": "no-cache",
|
|
"Host": "hq.sinajs.cn",
|
|
"Pragma": "no-cache",
|
|
"Proxy-Connection": "keep-alive",
|
|
"Referer": "https://vip.stock.finance.sina.com.cn/",
|
|
"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",
|
|
}
|
|
r = requests.get(url, headers=headers)
|
|
data_text = r.text
|
|
data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
|
|
field_list = [
|
|
"证券简称",
|
|
"今日开盘价",
|
|
"昨日收盘价",
|
|
"最近成交价",
|
|
"最高成交价",
|
|
"最低成交价",
|
|
"买入价",
|
|
"卖出价",
|
|
"成交数量",
|
|
"成交金额",
|
|
"买数量一",
|
|
"买价位一",
|
|
"买数量二",
|
|
"买价位二",
|
|
"买数量三",
|
|
"买价位三",
|
|
"买数量四",
|
|
"买价位四",
|
|
"买数量五",
|
|
"买价位五",
|
|
"卖数量一",
|
|
"卖价位一",
|
|
"卖数量二",
|
|
"卖价位二",
|
|
"卖数量三",
|
|
"卖价位三",
|
|
"卖数量四",
|
|
"卖价位四",
|
|
"卖数量五",
|
|
"卖价位五",
|
|
"行情日期",
|
|
"行情时间",
|
|
"停牌状态",
|
|
]
|
|
data_df = pd.DataFrame(list(zip(field_list, data_list)), columns=["字段", "值"])
|
|
return data_df
|
|
|
|
|
|
def option_sse_greeks_sina(symbol: str = "10003045") -> pd.DataFrame:
|
|
"""
|
|
期权基本信息表
|
|
:param symbol: 合约代码
|
|
:type symbol: str
|
|
:return: 期权基本信息表
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = f"https://hq.sinajs.cn/list=CON_SO_{symbol}"
|
|
headers = {
|
|
"Accept": "*/*",
|
|
"Accept-Encoding": "gzip, deflate",
|
|
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"Cache-Control": "no-cache",
|
|
"Host": "hq.sinajs.cn",
|
|
"Pragma": "no-cache",
|
|
"Proxy-Connection": "keep-alive",
|
|
"Referer": "https://vip.stock.finance.sina.com.cn/",
|
|
"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",
|
|
}
|
|
r = requests.get(url, headers=headers)
|
|
data_text = r.text
|
|
data_list = data_text[data_text.find('"') + 1 : data_text.rfind('"')].split(",")
|
|
field_list = [
|
|
"期权合约简称",
|
|
"成交量",
|
|
"Delta",
|
|
"Gamma",
|
|
"Theta",
|
|
"Vega",
|
|
"隐含波动率",
|
|
"最高价",
|
|
"最低价",
|
|
"交易代码",
|
|
"行权价",
|
|
"最新价",
|
|
"理论价值",
|
|
]
|
|
data_df = pd.DataFrame(
|
|
list(zip(field_list, [data_list[0]] + data_list[4:])),
|
|
columns=["字段", "值"],
|
|
)
|
|
return data_df
|
|
|
|
|
|
def option_sse_minute_sina(symbol: str = "10003720") -> pd.DataFrame:
|
|
"""
|
|
指定期权品种在当前交易日的分钟数据, 只能获取当前交易日的数据, 不能获取历史分钟数据
|
|
https://stock.finance.sina.com.cn/option/quotes.html
|
|
:param symbol: 期权代码
|
|
:type symbol: str
|
|
:return: 指定期权的当前交易日的分钟数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionDaylineService.getOptionMinline"
|
|
params = {"symbol": f"CON_OP_{symbol}"}
|
|
headers = {
|
|
"accept": "*/*",
|
|
"accept-encoding": "gzip, deflate, br",
|
|
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"cache-control": "no-cache",
|
|
"pragma": "no-cache",
|
|
"referer": "https://stock.finance.sina.com.cn/option/quotes.html",
|
|
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"sec-fetch-dest": "script",
|
|
"sec-fetch-mode": "no-cors",
|
|
"sec-fetch-site": "same-origin",
|
|
"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",
|
|
}
|
|
r = requests.get(url, params=params, headers=headers)
|
|
data_json = r.json()
|
|
temp_df = data_json["result"]["data"]
|
|
data_df = pd.DataFrame(temp_df)
|
|
data_df = set_df_columns(
|
|
df=data_df, cols=["时间", "价格", "成交", "持仓", "均价", "日期"]
|
|
)
|
|
data_df = data_df[["日期", "时间", "价格", "成交", "持仓", "均价"]]
|
|
data_df["日期"] = pd.to_datetime(data_df["日期"], errors="coerce").dt.date
|
|
data_df["日期"] = data_df["日期"].ffill()
|
|
data_df["价格"] = pd.to_numeric(data_df["价格"], errors="coerce")
|
|
data_df["成交"] = pd.to_numeric(data_df["成交"], errors="coerce")
|
|
data_df["持仓"] = pd.to_numeric(data_df["持仓"], errors="coerce")
|
|
data_df["均价"] = pd.to_numeric(data_df["均价"], errors="coerce")
|
|
return data_df
|
|
|
|
|
|
def option_sse_daily_sina(symbol: str = "10003889") -> pd.DataFrame:
|
|
"""
|
|
指定期权的日频率数据
|
|
:param symbol: 期权代码
|
|
:type symbol: str
|
|
:return: 指定期权的所有日频率历史数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/jsonp_v2.php//StockOptionDaylineService.getSymbolInfo"
|
|
params = {"symbol": f"CON_OP_{symbol}"}
|
|
headers = {
|
|
"accept": "*/*",
|
|
"accept-encoding": "gzip, deflate, br",
|
|
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"cache-control": "no-cache",
|
|
"pragma": "no-cache",
|
|
"referer": "https://stock.finance.sina.com.cn/option/quotes.html",
|
|
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"sec-fetch-dest": "script",
|
|
"sec-fetch-mode": "no-cors",
|
|
"sec-fetch-site": "same-origin",
|
|
"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",
|
|
}
|
|
r = requests.get(url, params=params, headers=headers)
|
|
data_text = r.text
|
|
data_json = json.loads(data_text[data_text.find("(") + 1 : data_text.rfind(")")])
|
|
temp_df = pd.DataFrame(data_json)
|
|
temp_df.columns = ["日期", "开盘", "最高", "最低", "收盘", "成交量"]
|
|
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
|
|
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
|
|
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
|
|
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
|
|
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
return temp_df
|
|
|
|
|
|
def option_finance_minute_sina(symbol: str = "10002530") -> pd.DataFrame:
|
|
"""
|
|
指定期权的分钟频率数据
|
|
https://stock.finance.sina.com.cn/option/quotes.html
|
|
:param symbol: 期权代码
|
|
:type symbol: str
|
|
:return: 指定期权的分钟频率数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
url = "https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionDaylineService.getFiveDayLine"
|
|
params = {
|
|
"symbol": f"CON_OP_{symbol}",
|
|
}
|
|
headers = {
|
|
"accept": "*/*",
|
|
"accept-encoding": "gzip, deflate, br",
|
|
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
"cache-control": "no-cache",
|
|
"pragma": "no-cache",
|
|
"referer": "https://stock.finance.sina.com.cn/option/quotes.html",
|
|
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"sec-fetch-dest": "script",
|
|
"sec-fetch-mode": "no-cors",
|
|
"sec-fetch-site": "same-origin",
|
|
"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",
|
|
}
|
|
r = requests.get(url, params=params, headers=headers)
|
|
data_text = r.json()
|
|
temp_df = pd.DataFrame()
|
|
for item in data_text["result"]["data"]:
|
|
temp_df = pd.concat(objs=[temp_df, pd.DataFrame(item)], ignore_index=True)
|
|
temp_df.ffill(inplace=True)
|
|
temp_df.columns = ["time", "price", "volume", "_", "average_price", "date"]
|
|
temp_df = temp_df[["date", "time", "price", "average_price", "volume"]]
|
|
temp_df["price"] = pd.to_numeric(temp_df["price"], errors="coerce")
|
|
temp_df["average_price"] = pd.to_numeric(temp_df["average_price"], errors="coerce")
|
|
temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
|
|
return temp_df
|
|
|
|
|
|
@lru_cache()
|
|
def __option_current_em() -> pd.DataFrame:
|
|
inner_option_current_em_df = option_current_em()
|
|
return inner_option_current_em_df
|
|
|
|
|
|
def option_minute_em(symbol: str = "MO2404-P-4450") -> pd.DataFrame:
|
|
"""
|
|
东方财富网-行情中心-期权市场-分时行情
|
|
https://wap.eastmoney.com/quote/stock/151.cu2404P61000.html
|
|
:param symbol: 期权代码; 通过调用 ak.option_current_em() 获取
|
|
:type symbol: str
|
|
:return: 指定期权的分钟频率数据
|
|
:rtype: pandas.DataFrame
|
|
"""
|
|
inner_option_current_em_df = __option_current_em()
|
|
inner_option_current_em_df["标识"] = (
|
|
inner_option_current_em_df["市场标识"].astype(str)
|
|
+ "."
|
|
+ inner_option_current_em_df["代码"]
|
|
)
|
|
id_ = inner_option_current_em_df[inner_option_current_em_df["代码"] == symbol][
|
|
"标识"
|
|
].values[0]
|
|
url = "https://push2.eastmoney.com/api/qt/stock/trends2/get"
|
|
params = {
|
|
"secid": id_,
|
|
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f17",
|
|
"fields2": "f51,f53,f54,f55,f56,f57,f58",
|
|
"iscr": "0",
|
|
"iscca": "0",
|
|
"ut": "f057cbcbce2a86e2866ab8877db1d059",
|
|
"ndays": "1",
|
|
"cb": "quotepushdata1",
|
|
}
|
|
r = requests.get(url, params=params)
|
|
data_text = r.text
|
|
data_json = json.loads(data_text[data_text.find("(") + 1 : data_text.rfind(")")])
|
|
temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["trends"]])
|
|
temp_df.columns = ["time", "close", "high", "low", "volume", "amount", "-"]
|
|
temp_df = temp_df[["time", "close", "high", "low", "volume", "amount"]]
|
|
temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
|
|
temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
|
|
temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
|
|
temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
|
|
temp_df["amount"] = pd.to_numeric(temp_df["amount"], errors="coerce")
|
|
return temp_df
|
|
|
|
|
|
if __name__ == "__main__":
|
|
option_cffex_sz50_list_sina_df = option_cffex_sz50_list_sina()
|
|
print(option_cffex_sz50_list_sina_df)
|
|
|
|
# 期权-中金所-沪深300指数
|
|
option_cffex_hs300_list_sina_df = option_cffex_hs300_list_sina()
|
|
print(option_cffex_hs300_list_sina_df)
|
|
|
|
option_cffex_zz1000_list_sina_df = option_cffex_zz1000_list_sina()
|
|
print(option_cffex_zz1000_list_sina_df)
|
|
|
|
option_cffex_sz50_spot_sina_df = option_cffex_sz50_spot_sina(symbol="ho2303")
|
|
print(option_cffex_sz50_spot_sina_df)
|
|
|
|
option_cffex_hs300_spot_sina_df = option_cffex_hs300_spot_sina(symbol="io2209")
|
|
print(option_cffex_hs300_spot_sina_df)
|
|
|
|
option_cffex_zz1000_spot_sina_df = option_cffex_zz1000_spot_sina(symbol="mo2209")
|
|
print(option_cffex_zz1000_spot_sina_df)
|
|
|
|
option_cffex_sz50_daily_sina_df = option_cffex_sz50_daily_sina(symbol="ho2303P2350")
|
|
print(option_cffex_sz50_daily_sina_df)
|
|
|
|
option_cffex_hs300_daily_sina_df = option_cffex_hs300_daily_sina(
|
|
symbol="io2202P4350"
|
|
)
|
|
print(option_cffex_hs300_daily_sina_df)
|
|
|
|
option_cffex_zz1000_daily_sina_df = option_cffex_zz1000_daily_sina(
|
|
symbol="mo2208P6200"
|
|
)
|
|
print(option_cffex_zz1000_daily_sina_df)
|
|
|
|
# 期权-上交所-50ETF
|
|
option_sse_list_sina_df = option_sse_list_sina(symbol="50ETF", exchange="null")
|
|
print(option_sse_list_sina_df)
|
|
|
|
option_sse_expire_day_sina_df = option_sse_expire_day_sina(
|
|
trade_date="202308", symbol="50ETF", exchange="null"
|
|
)
|
|
print(option_sse_expire_day_sina_df)
|
|
|
|
option_sse_codes_sina_df = option_sse_codes_sina(
|
|
symbol="看跌期权", trade_date="202209", underlying="510050"
|
|
)
|
|
print(option_sse_codes_sina_df)
|
|
|
|
option_sse_spot_price_sina_df = option_sse_spot_price_sina(symbol="10003686")
|
|
print(option_sse_spot_price_sina_df)
|
|
|
|
option_sse_underlying_spot_price_sina_df = option_sse_underlying_spot_price_sina(
|
|
symbol="sh510300"
|
|
)
|
|
print(option_sse_underlying_spot_price_sina_df)
|
|
|
|
option_sse_greeks_sina_df = option_sse_greeks_sina(symbol="10004023")
|
|
print(option_sse_greeks_sina_df)
|
|
|
|
option_sse_minute_sina_df = option_sse_minute_sina(symbol="10004023")
|
|
print(option_sse_minute_sina_df)
|
|
|
|
option_sse_daily_sina_df = option_sse_daily_sina(symbol="10004023")
|
|
print(option_sse_daily_sina_df)
|
|
|
|
option_finance_minute_sina_df = option_finance_minute_sina(symbol="10004023")
|
|
print(option_finance_minute_sina_df)
|
|
|
|
option_current_em_df = option_current_em()
|
|
print(option_current_em_df)
|
|
|
|
option_minute_em_df = option_minute_em(symbol="10008594")
|
|
print(option_minute_em_df)
|