【历史文档】策略-AI策略开发
由clearyf创建,最终由small_q 被浏览 728 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
导语
区别于传统策略开发,AI策略开发是利用AI模型的预测结果构建策略逻辑。根据不同类型的AI模型,策略构建的方式也有所不同。本文主要向大家介绍一下常用的AI策略构建方法。
在AI模型的构建教程中,我们已经介绍了机器学习在分类、回归和排序三类典型应用场景中的应用,并针对这三类问题介绍了常用的AI算法模型和构建流程。
以股票策略为例,在量化交易中常见的应用场景和策略构建逻辑可以举例为:
问题分类 | 应用场景 | 策略逻辑举例 |
---|---|---|
分类问题 | 预测股票的涨跌状态 | 根据预测的上涨概率是否大于0.5作为策略买卖触发信号 |
回归问题 | 预测股票的价格/涨幅 | 根据预测的价格/涨幅是否大于阈值作为策略买卖触发信号 |
排序问题 | 预测股票的排序先后 | 根据预测的股票排名先后作为策略买卖触发信号 |
我们分别介绍三类策略的逻辑构建。
\
排序问题的策略构建
首先,我们建立一个StockRanker排序模型,如下所示:
对于XGBoost等其他的排序模型也会得到类似的预测结果,这里以StockRanker模型为例。
获取预测数据:
根据预测数据结果我们可以看到,预测的排序列名为position
我们根据股票排名预测值,在每日轮仓中买入排名靠前的股票卖出排名靠后的股票。
回归问题的策略构建
首先,我们建立一个多层感知器回归模型,如下所示:
对于随机森林等其他的回归模型也会得到类似的预测结果,这里以多层感知器回归模型为例。
获取预测数据:
首先我们查看m4模块的预测数据
根据预测数据结果我们可以看到,预测的收益率列名为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模块的预测数据
根据预测数据结果我们可以看到,预测的类别0(上涨)的概率列名为classes_prob_0
数据准备函数修改:
我们根据classes_prob_0列的值从高到低排序,即按照上涨概率从高到低排序。
# 加载预测数据
context.ranker_prediction = context.options['data'].read_df().sort_values('classes_prob_0',ascending=False)
\