问财量化选股策略逻辑
选股逻辑:选择换手率在3%到12%之间,涨跌幅乘以超大单净量大于0,反包。
选股逻辑分析
该选股策略在前一个策略基础上增加了反包指标的筛选条件。反包是指股价在短期内大幅波动后,回归到中长期一定均衡水平的现象,属于技术面的一个重要指标。同时,该选股策略中的指标筛选条件相对简单,具有一定的可操作性和易实现性。
有何风险?
这个选股策略直接选取了换手率、涨跌幅乘以超大单净量和反包等指标作为选股条件,没有考虑到基本面因素和行业的因素,存在一定的主观性和不确定性。同时,反包指标的使用需要具有技巧性,容易出现诱导性的情况。因此,选股结果不一定符合市场预期,存在一定风险。
如何优化?
可以加入与基本面和行业相关的指标,如市盈率、市净率、股息率、行业排名等,以更全面地考虑选股因素。同时,应该对股票所处行业进行适当的分析,选择更具有竞争力的标的。此外,也可以将反包指标与其他技术指标结合使用以提高选股的准确性。
最终的选股逻辑
选择换手率在3%到12%之间,涨跌幅乘以超大单净量大于0,同时符合反包指标为选股范围。
同花顺指标公式代码参考
以下是同花顺指标所需公式:
选股公式:
-- 计算反包指标
REF_HIGH := REF(HIGH,1);
REF_LOW := REF(LOW,1);
S_RANGE := (HIGH - LOW) / REF(CLOSE,1);
L_RANGE := (MAX(HIGH,REF_HIGH) - MIN(LOW,REF_LOW)) / REF(CLOSE,1);
RANGE := MAX(S_RANGE,L_RANGE);
RANGE_1 := REF(RANGE,1);
RANGE_2 := REF(RANGE,2);
RANGE_3 := REF(RANGE,3);
Rp := 0.1;
FinalRange:= ((RANGE*2 + RANGE_1 + RANGE_2 + RANGE_3)/5)*Rp + ((RANGE_1 + RANGE_2 + RANGE_3)/3)*(1-Rp);
-- 计算选股
SELECT STOCK_SYMBOL FROM (
SELECT STOCK_SYMBOL AS code, FinalRange AS Score FROM
(
SELECT STOCK_SYMBOL AS code FROM StkBasInfo WHERE MarketValue < 100000000 AND FINFOURL NOT NULL AND FloatMarketValue < 10000000000
) SI INNER JOIN (
SELECT STOCK_SYMBOL AS code FROM CandlesDay WHERE Cdl[:1] = LAST AND TIME = [TIME-1] AND Year(DATE) = YEAR(TODAY) AND VOL >= 1000000 AND VOL < 100000000 AND TURNOVER_RATIO >= 3 AND TURNOVER_RATIO <= 12
) CD ON SI.code = CD.code INNER JOIN (
SELECT STOCK_SYMBOL AS code, (C*Big)/10000 AS SuperVolume FROM CandlesDay WHERE Cdl[:1] = LAST AND TIME = [TIME-1] AND Year(DATE) = YEAR(TODAY) AND VOL >= 1000000 AND VOL < 100000000
) SV ON CD.code = SV.code INNER JOIN (
SELECT STOCK_SYMBOL AS code,
((HIGH-LOW)/REF(CLOSE,1)) / ((REF(HIGH,1)-REF(LOW,1))/REF(CLOSE,1)) AS RB
FROM CandlesDay WHERE Cdl[:5] = LAST AND TIME = [TIME-5] AND Year(DATE) = YEAR(TODAY)
) RB ON SV.code = RB.code AND RB.RB < 0.9
ORDER BY Score DESC
LIMIT 10
Python代码参考
以下是Python代码实现该选股策略:
import pandas as pd
from typing import List
from datetime import datetime, timedelta
def select_stock(data: pd.DataFrame, n=10) -> List[str]:
selected_stocks = []
for code, df in data.groupby(level=0):
df = df.sort_values('trade_time', ascending=True)
if (df['float_shares'].iloc[-1] / 1000000000 <= 100) and (df['close'].iloc[-1] > 5) and \
(df['volume'].iloc[-1] / df['volume'].iloc[-6:-1].mean() > 3) and \
(df['turnover_rate'].iloc[-1] > 3) and (df['turnover_rate'].iloc[-1] < 12) and \
(df['pct_chg'].iloc[-1] * abs(df['buy_volume'].iloc[-1] - df['sell_volume'].iloc[-1]) / 10000 > 0) and \
((df['high'] - df['low']).iloc[-1] / df['close'].iloc[-2] > 0) and \
((df['high'] - df['low']).iloc[-2] / df['close'].iloc[-3] > 0) and \
((df['high'] - df['low']).iloc[-3] / df['close'].iloc[-4] > 0) and \
((df['high'] - df['low']).iloc[-4] / df['close'].iloc[-5] > 0) and \
((df['high'] - df['low']).iloc[-5] / df['close'].iloc[-6] > 0) and \
((df['high'] - df['low']).iloc[-1] / (df['high'].iloc[-6:].max() - df['low'].iloc[-6:].min()) < 0.9):
s_weight = df['turnover_rate'].mean() * df['volume'].mean() / (df['close'].iloc[-1] * 10000)
selected_stocks.append((code, s_weight))
selected_stocks.sort(key=lambda x: x[1], reverse=True)
selected_stocks = selected_stocks[:n]
return [x[0] for x in selected_stocks]
## 如何进行量化策略实盘?
请把您优化好的选股语句放入文章最下面模板的选股语句中即可。
select_sentence = '市值小于100亿' #选股语句。
模板如何使用?
点击图标右上方的复制按钮,复制到自己的账户即可使用模板进行回测。
## 如果有任何问题请添加 下方的二维码进群提问。
