121-指数择时策略
由bqbcl5zr创建,最终由qxiao 被浏览 259 用户
策略介绍
本策略是一个指数择时策略,基本逻辑是根据市场走势选择是否交易,并调整投资组合,即利用指数特征来进行风控。
策略流程
本策略是指数择时策略的具体实现,该模型的思想如下:
- 股票池过滤:剔除ST、退市、停牌股、北交所
- 筛选条件:上市天数大于270天,收盘价小于30
- 排序条件:按照市盈率TTM 从大到小排序
- 择时条件:根据中证1000指数交易量排名(标准化后)作为择时特征,当排名大于等于0.8时进行买入,排名小于0.8时卖出
- 策略回测:持股20只等权重、持仓5天、2020-01-01至2024-04-30
策略实现
A股-基础选股
- 首先,股票池过滤的逻辑,可以在“A股-基础选股”模块中
- “交易所”一栏和“上市板块”一栏中取消勾选“北交所”
- “ST状态”一栏中只保留“正常”
- 勾选“过滤停牌”
筛选条件
- 筛选条件的实现,可以在“输入特征(DAI SQL)”模块中,“表达式过滤条件”一栏中添加以下表达式:
- 选取上市天数大于270天:
list_days > 270
- 收盘价小于30:
close < 30
排序条件
- 排序条件的实现
- 首先在“输入特征(DAI SQL)”模块中,“表达式特征”一栏中,添加表达式
pe_ttm as score
,以实现将市盈率TTM指定为排序指标 - 接着在”仓位分配“模块的”评分score字段排序“一栏,选择按照
score
排序,并且是降序排序DESC
指数择时条件
- 择时条件的实现
-
新建一个“输入特征(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/codesharev3/4c6462c0-b7f2-46f4-88ab-07e7cd4debde
\