问题描述
get_all_securities 读取股票信息时,是按照什么顺序返回的股票信息呢?
解决方案
在 JoinQuant (聚宽) 量化平台中,调用 get_all_securities 函数获取标的信息时,官方 API 文档并没有明确承诺或规定返回数据的绝对排序规则。
不过,根据实际运行情况和底层数据结构,默认情况下,返回的 pandas.DataFrame 通常是按照标的代码(即 DataFrame 的 index,如 '000001.XSHE')的字典序进行排列的。
为什么不建议依赖默认顺序?
在编写严谨的量化交易策略时,强烈建议不要依赖 API 的默认返回顺序。因为底层数据库的查询优化或平台升级可能会导致默认返回顺序发生变化。如果您的策略逻辑(例如:截面选股、取前 N 只股票)对数据的顺序有严格要求,依赖默认顺序可能会引入难以察觉的 Bug。
如何确保数据顺序符合预期?
由于 get_all_securities 返回的是一个标准的 pandas.DataFrame 对象,您可以非常方便地使用 pandas 内置的排序方法,显式地对数据进行排序,以确保顺序完全符合您的策略需求。
示例 1:明确按照标的代码(Index)升序排列
import jqdata
def initialize(context):
# 获取所有股票信息
df = get_all_securities(['stock'])
# 显式地按照 index (即股票代码) 进行升序排序
df_sorted_by_code = df.sort_index(ascending=True)
log.info("按代码排序后的前5只股票:\n", df_sorted_by_code.head())
示例 2:按照上市日期(start_date)降序排列(获取最新上市的股票)
import jqdata
def initialize(context):
# 获取所有股票信息
df = get_all_securities(['stock'])
# 按照上市日期 'start_date' 降序排列
df_sorted_by_date = df.sort_values(by='start_date', ascending=False)
log.info("最新上市的前5只股票:\n", df_sorted_by_date.head())
总结
- 默认顺序:通常按标的代码字典序排列,但官方未作硬性保证。
- 最佳实践:始终使用
sort_index()或sort_values()对返回的 DataFrame 进行显式排序,以保证策略的稳定性和可靠性。