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

PTrade 平台如何利用财务成长能力指标(营业利润/净利润增长率)实现高成长股筛选?

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

问题描述

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

Title: PTrade 基本面选股:基于成长能力指标(营业利润/净利润增长率)的选股策略

Question: 在 ptrade 中如何利用财务成长能力指标(如营业利润增长率)筛选高成长股票?

解决方案

PTrade 基本面选股:基于成长能力指标的选股策略

在量化投资中,基本面选股是构建中长期超额收益策略的重要手段。财务成长能力指标能够直接反映公司的业务扩张速度和盈利盈利质量。在 PTrade 平台中,我们可以通过调用 get_fundamentals 接口查询成长能力数据表(growth_ability),从而精准筛选出符合条件的高成长股票。


一、核心 API:get_fundamentals

在 PTrade 中,获取财务数据统一使用 get_fundamentals 接口。要获取成长能力指标,需要将 table 参数指定为 'growth_ability'

常用成长能力字段(growth_ability 表)

字段名称 含义说明 数据类型
oper_profit_grow_rate 营业利润同比增长(%) float
net_profit_grow_rate 净利润同比增长(%) float
operating_revenue_grow_rate 营业收入同比增长(%) float
np_parent_company_yoy 归属母公司股东的净利润同比增长(%) float

二、策略构建逻辑

  1. 盘前/定期筛选:在 before_trading_start 或通过 run_daily 触发的定时任务中获取全市场(如全 A 股)代码。
  2. 调用财务接口:调用 get_fundamentals(security_list, 'growth_ability', fields=['oper_profit_grow_rate', 'net_profit_grow_rate'])
  3. 多重条件过滤
    • 剔除 NaN 无效数据;
    • 筛选 oper_profit_grow_rate > 20%net_profit_grow_rate > 20% 的标的;
    • 可配合 filter_stock_by_status 剔除 ST、停牌或退市股票。
  4. 调仓执行:将符合条件的股票更新为策略股票池(set_universe),并在盘中(handle_data)进行等权重建仓或调仓。

三、完整策略 Python 源码示例

import pandas as pd
import time

def initialize(context):
    # 初始化全局变量
    g.max_hold_count = 10  # 最大持仓股票数
    g.rebalance_flag = False  # 调仓标识
    
    # 设置调仓周期:每月第一个交易日9:31执行筛选与调仓逻辑
    run_daily(context, check_rebalance, time='09:31')

def check_rebalance(context):
    # 简易示范:每月月初调仓(根据月度第1个交易日判断)
    current_dt = context.blotter.current_dt
    if current_dt.day == 1 or not g.rebalance_flag:
        g.rebalance_flag = True
        filter_growth_stocks(context)

def filter_growth_stocks(context):
    # 1. 获取全A股代码
    all_stocks = get_Ashares()
    
    # 2. 过滤 ST、停牌、退市股票
    valid_stocks = filter_stock_by_status(all_stocks, filter_type=["ST", "HALT", "DELISTING"])
    
    # 3. 获取成长能力财务数据
    fields = ['oper_profit_grow_rate', 'net_profit_grow_rate']
    # 按日期查询模式,默认取离当前日期最近的财务数据
    df_fundamentals = get_fundamentals(
        security=valid_stocks,
        table='growth_ability',
        fields=fields
    )
    
    if df_fundamentals is None or df_fundamentals.empty:
        log.warning("获取财务数据失败或数据为空")
        return
    
    # 4. 数据清洗与筛选
    # 删除存在空值的行
    df_clean = df_fundamentals.dropna(subset=fields)
    
    # 条件:营业利润同比增长 > 20% 且 净利润同比增长 > 20%
    condition = (df_clean['oper_profit_grow_rate'] > 20.0) & (df_clean['net_profit_grow_rate'] > 20.0)
    target_df = df_clean[condition]
    
    # 按营业利润增长率降序排序,取前 N 只
    target_df = target_df.sort_values(by='oper_profit_grow_rate', ascending=False)
    selected_stocks = target_df.index.tolist()[:g.max_hold_count]
    
    log.info("筛选出的高成长股票列表: %s" % selected_stocks)
    
    # 5. 更新股票池并执行调仓
    if selected_stocks:
        set_universe(selected_stocks)
        rebalance_portfolio(context, selected_stocks)

def rebalance_portfolio(context, target_stocks):
    # 卖出不在目标列表中的持仓股票
    current_positions = context.portfolio.positions
    for stock in list(current_positions.keys()):
        if stock not in target_stocks:
            order_target_value(stock, 0)
            log.info("卖出非目标持仓股票: %s" % stock)
            
    # 等权重买入目标股票
    if target_stocks:
        total_value = context.portfolio.portfolio_value
        target_value_per_stock = total_value / len(target_stocks)
        for stock in target_stocks:
            order_target_value(stock, target_value_per_stock)
            log.info("调仓买入股票: %s, 目标市值: %s" % (stock, target_value_per_stock))

def handle_data(context, data):
    pass

四、注意事项与优化建议

  1. 接口频次限制get_fundamentals 属于在线接口,单次查询上限 50,000 条,每秒不超过 100 次。在全市场选股时,如遇到频次限制可分批查询并加 time.sleep(1) 保护。
  2. 未来函数规避:在回测场景下,默认按 publ_date(财报实际公告日期)作为数据生效时间点,可有效避免未来函数。merge_type 建议不传或留空以获取首次发布数据,贴近实际交易环境。
  3. 多因子结合:单一成长指标容易选出高波动股票,实际应用中建议结合估值数据(valuation 表中的 pe_ttmpb)及技术面指标(如均线趋势)进行综合筛选。