问题描述
每天调用一次时,current_price是哪个时刻的价格?
如果我想判断一天内,价格如果小于某个值,就再看看盘中价格有没有大于某个值,这时决定买卖。
也就是说,我希望看到一个时间段内的变化情况,是否可以实现?
解决方案
1. 每天调用一次时,current_price 是哪个时刻的价格?
在 JoinQuant 平台中,如果您的策略频率设置为**“天(日频)”**,或者您使用 run_daily 每天只在特定时间(如开盘 09:30)调用一次函数,那么获取到的价格含义如下:
- 使用
attribute_history或history获取日线数据时:获取到的是昨天的收盘价。因为在今天盘中(或开盘时),今天的日线还没有走完,为了避免未来函数,系统返回的最新一根完整日线是昨天的。 - 使用
get_current_data()['股票代码'].last_price时:获取到的是当前运行时刻的最新价。如果在 09:30 运行,获取到的通常是集合竞价产生的开盘价(09:30 之前获取则返回昨日收盘价)。
2. 如何判断一天内的价格变化情况(如先跌后涨)?
如果您希望在一天内“盯盘”,判断价格是否先小于某个值,然后再大于某个值并进行买卖,仅仅每天调用一次函数是无法实现的。因为每天调用一次意味着策略在一天中只“看”了一眼市场,无法捕捉盘中的连续波动。
要实现这种日内时间段内的变化监控,您必须将策略的运行频率设置为“分钟(minute)”。在分钟频下,您可以实现对日内价格轨迹的跟踪。
实现思路与代码示例
步骤 1:设置回测频率为“分钟”
在策略初始化时,或者在回测界面的右上角,确保频率选择为“分钟”。
步骤 2:使用全局变量记录日内状态
利用全局变量 g 来记录当天的最低价、是否已经触发过低于阈值的条件等。
步骤 3:在每分钟调用的函数中进行逻辑判断
import jqdata
def initialize(context):
g.security = '000001.XSHE'
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每天开盘前重置当天的状态变量
run_daily(reset_daily_status, time='09:00')
# 每分钟运行一次监控逻辑
run_daily(intraday_monitor, time='every_bar')
def reset_daily_status(context):
# 每天重置:是否已经跌破过目标值
g.has_dropped_below_target = False
# 每天重置:是否今天已经交易过(避免频繁交易)
g.has_traded_today = False
def intraday_monitor(context):
if g.has_traded_today:
return
# 获取当前时刻的最新价
current_data = get_current_data()
current_price = current_data[g.security].last_price
# 假设我们的判断标准是:先跌破 10.0 元,然后再反弹突破 10.5 元就买入
lower_threshold = 10.0
upper_threshold = 10.5
# 1. 检查是否跌破过低点
if not g.has_dropped_below_target and current_price < lower_threshold:
g.has_dropped_below_target = True
log.info(f"时间 {context.current_dt}:价格 {current_price} 已跌破 {lower_threshold}")
# 2. 如果已经跌破过低点,再检查是否反弹突破高点
if g.has_dropped_below_target and current_price > upper_threshold:
log.info(f"时间 {context.current_dt}:价格 {current_price} 反弹突破 {upper_threshold},执行买入!")
order_value(g.security, context.portfolio.available_cash)
g.has_traded_today = True # 标记今日已交易
总结
- 日频策略只能看到前一天的历史或当天的开盘切片,无法做日内轨迹判断。
- 分钟频策略结合全局变量(
g.xxx)记录状态,是实现“先跌后涨”、“日内极值反转”等日内时间段变化监控的标准做法。