🚀 AI 一键生成 ptrade 策略代码

PTrade 策略开发:如何获取并分析经营活动现金流净额?

ptrade | 发布时间: 2025/12/21
以下内容由 EasyQuant 生成。

问题描述

如何获取上市公司的经营活动现金流净额数据?

解决方案

在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_databefore_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. 注意事项

  1. 数据单位:返回的数据通常为(绝对值),数值可能非常大,使用时请注意单位换算(如除以 $10^8$ 转换为亿元)。
  2. 未来函数:在回测中,如果不指定 date,系统默认使用回测当前的日期。PTrade 会根据财报的公告日期 (publ_date) 来返回数据,确保不会获取到当时尚未发布的数据(即避免未来函数)。
  3. 缺失值:如果某公司在指定日期未发布财报,或者数据缺失,返回的值可能是 NaN,建议在策略中加入 if not df.emptyisnan 的判断。

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: 可能是因为:

  1. 该股票在查询日期前未上市。
  2. 该股票尚未发布对应日期的财报。
  3. 停牌或其他原因导致数据缺失。
    建议在使用数据前进行空值检查。