问财量化选股策略逻辑
选股逻辑:选出RSI小于65,下午大单净流入,100亿市值以内的无亏损企业的股票。
选股逻辑分析
该选股策略综合利用了技术指标和基本面,通过RSI指标判断股票被低估,通过下午大单净流入判断市场情绪向好,选择市值较小的公司并对企业盈利情况进行要求。但该选股策略仍有挑选较少的问题,并未充分考虑行业因素和其他技术指标的影响。
有何风险?
该选股逻辑可能会忽略某些行业因素和公司特有情况,例如公司业绩波动、竞争力等。同时,忽略了市值较大的公司,可能会漏掉某些有潜力的优质公司。选股逻辑出发点单一,难以实现盈利。
如何优化?
在选股逻辑的基础上,加入行业相关因素,比如利润增长率、市净率等,将排除亏损企业扩大到同行业;同时,应该增加选股策略应用的指标或其他选股条件,使策略包含更完整的选股辅助说明。另外,应该强化资金管理和股票监控,以降低持仓风险等。
最终的选股逻辑
选出下午大单净流入、市值100亿以内、无亏损企业、RSI小于65的股票。
同花顺指标公式代码参考
C2: AFTERNOON(NETFLOW) > 0
C3: MARKET_CAPITAL <= 1000000
C4: NET_PROFIT > 0
C5: LEFT(CODE,2) NOT IN ('30','00')
SELECT * FROM (
SELECT STOCK_LIST.*,
GET_RANKING() AS RANKING
FROM STOCK_LIST) RESULT
WHERE C1 AND C2 AND C3 AND C4 AND C5
ORDER BY RANKING DESC
python代码参考
import pandas as pd
import akshare as ak
import talib
def get_ranking(df):
df = df[df['成交量'] > 0]
df = df[df['下午净流入'] > 0]
df = df[df['RSI'] < 65]
df = df[df['市值'] <= 10000000000]
df = df[df['净利润'] > 0]
df = df[~df['代码'].str.startswith(('30', '00'))]
stocks_em = ak.stock_zh_a_daily_em_alpha(indicator="涨幅排名")
stocks_list = stocks_em['名称']
df['RANKING'] = df['名称'].apply(lambda x: stocks_list.index(x) + 1 if x in stocks_list else 0)
df = df[df['RANKING'] > 0]
df.sort_values(by='RANKING', ascending=True, inplace=True)
return df.head(5)
def get_stock_list():
stock_list_df = ak.stock_zh_a_spot_em()
stock_list_df['市值'] = stock_list_df['市值'].astype(float)
stock_list_df = stock_list_df[stock_list_df['市值'] > 0]
stock_list_df['净利润'] = 0
for code in stock_list_df['代码']:
k_data_df = ak.stock_zh_a_daily_em(symbol=code, adjust="qfq")
if len(k_data_df) < 5:
continue
net_profit = ak.stock_financial_report_sina(symbol=code, indicator="净利润")
if '20191231' in net_profit['报告期'].values:
net_profit = net_profit[net_profit['报告期'] == '20191231']
if net_profit['净利润(万元)'].values[0] > 0:
stock_list_df.loc[stock_list_df['代码'] == code, '净利润'] = net_profit['净利润(万元)'].values[0]
stock_lhb_df = ak.stock_em_hsgt_lhb()
stock_lhb_df = stock_lhb_df[stock_lhb_df['日期'] == ak.stock_zh_a_spot_trade_history_sina()[0]]
stock_lhb_df = stock_lhb_df[stock_lhb_df['类型'] == '买入']
stock_lhb_df.rename(columns={'买入金额': '龙虎榜买入金额'}, inplace=True)
stock_lhb_df['股票代码'] = stock_lhb_df['股票代码'].apply(lambda x: x.split('.')[0])
stocks_list = pd.merge(stock_list_df, stock_lhb_df, left_on='代码', right_on='股票代码', how='left')
stocks_list['昨日龙虎榜'] = stocks_list['龙虎榜买入金额'].apply(lambda x: 'Y' if x > 0 else 'N')
stocks_list.drop(columns=['股票代码', '龙虎榜买入金额'], inplace=True)
result_df = pd.DataFrame()
for code in stocks_list['代码']:
k_data_df = ak.stock_zh_a_daily_em(symbol=code, adjust="qfq")
k_data_df = k_data_df[k_data_df['成交量'] > 0]
if len(k_data_df) < 5:
continue
rsi = talib.RSI(k_data_df['收盘'], timeperiod=14)
if rsi.iloc[-1] >= 65:
continue
net_flow = ak.stock_individual_em_ggt_flow(code)
if net_flow.iloc[-1]['净流入额'] <= 0:
continue
if stocks_list[stocks_list['代码'] == code]['昨日龙虎榜'].iloc[0] != 'Y':
continue
result_df = result_df.append(k_data_df)
result_df = pd.merge(result_df, stock_list_df[['代码', '市值']].drop_duplicates(), on='代码', how='left')
result_df = result_df[result_df['净利润'] > 0]
result_df['市值'] = result_df['市值'].astype(float)
result_df = get_ranking(result_df)
return result_df
## 如何进行量化策略实盘?
请把您优化好的选股语句放入文章最下面模板的选股语句中即可。
select_sentence = '市值小于100亿' #选股语句。
模板如何使用?
点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。
## 如果有任何问题请添加 下方的二维码进群提问。


