【宽客学院】AI策略开发


(iQuant) #1

区别于传统策略开发,AI策略开发是利用AI模型的预测结果构建策略逻辑。根据不同类型的AI模型,策略构建的方式也有所不同。本文主要向大家介绍一下常用的AI策略构建方法。

在AI模型的构建教程中,我们已经介绍了机器学习在分类、回归和排序三类典型应用场景中的应用,并针对这三类问题介绍了常用的AI算法模型和构建流程。

以股票策略为例,在量化交易中常见的应用场景和策略构建逻辑可以举例为:

问题分类 应用场景 策略逻辑举例
分类问题 预测股票的涨跌状态 根据预测的上涨概率是否大于0.5作为策略买卖触发信号
回归问题 预测股票的价格/涨幅 根据预测的价格/涨幅是否大于阈值作为策略买卖触发信号
排序问题 预测股票的排序先后 根据预测的股票排名先后作为策略买卖触发信号

我们分别介绍三类策略的逻辑构建。

一、排序问题的策略构建

首先,我们建立一个StockRanker排序模型,如下所示:

对于XGBoost等其他的排序模型也会得到类似的预测结果,这里以StockRanker模型为例。

获取预测数据

image
根据预测数据结果我们可以看到,预测的排序列名为position

我们根据股票排名预测值,在每日轮仓中买入排名靠前的股票卖出排名靠后的股票。

二、回归问题的策略构建

首先,我们建立一个多层感知器回归模型,如下所示:

对于随机森林等其他的回归模型也会得到类似的预测结果,这里以多层感知器回归模型为例。

获取预测数据

首先我们查看m4模块的预测数据

image
根据预测数据结果我们可以看到,预测的收益率列名为pred_label

我们根据预测收益率排序,在每日轮仓中买入排名靠前的股票卖出排名靠后的股票。
我们修改模板策略中的数据准备函数:

数据准备函数修改

在数据准备函数中获取预测值并按pred_label列从大到小排序,之后的逻辑与排序策略类似,即买入收益率预测值高的股票,卖出收益率预测值低的股票。

# 回测引擎:初始化函数,只执行一次
def bigquant_run(context):
    # 加载预测数据
    context.ranker_prediction = context.options['data'].read_df().sort_values('pred_label',ascending=False)
    # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 预测数据,通过options传入进来,使用 read_df 函数,加载到内存 (DataFrame)
    # 设置买入的股票数量,这里买入预测股票列表排名靠前的5只
    stock_count = 5
    # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]
    context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)])
    # 设置每只股票占用的最大资金比例
    context.max_cash_per_instrument = 0.2
    context.hold_days = 5

三、分类模型的策略构建

首先,我们建立一个随机森林分类模型,如下所示:

对于线性分类等其他的分类模型也会得到类似的预测结果,这里以随机森林分类模型结果为例。
在这个分类模型案例中,依据未来5日股票阶段收益率是否大于20%将标注设置为1和0两个类别。

自动标注模块
# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
where(shift(close, -5) / shift(open, -1)-1>0.2, 1, 0)
获取预测数据

我们查看m6模块的预测数据

image
根据预测数据结果我们可以看到,预测的类别0(上涨)的概率列名为classes_prob_0

数据准备函数修改

我们根据classes_prob_0列的值从高到低排序,即按照上涨概率从高到低排序。

    # 加载预测数据
    context.ranker_prediction = context.options['data'].read_df().sort_values('classes_prob_0',ascending=False)

四、策略案例

结语:使用AI预测结果构建模型的过程有很多种方式,我们也可以考虑将不同模型的分类/预测/排序的结果进行组合,例如构建一个A模型回归预测股票的收益率,同时构建一个B模型分类预测股票的波动率大/小,最后将两个模型预测的结果合并挑选预测波动率为大且预测收益率较高的股票组合,可以参考模型组合案例。本文仅做抛转引玉,小伙伴们可以探索更多的模型构建方式。


(tkyz) #2

如何将两个模型预测的结果合并,有模板吗?


(copen) #3

没有看到模板,不过这里直接使用一个自定义模块,就可以合并两个模型甚至多个模型的预测结果啊。
其实你这个思想有点类似模型集成(Ensemble)。