问题描述
如果我要获取CL NYMEX原油的数据
是用deal(context,future)
还是用
df=finance.run_query(query(finance.FUT_GLOBAL_DAILY).filter(finance.FUT_GLOBAL_DAILY.day==date).limit(n))
如何获取上一日的数据
小白求大神指点?
解决方案
你好!在JoinQuant(聚宽)平台上获取外盘期货(如NYMEX原油 CL)的数据,确实需要使用特定的财务/宏观数据库接口,而不是普通的国内行情接口。
针对你的问题,以下是详细的解答:
1. 应该用哪种方式获取?
正确答案是使用 finance.run_query。
deal(context, future)并不是聚宽官方提供的标准获取数据的API,这通常是某些策略代码中用户自定义的交易逻辑函数。finance.run_query(query(finance.FUT_GLOBAL_DAILY)...)是正确的思路。聚宽的finance模块包含了大量的扩展数据表,如果平台支持全球期货日线数据,通常会存放在类似FUT_GLOBAL_DAILY这样的表中。
2. 如何获取上一日的数据?
在聚宽的回测或模拟交易环境中,获取“上一日”非常简单。你可以直接使用 context.previous_date 属性,它会自动返回逻辑时间上的前一个交易日(datetime.date 对象),从而完美避免未来函数。
3. 完整的代码示例
下面是一个完整的代码示例,展示如何在策略中查询 NYMEX 原油 (CL) 上一个交易日的数据:
# 导入聚宽数据包
from jqdata import *
def initialize(context):
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
# 1. 获取上一交易日的日期
# context.previous_date 会自动返回前一个交易日的 datetime.date 对象
last_date = context.previous_date
# 2. 构建查询语句
# 假设 NYMEX 原油在表中的 code 为 'CL' (具体请参考聚宽数据字典中的外盘期货代码规范)
q = query(
finance.FUT_GLOBAL_DAILY
).filter(
finance.FUT_GLOBAL_DAILY.code == 'CL',
finance.FUT_GLOBAL_DAILY.day == last_date
).limit(1)
# 3. 执行查询并获取 DataFrame
df = finance.run_query(q)
# 4. 打印结果
if not df.empty:
log.info(f"成功获取 {last_date} 的 NYMEX 原油(CL) 数据:")
print(df)
else:
log.info(f"未找到 {last_date} 的 NYMEX 原油(CL) 数据,可能是节假日或代码不匹配。")
💡 进阶提示(小白避坑指南):
- 代码后缀确认:在实际查询前,建议先查阅聚宽的数据字典,确认 NYMEX 原油在
FUT_GLOBAL_DAILY表中的确切code是什么(有时可能是CL,有时可能带有后缀或特定合约月份)。 - 避免未来函数:在
filter中过滤日期时,千万不要使用context.current_dt.date()去查当天的日线数据,因为日线数据通常在收盘后才生成,盘中查询会报错或引入未来数据。使用context.previous_date是最安全、最规范的做法。 - 数据量限制:
finance.run_query每次最多返回 4000 行数据,如果你要获取历史长期的原油数据,请不要一次性查询,可以通过循环按时间段分批获取。