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

聚宽 (JoinQuant) 策略报错 "name 'context' is not defined" 怎么办?context 变量详解

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

问题描述

Context用的不对?

请问“context"变量的具体用法是怎样的,为什么我使用后显示” name 'context' is not defined“,是不是哪个包没引用?感谢回复!

解决方案

您好!在 JoinQuant(聚宽)平台中,出现 name 'context' is not defined 的报错,并不是因为缺少了某个包的引用context 是聚宽策略引擎内置的上下文对象,不需要通过 import 引入。

为什么会报错 name 'context' is not defined

这个错误通常是由以下两种情况引起的:

1. 在自定义函数中使用了 context,但没有将其作为参数传入
聚宽的系统回调函数(如 initialize, handle_data, before_trading_start 等)会自动接收引擎传来的 context 参数。但如果您自己写了一个函数,并在里面使用了 context,就必须在定义和调用时把 context 传进去。

错误示例:

def handle_data(context, data):
    my_custom_function() # 调用时没有传入 context

def my_custom_function():
    # 这里会报错:name 'context' is not defined
    cash = context.portfolio.available_cash 

正确示例:

def handle_data(context, data):
    my_custom_function(context) # 调用时传入 context

def my_custom_function(context): # 定义时接收 context 参数
    cash = context.portfolio.available_cash 
    log.info("当前可用资金:", cash)

2. 在函数外部(全局作用域)直接使用了 context
context 只能在函数内部使用,不能写在所有函数的外面。

context 变量的具体用法

context 是一个包含了当前策略运行状态(如账户资金、持仓、当前时间等)的全局信息总览对象。常用的属性如下:

  • 获取当前时间
    context.current_dt:当前单位时间的开始时间(datetime.datetime 对象)。例如:context.current_dt.strftime("%Y-%m-%d")
  • 获取前一个交易日
    context.previous_date:前一个交易日(datetime.date 对象)。
  • 获取账户资金信息(context.portfolio
    • context.portfolio.available_cash:可用资金。
    • context.portfolio.total_value:总资产(包含现金和持仓价值)。
    • context.portfolio.positions_value:持仓总价值。
    • context.portfolio.returns:总权益的累计收益。
  • 获取持仓信息(context.portfolio.positions
    这是一个字典,键是标的代码,值是 Position 对象。
    # 检查是否持有平安银行
    if '000001.XSHE' in context.portfolio.positions:
        # 获取平安银行的可卖出数量
        amount = context.portfolio.positions['000001.XSHE'].closeable_amount
        # 获取持仓成本价
        cost = context.portfolio.positions['000001.XSHE'].avg_cost
    

总结
只要确保在系统回调函数(如 initialize(context))中使用,或者在自定义函数中通过参数传递 def my_func(context):,就可以正常使用 context 获取账户和时间信息了。