问题描述
解决方案
根据 JoinQuant API 的文档说明和实际运行机制,如果在 get_price 函数中同时指定了 count 和 start_date:
count 参数会生效,start_date 会被忽略。
详细解析
-
优先级逻辑:
在 API 的内部处理逻辑中,通常会优先检查count参数。如果count不为None,系统会直接根据end_date(结束日期)向前推算count个单位时间(frequency)来截取数据,此时传入的start_date参数将不会被使用。 -
文档规范:
尽管count会覆盖start_date,但 JoinQuant API 文档中明确指出:count: 与 start_date 二选一,不可同时使用。
最佳实践建议
为了保证代码的可读性和逻辑的严谨性,建议严格遵守文档规范,根据需求只选择一种方式:
-
场景 A:获取固定长度的数据(推荐用于计算移动平均等指标)
使用count+end_date。# 获取平安银行截止到 2023-01-01 的过去 10 天数据 df = get_price('000001.XSHE', end_date='2023-01-01', count=10) -
场景 B:获取特定日期范围内的数据(推荐用于分析特定历史区间)
使用start_date+end_date。# 获取平安银行 2022年1月1日 到 2023年1月1日 的数据 df = get_price('000001.XSHE', start_date='2022-01-01', end_date='2023-01-01')
Q&A
Q: 如果 count 和 start_date 都没有指定,会发生什么?
A: 如果两个参数都没有指定,start_date 会默认生效,其默认值为 '2015-01-01'。即系统会返回从 2015-01-01 到 end_date 的数据。
Q: get_price 中的 end_date 如果不填,默认是什么?
A: 默认是 '2015-12-31'。但在回测环境中,通常建议显式指定 end_date 为 context.current_dt 以避免引入未来函数。
Q: count 参数可以是负数吗?
A: 不可以。count 必须是一个正整数,表示获取数据的行数(Bar 的数量)。