qff.price.finance 源代码

# coding :utf-8
#
# The MIT License (MIT)
#
# Copyright (c) 2016-2019 XuHaiJiang/QFF
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

"""
从数据库中查询年报、季报数据
"""

import pandas as pd
import datetime
from typing import Dict, Optional
from dateutil.relativedelta import relativedelta
from qff.tools.mongo import DATABASE
from qff.tools.date import (
    util_date_valid,
    get_pre_trade_day,
    is_trade_day,
    get_real_trade_date,
    get_trade_days,
    date_to_int,
    int_to_date
)
from qff.tools.logs import log
from qff.frame.context import context
from qff.frame.const import RUN_TYPE, RUN_STATUS
from qff.tools.utils import util_code_tolist


[文档]def get_fundamentals(filter, projection=None, date=None, report_date=None): # type: (Optional[Dict], Optional[Dict], Optional[str], Optional[str]) -> Optional[pd.DataFrame] """ 根据mongodb语法查询财务数据 详细的财务数据表及字段描述请见 :ref:`db_finance` * 输入date时, 查询指定日期date收盘后所能看到的最近的数据,我们会查找上市公司在这个日期之前(包括此日期)发布的数据, 不会有未来函数. * 输入report_date, 查询 report_date 指定的季度或者年份的财务数。 * **参数report_date和date二选一,同时输入,则report_date有效。** * **注意:不支持2000年之前的查询** :param filter: 查询条件字典,按pymongo格式输入 :param projection: 你需要查询的字段列表,按pymongo格式输入 :param date: 查询日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :param report_date: 财报统计的季度或者年份, 一个字符串, 有两种格式: * 季度: 格式是: 年 + 'q' + 季度序号, 例如: '2015q1', '2013q4'. * 年份: 格式就是年份的数字, 例如: '2015', '2016'. :return: 返回一个 [pandas.DataFrame], 每一行对应数据库返回的每一行, 列索引是你查询的所有字段 :example: :: # 策略在开盘前选择净利润增长率大于30%的股票 def before_trading_start(context): filter = {'f184' : {"$gt": 0.3}} df = get_fundamentals(filter=filter, projection={'f184': 1}, date=context.previous_date) g.security = df['code'].to_list() """ if filter is None: filter = {} elif not isinstance(filter, dict): log.error("参数filter不合法!") return None if projection is None: projection = {"_id": 0} elif isinstance(projection, dict): prefix = { "_id": 0, "code": 1, "report_date": 1, "f314": 1 # 财报公告日期 } projection = dict(**prefix, **projection) else: log.error("参数projection不合法!") return None rd_list = ["-03-31", "-06-30", "-09-30", "-12-31"] if report_date is not None: if isinstance(report_date, str) and len(report_date) == 4 and report_date.isdigit(): rd = report_date + "-12-31" elif isinstance(report_date, str) and len(report_date) == 6 and report_date[:4].isdigit() \ and report_date[4] == 'q' and report_date[-1] in ["1", "2", "3", "4"]: rd = report_date[:4] + rd_list[int(report_date[-1]) - 1] else: log.error("参数report_date不合法!") return None filter['report_date'] = date_to_int(rd) else: if date is None: if context.run_type == RUN_TYPE.BACK_TEST and context.status == RUN_STATUS.RUNNING: end = context.previous_date else: today = datetime.date.today() end = (today - relativedelta(days=1)).strftime('%Y-%m-%d') elif util_date_valid(date) and date > '2000-01-01': end = date else: log.error("参数date不合法!") return None # 三季报一般在10月中下旬,年报一般在4月下旬,则最长财报间隔在6-7个月。 start = (datetime.datetime.strptime(end, '%Y-%m-%d') - relativedelta(months=8)).strftime('%Y-%m-%d') if start < '2000-01-01': start = '2000-01-01' filter['f314'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(start[2:]) } coll = DATABASE.report cursor = coll.find(filter=filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) < 1: log.error("get_fundamentals未查询到数据") return None rtn: pd.DataFrame = db_data.sort_values('report_date', ascending=False).groupby('code', as_index=False).first() rtn = rtn.reset_index(drop=True).sort_values(['code', 'report_date']) rtn.insert(2, 'pub_date', rtn['f314'].apply(int_to_date)) rtn.drop(columns=['f314'], inplace=True) return rtn
[文档]def get_financial_data(code, fields=None, date=None, report_date=None): # type: (Optional[list, str], Optional[list], Optional[str], Optional[str]) -> Optional[pd.DataFrame] """ 查询多只股票给定日期的财务数据 * 输入date时, 查询指定日期date收盘后所能看到的最近的数据,我们会查找上市公司在这个日期之前(包括此日期)发布的数据, 不会有未来函数. * 输入report_date, 查询 report_date 指定的季度或者年份的财务数。 * **参数report_date和date二选一,同时输入,则report_date有效。** * **注意:不支持2000年之前的查询** :param code: 一支股票代码或者一个股票代码的list,None表示所有股票代码 :param fields: 返回的财务数据字段list,'001'-'580',None表示所有财务指标,详细的财务数据表及字段描述请见 :ref:`db_finance` :param date: 查询日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :param report_date: 财报统计的季度或者年份, 一个字符串, 有两种格式: * 季度: 格式是: 年 + 'q' + 季度序号, 例如: '2015q1', '2013q4'. * 年份: 格式就是年份的数字, 例如: '2015', '2016'. :return:返回一个 [pandas.DataFrame], 每一行对应数据库返回的每一行, 列名是输入的field字段信息 :example: :: # 获取股票'000001'和'601567'的每股收益、扣非每股收益及净利润 df = get_financial_data(['000001', '601567'], ['f001', 'f002', 'f095'],watch_date='2020-04-22') """ _filter = {} if code is not None: if isinstance(code, str): code = [code] elif not isinstance(code, list): log.error("参数code不合法!,应该为字符串或列表!") return None _filter['code'] = {'$in': code} if fields is not None: if isinstance(fields, list): if not all(isinstance(field, str) and field.isdigit() for field in fields): log.error("参数fields不合法!,应该为字符串列表,范围'001'~'580'!") return None projection = dict.fromkeys(fields, 1) else: log.error("参数fields不合法!,应该为字符串列表!") return None else: projection = None try: return get_fundamentals(_filter, projection, date, report_date) except Exception as e: log.error("get_fundamentals运行异常:{}".format(e)) return None
[文档]def get_stock_reports(code, fields=None, start=None, end=None): # type: (str, Optional[list], Optional[str], Optional[str]) -> Optional[pd.DataFrame] """ 获取单个股票多个报告期发布的财务数据 :param code: 一支股票代码 :param fields: 返回的财务数据字段list,'001'-'580',None表示所有财务指标,详细的财务数据表及字段描述请见 :ref:`db_finance` :param start: 查询期间开始日期,一个字符串(格式类似'2015-10-15'),可以是None, 代表从股票上市开始 :param end: 查询日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :return: 返回一个 [pandas.DataFrame] """ if code is None: log.error("参数code不可为空!") return elif not isinstance(code, str): log.error("参数code不合法!,应该为字符串") return None _filter: Dict[str, any] = {'code': code} if fields is None: projection = {"_id": 0} elif isinstance(fields, list): if not all(isinstance(field, str) and field[1:].isdigit() for field in fields): log.error("参数fields不合法!,应该为字符串列表,范围'001'~'580'!") return None projection = dict.fromkeys(fields, 1) prefix = { "_id": 0, "code": 1, "report_date": 1, 'f314': 1 } projection = dict(**prefix, **projection) else: log.error("参数fields不合法!,应该为字符串列表!") return None if end is None: if context.run_type == RUN_TYPE.BACK_TEST and context.status == RUN_STATUS.RUNNING: end = context.previous_date else: today = datetime.date.today() end = (today - relativedelta(days=1)).strftime('%Y-%m-%d') elif util_date_valid(end) and end > '2000-01-01': if not is_trade_day(end): end = get_real_trade_date(end) else: log.error("参数end不合法!查询日期需大于2000-01-01") return None if start is None: _filter['f314'] = { "$gt": 0, "$lte": date_to_int(end[2:]), } elif end > start > '2000-01-01': _filter['f314'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(start[2:]) } else: log.error("参数start不合法!查询日期需大于2000-01-01") return None coll = DATABASE.report cursor = coll.find(filter=_filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) > 1: db_data = db_data.sort_values('report_date') db_data.insert(2, 'pub_date', db_data['f314'].apply(int_to_date)) db_data.drop(columns=['f314'], inplace=True) return db_data else: return None
[文档]def get_stock_forecast(code=None, start=None, end=None): # type: (Optional[str], Optional[str], Optional[str]) -> Optional[pd.DataFrame] """ 获取股票业绩预告数据 :param code: 一支股票代码或股票列表,可以是None值,代表整个市场 :param start: 查询期间开始日期,一个字符串(格式类似'2015-10-15'),可以是None, 代表从股票上市开始 :param end: 查询日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :return: 返回一个 [pandas.DataFrame],包含以下数据: ========================== ==================== 字段名 含义 ========================== ==================== code 股票代码 pub_date 业绩预告公告日期 report_date 报告期 profit_min 本期利润下限 profit_max 本期利润上限 profit_ratio_min 本期利润同比增幅下限 profit_ratio_max 本期利润同比增幅上限 ========================== ==================== """ if code is not None: code = util_code_tolist(code) _filter = {'code': {'$in': code}} else: _filter = {} if end is None: if context.run_type == RUN_TYPE.BACK_TEST and context.status == RUN_STATUS.RUNNING: end = context.previous_date else: today = datetime.date.today() end = (today - relativedelta(days=1)).strftime('%Y-%m-%d') elif not util_date_valid(end): log.error("参数end不合法!") return None if start is None: _filter['f313'] = { "$gt": 0, "$lte": date_to_int(end[2:]), } elif util_date_valid(start): _filter['f313'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(start[2:]) } else: log.error("参数start不合法!") return None projection = { "_id": 0, "code": 1, "report_date": 1, 'f313': 1, 'f317': 1, 'f318': 1, 'f285': 1, 'f286': 1, } coll = DATABASE.report cursor = coll.find(filter=_filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) >= 1: db_data['f313'] = db_data['f313'].apply(int_to_date) db_data.rename(columns={ 'f313': 'pub_date', 'f317': 'profit_min', 'f318': 'profit_max', 'f285': 'profit_ratio_min', 'f286': 'profit_ratio_max', }, inplace=True) db_data = db_data.sort_values('code') db_data.report_date = db_data.report_date.apply(lambda x: get_next_report_date(x)) return db_data[['code', 'pub_date', 'report_date', 'profit_min', 'profit_max', 'profit_ratio_min', 'profit_ratio_max']] else: return None
[文档]def get_stock_express(code=None, start=None, end=None): # type: (Optional[str], Optional[str], Optional[str]) -> Optional[pd.DataFrame] """ 获取股票业绩快报数据 :param code: 一支股票代码或股票列表,可以是None值,代表整个市场 :param start: 查询期间开始日期,一个字符串(格式类似'2015-10-15'),可以是None, 代表从股票上市开始 :param end: 查询日期结束日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :return: 返回一个 [pandas.DataFrame],包含以下数据: ========================== ==================== 字段名 含义 ========================== ==================== code 股票代码 pub_date 业绩快报公告日期 report_date 报告期 net_profit 归母公司净利润 adjusted_profit 扣非净利润 total_assets 总资产 net_assets 净资产 eps 每股收益 roe_diminish 摊薄净资产收益率 roe_weighting 加权净资产收益率 naps 每股净资产 ========================== ==================== """ if code is not None: code = util_code_tolist(code) _filter = {'code': {'$in': code}} else: _filter = {} if end is None: if context.run_type == RUN_TYPE.BACK_TEST and context.status == RUN_STATUS.RUNNING: end = context.previous_date else: today = datetime.date.today() end = (today - relativedelta(days=1)).strftime('%Y-%m-%d') elif not util_date_valid(end): log.error("参数end不合法!") return None if start is None: _filter['f315'] = { "$gt": 0, "$lte": date_to_int(end[2:]), } elif util_date_valid(start): _filter['f315'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(start[2:]) } else: log.error("参数start不合法!") return None projection = { "_id": 0, "code": 1, "report_date": 1, 'f315': 1, 'f287': 1, 'f288': 1, 'f289': 1, 'f290': 1, 'f291': 1, 'f292': 1, 'f293': 1, 'f294': 1, } coll = DATABASE.report cursor = coll.find(filter=_filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) >= 1: db_data.insert(2, 'pub_date', db_data['f315'].apply(int_to_date)) db_data.drop(columns=['f315'], inplace=True) db_data.rename(columns={ 'f287': 'net_profit', 'f288': 'adjusted_profit', 'f289': 'total_assets', 'f290': 'net_assets', 'f291': 'eps', 'f292': 'roe_diminish', 'f293': 'roe_weighting', 'f294': 'naps', }, inplace=True) db_data.report_date = db_data.report_date.apply(lambda x: get_next_report_date(x)) db_data = db_data.sort_values('code') return db_data else: return None
[文档]def get_fundamentals_continuously(code, fields=None, end_date=None, count=None): # type: (str, Optional[list], Optional[str], Optional[int]) -> Optional[pd.DataFrame] """ 查询单个股票连续多日的财务数据 详细的财务数据表及字段描述请见financial_dict :param code: 一支股票代码 :param fields: 返回的财务数据字段list,'001'-'580',None表示所有财务指标,详细的财务数据表及字段描述请见 :ref:`db_finance` :param end_date: 查询日期, 一个字符串(格式类似'2015-10-15'),可以是None, 使用默认日期. 这个默认日期在回测时, 等于 context.current_dt 的前一天。在实盘时,为当前最新日期,一般是昨天。 :param count: 获取 end_date 前 count 个日期的数据 :return: 返回一个 [pandas.DataFrame] """ if code is None: log.error("参数code不可为空!") return elif not isinstance(code, str): log.error("参数code不合法!,应该为字符串") return None _filter = {'code': code} if fields is None: projection = {"_id": 0} elif isinstance(fields, list): if not all(isinstance(field, str) and field.isdigit() for field in fields): log.error("参数fields不合法!,应该为字符串列表,范围'001'~'580'!") return None projection = dict.fromkeys(fields, 1) prefix = { "_id": 0, "code": 1, "report_date": 1, 'f314': 1 } projection = dict(**prefix, **projection) else: log.error("参数fields不合法!,应该为字符串列表!") return None if end_date is None: if context.run_type == RUN_TYPE.BACK_TEST and context.status == RUN_STATUS.RUNNING: end = context.previous_date else: today = datetime.date.today() end = (today - relativedelta(days=1)).strftime('%Y-%m-%d') elif util_date_valid(end_date) and end_date > '2000-01-01': end = end_date else: log.error("参数end_date不合法!") return None if not is_trade_day(end): end = get_real_trade_date(end) if count is None: _filter['f314'] = dict({"$lte": date_to_int(end[2:])}) else: start = get_pre_trade_day(end, count) # 查询财报日期向前移8个月,避免4月下旬只能查看到去年10月发布的三季报 query_start = (datetime.datetime.strptime(start, '%Y-%m-%d') - relativedelta(months=8))\ .strftime('%Y-%m-%d') if query_start < '2000-01-01': query_start = '2000-01-01' _filter['f314'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(query_start[2:]) } coll = DATABASE.report cursor = coll.find(filter=_filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) > 1: db_data = db_data.sort_values('report_date') db_data.insert(2, 'pub_date', db_data['f314'].apply(int_to_date)) db_data.drop(columns=['f314'], inplace=True) start = db_data.pub_date[0] date_list = get_trade_days(start, end) res = pd.DataFrame({'date': date_list}) res = res.merge(db_data, left_on='date', right_on='pub_date', how='left') res = res.fillna(method='ffill') res['report_date'] = res['report_date'].round(0).astype(int) if count is not None: res = res.iloc[-count:] return res else: log.warning("get_fundamentals_continuously未查询到数据") return None
[文档]def get_history_fundamentals(code, fields, watch_date=None, report_date=None, count=1, interval='1q'): # type: (Optional[str], Optional[list], Optional[str], Optional[str], int, str) -> Optional[pd.DataFrame] """ 获取多只股票多个季度(年度)的历史财务数据 可指定单季度数据, 也可以指定年度数据。可以指定观察日期, 也可以指定最后一个报告期的结束日期 :param code: 股票代码或者股票代码列表 :param fields: 要查询的财务数据的列表,详细的财务数据表及字段描述请见 :ref:`db_finance` :param watch_date: 观察日期, 如果指定, 将返回 watch_date 日期前(包含该日期)发布的报表数据 :param report_date: 财报日期, 可以是 '2019'/'2019q1'/'2018q4' 格式, 如果指定, 将返回 report_date 对应报告期及之前的历史报告期的报表数据 watch_date 和 stat_date 只能指定一个, 而且必须指定一个 :param count: 查询历史的多个报告期时, 指定的报告期数量. 如果股票历史报告期的数量小于 count, 则该股票返回的数据行数将小于 count :param interval: 查询多个报告期数据时, 指定报告期间隔, 可选值: '1q'/'1y', 表示间隔一季度或者一年,举例: report_date='2019q1', interval='1q', count=4, 将返回 2018q2,2018q3,2018q4,2019q1 的数据 report_date='2019q1', interval='1y', count=4, 将返回 2016q1,2017q1,2018q1,2019q1 的数据 :return: pandas.DataFrame, 数据库查询结果. 数据格式同 get_fundamentals. 每个股票每个报告期(一季度或者一年)的数据占用一行. 推荐用户对结果使用pandas的groupby方法来进行分组分析数据 """ _filter = {} if code is not None: if isinstance(code, str): code = [code] elif not isinstance(code, list): log.error("参数code不合法!,应该为字符串或列表!") return None _filter['code'] = {'$in': code} if fields is not None: if isinstance(fields, list): if not all(isinstance(field, str) and field.isdigit() for field in fields): log.error("参数fields不合法!,应该为字符串列表,范围'001'~'580'!") return None projection = dict.fromkeys(fields, 1) else: log.error("参数fields不合法!,应该为字符串列表!") return None else: projection = None try: if count == 1: return get_fundamentals(_filter, projection, watch_date, report_date) elif count > 1 and isinstance(count, int): if projection is None: projection = {"_id": 0} else: prefix = { "_id": 0, "code": 1, "report_date": 1, "f314": 1 } projection = dict(**prefix, **projection) if interval == '1q': inter_months = 3 * count elif interval == '1y': inter_months = 12 * count else: log.error("参数interval错误,可选值为'1q'/'1y'!") return None if report_date is not None: rd_list = ["-03-31", "-06-30", "-09-30", "-12-31"] if isinstance(report_date, str) and len(report_date) == 4 and report_date.isdigit(): end = report_date + "-12-31" elif isinstance(report_date, str) and len(report_date) == 6 and report_date[:4].isdigit() \ and report_date[4] == 'q' and report_date[-1] in ["1", "2", "3", "4"]: end = report_date[:4] + rd_list[int(report_date[-1]) - 1] else: log.error("参数report_date不合法!") return None start = (datetime.datetime.strptime(end, '%Y-%m-%d') - relativedelta(months=inter_months)).strftime('%Y-%m-%d') _filter['report_date'] = { "$lte": date_to_int(end), "$gte": date_to_int(start) } elif watch_date is not None: if util_date_valid(watch_date) and watch_date > '2000-01-01': end = watch_date start = (datetime.datetime.strptime(end, '%Y-%m-%d') - relativedelta(months=8+inter_months)).strftime('%Y-%m-%d') if start < '2000-01-01': start = '2000-01-01' _filter['f314'] = { "$lte": date_to_int(end[2:]), "$gte": date_to_int(start[2:]) } else: log.error("参数watch_date输入格式不合法!") return None else: log.error("参数watch_date和report_date必须指定一个!") return None coll = DATABASE.report cursor = coll.find(filter=_filter, projection=projection) db_data = pd.DataFrame([item for item in cursor]) if len(db_data) < 1: log.warning("get_history_fundamentals未查询到数据") return None # 原先考虑财报数据的更新在数据库中新增一条记录,后来还是在原来数据上update # db_data = db_data.sort_values('pub_date', ascending=False)\ # .groupby(['code', 'report_date'], as_index=False).first() if interval == '1q': rtn = db_data.sort_values('report_date', ascending=False)\ .groupby(['code'], as_index=False).head(count) else: rtn = db_data.sort_values('report_date', ascending=False)\ .groupby(['code'], as_index=False)\ .apply(lambda x: x[[i % 4 == 0 for i in range(len(x))]].head(count)) rtn = rtn.reset_index(drop=True).sort_values(['code', 'report_date']) rtn.insert(2, 'pub_date', rtn['f314'].apply(int_to_date)) rtn.drop(columns=['f314'], inplace=True) return rtn else: log.error("参数count必须为大于零的整数!") return None except Exception as e: log.error("get_fundamentals运行异常:{}".format(e)) return None
[文档]def get_valuation(code, start=None, end=None, fields=None, count=None): # type: (str, Optional[str], Optional[str], Optional[list], Optional[int]) -> Optional[pd.DataFrame] """ 获取多个股票在指定交易日范围内的市值表数据 :param code: 一支股票代码或者一个股票代码的list,None表示所有股票代码 :param start: 查询开始时间,不能与count共用 :param end: 查询结束时间 :param count: 表示往前查询每一个标的count个交易日的数据,如果期间标的停牌,则该标的返回的市值数据数量小于count :param fields: 财务数据中市值表的字段,为None返回所有字段,可用字段如下: :return: 返回一个dataframe,索引默认是pandas的整数索引,返回的结果字段描述如下: ========================== ==================== 字段名 含义 ========================== ==================== code 股票代码 date 日期 quantity_ratio 量比 capitalization 总股本(万股) circulating_cap 流通股本(万股) market_cap 总市值(亿元) circulating_market_cap 流通市值(亿元) turnover_ratio 换手率(%) pe_ratio 市盈率(PE, TTM) pe_ratio_lyr 市盈率(PE)s pe_ratio_dyn 市盈率(动态) pb_ratio 市净率(PB) ========================== ==================== """ filter = {} if code is not None: if isinstance(code, str): code = [code] elif not isinstance(code, list): log.error("参数code不合法!,应该为字符串或列表!") return None filter['code'] = {'$in': code} if end is None: end = datetime.datetime.now().strftime('%Y-%m-%d') if not is_trade_day(end): end = get_real_trade_date(end) elif util_date_valid(end): if not is_trade_day(end): end = get_real_trade_date(end) else: log.error("参数end不合法!") return None if start is None: if count is None: start = end else: start = get_pre_trade_day(end, count - 1) elif not util_date_valid(end): log.error("参数end不合法!") return None filter['date'] = { '$gte': str(start)[0:10], '$lte': str(end)[0:10] } if fields is None: projection = {"_id": 0} elif isinstance(fields, list): projection = dict.fromkeys(fields, 1) prefix = { "_id": 0, "code": 1, "date": 1, } projection = dict(**prefix, **projection) else: log.error("参数fields不合法!,参考函数说明文件!") return None coll = DATABASE.valuation cursor = coll.find(filter=filter, projection=projection) return pd.DataFrame([item for item in cursor])
[文档]def query_valuation(filter, projection=None): # type: (Dict, Optional[Dict]) -> Optional[pd.DataFrame] """ 查询满足条件的市值信息数据 可用查询条件字段如下: ========================== ==================== 字段名 含义 ========================== ==================== code 股票代码 date 日期 quantity_ratio 量比 capitalization 总股本(万股) circulating_cap 流通股本(万股) market_cap 总市值(亿元) cir_market_cap 流通市值(亿元) turnover_ratio 换手率(%) pe_ttm 市盈率(PE, TTM) pe_lyr 市盈率(PE)s pe_dyn 市盈率(动态) pb_ratio 市净率(PB) ========================== ==================== :param filter: dict 查询条件字典,按pymongo格式输入 :param projection: 你需要查询的字段列表,按pymongo格式输入,返回结果中总会包含code、date字段,无需输入 :return: 返回一个 [pandas.DataFrame], 每一行对应数据库返回的每一行, 列索引是你查询的所有字段 :example: :: # 查询上一个交易日量比大于2,换手率小于2%的股票 yesterday = context.previous_date filter = {'date': yesterday, 'quantity_ratio': {'$gt': 2}, 'turnover_ratio': {'$lt': 0.02}} projection = {'quantity_ratio' : 1, 'turnover_ratio': 1} signal = query_valuation(filter, projection) """ if filter is None: filter = {} elif not isinstance(filter, dict): log.error("参数filter不合法!") return None if projection is None: projection = {"_id": 0} elif isinstance(projection, dict): prefix = { "_id": 0, "code": 1, "date": 1, } projection = dict(**prefix, **projection) else: log.error("参数projection不合法!") return None coll = DATABASE.valuation cursor = coll.find(filter=filter, projection=projection) return pd.DataFrame([item for item in cursor])
def get_next_report_date(report_date: int) -> int : periods = [331, 630, 930, 1231] year = int(report_date / 10000) md = report_date % 10000 if periods.index(md) < 3: next_index = periods.index(md) + 1 else: next_index = 0 year += 1 return year * 10000 + periods[next_index] financial_dict = { # 1.每股指标 'f001': '基本每股收益', # 'EPS', 'f002': '扣除非经常性损益每股收益', # 'deductEPS', 'f003': '每股未分配利润', # 'undistributedProfitPerShare', 'f004': '每股净资产', # 'netAssetsPerShare', 'f005': '每股资本公积金', # 'capitalReservePerShare', 'f006': '净资产收益率', # 'ROE', 'f007': '每股经营现金流量', # 'operatingCashFlowPerShare', # 2. 资产负债表 BALANCE SHEET # 2.1 资产 # 2.1.1 流动资产 'f008': '货币资金', # 'moneyFunds', 'f009': '交易性金融资产', # 'tradingFinancialAssets', 'f010': '应收票据', # 'billsReceivables', 'f011': '应收账款', # 'accountsReceivables', 'f012': '预付款项', # 'prepayments', 'f013': '其他应收款', # 'otherReceivables', 'f014': '应收关联公司款', # 'interCompanyReceivables', 'f015': '应收利息', # 'interestReceivables', 'f016': '应收股利', # 'dividendsReceivables', 'f017': '存货', # 'inventory', 'f018': '其中:消耗性生物资产', # 'expendableBiologicalAssets', 'f019': '一年内到期的非流动资产', # 'noncurrentAssetsDueWithinOneYear', 'f020': '其他流动资产', # 'otherLiquidAssets', 'f021': '流动资产合计', # 'totalLiquidAssets', # 2.1.2 非流动资产 'f022': '可供出售金融资产', # 'availableForSaleSecurities', 'f023': '持有至到期投资', # 'heldToMaturityInvestments', 'f024': '长期应收款', # 'longTermReceivables', 'f025': '长期股权投资', # 'longTermEquityInvestment', 'f026': '投资性房地产', # 'investmentRealEstate', 'f027': '固定资产', # 'fixedAssets', 'f028': '在建工程', # 'constructionInProgress', 'f029': '工程物资', # 'engineerMaterial', 'f030': '固定资产清理', # 'fixedAssetsCleanUp', 'f031': '生产性生物资产', # 'productiveBiologicalAssets', 'f032': '油气资产', # 'oilAndGasAssets', 'f033': '无形资产', # 'intangibleAssets', 'f034': '开发支出', # 'developmentExpenditure', 'f035': '商誉', # 'goodwill', 'f036': '长期待摊费用', # 'longTermDeferredExpenses', 'f037': '递延所得税资产', # 'deferredIncomeTaxAssets', 'f038': '其他非流动资产', # 'otherNonCurrentAssets', 'f039': '非流动资产合计', # 'totalNonCurrentAssets', 'f040': '资产总计', # 'totalAssets', # 2.2 负债 # 2.2.1 流动负债 'f041': '短期借款', # 'shortTermLoan', 'f042': '交易性金融负债', # 'tradingFinancialLiabilities', 'f043': '应付票据', # 'billsPayable', 'f044': '应付账款', # 'accountsPayable', 'f045': '预收款项', # 'advancedReceivable', 'f046': '应付职工薪酬', # 'employeesPayable', 'f047': '应交税费', # 'taxPayable', 'f048': '应付利息', # 'interestPayable', 'f049': '应付股利', # 'dividendPayable', 'f050': '其他应付款', # 'otherPayable', 'f051': '应付关联公司款', # 'interCompanyPayable', 'f052': '一年内到期的非流动负债', # 'noncurrentLiabilitiesDueWithinOneYear', 'f053': '其他流动负债', # 'otherCurrentLiabilities', 'f054': '流动负债合计', # 'totalCurrentLiabilities', # 2.2.2 非流动负债 'f055': '长期借款', # 'longTermLoans', 'f056': '应付债券', # 'bondsPayable', 'f057': '长期应付款', # 'longTermPayable', 'f058': '专项应付款', # 'specialPayable', 'f059': '预计负债', # 'estimatedLiabilities', 'f060': '递延所得税负债', # 'defferredIncomeTaxLiabilities', 'f061': '其他非流动负债', # 'otherNonCurrentLiabilities', 'f062': '非流动负债合计', # 'totalNonCurrentLiabilities', 'f063': '负债合计', # 'totalLiabilities', # 2.3 所有者权益 'f064': '实收资本(或股本)', # 'totalShare', 'f065': '资本公积', # 'capitalReserve', 'f066': '盈余公积', # 'surplusReserve', 'f067': '减:库存股', # 'treasuryStock', 'f068': '未分配利润', # 'undistributedProfits', 'f069': '少数股东权益', # 'minorityEquity', 'f070': '外币报表折算价差', # 'foreignCurrencyReportTranslationSpread', 'f071': '非正常经营项目收益调整', # 'abnormalBusinessProjectEarningsAdjustment', 'f072': '所有者权益(或股东权益)合计', # 'totalOwnersEquity', 'f073': '负债和所有者(或股东权益)合计', # 'totalLiabilitiesAndOwnersEquity', # 3.利润表 'f074': '其中:营业收入', # 'operatingRevenue', 'f075': '其中:营业成本', # 'operatingCosts', 'f076': '营业税金及附加', # 'taxAndSurcharges', 'f077': '销售费用', # 'salesCosts', 'f078': '管理费用', # 'managementCosts', 'f079': '堪探费用', # 'explorationCosts', 'f080': '财务费用', # 'financialCosts', 'f081': '资产减值损失', # 'assestsDevaluation', 'f082': '加:公允价值变动净收益', # 'profitAndLossFromFairValueChanges', 'f083': '投资收益', # 'investmentIncome', 'f084': '其中:对联营企业和合营企业的投资收益', # 'investmentIncomeFromAffiliatedBusinessAndCooperativeEnterprise', 'f085': '影响营业利润的其他科目', # 'otherSubjectsAffectingOperatingProfit', 'f086': '三、营业利润', # 'operatingProfit', 'f087': '加:补贴收入', # 'subsidyIncome', 'f088': '营业外收入', # 'nonOperatingIncome', 'f089': '减:营业外支出', # 'nonOperatingExpenses', 'f090': '其中:非流动资产处置净损失', # 'netLossFromDisposalOfNonCurrentAssets', 'f091': '加:影响利润总额的其他科目', # 'otherSubjectsAffectTotalProfit', 'f092': '四、利润总额', # 'totalProfit', 'f093': '减:所得税', # 'incomeTax', 'f094': '加:影响净利润的其他科目', # 'otherSubjectsAffectNetProfit', 'f095': '五、净利润', # 'netProfit', 'f096': '归属于母公司所有者的净利润', # 'netProfitsBelongToParentCompanyOwner', 'f097': '少数股东损益', # 'minorityProfitAndLoss', # 4.现金流量表 # 4.1 经营活动 Operating 'f098': '销售商品、提供劳务收到的现金', # 'cashFromGoodsSalesorOrRenderingOfServices', 'f099': '收到的税费返还', # 'refundOfTaxAndFeeReceived', 'f100': '收到其他与经营活动有关的现金', # 'otherCashRelatedBusinessActivitiesReceived', 'f101': '经营活动现金流入小计', # 'cashInflowsFromOperatingActivities', 'f102': '购买商品、接受劳务支付的现金', # 'buyingGoodsReceivingCashPaidForLabor', 'f103': '支付给职工以及为职工支付的现金', # 'paymentToEmployeesAndCashPaidForEmployees', 'f104': '支付的各项税费', # 'paymentsOfVariousTaxes', 'f105': '支付其他与经营活动有关的现金', # 'paymentOfOtherCashRelatedToBusinessActivities', 'f106': '经营活动现金流出小计', # 'cashOutflowsFromOperatingActivities', 'f107': '经营活动产生的现金流量净额', # 'netCashFlowsFromOperatingActivities', # 4.2 投资活动 Investment 'f108': '收回投资收到的现金', # 'cashReceivedFromInvestmentReceived', 'f109': '取得投资收益收到的现金', # 'cashReceivedFromInvestmentIncome', 'f110': '处置固定资产、无形资产和其他长期资产收回的现金净额', 'f111': '处置子公司及其他营业单位收到的现金净额', # 'disposalOfNetCashReceivedFromSubsidiariesAndOtherBusinessUnits', 'f112': '收到其他与投资活动有关的现金', # 'otherCashReceivedRelatingToInvestingActivities', 'f113': '投资活动现金流入小计', # 'cashinFlowsFromInvestmentActivities', 'f114': '购建固定资产、无形资产和其他长期资产支付的现金', 'f115': '投资支付的现金', # 'cashInvestment', 'f116': '取得子公司及其他营业单位支付的现金净额', # 'acquisitionOfNetCashPaidBySubsidiariesAndOtherBusinessUnits', 'f117': '支付其他与投资活动有关的现金', # 'otherCashPaidRelatingToInvestingActivities', 'f118': '投资活动现金流出小计', # 'cashOutflowsFromInvestmentActivities', 'f119': '投资活动产生的现金流量净额', # 'netCashFlowsFromInvestingActivities', # 4.3 筹资活动 Financing 'f120': '吸收投资收到的现金', # 'cashReceivedFromInvestors', 'f121': '取得借款收到的现金', # 'cashFromBorrowings', 'f122': '收到其他与筹资活动有关的现金', # 'otherCashReceivedRelatingToFinancingActivities', 'f123': '筹资活动现金流入小计', # 'cashInflowsFromFinancingActivities', 'f124': '偿还债务支付的现金', # 'cashPaymentsOfAmountBorrowed', 'f125': '分配股利、利润或偿付利息支付的现金', # 'cashPaymentsForDistrbutionOfDividendsOrProfits', 'f126': '支付其他与筹资活动有关的现金', # 'otherCashPaymentRelatingToFinancingActivities', 'f127': '筹资活动现金流出小计', # 'cashOutflowsFromFinancingActivities', 'f128': '筹资活动产生的现金流量净额', # 'netCashFlowsFromFinancingActivities', # 4.4 汇率变动 'f129': '四、汇率变动对现金的影响', # 'effectOfForeignExchangRateChangesOnCash', 'f130': '四(2)、其他原因对现金的影响', # 'effectOfOtherReasonOnCash', # 4.5 现金及现金等价物净增加 'f131': '五、现金及现金等价物净增加额', # 'netIncreaseInCashAndCashEquivalents', 'f132': '期初现金及现金等价物余额', # 'initialCashAndCashEquivalentsBalance', # 4.6 期末现金及现金等价物余额 'f133': '期末现金及现金等价物余额', # 'theFinalCashAndCashEquivalentsBalance', # 4.x 补充项目 Supplementary Schedule: # 现金流量附表项目 Indirect Method # 4.x.1 将净利润调节为经营活动现金流量 Convert net profit to cash flow from operating activities 'f134': '净利润', # 'netProfitFromOperatingActivities', 'f135': '资产减值准备', # 'provisionForAssetsLosses', 'f136': '固定资产折旧、油气资产折耗、生产性生物资产折旧', # 'depreciationForFixedAssets', 'f137': '无形资产摊销', # 'amortizationOfIntangibleAssets', 'f138': '长期待摊费用摊销', # 'amortizationOfLong-termDeferredExpenses', 'f139': '处置固定资产、无形资产和其他长期资产的损失', # 'lossOfDisposingFixedAssetsIntangibleAssetsAndOtherLong-termAssets', 'f140': '固定资产报废损失', # 'scrapLossOfFixedAssets', 'f141': '公允价值变动损失', # 'lossFromFairValueChange', 'f142': '财务费用', # 'financialExpenses', 'f143': '投资损失', # 'investmentLosses', 'f144': '递延所得税资产减少', # 'decreaseOfDeferredTaxAssets', 'f145': '递延所得税负债增加', # 'increaseOfDeferredTaxLiabilities', 'f146': '存货的减少', # 'decreaseOfInventory', 'f147': '经营性应收项目的减少', # 'decreaseOfOperationReceivables', 'f148': '经营性应付项目的增加', # 'increaseOfOperationPayables', 'f149': '其他', # 'others', 'f150': '经营活动产生的现金流量净额2', # 'netCashFromOperatingActivities2', # 4.x.2 不涉及现金收支的投资和筹资活动 Investing and financing activities not involved in cash 'f151': '债务转为资本', # 'debtConvertedToCSapital', 'f152': '一年内到期的可转换公司债券', # 'convertibleBondMaturityWithinOneYear', 'f153': '融资租入固定资产', # 'leaseholdImprovements', # 4.x.3 现金及现金等价物净增加情况 Net increase of cash and cash equivalents 'f154': '现金的期末余额', # 'cashEndingBal', 'f155': '现金的期初余额', # 'cashBeginingBal', 'f156': '现金等价物的期末余额', # 'cashEquivalentsEndingBal', 'f157': '现金等价物的期初余额', # 'cashEquivalentsBeginningBal', 'f158': '现金及现金等价物净增加额', # 'netIncreaseOfCashAndCashEquivalents', # 5.偿债能力分析 'f159': '流动比率', # 'currentRatio', # 流动资产/流动负债 'f160': '速动比率', # 'acidTestRatio', # (流动资产-存货)/流动负债 'f161': '现金比率(%)', # 'cashRatio', # (货币资金+有价证券)÷流动负债 'f162': '利息保障倍数', # 'interestCoverageRatio', # (利润总额+财务费用(仅指利息费用部份))/利息费用 'f163': '非流动负债比率(%)', # 'noncurrentLiabilitiesRatio', 'f164': '流动负债比率(%)', # 'currentLiabilitiesRatio', 'f165': '现金到期债务比率(%)', # 'cashDebtRatio', # 企业经营现金净流入/(本期到期长期负债+本期应付票据) 'f166': '有形资产净值债务率(%)', # 'debtToTangibleAssetsRatio', 'f167': '权益乘数(%)', # 'equityMultiplier', # 资产总额/股东权益总额 'f168': '股东的权益/负债合计(%)', # 'equityDebtRatio', # 权益负债率 'f169': '有形资产/负债合计(%)', # 'tangibleAssetDebtRatio ', # 有形资产负债率 'f170': '经营活动产生的现金流量净额/负债合计(%)', # 'netCashFlowsFromOperatingActivitiesDebtRatio', 'f171': 'EBITDA/负债合计(%)', # 'EBITDA/Liabilities', # 6.经营效率分析 # 销售收入÷平均应收账款=销售收入\(0.5 x(应收账款期初+期末)) 'f172': '应收帐款周转率', # 'turnoverRatioOfReceivable;', 'f173': '存货周转率', # 'turnoverRatioOfInventory', # (存货周转天数+应收帐款周转天数-应付帐款周转天数+预付帐款周转天数-预收帐款周转天数)/365 'f174': '运营资金周转率', # 'turnoverRatioOfOperatingAssets', 'f175': '总资产周转率', # 'turnoverRatioOfTotalAssets', 'f176': '固定资产周转率', # 'turnoverRatioOfFixedAssets', # 企业销售收入与固定资产净值的比率 'f177': '应收帐款周转天数', # 'daysSalesOutstanding', # 企业从取得应收账款的权利到收回款项、转换为现金所需要的时间 'f178': '存货周转天数', # 'daysSalesOfInventory', # 企业从取得存货开始,至消耗、销售为止所经历的天数 'f179': '流动资产周转率', # 'turnoverRatioOfCurrentAssets', # 流动资产周转率(次)=主营业务收入/平均流动资产总额 'f180': '流动资产周转天数', # 'daysSalesofCurrentAssets', 'f181': '总资产周转天数', # 'daysSalesofTotalAssets', 'f182': '股东权益周转率', # 'equityTurnover', # 销售收入/平均股东权益 # 7.发展能力分析 'f183': '营业收入增长率(%)', # 'operatingIncomeGrowth', 'f184': '净利润增长率(%)', # 'netProfitGrowthRate', # NPGR 利润总额-所得税 'f185': '净资产增长率(%)', # 'netAssetsGrowthRate', 'f186': '固定资产增长率(%)', # 'fixedAssetsGrowthRate', 'f187': '总资产增长率(%)', # 'totalAssetsGrowthRate', 'f188': '投资收益增长率(%)', # 'investmentIncomeGrowthRate', 'f189': '营业利润增长率(%)', # 'operatingProfitGrowthRate', 'f190': '暂无', # 'None1', 'f191': '暂无', # 'None2', 'f192': '暂无', # 'None3', # 8.获利能力分析 'f193': '成本费用利润率(%)', # 'rateOfReturnOnCost', 'f194': '营业利润率', # 'rateOfReturnOnOperatingProfit', 'f195': '营业税金率', # 'rateOfReturnOnBusinessTax', 'f196': '营业成本率', # 'rateOfReturnOnOperatingCost', 'f197': '净资产收益率', # 'rateOfReturnOnCommonStockholdersEquity', 'f198': '投资收益率', # 'rateOfReturnOnInvestmentIncome', 'f199': '销售净利率(%)', # 'rateOfReturnOnNetSalesProfit', 'f200': '总资产报酬率', # 'rateOfReturnOnTotalAssets', 'f201': '净利润率', # 'netProfitMargin', 'f202': '销售毛利率(%)', # 'rateOfReturnOnGrossProfitFromSales', 'f203': '三费比重', # 'threeFeeProportion', 'f204': '管理费用率', # 'ratioOfChargingExpense', 'f205': '财务费用率', # 'ratioOfFinancialExpense', 'f206': '扣除非经常性损益后的净利润', # 'adjusted_profit', 'f207': '息税前利润(EBIT)', # 'EBIT', 'f208': '息税折旧摊销前利润(EBITDA)', # 'EBITDA', 'f209': 'EBITDA/营业总收入(%)', # 'EBITDA/GrossRevenueRate', # 9.资本结构分析 'f210': '资产负债率(%)', # 'assetsLiabilitiesRatio', 'f211': '流动资产比率', # 'currentAssetsRatio', # 期末的流动资产除以所有者权益 'f212': '货币资金比率', # 'monetaryFundRatio', 'f213': '存货比率', # 'inventoryRatio', 'f214': '固定资产比率', # 'fixedAssetsRatio', 'f215': '负债结构比', # 'liabilitiesStructureRatio', 'f216': '归属于母公司股东权益/全部投入资本(%)', # 'shareholdersOwnershipOfAParentCompany/TotalCapital', 'f217': '股东的权益/带息债务(%)', # 'shareholdersInterest/InterestRateDebtRatio', 'f218': '有形资产/净债务(%)', # 'tangibleAssets/NetDebtRatio', # 10.现金流量分析 'f219': '每股经营性现金流(元)', # 'operatingCashFlowPerShare', 'f220': '营业收入现金含量(%)', # 'cashOfOperatingIncome', 'f221': '经营活动产生的现金流量净额/经营活动净收益(%)', # 'netOperatingCashFlow/netOperationProfit', 'f222': '销售商品提供劳务收到的现金/营业收入(%)', # 'cashFromGoodsSales/OperatingRevenue', 'f223': '经营活动产生的现金流量净额/营业收入', # 'netOperatingCashFlow/OperatingRevenue', 'f224': '资本支出/折旧和摊销', # 'capitalExpenditure/DepreciationAndAmortization', 'f225': '每股现金流量净额(元)', # 'netCashFlowPerShare', 'f226': '经营净现金比率(短期债务)', # 'operatingCashFlow/ShortTermDebtRatio', 'f227': '经营净现金比率(全部债务)', # 'operatingCashFlow/LongTermDebtRatio', 'f228': '经营活动现金净流量与净利润比率', # 'cashFlowRateAndNetProfitRatioOfOperatingActivities', 'f229': '全部资产现金回收率', # 'cashRecoveryForAllAssets', # 11. 单季度财务指标 'f230': '营业收入', # 'operatingRevenueSingle', 'f231': '营业利润', # 'operatingProfitSingle', 'f232': '归属于母公司所有者的净利润', # 'netProfitBelongingToTheOwnerOfTheParentCompanySingle', 'f233': '扣除非经常性损益后的净利润', # 'netProfitAfterExtraordinaryGainsAndLossesSingle', 'f234': '经营活动产生的现金流量净额', # 'netCashFlowsFromOperatingActivitiesSingle', 'f235': '投资活动产生的现金流量净额', # 'netCashFlowsFromInvestingActivitiesSingle', 'f236': '筹资活动产生的现金流量净额', # 'netCashFlowsFromFinancingActivitiesSingle', 'f237': '现金及现金等价物净增加额', # 'netIncreaseInCashAndCashEquivalentsSingle', # 12.股本股东 'f238': '总股本', # 'totalCapital', 'f239': '已上市流通A股', # 'listedAShares', 'f240': '已上市流通B股', # 'listedBShares', 'f241': '已上市流通H股', # 'listedHShares', 'f242': '股东人数(户)', # 'numberOfShareholders', 'f243': '第一大股东的持股数量', # 'theNumberOfFirstMajorityShareholder', 'f244': '十大流通股东持股数量合计(股)', # 'totalNumberOfTopTenCirculationShareholders', 'f245': '十大股东持股数量合计(股)', # 'totalNumberOfTopTenMajorShareholders', # 13.机构持股 'f246': '机构总量(家)', # 'institutionNumber', 'f247': '机构持股总量(股)', # 'institutionShareholding', 'f248': 'QFII机构数', # 'QFIIInstitutionNumber', 'f249': 'QFII持股量', # 'QFIIShareholding', 'f250': '券商机构数', # 'brokerNumber', 'f251': '券商持股量', # 'brokerShareholding', 'f252': '保险机构数', # 'securityNumber', 'f253': '保险持股量', # 'securityShareholding', 'f254': '基金机构数', # 'fundsNumber', 'f255': '基金持股量', # 'fundsShareholding', 'f256': '社保机构数', # 'socialSecurityNumber', 'f257': '社保持股量', # 'socialSecurityShareholding', 'f258': '私募机构数', # 'privateEquityNumber', 'f259': '私募持股量', # 'privateEquityShareholding', 'f260': '财务公司机构数', # 'financialCompanyNumber', 'f261': '财务公司持股量', # 'financialCompanyShareholding', 'f262': '年金机构数', # 'pensionInsuranceAgencyNumber', 'f263': '年金持股量', # 'pensionInsuranceAgencyShareholfing', # 14.新增指标 # [注:季度报告中,若股东同时持有非流通A股性质的股份(如同时持有流通A股和流通B股),取的是包含同时持有非流通A股性质的流通股数] 'f264': '十大流通股东中持有A股合计(股)', # 'totalNumberOfTopTenCirculationShareholders', 'f265': '第一大流通股东持股量(股)', # 'firstLargeCirculationShareholdersNumber', # [注:1.自由流通股=已流通A股-十大流通股东5%以上的A股; # 2.季度报告中,若股东同时持有非流通A股性质的股份(如同时持有流通A股和流通H股). # ,5%以上的持股取的是不包含同时持有非流通A股性质的流通股数,结果可能偏大; # 3.指标按报告期展示,新股在上市日的下个报告期才有数据] 'f266': '自由流通股(股)', # 'freeCirculationStock', 'f267': '受限流通A股(股)', # 'limitedCirculationAShares', 'f268': '一般风险准备(金融类)', # 'generalRiskPreparation', 'f269': '其他综合收益(利润表)', # 'otherComprehensiveIncome', 'f270': '综合收益总额(利润表)', # 'totalComprehensiveIncome', 'f271': '归属于母公司股东权益(资产负债表)', # 'shareholdersOwnershipOfAParentCompany ', 'f272': '银行机构数(家)(机构持股)', # 'bankInstutionNumber', 'f273': '银行持股量(股)(机构持股)', # 'bankInstutionShareholding', 'f274': '一般法人机构数(家)(机构持股)', # 'corporationNumber', 'f275': '一般法人持股量(股)(机构持股)', # 'corporationShareholding', 'f276': '近一年净利润(元)', # 'netProfitLastYear', 'f277': '信托机构数(家)(机构持股)', # 'trustInstitutionNumber', 'f278': '信托持股量(股)(机构持股)', # 'trustInstitutionShareholding', 'f279': '特殊法人机构数(家)(机构持股)', # 'specialCorporationNumber', 'f280': '特殊法人持股量(股)(机构持股)', # 'specialCorporationShareholding', 'f281': '加权净资产收益率(每股指标)', # 'weightedROE', 'f282': '扣非每股收益(单季度财务指标)', # 'nonEPSSingle', 'f283': '最近一年营业收入()', # 'lastYearOperatingIncome', 'f284': '国家队持股数量(万股)', # 'nationalTeamShareholding', # [注:本指标统计包含汇金公司、证金公司、外汇管理局旗下投资平台、国家队基金、国开、养老金以及中科汇通等国家队机构持股数量] 'f285': '业绩预告-本期净利润同比增幅下限%', # 'PF_theLowerLimitoftheYearonyearGrowthofNetProfitForThePeriod', # [注:指标285至294展示未来一个报告期的数据。例,3月31日至6月29日这段时间内展示的是中报的数据;如果最新的财务报告后面有多个报告期的业绩预告/快报,只能展示最新的财务报告后面的一个报告期的业绩预告/快报] 'f286': '业绩预告-本期净利润同比增幅上限%', # 'PF_theHigherLimitoftheYearonyearGrowthofNetProfitForThePeriod', 'f287': '业绩快报-归母净利润', # 'PE_returningtotheMothersNetProfit', 'f288': '业绩快报-扣非净利润', # 'PE_Non-netProfit', 'f289': '业绩快报-总资产', # 'PE_TotalAssets', 'f290': '业绩快报-净资产', # 'PE_NetAssets', 'f291': '业绩快报-每股收益', # 'PE_EPS', 'f292': '业绩快报-摊薄净资产收益率', # 'PE_DilutedROA', 'f293': '业绩快报-加权净资产收益率', # 'PE_WeightedROE', 'f294': '业绩快报-每股净资产', # 'PE_NetAssetsperShare', 'f295': '应付票据及应付账款(资产负债表)', # 'BS_NotesPayableandAccountsPayable', 'f296': '应收票据及应收账款(资产负债表)', # 'BS_NotesReceivableandAccountsReceivable', 'f297': '递延收益(资产负债表)', # 'BS_DeferredIncome', 'f298': '其他综合收益(资产负债表)', # 'BS_OtherComprehensiveIncome', 'f299': '其他权益工具(资产负债表)', # 'BS_OtherEquityInstruments', 'f300': '其他收益(利润表)', # 'IS_OtherIncome', 'f301': '资产处置收益(利润表)', # 'IS_AssetDisposalIncome', 'f302': '持续经营净利润(利润表)', # 'IS_NetProfitforContinuingOperations', 'f303': '终止经营净利润(利润表)', # 'IS_NetProfitforTerminationOperations', 'f304': '研发费用(利润表)', # 'IS_R&DExpense', 'f305': '其中, #利息费用(利润表-财务费用)', # 'IS_InterestExpense', 'f306': '其中, #利息收入(利润表-财务费用)', # 'IS_InterestIncome', 'f307': '近一年经营活动现金流净额', # 'netCashFlowfromOperatingActivitiesinthepastyear', 'f308': '近一年归母净利润', # 'Net_profit_attributable to the mother in the recent year', 'f309': '近一年扣非净利润', # 'Nearly_one_year_net profit after deduction', 'f310': '近一年现金净流量', # 'Net cash flow in the past year', 'f311': '基本每股收益(单季度)', # 'Basic earnings per share (single quarter)', 'f312': '营业总收入(单季度)', # 'Total operating income (single quarter) ', 'f313': '业绩预告公告日期', # 'Announcement date of earnings forecast', 'f314': '财报公告日期', # 'earnings announcement date', 'f315': '业绩快报公告日期', # 'Earnings Update Announcement Date', 'f316': '近一年投资活动现金流净额', # 'Net cash flow from investing activities in the past year ', 'f317': '业绩预告-本期净利润下限', # 'Forecast of performance', 'f318': '业绩预告-本期净利润上限', # 'Forecast of Results - Current Period Net Income Cap', 'f319': '营业总收入TTM', # 'Total Operating Income TTM', 'f320': '员工总数(人)', # 'Total number of employees (people)', 'f321': '每股企业自由现金流', # 'Corporate Free Cash Flow per Share', 'f322': '每股股东自由现金流', # 'Free cash flow per share for shareholders', 'f323': '备用323', # 'unknown323', 'f324': '备用324', # 'unknown324', 'f325': '备用325', # 'unknown325', 'f326': '备用326', # 'unknown326', 'f327': '备用327', # 'unknown327', 'f328': '备用328', # 'unknown328', 'f329': '备用329', # 'unknown329', 'f330': '备用330', # 'unknown330', 'f331': '备用331', # 'unknown331', 'f332': '备用332', # 'unknown332', 'f333': '备用333', # 'unknown333', 'f334': '备用334', # 'unknown334', 'f335': '备用335', # 'unknown335', 'f336': '备用336', # 'unknown336', 'f337': '备用337', # 'unknown337', 'f338': '备用338', # 'unknown338', 'f339': '备用339', # 'unknown339', 'f340': '备用340', # 'unknown340', 'f341': '备用341', # 'unknown341', 'f342': '备用342', # 'unknown342', 'f343': '备用343', # 'unknown343', 'f344': '备用344', # 'unknown344', 'f345': '备用345', # 'unknown345', 'f346': '备用346', # 'unknown346', 'f347': '备用347', # 'unknown347', 'f348': '备用348', # 'unknown348', 'f349': '备用349', # 'unknown349', 'f350': '备用350', # 'unknown350', 'f351': '备用351', # 'unknown351', 'f352': '备用352', # 'unknown352', 'f353': '备用353', # 'unknown353', 'f354': '备用354', # 'unknown354', 'f355': '备用355', # 'unknown355', 'f356': '备用356', # 'unknown356', 'f357': '备用357', # 'unknown357', 'f358': '备用358', # 'unknown358', 'f359': '备用359', # 'unknown359', 'f360': '备用360', # 'unknown360', 'f361': '备用361', # 'unknown361', 'f362': '备用362', # 'unknown362', 'f363': '备用363', # 'unknown363', 'f364': '备用364', # 'unknown364', 'f365': '备用365', # 'unknown365', 'f366': '备用366', # 'unknown366', 'f367': '备用367', # 'unknown367', 'f368': '备用368', # 'unknown368', 'f369': '备用369', # 'unknown369', 'f370': '备用370', # 'unknown370', 'f371': '备用371', # 'unknown371', 'f372': '备用372', # 'unknown372', 'f373': '备用373', # 'unknown373', 'f374': '备用374', # 'unknown374', 'f375': '备用375', # 'unknown375', 'f376': '备用376', # 'unknown376', 'f377': '备用377', # 'unknown377', 'f378': '备用378', # 'unknown378', 'f379': '备用379', # 'unknown379', 'f380': '备用380', # 'unknown380', 'f381': '备用381', # 'unknown381', 'f382': '备用382', # 'unknown382', 'f383': '备用383', # 'unknown383', 'f384': '备用384', # 'unknown384', 'f385': '备用385', # 'unknown385', 'f386': '备用386', # 'unknown386', 'f387': '备用387', # 'unknown387', 'f388': '备用388', # 'unknown388', 'f389': '备用389', # 'unknown389', 'f390': '备用390', # 'unknown390', 'f391': '备用391', # 'unknown391', 'f392': '备用392', # 'unknown392', 'f393': '备用393', # 'unknown393', 'f394': '备用394', # 'unknown394', 'f395': '备用395', # 'unknown395', 'f396': '备用396', # 'unknown396', 'f397': '备用397', # 'unknown397', 'f398': '备用398', # 'unknown398', 'f399': '备用399', # 'unknown399', 'f400': '备用400', # 'unknown400', # 资产负债表新增指标--- 'f401': '专项储备', # 'Special reserve', 'f402': '结算备付金', # 'Settlement provision', 'f403': '拆出资金', # 'Funds removed', 'f404': '发放贷款及垫款', # 'Loans and advances granted', 'f405': '衍生金融资产', # 'Derivative financial assets', 'f406': '应收保费', # 'Premium receivable', 'f407': '应收分保账款', # 'Sub-insurance receivables', 'f408': '应收分保合同准备金', # 'Provision for sub-insurance contracts receivable', 'f409': '买入返售金融资产', # 'Buy-back financial assets', 'f410': '划分为持有待售的资产', # 'Assets classified as held for sale', 'f411': '发放贷款及垫款', # 'Loans and advances granted', 'f412': '向中央银行借款', # 'Borrowings from central banks', 'f413': '吸收存款及同业存放', # 'Absorption of deposits and interbank deposits', 'f414': '拆入资金', # 'Funds borrowed', 'f415': '衍生金融负债', # 'Derivative financial liabilities', 'f416': '卖出回购金融资产款', # 'Sale of repurchase financial assets', 'f417': '应付手续费及佣金', # 'Fees and commissions payable', 'f418': '应付分保账款', # 'Payables to sub-insurance accounts', 'f419': '保险合同准备金', # 'Provision for insurance contracts', 'f420': '代理买卖证券款', # 'Agency securities trading', 'f421': '代理承销证券款', # 'Agency underwriting of securities', 'f422': '划分为持有待售的负债', # 'Liabilities classified as held for sale', 'f423': '预计负债', # 'Projected liabilities', 'f424': '递延收益', # 'Deferred income', 'f425': '其中, #优先股', # 'Deferred incomeOf which, #Preferred stock', 'f426': '永续债非流动负债科目', # 'Perpetual bonds', 'f427': '长期应付职工薪酬', # 'Long-term employee compensation payable', 'f428': '其中, #优先股', # 'Long-term employee compensation payable Of which, #Preferred shares', 'f429': '永续债所有者权益科目', # 'Perpetual debentures Owners equity account', 'f430': '债权投资', # 'Debt investments', 'f431': '其他债权投资', # 'Other debt investments', 'f432': '其他权益工具投资', # 'Investment in other equity instruments', 'f433': '其他非流动金融资产', # 'Other non-current financial assets', 'f434': '合同负债', # 'Contract liabilities', 'f435': '合同资产', # 'Contract assets', 'f436': '其他资产', # 'Other assets', 'f437': '应收款项融资', # 'Financing of receivables', 'f438': '使用权资产', # 'Right-of-use assets', 'f439': '租赁负债', # 'Lease liabilities', 'f440': '备用440', # 'unknown440', 'f441': '备用441', # 'unknown441', 'f442': '备用442', # 'unknown442', 'f443': '备用443', # 'unknown443', 'f444': '备用444', # 'unknown444', 'f445': '备用445', # 'unknown445', 'f446': '备用446', # 'unknown446', 'f447': '备用447', # 'unknown447', 'f448': '备用448', # 'unknown448', 'f449': '备用449', # 'unknown449', 'f450': '备用450', # 'unknown450', 'f451': '备用451', # 'unknown451', 'f452': '备用452', # 'unknown452', 'f453': '备用453', # 'unknown453', 'f454': '备用454', # 'unknown454', 'f455': '备用455', # 'unknown455', 'f456': '备用456', # 'unknown456', 'f457': '备用457', # 'unknown457', 'f458': '备用458', # 'unknown458', 'f459': '备用459', # 'unknown459', 'f460': '备用460', # 'unknown460', 'f461': '备用461', # 'unknown461', 'f462': '备用462', # 'unknown462', 'f463': '备用463', # 'unknown463', 'f464': '备用464', # 'unknown464', 'f465': '备用465', # 'unknown465', 'f466': '备用466', # 'unknown466', 'f467': '备用467', # 'unknown467', 'f468': '备用468', # 'unknown468', 'f469': '备用469', # 'unknown469', 'f470': '备用470', # 'unknown470', 'f471': '备用471', # 'unknown471', 'f472': '备用472', # 'unknown472', 'f473': '备用473', # 'unknown473', 'f474': '备用474', # 'unknown474', 'f475': '备用475', # 'unknown475', 'f476': '备用476', # 'unknown476', 'f477': '备用477', # 'unknown477', 'f478': '备用478', # 'unknown478', 'f479': '备用479', # 'unknown479', 'f480': '备用480', # 'unknown480', 'f481': '备用481', # 'unknown481', 'f482': '备用482', # 'unknown482', 'f483': '备用483', # 'unknown483', 'f484': '备用484', # 'unknown484', 'f485': '备用485', # 'unknown485', 'f486': '备用486', # 'unknown486', 'f487': '备用487', # 'unknown487', 'f488': '备用488', # 'unknown488', 'f489': '备用489', # 'unknown489', 'f490': '备用490', # 'unknown490', 'f491': '备用491', # 'unknown491', 'f492': '备用492', # 'unknown492', 'f493': '备用493', # 'unknown493', 'f494': '备用494', # 'unknown494', 'f495': '备用495', # 'unknown495', 'f496': '备用496', # 'unknown496', 'f497': '备用497', # 'unknown497', 'f498': '备用498', # 'unknown498', 'f499': '备用499', # 'unknown499', 'f500': '备用500', # 'unknown500', 'f501': '稀释每股收益', # 'Diluted earnings per share', 'f502': '营业总收入', # "Total operating income", 'f503': '汇兑收益', # 'Foreign exchange gain', 'f504': '其中, #归属于母公司综合收益', # 'Comprehensive income attributable to parent company', 'f505': '其中, #归属于少数股东综合收益', # 'Comprehensive income attributable to minority shareholders', 'f506': '利息收入', # 'Interest income', 'f507': '已赚保费', # 'Premiums earned', 'f508': '手续费及佣金收入', # 'Fee and commission income', 'f509': '利息支出', # 'Interest expense', 'f510': '手续费及佣金支出', # 'Handling and commission expenses', 'f511': '退保金', # 'Surrender premiums', 'f512': '赔付支出净额', # 'Net payout expenses', 'f513': '提取保险合同准备金净额', # 'Net withdrawal of insurance contract reserve', 'f514': '保单红利支出', # 'Policy dividend expense', 'f515': '分保费用', # 'Ceding expenses', 'f516': '其中, #非流动资产处置利得', # 'Gain on disposal of non-current assets', 'f517': '信用减值损失', # 'Credit impairment loss', 'f518': '净敞口套期收益', # 'Net exposure hedging gain', 'f519': '营业总成本', # 'Total operating costs', 'f520': '信用减值损失', # 'Credit impairment loss', 'f521': '资产减值损失', # 'Impairment loss on assets', 'f522': '备用522', # 'unknown522', 'f523': '备用523', # 'unknown523', 'f524': '备用524', # 'unknown524', 'f525': '备用525', # 'unknown525', 'f526': '备用526', # 'unknown526', 'f527': '备用527', # 'unknown527', 'f528': '备用528', # 'unknown528', 'f529': '备用529', # 'unknown529', 'f530': '备用530', # 'unknown530', 'f531': '备用531', # 'unknown531', 'f532': '备用532', # 'unknown532', 'f533': '备用533', # 'unknown533', 'f534': '备用534', # 'unknown534', 'f535': '备用535', # 'unknown535', 'f536': '备用536', # 'unknown536', 'f537': '备用537', # 'unknown537', 'f538': '备用538', # 'unknown538', 'f539': '备用539', # 'unknown539', 'f540': '备用540', # 'unknown540', 'f541': '备用541', # 'unknown541', 'f542': '备用542', # 'unknown542', 'f543': '备用543', # 'unknown543', 'f544': '备用544', # 'unknown544', 'f545': '备用545', # 'unknown545', 'f546': '备用546', # 'unknown546', 'f547': '备用547', # 'unknown547', 'f548': '备用548', # 'unknown548', 'f549': '备用549', # 'unknown549', 'f550': '备用550', # 'unknown550', 'f551': '备用551', # 'unknown551', 'f552': '备用552', # 'unknown552', 'f553': '备用553', # 'unknown553', 'f554': '备用554', # 'unknown554', 'f555': '备用555', # 'unknown555', 'f556': '备用556', # 'unknown556', 'f557': '备用557', # 'unknown557', 'f558': '备用558', # 'unknown558', 'f559': '备用559', # 'unknown559', 'f560': '备用560', # 'unknown560', 'f561': ', #其他原因对现金的影响2', # 'Add, #Effect of other causes on cash2', 'f562': '客户存款和同业存放款项净增加额', # 'Net increase in customer deposits and interbank deposits', 'f563': '向中央银行借款净增加额', # 'Net increase in borrowings from central banks', 'f564': '向其他金融机构拆入资金净增加额', # 'Net increase in funds borrowed from other financial institutions', 'f565': '收到原保险合同保费取得的现金', # 'Cash received from premiums on original insurance contracts', 'f566': '收到再保险业务现金净额', # 'Net cash received from reinsurance business', 'f567': '保户储金及投资款净增加额', # 'Net increase in policyholders deposits and investment funds', 'f568': '处置以公允价值计量且其变动计入当期损益的金融资产净增加额', 'f569': '收取利息、手续费及佣金的现金', # 'Cash received from interest, fees and commissions', 'f570': '拆入资金净增加额', # 'Net increase in funds transferred in ', 'f571': '回购业务资金净增加额', # 'Net increase in funds from repo business', 'f572': '客户贷款及垫款净增加额', # 'Net increase in loans and advances to customers', 'f573': '存放中央银行和同业款项净增加额', # 'Net increase in deposits with central banks and interbank', 'f574': '支付原保险合同赔付款项的现金', # 'Cash paid for claims on original insurance contracts', 'f575': '支付利息、手续费及佣金的现金', # 'Cash paid for interest, fees and commissions', 'f576': '支付保单红利的现金', # 'Cash paid for policy dividends', 'f577': '其中, #子公司吸收少数股东投资收到的现金', # 'cash received from minority shareholders investment in subsidiaries', 'f578': '其中, #子公司支付给少数股东的股利利润', # 'Dividends and profits paid by subsidiaries to minority shareholders', 'f579': '投资性房地产的折旧及摊销', # 'Depreciation and amortization of investment properties', 'f580': '信用减值损失', # 'Credit impairment loss' } if __name__ == '__main__': # df = get_financial_data(['000001', '601567'], ['001', '002', '095'], # watch_date='2020-04-22') # df = get_history_fundamentals(['000001', '601567'], ['001', '002', '095'], # watch_date='2020-04-22', count=10, interval='1q') df = get_fundamentals_continuously('601567', fields=['001', '002', '095'], end_date='2020-04-22', count=300) print(df)