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

568 lines
21 KiB
Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/10/23 13:00
Desc: 申万宏源研究-指数系列
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex
"""
import math
import pandas as pd
import requests
from akshare.utils.tqdm import get_tqdm
def index_hist_sw(symbol: str = "801030", period: str = "day") -> pd.DataFrame:
"""
申万宏源研究-指数发布-指数详情-指数历史数据
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex/releasedetail?code=801001&name=%E7%94%B3%E4%B8%8750
:param symbol: 指数代码
:type symbol: str
:param period: choice of {"day", "week", "month"}
:type period: str
:return: 指数历史数据
:rtype: pandas.DataFrame
"""
period_map = {
"day": "DAY",
"week": "WEEK",
"month": "MONTH",
}
url = "https://www.swsresearch.com/institute-sw/api/index_publish/trend/"
params = {
"swindexcode": symbol,
"period": period_map[period],
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36",
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"])
temp_df.rename(
columns={
"swindexcode": "代码",
"bargaindate": "日期",
"openindex": "开盘",
"maxindex": "最高",
"minindex": "最低",
"closeindex": "收盘",
"hike": "",
"markup": "",
"bargainamount": "成交量",
"bargainsum": "成交额",
},
inplace=True,
)
temp_df = temp_df[
[
"代码",
"日期",
"收盘",
"开盘",
"最高",
"最低",
"成交量",
"成交额",
]
]
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 index_min_sw(symbol: str = "801001") -> pd.DataFrame:
"""
申万宏源研究-指数发布-指数详情-指数分时数据
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex/releasedetail?code=801001&name=%E7%94%B3%E4%B8%8750
:param symbol: 指数代码
:type symbol: str
:return: 指数分时数据
:rtype: pandas.DataFrame
"""
url = (
"https://www.swsresearch.com/institute-sw/api/index_publish/details/timelines/"
)
params = {
"swindexcode": symbol,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"])
temp_df.rename(
columns={
"l1": "代码",
"l2": "名称",
"l8": "价格",
"trading_date": "日期",
"trading_time": "时间",
},
inplace=True,
)
temp_df = temp_df[
[
"代码",
"名称",
"价格",
"日期",
"时间",
]
]
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
temp_df["价格"] = pd.to_numeric(temp_df["价格"], errors="coerce")
return temp_df
def index_component_sw(symbol: str = "801001") -> pd.DataFrame:
"""
申万宏源研究-指数发布-指数详情-成分股
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex/releasedetail?code=801001&name=%E7%94%B3%E4%B8%8750
:param symbol: 指数代码
:type symbol: str
:return: 成分股
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/institute-sw/api/index_publish/details/component_stocks/"
params = {"swindexcode": symbol, "page": "1", "page_size": "10000"}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["results"])
temp_df.reset_index(inplace=True)
temp_df["index"] = temp_df["index"] + 1
temp_df.rename(
columns={
"index": "序号",
"stockcode": "证券代码",
"stockname": "证券名称",
"newweight": "最新权重",
"beginningdate": "计入日期",
},
inplace=True,
)
temp_df = temp_df[
[
"序号",
"证券代码",
"证券名称",
"最新权重",
"计入日期",
]
]
temp_df["计入日期"] = pd.to_datetime(temp_df["计入日期"], errors="coerce").dt.date
temp_df["最新权重"] = pd.to_numeric(temp_df["最新权重"], errors="coerce")
return temp_df
def __index_realtime_sw(symbol: str = "大类风格指数") -> pd.DataFrame:
"""
申万宏源研究-申万指数-股票指数
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex
:param symbol: choice of {"大类风格指数", "金创指数"}
:type symbol: str
:return: 指数系列实时行情数据
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/insWechatSw/dflgOrJcIndex/pageList"
payload = {
"pageNo": 1,
"pageSize": 10,
"indexTypeName": symbol,
"sortField": "",
"rule": "",
"indexType": 1,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.post(url, json=payload, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["list"])
temp_df.rename(
columns={
"swIndexCode": "指数代码",
"swIndexName": "指数名称",
"lastCloseIndex": "昨收盘",
"lastMarkup": "日涨跌幅",
"yearMarkup": "年涨跌幅",
},
inplace=True,
)
temp_df = temp_df[
[
"指数代码",
"指数名称",
"昨收盘",
"日涨跌幅",
"年涨跌幅",
]
]
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 index_realtime_sw(symbol: str = "二级行业") -> pd.DataFrame:
"""
申万宏源研究-指数系列
https://www.swsresearch.com/institute_sw/allIndex/releasedIndex
:param symbol: choice of {"市场表征", "一级行业", "二级行业", "风格指数", "大类风格指数", "金创指数"}
:type symbol: str
:return: 指数系列实时行情数据
:rtype: pandas.DataFrame
"""
if symbol in {"大类风格指数", "金创指数"}:
temp_df = __index_realtime_sw(symbol)
return temp_df
url = "https://www.swsresearch.com/institute-sw/api/index_publish/current/"
params = {"page": "1", "page_size": "50", "indextype": symbol}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
total_num = data_json["data"]["count"]
total_page = math.ceil(total_num / 50)
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"page": page})
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["results"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.columns = [
"指数代码",
"指数名称",
"昨收盘",
"今开盘",
"成交额",
"最高价",
"最低价",
"最新价",
"成交量",
]
big_df = big_df[
[
"指数代码",
"指数名称",
"昨收盘",
"今开盘",
"最新价",
"成交额",
"成交量",
"最高价",
"最低价",
]
]
big_df["昨收盘"] = pd.to_numeric(big_df["昨收盘"], errors="coerce")
big_df["今开盘"] = pd.to_numeric(big_df["今开盘"], errors="coerce")
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
return big_df
def index_analysis_daily_sw(
symbol: str = "市场表征",
start_date: str = "20221103",
end_date: str = "20221103",
) -> pd.DataFrame:
"""
申万宏源研究-指数分析
https://www.swsresearch.com/institute_sw/allIndex/analysisIndex
:param symbol: choice of {"市场表征", "一级行业", "二级行业", "风格指数"}
:type symbol: str
:param start_date: 开始日期
:type start_date: str
:param end_date: 结束日期
:type end_date: str
:return: 指数分析
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/institute-sw/api/index_analysis/index_analysis_report/"
params = {
"page": "1",
"page_size": "50",
"index_type": symbol,
"start_date": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"end_date": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"type": "DAY",
"swindexcode": "all",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
total_num = data_json["data"]["count"]
total_page = math.ceil(total_num / 50)
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"page": page})
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["results"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.rename(
columns={
"swindexcode": "指数代码",
"swindexname": "指数名称",
"bargaindate": "发布日期",
"closeindex": "收盘指数",
"bargainamount": "成交量",
"markup": "涨跌幅",
"turnoverrate": "换手率",
"pe": "市盈率",
"pb": "市净率",
"meanprice": "均价",
"bargainsumrate": "成交额占比",
"negotiablessharesum1": "流通市值",
"negotiablessharesum2": "平均流通市值",
"dp": "股息率",
},
inplace=True,
)
big_df["发布日期"] = pd.to_datetime(big_df["发布日期"], errors="coerce").dt.date
big_df["收盘指数"] = pd.to_numeric(big_df["收盘指数"], errors="coerce")
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
big_df["市盈率"] = pd.to_numeric(big_df["市盈率"], errors="coerce")
big_df["市净率"] = pd.to_numeric(big_df["市净率"], errors="coerce")
big_df["均价"] = pd.to_numeric(big_df["均价"], errors="coerce")
big_df["成交额占比"] = pd.to_numeric(big_df["成交额占比"], errors="coerce")
big_df["流通市值"] = pd.to_numeric(big_df["流通市值"], errors="coerce")
big_df["平均流通市值"] = pd.to_numeric(big_df["平均流通市值"], errors="coerce")
big_df["股息率"] = pd.to_numeric(big_df["股息率"], errors="coerce")
big_df.sort_values(by=["发布日期"], inplace=True, ignore_index=True)
return big_df
def index_analysis_week_month_sw(symbol: str = "month") -> pd.DataFrame:
"""
申万宏源研究-周/月报表-日期序列
https://www.swsresearch.com/institute_sw/allIndex/analysisIndex
:param symbol: choice of {"week", "month"}
:type symbol: str
:return: 日期序列
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/institute-sw/api/index_analysis/week_month_datetime/"
params = {"type": symbol.upper()}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"])
temp_df["bargaindate"] = pd.to_datetime(
temp_df["bargaindate"], errors="coerce"
).dt.date
temp_df.columns = ["date"]
temp_df.sort_values(by=["date"], inplace=True, ignore_index=True)
return temp_df
def index_analysis_weekly_sw(
symbol: str = "市场表征",
date: str = "20221104",
) -> pd.DataFrame:
"""
申万宏源研究-指数分析-周报告
https://www.swsresearch.com/institute_sw/allIndex/analysisIndex
:param symbol: choice of {"市场表征", "一级行业", "二级行业", "风格指数"}
:type symbol: str
:param date: 查询日期; 通过调用 ak.index_analysis_week_month_sw(date="20221104") 接口获取
:type date: str
:return: 指数分析
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/institute-sw/api/index_analysis/index_analysis_reports/"
params = {
"page": "1",
"page_size": "50",
"index_type": symbol,
"bargaindate": "-".join([date[:4], date[4:6], date[6:]]),
"type": "WEEK",
"swindexcode": "all",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
total_num = data_json["data"]["count"]
total_page = math.ceil(total_num / 50)
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"page": page})
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["results"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.rename(
columns={
"swindexcode": "指数代码",
"swindexname": "指数名称",
"bargaindate": "发布日期",
"closeindex": "收盘指数",
"bargainamount": "成交量",
"markup": "涨跌幅",
"turnoverrate": "换手率",
"pe": "市盈率",
"pb": "市净率",
"meanprice": "均价",
"bargainsumrate": "成交额占比",
"negotiablessharesum1": "流通市值",
"negotiablessharesum2": "平均流通市值",
"dp": "股息率",
},
inplace=True,
)
big_df["发布日期"] = pd.to_datetime(big_df["发布日期"], errors="coerce").dt.date
big_df["收盘指数"] = pd.to_numeric(big_df["收盘指数"], errors="coerce")
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
big_df["市盈率"] = pd.to_numeric(big_df["市盈率"], errors="coerce")
big_df["市净率"] = pd.to_numeric(big_df["市净率"], errors="coerce")
big_df["均价"] = pd.to_numeric(big_df["均价"], errors="coerce")
big_df["成交额占比"] = pd.to_numeric(big_df["成交额占比"], errors="coerce")
big_df["流通市值"] = pd.to_numeric(big_df["流通市值"], errors="coerce")
big_df["平均流通市值"] = pd.to_numeric(big_df["平均流通市值"], errors="coerce")
big_df["股息率"] = pd.to_numeric(big_df["股息率"], errors="coerce")
big_df.sort_values(by=["发布日期"], inplace=True, ignore_index=True)
return big_df
def index_analysis_monthly_sw(
symbol: str = "市场表征",
date: str = "20221031",
) -> pd.DataFrame:
"""
申万宏源研究-指数分析-月报告
https://www.swsresearch.com/institute_sw/allIndex/analysisIndex
:param symbol: choice of {"市场表征", "一级行业", "二级行业", "风格指数"}
:type symbol: str
:param date: 查询日期; 通过调用 ak.index_analysis_week_month_sw() 接口获取
:type date: str
:return: 指数分析
:rtype: pandas.DataFrame
"""
url = "https://www.swsresearch.com/institute-sw/api/index_analysis/index_analysis_reports/"
params = {
"page": "1",
"page_size": "50",
"index_type": symbol,
"bargaindate": "-".join([date[:4], date[4:6], date[6:]]),
"type": "MONTH",
"swindexcode": "all",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36"
}
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
total_num = data_json["data"]["count"]
total_page = math.ceil(total_num / 50)
big_df = pd.DataFrame()
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"page": page})
r = requests.get(url, params=params, headers=headers, verify=False)
data_json = r.json()
temp_df = pd.DataFrame(data_json["data"]["results"])
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
big_df.rename(
columns={
"swindexcode": "指数代码",
"swindexname": "指数名称",
"bargaindate": "发布日期",
"closeindex": "收盘指数",
"bargainamount": "成交量",
"markup": "涨跌幅",
"turnoverrate": "换手率",
"pe": "市盈率",
"pb": "市净率",
"meanprice": "均价",
"bargainsumrate": "成交额占比",
"negotiablessharesum1": "流通市值",
"negotiablessharesum2": "平均流通市值",
"dp": "股息率",
},
inplace=True,
)
big_df["发布日期"] = pd.to_datetime(big_df["发布日期"], errors="coerce").dt.date
big_df["收盘指数"] = pd.to_numeric(big_df["收盘指数"], errors="coerce")
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
big_df["换手率"] = pd.to_numeric(big_df["换手率"], errors="coerce")
big_df["市盈率"] = pd.to_numeric(big_df["市盈率"], errors="coerce")
big_df["市净率"] = pd.to_numeric(big_df["市净率"], errors="coerce")
big_df["均价"] = pd.to_numeric(big_df["均价"], errors="coerce")
big_df["成交额占比"] = pd.to_numeric(big_df["成交额占比"], errors="coerce")
big_df["流通市值"] = pd.to_numeric(big_df["流通市值"], errors="coerce")
big_df["平均流通市值"] = pd.to_numeric(big_df["平均流通市值"], errors="coerce")
big_df["股息率"] = pd.to_numeric(big_df["股息率"], errors="coerce")
big_df.sort_values(by=["发布日期"], inplace=True, ignore_index=True)
return big_df
if __name__ == "__main__":
index_hist_sw_df = index_hist_sw(symbol="801193", period="day")
print(index_hist_sw_df)
index_min_sw_df = index_min_sw(symbol="801001")
print(index_min_sw_df)
index_component_sw_df = index_component_sw(symbol="801001")
print(index_component_sw_df)
index_realtime_sw_df = index_realtime_sw(symbol="市场表征")
print(index_realtime_sw_df)
index_analysis_daily_sw_df = index_analysis_daily_sw(
symbol="市场表征", start_date="20241025", end_date="20241025"
)
print(index_analysis_daily_sw_df)
index_analysis_week_month_sw_df = index_analysis_week_month_sw(symbol="month")
print(index_analysis_week_month_sw_df)
index_analysis_weekly_sw_df = index_analysis_weekly_sw(
symbol="市场表征", date="20241025"
)
print(index_analysis_weekly_sw_df)
index_analysis_monthly_sw_df = index_analysis_monthly_sw(
symbol="市场表征", date="20240930"
)
print(index_analysis_monthly_sw_df)