Source code for efinance.bond.getter

from ..utils import process_dataframe_and_series
import multitasking
import pandas as pd
import requests
from typing import (List,
                    Union,
                    Dict)

from ..common import get_history_bill as get_history_bill_for_bond
from ..common import get_today_bill as get_today_bill_for_bond
from ..common import get_quote_history as get_quote_history_for_bond
from ..common import get_realtime_quotes_by_fs

from ..utils import to_numeric
from ..common.config import (EASTMONEY_REQUEST_HEADERS,
                             FS_DICT)

from .config import EASTMONEY_BOND_BASE_INFO_FIELDS


@to_numeric
def get_base_info_single(bond_code: str) -> pd.Series:
    """
    获取单只债券基本信息

    Parameters
    ----------
    bond_code : str
        债券代码

    Returns
    -------
    Series
        债券的一些基本信息
    """
    columns = EASTMONEY_BOND_BASE_INFO_FIELDS
    params = (
        ('reportName', 'RPT_BOND_CB_LIST'),
        ('columns', 'ALL'),
        ('source', 'WEB'),
        ('client', 'WEB'),
        ('filter', f'(SECURITY_CODE="{bond_code}")'),
    )

    url = 'http://datacenter-web.eastmoney.com/api/data/v1/get'
    json_response = requests.get(url,
                                 headers=EASTMONEY_REQUEST_HEADERS,
                                 params=params).json()
    if json_response['result'] is None:
        return pd.Series(index=columns.values())
    items = json_response['result']['data']
    s = pd.Series(items[0]).rename(index=columns)
    s = s[columns.values()]
    return s


def get_base_info_multi(bond_codes: List[str]) -> pd.DataFrame:
    """
    获取多只债券基本信息

    Parameters
    ----------
    bond_codes : List[str]
        债券代码构成的字符串列表

    Returns
    -------
    DataFrame
        多只债券信息
    """
    ss = []

    @multitasking.task
    def start(bond_code: str) -> None:
        s = get_base_info_single(bond_code)
        ss.append(s)
    for bond_code in bond_codes:
        start(bond_code)
    multitasking.wait_for_tasks()
    df = pd.DataFrame(ss)
    return df


