BigQuant使用文档

🌟102-第一个AI策略(beta)

由jliang创建,最终由jliang 被浏览 61 用户

策略介绍

本策略AI算法来预测股票的未来表现,并进行排序。这里使用算法StockRanker,BigQuant 平台开发的一种先进的机器学习算法,专门用于量化选股排序学习,通过在多个因子/特征的数据上训练,旨在从大量股票中识别并排序那些未来表现可能最优异的股票。

策略思想

策略基于以下几个核心思想:

  1. 特征选择:输入对股票价格有显著影响的多维度因子,可以是包括基本面、技术指标、情绪指标等等
  2. 预测目标:预测未来 5 日收益率
  3. 数据抽取和处理:抽取和处理数据
  4. 模型训练:应用StockRanker算法,训练模型来预测股票未来上涨概率。StockRanker返回一个相对分数(score),分数越大,预测未来涨幅越大。注意此 score 绝对值没有意义。
  5. 仓位分配:买入 score 靠前的股票,越靠前,仓位分配越多
  6. 回测与交易:设置调仓周期,根据仓位目标,发出交易信号

策略实现&代码

在BigQuant平台可以非常容易的将量化+AI结合起来。如下是策略代码,可以克隆策略进入 AIStudio 运行和调优。

注意,本文还在编写中,如下代码有 bug,请等待修复后的代码。

https://bigquant.com/codeshare/5d9e4de1-71de-4a80-997c-0d5d668110c0

策略理解

因子特征选择

  • m1 输入特征 DAI SQL 在实现因子输入,这里用 表达式模式 输入,作为例子,选择了几个量价因子
  • 使用的是 cn_stock_prefactors 预计算因子表 中数据作为基础数据,也可以在这里直接使用更多数据,例如 cn_stock_bar1d.turn * cn_stock_valuation.float_market_cap

预测目标

  • m2 模块实现数据标注,在 m1的数据上(input_1.*),进一步添加了 label 数据列
  • label 列的计算
    • m_lead(close, 5) / m_lead(open, 1) 未来第5天的收盘价除以明天的开盘价,即对应的是明天开盘买入,5个交易日后收盘卖出
    • c_quantile_cont(_future_return, 0.01)c_quantile_cont(_future_return, 0.99) 计算未来收益的 1% 和 99% 分位值
    • clip(_future_return, _future_return_1pct, _future_return_99pct) 根据分位值裁剪数据,即裁剪极值
    • c_cbins(_clipped_return, 20) AS label 将数据等分为 20 组,即离散化。另一个常用函数是 c_wbins,见 DAI 函数文档

数据抽取

  • m3m4 分别在抽取训练数据集和预测数据集
  • 训练数据集,用于算法模型训练
  • 预测数据集(测试数据集体),用于验证训练效果 / 获得预测结果
  • 另一个可选的数据集是验证数据集,一般用于查看训练过程中的收敛情况和效果,后面我们给一个例子\n
  • 常见的机器学习数据集是随机划分,对于时序数据,建议考虑按时间划分。这个也可以尝试其他创新,也扩大可用数据
  • m3 抽取 2021-01-01 到 2022-12-31 的数据做为训练数据,向前取数 90天,用于部分算子需要更多历史数据
  • m4 抽取 2023-01-01 到 204-04-26 的数据作为预测数据,也向前取数 90天。同时为了在模拟交易时对当日做预测,勾选上绑定交易日,在模拟交易时,将这两个值都替换为交易日期

