Files
MoFin/venv/lib/python3.12/site-packages/akshare/option/option_finance.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

359 lines
12 KiB
Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/2/24 15:18
Desc: 金融期权数据
http://www.sse.com.cn/assortment/options/price/
http://www.szse.cn/market/product/option/index.html
http://www.cffex.com.cn/hs300gzqq/
http://www.cffex.com.cn/zz1000gzqq/
"""
from io import BytesIO
import pandas as pd
import requests
from akshare.option.cons import (
SH_OPTION_PAYLOAD,
SH_OPTION_PAYLOAD_OTHER,
SH_OPTION_URL_50,
SH_OPTION_URL_KING_50,
SH_OPTION_URL_300,
SH_OPTION_URL_KING_300,
SH_OPTION_URL_500,
SH_OPTION_URL_KING_500,
SH_OPTION_URL_KC_50,
SH_OPTION_URL_KC_KING_50,
SH_OPTION_URL_KC_50_YFD,
SH_OPTION_URL_KING_50_YFD,
CFFEX_OPTION_URL_300,
)
def option_finance_sse_underlying(symbol: str = "华夏科创50ETF期权") -> pd.DataFrame:
"""
期权标的当日行情
http://www.sse.com.cn/assortment/options/price/
:param symbol: choice of {"华夏上证50ETF期权", "华泰柏瑞沪深300ETF期权", "南方中证500ETF期权", "华夏科创50ETF期权", "易方达科创50ETF期权"}
:type symbol: str
:return: 期权标的当日行情
:rtype: pandas.DataFrame
"""
symbol_map = {
"华夏上证50ETF期权": SH_OPTION_URL_50,
"华泰柏瑞沪深300ETF期权": SH_OPTION_URL_300,
"南方中证500ETF期权": SH_OPTION_URL_500,
"华夏科创50ETF期权": SH_OPTION_URL_KC_50,
"易方达科创50ETF期权": SH_OPTION_URL_KC_50_YFD,
}
r = requests.get(symbol_map[symbol], params=SH_OPTION_PAYLOAD)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.at[0, 0] = "510300"
raw_data.at[0, 8] = pd.to_datetime(
str(data_json["date"]) + str(data_json["time"]),
format="%Y%m%d%H%M%S",
)
raw_data.columns = [
"代码",
"名称",
"当前价",
"涨跌",
"涨跌幅",
"振幅",
"成交量(手)",
"成交额(万元)",
"更新日期",
]
return raw_data
def option_finance_board(
symbol: str = "嘉实沪深300ETF期权", end_month: str = "2306"
) -> pd.DataFrame:
"""
期权当前交易日的行情数据
主要为三个: 华夏上证50ETF期权, 华泰柏瑞沪深300ETF期权, 嘉实沪深300ETF期权,
沪深300股指期权, 中证1000股指期权, 上证50股指期权, 华夏科创50ETF期权, 易方达科创50ETF期权
http://www.sse.com.cn/assortment/options/price/
http://www.szse.cn/market/product/option/index.html
http://www.cffex.com.cn/hs300gzqq/
http://www.cffex.com.cn/zz1000gzqq/
:param symbol: choice of {"华夏上证50ETF期权", "华泰柏瑞沪深300ETF期权", "南方中证500ETF期权",
"华夏科创50ETF期权", "易方达科创50ETF期权", "嘉实沪深300ETF期权", "沪深300股指期权", "中证1000股指期权", "上证50股指期权"}
:type symbol: str
:param end_month: 2003; 2020 年 3 月到期的期权
:type end_month: str
:return: 当日行情
:rtype: pandas.DataFrame
"""
end_month = end_month[-2:]
if symbol == "华夏上证50ETF期权":
r = requests.get(
SH_OPTION_URL_KING_50.format(end_month),
params=SH_OPTION_PAYLOAD_OTHER,
)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.index = [str(data_json["date"]) + str(data_json["time"])] * data_json[
"total"
]
raw_data.columns = ["合约交易代码", "当前价", "涨跌幅", "前结价", "行权价"]
raw_data["数量"] = [data_json["total"]] * data_json["total"]
raw_data.reset_index(inplace=True)
raw_data.columns = [
"日期",
"合约交易代码",
"当前价",
"涨跌幅",
"前结价",
"行权价",
"数量",
]
return raw_data
elif symbol == "华泰柏瑞沪深300ETF期权":
r = requests.get(
SH_OPTION_URL_KING_300.format(end_month),
params=SH_OPTION_PAYLOAD_OTHER,
)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.index = [str(data_json["date"]) + str(data_json["time"])] * data_json[
"total"
]
raw_data.columns = ["合约交易代码", "当前价", "涨跌幅", "前结价", "行权价"]
raw_data["数量"] = [data_json["total"]] * data_json["total"]
raw_data.reset_index(inplace=True)
raw_data.columns = [
"日期",
"合约交易代码",
"当前价",
"涨跌幅",
"前结价",
"行权价",
"数量",
]
return raw_data
elif symbol == "南方中证500ETF期权":
r = requests.get(
SH_OPTION_URL_KING_500.format(end_month),
params=SH_OPTION_PAYLOAD_OTHER,
)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.index = [str(data_json["date"]) + str(data_json["time"])] * data_json[
"total"
]
raw_data.columns = ["合约交易代码", "当前价", "涨跌幅", "前结价", "行权价"]
raw_data["数量"] = [data_json["total"]] * data_json["total"]
raw_data.reset_index(inplace=True)
raw_data.columns = [
"日期",
"合约交易代码",
"当前价",
"涨跌幅",
"前结价",
"行权价",
"数量",
]
return raw_data
elif symbol == "华夏科创50ETF期权":
r = requests.get(
SH_OPTION_URL_KC_KING_50.format(end_month),
params=SH_OPTION_PAYLOAD_OTHER,
)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.index = [str(data_json["date"]) + str(data_json["time"])] * data_json[
"total"
]
raw_data.columns = ["合约交易代码", "当前价", "涨跌幅", "前结价", "行权价"]
raw_data["数量"] = [data_json["total"]] * data_json["total"]
raw_data.reset_index(inplace=True)
raw_data.columns = [
"日期",
"合约交易代码",
"当前价",
"涨跌幅",
"前结价",
"行权价",
"数量",
]
return raw_data
elif symbol == "易方达科创50ETF期权":
r = requests.get(
SH_OPTION_URL_KING_50_YFD.format(end_month),
params=SH_OPTION_PAYLOAD_OTHER,
)
data_json = r.json()
raw_data = pd.DataFrame(data_json["list"])
raw_data.index = [str(data_json["date"]) + str(data_json["time"])] * data_json[
"total"
]
raw_data.columns = ["合约交易代码", "当前价", "涨跌幅", "前结价", "行权价"]
raw_data["数量"] = [data_json["total"]] * data_json["total"]
raw_data.reset_index(inplace=True)
raw_data.columns = [
"日期",
"合约交易代码",
"当前价",
"涨跌幅",
"前结价",
"行权价",
"数量",
]
return raw_data
elif symbol == "嘉实沪深300ETF期权":
url = "http://www.szse.cn/api/report/ShowReport/data"
params = {
"SHOWTYPE": "JSON",
"CATALOGID": "ysplbrb",
"TABKEY": "tab1",
"PAGENO": "1",
"random": "0.10642298535346595",
}
r = requests.get(url, params=params)
data_json = r.json()
page_num = data_json[0]["metadata"]["pagecount"]
big_df = pd.DataFrame()
for page in range(1, page_num + 1):
params = {
"SHOWTYPE": "JSON",
"CATALOGID": "ysplbrb",
"TABKEY": "tab1",
"PAGENO": page,
"random": "0.10642298535346595",
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json[0]["data"])
big_df = pd.concat([big_df, temp_df], ignore_index=True)
big_df.columns = [
"合约编码",
"合约简称",
"标的名称",
"类型",
"行权价",
"合约单位",
"期权行权日",
"行权交收日",
]
big_df["期权行权日"] = pd.to_datetime(big_df["期权行权日"])
big_df["end_month"] = big_df["期权行权日"].dt.month.astype(str).str.zfill(2)
big_df = big_df[big_df["end_month"] == end_month]
del big_df["end_month"]
big_df.reset_index(inplace=True, drop=True)
return big_df
elif symbol == "沪深300股指期权":
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
r = requests.get(CFFEX_OPTION_URL_300, headers=headers)
raw_df = pd.read_table(BytesIO(r.content), sep=",")
raw_df["end_month"] = (
raw_df["instrument"]
.str.split("-", expand=True)
.iloc[:, 0]
.str.slice(
4,
)
)
raw_df = raw_df[raw_df["end_month"] == end_month]
del raw_df["end_month"]
raw_df.reset_index(inplace=True, drop=True)
return raw_df
elif symbol == "中证1000股指期权":
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
url = "http://www.cffex.com.cn/quote_MO.txt"
r = requests.get(url, headers=headers)
raw_df = pd.read_table(BytesIO(r.content), sep=",")
raw_df["end_month"] = (
raw_df["instrument"]
.str.split("-", expand=True)
.iloc[:, 0]
.str.slice(
4,
)
)
raw_df = raw_df[raw_df["end_month"] == end_month]
del raw_df["end_month"]
raw_df.reset_index(inplace=True, drop=True)
return raw_df
elif symbol == "上证50股指期权":
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
url = "http://www.cffex.com.cn/quote_HO.txt"
r = requests.get(url, headers=headers)
raw_df = pd.read_table(BytesIO(r.content), sep=",")
raw_df["end_month"] = (
raw_df["instrument"]
.str.split("-", expand=True)
.iloc[:, 0]
.str.slice(
4,
)
)
raw_df = raw_df[raw_df["end_month"] == end_month]
del raw_df["end_month"]
raw_df.reset_index(inplace=True, drop=True)
return raw_df
else:
return pd.DataFrame()
if __name__ == "__main__":
option_finance_sse_underlying_df = option_finance_sse_underlying(
symbol="华夏科创50ETF期权"
)
print(option_finance_sse_underlying_df)
option_finance_board_df = option_finance_board(
symbol="华夏上证50ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="华泰柏瑞沪深300ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="南方中证500ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="华夏科创50ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="易方达科创50ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="嘉实沪深300ETF期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="沪深300股指期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="中证1000股指期权", end_month="2306"
)
print(option_finance_board_df)
option_finance_board_df = option_finance_board(
symbol="上证50股指期权", end_month="2306"
)
print(option_finance_board_df)