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

575 lines
21 KiB
Python

# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2024/6/19 22:00
Desc: 巨潮资讯-数据中心-专题统计-债券报表-债券发行
http://webapi.cninfo.com.cn/#/thematicStatistics
"""
import pandas as pd
import requests
import py_mini_racer
from akshare.datasets import get_ths_js
def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
"""
获取 JS 文件的内容
:param file: JS 文件名
:type file: str
:return: 文件内容
:rtype: str
"""
setting_file_path = get_ths_js(file)
with open(setting_file_path, encoding="utf-8") as f:
file_data = f.read()
return file_data
def bond_treasure_issue_cninfo(
start_date: str = "20210910", end_date: str = "20211109"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-国债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 结束统计数据
:type end_date: str
:return: 国债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1120"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F009D": "缴款日",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "发行起始日",
"F003D": "发行终止日",
"F008N": "单位面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "计划发行总量",
"F005N": "实际发行总量",
"F028N": "增发次数",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F013V": "发行方式",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行价格",
"单位面值",
"缴款日",
"增发次数",
"交易市场",
"发行方式",
"发行对象",
"公告日期",
"债券名称",
]
]
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
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 bond_local_government_issue_cninfo(
start_date: str = "20210911", end_date: str = "20211110"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-地方债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 地方债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1121"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F009D": "缴款日",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "发行起始日",
"F003D": "发行终止日",
"F008N": "单位面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "计划发行总量",
"F005N": "实际发行总量",
"F028N": "增发次数",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F013V": "发行方式",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行价格",
"单位面值",
"缴款日",
"增发次数",
"交易市场",
"发行方式",
"发行对象",
"公告日期",
"债券名称",
]
]
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
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 bond_corporate_issue_cninfo(
start_date: str = "20210911", end_date: str = "20211110"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-企业债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 企业债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1122"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F004D": "交易所网上发行终止日",
"F003D": "交易所网上发行起始日",
"F008N": "发行面值",
"SECCODE": "债券代码",
"F007N": "发行价格",
"F006N": "实际发行总量",
"F005N": "计划发行总量",
"F022N": "最小认购单位",
"F017V": "承销方式",
"F052N": "最低认购额",
"F015V": "发行范围",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F013V": "发行方式",
"F023V": "募资用途说明",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"交易所网上发行起始日",
"交易所网上发行终止日",
"计划发行总量",
"实际发行总量",
"发行面值",
"发行价格",
"发行方式",
"发行对象",
"发行范围",
"承销方式",
"最小认购单位",
"募资用途说明",
"最低认购额",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["交易所网上发行起始日"] = pd.to_datetime(
temp_df["交易所网上发行起始日"], errors="coerce"
).dt.date
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")
temp_df["最低认购额"] = pd.to_numeric(temp_df["最低认购额"], errors="coerce")
return temp_df
def bond_cov_issue_cninfo(
start_date: str = "20210913", end_date: str = "20211112"
) -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-可转债发行
http://webapi.cninfo.com.cn/#/thematicStatistics
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 开始统计时间
:type end_date: str
:return: 可转债发行
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1123"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
params = {
"sdate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"edate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
}
r = requests.post(url, headers=headers, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F029D": "发行起始日",
"SECNAME": "债券简称",
"F027D": "转股开始日期",
"F003D": "发行终止日",
"F007N": "发行面值",
"F053D": "转股终止日期",
"F005N": "计划发行总量",
"F051D": "网上申购日期",
"F026N": "初始转股价格",
"F066N": "网上申购数量下限",
"F052N": "发行价格",
"BONDNAME": "债券名称",
"F014V": "发行对象",
"F002V": "交易市场",
"F032V": "网上申购简称",
"F086V": "转股代码",
"DECLAREDATE": "公告日期",
"F028D": "债权登记日",
"F004D": "优先申购日",
"F068D": "网上申购中签结果公告日及退款日",
"F054D": "优先申购缴款日",
"F008N": "网上申购数量上限",
"SECCODE": "债券代码",
"F006N": "实际发行总量",
"F067N": "网上申购单位",
"F065N": "配售价格",
"F017V": "承销方式",
"F015V": "发行范围",
"F013V": "发行方式",
"F021V": "募资用途说明",
"F031V": "网上申购代码",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"发行起始日",
"发行终止日",
"计划发行总量",
"实际发行总量",
"发行面值",
"发行价格",
"发行方式",
"发行对象",
"发行范围",
"承销方式",
"募资用途说明",
"初始转股价格",
"转股开始日期",
"转股终止日期",
"网上申购日期",
"网上申购代码",
"网上申购简称",
"网上申购数量上限",
"网上申购数量下限",
"网上申购单位",
"网上申购中签结果公告日及退款日",
"优先申购日",
"配售价格",
"债权登记日",
"优先申购缴款日",
"转股代码",
"交易市场",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["发行起始日"] = pd.to_datetime(
temp_df["发行起始日"], errors="coerce"
).dt.date
temp_df["发行终止日"] = pd.to_datetime(
temp_df["发行终止日"], errors="coerce"
).dt.date
temp_df["转股开始日期"] = pd.to_datetime(
temp_df["转股开始日期"], errors="coerce"
).dt.date
temp_df["转股终止日期"] = pd.to_datetime(
temp_df["转股终止日期"], errors="coerce"
).dt.date
temp_df["转股终止日期"] = pd.to_datetime(
temp_df["转股终止日期"], errors="coerce"
).dt.date
temp_df["网上申购日期"] = pd.to_datetime(
temp_df["网上申购日期"], errors="coerce"
).dt.date
temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(
temp_df["网上申购中签结果公告日及退款日"], errors="coerce"
).dt.date
temp_df["债权登记日"] = pd.to_datetime(
temp_df["债权登记日"], errors="coerce"
).dt.date
temp_df["优先申购日"] = pd.to_datetime(
temp_df["优先申购日"], errors="coerce"
).dt.date
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")
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 bond_cov_stock_issue_cninfo() -> pd.DataFrame:
"""
巨潮资讯-数据中心-专题统计-债券报表-债券发行-可转债转股
http://webapi.cninfo.com.cn/#/thematicStatistics
:return: 可转债转股
:rtype: pandas.DataFrame
"""
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1124"
js_code = py_mini_racer.MiniRacer()
js_content = _get_file_content_cninfo("cninfo.js")
js_code.eval(js_content)
mcode = js_code.call("getResCode1")
headers = {
"Accept": "*/*",
"Accept-Enckey": mcode,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Content-Length": "0",
"Host": "webapi.cninfo.com.cn",
"Origin": "http://webapi.cninfo.com.cn",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "http://webapi.cninfo.com.cn/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/93.0.4577.63 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
r = requests.post(url, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["records"])
temp_df.rename(
columns={
"F003N": "转股价格",
"SECNAME": "债券简称",
"DECLAREDATE": "公告日期",
"F005D": "自愿转换期终止日",
"F004D": "自愿转换期起始日",
"F017V": "标的股票",
"BONDNAME": "债券名称",
"F002V": "转股简称",
"F001V": "转股代码",
"SECCODE": "债券代码",
},
inplace=True,
)
temp_df = temp_df[
[
"债券代码",
"债券简称",
"公告日期",
"转股代码",
"转股简称",
"转股价格",
"自愿转换期起始日",
"自愿转换期终止日",
"标的股票",
"债券名称",
]
]
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
temp_df["自愿转换期起始日"] = pd.to_datetime(
temp_df["自愿转换期起始日"], errors="coerce"
).dt.date
temp_df["自愿转换期终止日"] = pd.to_datetime(
temp_df["自愿转换期终止日"], errors="coerce"
).dt.date
temp_df["转股价格"] = pd.to_numeric(temp_df["转股价格"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_treasure_issue_cninfo_df = bond_treasure_issue_cninfo(
start_date="20210910", end_date="20211109"
)
print(bond_treasure_issue_cninfo_df)
bond_local_government_issue_cninfo_df = bond_local_government_issue_cninfo(
start_date="20210911", end_date="20211110"
)
print(bond_local_government_issue_cninfo_df)
bond_corporate_issue_cninfo_df = bond_corporate_issue_cninfo(
start_date="20210911", end_date="20211110"
)
print(bond_corporate_issue_cninfo_df)
bond_cov_issue_cninfo_df = bond_cov_issue_cninfo(
start_date="20210913", end_date="20211112"
)
print(bond_cov_issue_cninfo_df)
bond_cov_stock_issue_cninfo_df = bond_cov_stock_issue_cninfo()
print(bond_cov_stock_issue_cninfo_df)