BigQuant使用文档

121-指数择时策略

由bqbcl5zr创建,最终由iquant 被浏览 102 用户

策略介绍

本策略是一个指数择时策略,基本逻辑是根据市场走势选择是否交易,并调整投资组合,即利用指数特征来进行风控。

策略流程

本策略是指数择时策略的具体实现,该模型的思想如下:

  1. 股票池过滤:剔除ST、退市、停牌股、北交所
  2. 筛选条件:上市天数大于270天,收盘价小于30
  3. 排序条件:按照市盈率TTM 从大到小排序
  4. 择时条件:根据中证1000指数交易量排名(标准化后)作为择时特征,当排名大于等于0.8时进行买入,排名小于0.8时卖出
  5. 策略回测:持股20只等权重、持仓5天、2020-01-01至2024-04-30

策略实现

A股-基础选股

  1. 首先,股票池过滤的逻辑,可以在“A股-基础选股”模块中
  • “交易所”一栏和“上市板块”一栏中取消勾选“北交所”
  • “ST状态”一栏中只保留“正常”
  • 勾选“过滤停牌”

筛选条件

  1. 筛选条件的实现,可以在“输入特征(DAI SQL)”模块中,“表达式过滤条件”一栏中添加以下表达式:
  • 选取上市天数大于270天:list_days > 270
  • 收盘价小于30:close < 30

排序条件

  1. 排序条件的实现
  • 首先在“输入特征(DAI SQL)”模块中,“表达式特征”一栏中,添加表达式pe_ttm as score,以实现将市盈率TTM指定为排序指标
  • 接着在”仓位分配“模块的”评分score字段排序“一栏,选择按照score排序,并且是降序排序DESC

指数择时条件

  1. 择时条件的实现
  • 新建一个“输入特征(DAI SQL)”模块,在“表达式特征”一栏中,添加表达式:

    计算过去20天的交易量排名:m_rank(volume, 20, method:='min', ascending:=true) AS _n_rank

    获得标准化后的排名作为择时特征:(_n_rank * 2 - 20) / 20 AS norm_v

  • 在“表达式过滤条件”一栏中添加以下表达式:name = '中证1000指数'

回测设置

5.策略回测逻辑的实现

  • 在”仓位分配“模块中,在”持仓股票数量“一栏中输入20,表示持股20只
  • 在”仓位分配“模块中,在”仓位公式“一栏中输入1 AS position ,表示等权重持仓
  • 在“数据抽取”模块中,设置日期为2020-01-01至2024-04-30
  • 在”BigTrader“模块中,在”调仓周期类型“一栏中选择”交易日“,并在”调仓周期日期“一栏中填5,表示持仓天数为5
  • 在”BigTrader“模块中,在“初始化函数”部分,设置排名百分比阈值context.value = 0.8 ,并获取指数择时特征context.options_data = context.options['data'].read()
  • 在”BigTrader“模块中,在“K线处理函数”部分,获取当天的指数择时特征
index_data = context.options_data[context.options_data["date"] == data.current_dt.strftime("%Y-%m-%d")]
rank = index_data['norm_v'].iloc[0]

根据特征判断是否进行买卖操作,当排名大于等于阈值时进行买入,排名小于阈值时卖出:

# 卖出不在目标持有列表中的股票
if rank < context.value:
    for instrument in sell_set:
        context.order_target_percent(instrument, 0)
# 买入目标持有列表中的股票
    if rank >= context.value:
        for i, x in today_df.iterrows():
            # 处理 null 或者 decimal.Decimal 类型等
            position = 0.0 if pd.isnull(x.position) else float(x.position)
            context.order_target_percent(x.instrument, position)

策略源码

https://bigquant.com/codesharev2/2c1de70f-c9d9-49d2-aacc-0baa09dc83dc

\

标签

策略回测
{link}