🚀 AI 一键生成 ptrade 策略代码
立即体验

PTrade 财务选股:如何基于盈利能力表(profit_ability)实现高 ROE 策略?

ptrade | 发布时间: 2026/7/27
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade 财务选股:基于盈利能力表(profit_ability)的高 ROE 策略

Question: 如何在 PTrade 中使用 get_fundamentals 获取近三年的 ROE 数据进行选股?

解决方案

PTrade 财务选股:基于盈利能力表(profit_ability)的高 ROE 策略

在量化投资中,ROE(净资产收益率)是衡量公司盈利能力的核心指标。通过选取连续多年维持高 ROE 的股票,可以有效筛选出优质的成长型或价值型企业。在 PTrade 量化交易平台中,我们可以通过 get_fundamentals 接口查询 profit_ability(盈利能力表)来轻松实现这一选股逻辑。


1. 核心 API 说明

在 PTrade 中获取财务数据主要使用 get_fundamentals 函数:

get_fundamentals(security, table, fields=None, date=None, start_year=None, end_year=None, report_types=None, date_type=None, merge_type=None)

关键参数配置:

  • table: 'profit_ability'(盈利能力表)
  • fields: 'roe'(净资产收益率%摊薄公布值)
  • start_year / end_year: 按年份模式查询,如获取近三年数据可设置 start_year='2020', end_year='2022'
  • report_types: '4' 表示获取年度财报(年报)

2. 近三年高 ROE 选股示例源码

以下策略演示如何在盘前阶段(before_trading_start)获取全市场 A 股近三年的 ROE 数据,筛选出连续三年 ROE 均大于 15% 的股票并建立股票池:

import pandas as pd
import datetime

def initialize(context):
    # 设置参考基准
    set_benchmark('000300.SS')
    # 选股周期:每周一盘前运行一次
    run_daily(context, select_high_roe_stocks, time='09:15')

def select_high_roe_stocks(context):
    # 仅在每周一执行选股逻辑
    if context.blotter.current_dt.weekday() != 0:
        return
    
    # 1. 获取全市场A股代码
    all_stocks = get_Ashares()
    
    # 2. 计算近三年的年份(假设当前为2024年,取2021-2023年报)
    current_year = context.blotter.current_dt.year
    start_year = str(current_year - 3)
    end_year = str(current_year - 1)
    
    log.info(f"正在获取 {start_year} 至 {end_year} 年度的 ROE 数据...")
    
    # 3. 按年份查询近三年年报 ROE 数据
    # 返回数据类型为 Panel,Items 为股票代码
    roe_panel = get_fundamentals(
        security=all_stocks,
        table='profit_ability',
        fields='roe',
        start_year=start_year,
        end_year=end_year,
        report_types='4'  # 年报
    )
    
    selected_stocks = []
    
    # 4. 遍历股票进行 ROE 条件筛选(连续三年 ROE > 15%)
    if roe_panel is not None:
        for stock in roe_panel.items:
            df_stock = roe_panel[stock]
            if 'roe' in df_stock.columns and len(df_stock['roe'].dropna()) >= 3:
                # 判断是否三年都大于 15%
                if (df_stock['roe'] > 15.0).all():
                    selected_stocks.append(stock)
    
    # 过滤 ST、停牌及退市股票
    selected_stocks = filter_stock_by_status(selected_stocks, ["ST", "HALT", "DELISTING"])
    
    g.security = selected_stocks[:20]  # 取前20只
    set_universe(g.security)
    log.info(f"筛选出的高 ROE 股票池: {g.security}")

def handle_data(context, data):
    # 盘中交易逻辑(例如均等仓位买入股票池标的)
    pass

3. 注意事项与优化建议

  1. 接口流控与保护get_fundamentals 接口每秒调用限制为 100 次,单次最大返回 500 条数据。若对全市场多年份查询,建议适当切分股票列表或在循环中加上 time.sleep() 保护。
  2. 未来函数规避:年报通常在次年 1 月至 4 月陆续披露,按年份查询时请确保当前回测时间晚于披露时间(或使用 date 参数结合 date_type 模式按发布日期查询),以防产生未来函数。
  3. 多指标结合:建议配合 valuation 表中的 pe_ttm(市盈率)或 pb(市净率)进行二次筛选,避免买入估值过高的标的过高的股票。