问题描述
@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 编程,遇到问题时可以按照以下步骤排查:
-
理解报错信息(Traceback):
name 'context' is not defined明确告诉你 Python 找不到名为context的变量。这说明你当前的代码作用域里没有这个东西。你需要思考:这个变量是谁给我的?我是在哪里调用它的?
-
区分平台环境:
- 牢记研究环境和回测环境的区别。研究环境是纯 Python 脚本环境,回测环境是聚宽引擎驱动的事件循环环境。很多回测专用的 API(如
context,order,history的简写形式)在研究中不能直接用,或者用法不同。
- 牢记研究环境和回测环境的区别。研究环境是纯 Python 脚本环境,回测环境是聚宽引擎驱动的事件循环环境。很多回测专用的 API(如
-
查阅 Python 官方文档:
- 涉及到日期加减、字符串处理、列表字典操作等,这些属于 Python 基础。搜索关键词时加上
Python,例如搜索:Python 获取昨天日期,就能找到datetime模块的用法。
- 涉及到日期加减、字符串处理、列表字典操作等,这些属于 Python 基础。搜索关键词时加上
-
善用
print()和type():- 不确定一个函数的返回值是什么格式时,先
print(type(返回值))。例如check_date参数需要什么格式?聚宽文档通常接受字符串'2017-01-04'或datetime.date对象。如果你传了错误的对象,就会报格式不匹配的错误。
- 不确定一个函数的返回值是什么格式时,先
-
查阅聚宽 API 文档的细节:
- 在聚宽 API 文档中,搜索
context,查看它的定义和包含的属性(如context.current_dt,context.previous_date),并注意文档中注明的“回测环境/模拟专用API”。
- 在聚宽 API 文档中,搜索