问题描述
解决方案
在 JoinQuant(聚宽)平台中,要实现只在每周五下午进行交易,最直接且推荐的方法是使用 run_weekly 定时运行函数。
实现方法
- 使用
run_weekly函数:该函数专门用于按周调度的策略。 - 设置
weekday参数:将其设置为5,代表周五。 - 设置
time参数:将其设置为下午的具体时间(例如'14:30'或'14:50')。
策略代码示例
以下是一个完整的策略代码示例,它会在每周五的 14:50 执行交易逻辑。
# -*- coding: utf-8 -*-
import jqdata
def initialize(context):
"""
初始化函数,设定基准、复权模式及定时任务
"""
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设置手续费(股票类默认设置)
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 【核心代码】设置每周五下午 14:50 运行一次 weekly_trading_logic 函数
# weekday=5 表示周五
# time='14:50' 表示下午2点50分
run_weekly(weekly_trading_logic, weekday=5, time='14:50')
def weekly_trading_logic(context):
"""
每周五下午执行的交易逻辑
"""
log.info("当前时间: %s,正在执行周五下午的交易逻辑" % context.current_dt)
# 示例:获取要操作的股票(这里以平安银行为例)
security = '000001.XSHE'
# 获取当前可用资金
cash = context.portfolio.available_cash
# 简单的示例逻辑:如果有资金就买入
if cash > 0:
# 买入价值为当前可用资金的股票
order_value(security, cash)
log.info("买入 %s" % security)
# handle_data 是可选的,如果只在周五交易,可以留空或不写
def handle_data(context, data):
pass
关键参数说明
run_weekly(func, weekday, time, ...):func: 你定义的交易函数名(如上例中的weekly_trading_logic)。weekday: 1 代表周一,5 代表周五。time: 24小时制的时间字符串。例如'14:00'。force(可选): 默认为True。如果设置为True,当周五是节假日休市时,系统会尝试在周五之前的最近一个交易日(通常是周四)的同一时间运行。如果你希望严格只在周五运行(即使周五休市也不提前到周四),可以将force设置为False,或者在函数内部增加日期判断。
替代方案(使用 run_daily + 判断)
如果你需要更复杂的逻辑(例如:如果是周五就交易,如果周五休市则完全不交易,而不是提前),可以使用 run_daily 配合 isoweekday() 判断:
def initialize(context):
# 每天下午 14:50 运行 check_and_trade
run_daily(check_and_trade, time='14:50')
def check_and_trade(context):
# 判断今天是周几 (1-7)
day_of_week = context.current_dt.isoweekday()
# 只有在周五 (5) 才执行
if day_of_week == 5:
# 这里写交易逻辑
log.info("今天是周五,执行交易")
else:
pass
通常情况下,第一种使用 run_weekly 的方法更为简洁和高效。
Q&A
Q: 如果设置了 run_weekly,还需要写 handle_data 吗?
A: 不需要。如果你的策略只需要在特定时间点运行,handle_data 是可选的。你可以留空或者完全不定义它。
Q: run_weekly 中的 time 参数可以精确到秒吗?
A: 可以。在分钟回测或模拟交易中,time 可以设置为 '14:50:30' 这样的格式。但在按天回测中,时间通常只作为触发点,具体的撮合逻辑取决于回测频率设置。
Q: 如果周五停牌了怎么办?
A: run_weekly 只是触发定时任务。如果股票停牌,你在交易函数中下达的订单(order 系列函数)会失败或被取消,并会在日志中显示警告信息。你可以在下单前使用 get_current_data()[security].paused 来检查股票是否停牌。