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

ptrade 财务选股:如何利用存货周转率与总资产周转率筛选优质龙头(附 Python 源码)

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

问题描述

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

Title: ptrade 财务选股:利用营运能力指标 (存货周转率) 筛选优质龙头

Question: 如何通过 ptrade 获取上市公司的存货周转率与总资产周转率进行选股?

解决方案

ptrade 财务选股:利用营运能力指标(存货周转率与总资产周转率)筛选优质龙头

在量化选股策略中,企业的营运能力是衡量其管理效率与资金周转能力的核心维度。存货周转率和总资产周转率越高,说明企业资产利用效率越高,存货积压风险越低,通常是优质行业龙头的显著特征。

ptrade 量化交易平台中,我们可以通过调用 get_fundamentals 接口快速获取上市公司的营运能力财务指标并进行筛选。


1. 核心接口说明:get_fundamentals

获取营运能力数据时,需要将 table 参数指定为 'operating_ability'(营运能力表)。

关键字段说明

  • inventory_turnover_rate: 存货周转率(次)
  • total_asset_turnover_rate: 总资产周转率(次)
  • accounts_receivables_turnover_rate: 应收账款周转率(次)

注意get_fundamentals 接口支持按日期查询或按年份查询。为避免未来函数,建议在策略盘前阶段(before_trading_start)查询最新已发布的财报数据。


2. 选股策略逻辑

  1. 标的池选择:获取全 A 股标的列表(或指定指数成分股,如沪深 300)。
  2. 状态过滤:剔除 ST、停牌及退市股票。
  3. 财务筛选
    • 存货周转率 (inventory_turnover_rate) > 行业均值或指定门槛(如 > 3 次)
    • 总资产周转率 (total_asset_turnover_rate) > 指定门槛(如 > 0.5 次)
  4. 排序与构建股票池:按存货周转率降序排列,选取前 N 只股票作为目标买入池。

3. ptrade 完整选股源码示例

import pandas as pd

def initialize(context):
    # 设置参考基准
    set_benchmark('000300.SS')
    # 每天盘前 09:15 执行选股逻辑
    run_daily(context, select_stocks, time='09:15')

def select_stocks(context):
    # 1. 获取全 A 股列表
    all_stocks = get_Ashares()
    
    # 2. 过滤 ST、停牌、退市股票
    valid_stocks = filter_stock_by_status(all_stocks, filter_type=["ST", "HALT", "DELISTING"])
    
    # 3. 获取营运能力数据 (指定表名 operating_ability)
    # 查询字段:存货周转率、总资产周转率
    fields = ['inventory_turnover_rate', 'total_asset_turnover_rate']
    
    # 获取财务数据(以当前日期之前最近一份已发布财报为准)
    df_fundamentals = get_fundamentals(
        security=valid_stocks,
        table='operating_ability',
        fields=fields
    )
    
    if df_fundamentals is None or df_fundamentals.empty:
        log.info("未获取到财务数据")
        return
        
    # 4. 筛选条件:存货周转率 > 3 次 且 总资产周转率 > 0.4 次
    filtered_df = df_fundamentals[
        (df_fundamentals['inventory_turnover_rate'] > 3.0) &
        (df_fundamentals['total_asset_turnover_rate'] > 0.4)
    ]
    
    # 5. 按存货周转率降序排序,取前 10 只龙头股票
    target_df = filtered_df.sort_values(by='inventory_turnover_rate', ascending=False).head(10)
    target_stocks = list(target_df.index)
    
    log.info("筛选出的优质营运龙头股票列表: %s" % target_stocks)
    
    # 更新策略操作股票池
    set_universe(target_stocks)
    g.target_stocks = target_stocks

def handle_data(context, data):
    # 盘中交易逻辑(示例:简单调仓)
    if not hasattr(g, 'target_stocks') or not g.target_stocks:
        return
        
    # 卖出不在目标池中的股票
    for stock in context.portfolio.positions:
        if stock not in g.target_stocks:
            order_target(stock, 0)
            
    # 等权重买入目标池股票
    cash = context.portfolio.cash
    if len(g.target_stocks) > 0 and cash > 0:
        value_per_stock = cash / len(g.target_stocks)
        for stock in g.target_stocks:
            if get_position(stock).amount == 0:
                order_value(stock, value_per_stock)

4. 最佳实践与提示

  1. 限流保护:财务数据接口单次最大调用量为 50000 单元,针对全 A 股批量查询时,get_fundamentals 已在后台做分批处理,但建议在非高频盘中时段(如盘前 before_trading_startrun_daily 09:15)执行。
  2. 结合行业对比:不同行业(如零售业与重工业)的周转率基准差异巨大,建议配合 get_industry_stocks 获取同行业股票后,在行业内部进行百分位或均值对比选股。
  3. 防范未来函数:在回测模块中不传 date 参数时,默认使用当前回测日期的历史已发布数据,能有效规避未来函数风险。