问题描述
原有的交易策略是日线,是不是可以用在 15 分钟的周期去交易?在改动什么吗?
解决方案
在 QMT 量化平台中,同一个交易策略是完全可以在不同的周期(如从日线切换到 15 分钟线)去运行和交易的。QMT 的运行机制是基于 K 线驱动的,即每走完一根 K 线(无论是日线还是 15 分钟线),系统都会调用一次 handlebar(ContextInfo) 函数。
如果您想将原有的日线策略用在 15 分钟周期上,通常需要从以下几个方面进行检查和改动:
1. 界面设置的改动
最直接的改动是在 QMT 软件界面上:
- 策略编辑器设置:在策略编辑器的【基本信息】面板中,将默认周期从“日线”修改为“15分钟线”。
- 运行/回测界面:在点击“运行”或“回测”前,确保当前行情主图的周期已切换为 15 分钟,或者在回测参数中明确指定周期为 15 分钟。
2. 代码层面的改动
如果您的代码编写得比较规范(动态获取周期),可能一行代码都不用改。但如果存在硬编码,则需要修改:
A. 数据获取接口的周期参数
如果您在代码中使用了 ContextInfo.get_market_data_ex 或 ContextInfo.get_history_data 获取数据,请检查 period 参数:
- 错误示范(硬编码):
period='1d'。这会导致即使主图是 15 分钟,获取的依然是日线数据。 - 正确示范(动态跟随):将
period设置为'follow'(跟随主图周期),或者使用ContextInfo.period动态传入。
# 推荐写法:使用 'follow' 让数据周期自动跟随主图周期(如15分钟)
def handlebar(ContextInfo):
# 获取当前主图周期的数据
data = ContextInfo.get_market_data_ex(
['open', 'high', 'low', 'close'],
[ContextInfo.stockcode],
period='follow', # 自动跟随界面设置的周期
count=20
)
B. 定时执行逻辑(如果有)
如果您的日线策略中使用了 do_order() 配合时间判断(例如判断 14:55:00 尾盘下单),在 15 分钟周期下,这种基于特定时间点的逻辑可能需要重写,因为 15 分钟线的 Bar 结束时间是 09:45, 10:00 等。
3. 策略逻辑与参数的优化(关键)
虽然代码可以无缝切换,但金融市场的逻辑在不同周期下差异巨大,您必须重新评估策略参数:
- 指标参数失效:日线级别的 MA5(5日均线)代表一周的交易成本;而在 15 分钟线上,MA5 只代表过去 75 分钟的成本。您可能需要将参数调整为 MA16(代表一天 4 小时共 16 个 15 分钟 Bar)等。
- 交易频率与成本:15 分钟周期的信号频率远高于日线。原本在日线盈利的策略,在 15 分钟线上可能会因为频繁交易产生大量的手续费和滑点,导致策略亏损。务必在回测时设置真实的滑点和手续费(使用
ContextInfo.set_commission和ContextInfo.set_slippage)。 - 隔夜风险:15 分钟策略可能会在临近收盘时发出买入信号,导致被动持仓过夜。如果不想隔夜,需要在代码中增加时间过滤(如
if current_time > '14:45:00': 不开新仓)。
总结
技术上:只需在界面切换周期,并确保代码中的数据获取函数使用 period='follow' 即可。
策略上:必须重新进行回测,调整技术指标参数,并严格评估高频交易带来的手续费磨损。