问题描述
各位,请教一下,这个代码在复制的回测策略中并未自定义,但在聚宽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):目标价值下单
为什么你在代码里没看到定义?
有几种可能:
- 在策略的其他隐藏标签页或极靠前/靠后的位置:原作者可能在代码的某个角落定义了这个辅助函数。
- 在自定义的 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 将其还原或重写。