问题描述
请问“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 获取账户和时间信息了。