117a-TALIB指标选股策略
由bqbcl5zr创建,最终由qxiao 被浏览 231 用户
策略介绍
该策略是一个TALIB指标选股策略
买入条件是(1)今日开盘价大于昨日收盘价;(2)5日收盘价均线大于10日收盘价均线的股票
买入后,如果5日收盘价均线小于10日收盘价均线,则次日卖出。
策略流程
- 股票过滤:剔除ST、停牌股、北交所
- 筛选条件:上市天数大于270,收盘价小于30
- 信号设定:对符合买入条件(今日开盘价大于昨日收盘价;5日收盘价均线大于10日收盘价均线的股票)的股票设定买入信号,对5日收盘价均线小于10日收盘价均线的股票设定卖出信号,并按照总市值升序排列
- 交易设定:开盘买入,开盘卖出,初始资金100万,持仓票数20只,持仓周期10天
- 回测时间:2020-06-01-2024-05-06
策略实现
A股-基础选股
- 首先,股票池过滤的逻辑,可以在“A股-基础选股”模块中
- “交易所”一栏和“上市板块”一栏中取消勾选“北交所”
- “ST状态”一栏中只保留“正常”
- 最后勾选“过滤停牌”
- 其他选项保留默认
筛选条件
- 筛选条件的实现,可以在“输入特征(DAI SQL)”模块中,“表达式过滤条件”一栏中添加以下表达式:
- 选取上市天数大于270天:
list_days > 270
- 收盘价小于30:
close < 30
买卖信号设定
- 信号设定的实现
-
首先在“输入特征(DAI SQL)”模块中,“表达式特征”一栏中,添加表达式
IF(open > close_1 AND m_ta_sma(close, 5) > m_ta_sma(close, 10), 1,0) AS buy_signal
,将今日开盘价大于昨日开盘价,且5日收盘价均线大于10日收盘价均线的股票的买入信号设置为1IF(m_ta_sma(close, 5) < m_ta_sma(close, 10), 1,0) AS sell_signal
,将5日收盘价均线小于10日收盘价均线的卖出信号设置为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
\