Files
MoFin/venv/lib/python3.12/site-packages/akshare/option/option_finance_sina.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- 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,直连正常
2026-06-30 02:56:35 +08:00

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)