问题描述
我需要获取一些公司的财务数据,比如市盈率(PE)、市净率(PB)和资产负债表信息,用代码怎么实现?
解决方案
在PTrade中,获取财务数据主要通过 get_fundamentals 函数实现。该函数支持查询估值表、资产负债表、利润表、现金流量表等多种财务数据。
针对您的需求:
- 市盈率 (PE) 和 市净率 (PB):属于 估值数据,表名为
'valuation'。 - 资产负债表信息:属于 资产负债表,表名为
'balance_statement'。
以下是一个完整的策略示例代码,展示如何在盘前阶段获取指定股票的这些数据并打印出来。
def initialize(context):
# 设置要查询的股票池,这里以恒生电子(600570.SS)和浦发银行(600000.SS)为例
g.security = ['600570.SS', '600000.SS']
set_universe(g.security)
def before_trading_start(context, data):
# 1. 获取估值数据 (PE, PB)
# 表名: 'valuation'
# 字段:
# pe_ttm: 市盈率(TTM)
# pb: 市净率
# pe_static: 静态市盈率 (可选)
# turnover_rate: 换手率 (可选)
val_fields = ['pe_ttm', 'pb', 'pe_static', 'turnover_rate']
# date参数不传默认取回测当前日期前一交易日的数据(避免未来函数)
df_valuation = get_fundamentals(g.security, 'valuation', val_fields)
log.info("=== 估值数据 (Valuation) ===")
log.info(df_valuation)
# 2. 获取资产负债表数据
# 表名: 'balance_statement'
# 字段:
# total_assets: 资产总计
# total_liability: 负债合计
# total_shareholder_equity: 所有者权益合计
bal_fields = ['total_assets', 'total_liability', 'total_shareholder_equity']
# 获取最近一期发布的资产负债表数据
df_balance = get_fundamentals(g.security, 'balance_statement', bal_fields)
log.info("=== 资产负债表数据 (Balance Sheet) ===")
log.info(df_balance)
def handle_data(context, data):
pass
代码说明:
get_fundamentals(security, table, fields, ...): 这是核心查询函数。security: 股票代码列表。table: 数据表名(如'valuation','balance_statement')。fields: 需要查询的具体字段列表。
valuation表常用字段:pe_ttm: 滚动市盈率(推荐使用,更能反映近期盈利能力)。pe_static: 静态市盈率(基于上年度财报)。pb: 市净率。
balance_statement表常用字段:total_assets: 总资产。total_liability: 总负债。total_shareholder_equity: 股东权益。
- 数据返回格式:
- 返回的是
pandas.DataFrame对象,索引(Index)通常是股票代码,列(Columns)是你请求的字段名。
- 返回的是
注意事项:
- 查询时间: 在回测模式下,如果不指定
date参数,默认获取的是当前回测日期之前已发布的最新数据,这样可以避免用到“未来数据”。 - 频次限制:
get_fundamentals接口有流量限制(通常每秒不超过100次,单次不超过500条数据)。如果您查询的股票数量非常多(例如全市场扫描),建议分批查询并在批次之间加入time.sleep(1)。