问题描述
下面是把一个常量的日期赋给了check_date,程序中需要一个变量赋给check_date,怎样写方便?试了几次总出错。
CCI1 = CCI(security_list1, check_date='2017-01-04', N=14)
print CCI1[security_list1]
解决方案
在 JoinQuant 聚宽平台中调用技术指标函数(如 CCI、MACD 等)时,check_date 参数通常接受 字符串格式(如 '2017-01-04') 或 datetime.date / datetime.datetime 对象。如果你在赋值变量时出错,通常是因为变量的类型不正确(例如传入了列表、Series 等),或者日期格式不符合要求。
以下是几种最常见且方便的变量赋值写法,分为回测/模拟交易环境和研究环境:
场景一:在回测/模拟交易中(使用 context)
在策略代码的 handle_data 或自定义的定时运行函数中,我们通常需要获取当前的逻辑时间或前一个交易日。你可以直接使用 context.current_dt 或 context.previous_date。
写法 1:使用前一个交易日(推荐,避免未来函数)
def handle_data(context, data):
security_list1 = '000001.XSHE'
# context.previous_date 是 datetime.date 对象,可以直接传给 check_date
my_date = context.previous_date
# 将变量 my_date 赋给 check_date
CCI1 = CCI(security_list1, check_date=my_date, N=14)
print(CCI1[security_list1])
写法 2:使用当前逻辑时间并转为字符串
def handle_data(context, data):
security_list1 = '000001.XSHE'
# 将当前时间格式化为 'YYYY-MM-DD' 的字符串
current_date_str = context.current_dt.strftime('%Y-%m-%d')
# 将字符串变量赋给 check_date
CCI1 = CCI(security_list1, check_date=current_date_str, N=14)
print(CCI1[security_list1])
场景二:在研究环境中(使用 datetime 模块)
如果你是在 Jupyter Notebook 研究环境中做数据分析,没有 context 对象,你可以使用 Python 内置的 datetime 模块来生成日期变量。
import datetime
from jqlib.technical_analysis import CCI
security_list1 = '000001.XSHE'
# 1. 自定义一个字符串变量
my_date_str = '2023-10-10'
CCI1 = CCI(security_list1, check_date=my_date_str, N=14)
print(CCI1[security_list1])
# 2. 获取今天的日期作为变量
today_date = datetime.date.today()
CCI2 = CCI(security_list1, check_date=today_date, N=14)
print(CCI2[security_list1])
# 3. 获取昨天的日期作为变量
yesterday_date = datetime.date.today() - datetime.timedelta(days=1)
CCI3 = CCI(security_list1, check_date=yesterday_date, N=14)
print(CCI3[security_list1])
💡 常见报错原因排查:
- 类型错误:确保你的变量
my_date打印出来是'2017-01-04'这样的字符串,或者是<class 'datetime.date'>。如果它是一个 Pandas 的 Timestamp 或者包含时间的复杂对象,可能会报错。可以使用.strftime('%Y-%m-%d')强制转为标准字符串。 - 列表传参错误:
check_date只能接受单个日期,不能传入一个日期列表。 - Python 2/3 语法问题:注意你提问中写的是
print CCI1[security_list1],这是 Python 2 的语法。目前聚宽平台默认推荐使用 Python 3,请改为print(CCI1[security_list1])。