问财量化选股策略逻辑
选股逻辑为:在换手率3%-12%、市值100亿以内、无亏损的A股中,选择三个技术指标(如MACD、KDJ、RSI)同时金叉的个股进行投资。
选股逻辑分析
该选股逻辑通过技术指标的选股方式,筛选出同时表现出短期和长期均线或震荡指标呈现买入信号的个股,以此降低投资风险。
有何风险?
该选股逻辑仅注重个股的技术面表现,无法评估基本面和市场整体因素的影响,忽略了公司财务状况、市场宏观经济、政策环境等影响,容易对市场风险和公司股价的长期变化造成忽略和误判。
如何优化?
应该根据公司的经营情况和市场整体性做出综合判断,加强基本面和市场因素的分析和建模,重视公司财务状况、前景、竞争状况、行业关键指标及政策环境等影响因素。在技术指标的基础上,综合考虑多维度的因素指标,制定更全面、更科学的选股策略。
最终的选股逻辑
在符合换手率3%-12%、市值100亿以内、无亏损的A股中,选择同时出现三个技术指标(如MACD、KDJ、RSI)金叉信号的个股进行投资,并在此基础上,综合考虑市场因素和公司经营状况等关键因素,制定更全面、更科学的选股策略。
同花顺指标公式代码参考
选股公式:(CIRCMV <= 10000000000 AND SHELL = 0 AND TBD = 0 AND MACD(12,26,9) > REF(MACD(12,26,9), 1) AND KDJ(9,3,3) * KDJ(9,3,3) * KDJ_II(9,3) * KDJ_II(9,3,3) UPANDDOWN(60) < 0) ORDER BY CIRCMV DESC
Python代码参考
import pandas as pd
import tushare as ts
def get_good_stocks(N):
good_list = []
ts.set_token('your_token')
pro = ts.pro_api()
stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code')['ts_code']
for ts_code in stock_list:
if pro.namechange(ts_code=ts_code) and pro.namechange(ts_code=ts_code)['name'].iloc[0].find('ST') >= 0: # 非ST股票
continue
market_data = pro.daily_basic(ts_code=ts_code, start_date='20220222', end_date='20220222', fields='ts_code, circ_mv, turnover_rate')
if market_data.empty or market_data.iloc[-1]['circ_mv'] > 10000000000 or market_data.iloc[-1]['turnover_rate'] < 0.03 or market_data.iloc[-1]['turnover_rate'] > 0.12:
continue
k_data = pro.daily(ts_code=ts_code, start_date='20220215', end_date='20220222', fields='close')
if k_data.empty:
continue
# 计算MACD指标
macd_data = pd.DataFrame()
macd_data['EMA12'] = pd.Series.ewm(k_data['close'], span=12, adjust=False).mean()
macd_data['EMA26'] = pd.Series.ewm(k_data['close'], span=26, adjust=False).mean()
macd_data['DIFF'] = macd_data['EMA12'] - macd_data['EMA26']
macd_data['DEA'] = pd.Series.ewm(macd_data['DIFF'], span=9, adjust=False).mean()
macd_data['MACD'] = 2 * (macd_data['DIFF'] - macd_data['DEA'])
macd_trend = (macd_data['MACD'].iloc[-1] > macd_data['MACD'].iloc[-2])
# 计算KDJ指标
kdj_data = pd.DataFrame()
kdj_data['LOW'] = k_data['low'].rolling(window=9, min_periods=9).min()
kdj_data['HIGH'] = k_data['high'].rolling(window=9, min_periods=9).max()
kdj_data['RSV'] = (k_data['close'] - kdj_data['LOW']) / (kdj_data['HIGH'] - kdj_data['LOW']) * 100
kdj_data['K'] = pd.Series.ewm(kdj_data['RSV'], span=3, adjust=False).mean()
kdj_data['D'] = pd.Series.ewm(kdj_data['K'], span=3, adjust=False).mean()
kdj_data['J'] = 3 * kdj_data['K'] - 2 * kdj_data['D']
kdj_trend = (kdj_data['K'].iloc[-1] > kdj_data['D'].iloc[-1]) & (kdj_data['D'].iloc[-1] > kdj_data['J'].iloc[-1])
# 计算RSI指标
rsi_data = pd.DataFrame()
rsi_data['DIFF'] = k_data['close'].diff()
rsi_data['DIFF'].iloc[0] = 0
rsi_data['MAX'] = rsi_data['DIFF'].rolling(window=14, min_periods=14).apply(lambda x: max(x.tolist()))
rsi_data['ABS'] = rsi_data['DIFF'].apply(abs)
rsi_data['MA'] = rsi_data['ABS'].rolling(window=14, min_periods=14).mean()
rsi_data['RSI'] = rsi_data['MA'] / rsi_data['MAX'] * 100
rsi_trend = (rsi_data['RSI'].iloc[-1] > rsi_data['RSI'].iloc[-2])
if macd_trend and kdj_trend and rsi_trend:
good_list.append(ts_code)
return good_list[:N]
good_stocks = get_good_stocks(10)
print(good_stocks)
## 如何进行量化策略实盘?
请把您优化好的选股语句放入文章最下面模板的选股语句中即可。
select_sentence = '市值小于100亿' #选股语句。
模板如何使用?
点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。
## 如果有任何问题请添加 下方的二维码进群提问。
