BigQuant使用文档

117a-TALIB指标选股策略

由bqbcl5zr创建,最终由qxiao 被浏览 202 用户

策略介绍

该策略是一个TALIB指标选股策略

买入条件是(1)今日开盘价大于昨日收盘价;(2)5日收盘价均线大于10日收盘价均线的股票

买入后,如果5日收盘价均线小于10日收盘价均线,则次日卖出。

策略流程

  1. 股票过滤:剔除ST、停牌股、北交所
  2. 筛选条件:上市天数大于270,收盘价小于30
  3. 信号设定:对符合买入条件(今日开盘价大于昨日收盘价;5日收盘价均线大于10日收盘价均线的股票)的股票设定买入信号,对5日收盘价均线小于10日收盘价均线的股票设定卖出信号,并按照总市值升序排列
  4. 交易设定:开盘买入,开盘卖出,初始资金100万,持仓票数20只,持仓周期10天
  5. 回测时间:2020-06-01-2024-05-06

策略实现

A股-基础选股

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

筛选条件

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

买卖信号设定

  1. 信号设定的实现
  • 首先在“输入特征(DAI SQL)”模块中,“表达式特征”一栏中,添加表达式

    IF(open > close_1 AND m_ta_sma(close, 5) > m_ta_sma(close, 10), 1,0) AS buy_signal,将今日开盘价大于昨日开盘价,且5日收盘价均线大于10日收盘价均线的股票的买入信号设置为1

    IF(m_ta_sma(close, 5) < m_ta_sma(close, 10), 1,0) AS sell_signal,将5日收盘价均线小于10日收盘价均线的卖出信号设置为1

策略回测

  1. 策略回测的实现
  • 在”BigTrader“模块中,在”调仓周期类型“一栏中选择”交易日“,并在”调仓周期日期“一栏中填10,表示持仓天数为10

  • 在”BigTrader“模块中,在“初始化函数”部分,设置持仓数量context.target_hold_count = 20,并设置每只股票的权重,这里设置的是等权重,context.target_percent_per_instrument = 1.0 / context.target_hold_count

  • 在”BigTrader“模块中,在“K线处理函数”部分,根据先前设定的信号进行买卖

    首先获取买入信号为1和卖出信号为1的股票列表buy_stock和sell_stock

    # 从传入的数据 context.data 中读取今天的数据
    today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
    
    # 获取当日符合买入/卖出条件的股票列表
        try:
            buy_stock = (today_df[today_df['buy_signal'] == 1].iloc[:context.target_hold_count]['instrument']).tolist() # 当日符合买入条件的股票
        except:
            buy_stock=[]
        try:
            sell_stock = (today_df[today_df['sell_signal']==1]['instrument']).tolist() # 当日符合卖出条件的股票
        except:
            sell_stock = []
     # 获取当前已持有股票
        current_hold_instruments = set(context.get_account_positions().keys())
        hold_num=len(current_hold_instruments)
    

卖出:已持仓且卖出信号为1的股票

# 需要卖出的股票:已有持仓中符合卖出条件的股票
sell_set = [i for i in current_hold_instruments if i in sell_stock]
# 卖出不在目标持有列表中的股票
    for instrument in sell_set:
        context.order_target_percent(instrument, 0)
        hold_num-=1

买入:未持仓且买入信号为1的股票

# 需要买入的股票:没有持仓且符合买入条件的股票
buy_set = [i for i in buy_stock if i not in current_hold_instruments]

# 当日还允许买入建仓的股票数目
stock_can_buy_num = context.target_hold_count - hold_num
stock_to_buy_num = min(stock_can_buy_num,len(buy_set))

# 如果当天没有买入的股票,就返回
if stock_to_buy_num == 0:
    return
# 记录已经买入的股票数量
buy_num = 0

# 买入目标持有列表中的股票
for instrument in buy_set:
    if buy_num < stock_to_buy_num:
        context.order_target_percent(instrument, context.target_percent_per_instrument)
        buy_num += 1

策略源码

https://bigquant.com/codesharev3/12fe4d6a-3d78-47e6-8060-d79122983290

\

标签

股票选股交易策略
{link}