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

297 lines
12 KiB
Python

# -*- coding:utf-8 -*-
# !/usr/bin/env python
"""
Date: 2026/4/10 19:00
Desc: 中国债券信息网-中债指数-中债指数族系-总指数-综合类指数
"""
import pandas as pd
import requests
from akshare.bond.cons import INDEX_MAPPING, PERIOD_MAPPING, INDICATOR_MAPPING
def bond_available_index_cbond():
"""
中国债券信息网-中债指数-中债指数族系 当中, 非指定期限部分
https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult
:return: 可选项列表
:rtype: list
"""
temp_df = pd.DataFrame(list(INDEX_MAPPING.keys()))
temp_df.reset_index(inplace=True)
temp_df['index'] = temp_df['index'] + 1
temp_df.columns = ['index', 'value']
return temp_df
def bond_index_general_cbond(
index_category: str = "新综合指数", indicator: str = "全价", period: str = "总值"
):
"""
中国债券信息网-中债指数-中债指数族系
https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult
:param index_category: see result of available_bond_index()
:type index_category: str
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性", "平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率", "指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月", "3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 指定指数的指定指标的指定期限分段数据
:rtype: pandas.DataFrame
"""
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult"
params = {
"indexid": INDEX_MAPPING[index_category],
"qxlxt": PERIOD_MAPPING[period],
"ltcslx": "",
"zslxt": INDICATOR_MAPPING[indicator],
"zslxt1": INDICATOR_MAPPING[indicator],
"lx": "1",
"locale": "zh_CN",
}
r = requests.post(url, params=params)
raw_json = r.json()
key_col_map = {f"{INDICATOR_MAPPING[indicator]}_{p_code}": freq_col for p_code, freq_col in
raw_json['dqcName'].items()}
data_json = {key: raw_json[key] for key in key_col_map}
temp_df = pd.DataFrame.from_dict(data_json, orient="columns")
temp_df.index = pd.to_datetime(pd.to_numeric(temp_df.index), unit="ms", utc=True).tz_convert("Asia/Shanghai")
temp_df.index.name = "date"
temp_df.rename(columns=key_col_map, inplace=True)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
return temp_df
def bond_treasury_index_cbond(
indicator: str = "财富", period: str = "5Y"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-国债指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富"}
:type indicator: str
:param period: choice of {'0-1Y', '0-3Y', '0-5Y', '0-10Y', '1-3Y', '1-5Y', '1-10Y',
'3-5Y', '5Y', '7Y', '7-10Y', '10Y', '30Y'}
:type period: str
:return: 国债指数
:rtype: pandas.DataFrame
"""
mapping = {
"0-1Y": "8a8b2cef70bc61380170be069828032b",
"0-3Y": "61f69682dc3ec18fe9664ff59308314a",
"0-5Y": "0beafb51867009998c2f4932bf22ede3",
"0-10Y": "8a8b2cef7832f8920178350801470014",
"1-3Y": "cc1cfe89b0cbd0800420a0e037026407",
"1-5Y": "7c3110e5305f9301482517066427a554",
"1-10Y": "a5d90802e3259978a027267de651106d",
"3-5Y": "8a8b2ca04bf69582014c10b60f376c77",
"5Y": "8a8b2ca03a3feea1013a44b98fc533f5",
"7Y": "2c9081e50e8767dc010e87b6e26c0080",
"7-10Y": "8a8b2c8f5a492a01015a4ac986480043",
"10Y": "8a8b2ca04b666362014b723482bc4f49",
"30Y": "8a8b2cef77b239980177b485d20a6379",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQueryResult"
params = {
"indexid": mapping[period],
"qxlxt": "00",
"ltcslx": "",
"zslxt": INDICATOR_MAPPING[indicator],
"zslxt1": INDICATOR_MAPPING[indicator],
"lx": "1",
"locale": "zh_CN",
}
r = requests.post(url, params=params)
raw_json = r.json()
key_col_map = {f"{INDICATOR_MAPPING[indicator]}_{p_code}": freq_col for p_code, freq_col in
raw_json['dqcName'].items()}
data_json = {key: raw_json[key] for key in key_col_map}
temp_df = pd.DataFrame.from_dict(data_json, orient="columns")
temp_df.index = pd.to_datetime(pd.to_numeric(temp_df.index), unit="ms", utc=True).tz_convert("Asia/Shanghai")
temp_df.index.name = "date"
temp_df.rename(columns=key_col_map, inplace=True)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
return temp_df
def bond_new_composite_index_cbond(
indicator: str = "财富", period: str = "总值"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-新综合指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性",
"平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率",
"指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月",
"3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 新综合指数
:rtype: pandas.DataFrame
"""
indicator_map = {
"全价": "QJZS",
"净价": "JJZS",
"财富": "CFZS",
"平均市值法久期": "PJSZFJQ",
"平均现金流法久期": "PJXJLFJQ",
"平均市值法凸性": "PJSZFTX",
"平均现金流法凸性": "PJXJLFTX",
"平均现金流法到期收益率": "PJDQSYL",
"平均市值法到期收益率": "PJSZFDQSYL",
"平均基点价值": "PJJDJZ",
"平均待偿期": "PJDCQ",
"平均派息率": "PJPXL",
"指数上日总市值": "ZSZSZ",
"财富指数涨跌幅": "CFZSZDF",
"全价指数涨跌幅": "QJZSZDF",
"净价指数涨跌幅": "JJZSZDF",
"现券结算量": "XQJSL",
}
period_map = {
"总值": "00",
"1年以下": "01",
"1-3年": "02",
"3-5年": "03",
"5-7年": "04",
"7-10年": "05",
"10年以上": "06",
"0-3个月": "07",
"3-6个月": "08",
"6-9个月": "09",
"9-12个月": "10",
"0-6个月": "11",
"6-12个月": "12",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQuery"
params = {
"indexid": "8a8b2ca0332abed20134ea76d8885831",
"": "", # noqa: F601
"qxlxt": period_map[period],
"": "", # noqa: F601
"ltcslx": "",
"": "", # noqa: F601
"zslxt": indicator_map[indicator], # noqa: F601
"": "", # noqa: F601
"zslxt": indicator_map[indicator], # noqa: F601
"": "", # noqa: F601
"lx": "1",
"": "", # noqa: F601
"locale": "",
}
r = requests.post(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(
data_json[f"{indicator_map[indicator]}_{period_map[period]}"],
orient="index",
)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df["date"] = temp_df["date"].astype(float)
temp_df["date"] = (
pd.to_datetime(temp_df["date"], unit="ms", errors="coerce", utc=True)
.dt.tz_convert("Asia/Shanghai")
.dt.date
)
temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
return temp_df
def bond_composite_index_cbond(
indicator: str = "财富", period: str = "总值"
) -> pd.DataFrame:
"""
中国债券信息网-中债指数-中债指数族系-总指数-综合类指数-中债-综合指数
https://yield.chinabond.com.cn/cbweb-mn/indices/single_index_query
:param indicator: choice of {"全价", "净价", "财富", "平均市值法久期", "平均现金流法久期", "平均市值法凸性",
"平均现金流法凸性", "平均现金流法到期收益率", "平均市值法到期收益率", "平均基点价值", "平均待偿期", "平均派息率",
"指数上日总市值", "财富指数涨跌幅", "全价指数涨跌幅", "净价指数涨跌幅", "现券结算量"}
:type indicator: str
:param period: choice of {"总值", "1年以下", "1-3年", "3-5年", "5-7年", "7-10年", "10年以上", "0-3个月",
"3-6个月", "6-9个月", "9-12个月", "0-6个月", "6-12个月"}
:type period: str
:return: 新综合指数
:rtype: pandas.DataFrame
"""
indicator_map = {
"全价": "QJZS",
"净价": "JJZS",
"财富": "CFZS",
"平均市值法久期": "PJSZFJQ",
"平均现金流法久期": "PJXJLFJQ",
"平均市值法凸性": "PJSZFTX",
"平均现金流法凸性": "PJXJLFTX",
"平均现金流法到期收益率": "PJDQSYL",
"平均市值法到期收益率": "PJSZFDQSYL",
"平均基点价值": "PJJDJZ",
"平均待偿期": "PJDCQ",
"平均派息率": "PJPXL",
"指数上日总市值": "ZSZSZ",
"财富指数涨跌幅": "CFZSZDF",
"全价指数涨跌幅": "QJZSZDF",
"净价指数涨跌幅": "JJZSZDF",
"现券结算量": "XQJSL",
}
period_map = {
"总值": "00",
"1年以下": "01",
"1-3年": "02",
"3-5年": "03",
"5-7年": "04",
"7-10年": "05",
"10年以上": "06",
"0-3个月": "07",
"3-6个月": "08",
"6-9个月": "09",
"9-12个月": "10",
"0-6个月": "11",
"6-12个月": "12",
}
url = "https://yield.chinabond.com.cn/cbweb-mn/indices/singleIndexQuery"
params = {
"indexid": "2c90818811afed8d0111c0c672b31578",
"": "", # noqa: F601
"qxlxt": period_map[period],
"": "", # noqa: F601
"zslxt": indicator_map[indicator],
"": "", # noqa: F601
"lx": "1",
"": "", # noqa: F601
"locale": "",
}
r = requests.post(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame.from_dict(
data_json[f"{indicator_map[indicator]}_{period_map[period]}"],
orient="index",
)
temp_df.reset_index(inplace=True)
temp_df.columns = ["date", "value"]
temp_df["date"] = pd.to_datetime(temp_df["date"].astype(int), errors="coerce", unit="ms").dt.date
temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
return temp_df
if __name__ == "__main__":
bond_new_composite_index_cbond_df = bond_new_composite_index_cbond(
indicator="财富", period="总值"
)
print(bond_new_composite_index_cbond_df)
bond_composite_index_cbond_df = bond_composite_index_cbond(
indicator="财富", period="总值"
)
print(bond_composite_index_cbond_df)
bond_index_general_cbond_df = bond_index_general_cbond(index_category="新综合指数", indicator="全价", period="总值")
print(bond_index_general_cbond_df)
bond_treasury_index_cbond_df = bond_treasury_index_cbond(indicator="财富", period="5Y")
print(bond_treasury_index_cbond_df)