【深度学习量化交易18】盘前盘后回调机制设计与实现——基于miniQMT的量化交易回测系统开发实记
我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~
目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。
盘前时间是交易者准备当日交易计划、分析隔夜数据和市场情绪的黄金时段,而盘后则适合总结当日表现、调整策略参数并为次日交易做准备。本文将详细介绍盘前盘后回调机制的设计与实现过程,探讨如何在量化交易框架中优雅地集成这一功能,使策略开发者能够充分利用非交易时段进行策略优化和执行。
一、系统架构设计
前文讲到过,策略文件是由初始化配置和主要交易逻辑两个核心部分组成,今天则是要在这两个组成部分之外,额外增加两个回调函数,分别处理盘前和盘后操作。当然这个设置是可选项,不做盘前盘后处理也是没问题的。
盘前盘后回调机制的系统架构基于事件驱动模型实现。配置数据从GUI层传递至框架层,包含回调开关和时间设置。框架使用反射机制检测策略是否实现了盘前盘后回调接口,并维护状态变量避免重复触发。
触发时,系统构造仅含时间信息的数据结构传递给回调函数,返回的交易信号由交易管理器统一处理。
整个设计保持了接口一致性和模块间低耦合,使策略开发者能专注于业务逻辑而非底层实现。
二、策略接口设计
为支持盘前盘后回调,我们在策略模块中定义了两个标准函数接口:
def khPreMarket(data: Dict) -> List[Dict]:
"""盘前回调函数,在每个交易日开盘前执行"""
# 策略逻辑
return signals
def khPostMarket(data: Dict) -> List[Dict]:
"""盘后回调函数,在每个交易日收盘后执行"""
# 策略逻辑
return signals
这两个函数接口与主策略函数(khHandlebar)采用相同的数据格式和返回值结构,确保了接口一致性,降低了用户的学习成本。回调函数接收包含时间信息的市场数据,并返回交易信号列表,系统会自动处理这些信号。
顺便说一句,策略模块中其他两个接口是:
策略主逻辑khHandlebar:
def khHandlebar(data: Dict) -> List[Dict]:
"""策略主逻辑
Args:
data: 行情数据,格式为 {股票代码: {字段名: 字段值}, "__current_time__": {...}}
其中包含特殊键"__current_time__",其值为一个字典,包含以下字段:
- timestamp: 时间戳(整数,秒级)
- datetime: 格式化的日期时间字符串,格式为"%Y-%m-%d %H:%M:%S"
- date: 格式化的日期字符串,格式为"%Y-%m-%d"
- time: 格式化的时间字符串,格式为"%H:%M:%S"
- raw_time: 原始时间戳(保持原格式)
Returns:
List[Dict]: 交易信号列表,每个信号字典包含以下字段:
{
"code": str, # 股票代码
"action": str, # 交易动作,可选值:"buy"(买入) | "sell"(卖出)
"price": float, # 委托价格
"volume": int, # 委托数量,单位:股
"reason": str, # 交易原因说明
"order_type": str, # 可选,委托类型,默认为"limit":
# "limit"(限价) | "market"(市价) | "best"(最优价)
"position_type": str, # 可选,持仓方向,默认为"long":
# "long"(多头) | "short"(空头)
"order_time": str, # 可选,委托时间,格式"HH:MM:SS"
"remark": str # 可选,备注信息
}
"""
以及策略初始化init:
def init():
"""策略初始化"""
这里就先不展开说了,回头专门会写文章介绍策略编写框架。
三、用户界面实现
为了让用户可以灵活配置盘前盘后回调,我在GUI界面中设计了专门的设置区域:
- 复选框控制是否启用盘前盘后回调
- 时间选择器设定具体的触发时间
这个界面是很简单的:
这些设置被保存在配置文件中,系统在启动时会加载这些设置,确保每次运行时都应用用户的偏好。界面设计遵循了直观、简洁的原则,使用户能够轻松理解和操作。
四、回测模式实现
回测模式下,盘前盘后回调的实现需要解决以下关键问题:
- 时间点识别:系统需要识别新的交易日开始和结束
- 数据处理:即使某些时间点缺乏市场数据,也能正确执行回调
- 信号处理:回调函数生成的交易信号需要被正确处理
具体实现中,系统会根据历史数据生成一系列时间点,按时间顺序模拟市场运行。当检测到新的交易日开始时,先执行盘前回调;当交易日结束时,则执行盘后回调。为确保在没有市场数据时也能执行回调,我们实现了一种机制,创建只包含时间信息的数据结构。
五、工具函数支持
为支持盘前盘后回调机制,我们在工具类中增加了一些辅助函数,如is_trade_day方法用于判断某个日期是否为交易日:
def is_trade_day(self, date_str: str = None) -> bool:
"""判断是否为交易日"""
if date_str is None:
date_str = datetime.datetime.now().strftime("%Y-%m-%d")
# 解析日期
date = datetime.datetime.strptime(date_str, "%Y-%m-%d")
# 排除周六和周日
if date.weekday() >= 5:
return False
# 这里可以添加节假日的判断逻辑
return True
这些工具函数极大地简化了主要逻辑的复杂度,提高了代码的可读性和可维护性。
六、下一步考虑
后边还有几件事要做,做完后回测系统就可以跟大家见面了:
- 完善不同数据订阅模式与框架的兼容
- 策略的项目化管理设置
- 回测结果可视化与评估参数优化
- 与成熟的回测软件(比如QMT)进行相同策略的对比,以验证软件的有效性
因此,目前的回测系统还不满足放出来给大家使用的状态,待测试稳定后,快捷的安装包版本以及全部开源代码都会放出来给读者朋友们使用。
近期我尽量加快软件和文章更新的频率,尽早让朋友们使用上这个软件。
回测系统一览
end、开通miniQMT
上述讲到的系统是基于miniQMT,很多券商都可以开通miniQMT,不过门槛各有不同,很多朋友找不到合适的券商和开通渠道。这里我可以联系券商渠道帮忙开通,股票交易费率是万1,开通成功的朋友都可以免费使用上边开发的“看海量化交易系统”。这个系统还在持续开发的过程中,数据下载的功能已经可以使用,回测部分正在加紧开发,大家可以先开通MiniQMT的权限,这样回测部分的功能放出后就能第一时间用上了~
对于想要开通miniQMT、使用上边开发的“看海量化交易系统”的朋友们,请大家关注一下我的公众号“看海的城堡”,在公众号页面下方点击相应标签即可获取。
相关文章
【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想
【深度学习量化交易2】财务自由第一步,三个多月的尝试,找到了最合适我的量化交易路径
【深度学习量化交易3】为了轻松免费地下载股票历史数据,我开发完成了可视化的数据下载模块
【深度学习量化交易4】 量化交易历史数据清洗——为后续分析扫清障碍
【深度学习量化交易5】 量化交易历史数据可视化模块
【深度学习量化交易6】优化改造基于miniQMT的量化交易软件,已开放下载~(已完成数据下载、数据清洗、可视化模块)
【深度学习量化交易7】miniQMT快速上手教程案例集——使用xtQuant进行历史数据下载篇
【深度学习量化交易8】miniQMT快速上手教程案例集——使用xtQuant进行获取实时行情数据篇
【深度学习量化交易9】miniQMT快速上手教程案例集——使用xtQuant获取基本面数据篇
【深度学习量化交易10】miniQMT快速上手教程案例集——使用xtQuant获取板块及成分股数据篇
【深度学习量化交易11】miniQMT快速上手教程——使用XtQuant进行实盘交易篇(一万七千字超...
【深度学习量化交易12】基于miniQMT的量化交易框架总体构建思路——回测、模拟、实盘通吃的系统架...
【深度学习量化交易13】继续优化改造基于miniQMT的量化交易软件,增加补充数据功能,优化免费下载...
【深度学习量化交易14】正式开源!看海量化交易系统——基于miniQMT的量化交易软件
【深度学习量化交易15】基于miniQMT的量化交易回测系统已基本构建完成!AI炒股的框架初步实现
【深度学习量化交易16】韭菜进阶指南:A股交易成本全解析
【深度学习量化交易17】触发机制设置——基于miniQMT的量化交易回测系统开发实记