🚀 AI 一键生成 ptrade 策略代码

如何使用 PTrade 的 get_fundamentals 函数获取市盈率、市净率等财务数据?

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

问题描述

我需要获取一些公司的财务数据,比如市盈率(PE)、市净率(PB)和资产负债表信息,用代码怎么实现?

解决方案

在PTrade中,获取财务数据主要通过 get_fundamentals 函数实现。该函数支持查询估值表、资产负债表、利润表、现金流量表等多种财务数据。

针对您的需求:

  1. 市盈率 (PE) 和 市净率 (PB):属于 估值数据,表名为 'valuation'
  2. 资产负债表信息:属于 资产负债表,表名为 '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

代码说明:

  1. get_fundamentals(security, table, fields, ...): 这是核心查询函数。
    • security: 股票代码列表。
    • table: 数据表名(如 'valuation', 'balance_statement')。
    • fields: 需要查询的具体字段列表。
  2. valuation 表常用字段:
    • pe_ttm: 滚动市盈率(推荐使用,更能反映近期盈利能力)。
    • pe_static: 静态市盈率(基于上年度财报)。
    • pb: 市净率。
  3. balance_statement 表常用字段:
    • total_assets: 总资产。
    • total_liability: 总负债。
    • total_shareholder_equity: 股东权益。
  4. 数据返回格式:
    • 返回的是 pandas.DataFrame 对象,索引(Index)通常是股票代码,列(Columns)是你请求的字段名。

注意事项:

  • 查询时间: 在回测模式下,如果不指定 date 参数,默认获取的是当前回测日期之前已发布的最新数据,这样可以避免用到“未来数据”。
  • 频次限制: get_fundamentals 接口有流量限制(通常每秒不超过100次,单次不超过500条数据)。如果您查询的股票数量非常多(例如全市场扫描),建议分批查询并在批次之间加入 time.sleep(1)