问题描述
请问如何获取当前bar的日期?
在回测中,程序里写的 run_daily(trade, 'every_bar')
那么在trade函数中获取当前bar的日期?
求指教!!
解决方案
在 JoinQuant(聚宽)量化平台的回测或模拟交易中,无论你是使用 run_daily 还是 handle_data,都可以通过全局上下文对象 context 来获取当前 Bar 的日期和时间。
具体来说,你需要使用 context.current_dt 属性。
核心解答
context.current_dt 返回的是一个 Python 的 datetime.datetime 对象,代表当前策略运行的逻辑时间。
在你的 trade 函数中,你可以这样获取日期:
def trade(context):
# 获取完整的 datetime 对象 (例如: 2023-10-25 09:30:00)
current_time = context.current_dt
# 仅获取日期部分 (返回 datetime.date 对象,例如: 2023-10-25)
current_date = context.current_dt.date()
# 如果你需要字符串格式的日期 (例如: '2023-10-25')
date_str = context.current_dt.strftime("%Y-%m-%d")
# 打印输出查看
log.info("当前Bar的完整时间是: %s" % current_time)
log.info("当前Bar的日期是: %s" % current_date)
完整策略示例
结合你提到的 run_daily(trade, 'every_bar'),完整的代码结构如下:
import jqdata
def initialize(context):
# 设定基准和复权模式
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 注册定时运行函数,'every_bar' 表示按设定的频率(天或分钟)运行
run_daily(trade, time='every_bar')
def trade(context):
# 1. 获取当前 datetime 对象
dt = context.current_dt
# 2. 提取具体的年、月、日、时、分
year = dt.year
month = dt.month
day = dt.day
# 3. 获取纯日期对象
current_date = dt.date()
# 打印日志
log.info(f"当前运行的日期是: {current_date}, 年份: {year}, 月份: {month}")
# 在这里编写你的交易逻辑...
# order('000001.XSHE', 100)
补充说明
- 时间精度:
- 如果你的回测频率是按天(日线),
context.current_dt的时间部分通常是09:30:00。 - 如果你的回测频率是按分钟(分钟线),
context.current_dt会精确到当前运行的那一分钟(例如09:31:00,14:59:00等)。
- 如果你的回测频率是按天(日线),
- 前一个交易日:如果你需要获取上一个交易日的日期,可以直接使用
context.previous_date,它返回的是一个datetime.date对象。