问题描述
量化回测可以每五分钟执行一次吗?
解决方案
在 ptrade 量化平台中,回测引擎的底层分钟级别触发频率是每分钟执行一次,并没有直接提供“每五分钟触发一次”的引擎级别选项。但是,您完全可以通过代码逻辑控制和获取5分钟K线数据来实现每五分钟执行一次的量化回测策略。
1. ptrade 回测运行周期机制
根据 ptrade API 文档,策略的运行周期主要分为:
- 日线级别:回测和交易每天运行一次(回测在15:00,交易在尾盘)。
- 分钟级别:回测和交易都是每分钟运行一次,运行时间为每根分钟K线结束。即
handle_data(context, data)函数会每分钟被调用一次。
2. 如何实现“每五分钟执行一次”的策略逻辑?
既然 handle_data 是每分钟触发的,我们可以在该函数内部获取当前的时间,通过判断当前分钟数是否能被 5 整除(例如 05分、10分、15分...),来决定是否执行核心的交易逻辑。
同时,ptrade 的行情获取接口(如 get_history 和 get_price)是支持直接获取 5m(5分钟线)频率的数据的。
3. Python 实现示例
以下是一个在 ptrade 中实现每 5 分钟执行一次逻辑的策略模板:
def initialize(context):
# 设置我们要操作的股票池
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取当前回测时间的分钟数
current_minute = context.blotter.current_dt.minute
# 判断当前分钟数是否是 5 的倍数(即每 5 分钟执行一次)
# 注意:A股开盘是 9:30,第一根5分钟K线结束是 9:35
if current_minute % 5 == 0:
# 记录日志,确认执行时间
log.info("当前时间:%s,执行5分钟周期逻辑" % context.blotter.current_dt)
# 获取过去 10 根 5分钟线 的收盘价数据
# frequency='5m' 表示获取5分钟级别数据
hist_data = get_history(10, frequency='5m', field='close', security_list=g.security)
if hist_data is not None and not hist_data.empty:
# 获取最新的5分钟收盘价
current_close = hist_data['close'].iloc[-1]
# 在这里编写您的 5分钟级别 交易信号判断逻辑
# 例如:简单的价格突破逻辑
if current_close > 40.0 and get_position(g.security).amount == 0:
order_value(g.security, 10000)
log.info("触发买入信号")
elif current_close < 38.0 and get_position(g.security).amount > 0:
order_target(g.security, 0)
log.info("触发卖出信号")
总结
- 引擎触发:选择“分钟级别”回测,引擎依然是每 1 分钟调用一次
handle_data。 - 逻辑控制:利用
context.blotter.current_dt.minute % 5 == 0过滤时间,使核心代码每 5 分钟运行一次。 - 数据获取:使用
get_history(..., frequency='5m', ...)获取标准的 5 分钟 K 线数据进行指标计算。