问题描述
解决方案
在PTrade中,查询上市公司特定季度(如第一季度)的财务数据,主要通过 get_fundamentals 函数实现。关键在于设置 report_types 参数。
核心方法
使用 get_fundamentals 函数时,将 report_types 设置为 '1' 即可指定获取第一季度的财报数据。
report_types 参数说明:
'1': 第一季度报'2': 半年报(中报)'3': 第三季度报'4': 年报
代码实现
以下是一个完整的策略示例,展示了两种常见的查询场景:
- 按年份查询:获取指定股票在过去几年中每一年的第一季度净利润。
- 按日期查询:获取指定日期前最新发布的一份第一季度财报数据。
def initialize(context):
# 设置股票池,以恒生电子为例
g.security = ['600570.SS']
set_universe(g.security)
def before_trading_start(context, data):
# 场景一:按年份查询(推荐用于研究历史趋势)
# 查询 2020年 到 2022年,每年的第一季度(Q1)的净利润数据
# table='income_statement' (利润表)
# fields='net_profit' (净利润)
# report_types='1' (指定只看一季报)
log.info("=== 开始查询 2020-2022 历年一季报数据 ===")
q1_history = get_fundamentals(
g.security,
'income_statement',
fields='net_profit',
start_year='2020',
end_year='2022',
report_types='1'
)
log.info(q1_history)
# 场景二:按日期查询(推荐用于回测或实盘获取最新数据)
# 查询在 2023年5月1日 之前发布的、最近的一份第一季度报数据
# 如果2023年一季报已发,则返回2023Q1;如果未发,则返回2022Q1
log.info("=== 开始查询指定日期前最新的一季报数据 ===")
q1_latest = get_fundamentals(
g.security,
'income_statement',
fields='net_profit',
date='20230501',
report_types='1'
)
log.info(q1_latest)
def handle_data(context, data):
pass
注意事项
- 参数互斥:
start_year/end_year模式与date模式不能同时使用。- 使用
start_year和end_year时,返回的是一个 Panel 结构(多维数据),包含指定年份范围内的所有一季报。 - 使用
date时,返回的是 DataFrame 结构,仅包含离该日期最近的那一份一季报。
- 使用
- 数据表选择:示例中使用的是
income_statement(利润表),您可以根据需要更改为balance_statement(资产负债表)、cashflow_statement(现金流量表)等,具体字段请参考API文档的财务数据附录。 - 缺省情况:如果查询的年份或日期对应的财报尚未披露,系统可能会返回
NaN。
Q&A
Q: get_fundamentals函数中report_types参数不填会返回什么?
A: 如果使用年份查询模式(start_year/end_year),不填 report_types 默认返回当年可查询到的全部类型财报;如果使用日期查询模式(date),不填 report_types 默认返回距离指定日期最近的一份财报(可能是季报、半年报或年报)。
Q: 如何查询上市公司的年报数据?
A: 将 get_fundamentals 函数中的 report_types 参数设置为 '4' 即可查询年报数据。
Q: PTrade回测中获取财务数据会有未来函数吗?
A: 如果使用 date 参数且不传入具体日期(默认取回测当前日期),或者传入了具体的历史日期,PTrade 会根据财报的**实际公告日期(publ_date)**来返回数据。只有当回测日期大于等于公告日期时,才能获取到该财报数据,从而避免未来函数。但如果使用 merge_type=1(获取最新发布数据)可能会引入修正后的数据,需谨慎使用。