问财量化选股策略逻辑
选股逻辑:选择RSI小于65的股票,深证主板中市盈率在0-29.01之间,市净率在0-3.11之间,非ST,并且是当天尚未涨停且最近5个交易日内涨幅不超过50%的股票。
选股逻辑分析
该策略加入了股票涨幅和停牌的考虑,更加全面考虑到了股票的整体估值和市场走势。同时,非ST的条件则排除了高风险的股票。选股时间为早晨10点之前,避免了市场的短期波动对策略的干扰。
有何风险?
该选股策略依然存在市场风险和股票特征风险,需要过滤掉那些不适合特定市场情况的股票。同时,也需要注意虚假突破和过拟合的风险。
如何优化?
可以通过加入其他的选股条件和筛选规则,例如可以考虑加入更加精准的涨幅和股票估值的条件,或者加入分析师预测和市场情绪的考虑。同时,也可以对期望收益和风险进行相应的调整和平衡。
最终的选股逻辑
选股逻辑:选择RSI小于65的股票,深证主板中市盈率在0-29.01之间,市净率在0-3.11之间,非ST,并且是当天尚未涨停且最近5个交易日内涨幅不超过50%的股票。
同花顺指标公式代码参考
- RSI小于65:RSI(C, 14) < 65
- 深证主板中市盈率0-29.01:PE > 0 AND PE < 29.01
- 市净率0-3.11:PB > 0 AND PB < 3.11
- 非ST:NOT(ST)
- 当天尚未涨停:CLOSE<REF(MAX(CLOSE,1),1.09)
- 近5个交易日内涨幅不超过50%:CHANGE(CLOSE,5)<=50
python代码参考
import pandas as pd
import tushare as ts
from stockstats import StockDataFrame
# 连接tushare并获取股票基本信息
token = 'token'
pro = ts.pro_api(token)
# 选择深圳主板
basic = pro.stock_basic(exchange='SZSE', list_status='L', fields='ts_code,symbol,name,area,industry,pe,roe,eps')
# 初始化条件
rsi_threshold = 65
pe_low = 0
pe_high = 29.01
pb_low = 0
pb_high = 3.11
change_threshold = 50
limit_threshold = 1.09
stop_name = 'ST'
# 性能更高的stockstats包计算技术指标
def calculate_technical_indicators(ts_code):
tech = pro.query('daily', ts_code=ts_code)
if tech.empty: return None
# 将dataframe转化为stockdataframe
sdf = StockDataFrame.retype(tech)
# 计算指标
sdf['macd'] # MACD指标
sdf['kdjk'] # KDJ指标
# 更多指标可参考:https://pypi.org/project/stockstats/
return sdf
# 判断是否符合当天尚未涨停的条件
def judge_not_limit(today, last):
if last <= 0: return True
return today/last < limit_threshold
# 判断是否符合涨幅条件
def judge_change(ts_code):
df = pro.query('daily', ts_code=ts_code, fields='close')
if df.empty: return False
# 计算近5个交易日涨幅
change = (df['close'].iloc[-1] - df['close'].iloc[-5]) / df['close'].iloc[-5] * 100
return change <= change_threshold
# 遍历每支股票
result = []
for code in basic['ts_code']:
# 判断条件
finance = pro.query('daily_basic', ts_code=code, fields='pe,pb')
if finance.empty: continue
pe = finance['pe'].iloc[-1]
pb = finance['pb'].iloc[-1]
if pe < pe_low or pe > pe_high or pb < pb_low or pb > pb_high: continue
if stop_name in basic[basic['ts_code'] == code].iloc[0]['name']: continue
# 判断是否符合涨幅条件
if not judge_change(code): continue
# 判断是否符合当天尚未涨停的条件
today = pro.query('daily', ts_code=code, fields='close', trade_date='20220414')['close'].iloc[0]
last = pro.query('daily', ts_code=code, fields='close', trade_date='20220413')['close'].iloc[0]
if not judge_not_limit(today, last): continue
# 计算RSI指标
tech = calculate_technical_indicators(code)
if tech is None: continue
rsi = tech['rsi_14'].iloc[-1]
if rsi >= rsi_threshold: continue
result.append([code, basic[basic['ts_code'] == code].iloc[0]['name'], today])
# 按竞价金额降序排序,取前5
result_df = pd.DataFrame(result, columns=['代码', '名称', '竞价金额'])
result_df = result_df.sort_values('竞价金额', ascending=False).iloc[:5, :]
result_df.to_excel('result.xlsx', index=False)
## 如何进行量化策略实盘?
请把您优化好的选股语句放入文章最下面模板的选股语句中即可。
select_sentence = '市值小于100亿' #选股语句。
模板如何使用?
点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。
## 如果有任何问题请添加 下方的二维码进群提问。
