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

ptrade平台如何利用偿债能力指标(流动比率/速动比率)进行基本面排雷选股?

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

问题描述

ptrade 基本面量化选股:利用偿债能力指标排除高负债爆雷风险
如何通过 ptrade 的 get_fundamentals 接口查询流动比率和速动比率进行基本面排雷选股?

解决方案

ptrade基本面量化选股:利用偿债能力指标排除高负债爆雷风险

在量化投资中,除了技术面指标,基本面排雷是构建稳健投资组合的关键步骤。高负债、偿债能力弱的企业极易发生资金链断裂或债务违约(爆雷)风险。本文将详细介绍如何利用 ptrade 的 get_fundamentals 接口获取流动比率(current_ratio)速动比率(quick_ratio),并实现自动排雷选股。


一、核心偿债能力指标解析

在 ptrade 的财务数据中,偿债能力指标存放在 debt_paying_ability 表中:

  1. 流动比率 (current_ratio):流动资产 / 流动负债。一般认为流动比率大于 $2.0$ 比较安全,若低于 $1.2$ 则说明短期偿债压力较大。
  2. 速动比率 (quick_ratio):速动资产 / 流动负债(扣除了变现能力较差的存货)。一般认为速动比率大于 $1.0$ 比较安全,若低于 $0.5$ 则面临极高的短期流动性风险。

二、ptrade 接口调用方法

通过 get_fundamentals 接口查询偿债能力数据的基本格式如下:

get_fundamentals(security, table='debt_paying_ability', fields=['current_ratio', 'quick_ratio'], date=None)

注意:获取 debt_paying_ability 表数据时,不支持传入 merge_type 参数。


三、完整排雷选股策略源码

以下是一个完整的 ptrade 策略示例。该策略在每天开盘前,获取沪深300成分股的流动比率和速动比率,剔除流动比率小于 $1.2$ 或速动比率小于 $1.0$ 的高风险股票,从而实现基本面排雷选股。

def initialize(context):
    # 设置基准为沪深300
    set_benchmark('000300.SS')
    # 设定初始股票池(以沪深300成分股为例)
    g.security_pool = get_index_stocks('000300.XBHS')
    set_universe(g.security_pool)
    
    # 每天 9:15 执行排雷选股
    run_daily(context, filter_high_debt_stocks, time='09:15')

def filter_high_debt_stocks(context):
    log.info("开始进行基本面偿债能力排雷选股...")
    
    # 1. 获取当前交易日日期
    current_date = context.blotter.current_dt.strftime('%Y%m%d')
    
    # 2. 查询偿债能力指标
    try:
        df_debt = get_fundamentals(
            security=g.security_pool,
            table='debt_paying_ability',
            fields=['current_ratio', 'quick_ratio'],
            date=current_date
        )
    except Exception as e:
        log.error("获取财务数据失败: %s" % e)
        return
    
    if df_debt is None or df_debt.empty:
        log.warning("未获取到财务数据,保持原股票池")
        return
        
    # 3. 设定排雷阈值
    min_current_ratio = 1.2  # 流动比率下限
    min_quick_ratio = 1.0    # 速动比率下限
    
    # 4. 过滤高负债风险股
    # 剔除流动比率 < 1.2 或 速动比率 < 1.0 的股票
    safe_stocks = []
    for stock in df_debt.index:
        current_ratio = df_debt.loc[stock, 'current_ratio']
        quick_ratio = df_debt.loc[stock, 'quick_ratio']
        
        # 排除 NaN 数据并进行阈值筛选
        if not (current_ratio != current_ratio) and not (quick_ratio != quick_ratio):
            if current_ratio >= min_current_ratio and quick_ratio >= min_quick_ratio:
                safe_stocks.append(stock)
                
    g.filtered_stocks = safe_stocks
    log.info("排雷完成!原始股票数量: %d, 过滤后安全股票数量: %d" % (len(g.security_pool), len(g.filtered_stocks)))
    log.info("被剔除的高负债风险股票包括: %s" % list(set(g.security_pool) - set(g.filtered_stocks)))

def handle_data(context, data):
    # 在此编写您的交易逻辑,例如只在安全股票池 g.filtered_stocks 中进行买入操作
    if hasattr(g, 'filtered_stocks') and len(g.filtered_stocks) > 0:
        # 示例:买入安全股票池中的第一只股票
        target_stock = g.filtered_stocks[0]
        if context.portfolio.positions[target_stock].amount == 0:
            order(target_stock, 100)

四、策略要点与避坑指南

  1. 规避未来函数:在 get_fundamentals 中,建议显式传入 date 参数(如前一交易日或当前交易日),避免不传 date 时默认获取最新发布数据而引入未来函数。
  2. 异常值处理:部分新股或特定行业(如金融类、轻资产类)的流动比率和速动比率计算可能不适用常规标准,代码中通过 current_ratio != current_ratio 剔除了 NaN 异常值。
  3. 结合行业特性:重资产行业(如钢铁、房地产)通常负债率较高,而轻资产行业(如计算机、医药)偿债能力指标通常较好。建议在实际应用中,结合 ptrade 的 get_industry_stocks 接口进行行业中性化排雷。