历史文档

【历史文档】策略-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排序模型,如下所示:

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

获取预测数据:

{w:100}

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

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

回归问题的策略构建

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

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

获取预测数据:

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

{w:100}{w:100}

根据预测数据结果我们可以看到,预测的收益率列名为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

\

分类模型的策略构建

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

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

自动标注模块:

# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
where(shift(close, -5) / shift(open, -1)-1>0.2, 1, 0)

获取预测数据:

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

{w:100}{w:100}

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

数据准备函数修改:

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

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

\

标签

机器学习AI算法

文档

【历史文档】策略-BigQuant AI策略详解【历史文档】策略-AI量化策略开发进阶
评论
  • ## 分类模型的策略构建,数据准备函数里面,是不是还要过滤一下pred_label=1?
  • ```python context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)]) 这句中T.norm是什么意思?有什么作用? ``` \
{link}