历史文档

121-基于StockRanker的AI选股策略

由xyz142创建,最终由iquant 被浏览 103 用户

策略介绍

本策略使用StockRanker算法,通过在多个因子/特征的数据上训练,旨在从大量股票中识别并排序那些未来表现可能最优异的股票。

策略流程

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

策略实现

输入特征模块

  • 在特征表达式中输入量价指标以及估值指标作为输入特征
  • 按照上市天数和ST状态进行股票过滤

\

模型训练模块

  • 将StockRanker预测分数数据直接传入到BigTrader

    \

BigTrader模块

  • 我们在m8”BigTrader“模块中,实现交易逻辑.

  • 初始化函数

  • K线处理函数
# 1. 资金分配
# 平均持仓时间是hold_days, 每日都将买入股票, 每日预期使用 1/hold_days 的资金
# 实际操作中, 会存在一定的买入误差, 所以在前hold_days天, 等量使用资金;之后, 尽量使用剩余资金(这里设置最多用等量的1.5倍)
is_staging = (
    context.trading_day_index < context.options["hold_days"]
)  # 是否在建仓期间(前 hold_days 天)
cash_avg = context.portfolio.portfolio_value / context.options["hold_days"]
cash_for_buy = min(context.portfolio.cash, (1 if is_staging else 1.5) * cash_avg)
cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)
positions = {
    e: p.amount * p.last_sale_price for e, p in context.portfolio.positions.items()
}

# 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票, 按机器学习算法预测的排序末位淘汰
if not is_staging and cash_for_sell > 0:
    equities = {e: e for e, p in context.portfolio.positions.items()}
    instruments = list(
        reversed(
            list(
                ranker_prediction.instrument[
                    ranker_prediction.instrument.apply(lambda x: x in equities)
                ]
            )
        )
    )

    for instrument in instruments:
        context.order_target(instrument, 0)
        cash_for_sell -= positions[instrument]
        if cash_for_sell <= 0:
            break

# 3. 生成买入订单:按机器学习算法预测的排序, 买入前面的stock_count只股票
buy_cash_weights = context.stock_weights
buy_instruments = list(ranker_prediction.instrument[: len(buy_cash_weights)])
max_cash_per_instrument = (
    context.portfolio.portfolio_value * context.max_cash_per_instrument
)
for i, instrument in enumerate(buy_instruments):
    cash = cash_for_buy * buy_cash_weights[i]
    if cash > max_cash_per_instrument - positions.get(instrument, 0):
        # 确保股票持仓量不会超过每次股票最大的占用资金量
        cash = max_cash_per_instrument - positions.get(instrument, 0)
    if cash > 0:
        context.order_value(instrument, cash)

策略代码

https://bigquant.com/codesharev2/064d7056-2966-4504-a8be-ac49245646c1

\

标签

AI选股模型训练
{link}