问题描述
解决方案
在聚宽(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
代码详解
from jqdata import *: 必须导入此库才能使用query、indicator和get_fundamentals。query(...): 用于构建数据库查询请求。indicator.code: 指定返回股票代码。indicator.quick_ratio: 指定返回速动比率数据。
.filter(...): 用于设置筛选条件。indicator.quick_ratio > 1: 这里设置了速动比率必须大于 1。
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 表中,速动比率的计算公式通常为:(流动资产合计 - 存货) / 流动负债合计。它是衡量企业流动资产中可以立即变现用于偿还流动负债的能力。