🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant量化平台获取NYMEX原油(CL)上一日数据指南

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

问题描述

获取CL NYMEX原油的数据,小白求大神指点?

如果我要获取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) 数据,可能是节假日或代码不匹配。")

💡 进阶提示(小白避坑指南):

  1. 代码后缀确认:在实际查询前,建议先查阅聚宽的数据字典,确认 NYMEX 原油在 FUT_GLOBAL_DAILY 表中的确切 code 是什么(有时可能是 CL,有时可能带有后缀或特定合约月份)。
  2. 避免未来函数:在 filter 中过滤日期时,千万不要使用 context.current_dt.date() 去查当天的日线数据,因为日线数据通常在收盘后才生成,盘中查询会报错或引入未来数据。使用 context.previous_date 是最安全、最规范的做法。
  3. 数据量限制finance.run_query 每次最多返回 4000 行数据,如果你要获取历史长期的原油数据,请不要一次性查询,可以通过循环按时间段分批获取。