🚀 AI 一键生成 joinquant 策略代码

聚宽策略源码解析:sell_by_amount 函数与 ('desc', 100) 排序逻辑是什么?

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

请教一个函数问题 sell_by_amount。。。

各位,请教一下,这个代码在复制的回测策略中并未自定义,但在聚宽API中也未发现这个函数,请问这个是什么?

另外,是否可以解释一下下面('desc',100)是什么用法?
def get_check_stocks_sort_input_dict():
input_dict = {
indicator.roa:('desc',100),
}
return input_dict

解决方案

你好!这两个问题都涉及到量化策略编写中常见的**“自定义封装”**。在复制别人的策略时,经常会遇到作者自己编写的辅助函数或数据结构。下面为您详细解答:

1. 关于 sell_by_amount 函数

结论:sell_by_amount 绝对不是聚宽(JoinQuant)的官方 API。

在聚宽的官方 API 文档中,标准的下单函数只有以下几个:

  • order(security, amount):按股数下单(正数买入,负数卖出)
  • order_target(security, amount):目标股数下单
  • order_value(security, value):按价值下单
  • order_target_value(security, value):目标价值下单

为什么你在代码里没看到定义?
有几种可能:

  1. 在策略的其他隐藏标签页或极靠前/靠后的位置:原作者可能在代码的某个角落定义了这个辅助函数。
  2. 在自定义的 Python 库中:聚宽允许用户在“研究”模块中创建 .py 文件,然后在策略中通过 from mylib import * 导入。这个函数可能被封装在原作者的私有库里了。

它大概长什么样?
根据名字推测,这只是一个简单的封装函数,底层调用的依然是官方的 order 函数。它的源码大概率是这样的:

def sell_by_amount(security, amount):
    # 卖出指定数量的股票
    return order(security, -amount)

如果你找不到它,完全可以直接用官方的 order(security, -amount) 或者 order_target(security, 0)(全部卖出)来替换它。


2. 关于 ('desc', 100) 的用法

这段代码是原策略作者自己设计的一种数据结构(字典),用于向选股逻辑传递“排序和筛选规则”。

def get_check_stocks_sort_input_dict():
    input_dict = {
        indicator.roa: ('desc', 100),
    }
    return input_dict

详细解释:

  • indicator.roa:这是聚宽财务数据 API 中的一个字段,代表“总资产报酬率(ROA)”。
  • 'desc':是英文 descending 的缩写,意思是降序排列(从大到小)。如果是 'asc' 则代表升序(从小到大)。
  • 100:代表限制数量,即取排名前 100 的股票。

原作者的意图:
作者通过这个字典告诉后续的选股代码:“请帮我把股票池里的股票,按照 ROA(总资产报酬率)从大到小排序,并且只保留前 100 只股票。

在策略的后续代码中,肯定有一段解析这个字典并调用聚宽 query 函数的代码。这段字典配置最终会被转化为类似下面这样的聚宽官方查询语句:

# 底层实际执行的聚宽官方 API 逻辑大概是这样的:
q = query(
    valuation.code
).order_by(
    indicator.roa.desc()  # 对应字典里的 'desc'
).limit(
    100                   # 对应字典里的 100
)

总结

在阅读和复制他人的量化策略时,经常会遇到作者为了代码整洁而自己封装的函数(如 sell_by_amount)和配置字典(如 ('desc', 100))。理解了它们的底层逻辑后,你完全可以使用聚宽的官方 API 将其还原或重写。