[docs]def get_base_info(bond_codes: Union[str, List[str]]) -> Union[pd.DataFrame, pd.Series]: """ 获取单只或多只可转债基本信息 Parameters ---------- bond_codes : Union[str, List[str]] 可转债代码、名称 或者 可转债代码、名称构成的列表 Returns ------- Union[DataFrame, Series] 单只或多只可转债基本信息 - ``DataFrame`` : 当 ``bond_codes`` 是字符串列表时 - ``Series`` : 当 ``bond_codes`` 是字符串时 Examples -------- >>> import efinance as ef >>> # 单只债券 >>> ef.bond.get_base_info('123111') 债券代码 123111 债券名称 东财转3 正股代码 300059 正股名称 东方财富 债券评级 AA+ 申购日期 2021-04-07 00:00:00 发行规模(亿) 158 网上发行中签率(%) 0.05877 上市日期 2021-04-23 00:00:00 到期日期 2027-04-07 00:00:00 期限(年) 6 利率说明 第一年0.2%、第二年0.3%、第三年0.4%、第四年0.8%、第五年1.8%、第六年2.0%。 dtype: object >>> 多只债券 >>> bond_codes = ['123111','113050'] >>> ef.bond.get_base_info(bond_codes) 债券代码 债券名称 正股代码 正股名称 ... 上市日期 到期日期 期限(年) 利率说明 0 113050 南银转债 601009 南京银行 ... 2021-07-01 00:00:00 2027-06-15 00:00:00 6 第一年0.20%、第二年0.40%、第三年0.70%、第四年1.20% 、第五年1.70%、第... 1 123111 东财转3 300059 东方财富 ... 2021-04-23 00:00:00 2027-04-07 00:00:00 6 第一年0.2%、第二年0.3%、第三年0.4%、第四年0.8%、第 五年1.8%、第六年2.0%。 """ if isinstance(bond_codes, str): return get_base_info_single(bond_codes) elif hasattr(bond_codes, '__iter__'): return get_base_info_multi(bond_codes)
[docs]def get_all_base_info() -> pd.DataFrame: """ 获取全部可转债基本信息列表 Returns ------- DataFrame 可转债一些基本信息 Examples -------- >>> import efinance as ef >>> ef.bond.get_all_base_info() 债券代码 债券名称 正股代码 正股名称 债券评级 申购日期 发行规模(亿) 网上发行中签率(%) 上市日期 到期日期 期限(年) 利率说明 0 123120 隆华转债 300263 隆华科技 AA- 2021-07-30 00:00:00 7.989283 NaN None 2027-07-30 00:00:00 6 第一年为0.40%、第二年为0.70%、第三年为1.00%、第四年为1.60%、第五年为2.... 1 110081 闻泰转债 600745 闻泰科技 AA+ 2021-07-28 00:00:00 86.000000 0.044030 None 2027-07-28 00:00:00 6 第一年0.10%、第二年0.20%、第三年0.30%、第四年1.50%、第五年1.80%、第... 2 118001 金博转债 688598 金博股份 A+ 2021-07-23 00:00:00 5.999010 0.001771 None 2027-07-23 00:00:00 6 第一年0.50%、第二年0.70%、第三年1.20%、第四年1.80%、第五年2.40%、第... 3 123119 康泰转2 300601 康泰生物 AA 2021-07-15 00:00:00 20.000000 0.014182 None 2027-07-15 00:00:00 6 第一年为0.30%、第二年为0.50%、第三年为1.00%、第 四年为1.50%、第五年为1.... 4 113627 太平转债 603877 太平鸟 AA 2021-07-15 00:00:00 8.000000 0.000542 None 2027-07-15 00:00:00 6 第一年0.30%、第二年0.50%、第三年1.00%、第四年1.50%、第五年1.80%、第... .. ... ... ... ... ... ... ... ... ... ... ... ... 80 110227 赤化转债 600227 圣济堂 AAA 2007-10-10 00:00:00 4.500000 0.158854 2007-10-23 00:00:00 2009-05-25 00:00:00 1.6192 票面利率和付息日期:本次发行的可转债票面利率第一 年为1.5%、第二年为1.8%、第三年为2.... 81 126006 07深高债 600548 深高速 AAA 2007-10-09 00:00:00 15.000000 0.290304 2007-10-30 00:00:00 2013-10-09 00:00:00 6 None 82 110971 恒源转债 600971 恒源煤电 AAA 2007-09-24 00:00:00 4.000000 5.311774 2007-10-12 00:00:00 2009-12-21 00:00:00 2.2484 票面利率为:第一年年利率1.5%,第二年年利率1.8%,第三年年利率2.1%,第四年年利率2... 83 110567 山鹰转债 600567 山鹰国际 AA 2007-09-05 00:00:00 4.700000 0.496391 2007-09-17 00:00:00 2010-02-01 00:00:00 2.4055 票面利率和付息日期:本次发行的可转债票面利率第一年为1.4%,第二年为1.7%,第三年为2.... 84 110026 中海转债 600026 中远海能 AAA 2007-07-02 00:00:00 20.000000 1.333453 2007-07-12 00:00:00 2008-03-27 00:00:00 0.737 票面利率:第一年为1.84%,第二年为2.05%,第三年为2.26%,第四年为2.47%,第... """ page = 1 dfs: List[pd.DataFrame] = [] columns = EASTMONEY_BOND_BASE_INFO_FIELDS while 1: params = ( ('sortColumns', 'PUBLIC_START_DATE'), ('sortTypes', '-1'), ('pageSize', '500'), ('pageNumber', f'{page}'), ('reportName', 'RPT_BOND_CB_LIST'), ('columns', 'ALL'), ('source', 'WEB'), ('client', 'WEB'), ) url = 'http://datacenter-web.eastmoney.com/api/data/v1/get' json_response = requests.get(url, headers=EASTMONEY_REQUEST_HEADERS, params=params).json() if json_response['result'] is None: break data = json_response['result']['data'] df = pd.DataFrame(data).rename( columns=columns)[columns.values()] dfs.append(df) page += 1 df = pd.concat(dfs) return df
[docs]@process_dataframe_and_series(remove_columns_and_indexes=['市场编号']) @to_numeric def get_realtime_quotes() -> pd.DataFrame: """ 获取沪深市场全部可转债实时行情信息 Returns ------- DataFrame 沪深市场全部可转债实时行情信息 Examples -------- >>> import efinance as ef >>> ef.bond.get_realtime_quotes() 债券代码 债券名称 涨跌幅 最新价 最高 最低 今开 涨跌额 换手率 量比 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 0 123051 今天转债 24.03 158.66 165.0 134.0 134.0 30.74 496.74 67.16 - 1388341 2185911136.0 127.92 443443594 443443594 0.123051 深A 1 123042 银河转债 16.04 219.309 224.0 193.11 194.5 30.309 1833.99 1.34 - 3042265 6402014720.0 189.0 363794813 363794813 0.123042 深A 2 113034 滨化转债 13.49 247.71 255.62 214.5 214.5 29.45 334.56 2.96 - 1585993 3798255024.0 218.26 1174284861 1174284861 1.113034 沪A 3 128064 司尔转债 11.29 148.01 150.34 133.007 133.73 15.01 277.06 7.04 - 887301 1305800336.0 133.0 474009426 474009426 0.128064 深A 4 113027 华钰转债 8.38 129.86 130.2 122.3 123.0 10.04 83.84 4.15 - 272641 346817120.0 119.82 422273164 422273164 1.113027 沪A .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 390 113621 彤程转债 -4.45 188.57 198.22 188.0 196.01 -8.79 29.91 0.47 - 168709 326018848.0 197.36 1063693010 1063693010 1.113621 沪A 391 128017 金禾转债 -4.86 182.676 204.989 182.61 195.16 -9.324 35.58 2.0 - 196375 375750768.0 192.0 1008366222 1008366222 0.128017 深A 392 113548 石英转债 -5.16 250.22 267.57 246.56 262.3 -13.61 143.32 0.72 - 175893 452796304.0 263.83 307086749 307086749 1.113548 沪A 393 128093 百川转债 -5.71 429.042 449.97 426.078 443.1 -25.958 426.86 0.36 - 693261 3032643232.0 455.0 696810974 696810974 0.128093 深A 394 123066 赛意转债 -6.0 193.08 203.999 193.08 203.0 -12.32 323.13 0.22 - 133317 261546032.0 205.4 79660753 79660753 0.123066 深A """ df = get_realtime_quotes_by_fs(FS_DICT['bond']) df.rename(columns={'代码': '债券代码', '名称': '债券名称'}, inplace=True) return df
[docs]def get_quote_history(bond_codes: Union[str, List[str]], beg: str = '19000101', end: str = '20500101', klt: int = 101, fqt: int = 1) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]: """ 获取债券的 K 线数据 Parameters ---------- bond_codes : Union[str,List[str]] 债券代码、名称 或者 代码、名称构成的列表 beg : str, optional 开始日期,默认为 ``'19000101'`` ,表示 1900年1月1日 end : str, optional 结束日期,默认为 ``'20500101'`` ,表示 2050年1月1日 klt : int, optional 行情之间的时间间隔,默认为 ``101`` ,可选示例如下 - ``1`` : 分钟 - ``5`` : 5 分钟 - ``15`` : 15 分钟 - ``30`` : 30 分钟 - ``60`` : 60 分钟 - ``101`` : 日 - ``102`` : 周 - ``103`` : 月 fqt : int, optional 复权方式,默认为 ``1`` ,可选示例如下 - ``0`` : 不复权 - ``1`` : 前复权 - ``2`` : 后复权 Returns ------- Union[DataFrame, Dict[str, DataFrame]] 债券的 K 线数据 - ``DataFrame`` : 当 ``codes`` 是 ``str`` 时 - ``Dict[str, DataFrame]`` : 当 ``bond_codes`` 是 ``List[str]`` 时 Examples -------- >>> import efinance as ef >>> # 获取单只债券日 K 行情 >>> ef.bond.get_quote_history('123111') 债券名称 债券代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 0 东财转3 123111 2021-04-23 130.000 130.000 130.000 130.000 1836427 2.387355e+09 0.00 30.00 30.000 11.62 1 东财转3 123111 2021-04-26 130.353 130.010 133.880 125.110 8610944 1.126033e+10 6.75 0.01 0.010 54.50 2 东财转3 123111 2021-04-27 129.000 129.600 130.846 128.400 1820766 2.357472e+09 1.88 -0.32 -0.410 11.52 3 东财转3 123111 2021-04-28 129.100 130.770 131.663 128.903 1467727 1.921641e+09 2.13 0.90 1.170 9.29 4 东财转3 123111 2021-04-29 130.690 131.208 133.150 130.560 1156934 1.525974e+09 1.98 0.33 0.438 7.32 .. ... ... ... ... ... ... ... ... ... ... ... ... ... 72 东财转3 123111 2021-08-09 159.600 159.300 162.990 158.690 596124 9.585751e+08 2.69 -0.34 -0.550 3.77 73 东财转3 123111 2021-08-10 159.190 160.950 161.450 157.000 517237 8.234596e+08 2.79 1.04 1.650 3.27 74 东财转3 123111 2021-08-11 161.110 159.850 162.300 159.400 298906 4.800711e+08 1.80 -0.68 -1.100 1.89 75 东财转3 123111 2021-08-12 159.110 158.290 160.368 158.010 270641 4.298100e+08 1.48 -0.98 -1.560 1.71 76 东财转3 123111 2021-08-13 158.000 158.358 160.290 157.850 250059 3.975513e+08 1.54 0.04 0.068 1.58 """ df = get_quote_history_for_bond( bond_codes, beg=beg, end=end, klt=klt, fqt=fqt ) if isinstance(df, pd.DataFrame): df.rename(columns={'代码': '债券代码', '名称': '债券名称' }, inplace=True) elif isinstance(df, dict): for bond_code in df.keys(): df[bond_code].rename(columns={'代码': '债券代码', '名称': '债券名称' }, inplace=True) return df
[docs]def get_history_bill(bond_code: str) -> pd.DataFrame: """ 获取单支债券的历史单子流入流出数据 Parameters ---------- bond_code : str 债券代码 Returns ------- DataFrame 沪深市场单只债券历史单子流入流出数据 Examples -------- >>> import efinance as ef >>> ef.bond.get_history_bill('123111') """ df = get_history_bill_for_bond(bond_code) df.rename(columns={'代码': '债券代码', '名称': '债券名称'}, inplace=True) return df
[docs]def get_today_bill(bond_code: str) -> pd.DataFrame: """ 获取单只债券最新交易日的日内分钟级单子流入流出数据 Parameters ---------- bond_code : str 债券代码 Returns ------- DataFrame 单只债券最新交易日的日内分钟级单子流入流出数据 Examples -------- >>> import efinance as ef >>> ef.bond.get_today_bill('123111') 债券名称 债券代码 时间 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 0 东财转3 123111 2021-08-13 09:31 -278046.0 319657.0 -41611.0 -278046.0 0.0 1 东财转3 123111 2021-08-13 09:32 -988506.0 571643.0 416863.0 -988506.0 0.0 2 东财转3 123111 2021-08-13 09:33 -990089.0 501980.0 488109.0 -990089.0 0.0 3 东财转3 123111 2021-08-13 09:34 -1718728.0 9051.0 1709678.0 -1718728.0 0.0 4 东财转3 123111 2021-08-13 09:35 -1653717.0 -133654.0 1787373.0 -1653717.0 0.0 .. ... ... ... ... ... ... ... ... 235 东财转3 123111 2021-08-13 14:56 5942063.0 -747717.0 -5194332.0 11700567.0 -5758504.0 236 东财转3 123111 2021-08-13 14:57 5916755.0 -483170.0 -5433570.0 11963346.0 -6046591.0 237 东财转3 123111 2021-08-13 14:58 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 238 东财转3 123111 2021-08-13 14:59 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 239 东财转3 123111 2021-08-13 15:00 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 """ df = get_today_bill_for_bond(bond_code) df.rename(columns={ '代码': '债券代码', '名称': '债券名称'}, inplace=True) return df