五、模型训练+股票预测
完成了数据处理,接下来就可利用平台集成的各算法进行模型训练和模型预测啦。本文将详细介绍“模型训练”、“模型预测”两大模块操作、原理。
模型训练和模型预测是AI策略区别于传统量化策略的核心,我们通过模型训练模块利用训练集因子和标注数据构建一个模型,并通过模型预测模型将预测集的因子数据输入模型进行预测。
在模块列表的 机器学习 、 深度学习 下可找到众多AI算法,可根据需要选择对应算法做训练和预测。本文以BigQuant专为量化开发的有监督性机器学习算法StockRanker为例,用 StockRanker训练 模块来训练模型,用 StockRanker预测 模块来做出股票预测。
操作流程
添加模块
第一步:在模块列表搜索框中输入“StockRanker”,在 机器学习 下找到 StockRanker训练 、 StockRanekr预测 模块并拖入画布。
连接StockRanker模块
第二步:将训练集的 缺失数据处理 和 输入特征列表 连接至 StockRanker训练 模块。
运行训练模块
第三步:选中 StockRanker训练 模块,保持默认设置,右键 运行选中模块 。
StockRanker算法原理、模块属性参数含义,请继续查看下文。
右键查看结果1 ,可观察训练好的模型(StockRanker为决策树)样子。如下图所示,可以看到有20个决策树,每个节点表示决策树的分支条件,每个分支都会依据各自的条件根据预测集中每只股票的因子数据进行打分。最终将所有决策树的打分结果汇总得到每只股票的得分和排序。
再右键 查看结果2 ,可观察各因子对此模型的贡献重要度分值(gain)。
连接至StockRanker预测
第四步:将训练好的 StockRanker训练 和测试集的 缺失数据处理 模块连接至 StockRanker预测
运行预测模块
右键 查看结果1 ,可观察每日各股票的得分、排序,即每日最值得买入的股票排序。
StockRanker算法介绍
StockRanker 算法专为量化而生,核心思想是排序学习和梯度提升树。 如下图这个模型有20棵决策树组成,每棵决策树最多有30个叶节点。给定一个样本,每个决策树会对样本打分(分数为样本根据判定条件到达的叶节点的值);最后的分数是所有决策树打分的总和。决策树的结构、判定条件和叶节点的分数等等都是由算法在训练数据上学习出来的。将测试集数据喂给训练好的决策树,则可得到测试集数据数据在该模型上的分数,再根据分数形成股票排序、回归、分类预测,指导后续的买入卖出。
StockRanker模块参数说明
输入数据1:训练数据,如本例中由 缺失数据处理 模块输出的含因子数据、标注数据的训练数据。
输入数据2:因子列表。
学习算法:StockRanker下包含排序、回归、二分类、logloss四种优化算法,默认为排序。
叶节点数量:如上图决策树中每棵树最大叶节点数量。一般情况下,叶子节点越多,则模型越复杂,表达能力越强,过拟合的可能性也越高;默认值是30。
每叶节点最小样本:每个叶节点最少需要的样本数量,一般值越大,泛化性性越好;默认值是1000。
树的数量:如上图决策树中树的数量。一般情况下,树越多,则模型越复杂,表达能力越强,过拟合的可能性也越高;默认值是20。
学习率:学习率如果太大,可能会使结果越过最优值,如果太小学习会很慢;默认值是0.1。
特征值离散化数量:离散化即在不改变因子(即特征)数据相对大小的前提下,对数据进行相应的映射,减小复杂度。离散化数量越大,数据复杂度越高,过拟合的可能性也越高;默认值是1023。
特征使用率:在构建每一颗树时,每个特征(即因子)被使用的概率,如果为1,则每棵树都会使用所有特征;默认值是1。
输出数据1:训练好的模型
输出数据2:各因子对模型的贡献度
StockRaner预测模块说明
输入数据1:训练好的模型
输入数据2:测试数据集
输出数据1:预测结果。即每日各股票的得分、顺序。
小结:至此,完成了 模型训练 和 股票预测 ,接下来就可利用预测好的股票进行买入卖出,计算并评估对应的收益、风险。
六、策略回测
完成了模型训练和股票预测,生成的股票排序,应该在何时买入卖出?行情突变,怎么止盈止损?交易费、成交率等怎么设置?这些都在“回测”模块中找到答案。
如下图所示,在AI策略开发中回测通常是策略构建的最后一步,通过Trade模块实现。回测是利用测试集数据的模型预测结果编写策略,并用测试集的历史数据对策略进行校验的过程。
AI策略的编写思路是利用AI模型的预测结果构建买卖交易逻辑,根据AI模型的类别不同,利用模型预测值构建的交易逻辑也不尽相同。例如本例的AI模板策略中根据每日股票的排序预测值构建买卖逻辑,每天卖出持仓中预测排名靠后的股票并买入当日预测排名靠前的股票。
回测机制简介
BigQuant交易引擎把每一个K线当做一个事件,按照时间发生先后顺序,即从左往右依次运行。
具体而言,回测程序在第一根K线上会依次调用初始化函数、数据准备函数、盘前处理函数和主函数,从第二根K线起的每根K线会依次调用盘前处理函数和主函数。
注意:最左侧黑色箭头表示只会在第一根K线会执行一次初始化函数。而每根K线上的灰箭头代表每根K线都会执行一次主函数。
函数详解
初始化函数:通常设置手续费、滑点、买卖股票数量、换仓周期等全局变量。
数据准备函数:通常计算交易所需的信号、每日交易的股票列表等变量。
盘前处理函数:通常编写订单的撤销/更改等订单处理逻辑。
主函数:通常编写策略的换仓买卖、风险控制等核心交易逻辑。
如下图所示,在回测模块的属性栏中可以看到对应函数的编写位置:
每根K线回调细节,见下图:
回测步骤
添加Trade模块
第一步: 在模块列表的 回测与交易 下找到 Trade(回测/模拟) 模块并拖入画布。
连接模块
第二步:将 证券代码列表 和 StockRanker预测 模块连接至 Trade(回测/模拟) 。注意输入端, Trade(回测/模拟) 第一个输入端只接收 证券代码列表 。
Trade参数属性设置
第三步:选中 Trade(回测/模拟) ,可在左侧属性栏更改初始资金、回测价格类型、成交率等交易参数;在主函数、数据准备函数、初始化函数中更改交易逻辑。我们先保持默认设置。
Trade(回测/模拟)模块参数
交易参数设置
开始时间:start_date (str),设定值只在回测模式有效,在模拟实盘模式下为当前日期。一般不需要指定,自动继承证券代码列表模块里的开始日期。
结束时间:end_date (str),设定值只在回测模式有效,在模拟实盘模式下为当前日期。一般不需要指定,自动继承证券代码列表模块里的结束日期。
成交率限制:执行下单时控制成交量。设置为0,不进行成交量检查; 默认值是0.025,下单量如果超过该K线成交量的0.025,多余的订单量会自动取消。
买入点:在何时下单买入。open=开盘买入,close=收盘买入;可选值有: ‘open’,‘close’;默认值是’open’。
卖出点:在何时下单卖出。open=开盘卖出,close=收盘卖出;可选值有: ‘open’,‘close’;默认值是’close’。
初始资金:默认值是1000000.0。
自动取消无法成交订单:是否自动取消因为停牌、一字涨跌停等原因不能成交的订单;默认值是True。
回测数据频率:股票、期货暂只支持日线、分钟级回测。
可选值有: ‘daily’和’minute’;默认值是daily。
回测价格类型:回测中买卖下单使用的价格, 支持真实价格或后复权(默认值)价格回测。
回测产品类型:交易品种类型,可选值有股票、期货,默认为股票。
基准代码:策略比较基准,不影响回测结果,一般传入指数代码,如000300.HIX(沪深300) 。更多A股指数代码请查看A股指数代码表。
主函数
[回调函数]主函数,必须实现的函数,该函数每个单位时间(每根K线)会调用一次, 如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次。在回测中,可以通过对象data获取单只股票或多只股票的时间窗口价格数据。如果算法中没有schedule_function函数,那么该函数为必选函数。一般策略的交易逻辑和订单生成体现在该函数中;默认值是None。
数据准备函数
[回调函数]数据准备函数,运行过程中只调用一次,在initialize前调用,准备交易中需要用到数据;默认值是None。
初始化函数
[回调函数]初始化函数,整个回测中只在最开始时调用一次,用于初始化一些账户状态信息和策略基本参数,context也可以理解为一个全局变量,在回测中存放当前账户信息和策略基本参数
盘前处理函数
[回调函数]盘前处理函数,每日开盘前调用一次。该函数是可选函数,在handle_data函数之前运行。你的算法可以在该函数中进行一些数据处理计算,比如确定当天有交易信号的股票池。
看不懂回测模块? 请移步回测模块详解
看不懂策略的逻辑? 请移步AI模板策略交易逻辑解读
运行并查看结果
第四步:点击右上角 运行全部 ,等待策略回测完成并查看分析结果。
生成的回测曲线和回测结果如何解读?查看下篇教程查看、分析结果
常见问题
编写策略并回测是策略构建中的核心内容,我们将常用功能和模板案例进行了归纳整理主要包括:
1.如何设置股票买卖比例?
2.如何设置手续费和滑点?
3.如何设置策略固定周期运行?
4.如何设置持仓股票持有固定天数后卖出?
5.如何设置下单数量为整百?
6.如何实现大盘风控?
7.如何实现个股的止盈止损?
如果有上述策略开发方面的疑惑,请移步宽客学院查看自定义买入卖出专题
小结:至此完成了策略构建基本步骤。在构建策略后通常还需要对策略进行反复的评价、优化、测试才算完成策略开发。
七、查看、分析结果
当策略回测完成时,系统会输出包含各种指标的收益曲线图,但可能因对这些指标的释义和内容不太熟悉,导致无法准群判断策略好坏,本文从回测各指标概念入手,希望可以帮助大家更好地理解策略回测结果。
当完成一个策略回测时,会得到如下图形,包含 收益概况 、 交易详情 、 每日持仓和收益 、 输出日志 。接下来,我们详细介绍这几个部分。
收益概况及指标含义
收益概况以曲线图的方式显示了策略在时间序列上的收益率。红色曲线为 策略收益率 ,蓝色为 基准收益率 (默认的基准设置是沪深300指数)。绿色曲线为 持仓占比 ,10%的持仓占比表示账户里股票市值占账户总资产的10%。 可通过缩放、拖动下方时间轴控件或在右上角填入起止时间来查看不同时间段的曲线走势。
不仅如此,衡量一个策略好坏的关键指标在收益概况页面也充分展示出来了。各指标含义如下:
收益率
(Total Returns*)*
策略整个回测时间段上的总收益率。比如,如果收益率为30%,表明起始时间是1万的本金,结束时间本金就变成1.3万了,一共赚了3000元。计算公式如下,该值越大越好。
年化收益率
(Total Annualized Returns)
该策略每一年的收益率。比如,如果回测时间段为2年,总收益率为30%,那么每年的年化收益率就在15附近(不考虑复利)。计算公式如下,该值越大越好。
基准收益率
(Benchmark Returns)
策略需要有一个比较基准,比较基准为沪深300。若基准收益率为15%,表明在整个回测时间段,大盘本身就上涨了15%,如果策略收益率小于基准收益率,说明策略表现并不好,连大盘都没有跑赢。计算公式如下。
阿尔法
(Alpha)
投资中面临着系统性风险(即$Beta$)和非系统性风险(即$Alpha$),$Alpha$是投资者获得与市场波动无关的回报。比如投资者获得了15%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是5%。计算公式如下,该值越大越好。
Alpha值解释:
α>0 策略相对于市场,获得了超额收益;
α=0 策略相对于市场,获得了适当收益;
α<0 策略相对于市场,获得了较少收益;
贝塔
(Beta)
表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如一个策略的$Beta$为1.5,则大盘涨1%的时候,策略可能涨1.5%,反之亦然;如果一个策略的$Beta$为-1.5,说明大盘涨1%的时候,策略可能跌1.5%,反之亦然。计算公式如下,该值的绝对值越小越好。
Beta值解释:
β<0 投资组合和基准的走向通常反方向,如空头头寸类;
β=0 投资组合和基准的走向没有相关性,如固定收益类;
0<β<1 投资组合和基准的走向相同,但是比基准的移动幅度更小;
β=1 投资组合和基准的走向相同,并且和基准的移动幅度贴近;
β>1 投资组合和基准的走向相同,但是比基准的移动幅度更大;
夏普比率
表示每承受一单位总风险,会产生多少的超额报酬,可以同时对策略的收益与风险进行综合考虑。可以理解为经过风险调整后的收益率。计算公式如下,该值越大越好。
胜率
(Winning Percentage)
衡量策略盈利一指标。比如10次投资中有8次获利,胜率就是80%。计算公式如下,该值越大越好。
盈亏比
(The profit and coss ratio)
盈亏比是在投资市场里每次交易的盈利和亏损的比例。计算公式如下,该值越大越好 。
收益波动率
(Volatility)
收益率的标准差,用来测量策略的风险性,波动越大代表策略风险越高。计算公式如下,该值越小越好。
信息比率
(Information Ratio)
衡量单位超额风险带来的超额收益。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较低的基准。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。计算公式如下,该值越大越好。
最大回撤
(Max Drawdown)
策略在整个时间段上亏损最严重的时候相比净值最高值下跌的百分比。如果最大回撤为20%,表明策略在某个时间点上,相比之前的净值最高。计算公式如下,该值越小越好。
交易详情
交易详情主要显示了策略在整个回测过程中每个交易日的买卖信息。包括买卖时间、股票代码、交易方向、交易数量、成交价格、交易成本。具体见下图:
可以通过右下角的下载交易详情按钮下载数据到本地进行查看。
每日持仓及收益
每日持仓及收益主要呈现每日持有股票代码、当日收盘价、持仓股票数量、持仓金额、收益等指标。具体见下图:
可以通过右下角的下载持仓详情按钮下载数据到本地进行查看。 需要注意的是这个表中的收益是指每只股票按当日收盘价结算的浮动收益,而不是该只股票真实卖出后的收益,因为卖出后的股票就不在持仓列表中了。策略总收益并不等于此列数据的总和!
输出日志
输出日志主要为策略运行过程中的一些日志。包括涨跌停股票不能交易、停牌估计不能交易等。该日志可以便于我们检查回测结果的正确性。
如图所示展示了每笔订单的执行时间和具体标的代码,以及订单的成交状态。
至此,已能初步判断判断策略效果好坏。但回测结果是否可靠?是否按照股票得分排序买入?交易参数是否真实?有无偷价漏价情形?此类情况均可参考下方高阶教程进行校验。
回测数据深入分析
策略收益风险分析
八、模拟实盘
开发好一个策略且回测收益、风险都达到目标,下一步该做什么呢?本文将详细介绍怎么将开发好的策略通过模拟交易推送每日交易信号。
提交模拟实盘
分享策略
第一步:开发出好策略后,在开发界面右上角点击 分享策略。
重要的事说三遍,在点击开始交易前请检查:
-
由于模拟交易需要实现每天更新预测集数据来预测最新日的结果,因此测试集的证券代码列表的开始日期和结束日期请务必确认已经勾选了绑定实盘参数 !
1.由于我们训练好的模型通常不希望每天变化,因此训练集的证券代码列表的开始日期和结束日期请务必确认已经取消了绑定实盘参数 !
2.由于模拟交易需要实现每天更新预测集数据来预测最新日的结果,如果您的因子计算需要历史数据例如过去5日收盘价的平均值,那么除了当日的收盘价因子数据外必然需要历史前4个交易日的收盘价因子,因此请检查基础特征抽取模块的参数向前取数据天数这个参数是否设置的足够长(例如取10),否则是无法计算当天的过去5日收盘价这个因子值的,会导致模拟交易报错!
3.简单测试模拟交易是否能运行。为了保证策略在模拟交易环境能正常运行,可以在提交模拟交易前,简单测试一下策略是否能在模拟交易运行成功。预测集时间更改为最近的一天,再运行回测,观测回测运行结果。
模拟交易
第二步:选择 模拟交易,点击 下一步。
设置策略名称与实盘类型
第三步:输入策略名称,选择实盘类型(暂只支持股票),点击 下一步。
绑定微信
第四步:至此提交模拟交易成功。扫描 BigQuant公众号 ,绑定微信, 实时接收调仓信号(强烈建议绑定)。
查看模拟交易详情
模拟交易表
第一步:在导航栏点击 我的交易 查看提交的所有模拟交易详情。
模拟交易表中各字段含义
-
类型:模拟交易类型,暂只支持股票。
-
状态:表明该策略是否处于模拟交易运行中,可通过操作中的 开始/暂停 按钮控制。
-
累计收益:从开始模拟至今的所有收益。
-
今日收益:最近一个交易日的当日收益。
-
开始时间:策略是什么时候开始进行模拟交易的
-
调仓通知-微信:表明是否开启微信订阅功能,开启之后,每日在微信上将收到策略调仓信号。可点击开启、关闭
-
调仓通知-邮件:表明是否开启邮件订阅功能,开启之后,每日在邮件里将受到策略调仓信号。可点击开启、关闭。
-
分享:表明是否将策略分享至 策略天梯 供其他人查看、付费订阅。
-
操作:有三个按钮,为 开始/暂停、删除 。开始表明开始或重新运行该策略,暂停表明暂停运行该策略,删除是将策略从模拟交易中永久删除(一旦删除不可恢复,请谨慎操作)。
交易详情
第二步:点击某个 策略名称 查看该模拟交易详情,包括:
整体指标、收益走势、计划交易(即调仓信号)、持仓详情、交易详情、卖出详情、风险指标、策略日志等。
查看每日调仓信号
在 我的交易 中查看
在 BigQuant 访问 我的交易,在某交易详情页中查看 计划交易 信息。
通过微信、邮箱查看
打开模拟交易的 微信调仓信号, 邮箱调仓信号 ,通过微信、邮件消息查看。
通过API查看
通过 模拟交易API 获取交易信号并与实盘对接
使用方式请查看通过API获取自己/订阅的模拟交易持仓数据。
模拟交易运行时间
对于日线策略,每个交易日收盘后,BigQuant会立即更新数据,再利用最新数据运行所有用户的模拟交易,一般会从17:00持续到23:00。每个用户的模拟交易运行成功、失败均会推送对应的调仓信号、成功失败消息。用户可通过 模拟交易详情、 微信调仓信号 、 邮件调仓信号、 模拟交易API 等多种方式获取每日调仓信号及相关收益、风险信息。为了消息的及时接收,小编强烈建议您 绑定微信、邮箱 。