问题描述
解决方案
在PTrade量化交易平台中,获取上市公司“经营活动现金流净额”数据,需要使用 get_fundamentals 函数查询财务数据。
具体的数据表为 cashflow_statement(现金流量表),对应的字段名为 net_operate_cash_flow。
以下是详细的获取方法和代码示例:
1. 核心函数与参数
- 函数:
get_fundamentals(security, table, fields, ...) - 表名 (
table):'cashflow_statement' - 字段名 (
fields):'net_operate_cash_flow'
2. 代码示例
场景一:在回测/交易策略中获取(获取最新可用数据)
在策略的 handle_data 或 before_trading_start 中,通常获取当前时间点已发布的最新数据。
def initialize(context):
# 设置股票池,例如:恒生电子
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取股票池中股票的“经营活动产生的现金流量净额”
# 不传入 date 参数,回测中默认取当前回测日期,交易中取当日
# 系统会自动匹配该日期前已发布的最新财报数据
df = get_fundamentals(g.security, 'cashflow_statement', 'net_operate_cash_flow')
if df is not None and not df.empty:
# 打印结果
log.info("经营活动现金流净额数据:")
log.info(df)
# 获取具体数值 (假设只查询了一只股票)
cash_flow = df['net_operate_cash_flow'][0]
log.info("恒生电子最新经营现金流净额: %s" % cash_flow)
场景二:在研究模式中获取指定日期的数据
如果你在研究界面,想要获取某一天(例如 2023年6月28日)能看到的最新数据:
# 获取指定日期的经营活动现金流净额
df = get_fundamentals('600570.SS', 'cashflow_statement', 'net_operate_cash_flow', date='20230628')
print(df)
场景三:获取历史年份的年报数据
如果你需要获取过去几年的年报数据(例如2020年至2022年的年报):
# start_year 和 end_year 用于指定年份范围
# report_types='4' 表示只获取年报 (1:一季报, 2:半年报, 3:三季报, 4:年报)
df = get_fundamentals(
'600570.SS',
'cashflow_statement',
'net_operate_cash_flow',
start_year='2020',
end_year='2022',
report_types='4'
)
print(df)
3. 返回数据说明
get_fundamentals 返回的是一个 pandas.DataFrame 对象(在按日期查询模式下):
- 索引 (Index):股票代码(如
600570.SS)。 - 列 (Columns):包含请求的字段(如
net_operate_cash_flow)以及基础信息(如publ_date公告日期,end_date报告截止日期)。
4. 注意事项
- 数据单位:返回的数据通常为元(绝对值),数值可能非常大,使用时请注意单位换算(如除以 $10^8$ 转换为亿元)。
- 未来函数:在回测中,如果不指定
date,系统默认使用回测当前的日期。PTrade 会根据财报的公告日期 (publ_date) 来返回数据,确保不会获取到当时尚未发布的数据(即避免未来函数)。 - 缺失值:如果某公司在指定日期未发布财报,或者数据缺失,返回的值可能是
NaN,建议在策略中加入if not df.empty或isnan的判断。
Q&A
Q1: 如何同时获取“经营活动现金流净额”和“净利润”?
A1: 可以将字段名放入一个列表中传入。
fields = ['net_operate_cash_flow', 'net_profit']
# net_profit 在 income_statement 表中,跨表查询需要分别调用或确认 PTrade 是否支持跨表(通常建议分表调用或查询文档支持情况,PTrade标准用法通常一次查一张表,但部分版本支持多表字段混查,建议分开写更稳健)。
# 正确做法是分别获取:
cash_flow = get_fundamentals(g.security, 'cashflow_statement', 'net_operate_cash_flow')
profit = get_fundamentals(g.security, 'income_statement', 'net_profit')
Q2: report_types 参数有哪些选项?
A2:
'1': 一季度报'2': 半年报(中报)'3': 三季度报'4': 年报
如果不传该参数,默认返回离查询日期最近的一份报告。
Q3: 为什么获取到的数据是 NaN?
A3: 可能是因为:
- 该股票在查询日期前未上市。
- 该股票尚未发布对应日期的财报。
- 停牌或其他原因导致数据缺失。
建议在使用数据前进行空值检查。