开发AI量化策略所遇到的坑
AI只是工具,想要驾驭AI还得自身有点功底,不然反而会被工具所害,甚至从信仰AI变为抵制AI。本文简单介绍开发AI量化选股策略中所遇到的各种坑,希望大家有所收获,少走弯路。
本文为BigQuant用户的实践分享,主要从思想和实操两个层面分享在开发AI量化选股策略中所遇到的各种坑。
策略思想逻辑层面
训练集和测试集不能有所重合 机器学习的基本思路就是在训练集上发现pattern,训练出模型,然后对样本外的预测集数据进行预测。这好比老师平时布置的作业就是训练集,学生们通过平时的作业学习到知识,然后期末老师通过期末试卷来检验学生的学习掌握情况,如果期末试卷和平时作业一模一样,那么学生测试效果就会很好,因为之前他们就见过答案,这样就做不到对学生平时学习能力、知识掌握能力的测试,因此测试集不能和训练集一样。对于AI量化策略同样如此,如果拿模型预测训练集,效果一定很好,毕竟训练模型的时候模型已经“见过”了实际值。
金融时序数据采取以时间点划分训练集和测试集,而不是随机划分 金融数据是标准的时间序列数据,时间序列数据最主要的特征就是具有自相关性,因此使用机器学习、深度学习对金融数据进行建模不能完全照搬传统的机器学习模式。传统机器学习模式对训练集和测试集的划分是采取随机划分,样本之间没有时间先后顺序,完全是独立的样本,因此可以把数据打乱,随机抽取80%的数据作为训练集,剩下的20%数据作为测试集。但是金融市场不同的时间段市场状况是不一样的,时间是划分训练集和测试集最好的直尺。可以参考:《40 Interview Questions asked at Startups in Machine Learning / Data Science》 35
训练集数据不能太少,不要选择几只股票作为股票池
刚刚提到训练数据好比老师给学生平时布置的作业,如果作业太少、题目类型单一,那么学生求解问题也不能得到很好的训练。机器学习算法比较复杂,参数也较之于线性回归模型更多,训练集数据不够可能会导致模型泛化能力太差,因为训练集可能并不能反映出整体数据的分布,因此在预测集上偏差很(Bias)大,这有点类似“欠拟合”。
不仅如此,如果样本太小,特征太多,很容易陷入“维度灾难”,直接后果就是“过拟合”,为了防止“过拟合”,那么所需的训练样本数量就会呈指数型增长。但是,如果只选较短时间或者小部分股票的话,过拟合难以避免,模型在训练集上训练的很好,拿来预测测试集效果也很差,因此最好是全市场选股。
特征具有可比性 数据挖掘离不开对数据进行清洗和预处理,机器学习也是如此。此外,还应该选择更有可比性的特征。比如今日收盘价这个特征,绝不可直接拿来训练模型,因为不同的股票其价格本身可能就不在一个平台上,贵州茅台的价格和工商银行的价格相差甚远,用这个特征并不能很好地反映出收益率的变动。在目前这个阶段,端到端的机器学习还没到来,特征工程(特征提取、特征选择、特征构建)在机器学习中起着非常重要的作用。虽然收盘价没有什么可比性,但是收盘价除以开盘价,或者10日均线除以20日均线这类的特征就能剔除价格本身差异所带来的影响。另外再举一个例子,市盈率是一个非常有效的特征,但是无论怎么调参数,收益都上不去,达到了一个瓶颈位置。对股票市场稍微了解的朋友就知道,不同行业公司的市盈率是不具有对比性的,银行行业的市盈率和制造行业的市盈率不在同一个水平,因此如果使用市盈率除以所属行业平均市盈率这个调整后的市盈率,效果应该更好。因此想要构造出好的因子还应该对金融市场有一些背景知识。
标注函数和策略逻辑保持一致 目前开发的AI量化策略还是属于监督式学习范畴,要训练出一个学习算法需要特征数据和标注数据。特征数据就是股票的各个特征,比如5日均价、当日收益率等,标注数据就代表着你希望选出什么样表现的股票,比如你使用未来5日的收益率作为标注,那么就表示你希望模型能够找出未来5日大概率上涨的股票。因此,标注函数和策略逻辑应始终保持一致。不同的特征对应的标注函数是不一样的,比如市盈率特征,这样的特征短期内变动不大,因此对短期股票的预测效果应该并不显著,因此标注函数应关注更长期的数据,而资金流特征、价量特征变动迅速,应该对应较短期的标注数据。可以看出,特征决定了标注函数,标注函数决定了策略的持仓周期。这也对我们调参提供了一种参考方法。
因子并非越多越好 在开发策略中,我们可以先对单因子进行检验,然后收集数十个能够带来正收益有效的因子,那是否可以把这些因子简单组合起来形成一个多因子的AI选股策略呢?答案远没有这么简单。 这里有一个图,横轴是所选择的因子数目,纵轴是测试集(也可称为验证集)获得的准确率,从中可以看到,并非选择了全部特征,准确率最高,当少数几个特征就可以得到最高准确率时候,选择的特征越多,反而画蛇添足了。
比较暴力的方法就是遍历所有的特征集,然后确定出最优的特征集合。另外也可以通过模型各个特征的贡献度,留下贡献度高的特征,去除贡献度低的特征,在此过程中,多做实验时做好的途径。
平台使用实操方面
尽量选择AI可视化模块新建策略,选择最新的策略模板 之前BigQuant一直是代码模式开发策略,对编程要求较高,后来支持了上手更为简单的可视化模式,可视化模式最大的好处就是让策略更为直观,操作也更为灵活,拖动模块、连连线就能把策略运行起来。不仅如此,如果采取代码模式,模块版本很可能不是最新版本,产生一些很奇怪的问题,因此果断建议小伙伴采取可视化模式开发策略,这样每次都能选择最新的策略模板,规避不少奇奇怪怪的问题。
测试集跨越日期太短,却含有某些需要长周期参数的因子 这个坑比较隐蔽,而且是模拟交易时候才会遇到。比如测试集为2017-11-13到2017-11-17,一共5天数据,但是在因子列表里面却10日均价,10日收益率标准差等需要更多日期数据才能计算出来的因子,于是测试集抽取出来的因子都是NaN,经数据过滤模块一过滤(删除缺失值),测试集就没有数据了,于是会出现No data left after dropnan。这个问题需要这样解决:打开测试集的基础特征抽取模块,修改“向前取数据天数”参数。
3.成交率限制设置为0 不知道大家有没有遇到这样的问题,在回测结果交易详情页面可以看到连续几天卖出同一只股票,但其实策略里面只有第一天才有卖出订单。这个坑也是特别隐蔽,其原因就是Trade(回测/模拟)模块成交率限制(volume_limit)这个参数导致的。这个参数默认清况下是0.025,具体含义是指,下单当日对股票的下单量和该日的成交量进行一个检查,如果下单量大于当日成交量的2.5%,则实际成交数量等于当日成交量的2.5%,超出的部分顺延到下一日进行成交;如果设置volume_limit为0,表明不需要进行检查,实际成交数量等于下单数量。因此,如果采取默认参数,并且初始金额很大的话,就会遇到连续几日持续交易的情况。最好的办法就是设置volume_limit为0,取消成交量检查。
以上就是我在BigQuant平台开发AI量化选股策略遇到的一些经验总结,希望对大家有帮助, 欢迎补充!
以上为BigQuant用户的经验分享,更多AI量化探寻欢迎来BigQuant
开发AI量化策略所遇到的坑的更多相关文章
- 深入浅出 1 - AI量化策略快速理解
我们在用AI来编写量化策略过程中,主要用到了机器学习,先来从一张图直观理解什么是机器学习:人类对新问题做出有效决策依靠的是过去积累的许多经验,并对经验进行利用,而对机器来说,“经验”以“数据”方式 ...
- 三分钟玩转微软AI量化投资开源库QLib
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...
- 数字货币期货与现货JavaScript量化策略代码详解汇总
1.动态平衡策略 按照当前的 BTC 的价值,账户余额保留¥5000 现金和 0.1个 BTC,即现金和BTC 市值的初始比例是 1:1. 如果 BTC 的价格上涨至¥6000,即 BTC 市值大于账 ...
- 【名额有限】云开发AI拓展能力等你来体验!
这次来了个超厉害的新能力! 人脸智能打马赛克.人脸智能裁剪--各种操作,都能一步到位! 迫不及待想体验,戳链接:https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂,继续往 ...
- 如何使用交易开拓者(TB)开发数字货币策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 为何使用交易开拓者(TB)作为回测工具 交易开拓者(后文以TB简称)是一个支持国内期货市场K线 ...
- 用鸿蒙开发AI应用(七)触摸屏控制LED
[小年答谢,新春送礼]免费抽取1000元京东卡+更多新春好礼~查看详情>>> 目录:前言背景知识编译用户程序框架子系统基于AbilityKit开发的Ability总结 前言上一篇,我 ...
- 带你从0到1开发AI图像分类应用
摘要:通过一个垃圾分类应用的开发示例,介绍AI Gallery在AI应用开发流程中的作用. 本文分享自华为云社区<AI Gallery:从0到1开发AI图像分类应用>,作者: yd_269 ...
- 使用JavaScript实现量化策略并发执行——封装Go函数
在实现量化策略时,很多情况下,并发执行可以降低延时提升效率.以对冲机器人为例,需要获取两个币的深度,顺序执行的代码如下: 请求一次rest API存在延时,假设是100ms,那么两次获取深度的时间实际 ...
- 使用JavaScript实现量化策略并发执行
本文代码和文章发在FMZ发明者比特币量化交易平台上: 使用JavaScript实现量化策略并发执行--封装Go函数 - 发明者量化 https://www.fmz.com/digest-topic/3 ...
- 用鸿蒙开发AI应用(八)JS框架访问内核层
目录:前言JS应用开发框架原理内置模块实现ace模块开发界面程序 前言上回说到,用C++来写UI界面的开发效率不如JS+HTML来的高,但设备开发又免不了要通过内核态来操作硬件,这里我们就要先打通从J ...
随机推荐
- .NET应用多语言-葡萄牙语软件,如何处理本地化,特别是数字的转换和计算
在葡萄牙语软件中,数字本地化通常涉及小数点和千位分隔符的使用.在葡萄牙语中,小数点用","表示,而不是英语中使用的".".千位分隔符通常是一个空格或一个点. 例 ...
- mpi转以太网连接200plc通信不上实际问题和解决方法
西门子S7200plc通信不上实际问题和解决方法 现场通信的同学在现场调试的时候,现在特别是做项目改造的项目,西门子S7200plc通信面临淘汰,但是在改造的项目中还能经常看到他们的身影,下面我们就来 ...
- 2023版:深度比较几种.NET Excel导出库的性能差异
引言 背景和目的 本文介绍了几个常用的电子表格处理库,包括EPPlus.NPOI.Aspose.Cells和DocumentFormat.OpenXml,我们将对这些库进行性能测评,以便为开发人员提供 ...
- 五分钟k8s入门到实战-应用配置
背景 在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力,x现在可以满足基本的应用开发需求了. 现在我们需要更进一步,使用 k8s 提供的一些其他对象来标准化我的应用开发. ...
- oracle 验证流水存在性火箭试优化
在生产中经常遇到"select * from tbl_IsExist where date=?"的SQL,经与开发人员沟通得知此SQL是验证流水存在性,若不存在则插入,若存在退出 ...
- C#学习笔记--变量类型的转换
变量类型的转化: 转换原则 同类型的大的可以装小的,小类型的装大的就需要强制转换. 隐式转换: 同种类型的转换: //有符号 long-->int-->short-->sbyte l ...
- P6346 [CCO2017] 专业网络 & CF1251E1 Voting(Easy Version)
analysis 这个题目我们可以考虑用贪心来做. 我们不难看出来,这个题目是要让我们推出这么个结论:花小钱,办大人. 整体贪心的思路就出来了,然后就是实现部分. 因为我们认识的人随便是谁都可以.所以 ...
- 可观测性数据收集集大成者 Vector 介绍
如果企业提供 IT 在线服务,那么可观测性能力是必不可少的."可观测性" 这个词近来也越发火爆,不懂 "可观测性" 都不好意思出门了.但是可观测性能力的构建却着 ...
- 快速展示原型之Minimal API开发
Minimal API官网地址: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/security?vi ...
- 【Unity3D】UI Toolkit数据动态绑定
1 前言 本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定. 如果读者对 UI Toolkit 不是太了解,可以参考以下内容. UI Toolkit简介 UI Toolki ...