模型训练和预测

  • m5 StockRanker 训练用于模型训练,输入数据中的label作为预测目标,其他列(除date instrument 外)作为特征输入。

    • StockRanker算法原理,可以参考论文 From RankNet to LambdaRank to LambdaMART: An Overview
    • 学习算法:排序,相关技术请搜索 learning to rank
    • 叶节点数量:30。StockRanker会构建多棵二叉树,这里表示每棵树的最大叶节点数量。一般情况下,这个值越大,在训练集上拟合越好,也可能在训练数据上过度拟合
    • 每叶节点最小样本数:1000。这里表示每个叶节点最小需要1000个数据样本支持。一般情况下,这个值越大,泛化性能越好
    • 树的数量:20。StockRanker会训练多棵树,后面的树不断拟合前面训练的残差,以期逐步减少训练损失,最后收敛。一般情况下,这个值越大,在训练集上拟合越好,也可能在训练数据上过度拟合
    • 学习率:30。机器学习学习率。经验参数。
    • 特征值离散化数量:对于每个特征,StockRanker会将其分组离散化。一般情况下,这个值越小,泛化行越好,但也可能学习不够
    • 特征列采样率和数据行采样率,在训练每棵树时,使用多少比例的特征(列)和数据样本(行),为1表示每次都shying全部数据。小于1,表示随机抽样一部分。一般情况下,这个值越小,泛化行越好,但也可能学习不够
    • NDCG base,请搜索 NDCG。对应下面的1部分,这个值越大,表示顺序的影响越小。\n
  • m6 StockRanker 预测,输入模型和预测数据,输出预测结果

    TODO

  • m7 仓位分配:从预测 score 到 仓位,这个模块用于简化仓位生成,提供了多种仓位生成例子。这里我们使用对数倒数。见 仓位分配模块文档。\n

    • 评分score和排序:score DESC 按输入数据里的 score 的降序排序
    • 持仓股票数量:1 表示只买入排名第一的股票
    • 仓位公式:1 / log2(score_rank + 1) AS position 从 score 或者 score_rank 到 postion,等权重或者按位置等,这里未来也可以提供风险优化等算法
    • 总仓位:1。总仓位为1 则归一化到1,为0.5 则总仓位scale到0.5,即 position / sum(position) * total_position。如果为0 则不做归一化。
  • m8 BigTrader 回测和交易,每 5 个交易日调仓,开盘买入,收盘卖出\n

    K线处理函数:主要代码

    def bigquant_run(context, data):
        import pandas as pd
    
        # 下一个交易日不是调仓日,则不生成信号
        if not context.rebalance_period.is_signal_date(data.current_dt.date()):
            return
    
        # 从传入的数据 context.data 中读取今天的信号数据
        today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
        target_instruments = set(today_df["instrument"])
    
        # 获取当前已持有股票
        holding_instruments = set(context.get_account_positions().keys())
    
        # 卖出不在目标持有列表中的股票
        for instrument in holding_instruments - target_instruments:
            context.order_target_percent(instrument, 0)
        # 买入目标持有列表中的股票
        for i, x in today_df.iterrows():
            context.order_target_percent(x.instrument, 0.0 if pd.isnull(x.position) else x.position)
    
    

    更多关于 回测的说明可以参考 预备知识回测部分

用数据理解

  • m1 选择特征 print(m1.data.read()["sql"])\n
  • m2 数据标注 print(m2.data.read()["sql"])\n
  • m3 训练数据 m3.data.read()\n
  • m5 StockRanker 训练,查询模型中特征贡献 m5.feature_gains.read()\n
  • m6 预测结果 m6.predictions.read()\n
  • m7 仓位分配 m7.data.read()\n
  • m8 回测结果 m8.raw_perf.read()\n

策略优化

  • 因子特征选择(m1):StockRanker 属于统计机器学习算法。为了获得更好的效果,处理学习算法和参数等选择,主要的收益来自于更好的因子特征构造和选择。
    • 构建和选择高质量的因子,往往能带来确定的回报
    • 因子并不是越多越好,垃圾进垃圾出
    • 同时对于时序预测,也注意观察所选因子在时间上分布是否稳定
  • 预测目标(m2):验证不通的标注算法、预测期限等,比如预测相对某指数的收益、预测sharpe等
  • 数据选择:对于时序数据,特别交易数据,不同时间段的选择对结果影响很大,训练期和预测期市场分布越接近,预测效果越好。同时可以使用滚动训练,来迭代模型(TODO给出demo)。
  • 树的选择:学习是否够,是否需要更多的树/迭代轮次,可以观察StockRanker 收敛过程。
    • 添加一个验证集(m9),接入到 StockRanker训练(m5)的验证集输入上。
    • 设置想要观测的时间段,可以和训练数据重合也可以不重合,不影响训练结果,一般选择训练集之后一段数据\n
  • 其他
    • 尝试不同的 score to postion 算法和持股数量(仓位分配模块)
    • 不同的 持仓周期、买卖时间点(BigTrader 模块)

\

标签

人工智能

文档

102a-AI策略-代码交易