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

JoinQuant聚宽技术指标函数动态日期设置与调试指南

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

问题描述

聚宽自带函数库中日期定义使用问题?

@yhyjoinquant
@joinquant的专家们

这是聚宽的例子:

定义股票池列表
security_list1 = '000001.XSHE'
security_list2 = ['000001.XSHE','000002.XSHE','601211.XSHG','603177.XSHG']

计算并输出 security_list1 的 BIAS 值
BIAS11,BIAS12,BIAS13 = BIAS(security_list1,check_date='2017-01-04', N1=6, N2=12, N3=24)
print BIAS11[security_list1]
print BIAS12[security_list1]
print BIAS13[security_list1]

输出 security_list2 的 BIAS 值
BIAS21,BIAS22,BIAS23 = BIAS(security_list2,check_date='2017-01-04', N1=6, N2=12, N3=24)
for stock in security_list2:
print BIAS21[stock]
print BIAS22[stock]
print BIAS23[stock]

这个没问题。
问题1: 我想获取今天、昨天这些具备滚动时间的bias,该怎么赋值?
尝试用了context.current_dt.date(),None之类的都报错,出现name 'context' is not defined 和 不匹配 日期格式的错误

问题2:碰到这类问题,我自己该怎么解决?

尝试查看聚宽帮助,没找到相关答案
尝试搜索,没有这么具体问题和解决方法
尝试自己看python,但是这个是聚宽函数库,没有找到答案

谢谢各位老师指导

解决方案

你好!针对你在聚宽(JoinQuant)平台使用技术分析函数时遇到的日期定义问题,下面为你详细解答:

问题1:如何获取今天、昨天这些具备滚动时间的日期?

你提到使用 context.current_dt.date() 报错 name 'context' is not defined,这通常是因为运行环境的区别。

在聚宽中,代码运行环境分为研究环境(Jupyter Notebook)回测/模拟交易环境

1. 在回测/模拟交易环境中

context 对象是回测引擎在运行策略时自动传入的,只能在特定的回调函数(如 handle_data, market_open, before_trading_start 等)内部使用。如果你在函数外部(全局作用域)调用它,就会报错未定义。

正确用法示例:

from jqlib.technical_analysis import *

def initialize(context):
    g.security_list1 = '000001.XSHE'
    run_daily(market_open, time='09:30')

def market_open(context):
    # 获取当前逻辑日期
    current_date = context.current_dt.date()
    # 获取前一个交易日
    previous_date = context.previous_date
    
    # 传入当前日期
    BIAS11, BIAS12, BIAS13 = BIAS(g.security_list1, check_date=current_date, N1=6, N2=12, N3=24)
    print("今天的BIAS:", BIAS11[g.security_list1])

2. 在研究环境(Jupyter Notebook)中

研究环境中没有回测引擎,自然也没有 context 对象。你需要使用 Python 自带的 datetime 模块,或者聚宽的交易日历 API 来获取日期。

正确用法示例:

import datetime
from jqdata import *
from jqlib.technical_analysis import *

security_list1 = '000001.XSHE'

# 获取现实中的今天
today = datetime.date.today()

# 获取现实中的昨天
yesterday = today - datetime.timedelta(days=1)

# 更好的方法:获取最近的一个交易日(避免周末或节假日报错)
recent_trade_days = get_trade_days(end_date=today, count=2)
last_trade_day = recent_trade_days[-1] # 最近一个交易日
prev_trade_day = recent_trade_days[-2] # 上一个交易日

BIAS11, BIAS12, BIAS13 = BIAS(security_list1, check_date=last_trade_day, N1=6, N2=12, N3=24)
print("最近交易日的BIAS:", BIAS11[security_list1])

问题2:碰到这类问题,自己该怎么解决?

量化编程结合了金融逻辑和 Python 编程,遇到问题时可以按照以下步骤排查:

  1. 理解报错信息(Traceback)

    • name 'context' is not defined 明确告诉你 Python 找不到名为 context 的变量。这说明你当前的代码作用域里没有这个东西。你需要思考:这个变量是谁给我的?我是在哪里调用它的?
  2. 区分平台环境

    • 牢记研究环境回测环境的区别。研究环境是纯 Python 脚本环境,回测环境是聚宽引擎驱动的事件循环环境。很多回测专用的 API(如 context, order, history 的简写形式)在研究中不能直接用,或者用法不同。
  3. 查阅 Python 官方文档

    • 涉及到日期加减、字符串处理、列表字典操作等,这些属于 Python 基础。搜索关键词时加上 Python,例如搜索:Python 获取昨天日期,就能找到 datetime 模块的用法。
  4. 善用 print()type()

    • 不确定一个函数的返回值是什么格式时,先 print(type(返回值))。例如 check_date 参数需要什么格式?聚宽文档通常接受字符串 '2017-01-04'datetime.date 对象。如果你传了错误的对象,就会报格式不匹配的错误。
  5. 查阅聚宽 API 文档的细节

    • 在聚宽 API 文档中,搜索 context,查看它的定义和包含的属性(如 context.current_dt, context.previous_date),并注意文档中注明的“回测环境/模拟专用API”。