🚀 AI 一键生成 joinquant 策略代码

防范财务风险:基于速动比率(quick_ratio)的偿债能力筛选

joinquant | 发布时间: 2025/12/23
以下内容由 EasyQuant 生成。

问题描述

如何编写代码筛选速动比率大于 1 的股票?

解决方案

在聚宽(JoinQuant)平台中,筛选财务指标(如速动比率)主要使用 get_fundamentals 函数配合 query 对象来实现。速动比率的数据存储在 indicator 表中,字段名为 quick_ratio

以下是具体的实现方法和完整的策略代码示例。

核心代码逻辑

筛选速动比率大于 1 的核心代码如下:

# 导入聚宽数据库
from jqdata import *

# 构造查询语句
q = query(
    indicator.code,          # 获取股票代码
    indicator.quick_ratio    # 获取速动比率用于验证
).filter(
    indicator.quick_ratio > 1 # 筛选条件:速动比率大于1
)

# 执行查询,获取数据(返回 pandas DataFrame)
# 在回测中,date=context.previous_date 确保获取的是昨天收盘后已发布的财务数据,避免未来函数
df = get_fundamentals(q, date=context.previous_date)

# 获取股票列表
stock_list = list(df['code'])

完整策略代码示例

下面是一个完整的、可直接运行的策略代码。该策略每天开盘时筛选出速动比率大于 1 的股票,并打印出数量和前 5 只股票的代码。

# -*- coding: utf-8 -*-
from jqdata import *

def initialize(context):
    """
    初始化函数,设定基准和全局配置
    """
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # 每天开盘时运行选股逻辑
    run_daily(filter_stocks, '09:30')

def filter_stocks(context):
    """
    筛选速动比率大于1的股票
    """
    # 1. 构造查询对象
    # indicator 是财务指标表
    # indicator.quick_ratio 是速动比率字段
    q = query(
        indicator.code,
        indicator.quick_ratio
    ).filter(
        indicator.quick_ratio > 1
    )
    
    # 2. 获取财务数据
    # date=context.previous_date 表示查询截止到前一个交易日已发布的最新财报数据
    # 这样可以有效避免未来函数(即避免在财报发布前就使用了财报数据)
    df = get_fundamentals(q, date=context.previous_date)
    
    # 3. 处理结果
    if len(df) > 0:
        # 将筛选出的股票代码转为列表
        stock_list = list(df['code'])
        
        # 打印日志信息
        log.info("今日筛选出速动比率 > 1 的股票数量: %d" % len(stock_list))
        log.info("前5只股票代码: %s" % stock_list[:5])
        
        # 在这里可以添加下单逻辑,例如:
        # order_target_value(stock_list[0], 10000) 
    else:
        log.info("今日未筛选出符合条件的股票")

def handle_data(context, data):
    """
    按分钟回测时每分钟调用,按天回测时每天调用
    本策略主要逻辑在 filter_stocks 中,此处留空
    """
    pass

代码详解

  1. from jqdata import *: 必须导入此库才能使用 queryindicatorget_fundamentals
  2. query(...): 用于构建数据库查询请求。
    • indicator.code: 指定返回股票代码。
    • indicator.quick_ratio: 指定返回速动比率数据。
  3. .filter(...): 用于设置筛选条件。
    • indicator.quick_ratio > 1: 这里设置了速动比率必须大于 1。
  4. get_fundamentals(q, date=...): 执行查询。
    • date=context.previous_date: 在回测环境中,这非常重要。它指定获取“截止到昨天”已发布的财务数据。如果直接使用当前日期或不填,在某些情况下可能会获取到当天收盘后才发布的财报,从而导致“未来函数”错误(即在实盘中那个时间点其实还看不到这份财报)。

Q&A

Q: 如何同时筛选速动比率大于 1 且 流动比率大于 2 的股票?
A: 可以在 filter 中添加多个条件,使用逗号分隔。代码如下:

q = query(indicator.code).filter(
    indicator.quick_ratio > 1,
    indicator.current_ratio > 2  # current_ratio 为流动比率
)

Q: get_fundamentals 查询返回的数据量有限制吗?
A: 是的,为了保证性能,get_fundamentals 默认最多返回 5000 条数据。如果筛选结果超过 5000 条,可能需要分批查询或优化筛选条件。不过对于全市场 A 股(约 5000 多只),通常一次查询即可覆盖大部分需求。

Q: 为什么我在研究环境(Notebook)中运行代码报错 context is not defined
A: context 对象是回测引擎特有的。在研究环境中,你需要手动指定一个具体的日期字符串,例如:

df = get_fundamentals(q, date='2023-10-27')

Q: 速动比率(Quick Ratio)在聚宽数据库中的具体定义是什么?
A: 在聚宽的 indicator 表中,速动比率的计算公式通常为:(流动资产合计 - 存货) / 流动负债合计。它是衡量企业流动资产中可以立即变现用于偿还流动负债的能力。