3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!针对你在聚宽(JoinQuant)平台使用技术分析函数时遇到的日期定义问题,下面为你详细解答:
你提到使用 context.current_dt.date() 报错 name 'context' is not defined,这通常是因为运行环境的区别。
在聚宽中,代码运行环境分为研究环境(Jupyter Notebook)和回测/模拟交易环境:
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])
研究环境中没有回测引擎,自然也没有 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])
量化编程结合了金融逻辑和 Python 编程,遇到问题时可以按照以下步骤排查:
理解报错信息(Traceback):
name 'context' is not defined 明确告诉你 Python 找不到名为 context 的变量。这说明你当前的代码作用域里没有这个东西。你需要思考:这个变量是谁给我的?我是在哪里调用它的?区分平台环境:
context, order, history 的简写形式)在研究中不能直接用,或者用法不同。查阅 Python 官方文档:
Python,例如搜索:Python 获取昨天日期,就能找到 datetime 模块的用法。善用 print() 和 type():
print(type(返回值))。例如 check_date 参数需要什么格式?聚宽文档通常接受字符串 '2017-01-04' 或 datetime.date 对象。如果你传了错误的对象,就会报格式不匹配的错误。查阅聚宽 API 文档的细节:
context,查看它的定义和包含的属性(如 context.current_dt, context.previous_date),并注意文档中注明的“回测环境/模拟专用API”。